Full Code of mickael-kerjean/filestash for AI

master aaa27d7f14e7 cached
1285 files
12.5 MB
3.4M tokens
16051 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (13,400K chars total). Download the full file to get everything.
Repository: mickael-kerjean/filestash
Branch: master
Commit: aaa27d7f14e7
Files: 1285
Total size: 12.5 MB

Directory structure:
gitextract_gaclg1k0/

├── .assets/
│   └── raw/
│       ├── Makefile
│       └── photo.xcf
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.md
│   │   ├── feature.md
│   │   └── support.md
│   └── stale.yml
├── CONTRIBUTING.md
├── Jenkinsfile
├── LICENSE
├── Makefile
├── README.md
├── cmd/
│   └── main.go
├── config/
│   ├── config.json
│   └── mime.json
├── docker/
│   ├── Dockerfile
│   └── docker-compose.yml
├── embed.go
├── go.mod
├── go.sum
├── public/
│   ├── Makefile
│   ├── assets/
│   │   ├── boot/
│   │   │   ├── bundler_complete.js
│   │   │   ├── bundler_init.js
│   │   │   ├── common.js
│   │   │   ├── ctrl_boot.d.ts
│   │   │   ├── ctrl_boot_backoffice.js
│   │   │   ├── ctrl_boot_frontoffice.js
│   │   │   ├── router_backoffice.js
│   │   │   └── router_frontoffice.js
│   │   ├── components/
│   │   │   ├── breadcrumb.css
│   │   │   ├── breadcrumb.js
│   │   │   ├── decorator_shell_filemanager.css
│   │   │   ├── decorator_shell_filemanager.js
│   │   │   ├── dropdown.css
│   │   │   ├── dropdown.js
│   │   │   ├── fab.css
│   │   │   ├── fab.js
│   │   │   ├── form.js
│   │   │   ├── icon.js
│   │   │   ├── loader.js
│   │   │   ├── modal.css
│   │   │   ├── modal.js
│   │   │   ├── notification.css
│   │   │   ├── notification.js
│   │   │   ├── sidebar.css
│   │   │   ├── sidebar.js
│   │   │   ├── sidebar_files.js
│   │   │   ├── sidebar_tags.js
│   │   │   └── skeleton.js
│   │   ├── css/
│   │   │   ├── designsystem.css
│   │   │   ├── designsystem_alert.css
│   │   │   ├── designsystem_box.css
│   │   │   ├── designsystem_button.css
│   │   │   ├── designsystem_checkbox.css
│   │   │   ├── designsystem_container.css
│   │   │   ├── designsystem_darkmode.css
│   │   │   ├── designsystem_dropdown.css
│   │   │   ├── designsystem_formbuilder.css
│   │   │   ├── designsystem_icon.css
│   │   │   ├── designsystem_input.css
│   │   │   ├── designsystem_inputgroup.css
│   │   │   ├── designsystem_skeleton.css
│   │   │   ├── designsystem_textarea.css
│   │   │   └── designsystem_utils.css
│   │   ├── embed/
│   │   │   ├── filestash-image.js
│   │   │   ├── filestash-map.js
│   │   │   └── filestash-table.js
│   │   ├── helpers/
│   │   │   ├── loader.d.ts
│   │   │   ├── loader.js
│   │   │   ├── loader_wasm.js
│   │   │   ├── log.d.ts
│   │   │   ├── log.js
│   │   │   └── sdk.js
│   │   ├── index.js
│   │   ├── lib/
│   │   │   ├── ajax.js
│   │   │   ├── animate.d.ts
│   │   │   ├── animate.js
│   │   │   ├── assert.js
│   │   │   ├── chromecast.js
│   │   │   ├── dom.d.ts
│   │   │   ├── dom.js
│   │   │   ├── error.d.ts
│   │   │   ├── error.js
│   │   │   ├── form.d.ts
│   │   │   ├── form.js
│   │   │   ├── path.js
│   │   │   ├── polyfill.js
│   │   │   ├── random.d.ts
│   │   │   ├── random.js
│   │   │   ├── rx.d.ts
│   │   │   ├── rx.js
│   │   │   ├── settings.js
│   │   │   ├── skeleton/
│   │   │   │   ├── index.d.ts
│   │   │   │   ├── index.js
│   │   │   │   ├── lifecycle.d.ts
│   │   │   │   ├── lifecycle.js
│   │   │   │   ├── router.d.ts
│   │   │   │   └── router.js
│   │   │   ├── store.js
│   │   │   └── vendor/
│   │   │       ├── bcrypt.js
│   │   │       ├── codemirror/
│   │   │       │   ├── .editorconfig
│   │   │       │   ├── .gitattributes
│   │   │       │   ├── .npmignore
│   │   │       │   ├── AUTHORS
│   │   │       │   ├── CHANGELOG.md
│   │   │       │   ├── CONTRIBUTING.md
│   │   │       │   ├── LICENSE
│   │   │       │   ├── README.md
│   │   │       │   ├── addon/
│   │   │       │   │   ├── comment/
│   │   │       │   │   │   ├── comment.js
│   │   │       │   │   │   └── continuecomment.js
│   │   │       │   │   ├── dialog/
│   │   │       │   │   │   ├── dialog.css
│   │   │       │   │   │   └── dialog.js
│   │   │       │   │   ├── display/
│   │   │       │   │   │   ├── autorefresh.js
│   │   │       │   │   │   ├── fullscreen.css
│   │   │       │   │   │   ├── fullscreen.js
│   │   │       │   │   │   ├── panel.js
│   │   │       │   │   │   ├── placeholder.js
│   │   │       │   │   │   └── rulers.js
│   │   │       │   │   ├── edit/
│   │   │       │   │   │   ├── closebrackets.js
│   │   │       │   │   │   ├── closetag.js
│   │   │       │   │   │   ├── continuelist.js
│   │   │       │   │   │   ├── matchbrackets.js
│   │   │       │   │   │   ├── matchtags.js
│   │   │       │   │   │   └── trailingspace.js
│   │   │       │   │   ├── fold/
│   │   │       │   │   │   ├── brace-fold.js
│   │   │       │   │   │   ├── comment-fold.js
│   │   │       │   │   │   ├── foldcode.js
│   │   │       │   │   │   ├── foldgutter.css
│   │   │       │   │   │   ├── foldgutter.js
│   │   │       │   │   │   ├── indent-fold.js
│   │   │       │   │   │   ├── markdown-fold.js
│   │   │       │   │   │   └── xml-fold.js
│   │   │       │   │   ├── hint/
│   │   │       │   │   │   ├── anyword-hint.js
│   │   │       │   │   │   ├── css-hint.js
│   │   │       │   │   │   ├── html-hint.js
│   │   │       │   │   │   ├── javascript-hint.js
│   │   │       │   │   │   ├── show-hint.css
│   │   │       │   │   │   ├── show-hint.js
│   │   │       │   │   │   ├── sql-hint.js
│   │   │       │   │   │   └── xml-hint.js
│   │   │       │   │   ├── lint/
│   │   │       │   │   │   ├── coffeescript-lint.js
│   │   │       │   │   │   ├── css-lint.js
│   │   │       │   │   │   ├── html-lint.js
│   │   │       │   │   │   ├── javascript-lint.js
│   │   │       │   │   │   ├── json-lint.js
│   │   │       │   │   │   ├── lint.css
│   │   │       │   │   │   ├── lint.js
│   │   │       │   │   │   └── yaml-lint.js
│   │   │       │   │   ├── merge/
│   │   │       │   │   │   ├── merge.css
│   │   │       │   │   │   └── merge.js
│   │   │       │   │   ├── mode/
│   │   │       │   │   │   ├── loadmode.js
│   │   │       │   │   │   ├── multiplex.js
│   │   │       │   │   │   ├── multiplex_test.js
│   │   │       │   │   │   ├── overlay.js
│   │   │       │   │   │   └── simple.js
│   │   │       │   │   ├── runmode/
│   │   │       │   │   │   ├── colorize.js
│   │   │       │   │   │   ├── runmode-standalone.js
│   │   │       │   │   │   ├── runmode.js
│   │   │       │   │   │   └── runmode.node.js
│   │   │       │   │   ├── scroll/
│   │   │       │   │   │   ├── annotatescrollbar.js
│   │   │       │   │   │   ├── scrollpastend.js
│   │   │       │   │   │   ├── simplescrollbars.css
│   │   │       │   │   │   └── simplescrollbars.js
│   │   │       │   │   ├── search/
│   │   │       │   │   │   ├── jump-to-line.js
│   │   │       │   │   │   ├── match-highlighter.js
│   │   │       │   │   │   ├── matchesonscrollbar.css
│   │   │       │   │   │   ├── matchesonscrollbar.js
│   │   │       │   │   │   ├── search.js
│   │   │       │   │   │   └── searchcursor.js
│   │   │       │   │   ├── selection/
│   │   │       │   │   │   ├── active-line.js
│   │   │       │   │   │   ├── mark-selection.js
│   │   │       │   │   │   └── selection-pointer.js
│   │   │       │   │   ├── tern/
│   │   │       │   │   │   ├── tern.css
│   │   │       │   │   │   ├── tern.js
│   │   │       │   │   │   └── worker.js
│   │   │       │   │   └── wrap/
│   │   │       │   │       └── hardwrap.js
│   │   │       │   ├── bin/
│   │   │       │   │   ├── authors.sh
│   │   │       │   │   ├── lint
│   │   │       │   │   ├── release
│   │   │       │   │   ├── source-highlight
│   │   │       │   │   └── upload-release.js
│   │   │       │   ├── demo/
│   │   │       │   │   ├── activeline.html
│   │   │       │   │   ├── anywordhint.html
│   │   │       │   │   ├── bidi.html
│   │   │       │   │   ├── btree.html
│   │   │       │   │   ├── buffers.html
│   │   │       │   │   ├── changemode.html
│   │   │       │   │   ├── closebrackets.html
│   │   │       │   │   ├── closetag.html
│   │   │       │   │   ├── complete.html
│   │   │       │   │   ├── emacs.html
│   │   │       │   │   ├── folding.html
│   │   │       │   │   ├── fullscreen.html
│   │   │       │   │   ├── hardwrap.html
│   │   │       │   │   ├── html5complete.html
│   │   │       │   │   ├── indentwrap.html
│   │   │       │   │   ├── lint.html
│   │   │       │   │   ├── loadmode.html
│   │   │       │   │   ├── marker.html
│   │   │       │   │   ├── markselection.html
│   │   │       │   │   ├── matchhighlighter.html
│   │   │       │   │   ├── matchtags.html
│   │   │       │   │   ├── merge.html
│   │   │       │   │   ├── multiplex.html
│   │   │       │   │   ├── mustache.html
│   │   │       │   │   ├── panel.html
│   │   │       │   │   ├── placeholder.html
│   │   │       │   │   ├── preview.html
│   │   │       │   │   ├── requirejs.html
│   │   │       │   │   ├── resize.html
│   │   │       │   │   ├── rulers.html
│   │   │       │   │   ├── runmode-standalone.html
│   │   │       │   │   ├── runmode.html
│   │   │       │   │   ├── search.html
│   │   │       │   │   ├── simplemode.html
│   │   │       │   │   ├── simplescrollbars.html
│   │   │       │   │   ├── spanaffectswrapping_shim.html
│   │   │       │   │   ├── sublime.html
│   │   │       │   │   ├── tern.html
│   │   │       │   │   ├── theme.html
│   │   │       │   │   ├── trailingspace.html
│   │   │       │   │   ├── variableheight.html
│   │   │       │   │   ├── vim.html
│   │   │       │   │   ├── visibletabs.html
│   │   │       │   │   ├── widget.html
│   │   │       │   │   └── xmlcomplete.html
│   │   │       │   ├── doc/
│   │   │       │   │   ├── activebookmark.js
│   │   │       │   │   ├── docs.css
│   │   │       │   │   ├── internals.html
│   │   │       │   │   ├── manual.html
│   │   │       │   │   ├── realworld.html
│   │   │       │   │   ├── releases.html
│   │   │       │   │   ├── reporting.html
│   │   │       │   │   ├── upgrade_v2.2.html
│   │   │       │   │   ├── upgrade_v3.html
│   │   │       │   │   └── upgrade_v4.html
│   │   │       │   ├── index.html
│   │   │       │   ├── keymap/
│   │   │       │   │   ├── emacs.js
│   │   │       │   │   ├── sublime.js
│   │   │       │   │   └── vim.js
│   │   │       │   ├── lib/
│   │   │       │   │   ├── codemirror.css
│   │   │       │   │   └── codemirror.js
│   │   │       │   ├── mode/
│   │   │       │   │   ├── apl/
│   │   │       │   │   │   ├── apl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── asciiarmor/
│   │   │       │   │   │   ├── asciiarmor.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── asn.1/
│   │   │       │   │   │   ├── asn.1.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── asterisk/
│   │   │       │   │   │   ├── asterisk.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── brainfuck/
│   │   │       │   │   │   ├── brainfuck.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── clike/
│   │   │       │   │   │   ├── clike.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── scala.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── clojure/
│   │   │       │   │   │   ├── clojure.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── cmake/
│   │   │       │   │   │   ├── cmake.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── cobol/
│   │   │       │   │   │   ├── cobol.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── coffeescript/
│   │   │       │   │   │   ├── coffeescript.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── commonlisp/
│   │   │       │   │   │   ├── commonlisp.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── crystal/
│   │   │       │   │   │   ├── crystal.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── css/
│   │   │       │   │   │   ├── css.js
│   │   │       │   │   │   ├── gss.html
│   │   │       │   │   │   ├── gss_test.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── less.html
│   │   │       │   │   │   ├── less_test.js
│   │   │       │   │   │   ├── scss.html
│   │   │       │   │   │   ├── scss_test.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── cypher/
│   │   │       │   │   │   ├── cypher.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── d/
│   │   │       │   │   │   ├── d.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── dart/
│   │   │       │   │   │   ├── dart.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── diff/
│   │   │       │   │   │   ├── diff.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── django/
│   │   │       │   │   │   ├── django.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── dockerfile/
│   │   │       │   │   │   ├── dockerfile.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── dtd/
│   │   │       │   │   │   ├── dtd.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── dylan/
│   │   │       │   │   │   ├── dylan.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── ebnf/
│   │   │       │   │   │   ├── ebnf.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── ecl/
│   │   │       │   │   │   ├── ecl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── eiffel/
│   │   │       │   │   │   ├── eiffel.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── elm/
│   │   │       │   │   │   ├── elm.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── erlang/
│   │   │       │   │   │   ├── erlang.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── factor/
│   │   │       │   │   │   ├── factor.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── fcl/
│   │   │       │   │   │   ├── fcl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── forth/
│   │   │       │   │   │   ├── forth.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── fortran/
│   │   │       │   │   │   ├── fortran.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── gas/
│   │   │       │   │   │   ├── gas.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── gfm/
│   │   │       │   │   │   ├── gfm.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── gherkin/
│   │   │       │   │   │   ├── gherkin.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── go/
│   │   │       │   │   │   ├── go.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── groovy/
│   │   │       │   │   │   ├── groovy.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haml/
│   │   │       │   │   │   ├── haml.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── handlebars/
│   │   │       │   │   │   ├── handlebars.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haskell/
│   │   │       │   │   │   ├── haskell.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haskell-literate/
│   │   │       │   │   │   ├── haskell-literate.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haxe/
│   │   │       │   │   │   ├── haxe.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── htmlembedded/
│   │   │       │   │   │   ├── htmlembedded.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── htmlmixed/
│   │   │       │   │   │   ├── htmlmixed.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── http/
│   │   │       │   │   │   ├── http.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── idl/
│   │   │       │   │   │   ├── idl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── index.html
│   │   │       │   │   ├── javascript/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── javascript.js
│   │   │       │   │   │   ├── json-ld.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── typescript.html
│   │   │       │   │   ├── jinja2/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── jinja2.js
│   │   │       │   │   ├── jsx/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── jsx.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── julia/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── julia.js
│   │   │       │   │   ├── livescript/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── livescript.js
│   │   │       │   │   ├── lua/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── lua.js
│   │   │       │   │   ├── markdown/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── markdown.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── mathematica/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mathematica.js
│   │   │       │   │   ├── mbox/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mbox.js
│   │   │       │   │   ├── meta.js
│   │   │       │   │   ├── mirc/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mirc.js
│   │   │       │   │   ├── mllike/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mllike.js
│   │   │       │   │   ├── modelica/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── modelica.js
│   │   │       │   │   ├── mscgen/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── mscgen.js
│   │   │       │   │   │   ├── mscgen_test.js
│   │   │       │   │   │   ├── msgenny_test.js
│   │   │       │   │   │   └── xu_test.js
│   │   │       │   │   ├── mumps/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mumps.js
│   │   │       │   │   ├── nginx/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── nginx.js
│   │   │       │   │   ├── nsis/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── nsis.js
│   │   │       │   │   ├── ntriples/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── ntriples.js
│   │   │       │   │   ├── octave/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── octave.js
│   │   │       │   │   ├── oz/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── oz.js
│   │   │       │   │   ├── pascal/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pascal.js
│   │   │       │   │   ├── pegjs/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pegjs.js
│   │   │       │   │   ├── perl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── perl.js
│   │   │       │   │   ├── php/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── php.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── pig/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pig.js
│   │   │       │   │   ├── powershell/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── powershell.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── properties/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── properties.js
│   │   │       │   │   ├── protobuf/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── protobuf.js
│   │   │       │   │   ├── pug/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pug.js
│   │   │       │   │   ├── puppet/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── puppet.js
│   │   │       │   │   ├── python/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── python.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── q/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── q.js
│   │   │       │   │   ├── r/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── r.js
│   │   │       │   │   ├── rpm/
│   │   │       │   │   │   ├── changes/
│   │   │       │   │   │   │   └── index.html
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── rpm.js
│   │   │       │   │   ├── rst/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── rst.js
│   │   │       │   │   ├── ruby/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── ruby.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── rust/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── rust.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── sas/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sas.js
│   │   │       │   │   ├── sass/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── sass.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── scheme/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── scheme.js
│   │   │       │   │   ├── shell/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── shell.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── sieve/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sieve.js
│   │   │       │   │   ├── slim/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── slim.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── smalltalk/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── smalltalk.js
│   │   │       │   │   ├── smarty/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── smarty.js
│   │   │       │   │   ├── solr/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── solr.js
│   │   │       │   │   ├── soy/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── soy.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── sparql/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sparql.js
│   │   │       │   │   ├── spreadsheet/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── spreadsheet.js
│   │   │       │   │   ├── sql/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sql.js
│   │   │       │   │   ├── stex/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── stex.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── stylus/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── stylus.js
│   │   │       │   │   ├── swift/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── swift.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── tcl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── tcl.js
│   │   │       │   │   ├── textile/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── textile.js
│   │   │       │   │   ├── tiddlywiki/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── tiddlywiki.css
│   │   │       │   │   │   └── tiddlywiki.js
│   │   │       │   │   ├── tiki/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── tiki.css
│   │   │       │   │   │   └── tiki.js
│   │   │       │   │   ├── toml/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── toml.js
│   │   │       │   │   ├── tornado/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── tornado.js
│   │   │       │   │   ├── troff/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── troff.js
│   │   │       │   │   ├── ttcn/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── ttcn.js
│   │   │       │   │   ├── ttcn-cfg/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── ttcn-cfg.js
│   │   │       │   │   ├── turtle/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── turtle.js
│   │   │       │   │   ├── twig/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── twig.js
│   │   │       │   │   ├── vb/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vb.js
│   │   │       │   │   ├── vbscript/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vbscript.js
│   │   │       │   │   ├── velocity/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── velocity.js
│   │   │       │   │   ├── verilog/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── verilog.js
│   │   │       │   │   ├── vhdl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vhdl.js
│   │   │       │   │   ├── vue/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vue.js
│   │   │       │   │   ├── wast/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── wast.js
│   │   │       │   │   ├── webidl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── webidl.js
│   │   │       │   │   ├── xml/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── xml.js
│   │   │       │   │   ├── xquery/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── xquery.js
│   │   │       │   │   ├── yacas/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── yacas.js
│   │   │       │   │   ├── yaml/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── yaml.js
│   │   │       │   │   ├── yaml-frontmatter/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── yaml-frontmatter.js
│   │   │       │   │   └── z80/
│   │   │       │   │       ├── index.html
│   │   │       │   │       └── z80.js
│   │   │       │   ├── package.json
│   │   │       │   ├── rollup.config.js
│   │   │       │   ├── src/
│   │   │       │   │   ├── addon/
│   │   │       │   │   │   └── runmode/
│   │   │       │   │   │       ├── codemirror-standalone.js
│   │   │       │   │   │       ├── codemirror.node.js
│   │   │       │   │   │       ├── runmode-standalone.js
│   │   │       │   │   │       └── runmode.node.js
│   │   │       │   │   ├── codemirror.js
│   │   │       │   │   ├── display/
│   │   │       │   │   │   ├── Display.js
│   │   │       │   │   │   ├── focus.js
│   │   │       │   │   │   ├── gutters.js
│   │   │       │   │   │   ├── highlight_worker.js
│   │   │       │   │   │   ├── line_numbers.js
│   │   │       │   │   │   ├── mode_state.js
│   │   │       │   │   │   ├── operations.js
│   │   │       │   │   │   ├── scroll_events.js
│   │   │       │   │   │   ├── scrollbars.js
│   │   │       │   │   │   ├── scrolling.js
│   │   │       │   │   │   ├── selection.js
│   │   │       │   │   │   ├── update_display.js
│   │   │       │   │   │   ├── update_line.js
│   │   │       │   │   │   ├── update_lines.js
│   │   │       │   │   │   └── view_tracking.js
│   │   │       │   │   ├── edit/
│   │   │       │   │   │   ├── CodeMirror.js
│   │   │       │   │   │   ├── commands.js
│   │   │       │   │   │   ├── deleteNearSelection.js
│   │   │       │   │   │   ├── drop_events.js
│   │   │       │   │   │   ├── fromTextArea.js
│   │   │       │   │   │   ├── global_events.js
│   │   │       │   │   │   ├── key_events.js
│   │   │       │   │   │   ├── legacy.js
│   │   │       │   │   │   ├── main.js
│   │   │       │   │   │   ├── methods.js
│   │   │       │   │   │   ├── mouse_events.js
│   │   │       │   │   │   ├── options.js
│   │   │       │   │   │   └── utils.js
│   │   │       │   │   ├── input/
│   │   │       │   │   │   ├── ContentEditableInput.js
│   │   │       │   │   │   ├── TextareaInput.js
│   │   │       │   │   │   ├── indent.js
│   │   │       │   │   │   ├── input.js
│   │   │       │   │   │   ├── keymap.js
│   │   │       │   │   │   ├── keynames.js
│   │   │       │   │   │   └── movement.js
│   │   │       │   │   ├── line/
│   │   │       │   │   │   ├── highlight.js
│   │   │       │   │   │   ├── line_data.js
│   │   │       │   │   │   ├── pos.js
│   │   │       │   │   │   ├── saw_special_spans.js
│   │   │       │   │   │   ├── spans.js
│   │   │       │   │   │   └── utils_line.js
│   │   │       │   │   ├── measurement/
│   │   │       │   │   │   ├── position_measurement.js
│   │   │       │   │   │   └── widgets.js
│   │   │       │   │   ├── model/
│   │   │       │   │   │   ├── Doc.js
│   │   │       │   │   │   ├── change_measurement.js
│   │   │       │   │   │   ├── changes.js
│   │   │       │   │   │   ├── chunk.js
│   │   │       │   │   │   ├── document_data.js
│   │   │       │   │   │   ├── history.js
│   │   │       │   │   │   ├── line_widget.js
│   │   │       │   │   │   ├── mark_text.js
│   │   │       │   │   │   ├── selection.js
│   │   │       │   │   │   └── selection_updates.js
│   │   │       │   │   ├── modes.js
│   │   │       │   │   └── util/
│   │   │       │   │       ├── StringStream.js
│   │   │       │   │       ├── bidi.js
│   │   │       │   │       ├── browser.js
│   │   │       │   │       ├── dom.js
│   │   │       │   │       ├── event.js
│   │   │       │   │       ├── feature_detection.js
│   │   │       │   │       ├── misc.js
│   │   │       │   │       └── operation_group.js
│   │   │       │   └── theme/
│   │   │       │       ├── 3024-day.css
│   │   │       │       ├── 3024-night.css
│   │   │       │       ├── abbott.css
│   │   │       │       ├── abcdef.css
│   │   │       │       ├── ambiance-mobile.css
│   │   │       │       ├── ambiance.css
│   │   │       │       ├── ayu-dark.css
│   │   │       │       ├── ayu-mirage.css
│   │   │       │       ├── base16-dark.css
│   │   │       │       ├── base16-light.css
│   │   │       │       ├── bespin.css
│   │   │       │       ├── blackboard.css
│   │   │       │       ├── cobalt.css
│   │   │       │       ├── colorforth.css
│   │   │       │       ├── darcula.css
│   │   │       │       ├── dracula.css
│   │   │       │       ├── duotone-dark.css
│   │   │       │       ├── duotone-light.css
│   │   │       │       ├── eclipse.css
│   │   │       │       ├── elegant.css
│   │   │       │       ├── erlang-dark.css
│   │   │       │       ├── gruvbox-dark.css
│   │   │       │       ├── hopscotch.css
│   │   │       │       ├── icecoder.css
│   │   │       │       ├── idea.css
│   │   │       │       ├── isotope.css
│   │   │       │       ├── juejin.css
│   │   │       │       ├── lesser-dark.css
│   │   │       │       ├── liquibyte.css
│   │   │       │       ├── lucario.css
│   │   │       │       ├── material-darker.css
│   │   │       │       ├── material-ocean.css
│   │   │       │       ├── material-palenight.css
│   │   │       │       ├── material.css
│   │   │       │       ├── mbo.css
│   │   │       │       ├── mdn-like.css
│   │   │       │       ├── midnight.css
│   │   │       │       ├── monokai.css
│   │   │       │       ├── moxer.css
│   │   │       │       ├── neat.css
│   │   │       │       ├── neo.css
│   │   │       │       ├── night.css
│   │   │       │       ├── nord.css
│   │   │       │       ├── oceanic-next.css
│   │   │       │       ├── panda-syntax.css
│   │   │       │       ├── paraiso-dark.css
│   │   │       │       ├── paraiso-light.css
│   │   │       │       ├── pastel-on-dark.css
│   │   │       │       ├── railscasts.css
│   │   │       │       ├── rubyblue.css
│   │   │       │       ├── seti.css
│   │   │       │       ├── shadowfox.css
│   │   │       │       ├── solarized.css
│   │   │       │       ├── ssms.css
│   │   │       │       ├── the-matrix.css
│   │   │       │       ├── tomorrow-night-bright.css
│   │   │       │       ├── tomorrow-night-eighties.css
│   │   │       │       ├── ttcn.css
│   │   │       │       ├── twilight.css
│   │   │       │       ├── vibrant-ink.css
│   │   │       │       ├── xq-dark.css
│   │   │       │       ├── xq-light.css
│   │   │       │       ├── yeti.css
│   │   │       │       ├── yonce.css
│   │   │       │       └── zenburn.css
│   │   │       ├── exif-js.js
│   │   │       ├── hlsjs/
│   │   │       │   └── hls.js
│   │   │       ├── leaflet/
│   │   │       │   ├── Control.Draw.js
│   │   │       │   ├── Leaflet.Draw.Event.js
│   │   │       │   ├── Leaflet.draw.js
│   │   │       │   ├── Toolbar.js
│   │   │       │   ├── Tooltip.js
│   │   │       │   ├── draw/
│   │   │       │   │   ├── DrawToolbar.js
│   │   │       │   │   └── handler/
│   │   │       │   │       ├── Draw.Circle.js
│   │   │       │   │       ├── Draw.CircleMarker.js
│   │   │       │   │       ├── Draw.Feature.js
│   │   │       │   │       ├── Draw.Marker.js
│   │   │       │   │       ├── Draw.Polygon.js
│   │   │       │   │       ├── Draw.Polyline.js
│   │   │       │   │       ├── Draw.Rectangle.js
│   │   │       │   │       └── Draw.SimpleShape.js
│   │   │       │   ├── edit/
│   │   │       │   │   ├── EditToolbar.js
│   │   │       │   │   └── handler/
│   │   │       │   │       ├── Edit.Circle.js
│   │   │       │   │       ├── Edit.CircleMarker.js
│   │   │       │   │       ├── Edit.Marker.js
│   │   │       │   │       ├── Edit.Poly.js
│   │   │       │   │       ├── Edit.Rectangle.js
│   │   │       │   │       ├── Edit.SimpleShape.js
│   │   │       │   │       ├── EditToolbar.Delete.js
│   │   │       │   │       └── EditToolbar.Edit.js
│   │   │       │   ├── ext/
│   │   │       │   │   ├── GeometryUtil.js
│   │   │       │   │   ├── LatLngUtil.js
│   │   │       │   │   ├── LineUtil.Intersect.js
│   │   │       │   │   ├── Polygon.Intersect.js
│   │   │       │   │   ├── Polyline.Intersect.js
│   │   │       │   │   └── TouchEvents.js
│   │   │       │   ├── leaflet-measure.css
│   │   │       │   ├── leaflet-measure.js
│   │   │       │   ├── leaflet.css
│   │   │       │   ├── leaflet.draw.css
│   │   │       │   ├── leaflet.js
│   │   │       │   └── shp.esm.js
│   │   │       ├── pdfjs/
│   │   │       │   ├── pdf.js
│   │   │       │   ├── pdf.sandbox.js
│   │   │       │   └── pdf.worker.js
│   │   │       ├── three/
│   │   │       │   ├── FontLoader.js
│   │   │       │   ├── OrbitControls.js
│   │   │       │   ├── Projector.js
│   │   │       │   ├── TextGeometry.js
│   │   │       │   ├── three.module.js
│   │   │       │   └── viewcube.js
│   │   │       └── wavesurfer.js
│   │   ├── locales/
│   │   │   ├── _.json
│   │   │   ├── az.json
│   │   │   ├── be.json
│   │   │   ├── bg.json
│   │   │   ├── ca.json
│   │   │   ├── cs.json
│   │   │   ├── da.json
│   │   │   ├── de.json
│   │   │   ├── el.json
│   │   │   ├── es.json
│   │   │   ├── et.json
│   │   │   ├── eu.json
│   │   │   ├── fi.json
│   │   │   ├── fr.json
│   │   │   ├── gl.json
│   │   │   ├── hr.json
│   │   │   ├── hu.json
│   │   │   ├── id.json
│   │   │   ├── index.js
│   │   │   ├── is.json
│   │   │   ├── it.json
│   │   │   ├── ja.json
│   │   │   ├── ka.json
│   │   │   ├── ko.json
│   │   │   ├── lt.json
│   │   │   ├── lv.json
│   │   │   ├── mn.json
│   │   │   ├── nb.json
│   │   │   ├── nl.json
│   │   │   ├── no.json
│   │   │   ├── pl.json
│   │   │   ├── pt.json
│   │   │   ├── ro.json
│   │   │   ├── ru.json
│   │   │   ├── script.js
│   │   │   ├── sk.json
│   │   │   ├── sl.json
│   │   │   ├── sr.json
│   │   │   ├── sv.json
│   │   │   ├── th.json
│   │   │   ├── tr.json
│   │   │   ├── uk.json
│   │   │   ├── vi.json
│   │   │   ├── zh.json
│   │   │   └── zh_tw.json
│   │   ├── model/
│   │   │   ├── backend.js
│   │   │   ├── chromecast.js
│   │   │   ├── config.d.ts
│   │   │   ├── config.js
│   │   │   ├── plugin.js
│   │   │   └── session.js
│   │   └── pages/
│   │       ├── adminpage/
│   │       │   ├── animate.js
│   │       │   ├── component_box-item.js
│   │       │   ├── ctrl_about.css
│   │       │   ├── ctrl_about.js
│   │       │   ├── ctrl_activity.js
│   │       │   ├── ctrl_activity_audit.js
│   │       │   ├── ctrl_activity_form.js
│   │       │   ├── ctrl_activity_graph.css
│   │       │   ├── ctrl_activity_graph.js
│   │       │   ├── ctrl_activity_viewer.css
│   │       │   ├── ctrl_activity_viewer.js
│   │       │   ├── ctrl_login.css
│   │       │   ├── ctrl_login.js
│   │       │   ├── ctrl_settings.js
│   │       │   ├── ctrl_setup.css
│   │       │   ├── ctrl_setup.js
│   │       │   ├── ctrl_storage.css
│   │       │   ├── ctrl_storage.js
│   │       │   ├── ctrl_storage_component_authentication.js
│   │       │   ├── ctrl_storage_component_backend.js
│   │       │   ├── ctrl_storage_component_banner.js
│   │       │   ├── ctrl_storage_state.js
│   │       │   ├── ctrl_workflow.css
│   │       │   ├── ctrl_workflow.js
│   │       │   ├── ctrl_workflow_details.js
│   │       │   ├── ctrl_workflow_list.js
│   │       │   ├── decorator.js
│   │       │   ├── decorator_admin_only.js
│   │       │   ├── decorator_sidemenu.css
│   │       │   ├── decorator_sidemenu.js
│   │       │   ├── helper_form.js
│   │       │   ├── index.css
│   │       │   ├── model_admin_session.js
│   │       │   ├── model_audit.js
│   │       │   ├── model_auth_middleware.js
│   │       │   ├── model_backend.js
│   │       │   ├── model_config.js
│   │       │   ├── model_log.js
│   │       │   ├── model_release.js
│   │       │   ├── model_setup.js
│   │       │   └── model_workflow.js
│   │       ├── connectpage/
│   │       │   ├── ctrl_forkme.js
│   │       │   ├── ctrl_form.css
│   │       │   ├── ctrl_form.js
│   │       │   ├── ctrl_form_state.js
│   │       │   ├── ctrl_poweredby.js
│   │       │   ├── model_backend.js
│   │       │   └── model_config.js
│   │       ├── ctrl_adminpage.js
│   │       ├── ctrl_connectpage.css
│   │       ├── ctrl_connectpage.js
│   │       ├── ctrl_error.js
│   │       ├── ctrl_filespage.css
│   │       ├── ctrl_filespage.js
│   │       ├── ctrl_homepage.js
│   │       ├── ctrl_logout.js
│   │       ├── ctrl_notfound.js
│   │       ├── ctrl_sharepage.css
│   │       ├── ctrl_sharepage.js
│   │       ├── ctrl_viewerpage.css
│   │       ├── ctrl_viewerpage.js
│   │       ├── filespage/
│   │       │   ├── cache.js
│   │       │   ├── ctrl_filesystem.css
│   │       │   ├── ctrl_filesystem.js
│   │       │   ├── ctrl_frequentlyaccess.css
│   │       │   ├── ctrl_frequentlyaccess.js
│   │       │   ├── ctrl_newitem.css
│   │       │   ├── ctrl_newitem.js
│   │       │   ├── ctrl_submenu.css
│   │       │   ├── ctrl_submenu.js
│   │       │   ├── ctrl_upload.css
│   │       │   ├── ctrl_upload.d.ts
│   │       │   ├── ctrl_upload.js
│   │       │   ├── helper.js
│   │       │   ├── modal.css
│   │       │   ├── modal_delete.js
│   │       │   ├── modal_rename.js
│   │       │   ├── modal_share.css
│   │       │   ├── modal_share.js
│   │       │   ├── modal_tag.css
│   │       │   ├── modal_tag.js
│   │       │   ├── model_acl.js
│   │       │   ├── model_files.js
│   │       │   ├── model_tag.js
│   │       │   ├── model_virtual_layer.js
│   │       │   ├── state_config.js
│   │       │   ├── state_newthing.js
│   │       │   ├── state_selection.js
│   │       │   ├── thing.css
│   │       │   ├── thing.d.ts
│   │       │   └── thing.js
│   │       └── viewerpage/
│   │           ├── application_3d/
│   │           │   ├── init.js
│   │           │   ├── scene_cube.js
│   │           │   ├── scene_light.js
│   │           │   └── toolbar.js
│   │           ├── application_3d.css
│   │           ├── application_3d.d.ts
│   │           ├── application_3d.js
│   │           ├── application_audio.css
│   │           ├── application_audio.d.ts
│   │           ├── application_audio.js
│   │           ├── application_downloader.css
│   │           ├── application_downloader.js
│   │           ├── application_ebook.css
│   │           ├── application_ebook.d.ts
│   │           ├── application_ebook.js
│   │           ├── application_editor/
│   │           │   ├── clike.js
│   │           │   ├── clojure.js
│   │           │   ├── cmake.js
│   │           │   ├── commonlisp.js
│   │           │   ├── css.js
│   │           │   ├── diff.js
│   │           │   ├── dockerfile.js
│   │           │   ├── elm.js
│   │           │   ├── emacs-org.js
│   │           │   ├── erlang.js
│   │           │   ├── go.js
│   │           │   ├── groovy.js
│   │           │   ├── htmlmixed.js
│   │           │   ├── java.js
│   │           │   ├── javascript.js
│   │           │   ├── jsx.js
│   │           │   ├── keymap_base.js
│   │           │   ├── keymap_vim.js
│   │           │   ├── lua.js
│   │           │   ├── orgmode.js
│   │           │   ├── perl.js
│   │           │   ├── php.js
│   │           │   ├── properties.js
│   │           │   ├── python.js
│   │           │   ├── r.js
│   │           │   ├── ruby.js
│   │           │   ├── rust.js
│   │           │   ├── sass.js
│   │           │   ├── shell.js
│   │           │   ├── sparql.js
│   │           │   ├── spreadsheet.js
│   │           │   ├── sql.js
│   │           │   ├── stex.js
│   │           │   ├── text.js
│   │           │   ├── xml.js
│   │           │   ├── yaml-frontmatter.js
│   │           │   └── yaml.js
│   │           ├── application_editor.css
│   │           ├── application_editor.d.ts
│   │           ├── application_editor.js
│   │           ├── application_editor_orgmode.js
│   │           ├── application_form.css
│   │           ├── application_form.js
│   │           ├── application_iframe.css
│   │           ├── application_iframe.js
│   │           ├── application_image/
│   │           │   ├── information.css
│   │           │   ├── information.js
│   │           │   ├── pagination.css
│   │           │   ├── pagination.js
│   │           │   └── zoom.js
│   │           ├── application_image.css
│   │           ├── application_image.d.ts
│   │           ├── application_image.js
│   │           ├── application_map.css
│   │           ├── application_map.d.ts
│   │           ├── application_map.js
│   │           ├── application_pdf.css
│   │           ├── application_pdf.d.ts
│   │           ├── application_pdf.js
│   │           ├── application_skeleton.css
│   │           ├── application_skeleton.js
│   │           ├── application_table.css
│   │           ├── application_table.js
│   │           ├── application_url.js
│   │           ├── application_video.css
│   │           ├── application_video.js
│   │           ├── common.js
│   │           ├── common_fab.js
│   │           ├── common_icon.js
│   │           ├── common_player.js
│   │           ├── component_menubar.css
│   │           ├── component_menubar.js
│   │           ├── mimetype.js
│   │           └── model_files.js
│   ├── global.d.ts
│   ├── index.backoffice.html
│   ├── index.frontoffice.html
│   ├── tsconfig.json
│   ├── vite.config.js
│   └── vite.setup.js
└── server/
    ├── common/
    │   ├── app.go
    │   ├── backend.go
    │   ├── cache.go
    │   ├── config.go
    │   ├── config_state.go
    │   ├── constants.go
    │   ├── crypto.go
    │   ├── debug.go
    │   ├── default.go
    │   ├── dummy.go
    │   ├── error.go
    │   ├── files.go
    │   ├── files_all.go
    │   ├── files_linux.go
    │   ├── log.go
    │   ├── mime.go
    │   ├── plugin.go
    │   ├── recovery.go
    │   ├── response.go
    │   ├── ssl/
    │   │   ├── cert.go
    │   │   ├── generate.go
    │   │   ├── index.go
    │   │   ├── private.go
    │   │   └── root.go
    │   ├── token.go
    │   ├── types.go
    │   └── utils.go
    ├── ctrl/
    │   ├── about.go
    │   ├── admin.go
    │   ├── config.go
    │   ├── files.go
    │   ├── metadata.go
    │   ├── plugin.go
    │   ├── report.go
    │   ├── search.go
    │   ├── session.go
    │   ├── share.go
    │   ├── static/
    │   │   ├── 404.html
    │   │   └── loader.html
    │   ├── static.go
    │   ├── tmpl.go
    │   └── webdav.go
    ├── generator/
    │   ├── constants.go
    │   ├── emacs-el.go
    │   └── mime.go
    ├── middleware/
    │   ├── context.go
    │   ├── http.go
    │   ├── index.go
    │   ├── session.go
    │   └── telemetry.go
    ├── model/
    │   ├── audit.go
    │   ├── files.go
    │   ├── formater/
    │   │   ├── README.md
    │   │   ├── office.go
    │   │   ├── pdf.go
    │   │   └── txt.go
    │   ├── index.go
    │   ├── permissions.go
    │   ├── plugin.go
    │   ├── plugin_adapter.go
    │   ├── share.go
    │   └── webdav.go
    ├── pkg/
    │   ├── compress/
    │   │   ├── cgo.go
    │   │   └── nocgo.go
    │   ├── index.go
    │   ├── sqlite/
    │   │   ├── cgo.go
    │   │   └── nocgo.go
    │   └── workflow/
    │       ├── action.go
    │       ├── actions/
    │       │   ├── notify_email.go
    │       │   ├── run_api.go
    │       │   ├── tools_debug.go
    │       │   └── utils.go
    │       ├── config.go
    │       ├── handler.go
    │       ├── index.go
    │       ├── job.go
    │       ├── model/
    │       │   ├── block.go
    │       │   ├── index.go
    │       │   ├── job.go
    │       │   └── workflow.go
    │       ├── trigger/
    │       │   ├── fileaction.go
    │       │   ├── filewatch.go
    │       │   ├── index.go
    │       │   ├── schedule.go
    │       │   └── webhook.go
    │       └── trigger.go
    ├── plugin/
    │   ├── index.go
    │   ├── plg_application_docxjs/
    │   │   ├── Makefile
    │   │   ├── loader_docx.css
    │   │   ├── loader_docx.js
    │   │   └── manifest.json
    │   ├── plg_application_office/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── loader_lowa.css
    │   │   ├── loader_lowa.go
    │   │   ├── loader_lowa.js
    │   │   ├── loader_lowa.uno.js
    │   │   ├── manifest.json
    │   │   └── middleware.c
    │   ├── plg_authenticate_admin/
    │   │   └── index.go
    │   ├── plg_authenticate_htpasswd/
    │   │   ├── deps/
    │   │   │   └── crypt/
    │   │   │       ├── AUTHORS.md
    │   │   │       ├── LICENSE
    │   │   │       ├── README.md
    │   │   │       ├── apr1_crypt/
    │   │   │       │   └── apr1_crypt.go
    │   │   │       ├── common/
    │   │   │       │   ├── base64.go
    │   │   │       │   ├── doc.go
    │   │   │       │   └── salt.go
    │   │   │       ├── crypt.go
    │   │   │       ├── md5_crypt/
    │   │   │       │   └── md5_crypt.go
    │   │   │       ├── sha256_crypt/
    │   │   │       │   └── sha256_crypt.go
    │   │   │       └── sha512_crypt/
    │   │   │           └── sha512_crypt.go
    │   │   └── index.go
    │   ├── plg_authenticate_ldap/
    │   │   └── index.go
    │   ├── plg_authenticate_local/
    │   │   ├── README.md
    │   │   ├── auth.go
    │   │   ├── config.go
    │   │   ├── data.go
    │   │   ├── handler.go
    │   │   ├── handler.html
    │   │   ├── index.go
    │   │   ├── notify.go
    │   │   ├── service.go
    │   │   └── utils.go
    │   ├── plg_authenticate_passthrough/
    │   │   └── index.go
    │   ├── plg_authenticate_wordpress/
    │   │   ├── README.md
    │   │   ├── helper.go
    │   │   └── index.go
    │   ├── plg_authorisation_example/
    │   │   └── index.go
    │   ├── plg_backend_artifactory/
    │   │   └── index.go
    │   ├── plg_backend_azure/
    │   │   └── index.go
    │   ├── plg_backend_backblaze/
    │   │   └── index.go
    │   ├── plg_backend_dav/
    │   │   └── index.go
    │   ├── plg_backend_dropbox/
    │   │   └── index.go
    │   ├── plg_backend_ftp/
    │   │   └── index.go
    │   ├── plg_backend_ftp_only/
    │   │   └── index.go
    │   ├── plg_backend_gdrive/
    │   │   └── index.go
    │   ├── plg_backend_git/
    │   │   └── index.go
    │   ├── plg_backend_ipfs/
    │   │   ├── README.md
    │   │   └── index.go
    │   ├── plg_backend_ldap/
    │   │   └── index.go
    │   ├── plg_backend_local/
    │   │   └── index.go
    │   ├── plg_backend_mysql/
    │   │   └── index.go
    │   ├── plg_backend_nfs/
    │   │   ├── auth_helper.go
    │   │   ├── auth_unix.go
    │   │   └── index.go
    │   ├── plg_backend_nfs4/
    │   │   ├── index.go
    │   │   └── repo/
    │   │       ├── README.md
    │   │       ├── internal/
    │   │       │   ├── cleanuper.go
    │   │       │   ├── nfs4.go
    │   │       │   ├── nfs4.x
    │   │       │   ├── nfsconst.go
    │   │       │   ├── rpc.go
    │   │       │   ├── rpc.x
    │   │       │   └── types.go
    │   │       └── nfs4/
    │   │           ├── client.go
    │   │           ├── nfs_err.go
    │   │           └── supervised_conn.go
    │   ├── plg_backend_nop/
    │   │   └── index.go
    │   ├── plg_backend_perkeep/
    │   │   ├── index.go
    │   │   └── types.go
    │   ├── plg_backend_psql/
    │   │   ├── index.go
    │   │   ├── index_cat.go
    │   │   ├── index_ls.go
    │   │   ├── index_rm.go
    │   │   ├── index_save.go
    │   │   ├── types.go
    │   │   └── utils.go
    │   ├── plg_backend_s3/
    │   │   └── index.go
    │   ├── plg_backend_samba/
    │   │   └── index.go
    │   ├── plg_backend_sftp/
    │   │   └── index.go
    │   ├── plg_backend_storj/
    │   │   └── index.go
    │   ├── plg_backend_syncthing/
    │   │   ├── README.md
    │   │   ├── index.go
    │   │   └── index_helper.go
    │   ├── plg_backend_tmp/
    │   │   └── index.go
    │   ├── plg_backend_url/
    │   │   └── index.go
    │   ├── plg_backend_webdav/
    │   │   └── index.go
    │   ├── plg_editor_onlyoffice/
    │   │   └── index.go
    │   ├── plg_editor_wopi/
    │   │   ├── config.go
    │   │   ├── handler.go
    │   │   └── index.go
    │   ├── plg_handler_console/
    │   │   ├── generator.go
    │   │   ├── index.go
    │   │   ├── index_linux.go
    │   │   └── src/
    │   │       └── app.css
    │   ├── plg_handler_mcp/
    │   │   ├── README.md
    │   │   ├── config/
    │   │   │   └── config.go
    │   │   ├── handler.go
    │   │   ├── handler_auth.go
    │   │   ├── handler_state.go
    │   │   ├── impl/
    │   │   │   ├── completion.go
    │   │   │   ├── prompts.go
    │   │   │   ├── prompts_fs.go
    │   │   │   ├── public/
    │   │   │   │   └── file-list.html
    │   │   │   ├── resources.go
    │   │   │   ├── tools.go
    │   │   │   └── tools_fs.go
    │   │   ├── index.go
    │   │   ├── types/
    │   │   │   ├── mcp_completion.go
    │   │   │   ├── mcp_init.go
    │   │   │   ├── mcp_notification.go
    │   │   │   ├── mcp_prompts.go
    │   │   │   ├── mcp_resources.go
    │   │   │   ├── mcp_tools.go
    │   │   │   ├── resources.go
    │   │   │   ├── rpc.go
    │   │   │   └── session.go
    │   │   └── utils/
    │   │       ├── cors.go
    │   │       ├── default.go
    │   │       ├── json.go
    │   │       ├── mcp.go
    │   │       └── response.go
    │   ├── plg_handler_site/
    │   │   ├── config.go
    │   │   ├── index.go
    │   │   ├── middleware.go
    │   │   └── template.go
    │   ├── plg_handler_syncthing/
    │   │   └── index.go
    │   ├── plg_image_ascii/
    │   │   └── index.go
    │   ├── plg_image_bimg/
    │   │   └── index.go
    │   ├── plg_image_c/
    │   │   ├── image_gif.c
    │   │   ├── image_gif.go
    │   │   ├── image_gif.h
    │   │   ├── image_gif_vendor.h
    │   │   ├── image_jpeg.c
    │   │   ├── image_jpeg.h
    │   │   ├── image_jpeg_freebsd.go
    │   │   ├── image_jpeg_linux.go
    │   │   ├── image_png.c
    │   │   ├── image_png.h
    │   │   ├── image_png_freebsd.go
    │   │   ├── image_png_linux.go
    │   │   ├── image_psd.c
    │   │   ├── image_psd.go
    │   │   ├── image_psd.h
    │   │   ├── image_psd_generator.go
    │   │   ├── image_raw.c
    │   │   ├── image_raw.h
    │   │   ├── image_raw_freebsd.go
    │   │   ├── image_raw_linux.go
    │   │   ├── image_webp.c
    │   │   ├── image_webp.go
    │   │   ├── image_webp.h
    │   │   ├── index.go
    │   │   └── utils.h
    │   ├── plg_image_golang/
    │   │   └── index.go
    │   ├── plg_image_light/
    │   │   ├── deps/
    │   │   │   ├── README.md
    │   │   │   ├── create_libresize.sh
    │   │   │   ├── create_libtranscode.sh
    │   │   │   └── src/
    │   │   │       ├── libresize.c
    │   │   │       ├── libresize.h
    │   │   │       ├── libresize_test.c
    │   │   │       ├── libtranscode.c
    │   │   │       ├── libtranscode.h
    │   │   │       └── libtranscode_test.c
    │   │   ├── index.go
    │   │   ├── install.sh
    │   │   ├── lib_resize.go
    │   │   ├── lib_resize_linux_amd64.go
    │   │   ├── lib_resize_linux_arm.go
    │   │   ├── lib_transcode.go
    │   │   ├── lib_transcode_linux_amd64.go
    │   │   └── lib_transcode_linux_arm.go
    │   ├── plg_image_transcode/
    │   │   ├── index.go
    │   │   ├── transcode_bmp.go
    │   │   ├── transcode_dicom.go
    │   │   ├── transcode_svg.go
    │   │   └── transcode_tiff.go
    │   ├── plg_license/
    │   │   └── index.go
    │   ├── plg_metadata_sqlite/
    │   │   └── index.go
    │   ├── plg_override_actiondelete/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── filespage_thing.diff
    │   │   ├── index.go
    │   │   └── manifest.json
    │   ├── plg_override_download/
    │   │   ├── README.md
    │   │   ├── assets/
    │   │   │   └── pages/
    │   │   │       └── filespage/
    │   │   │           └── thing.js
    │   │   └── index.go
    │   ├── plg_search_example/
    │   │   └── index.go
    │   ├── plg_search_sqlitefts/
    │   │   ├── config/
    │   │   │   └── configuration.go
    │   │   ├── converter/
    │   │   │   └── index.go
    │   │   ├── crawler/
    │   │   │   ├── daemon.go
    │   │   │   ├── daemon_state.go
    │   │   │   ├── events.go
    │   │   │   ├── phase.go
    │   │   │   ├── phase_explore.go
    │   │   │   ├── phase_indexing.go
    │   │   │   ├── phase_maintain.go
    │   │   │   ├── phase_pause.go
    │   │   │   ├── phase_utils.go
    │   │   │   └── types.go
    │   │   ├── index.go
    │   │   ├── indexer/
    │   │   │   ├── error.go
    │   │   │   ├── index.go
    │   │   │   └── query.go
    │   │   ├── query.go
    │   │   └── workflow/
    │   │       └── index.go
    │   ├── plg_search_stateless/
    │   │   ├── config.go
    │   │   ├── index.go
    │   │   └── scoring.go
    │   ├── plg_security_scanner/
    │   │   └── index.go
    │   ├── plg_security_svg/
    │   │   └── index.go
    │   ├── plg_starter_http/
    │   │   └── index.go
    │   ├── plg_starter_http2/
    │   │   └── index.go
    │   ├── plg_starter_https/
    │   │   └── index.go
    │   ├── plg_starter_tor/
    │   │   └── index.go
    │   ├── plg_video_thumbnail/
    │   │   └── index.go
    │   ├── plg_video_transcoder/
    │   │   └── index.go
    │   ├── plg_widget_chat/
    │   │   ├── assets/
    │   │   │   ├── sidebar.diff
    │   │   │   └── sidebar_chat.js
    │   │   ├── config.go
    │   │   ├── db.go
    │   │   ├── handler.go
    │   │   ├── index.go
    │   │   ├── type.go
    │   │   ├── utils.go
    │   │   └── workflow.go
    │   ├── plg_widget_description/
    │   │   ├── assets/
    │   │   │   ├── sidebar.diff
    │   │   │   └── sidebar_description.js
    │   │   ├── config.go
    │   │   ├── db.go
    │   │   ├── handler.go
    │   │   ├── index.go
    │   │   ├── type.go
    │   │   └── utils.go
    │   ├── plg_widget_favourite/
    │   │   ├── assets/
    │   │   │   ├── favourite.diff
    │   │   │   └── sidebar_favourite.js
    │   │   ├── config.go
    │   │   └── index.go
    │   ├── plg_widget_pgp/
    │   │   ├── assets/
    │   │   │   ├── pgp.diff
    │   │   │   └── pgp.js
    │   │   └── index.go
    │   └── plg_widget_recent/
    │       ├── ai.go
    │       ├── config.go
    │       ├── db.go
    │       ├── decorator.go
    │       ├── index.go
    │       └── service.go
    └── routes.go

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

================================================
FILE: .assets/raw/Makefile
================================================
all:
	convert -delay 100 -loop 0 navigation_*.png navigation.gif
	convert -delay 100 -loop 0 orgmode_*.png orgmode.gif
	convert -delay 100 -loop 0 photo_management_*.png photo_management.gif


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

open_collective: filestash


================================================
FILE: .github/ISSUE_TEMPLATE/bug.md
================================================
---
name: Bug
about: Report a bug
title: "[bug] "
labels: ''
assignees: ''

---

# Description of the bug

<!-- TO COMPLETE -->

# Step by step instructions to reproduce the bug

<!-- TO COMPLETE -->

# Can you replicate that error from the demo?

<!--
1. the demo is available from https://demo.filestash.app
2. if you want a testing backgend, you can use this: https://demo.filestash.app/login?type=s3&access_key_id=Q3AM3UQ867SPQQA43P2F&secret_access_key=zuf%2BtfteSlswRu7BJ86wekitnifILbZam1KYY3TG&region=us-east-2&encryption_key=&endpoint=https%3A%2F%2Fplay.minio.io%3A9000%2F
-->

# Observed behavior

<!-- TO COMPLETE -->

# Expected behavior

<!-- TO COMPLETE -->


================================================
FILE: .github/ISSUE_TEMPLATE/feature.md
================================================
---
name: Feature Request
about: Request for a new feature
title: "[Feature Request] "
labels: ''
assignees: ''

---


================================================
FILE: .github/ISSUE_TEMPLATE/support.md
================================================
---
name: Support
about: Technical support is only available on IRC
title: "[support] DO NOT CREATE A SUPPORT TICKET FROM GITHUB"
labels: ''
assignees: ''

---

Please, don't create tickets on github for support. Instead, you can either:
- visit the community support on libera.chat #filestash. A searchable archive is available at https://support.filestash.app If you don't already have an IRC client, you can try this link: https://kiwiirc.com/nextclient/#irc://irc.libera.chat/#filestash?nick=guest??
- register for enterprise support at https://www.filestash.app/pricing/#support


================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
  - pinned
  - security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
  This issue has been automatically marked as stale because it has not had
  recent activity. It will be closed if no further activity occurs. Thank you
  for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guide

Thanks for taking the time to join our community and start contributing. This guide will help you get started with the Filestash project.

## How to contribute?

### Before you submit a pull request

For anything else than a typo or a bug fix, please raise an issue to discuss your proposal before submitting any code.

### License for contributions

As the copyright owner, you agree to license your contributions under an irrevocable MIT license.


### Building from source

*Prerequisites*: Git, Make, Node, Go, Glib 2.0

```
# Download the source
git clone https://github.com/mickael-kerjean/filestash
cd filestash

# Install dependencies
npm install --legacy-peer-deps # frontend dependencies
make build_init # install the required static libraries
mkdir -p ./dist/data/state/
cp -R config ./dist/data/state/

# Create the build
make build_frontend
make build_backend

# Run the program
./dist/filestash
```

### Tests
Our tests aren't open source. This comes as an attempt to restrict opportunistic forks (see [1](https://news.ycombinator.com/item?id=17006902#17009852) and [2](https://www.reddit.com/r/selfhosted/comments/a54axs/annoucing_jellyfin_a_free_software_fork_of_emby/ebk92iu/?utm_source=share&utm_medium=web2x)) from creating a stable release without serious commitment and splitting the community in pieces while I'm on holidays. Also the project welcome serious and willing maintainers.


================================================
FILE: Jenkinsfile
================================================
pipeline {
    agent any
    options {
        buildDiscarder(logRotator(numToKeepStr: "10", artifactNumToKeepStr: "1"))
    }
    stages {
        stage("Setup") {
            steps {
                git(
                    url: "git@github.com:mickael-kerjean/filestash",
                    branch: "master"
                )
                dir("test") {
                    git(
                        url: "git@github.com:mickael-kerjean/filestash-test.git",
                        credentialsId: "github-com-filestash-test",
                        branch: "main"
                    )
                }
            }
        }
        stage("Build") {
            steps {
                script {
                    docker.image("golang:1.24-bookworm").inside("--user=root") {
                        sh "apt update -y && apt install -y libbrotli-dev brotli"
                        sh "sed -i 's|plg_image_c|plg_image_golang|' server/plugin/index.go"
                        sh "make init"
                        sh "make build"
                    }
                }
            }
        }
        stage("Test") {
            steps {
                script {
                    // smoke test
                    docker.image("golang:1.24-bookworm").inside("--user=root") {
                        sh 'timeout 5 ./dist/filestash > access.log || code=$?; if [ $code -ne 124 ]; then exit $code; fi'
                        sh "cat access.log"
                        sh "cat access.log | grep -q \"\\[http\\] starting\""
                        sh "cat access.log | grep -q \"listening\""
                        sh "cat access.log | grep -vz \"ERR\""
                    }
                    // test frontend
                    docker.image("node:20").inside("--user=root") {
                        sh "cd public && npm install"
                        sh "cd public && npm run lint"
                        sh "cd public && npm run check"
                        // sh "cd public && npm run test"
                    }
                    // test backend
                    docker.image("golang:1.24-bookworm").inside("--user=root") {
                        sh "cp ./test/assets/* /tmp/"
                        sh "go generate ./test/unit_go/..."
                        sh "go get ./..."
                        sh "go test -count=1 \$(go list ./server/... | grep -v \"server/plugin\" | grep -v \"server/generator\")"
                    }
                    // test e2e
                    docker.image("machines/puppeteer:latest").inside("--user=root") {
                        sh "cd ./test/e2e && npm install"
                        sh "chmod +x ./dist/filestash"
                        sh "./dist/filestash > /dev/null &"
                        sh "cd ./test/e2e && node servers/webdav.js > /dev/null &"
                        // sh "cd ./test/e2e && npm test"
                    }
                }
            }
        }

        stage("Release") {
            steps {
                sh "docker buildx build --no-cache --platform linux/amd64,linux/arm64 -t machines/filestash:latest --push ./docker/"
            }
        }
    }
    post {
        always {
            cleanWs()
        }
    }
}

================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.


================================================
FILE: Makefile
================================================
all:
	make init
	make build

init:
	go get ./...
	go generate -x ./server/...

build:
	go build --tags "fts5" -o dist/filestash$(if $(filter windows,$(GOOS)),.exe) cmd/main.go


================================================
FILE: README.md
================================================
![screenshot](https://raw.githubusercontent.com/mickael-kerjean/filestash_images/master/.assets/photo.jpg)

# What is this?

<p>
    It started as a storage agnostic Dropbox-like file manager that works with every storage protocol: <a href="https://www.filestash.app/ftp-client.html">FTP</a>, <a href="https://www.filestash.app/ssh-file-transfer.html">SFTP</a>, <a href="https://www.filestash.app/s3-browser.html">S3</a>, <a href="https://www.filestash.app/smb-client.html">SMB</a>, <a href="https://www.filestash.app/webdav-client.html">WebDAV</a>, IPFS, and <a href="https://www.filestash.app/docs/plugin/#storage">about 20 more</a>.
</p>

<p>
    It grew into what we want to be the world's best file management platform, where everything that's not a fundamental truth of the universe lives in a plugin. Where other platforms are take-it-or-leave-it, ours gives you a rock solid core and a plugin system to handle opinions, so however deep requirements go, the only limit won't be technical but your own creativity.
</p>

<p>
    <a href="http://demo.filestash.app"><img src="https://www.filestash.app/img/illustration/filestash-integrations.png" alt="storage + auth architecture" /></a>
</p>

# Key Features

<ul>
    <li><a href="#vision--philosophy">Plugin Driven Architecture</a>: everything that matters is a plugin, browse the <a href="https://www.filestash.app/docs/plugin/">ecosystem</a> or <a href="https://www.filestash.app/docs/guide/plugin-development.html?origin=github">build your own</a>. With this approach, you get exactly what you need without any kind of overhead or bloat.</li>
    <li>Universal Access: a sleek web client made in vanilla JS that's infinitely customizable via <a href="https://www.filestash.app/docs/guide/plugin-development.html#patch-plugins-in-depth">dynamic patch plugins</a>, plus gateways to access your data via <a href="https://www.filestash.app/docs/guide/sftp-gateway.html?origin=github">SFTP</a>, <a href="https://www.filestash.app/docs/guide/mcp-gateway.html?origin=github">MCP</a> or S3, integrations via <a href="https://www.filestash.app/docs/api/#api">APIs</a> and via web components like this <a href="https://www.filestash.app/tools/psd-viewer.html">psd viewer</a></li>
    <li><a href="https://www.filestash.app/docs/plugin/#storage">Integrations</a>: our explicit goal is to support 100% of storage and authentication technologies on the market. Beyond your usual options, you can go much further, like a <a href="https://www.filestash.app/docs/guide/virtual-filesystem.html?origin=github">virtual filesystem</a> delegating authentication to your <a href="https://github.com/mickael-kerjean/filestash/tree/master/server/plugin/plg_authenticate_wordpress">WordPress site</a> and using its roles to drive <a href="https://www.filestash.app/docs/guide/authorization.html#option-2-rbac">RBAC authorization</a>.</li>
    <li><a href="https://www.filestash.app/docs/guide/workflow-engine.html">Workflow Engine</a>: automate anything that happens to your files by chaining actions on events, from simple notifications via Slack or email to full on MFT pipelines and everything in between.</li>
    <li>File Apps: use any of the existing apps or <a href="https://www.filestash.app/docs/guide/plugin-development.html#xdg-open-plugins-in-depth">build your own</a>, from astronomy to embroidery and everything in between like:
        <ul>
            <li><a href="https://demo.filestash.app/assets/plugin/application_photography.zip">photography</a>: heif, nef, raf, <a href="https://www.filestash.app/tools/tiff-viewer.html">tiff</a>, raw, arw, sr2, srf, nrw, cr2, crw, x3f, pef, rw2, orf, mrw, mdc, mef, mos, dcr, kdc, 3fr, erf and srw</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_photography.zip">astronomy</a>: <a href="https://www.filestash.app/tools/fits-viewer.html">fits</a>, <a href="https://www.filestash.app/tools/xisf-viewer.html">xisf</a></li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_science.zip">science</a>: with latex, plantuml & pandoc compilers</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_musician.zip">music</a>: mid, midi, gp4 and gp5</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_gis.zip">GIS</a>: <a href="https://www.filestash.app/tools/geojson-viewer.html">geojson</a>, <a href="https://www.filestash.app/tools/shp-viewer.html">shp</a>, gpx, wms and <a href="https://www.filestash.app/tools/dbf-viewer.html">dbf</a></li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_engineering.zip">data engineering</a>: <a href="https://www.filestash.app/tools/parquet-viewer.html">parquet</a>, <a href="https://www.filestash.app/tools/arrow-viewer.html">arrow</a>, <a href="https://www.filestash.app/tools/feather-viewer.html">feather</a>, <a href="https://www.filestash.app/tools/avro-viewer.html">avro</a>, <a href="https://www.filestash.app/tools/orc-viewer.html">orc</a>, <a href="https://www.filestash.app/tools/hdf5-viewer.html">hdf5</a>, <a href="https://www.filestash.app/tools/hdf5-viewer.html">h5</a>, <a href="https://www.filestash.app/tools/netcdf-viewer.html">netcdf</a>, <a href="https://www.filestash.app/tools/netcdf-viewer.html">nc</a>, rds, rda and rdata</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_dev.zip">dev</a>: a, so, o, dylib, dll, tar, tgz, zip, har, cap, pcap, pcapng and <a href="https://www.filestash.app/tools/sqlite-viewer.html">sqlite</a></li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_creative.zip">creative work</a>: svg, <a href="https://www.filestash.app/tools/psd-viewer.html">psd</a>, ai, <a href="https://www.filestash.app/tools/sketch-viewer.html">sketch</a>, <a href="https://www.filestash.app/tools/cdr-viewer.html">cdr</a>, woff, woff2, ttf, otf, eot, exr, tga, pgm, ppm, dds, ktx, dpx, pcx, xpm, pnm, xbm, aai, xwd, cin, pbm, pcd, sgi, wbmp and rgb</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_biomed.zip">biomedical</a>: dicom, sam, bam, cif, pdb, xyz, sdf, mol, mol2 and mmtf</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_autodesk.zip">autodesk</a>: <a href="https://www.filestash.app/tools/dwg-viewer.html">dwg</a> and <a href="https://www.filestash.app/tools/dxf-viewer.html">dxf</a></li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_adobe.zip">adobe</a>: <a href="https://www.filestash.app/tools/psd-viewer.html">psd</a>, ai, <a href="https://www.filestash.app/tools/xd-viewer.html">xd</a>, <a href="https://www.filestash.app/tools/dng-viewer.html">dng</a>, <a href="https://www.filestash.app/tools/eps-viewer.html">postscript</a>, aco, ase, swf</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_3d.zip">3d</a>: fbx, gltf, obj, stl, step, mesh, ifc, dae</li>
            <li><a href="https://demo.filestash.app/assets/plugin/application_embroidery.zip">embroidery</a>: dgt, dst, dsb, dsz, edr, exp, 10o, col, hus, inf, jef, ksm, pcm, pcs, pes, sew, shv, sst, tap, u01, vip, vp3 and xxx</li>
            <li><a href="https://github.com/mickael-kerjean/filestash/tree/master/server/plugin/plg_widget_pgp">e2e</a>: pgp, gpg</li>
        </ul>
    </li>
    <li>Themes: <br>
        <img src="https://www.filestash.app/img/screenshots/theme_github.png" height="150" />
        <img src="https://www.filestash.app/img/screenshots/theme_apple.png" height="150" />
        <img src="https://www.filestash.app/img/screenshots/theme_dropbox.png" height="150" />
        <img src="https://www.filestash.app/img/screenshots/theme_ibm.png" height="150" />
    </li>
    <li>AI features for <a href="https://www.filestash.app/docs/guide/search.html">search</a>, <a href="https://www.filestash.app/features/smart-folder.html">smart folders</a> and OCRs.</li>
    <li>... and much <sub>much <sub>more (versioning, audit, public site, antivirus, quota, chat, chromecast support, on demand video transcoding, mounting shared links as network drive, ....)</sub></sub><br> As a rule of thumb, if your problem involves files, we either already <a href="https://www.filestash.app/docs/plugin/">have a plugin</a> for it or can make a plugin for it
</ul>


# Getting Started

To install Filestash, head to the [Getting started](https://www.filestash.app/docs/?origin=github) guide. If you want to leverage plugins, head over to the [inventory](https://www.filestash.app/docs/plugin/?origin=github), or learn about [developing your own plugins](https://www.filestash.app/docs/guide/plugin-development.html?origin=github).

If you want guidance and expert help on your file management problem, [book a call](https://www.filestash.app/tunnel/demo/?origin=github) and let's figure out if Filestash is the right platform for you.


# Vision & Philosophy

Our goal is simple: **to build the best file management platform ever made. Period.** But "best" means different things to different people, and making Filestash modular is the only sane model to accomplish that. Anything that isn't a fundamental truth of the universe and might spark a debate belongs in a plugin. Literally every piece listed in the key features is a plugin you can swap for another implementation or remove entirely.

This modularity is made possible by the magic of programming interfaces. For example, if you want a [Dropbox-like frontend for FTP](https://news.ycombinator.com/item?id=9224), you will find out the [FTP plugin](https://github.com/mickael-kerjean/filestash/tree/master/server/plugin/plg_backend_ftp) simply implements this interface:
```go
type IBackend interface {
	Ls(path string) ([]os.FileInfo, error)           // list files in a folder
	Stat(path string) (os.FileInfo, error)           // file stat
	Cat(path string) (io.ReadCloser, error)          // download a file
	Mkdir(path string) error                         // create a folder
	Rm(path string) error                            // remove something
	Mv(from string, to string) error                 // rename something
	Save(path string, file io.Reader) error          // save a file
	Touch(path string) error                         // create a file

	// I have omitted 2 other methods, a first one to enable connections reuse and
	// another one to declare what should the login form be like.
}
```

There are interfaces you can implement for every key component of Filestash: from storage, to authentication, <a href="https://www.filestash.app/docs/guide/authorization.html">authorisation</a>, custom apps, <a href="https://www.filestash.app/docs/guide/search.html">search</a>, thumbnailing, frontend patches, middleware, endpoint creation and a few others documented in the [plugin development guide](https://www.filestash.app/docs/guide/plugin-development.html).

To see what's currently installed in your instance, head over to [/about](https://demo.filestash.app/about). The inventory of plugins is [documented here](https://www.filestash.app/docs/plugin/)


# Support

- Commercial Users → [support contract](https://www.filestash.app/pricing/?origin=github)
- For individuals:
  - [#filestash](https://kiwiirc.com/nextclient/#irc://irc.libera.chat/#filestash?nick=guest??) on IRC (libera.chat)
  - Bitcoin: `3LX5KGmSmHDj5EuXrmUvcg77EJxCxmdsgW`
  - [Open Collective](https://opencollective.com/filestash)


# Credits

Filestash stands on the shoulder of: [contributors](https://github.com/mickael-kerjean/filestash/graphs/contributors), folks developing [awesome libraries](https://github.com/mickael-kerjean/filestash/blob/master/go.mod), a whole bunch of C stuff (the [C standard library](https://imgs.xkcd.com/comics/dependency.png), [libjpeg](https://libjpeg-turbo.org/), [libpng](https://www.libpng.org/pub/png/libpng.html), [libgif](https://giflib.sourceforge.net/), [libraw](https://www.libraw.org/about) and many more), [fontawesome](https://fontawesome.com), [material](https://material.io/icons/), [Browser stack](https://www.browserstack.com/) to let us test on real devices, and the many guys from Nebraska and elsewhere who have been thanklessly maintaining the critical pieces that Filestash sits on top:

<img src="https://imgs.xkcd.com/comics/dependency.png" alt="credit to the nebraska guy on xkcd" />


================================================
FILE: cmd/main.go
================================================
package main

import (
	"context"
	"os"
	"os/signal"
	"syscall"

	"github.com/mickael-kerjean/filestash"
	"github.com/mickael-kerjean/filestash/server"
	. "github.com/mickael-kerjean/filestash/server/common"
	"github.com/mickael-kerjean/filestash/server/ctrl"
	"github.com/mickael-kerjean/filestash/server/model"
	_ "github.com/mickael-kerjean/filestash/server/pkg"
	"github.com/mickael-kerjean/filestash/server/pkg/workflow"
	_ "github.com/mickael-kerjean/filestash/server/plugin"

	"github.com/gorilla/mux"
)

func main() {
	Run(mux.NewRouter())
}

func Run(router *mux.Router) {
	check(InitLogger(), "Logger init failed. err=%s")
	check(InitConfig(), "Config init failed. err=%s")
	check(workflow.Init(), "Worklow Initialisation failure. err=%s")
	check(model.PluginDiscovery(), "Plugin Discovery failed. err=%s")
	check(ctrl.InitPluginList(embed.EmbedPluginList, model.PLUGINS), "Plugin Initialisation failed. err=%s")
	if Hooks.Get.Starter() == nil {
		check(ErrNotFound, "Missing starter plugin. err=%s")
	}
	for _, fn := range Hooks.Get.Onload() {
		fn()
	}
	for _, obj := range Hooks.Get.HttpEndpoint() {
		obj(router)
	}
	server.Build(router)
	server.PluginRoutes(router)
	if os.Getenv("DEBUG") == "true" {
		server.DebugRoutes(router)
	}
	server.CatchAll(router)
	Hooks.Get.Starter()(withSignal(), router)
	for _, fn := range Hooks.Get.OnQuit() {
		fn()
	}
}

func check(err error, msg string) {
	if err == nil {
		return
	}
	Log.Error(msg, err.Error())
	os.Exit(1)
}

func withSignal() context.Context {
	ctx, cancel := context.WithCancel(context.Background())
	go func() {
		quit := make(chan os.Signal, 1)
		signal.Notify(quit, syscall.SIGTERM, syscall.SIGINT)
		<-quit
		cancel()
	}()
	return ctx
}


================================================
FILE: config/config.json
================================================
{
    "general": {
    },
    "features": {
    },
    "log": {
    },
    "email": {
    },
    "oauth": {
    },
    "connections": [
        {
            "type": "webdav",
            "label": "WebDav"
        },
        {
            "type": "ftp",
            "label": "FTP"
        },
        {
            "type": "sftp",
            "label": "SFTP"
        },
        {
            "type": "git",
            "label": "GIT"
        },
        {
            "type": "s3",
            "label": "S3"
        },
        {
            "type": "dropbox",
            "label": "Dropbox"
        },
        {
            "type": "gdrive",
            "label": "Drive"
        }
    ]
}


================================================
FILE: config/mime.json
================================================
{
	"10o": "image/x-10o",
	"3dm": "model/3dm",
	"3fr": "image/x-hasselblad-3fr",
	"3gp": "video/3gpp",
	"3gpp": "video/3gpp",
	"7z": "application/x-7z-compressed",
	"a": "application/x-archive",
	"aai": "image/x-dune-aai",
	"aco": "application/x-aco",
	"ai": "application/pdf",
	"aif": "audio/x-aiff",
	"aiff": "audio/x-aiff",
	"apk": "application/vnd.android.package-archive",
	"arrow": "application/vnd.apache.arrow.file",
	"arw": "image/x-sony-arw",
	"ase": "application/x-ase",
	"asf": "video/x-ms-asf",
	"asx": "video/x-ms-asf",
	"atom": "application/atom+xml",
	"avi": "video/x-msvideo",
	"avif": "image/avif",
	"avro": "application/vnd.apache.avro",
	"bam": "application/x-bam",
	"bin": "application/octet-stream",
	"bmp": "image/x-ms-bmp",
	"bz2": "application/x-bz2",
	"cab": "application/vnd.ms-cab-compressed",
	"cap": "application/x-pcap",
	"cco": "application/x-cocoa",
	"cdr": "application/vnd.corel-draw",
	"cif": "application/x-cif",
	"cin": "image/x-cin",
	"col": "image/x-col",
	"cr2": "image/x-canon-cr2",
	"crt": "application/x-x509-ca-cert",
	"crw": "image/x-canon-crw",
	"css": "text/css",
	"csv": "text/csv",
	"cur": "image/x-win-bitmap",
	"dae": "model/vnd.collada+xml",
	"db": "application/x-sqlite3",
	"dbf": "application/dbf",
	"dcm": "image/dicom",
	"dcr": "image/x-kodak-dcr",
	"dds": "image/x-dds",
	"deb": "application/octet-stream",
	"der": "application/x-x509-ca-cert",
	"dgt": "image/bmp",
	"dll": "application/x-msdownload",
	"dmg": "application/octet-stream",
	"dng": "image/x-adobe-dng",
	"doc": "application/msword",
	"docx": "application/word",
	"docm": "application/vnd.ms-word.document.macroEnabled.12",
	"dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
	"dotm": "application/vnd.ms-word.template.macroEnabled.12",
	"dpkg": "application/dpkg-www-installer",
	"dpx": "image/dpx",
	"ds_store": "application/octet-stream",
	"dsb": "image/x-dsb",
	"dst": "image/x-dst",
	"dsz": "image/x-dsz",
	"dxf": "application/dxf",
	"dwg": "application/acad",
	"dylib": "application/x-dylib",
	"ear": "application/java-archive",
	"edr": "image/x-edr",
	"emf": "image/emf",
	"emz": "image/x-emz",
	"eot": "application/vnd.ms-fontobject",
	"eps": "application/postscript",
    "epub": "application/epub+zip",
	"erf": "image/x-epson-erf",
	"exe": "application/octet-stream",
	"exp": "image/x-exp",
	"exr": "image/x-exr",
	"fbx": "application/fbx",
	"fea": "application/vnd.apache.feather",
	"feather": "application/vnd.apache.feather",
	"fit": "image/fits",
	"fits": "image/fits",
	"fts": "image/fits",
	"flac": "audio/flac",
	"flv": "video/x-flv",
	"form": "application/x-form",
	"geojson": "application/geo+json",
	"gif": "image/gif",
	"gltf": "model/gltf+json",
	"glb": "model/gltf-binary",
	"gpx": "application/gpx+xml",
	"gp4": "application/x-guitar-pro",
	"gp5": "application/x-guitar-pro",
	"gz": "application/x-gzip",
	"h5": "application/x-hdf",
	"har": "application/har+json",
	"hdf5": "application/x-hdf",
	"heic": "image/heic",
	"heif": "image/heic",
	"hqx": "application/mac-binhex40",
	"htc": "text/x-component",
	"htm": "text/html",
	"html": "text/html",
	"hus": "image/x-hus",
	"ico": "image/x-icon",
	"ics": "text/calendar",
	"ifc": "application/ifc",
	"inf": "image/x-inf",
	"img": "application/octet-stream",
    "ini": "text/x-ini",
	"iso": "application/octet-stream",
	"jad": "text/vnd.sun.j2me.app-descriptor",
	"jar": "application/java-archive",
	"jardiff": "application/x-java-archive-diff",
	"jef": "image/x-jef",
	"jef+": "image/x-jef",
	"jfif": "image/jpeg",
	"jng": "image/x-jng",
	"jnlp": "application/x-java-jnlp-file",
	"jpeg": "image/jpeg",
	"jpg": "image/jpeg",
	"jp2": "image/jp2",
	"js": "application/javascript",
	"json": "application/json",
	"kar": "audio/midi",
	"kdc": "image/x-kodak-kdc",
	"kicad_pcb": "application/vnd.kicad-pcb",
	"kicad_sch": "application/vnd.kicad-sch",
	"kml": "application/vnd.google-earth.kml+xml",
	"kmz": "application/vnd.google-earth.kmz",
	"ksm": "image/x-ksm",
	"ktx": "image/ktx",
	"ktx2": "image/ktx2",
	"m3u8": "application/vnd.apple.mpegurl",
	"m4a": "audio/x-m4a",
	"m4v": "video/x-m4v",
	"mae": "application/x-mae",
	"md": "text/markdown",
	"mdc": "image/x-minolta-mdc",
	"mef": "image/x-mamiya-mef",
	"mesh": "model/mesh",
	"mid": "audio/midi",
	"midi": "application/x-midi",
	"mjs": "application/javascript",
	"mkv": "video/x-matroska",
	"mml": "text/mathml",
	"mmtf": "application/x-mmtf",
	"mng": "video/x-mng",
	"mobi": "application/x-mobipocket-ebook",
	"mol": "application/x-mol",
	"mol2": "application/x-mol2",
	"mos": "image/x-aptus-mos",
	"mov": "video/quicktime",
	"mp3": "audio/mp3",
	"mp4": "video/mp4",
	"mpeg": "video/mpeg",
	"mpg": "video/mpeg",
	"mrw": "image/x-minolta-mrw",
	"msi": "application/octet-stream",
	"msm": "application/octet-stream",
	"msp": "application/octet-stream",
	"mtl": "model/mtl",
	"nc": "application/x-netcdf",
	"nef": "image/x-nikon-nef",
	"nrw": "image/x-nikon-nrw",
	"o": "application/x-object",
	"obj": "application/object",
	"odg": "application/vnd.oasis.opendocument.graphics",
	"odp": "application/vnd.oasis.opendocument.presentation",
	"ods": "application/vnd.oasis.opendocument.spreadsheet",
	"odt": "application/vnd.oasis.opendocument.text",
	"ogg": "audio/ogg",
	"ogv": "application/ogg",
	"orc": "application/vnd.apache.orc",
	"orf": "image/x-olympus-orf",
	"org": "text/org",
	"otf": "font/otf",
	"parquet": "application/vnd.apache.parquet",
	"pbm": "image/x-portable-bitmap",
	"pdb": "chemical/x-pdb",
	"pcap": "application/vnd.tcpdump.pcap",
	"pcapng": "application/x-pcapng",
	"pcd": "image/x-photo-cd",
	"pcm": "image/x-pcm",
	"pcs": "image/x-pcs",
	"pcx": "image/vnd.zbrush.pcx",
	"pdf": "application/pdf",
	"pec": "image/x-pec",
	"pes": "image/x-pes",
	"pef": "image/x-pentax-pef",
	"pem": "application/x-x509-ca-cert",
	"pes": "image/x-pes",
	"pgm": "image/x-portable-greymap",
	"pkg": "application/x-newton-compatible-pkg",
	"pl": "application/x-perl",
	"plantuml": "text/x-plantuml",
	"pm": "application/x-perl",
	"pmv": "image/x-pmv",
	"png": "image/png",
	"pnm": "image/x-portable-anymap",
	"potm": "application/vnd.ms-powerpoint.template.macroEnabled.12",
	"potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
	"ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12",
	"ppm": "image/x-portable-pixmap",
	"pps": "application/vnd.ms-powerpoint",
	"ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
	"ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
	"ppt": "application/vnd.ms-powerpoint",
	"pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
	"pptx": "application/powerpoint",
	"prc": "application/x-pilot",
	"prj": "application/text",
	"properties": "text/x-ini",
	"ps": "application/postscript",
	"psd": "image/vnd.adobe.photoshop",
	"puml": "text/x-plantuml",
	"ra": "audio/x-realaudio",
	"raf": "image/x-fuji-raf",
	"ram": "audio/x-pn-realaudio",
	"rar": "application/x-rar-compressed",
	"raw": "image/x-raw",
	"rda": "application/x-rdata",
	"rdata": "application/x-rdata",
	"rds": "application/x-rds",
	"rgb": "image/x-rgb",
	"rgba": "image/x-rgba",
	"rpm": "application/x-redhat-package-manager",
	"rss": "application/rss+xml",
	"rtf": "application/rtf",
	"rtf2": "text/rtf",
	"run": "application/x-makeself",
	"rw2": "image/x-panasonic-rw2",
	"sam": "application/x-sam",
	"sdf": "application/x-sdf",
	"sea": "application/x-sea",
	"sew": "image/x-sew",
	"sgi": "image/x-sgi",
	"shtml": "text/html",
	"shp": "application/vnd.shp",
	"shv": "image/x-shv",
	"shx": "application/vnd.shx",
	"sit": "application/x-stuffit",
	"sketch": "application/x-sketch",
	"so": "application/x-sharedlib",
	"sql": "application/x-sqlite3",
	"sqlite": "application/x-sqlite3",
	"sqlite3": "application/x-sqlite3",
	"sr2": "image/x-sony-sr2",
	"srf": "image/x-sony-srf",
	"srw": "image/x-samsung-srw",
	"sst": "image/x-sst",
	"stl": "model/stl",
	"step": "model/step",
	"stp": "model/step",
	"svg": "image/svg+xml",
	"svgz": "image/svg+xml",
	"swf": "application/x-shockwave-flash",
	"tap": "image/x-tap",
	"tar": "application/x-tar",
	"tcl": "application/x-tcl",
	"tex": "application/x-tex",
	"tga": "image/x-tga",
	"tgz": "application/x-gzip",
	"tif": "image/tiff",
	"tiff": "image/tiff",
	"tk": "application/x-tcl",
	"ts": "text/plain",
	"tsv": "text/tab-separated-values",
	"ttf": "application/x-font-ttf",
	"txt": "text/plain",
	"u01": "image/x-u01",
	"url": "application/x-url",
	"vcf": "text/vcard",
	"vip": "image/x-vip",
	"vp3": "image/x-vp3",
	"vrml": "application/x-vrml",
	"war": "application/java-archive",
	"wav": "audio/wave",
	"wave": "audio/wave",
	"wasm": "application/wasm",
	"wbmp": "image/vnd.wap.wbmp",
	"webm": "video/webm",
	"webp": "image/webp",
	"wma": "audio/x-ms-wma",
	"wml": "text/vnd.wap.wml",
	"wmlc": "application/vnd.wap.wmlc",
	"wms": "application/vnd.ogc.wms_xml",
	"wmv": "video/x-ms-wmv",
	"woff": "font/woff",
	"woff2": "font/woff2",
	"wrl": "x-world/x-vrml",
	"x3d": "model/x3d+xml",
	"x3dv": "model/x3d-vrml",
	"x3db": "model/x3d+fastinfoset",
	"x3f": "image/x-x3f",
	"xbm": "image/x-xbitmap",
	"xcf": "image/x-xcf",
	"xd": "application/x-adobe-xd",
	"xhtml": "application/xhtml+xml",
	"xisf": "image/x-xisf",
	"xls": "application/vnd.ms-excel",
	"xlsx": "application/excel",
	"xml": "application/xml",
	"xpi": "application/x-xpinstall",
	"xpm": "image/x-xpixmap",
	"xspf": "application/xspf+xml",
	"xwd": "image/x-xwindowdump",
	"xxx": "image/x-xxx",
	"xyz": "application/x-xyz",
	"zip": "application/zip"
}


================================================
FILE: docker/Dockerfile
================================================
# STEP1: CLONE THE CODE
FROM alpine/git as builder_prepare
WORKDIR /home/
ARG GIT_REPO=https://github.com/mickael-kerjean/filestash
ARG GIT_BRANCH=master
RUN git clone --depth 1 --single-branch --branch ${GIT_BRANCH} ${GIT_REPO}

# STEP2: BUILD BACKEND
FROM golang:1.24-trixie AS builder_backend
WORKDIR /home/filestash/
COPY --from=builder_prepare /home/filestash/ .
RUN apt-get update > /dev/null && \
    apt-get install -y curl make > /dev/null 2>&1 && \
    apt-get install -y libjpeg-dev libtiff-dev libpng-dev libwebp-dev libraw-dev libheif-dev libgif-dev libvips-dev > /dev/null 2>&1 && \
    make init && \
    make build && \
    mkdir -p ./dist/data/state/config/ && \
    cp config/config.json ./dist/data/state/config/config.json

# STEP3: BUILD PROD IMAGE
FROM debian:stable-slim
MAINTAINER mickael@kerjean.me
WORKDIR /app/
COPY --from=builder_backend /home/filestash/dist/ .
RUN apt-get update > /dev/null && \
    apt-get install -y --no-install-recommends apt-utils && \
    apt-get install -y curl ffmpeg libjpeg-dev libtiff-dev libpng-dev libwebp-dev libraw-dev libheif-dev libgif-dev && \
    useradd filestash && \
    chown -R filestash:filestash /app/ && \
    find /app/data/ -type d -exec chmod 770 {} \; && \
    find /app/data/ -type f -exec chmod 760 {} \; && \
    chmod 730 /app/filestash && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /tmp/*

USER filestash
CMD ["/app/filestash"]
EXPOSE 8334

================================================
FILE: docker/docker-compose.yml
================================================
version: '2'
services:
  app:
    container_name: filestash
    image: machines/filestash:latest
    restart: always
    environment:
    - APPLICATION_URL=
    - CANARY=true
    - OFFICE_URL=http://wopi_server:9980
    - OFFICE_FILESTASH_URL=http://app:8334
    - OFFICE_REWRITE_URL=http://127.0.0.1:9980
    ports:
    - "8334:8334"
    volumes:
    - filestash:/app/data/state/

  wopi_server:
    container_name: filestash_wopi
    image: collabora/code:24.04.10.2.1
    restart: always
    environment:
    - "extra_params=--o:ssl.enable=false"
    - aliasgroup1="https://.*:443"
    command:
    - /bin/bash
    - -c
    - |
         curl -o /usr/share/coolwsd/browser/dist/branding-desktop.css https://gist.githubusercontent.com/mickael-kerjean/bc1f57cd312cf04731d30185cc4e7ba2/raw/d706dcdf23c21441e5af289d871b33defc2770ea/destop.css
         /bin/su -s /bin/bash -c '/start-collabora-online.sh' cool
    user: root
    ports:
    - "9980:9980"

volumes:
    filestash: {}


================================================
FILE: embed.go
================================================
package embed

import (
	"embed"
	"io/fs"
	"net/http"
	"os"
)

var (
	//go:embed public
	wwwPublic embed.FS
	WWWPublic http.FileSystem = http.FS(os.DirFS("./public/"))
)

//go:embed server/plugin/index.go
var EmbedPluginList []byte

func init() {
	if os.Getenv("DEBUG") != "true" {
		fsPublic, _ := fs.Sub(wwwPublic, "public")
		WWWPublic = http.FS(fsPublic)
	}
}


================================================
FILE: go.mod
================================================
module github.com/mickael-kerjean/filestash

go 1.24.11

require (
	cloud.google.com/go/storage v1.59.0
	github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4
	github.com/aws/aws-sdk-go v1.55.8
	github.com/bluekeyes/go-gitdiff v0.8.1
	github.com/bmatcuk/doublestar/v4 v4.9.2
	github.com/creack/pty v1.1.24
	github.com/cretz/bine v0.2.0
	github.com/duosecurity/duo_universal_golang v1.1.0
	github.com/fclairamb/ftpserverlib v0.30.0
	github.com/go-git/go-git/v6 v6.0.0-20251231065035-29ae690a9f19
	github.com/go-ldap/ldap/v3 v3.4.12
	github.com/go-redis/redis/v8 v8.11.5
	github.com/go-sql-driver/mysql v1.9.3
	github.com/godror/godror v0.50.0
	github.com/golang-jwt/jwt/v5 v5.3.0
	github.com/google/brotli/go/cbrotli v1.1.0
	github.com/google/uuid v1.6.0
	github.com/gorilla/mux v1.8.1
	github.com/gorilla/websocket v1.5.3
	github.com/h2non/bimg v1.1.9
	github.com/hirochachacha/go-smb2 v1.1.0
	github.com/lib/pq v1.10.9
	github.com/mattn/go-sqlite3 v1.14.33
	github.com/mickael-kerjean/net v0.0.0-20191120063050-2457c043ba06
	github.com/mickael-kerjean/saml v0.0.0-20240603162924-4629e91322ce
	github.com/mitchellh/hashstructure v1.1.0
	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
	github.com/oschwald/maxminddb-golang/v2 v2.1.1
	github.com/patrickmn/go-cache v2.1.0+incompatible
	github.com/pkg/sftp v1.13.10
	github.com/pquerna/otp v1.5.0
	github.com/prasad83/goftp v0.0.0-20210325080443-f57aaed46a32
	github.com/qeesung/image2ascii v1.0.1
	github.com/spf13/afero v1.15.0
	github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c
	github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef
	github.com/stretchr/testify v1.11.1
	github.com/suyashkumar/dicom v1.1.0
	github.com/tetratelabs/wazero v1.11.0
	github.com/tidwall/gjson v1.18.0
	github.com/tidwall/sjson v1.2.5
	github.com/vmware/go-nfs-client v0.0.0-20190605212624-d43b92724c1b
	github.com/yeqown/go-qrcode/v2 v2.2.5
	github.com/yeqown/go-qrcode/writer/standard v1.3.0
	golang.org/x/crypto v0.47.0
	golang.org/x/image v0.35.0
	golang.org/x/net v0.49.0
	golang.org/x/oauth2 v0.34.0
	golang.org/x/sync v0.19.0
	golang.org/x/sys v0.40.0
	golang.org/x/time v0.14.0
	google.golang.org/api v0.259.0
	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
	modernc.org/sqlite v1.44.3
	storj.io/uplink v1.13.1
)

require (
	cel.dev/expr v0.25.1 // indirect
	cloud.google.com/go v0.123.0 // indirect
	cloud.google.com/go/auth v0.18.0 // indirect
	cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
	cloud.google.com/go/compute/metadata v0.9.0 // indirect
	cloud.google.com/go/iam v1.5.3 // indirect
	cloud.google.com/go/monitoring v1.24.3 // indirect
	filippo.io/edwards25519 v1.1.0 // indirect
	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 // indirect
	github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
	github.com/Azure/go-ntlmssp v0.1.0 // indirect
	github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect
	github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 // indirect
	github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 // indirect
	github.com/Microsoft/go-winio v0.6.2 // indirect
	github.com/ProtonMail/go-crypto v1.3.0 // indirect
	github.com/VictoriaMetrics/easyproto v1.1.3 // indirect
	github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect
	github.com/beevik/etree v1.6.0 // indirect
	github.com/boombuler/barcode v1.1.0 // indirect
	github.com/calebcase/tmpfile v1.0.3 // indirect
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
	github.com/cloudflare/circl v1.6.2 // indirect
	github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
	github.com/crewjam/httperr v0.2.0 // indirect
	github.com/cyphar/filepath-securejoin v0.6.1 // indirect
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
	github.com/dustin/go-humanize v1.0.1 // indirect
	github.com/emirpasic/gods v1.18.1 // indirect
	github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect
	github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect
	github.com/felixge/httpsnoop v1.0.4 // indirect
	github.com/flynn/noise v1.1.0 // indirect
	github.com/fogleman/gg v1.3.0 // indirect
	github.com/geoffgarside/ber v1.2.0 // indirect
	github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
	github.com/go-git/gcfg/v2 v2.0.2 // indirect
	github.com/go-git/go-billy/v6 v6.0.0-20251217170237-e9738f50a3cd // indirect
	github.com/go-jose/go-jose/v4 v4.1.3 // indirect
	github.com/go-logfmt/logfmt v0.6.1 // indirect
	github.com/go-logr/logr v1.4.3 // indirect
	github.com/go-logr/stdr v1.2.2 // indirect
	github.com/goccy/go-json v0.10.5 // indirect
	github.com/godror/knownpb v0.3.0 // indirect
	github.com/gogo/protobuf v1.3.2 // indirect
	github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
	github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
	github.com/google/s2a-go v0.1.9 // indirect
	github.com/googleapis/enterprise-certificate-proxy v0.3.11 // indirect
	github.com/googleapis/gax-go/v2 v2.16.0 // indirect
	github.com/jmespath/go-jmespath v0.4.0 // indirect
	github.com/jonboulle/clockwork v0.5.0 // indirect
	github.com/jtolio/noiseconn v0.0.0-20231127013910-f6d9ecbf1de7 // indirect
	github.com/kevinburke/ssh_config v1.4.0 // indirect
	github.com/klauspost/compress v1.18.2 // indirect
	github.com/klauspost/cpuid/v2 v2.3.0 // indirect
	github.com/kr/fs v0.1.0 // indirect
	github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
	github.com/lestrrat-go/blackmagic v1.0.4 // indirect
	github.com/lestrrat-go/httpcc v1.0.1 // indirect
	github.com/lestrrat-go/iter v1.0.2 // indirect
	github.com/lestrrat-go/jwx v1.2.31 // indirect
	github.com/lestrrat-go/option v1.0.1 // indirect
	github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect
	github.com/mattn/go-isatty v0.0.20 // indirect
	github.com/ncruces/go-strftime v1.0.0 // indirect
	github.com/pjbgf/sha1cd v0.5.0 // indirect
	github.com/pkg/errors v0.9.1 // indirect
	github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
	github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93 // indirect
	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
	github.com/russellhaering/goxmldsig v1.5.0 // indirect
	github.com/sergi/go-diff v1.4.0 // indirect
	github.com/spacemonkeygo/monkit/v3 v3.0.25-0.20251022131615-eb24eb109368 // indirect
	github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
	github.com/tidwall/match v1.2.0 // indirect
	github.com/tidwall/pretty v1.2.1 // indirect
	github.com/wayneashleyberry/terminal-dimensions v1.1.0 // indirect
	github.com/yeqown/reedsolomon v1.0.0 // indirect
	github.com/zeebo/blake3 v0.2.4 // indirect
	github.com/zeebo/errs v1.4.0 // indirect
	go.opentelemetry.io/auto/sdk v1.2.1 // indirect
	go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 // indirect
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 // indirect
	go.opentelemetry.io/otel v1.39.0 // indirect
	go.opentelemetry.io/otel/metric v1.39.0 // indirect
	go.opentelemetry.io/otel/sdk v1.39.0 // indirect
	go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect
	go.opentelemetry.io/otel/trace v1.39.0 // indirect
	golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect
	golang.org/x/text v0.33.0 // indirect
	google.golang.org/genproto v0.0.0-20260112192933-99fd39fd28a9 // indirect
	google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9 // indirect
	google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9 // indirect
	google.golang.org/grpc v1.78.0 // indirect
	google.golang.org/protobuf v1.36.11 // indirect
	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
	gopkg.in/yaml.v3 v3.0.1 // indirect
	modernc.org/libc v1.67.6 // indirect
	modernc.org/mathutil v1.7.1 // indirect
	modernc.org/memory v1.11.0 // indirect
	storj.io/common v0.0.0-20260109131222-221fe378eda1 // indirect
	storj.io/drpc v0.0.35-0.20250513201419-f7819ea69b55 // indirect
	storj.io/eventkit v0.0.0-20250410172343-61f26d3de156 // indirect
	storj.io/infectious v0.0.2 // indirect
	storj.io/picobuf v0.0.4 // indirect
)


================================================
FILE: go.sum
================================================
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=
cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=
cloud.google.com/go/auth v0.18.0 h1:wnqy5hrv7p3k7cShwAU/Br3nzod7fxoqG+k0VZ+/Pk0=
cloud.google.com/go/auth v0.18.0/go.mod h1:wwkPM1AgE1f2u6dG443MiWoD8C3BtOywNsUMcUTVDRo=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY=
cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw=
cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8=
cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk=
cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE=
cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI=
cloud.google.com/go/storage v1.59.0 h1:9p3yDzEN9Vet4JnbN90FECIw6n4FCXcKBK1scxtQnw8=
cloud.google.com/go/storage v1.59.0/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI=
cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U=
cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew=
github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A=
github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0 h1:xfK3bbi6F2RDtaZFtUdKO3osOBIhNb+xTs8lFW6yx9o=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
github.com/UNO-SOFT/zlog v0.8.1 h1:TEFkGJHtUfTRgMkLZiAjLSHALjwSBdw6/zByMC5GJt4=
github.com/UNO-SOFT/zlog v0.8.1/go.mod h1:yqFOjn3OhvJ4j7ArJqQNA+9V+u6t9zSAyIZdWdMweWc=
github.com/VictoriaMetrics/easyproto v1.1.3 h1:gRSA3ZQs7n4+5I+SniDWD59jde1jVq4JmgQ9HUUyvk4=
github.com/VictoriaMetrics/easyproto v1.1.3/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo3/GThPs2KH23mv710=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
github.com/beevik/etree v1.4.0/go.mod h1:cyWiXwGoasx60gHvtnEh5x8+uIjUVnjWqBvEnhnqKDA=
github.com/beevik/etree v1.6.0 h1:u8Kwy8pp9D9XeITj2Z0XtA5qqZEmtJtuXZRQi+j03eE=
github.com/beevik/etree v1.6.0/go.mod h1:bh4zJxiIr62SOf9pRzN7UUYaEDa9HEKafK25+sLc0Gc=
github.com/bluekeyes/go-gitdiff v0.8.1 h1:lL1GofKMywO17c0lgQmJYcKek5+s8X6tXVNOLxy4smI=
github.com/bluekeyes/go-gitdiff v0.8.1/go.mod h1:WWAk1Mc6EgWarCrPFO+xeYlujPu98VuLW3Tu+B/85AE=
github.com/bmatcuk/doublestar/v4 v4.9.2 h1:b0mc6WyRSYLjzofB2v/0cuDUZ+MqoGyH3r0dVij35GI=
github.com/bmatcuk/doublestar/v4 v4.9.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo=
github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/calebcase/tmpfile v1.0.3 h1:BZrOWZ79gJqQ3XbAQlihYZf/YCV0H4KPIdM5K5oMpJo=
github.com/calebcase/tmpfile v1.0.3/go.mod h1:UAUc01aHeC+pudPagY/lWvt2qS9ZO5Zzof6/tIUzqeI=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cloudflare/circl v1.6.2 h1:hL7VBpHHKzrV5WTfHCaBsgx/HGbBYlgrwvNXEVDYYsQ=
github.com/cloudflare/circl v1.6.2/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4=
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo=
github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4=
github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE=
github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/dsnet/try v0.0.3 h1:ptR59SsrcFUYbT/FhAbKTV6iLkeD6O18qfIWRml2fqI=
github.com/dsnet/try v0.0.3/go.mod h1:WBM8tRpUmnXXhY1U6/S8dt6UWdHTQ7y8A5YSkRCkq40=
github.com/duosecurity/duo_universal_golang v1.1.0 h1:GaCc3vDktv3IEA+KPrHFnKqZjaKhTKjUpaGajL2SUSc=
github.com/duosecurity/duo_universal_golang v1.1.0/go.mod h1:AxndDwaPp4DGZH3Rmq8Q6RkyE95tFF4nK4LXgpBAgFs=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM=
github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs=
github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g=
github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4=
github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA=
github.com/fclairamb/ftpserverlib v0.30.0 h1:caB9sDn1Au//q0j2ev/icPn388qPuk4k1ajSvglDcMQ=
github.com/fclairamb/ftpserverlib v0.30.0/go.mod h1:QmogtltTOgkihyKza0GNo37Mu4AEzbJ+sH6W9Y0MBIQ=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/geoffgarside/ber v1.1.0/go.mod h1:jVPKeCbj6MvQZhwLYsGwaGI52oUorHoHKNecGT85ZCc=
github.com/geoffgarside/ber v1.2.0 h1:/loowoRcs/MWLYmGX9QtIAbA+V/FrnVLsMMPhwiRm64=
github.com/geoffgarside/ber v1.2.0/go.mod h1:jVPKeCbj6MvQZhwLYsGwaGI52oUorHoHKNecGT85ZCc=
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo=
github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs=
github.com/go-git/go-billy/v6 v6.0.0-20251217170237-e9738f50a3cd h1:Gd/f9cGi/3h1JOPaa6er+CkKUGyGX2DBJdFbDKVO+R0=
github.com/go-git/go-billy/v6 v6.0.0-20251217170237-e9738f50a3cd/go.mod h1:d3XQcsHu1idnquxt48kAv+h+1MUiYKLH/e7LAzjP+pI=
github.com/go-git/go-git-fixtures/v5 v5.1.2-0.20251229094738-4b14af179146 h1:xYfxAopYyL44ot6dMBIb1Z1njFM0ZBQ99HdIB99KxLs=
github.com/go-git/go-git-fixtures/v5 v5.1.2-0.20251229094738-4b14af179146/go.mod h1:QE/75B8tBSLNGyUUbA9tw3EGHoFtYOtypa2h8YJxsWI=
github.com/go-git/go-git/v6 v6.0.0-20251231065035-29ae690a9f19 h1:0lz2eJScP8v5YZQsrEw+ggWC5jNySjg4bIZo5BIh6iI=
github.com/go-git/go-git/v6 v6.0.0-20251231065035-29ae690a9f19/go.mod h1:L+Evfcs7EdTqxwv854354cb6+++7TFL3hJn3Wy4g+3w=
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-ldap/ldap/v3 v3.4.12 h1:1b81mv7MagXZ7+1r7cLTWmyuTqVqdwbtJSjC0DAp9s4=
github.com/go-ldap/ldap/v3 v3.4.12/go.mod h1:+SPAGcTtOfmGsCb3h1RFiq4xpp4N636G75OEace8lNo=
github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE=
github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/godror/godror v0.50.0 h1:c0ZnGSDFT12E8HJfQwxtqcmybaIkbqACNk4lIfkkESc=
github.com/godror/godror v0.50.0/go.mod h1:kTMcxZzRw73RT5kn9v3JkBK4kHI6dqowHotqV72ebU8=
github.com/godror/knownpb v0.3.0 h1:+caUdy8hTtl7X05aPl3tdL540TvCcaQA6woZQroLZMw=
github.com/godror/knownpb v0.3.0/go.mod h1:PpTyfJwiOEAzQl7NtVCM8kdPCnp3uhxsZYIzZ5PV4zU=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/brotli/go/cbrotli v1.1.0 h1:YwHD/rwSgUSL4b2S3ZM2jnNymm+tmwKQqjUIC63nmHU=
github.com/google/brotli/go/cbrotli v1.1.0/go.mod h1:nOPhAkwVliJdNTkj3gXpljmWhjc4wCaVqbMJcPKWP4s=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.3.11 h1:vAe81Msw+8tKUxi2Dqh/NZMz7475yUvmRIkXr4oN2ao=
github.com/googleapis/enterprise-certificate-proxy v0.3.11/go.mod h1:RFV7MUdlb7AgEq2v7FmMCfeSMCllAzWxFgRdusoGks8=
github.com/googleapis/gax-go/v2 v2.16.0 h1:iHbQmKLLZrexmb0OSsNGTeSTS0HO4YvFOG8g5E4Zd0Y=
github.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/h2non/bimg v1.1.9 h1:WH20Nxko9l/HFm4kZCA3Phbgu2cbHvYzxwxn9YROEGg=
github.com/h2non/bimg v1.1.9/go.mod h1:R3+UiYwkK4rQl6KVFTOFJHitgLbZXBZNFh2cv3AEbp8=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hirochachacha/go-smb2 v1.1.0 h1:b6hs9qKIql9eVXAiN0M2wSFY5xnhbHAQoCwRKbaRTZI=
github.com/hirochachacha/go-smb2 v1.1.0/go.mod h1:8F1A4d5EZzrGu5R7PU163UcMRDJQl4FtcxjBfsY8TZE=
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=
github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
github.com/jtolio/noiseconn v0.0.0-20231127013910-f6d9ecbf1de7 h1:JcltaO1HXM5S2KYOYcKgAV7slU0xPy1OcvrVgn98sRQ=
github.com/jtolio/noiseconn v0.0.0-20231127013910-f6d9ecbf1de7/go.mod h1:MEkhEPFwP3yudWO0lj6vfYpLIB+3eIcuIW+e0AZzUQk=
github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ=
github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk=
github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A=
github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y=
github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
github.com/lestrrat-go/blackmagic v1.0.4 h1:IwQibdnf8l2KoO+qC3uT4OaTWsW7tuRQXy9TRN9QanA=
github.com/lestrrat-go/blackmagic v1.0.4/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw=
github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8=
github.com/lestrrat-go/jwx v1.2.31 h1:/OM9oNl/fzyldpv5HKZ9m7bTywa7COUfg8gujd9nJ54=
github.com/lestrrat-go/jwx v1.2.31/go.mod h1:eQJKoRwWcLg4PfD5CFA5gIZGxhPgoPYq9pZISdxLf0c=
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0=
github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mickael-kerjean/net v0.0.0-20191120063050-2457c043ba06 h1:427Mpu5edwuFuDBdqOm6EgRohYqZ9Oomd+87ryW2Uls=
github.com/mickael-kerjean/net v0.0.0-20191120063050-2457c043ba06/go.mod h1:K5atEXcXMSGE5O2cPGjggOqCb5lKRaieqgNJHEwS/IE=
github.com/mickael-kerjean/saml v0.0.0-20240603162924-4629e91322ce h1:FVTh1LDCRr6fYm3meiJFIZcsrO29WYDLPIT+BwTiyYQ=
github.com/mickael-kerjean/saml v0.0.0-20240603162924-4629e91322ce/go.mod h1:at9E70cOrnu43GZqrHni63ifAI+3QHzzSQqqUHCiwoQ=
github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0=
github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA=
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc=
github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/oschwald/maxminddb-golang/v2 v2.1.1 h1:lA8FH0oOrM4u7mLvowq8IT6a3Q/qEnqRzLQn9eH5ojc=
github.com/oschwald/maxminddb-golang/v2 v2.1.1/go.mod h1:PLdx6PR+siSIoXqqy7C7r3SB3KZnhxWr1Dp6g0Hacl8=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0=
github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.13.10 h1:+5FbKNTe5Z9aspU88DPIKJ9z2KZoaGCu6Sr6kKR/5mU=
github.com/pkg/sftp v1.13.10/go.mod h1:bJ1a7uDhrX/4OII+agvy28lzRvQrmIQuaHrcI1HbeGA=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs=
github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
github.com/prasad83/goftp v0.0.0-20210325080443-f57aaed46a32 h1:M5NgckSuVabJL6XfuBYclDbFu/PnrryRQyreGkQuims=
github.com/prasad83/goftp v0.0.0-20210325080443-f57aaed46a32/go.mod h1:WkmqX+l/lW8boCoanBDTyrSWqrIvwP7NYm/zVT15Da0=
github.com/qeesung/image2ascii v1.0.1 h1:Fe5zTnX/v/qNC3OC4P/cfASOXS501Xyw2UUcgrLgtp4=
github.com/qeesung/image2ascii v1.0.1/go.mod h1:kZKhyX0h2g/YXa/zdJR3JnLnJ8avHjZ3LrvEKSYyAyU=
github.com/quic-go/quic-go v0.53.0 h1:QHX46sISpG2S03dPeZBgVIZp8dGagIaiu2FiVYvpCZI=
github.com/quic-go/quic-go v0.53.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93 h1:UVArwN/wkKjMVhh2EQGC0tEc1+FqiLlvYXY5mQ2f8Wg=
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93/go.mod h1:Nfe4efndBz4TibWycNE+lqyJZiMX4ycx+QKV8Ta0f/o=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russellhaering/goxmldsig v1.4.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw=
github.com/russellhaering/goxmldsig v1.5.0 h1:AU2UkkYIUOTyZRbe08XMThaOCelArgvNfYapcmSjBNw=
github.com/russellhaering/goxmldsig v1.5.0/go.mod h1:x98CjQNFJcWfMxeOrMnMKg70lvDP6tE0nTaeUnjXDmk=
github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4 h1:PT+ElG/UUFMfqy5HrxJxNzj3QBOf7dZwupeVC+mG1Lo=
github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4/go.mod h1:MnkX001NG75g3p8bhFycnyIjeQoOjGL6CEIsdE/nKSY=
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/spacemonkeygo/monkit/v3 v3.0.25-0.20251022131615-eb24eb109368 h1:GyYC5Ntqk/yy9lEIGE7chdIvt4zP44taycwd9YDSGdc=
github.com/spacemonkeygo/monkit/v3 v3.0.25-0.20251022131615-eb24eb109368/go.mod h1:XkZYGzknZwkD0AKUnZaSXhRiVTLCkq7CWVa3IsE72gA=
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo=
github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs=
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE=
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q=
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ=
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/suyashkumar/dicom v1.1.0 h1:AG+N/aQnD+jzkFuFzz2wO401qXI8KnNcYGQgvTBr9LA=
github.com/suyashkumar/dicom v1.1.0/go.mod h1:8Yw14x/0r4fXVnutbCJpF3HiLVbgMS1DQ2HpfbDjq8Y=
github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA=
github.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU=
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/match v1.2.0 h1:0pt8FlkOwjN2fPt4bIl4BoNxb98gGHN2ObFEDkrfZnM=
github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
github.com/vmware/go-nfs-client v0.0.0-20190605212624-d43b92724c1b h1:RUrsc0B9xF8iC8WXrva+ULeOwN/X+zqe0FdWcDxPt/M=
github.com/vmware/go-nfs-client v0.0.0-20190605212624-d43b92724c1b/go.mod h1:psQdhrCc+fimC/8/U+PboPiIMcdmKgRdAtcMnhXhjzI=
github.com/wayneashleyberry/terminal-dimensions v1.1.0 h1:EB7cIzBdsOzAgmhTUtTTQXBByuPheP/Zv1zL2BRPY6g=
github.com/wayneashleyberry/terminal-dimensions v1.1.0/go.mod h1:2lc/0eWCObmhRczn2SdGSQtgBooLUzIotkkEGXqghyg=
github.com/yeqown/go-qrcode/v2 v2.2.5 h1:HCOe2bSjkhZyYoyyNaXNzh4DJZll6inVJQQw+8228Zk=
github.com/yeqown/go-qrcode/v2 v2.2.5/go.mod h1:uHpt9CM0V1HeXLz+Wg5MN50/sI/fQhfkZlOM+cOTHxw=
github.com/yeqown/go-qrcode/writer/standard v1.3.0 h1:chdyhEfRtUPgQtuPeaWVGQ/TQx4rE1PqeoW3U+53t34=
github.com/yeqown/go-qrcode/writer/standard v1.3.0/go.mod h1:O4MbzsotGCvy8upYPCR91j81dr5XLT7heuljcNXW+oQ=
github.com/yeqown/reedsolomon v1.0.0 h1:x1h/Ej/uJnNu8jaX7GLHBWmZKCAWjEJTetkqaabr4B0=
github.com/yeqown/reedsolomon v1.0.0/go.mod h1:P76zpcn2TCuL0ul1Fso373qHRc69LKwAw/Iy6g1WiiM=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zeebo/assert v1.3.1 h1:vukIABvugfNMZMQO1ABsyQDJDTVQbn+LWSMy1ol1h6A=
github.com/zeebo/assert v1.3.1/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE=
go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 h1:RN3ifU8y4prNWeEnQp2kRRHz8UwonAEYZl8tUzHEXAk=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0/go.mod h1:habDz3tEWiFANTo6oUE99EmaFUrCNYAAg3wiVmusm70=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ=
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w=
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU=
golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU=
golang.org/x/image v0.35.0 h1:LKjiHdgMtO8z7Fh18nGY6KDcoEtVfsgLDPeLyguqb7I=
golang.org/x/image v0.35.0/go.mod h1:MwPLTVgvxSASsxdLzKrl8BRFuyqMyGhLwmC+TO1Sybk=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.259.0 h1:90TaGVIxScrh1Vn/XI2426kRpBqHwWIzVBzJsVZ5XrQ=
google.golang.org/api v0.259.0/go.mod h1:LC2ISWGWbRoyQVpxGntWwLWN/vLNxxKBK9KuJRI8Te4=
google.golang.org/genproto v0.0.0-20260112192933-99fd39fd28a9 h1:wFALHMUiWKkK/x6rSxm79KpSnUyh7ks2E+mel670Dc4=
google.golang.org/genproto v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:wE6SUYr3iNtF/D0GxVAjT+0CbDFktQNssYs9PVptCt4=
google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9 h1:4DKBrmaqeptdEzp21EfrOEh8LE7PJ5ywH6wydSbOfGY=
google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:dd646eSK+Dk9kxVBl1nChEOhJPtMXriCcVb4x3o6J+E=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9 h1:IY6/YYRrFUk0JPp0xOVctvFIVuRnjccihY5kxf5g0TE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=
google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc=
google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis=
modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc=
modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM=
modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA=
modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE=
modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
modernc.org/libc v1.67.6 h1:eVOQvpModVLKOdT+LvBPjdQqfrZq+pC39BygcT+E7OI=
modernc.org/libc v1.67.6/go.mod h1:JAhxUVlolfYDErnwiqaLvUqc8nfb2r6S6slAgZOnaiE=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/sqlite v1.44.3 h1:+39JvV/HWMcYslAwRxHb8067w+2zowvFOUrOWIy9PjY=
modernc.org/sqlite v1.44.3/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
storj.io/common v0.0.0-20260109131222-221fe378eda1 h1:lcjItKLOyqtzAjnQTh+k/x+5la2Ua5QuHy4EM7ZMIHU=
storj.io/common v0.0.0-20260109131222-221fe378eda1/go.mod h1:XNX7uykja6aco92y2y8RuqaXIDRPpt1YA2OQDKlKEUk=
storj.io/drpc v0.0.35-0.20250513201419-f7819ea69b55 h1:8OE12DvUnB9lfZcHe7IDGsuhjrY9GBAr964PVHmhsro=
storj.io/drpc v0.0.35-0.20250513201419-f7819ea69b55/go.mod h1:Y9LZaa8esL1PW2IDMqJE7CFSNq7d5bQ3RI7mGPtmKMg=
storj.io/eventkit v0.0.0-20250410172343-61f26d3de156 h1:5MZ0CyMbG6Pi0rRzUWVG6dvpXjbBYEX2oyXuj+tT+sk=
storj.io/eventkit v0.0.0-20250410172343-61f26d3de156/go.mod h1:CpnM6kfZV58dcq3lpbo/IQ4/KoutarnTSHY0GYVwnYw=
storj.io/infectious v0.0.2 h1:rGIdDC/6gNYAStsxsZU79D/MqFjNyJc1tsyyj9sTl7Q=
storj.io/infectious v0.0.2/go.mod h1:QEjKKww28Sjl1x8iDsjBpOM4r1Yp8RsowNcItsZJ1Vs=
storj.io/picobuf v0.0.4 h1:qswHDla+YZ2TovGtMnU4astjvrADSIz84FXRn0qgP6o=
storj.io/picobuf v0.0.4/go.mod h1:hSMxmZc58MS/2qSLy1I0idovlO7+6K47wIGUyRZa6mg=
storj.io/uplink v1.13.1 h1:C8RdW/upALoCyuF16Lod9XGCXEdbJAS+ABQy9JO/0pA=
storj.io/uplink v1.13.1/go.mod h1:x0MQr4UfFsQBwgVWZAtEsLpuwAn6dg7G0Mpne1r516E=


================================================
FILE: public/Makefile
================================================
compress:
	find . -type f -name '*.html' | xargs brotli -f -k
	find . -type f -name '*.html' | xargs gzip -f -k
	find . -type f -name '*.js' | xargs brotli -f -k
	find . -type f -name '*.js' | xargs gzip -f -k
	find . -type f -name '*.css' | xargs brotli -f -k
	find . -type f -name '*.css' | xargs gzip -f -k
	find . -type f -name '*.svg' | xargs brotli -f -k
	find . -type f -name '*.svg' | xargs gzip -f -k

clean:
	find . -name '*.gz' -exec rm {} \;
	find . -name '*.br' -exec rm {} \;

serve:
	go run server.go


================================================
FILE: public/assets/boot/bundler_complete.js
================================================
document.head.appendChild(Object.assign(document.createElement("script"), {
    type: "importmap",
    textContent: JSON.stringify({
        imports: window.bundler.esModules,
    }, null, 4),
}));


================================================
FILE: public/assets/boot/bundler_init.js
================================================
window.bundler = (function(origin) {
    const esModules = {};
    return {
        register: (path, code) => {
            const fullpath = origin + path;
            if (path.endsWith(".js")) {
                code = code.replace(/from\s?"([^"]+)"/g, (_, spec) =>
                    `from "${new URL(spec, fullpath).href}"`,
                );
                code = code.replace(/\bimport\s+"([^"]+)"/g, (_, spec) =>
                    `import "${new URL(spec, fullpath).href}"`,
                );
                code = code.replace(
                    /\bimport\.meta\.url\b/g,
                    (match, offset, string) => {
                        const before = string[offset - 1];
                        const after = string[offset + match.length];
                        return (before === "\"" || after === "\"") ? match : `"${fullpath}"`;
                    },
                );
                esModules[fullpath] = "data:text/javascript," + encodeURIComponent(
                    code + `\n//# sourceURL=${path}`,
                );
            } else if (path.endsWith(".css")) {
                code = code.replace(/@import url\("([^"]+)"\);/g, (m, rel) => {
                    const $style = document.head.querySelector(
                        `style[id="${new URL(rel, fullpath).href}"]`
                    );
                    if (!$style) throw new DOMException(
                        `Missing CSS dependency: ${rel} (referenced from ${path})`,
                        "NotFoundError",
                    );
                    return `/* ${m} */`;
                });
                document.head.appendChild(Object.assign(document.createElement("style"), {
                    innerHTML: code + `\n/*# sourceURL=${path} */`,
                    id: fullpath,
                }));
            }
        },
        esModules,
    };
})(new URL(import.meta.url).origin);


================================================
FILE: public/assets/boot/common.js
================================================
export function $error(msg) {
    const $code = document.createElement("code");
    $code.style.display = "block";
    $code.style.margin = "20px 0";
    $code.style.fontSize = "1.2rem";
    $code.style.padding = "0 10% 0 10%";
    $code.textContent = msg;

    const $img = document.createElement("img");
    $img.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABQAQMAAADcLOLWAAAABlBMVEUAAABTU1OoaSf/AAAAAXRSTlMAQObYZgAAAFlJREFUeF69zrERgCAQBdElMqQEOtHSuNIohRIMjfjO6DDmB7jZy5YgySQVYDIakIHD1kBPC9Bra5G2Ans0N7iAcOLF+EHvXySpjSBWCDI/3nIdBDihr8m4AcKdbn96jpAHAAAAAElFTkSuQmCC");
    $img.style.display = "block";
    $img.style.padding = "20vh 10% 0 10%";

    document.body.innerHTML = "";
    document.body.appendChild($img);
    document.body.appendChild($code);
}


================================================
FILE: public/assets/boot/ctrl_boot.d.ts
================================================
export {};

interface IChromecast {
    init: () => Promise<any>;
}

declare global {
    interface Window {
        env: string
        LNG: object;
        CONFIG: object;
        overrides: object;
        Chromecast: IChromecast;
    }
}


================================================
FILE: public/assets/boot/ctrl_boot_backoffice.js
================================================
import { report } from "../helpers/log.js";
import { $error } from "./common.js";

export default async function main() {
    try {
        await Promise.all([
            setup_device(),
            setup_blue_death_screen(),
            setup_history(),
        ]);
        window.dispatchEvent(new window.Event("pagechange"));
    } catch (err) {
        console.error(err);
        const msg = window.navigator.onLine === false ? "OFFLINE" : (err instanceof Error && err.message) || "CAN'T LOAD";
        report("boot::" + msg, err, location.href);
        $error(msg);
    }
}
main();

async function setup_device() {
    const className = "ontouchstart" in window ? "touch-yes" : "touch-no";
    document.body.classList.add(className);
}

async function setup_blue_death_screen() {
    window.onerror = function(msg, url, lineNo, colNo, error) {
        report("boot::" + msg, error, url, lineNo, colNo);
        $error(msg);
    };
}

async function setup_history() {
    window.history.replaceState({}, "");
}


================================================
FILE: public/assets/boot/ctrl_boot_frontoffice.js
================================================
import { toHref } from "../lib/skeleton/router.js";
import { loadJS } from "../helpers/loader.js";
import { init as setup_translation } from "../locales/index.js";
import { init as setup_config } from "../model/config.js";
import { init as setup_plugin } from "../model/plugin.js";
import { init as setup_cache } from "../pages/filespage/cache.js";
import { report } from "../helpers/log.js";
import { $error } from "./common.js";

export default async function main() {
    try {
        await Promise.all([
            setup_config().then((config) => Promise.all([
                setup_title(config),
                window.self === window.top ? verify_origin(config) : verify_iframe_origin(config),
            ])),
            setup_translation(),
            setup_xdg_open(),
            setup_device(),
            setup_blue_death_screen(),
            setup_history(),
            setup_polyfill(),
            setup_plugin(),
            setup_cache(),
        ]);
        window.dispatchEvent(new window.Event("pagechange"));
    } catch (err) {
        console.error(err);
        const msg = window.navigator.onLine === false ? "OFFLINE" : (err instanceof Error && err.message) || "CAN'T LOAD";
        report(msg, err, location.href);
        $error(msg);
    }
}
await main();

/// /////////////////////////////////////////
async function setup_xdg_open() {
    window.overrides = {};
    return loadJS(import.meta.url, toHref("/overrides/xdg-open.js"));
}

async function setup_device() {
    const className = "ontouchstart" in window ? "touch-yes" : "touch-no";
    document.body.classList.add(className);
    if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) {
        document.body.classList.add("dark-mode");
    }
    window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", function(e) {
        e.matches ? document.body.classList.add("dark-mode") : document.body.classList.remove("dark-mode");
    });
}

async function setup_blue_death_screen() {
    window.onerror = function(msg, url, lineNo, colNo, error) {
        report(msg, error, url, lineNo, colNo);
        $error(msg);
        if ("serviceWorker" in navigator) navigator.serviceWorker
            .getRegistrations()
            .then((registrations) => {
                for (const registration of registrations) {
                    registration.unregister();
                }
            });
    };
}

async function setup_history() {
    window.history.replaceState({}, "");
}

async function setup_title(config) {
    document.title = config["name"] || "Filestash";
}

async function setup_polyfill() {
    if (!("replaceChildren" in document.body)) {
        await loadJS(import.meta.url, "../lib/polyfill.js");
    }
}

async function verify_origin(config) {
    const origin = config["origin"];
    // happy path
    if (!origin) return;
    else if (location.origin === origin) return;
    // non happy path
    const u = new URL(origin);
    if (u.host === location.host) return;
    else if (u.hostname === location.hostname) return;
    setTimeout(() => {
        location.href = origin + location.pathname + location.search;
    }, 1000);
    throw new Error("Redirecting to " + origin);
}

async function verify_iframe_origin(_) {
    // TODO: const origin = document.location.ancestorOrigins[0]
    // should we verify iframe origin client side on top of frame ancestor? Until prooven wrong, no.
}


================================================
FILE: public/assets/boot/router_backoffice.js
================================================
const routes = {
    "/admin/storage": "/pages/adminpage/ctrl_storage.js",
    "/admin/workflow.*": "/pages/adminpage/ctrl_workflow.js",
    "/admin/activity": "/pages/adminpage/ctrl_activity.js",
    "/admin/settings": "/pages/adminpage/ctrl_settings.js",
    "/admin/about": "/pages/adminpage/ctrl_about.js",
    "/admin/setup": "/pages/adminpage/ctrl_setup.js",
    "/admin/": "/pages/ctrl_adminpage.js",
    "/admin": "/pages/ctrl_adminpage.js",
    "/logout": "/pages/ctrl_logout.js",
    "": "/pages/ctrl_notfound.js",
};

export default routes;


================================================
FILE: public/assets/boot/router_frontoffice.js
================================================
const routes = {
    "/login": "/pages/ctrl_connectpage.js",
    "/logout": "/pages/ctrl_logout.js",

    "/": "/pages/ctrl_homepage.js",
    "/files/.*": "/pages/ctrl_filespage.js",
    "/view/.*": "/pages/ctrl_viewerpage.js",
    // /tags/.* -> "pages/ctrl_tags.js",
    "/s/.*": "/pages/ctrl_sharepage.js",

    "": "/pages/ctrl_notfound.js",
};

export default routes;


================================================
FILE: public/assets/components/breadcrumb.css
================================================
.component_breadcrumb {
    position: relative;
    z-index: 5;
}
.component_breadcrumb .breadcrumb {
    margin: 0 0 0px 0;
    z-index: 1000;
}
.component_breadcrumb .breadcrumb .ul {
    display: flex;
    list-style-type: none;
    margin: 0;
    width: 100%;
    box-sizing: border-box;
    padding: 2px 0;
}
.component_breadcrumb .breadcrumb .ul > span {
    display: block;
    flex-grow: 1;
    padding: 7px 7px 7px 0;
}
.component_breadcrumb .breadcrumb .ul div, .component_breadcrumb .breadcrumb .ul .li {
    display: inline-block;
}
.component_breadcrumb .breadcrumb [alt="sidebar-open"] {
    margin-left: -21px;
    margin-right: 5px;
    cursor: pointer;
    display: none;
}
@media screen and (min-width: 1100px) {
    .component_breadcrumb .breadcrumb [alt="sidebar-open"] { display: block; }
}
.component_breadcrumb .component_logout {
    align-self: center;
    padding-right: 10px;
}
.component_breadcrumb .component_logout .component_icon {
    height: 20px;
}
.component_breadcrumb .component_saving {
    padding-left: 1px;
}
.component_breadcrumb .component_path-element {
    display: inline-block;
}
.component_breadcrumb .component_path-element .label {
    color: rgba(0, 0, 0, 0.75);
    padding: 2px 5px;
}
.component_breadcrumb .component_path-element .label:focus-visible .title {
    display: none;
}
.touch-yes .component_breadcrumb .component_path-element .label {
    padding-top: 5px;
    padding-bottom: 5px;
}
.component_breadcrumb .component_path-element .label span { display: inline-block; }
.component_breadcrumb .component_path-element a.label {
    position: relative;
    color: rgba(0, 0, 0, 0.5);
}
.component_breadcrumb .component_path-element a.label span.title {
    position: absolute;
    left: 0;
    background: var(--color);
    color: var(--bg-color);
    font-size: 0.8em;
    opacity: 0;
    transform: translateY(5px);
    border-radius: 3px;
    white-space: nowrap;
    padding: 3px 10px !important;
    margin: 25px 0px 5px 0px;
}
.component_breadcrumb .component_path-element .component_path-element-wrapper {
    font-size: 18px;
    display: inline-block;
}
.component_breadcrumb .component_path-element .component_path-element-wrapper a {
    border-radius: 3px;
    letter-spacing: -0.5px;
}
.component_breadcrumb .component_path-element.highlight .component_path-element-wrapper a {
    color: var(--bg-color);
    background: var(--dark);
    border-radius: 3px;
}
.component_breadcrumb .component_separator img {
    vertical-align: middle;
}

/* Phone like devices */
body.touch-yes component-breadcrumb .ul span {
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    white-space: nowrap;
}
body.touch-yes component-breadcrumb .ul span::-webkit-scrollbar {
    height: 0px;
}
body.touch-yes component-breadcrumb .ul span::-webkit-scrollbar-track {
    background: var(--super-light);
}
body.touch-yes component-breadcrumb .ul span::-webkit-scrollbar-thumb {
    background: #d2d2d2;
    border-radius: 1px;
}

/* Dark Mode */
.dark-mode .component_breadcrumb .component_separator img {
    filter: brightness(0.5) invert(1);
}

body.touch-no .component_path-element-wrapper a.label:hover {
    background: var(--border);
}
body.touch-no .component_breadcrumb img[alt="sidebar-open"]:hover {
    filter: drop-shadow(0px 0px 4px #e2e2e2);
}
body.touch-no .component_path-element-wrapper a.label:hover span.title {
    opacity: 1;
    transform: translateY(0px);
    transition: all 0.15s ease-out;
}
body.dark-mode.touch-no .component_path-element-wrapper a.label:hover {
    background: rgba(255, 255, 255, 0.05);
}
.dark-mode .component_breadcrumb .component_path-element .label {
    color: #f1f1f1;
    opacity: 0.7;
}
.dark-mode .component_breadcrumb .component_path-element a.label {
    opacity: 1;
}

/* ANIMATION */
.component_breadcrumb .breadcrumb-enter {
    transform: translateX(10px);
    opacity: 0;
    display: inline-block;
}
.component_breadcrumb .breadcrumb-enter.breadcrumb-enter-active {
    opacity: 1;
    transform: translateX(0);
    transition: all 0.2s ease-out;
}
.component_breadcrumb .saving_indicator-leave {
    opacity: 1;
}
.component_breadcrumb .saving_indicator-leave.saving_indicator-leave-active {
    opacity: 0;
    transition: all 0.2s ease-out;
}
.component_breadcrumb .saving_indicator-enter, .component_breadcrumb .saving_indicator-appear {
    transform-origin: center;
    animation-name: bounce;
    animation-duration: 0.5s;
}
@keyframes bounce {
    0% {
        transform: scale(0);
    }
    30% {
        transform: scale(1.5);
    }
    100% {
        transform: scale(1);
    }
}


================================================
FILE: public/assets/components/breadcrumb.js
================================================
import { toHref } from "../lib/skeleton/router.js";
import { animate, slideYOut, slideYIn, opacityOut } from "../lib/animate.js";
import { forwardURLParams } from "../lib/path.js";
import { safe } from "../lib/dom.js";
import assert from "../lib/assert.js";
import { settingsSave } from "../lib/store.js";
import { get as getConfig } from "../model/config.js";
import { loadCSS } from "../helpers/loader.js";

import { extractPath, isDir, isNativeFileUpload } from "../pages/filespage/helper.js";
import { mv as mv$ } from "../pages/filespage/model_files.js";
import { mv as mvVL, withVirtualLayer } from "../pages/filespage/model_virtual_layer.js";

const mv = (from, to) => withVirtualLayer(
    mv$(from, to),
    mvVL(from, to),
);

class ComponentBreadcrumb extends HTMLElement {
    constructor() {
        super();
        if (new URL(location.href).searchParams.get("nav") === "false") {
            this.disabled = true;
            return;
        }
        this.__init();
    }

    async __init() {
        this.innerHTML = `
        <nav class="component_breadcrumb container" aria-label="Breadcrumb">
            <div class="breadcrumb no-select">
                <div class="ul">
                    <img alt="sidebar-open" class="hidden" src="data:image/svg+xml;base64,PHN2ZwogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZpZXdCb3g9IjAgMCAxNiAxNiIKICAgd2lkdGg9IjE2IgogICBoZWlnaHQ9IjE2IgogICBmaWxsPSIjN2Y3ZjdmIj4KICA8cGF0aAogICAgIGQ9Im0gNi45MjY1NTM2LDguMTc3IC0yLjM5NiwyLjM5NiBhIDAuMjUsMC4yNSAwIDAgMSAtMC40MjcsLTAuMTc3IFYgNS42MDQgYSAwLjI1LDAuMjUgMCAwIDEgMC40MjcsLTAuMTc3IGwgMi4zOTYsMi4zOTYgYSAwLjI1LDAuMjUgMCAwIDEgMCwwLjM1NCB6IiAvPgogIDxwYXRoCiAgICAgZD0iTTAgMS43NUMwIC43ODQuNzg0IDAgMS43NSAwaDEyLjVDMTUuMjE2IDAgMTYgLjc4NCAxNiAxLjc1djEyLjVBMS43NSAxLjc1IDAgMCAxIDE0LjI1IDE2SDEuNzVBMS43NSAxLjc1IDAgMCAxIDAgMTQuMjVabTEuNzUtLjI1YS4yNS4yNSAwIDAgMC0uMjUuMjV2MTIuNWMwIC4xMzguMTEyLjI1LjI1LjI1SDkuNXYtMTNabTEyLjUgMTNhLjI1LjI1IDAgMCAwIC4yNS0uMjVWMS43NWEuMjUuMjUgMCAwIDAtLjI1LS4yNUgxMXYxM1oiIC8+Cjwvc3ZnPgo=">
                    <span data-bind="path" role="status"></span>
                    <div class="li component_logout">${this.__htmlLogout()}</div>
                </div>
            </div>
        </nav>`;
        assert.type(this.querySelector("img[alt=\"sidebar-open\"]"), HTMLElement).onclick = () => {
            settingsSave({ visible: true }, "sidebar");
            window.dispatchEvent(new Event("resize"));
        };
    }

    attributeChangedCallback(name, oldValue, newValue) {
        if (this.disabled === true) return;
        else if (oldValue === newValue) return;

        switch (name) {
        case "path":
            if (newValue === "") return;
            return this.renderPath({ path: newValue, previous: oldValue || null });
        case "indicator":
            return this.renderIndicator();
        }
        throw new Error("component::breadcrumb.js unknow attribute name: "+ name);
    }

    static get observedAttributes() {
        return ["path", "indicator"];
    }

    async renderPath({ path = "", previous }) {
        path = this.__normalised(path);
        previous = this.__normalised(previous);
        const pathChunks = path.split("/");

        // STEP1: leaving animation on elements that will be removed
        if (previous !== null && previous.indexOf(path) >= 0) {
            const previousChunks = previous.split("/");
            const nToAnimate = previousChunks.length - pathChunks.length;
            const tasks = [];
            for (let i=0; i<nToAnimate; i++) {
                const n = previousChunks.length - i - 1;
                const $chunk = assert.type(this.querySelector(`.component_path-element.n${n}`), HTMLElement);
                tasks.push(animate($chunk, { time: 100, keyframes: slideYOut(-10) }));
            }
            await Promise.all(tasks);
        }

        // STEP2: setup the actual content
        assert.type(this.querySelector(`[data-bind="path"]`), HTMLElement).innerHTML = pathChunks.map((chunk, idx) => {
            const label = idx === 0 ? getConfig("name", "Filestash") : chunk;
            const link = pathChunks.slice(0, idx + 1).join("/") + "/";
            const limitSize = (word, highlight = false) => {
                if (highlight === true && word.length > 30) {
                    return word.substring(0, 12).trim() + "..." +
                        word.substring(word.length - 10, word.length).trim();
                }
                else if (word.length > 27) return word.substring(0, 20).trim() + "...";
                return word;
            };
            const isLast = idx === pathChunks.length - 1;
            if (isLast) return `
                <div class="component_path-element n${idx}">
                    <div class="li component_path-element-wrapper">
                        <div class="label">
                            <div aria-current="location">${safe(limitSize(label))}</div><span></span>
                        </div>
                    </div>
                </div>`;

            const minify = (() => {
                if (idx === 0) return false;
                else if (pathChunks.length <= (document.body.clientWidth > 800 ? 5 : 4)) return false;
                else if (idx > pathChunks.length - (document.body.clientWidth > 1000 ? 4 : 3)) return false;
                return true;
            })();

            const tmpl = (() => {
                if (minify) return `
                    ...
                    <span class="title">
                        ${safe(limitSize(label, true))}
                    </span>
                `;
                return `<div>${safe(limitSize(label))}</div>`;
            })();
            return `
                <div class="component_path-element n${idx}" data-path="${safe(pathChunks.slice(0, idx+1).join("/")) + "/"}">
                    <div class="li component_path-element-wrapper">
                        <a class="label" aria-label="${safe(label)}" href="${forwardURLParams(toHref("/files" + encodeURIComponent(link).replaceAll("%2F", "/")), ["share", "canary"])}" data-link draggable="false">
                            ${tmpl}
                        </a>
                        <div class="component_separator">
                            <img alt="path_separator" width="16" height="16" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAA30lEQVQ4T63T7Q2CMBAG4OuVPdQNcAPdBCYwDdclCAQ3ACfRDXQDZQMHgNRcAoYApfWjv0jIPX3b3gn4wxJjI03TUAhRBkGwV0o9ffaYIEVRrJumuQHA3ReaILxzl+bCkNZ660ozi/QQIl4BoCKieAmyIlyU53lkjCld0CIyhIwxSmt9nEvkRLgoyzIuPggh4iRJqjHkhXTQAwBWUsqNUoq/38sL+TlJf7lf38ngdU5EFNme2adPFgGGrR2LiGcAqIko/LhjeXbatuVOraWUO58hnJ1iRKx8AetxXPHH/1+y62USursaSgAAAABJRU5ErkJggg==">
                        </div>
                    </div>
                </div>`;
        }).join("");
        this.setupDragDropTarget();

        // STEP3: entering animation for elements that got added in
        if (previous !== null && path.indexOf(previous) >= 0) {
            const previousChunks = previous.split("/");
            const nToAnimate = pathChunks.length - previousChunks.length;
            for (let i=0; i<nToAnimate; i++) {
                const n = pathChunks.length - i - 1;
                const $chunk = assert.type(this.querySelector(`.component_path-element.n${n}`), HTMLElement);
                await animate($chunk, { time: 100, keyframes: slideYIn(-5) });
            }
        }
    }

    async renderIndicator() {
        let state = this.hasAttribute("indicator");
        if (state && this.getAttribute("indicator") !== "false") state = true;

        let $indicator = assert.type(this.querySelector(`[data-bind="path"]`), HTMLElement);
        $indicator = assert.type($indicator.lastChild.querySelector("span"), HTMLElement);

        if (state) {
            $indicator.style.opacity = 1;
            $indicator.innerHTML = `<div class="component_saving">*</div>`;
            await animate($indicator, {
                time: 500,
                keyframes: [
                    { transform: "scale(0)", offset: 0 },
                    { transform: "scale(1.5)", offset: 0.3 },
                    { transform: "scale(1)", offset: 1 },
                ],
                fill: "none"
            });
        } else {
            $indicator.style.opacity = 0;
            await animate($indicator, { time: 200, keyframes: opacityOut(), fill: "none" });
        }
    }

    setupDragDropTarget() {
        this.querySelectorAll("a.label").forEach(($elmnt) => {
            const $folder = assert.type($elmnt, HTMLElement);
            const $path = assert.truthy($folder.closest(".component_path-element"));
            $folder.ondrop = async(e) => {
                $path.classList.remove("highlight");
                const from = e.dataTransfer.getData("path");
                let to = $path.getAttribute("data-path");

                const [, fromName] = extractPath(from);
                to += fromName;
                if (isDir(from)) to += "/";
                await mv(from, to).toPromise();
            };
            $folder.ondragover = (e) => {
                if (isNativeFileUpload(e)) return;
                e.preventDefault();
                $path.classList.add("highlight");
            };
            $folder.ondragleave = () => {
                $path.classList.remove("highlight");
            };
        });
    }

    __htmlLogout() {
        if (window.self !== window.top) return ""; // no logout button from an iframe
        return `
            <a href="${toHref("/logout")}" data-link draggable="false">
                <img class="component_icon" draggable="false" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0ODkuODg4IDQ4OS44ODgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ4OS44ODggNDg5Ljg4ODsiPgogIDxwYXRoIGZpbGw9IiM2ZjZmNmYiIGQ9Ik0yNS4zODMsMjkwLjVjLTcuMi03Ny41LDI1LjktMTQ3LjcsODAuOC0xOTIuM2MyMS40LTE3LjQsNTMuNC0yLjUsNTMuNCwyNWwwLDBjMCwxMC4xLTQuOCwxOS40LTEyLjYsMjUuNyAgICBjLTM4LjksMzEuNy02Mi4zLDgxLjctNTYuNiwxMzYuOWM3LjQsNzEuOSw2NSwxMzAuMSwxMzYuOCwxMzguMWM5My43LDEwLjUsMTczLjMtNjIuOSwxNzMuMy0xNTQuNWMwLTQ4LjYtMjIuNS05Mi4xLTU3LjYtMTIwLjYgICAgYy03LjgtNi4zLTEyLjUtMTUuNi0xMi41LTI1LjZsMCwwYzAtMjcuMiwzMS41LTQyLjYsNTIuNy0yNS42YzUwLjIsNDAuNSw4Mi40LDEwMi40LDgyLjQsMTcxLjhjMCwxMjYuOS0xMDcuOCwyMjkuMi0yMzYuNywyMTkuOSAgICBDMTIyLjE4Myw0ODEuOCwzNS4yODMsMzk2LjksMjUuMzgzLDI5MC41eiBNMjQ0Ljg4MywwYy0xOCwwLTMyLjUsMTQuNi0zMi41LDMyLjV2MTQ5LjdjMCwxOCwxNC42LDMyLjUsMzIuNSwzMi41ICAgIHMzMi41LTE0LjYsMzIuNS0zMi41VjMyLjVDMjc3LjM4MywxNC42LDI2Mi44ODMsMCwyNDQuODgzLDB6IiAvPgo8L3N2Zz4K" alt="power">
            </a>
        `;
    }

    __normalised(path) {
        if (path === null) return null;
        else if (path.endsWith("/") === false) return path;
        return path.replace(new RegExp("/$"), "");
    }
}

export function init() {
    return loadCSS(import.meta.url, "./breadcrumb.css");
}

customElements.define("component-breadcrumb", ComponentBreadcrumb);


================================================
FILE: public/assets/components/decorator_shell_filemanager.css
================================================
.component_filemanager_shell {
    display: flex;
    height: 100%;
    background: white;
}

.component_filemanager_shell component-breadcrumb:hover ~ [data-bind="filemanager-children"],
.component_filemanager_shell [data-bind="sidebar"]:hover ~ div > [data-bind="filemanager-children"] {
    border-color: var(--border);
}

.component_filemanager_shell [data-bind="filemanager-children"] {
    border-top: 2px solid;
    border-left: 2px solid;
    border-color: transparent;
    transition: 0.5s ease border-top-left-radius, 0.5s ease border-top-right-radius, 1s ease border-color;
    border-top-left-radius: 10px;
    border-top-right-radius: 0px;
    display: flex;
    height: 100%;
    overflow: hidden;
}

.component_filemanager_shell [data-bind="sidebar"].hidden ~ div > [data-bind="filemanager-children"] {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
    border-left: none;
    border-color: transparent;
}
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div > [data-bind="filemanager-children"].scrolling {
    border-top-left-radius: 30px;
    border-top-right-radius: 30px;
}
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div > component-breadcrumb > .component_breadcrumb,
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div > component-breadcrumb > .component_breadcrumb,
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div > [data-bind="filemanager-children"] .container,
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div > [data-bind="filemanager-children"] .container {
    width: 98%;
    margin: 0 auto;
    max-width: 815px;
}

.component_filemanager_shell [data-bind="sidebar"].hidden ~ div > [data-bind="filemanager-children"] {
    background: rgba(100,100,100,.05);
}

.component_filemanager_shell [data-bind="sidebar"] ~ div [is="component_filesystem"],
.component_filemanager_shell [data-bind="sidebar"] ~ div [is="component_newitem"],
.component_filemanager_shell [data-bind="sidebar"] ~ div component-menubar,
.component_filemanager_shell [data-bind="sidebar"] ~ div component-breadcrumb,
.component_filemanager_shell [data-bind="sidebar"] ~ div [is="component_submenu"] .component_submenu{
    padding: 0 30px;
}

.component_filemanager_shell [data-bind="sidebar"].hidden ~ div [is="component_filesystem"],
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div [is="component_filesystem"],
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div [is="component_newitem"],
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div [is="component_newitem"],
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div component-menubar,
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div component-menubar,
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div component-breadcrumb,
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div component-breadcrumb,
.component_filemanager_shell [data-bind="sidebar"].hidden ~ div [is="component_submenu"] .component_submenu,
.component_filemanager_shell [data-bind="sidebar"]:empty ~ div [is="component_submenu"] .component_submenu {
    padding: 0px;
}

body.dark-mode .component_filemanager_shell {
    background: #2b2d30;
}


================================================
FILE: public/assets/components/decorator_shell_filemanager.js
================================================
import { createElement, createRender } from "../lib/skeleton/index.js";
import { navigate, fromHref } from "../lib/skeleton/router.js";
import rxjs, { effect } from "../lib/rx.js";
import { onDestroy } from "../lib/skeleton/lifecycle.js";
import { animate, slideYOut } from "../lib/animate.js";
import { qs, safe } from "../lib/dom.js";
import { loadCSS } from "../helpers/loader.js";
import { init as initBreadcrumb } from "../components/breadcrumb.js";
import ctrlSidebar, { init as initSidebar } from "./sidebar.js";
import { isAlreadyFocused } from "../pages/filespage/helper.js";

export default function(ctrl) {
    const urlToPath = (pathname = "") => decodeURIComponent(pathname.split("/").filter((_, i) => i !== 1).join("/"));
    const $page = createElement(`
        <div class="component_filemanager_shell" style="flex-direction:row">
            <aside data-bind="sidebar" class="hidden"></aside>
            <div style="width:100%;display:flex;flex-direction:column;">
                <component-breadcrumb path="${safe(urlToPath(history.state.previous))}"></component-breadcrumb>
                <main id="main" data-bind="filemanager-children"></main>
            </div>
        </div>
    `);

    return async function(render) {
        render($page);

        // feature1: setup the breadcrumb path
        const $breadcrumb = qs($page, "component-breadcrumb");
        $breadcrumb.setAttribute("path", urlToPath(fromHref(location.pathname + location.hash)));

        // feature2: setup the childrens
        const $main = qs($page, `[data-bind="filemanager-children"]`);
        $main.classList.remove("hidden");
        ctrl(createRender($main));
        ctrlSidebar(createRender(qs($page, `[data-bind="sidebar"]`)), {});
        onDestroy(async() => {
            if ((history.state.previous || "").startsWith("/view/") && location.pathname.startsWith("/files/")) {
                await animate($main, { time: 100, keyframes: slideYOut(20), fill: "none" });
                $main.classList.add("hidden");
            }
        });

        // feature3: key shortcut
        const regexStartFiles = new RegExp("^/files/.+");
        effect(rxjs.fromEvent(window, "keydown").pipe(
            rxjs.filter((e) => regexStartFiles.test(fromHref(location.pathname)) &&
                        e.keyCode === 8 && !isAlreadyFocused()), // backspace in file manager
            rxjs.tap(() => {
                const p = location.pathname.replace(new RegExp("/$"), "").split("/");
                p.pop();
                navigate(p.join("/") + "/" + location.hash);
            }),
        ));
    };
}

export function init() {
    return Promise.all([
        loadCSS(import.meta.url, "../components/decorator_shell_filemanager.css"),
        initBreadcrumb(), initSidebar(),
    ]);
}


================================================
FILE: public/assets/components/dropdown.css
================================================


================================================
FILE: public/assets/components/dropdown.js
================================================
import { createFragment } from "../lib/skeleton/index.js";
import { animate, slideYIn } from "../lib/animate.js";
import assert from "../lib/assert.js";
import { loadCSS } from "../helpers/loader.js";

export default class ComponentDropdown extends HTMLElement {
    constructor() {
        super();
        this.render();
    }

    async connectedCallback() {
        await loadCSS(import.meta.url, "./dropdown.css");
    }

    static get observedAttributes() {
        return ["options"];
    }

    render() {
        this.classList.add("component_dropdown", "view", "sort");
        this.appendChild(createFragment(`
  <div class="dropdown_button">
    <img class="component_icon" draggable="false" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzODQgNTEyIj4KICA8cGF0aCBmaWxsPSIjZjJmMmYyIiBkPSJNIDM2MCw0NjAgSCAyNCBDIDEwLjcsNDYwIDAsNDUzLjMgMCw0NDAgdiAtMTIgYyAwLC0xMy4zIDEwLjcsLTIwIDI0LC0yMCBoIDMzNiBjIDEzLjMsMCAyNCw2LjcgMjQsMjAgdiAxMiBjIDAsMTMuMyAtMTAuNywyMCAtMjQsMjAgeiIgLz4KICA8cGF0aCBmaWxsPSIjZjJmMmYyIiBkPSJNIDIyNi41NTM5LDIzNC44ODQyOCBWIDUyLjk0MzI4MyBjIDAsLTYuNjI3IC01LjM3MywtMTIgLTEyLC0xMiBoIC00NCBjIC02LjYyNywwIC0xMiw1LjM3MyAtMTIsMTIgViAyMzQuODg0MjggaCAtNTIuMDU5IGMgLTIxLjM4MiwwIC0zMi4wOSwyNS44NTEgLTE2Ljk3MSw0MC45NzEgbCA4Ni4wNTksODYuMDU5IGMgOS4zNzMsOS4zNzMgMjQuNTY5LDkuMzczIDMzLjk0MSwwIGwgODYuMDU5LC04Ni4wNTkgYyAxNS4xMTksLTE1LjExOSA0LjQxMSwtNDAuOTcxIC0xNi45NzEsLTQwLjk3MSB6IiAvPgo8L3N2Zz4K" alt="download_white">
  </div>`));

        this.appendChild(createFragment(`
  <div class="dropdown_container">
    <ul>
      <li>
        <div>
          <a download="README.org" href="/api/files/cat?path=%2FREADME.org">Save current file</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" href="/api/export/private/text/html/README.org">Export as HTML</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" href="/api/export/private/application/pdf/README.org">Export as PDF</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" href="/api/export/private/text/markdown/README.org">Export as Markdown</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" href="/api/export/private/text/plain/README.org">Export as TXT</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" download="README.tex" href="/api/export/private/text/x-latex/README.org">Export as Latex</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" download="README.ics" href="/api/export/private/text/calendar/README.org">Export as ical</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" download="README.odt" href="/api/export/private/application/vnd.oasis.opendocument.text/README.org">Export as Open office</a>
        </div>
      </li>
      <li>
        <div>
          <a target="_blank" download="README.pdf" href="/api/export/private/application/pdf/README.org?mode=beamer">Export as Beamer</a>
        </div>
      </li>
    </ul>
  </div>
</div>
        `));

        const setActive = () => this.classList.toggle("active");
        assert.type(this.querySelector(".dropdown_button"), HTMLElement).onclick = () => {
            setActive();
            animate(assert.type(this.querySelector(".dropdown_container"), HTMLElement), {
                time: 100,
                keyframes: slideYIn(2),
            });
        };
    }
}

if (!customElements.get("component-dropdown"))
    customElements.define("component-dropdown", ComponentDropdown);


================================================
FILE: public/assets/components/fab.css
================================================
.component_fab {
  position: fixed;
  bottom: 20px;
  right: 20px;
  z-index: 2;
  background: transparent;
}
.component_fab .content:empty {
    display: none;
}
.component_fab .content {
    height: 25px;
    width: 25px;
    padding: 13px;
    border-radius: 50%;
    background: var(--dark);
    box-shadow: rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px, rgba(0, 0, 0, 0.2) 0px 2px 4px -1px;
    z-index: 1000;
    cursor: pointer;
}


================================================
FILE: public/assets/components/fab.js
================================================
import { loadCSS } from "../helpers/loader.js";
import assert from "../lib/assert.js";

export default class ComponentFab extends HTMLButtonElement {
    constructor() {
        super();
        this.innerHTML = `<div class="content"></div>`;
        this.classList.add("component_fab");
    }

    async render($icon) {
        await loadCSS(import.meta.url, "./fab.css");
        assert.type(this.querySelector(".content"), HTMLElement).replaceChildren($icon);
    }
}

customElements.define("component-fab", ComponentFab, { extends: "button" });


================================================
FILE: public/assets/components/form.js
================================================
import { createElement } from "../lib/skeleton/index.js";
import { qs, safe } from "../lib/dom.js";
import { gid } from "../lib/random.js";
import { ApplicationError } from "../lib/error.js";

import "./icon.js";

export function formTmpl(options = {}) {
    const {
        autocomplete = true,
        renderNode = null,
        renderLeaf = null,
        renderInput = $renderInput({ autocomplete }),
    } = options;
    return {
        renderNode: (opts) => {
            if (renderNode) {
                const $el = renderNode({ ...opts, format });
                if ($el) return $el;
            }
            const { label } = opts;
            return createElement(`
                <fieldset>
                    <legend class="no-select">${safe(format(label))}</legend>
                </fieldset>
            `);
        },
        renderLeaf: (opts) => {
            if (renderLeaf) {
                const $el = renderLeaf({ ...opts, format });
                if ($el) return $el;
            }
            const { label } = opts;
            return createElement(`
                <label>
                    ${safe(format(label))}
                </label>
            `);
        },
        renderInput,
        formatLabel: format
    };
};

export function $renderInput(options = {}) {
    const { autocomplete } = options;

    return function(props) {
        const {
            id = null,
            type,
            value = null,
            placeholder = "",
            required = false,
            readonly = false,
            path = [],
            datalist = null,
            options = null,
            pattern = null,
        } = props;

        const attrs = [];
        attrs.push(($node) => $node.setAttribute("name", path.join(".")));
        if (id) attrs.push(($node) => $node.setAttribute("id", id));
        if (placeholder) attrs.push(($node) => $node.setAttribute("placeholder", placeholder));
        if (!autocomplete || props.autocomplete === false) attrs.push(($node) => {
            $node.setAttribute("autocomplete", "off");
            $node.setAttribute("autocorrect", "off");
            $node.setAttribute("autocapitalize", "off");
            $node.setAttribute("spellcheck", "off");
            if (type === "password") {
                $node.setAttribute("data-lpignore", "true"); // LastPass
                $node.setAttribute("data-1p-ignore", "true"); // 1Password
                $node.setAttribute("data-bwignore", "true"); // Bitwarden
                $node.setAttribute("data-protonpass-ignore", "true"); // Proton Pass
            }
        });
        if (pattern) attrs.push(($node) => $node.setAttribute((type !== "file" ? "pattern" : "accept"), pattern));
        if (required) attrs.push(($node) => $node.setAttribute("required", ""));
        if (readonly) attrs.push(($node) => $node.setAttribute("disabled", ""));

        switch (type) {
        case "text": {
            const $input = createElement(`
                <input
                    type="text"
                    class="component_input"
                />
            `);
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            attrs.map((setAttribute) => setAttribute($input));

            if (!datalist) return $input;

            const dataListId = gid("list_");
            $input.setAttribute("list", dataListId);
            $input.setAttribute("datalist", datalist.join(","));

            const $wrapper = document.createElement("span");
            const $datalist = document.createElement("datalist");
            $datalist.setAttribute("id", dataListId);
            $wrapper.appendChild($input);
            $wrapper.appendChild($datalist);
            (props.multi ? multicomplete(value, datalist) : (datalist || [])).forEach((value) => {
                $datalist.appendChild(new Option(value));
            });
            if (!props.multi) return $wrapper;
            // @ts-ignore
            $input.refresh = () => {
                const _datalist = $input?.getAttribute("datalist")?.split(",");
                $datalist.innerHTML = "";
                multicomplete($input.value, _datalist).forEach((value) => {
                    $datalist.appendChild(new Option(value));
                });
            };
            $input.oninput = () => {
                for (const $option of $datalist.children) {
                    $option.remove();
                }
                // @ts-ignore
                $input.refresh();
            };
            return $wrapper;
        }
        case "enable": {
            const $div = createElement(`
                <div class="component_checkbox">
                    <input
                        type="checkbox"
                        ${(value === null ? props.default : value) ? "checked" : ""}
                    />
                    <span className="indicator"></span>
                </div>
            `);
            const $input = $div.querySelector("input");
            attrs.map((setAttribute) => setAttribute($input));
            return $div;
        }
        case "number": {
            const $input = createElement(`
                <input
                    type="number"
                    class="component_input"
                />
            `);
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            attrs.map((setAttribute) => setAttribute($input));
            return $input;
        }
        case "password": {
            const $div = createElement(`
                <div class="formbuilder_password">
                    <input
                        type="password"
                        class="component_input"
                    />
                    <component-icon name="eye"></component-icon>
                </div>
            `);
            const $input = $div.querySelector("input");
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            attrs.map((setAttribute) => setAttribute($input));

            const $icon = $div.querySelector("component-icon");
            if ($icon instanceof HTMLElement) {
                $icon.onclick = function(e) {
                    if (!(e.target instanceof HTMLElement)) return;
                    const $input = e.target?.parentElement?.previousElementSibling;
                    if (!$input) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
                    if ($input.getAttribute("type") === "password") $input.setAttribute("type", "text");
                    else $input.setAttribute("type", "password");
                };
            }
            return $div;
        }
        case "long_text": {
            const $textarea = createElement(`
                <textarea
                    class="component_textarea"
                    rows="8"
                ></textarea>
            `);
            if (!($textarea instanceof HTMLTextAreaElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $textarea.value = value;
            attrs.map((setAttribute) => setAttribute($textarea));
            return $textarea;
        }
        case "bcrypt": {
            const $input = createElement(`
                <input
                    type="password"
                    class="component_input"
                    readonly
                />
            `);
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            attrs.map((setAttribute) => setAttribute($input));
            return $input;
        }
        case "hidden": {
            const $input = createElement(`
                <input type="hidden" />
            `);
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            $input.setAttribute("name", path.join("."));
            return $input;
        }
        case "boolean": {
            const $div = createElement(`
                <div class="component_checkbox">
                    <input
                        type="checkbox"
                        ${(value === null ? props.default : value) ? "checked" : ""}
                    />
                    <span class="indicator"></span>
                </div>
            `);
            const $input = $div.querySelector("input");
            attrs.map((setAttribute) => setAttribute($input));
            return $div;
        }
        case "select": {
            const $select = createElement(`
                <select class="component_select"></select>
            `);
            if (!($select instanceof HTMLSelectElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $select.value = value || props.default;
            attrs.map((setAttribute) => setAttribute($select));
            (options || []).forEach((name) => {
                const $option = createElement(`
                    <option></option>
                `);
                $option.textContent = name;
                $option.setAttribute("name", name);
                if (name === (value || props.default)) {
                    $option.setAttribute("selected", "");
                }
                $select.appendChild($option);
            });
            return $select;
        }
        case "date": {
            const $input = createElement(`
                <input
                    type="date"
                    class="component_input"
                />
            `);
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            attrs.map((setAttribute) => setAttribute($input));
            return $input;
        }
        case "datetime": {
            const $input = createElement(`
                <input
                    type="datetime-local"
                    class="component_input"
                />
            `);
            if (!($input instanceof HTMLInputElement)) throw new ApplicationError("INTERNAL_ERROR", "assumption failed: missing input");
            else if (value) $input.value = value;
            attrs.map((setAttribute) => setAttribute($input));
            return $input;
        }
        case "image": {
            const $img = createElement("<img />");
            $img.setAttribute("id", id);
            $img.setAttribute("src", value);
            return $img;
        }
        case "file": {
            const $file = createElement(`
                <div className="fileupload-image">
                    <input
                        type="file"
                        class="component_input"
                    />
                    <div class="preview" style="margin-top:-15px;"></div>
                </div>
            `);
            const $preview = qs($file, ".preview");
            const draw = (val) => {
                $preview.innerHTML = "";
                if ((val || "").substring(0, 10) === "data:image") $preview.appendChild(createElement(`
                    <img class="full-width" src="${safe(val)}" />
                `));
                else if ((val || "").substring(0, 20) === "data:application/pdf") $preview.appendChild(createElement(`
                    <object class="full-width" type="application/pdf" data="${safe(val)}" style="height:250px;" />
                `));
            };
            const $input = qs($file, "input");
            $input.onchange = (e) => {
                if (e.target.files.length === 0) {
                    draw(null);
                    return;
                }
                const reader = new window.FileReader();
                reader.readAsDataURL(e.target.files[0]);
                reader.onload = () => draw(reader.result);
            };
            $file.oncancel = () => {
                if (!value) return;
                $input.dispatchEvent(new Event("input"));
                draw(null);
            };
            attrs.map((setAttribute) => setAttribute($input));
            draw(value);
            return $file;
        }
        default: {
            const $input = createElement(`
                <input
                    type="text"
                    class="component_input"
                    readonly
                />
            `);
            $input.setAttribute("value", `unknown element type ${type}`);
            $input.setAttribute("name", path.join("."));
            return $input;
        } }
    };
}

export function format(name) {
    if (typeof name !== "string") {
        return "N/A";
    }
    return name
        .split("_")
        .map((word) => {
            if (word.length < 1) {
                return word;
            }
            return (word[0] || "").toUpperCase() + word.substring(1);
        })
        .join(" ");
};

export function multicomplete(input, datalist) {
    input = (input || "").trim().replace(/,$/g, "");
    const current = input.split(",").map((val) => val.trim()).filter((t) => !!t);
    const diff = datalist.filter((x) => current.indexOf(x) === -1);
    return diff.map((candidate) => input.length === 0 ? candidate : `${input}, ${candidate}`);
}


================================================
FILE: public/assets/components/icon.js
================================================
class Icon extends HTMLElement {
    static get observedAttributes() {
        return ["name"];
    }

    attributeChangedCallback() {
        const alt = this.getAttribute("name");
        const img = this._mapOfIcon(alt);
        window.requestAnimationFrame(() => {
            this.innerHTML = this.render({ alt, img });
        });
    }

    render({ alt, img }) {
        return `<img
                    class="component_icon"
                    draggable="false"
                    src="${img}"
                    alt="${alt}" />`;
    }

    _mapOfIcon(name) {
        switch (name) {
        case "arrow_right":
            return "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41MzMzMzMzNiIgZD0iTTguNTkgMTYuMzRsNC41OC00LjU5LTQuNTgtNC41OUwxMCA1Ljc1bDYgNi02IDZ6IiAvPgogIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wLS4yNWgyNHYyNEgweiIgLz4KPC9zdmc+Cg==";
        case "arrow_left":
            return "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzZmNmY2ZjtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MS41MTE4MTEwMjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgZD0ibSAxNiw3LjE2IC00LjU4LDQuNTkgNC41OCw0LjU5IC0xLjQxLDEuNDEgLTYsLTYgNiwtNiB6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAtLjI1aDI0djI0SDB6Ii8+Cjwvc3ZnPgo=";
        case "eye":
            return "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDggNDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzkxOTE5MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjRweDt9PC9zdHlsZT4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTEsMjRhMjYuODUsMjYuODUsMCwwLDEsNDYsMCIvPgogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMSwyNGEyNi44NSwyNi44NSwwLDAsMCw0NiwwIi8+CiAgICA8ZWxsaXBzZSBjbGFzcz0iY2xzLTEiIGN4PSIyNCIgY3k9IjI0IiByeD0iNyIgcnk9IjciLz4KPC9zdmc+Cg==";
        case "close":
            return "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MS45NzYgNTEuOTc2Ij4KICA8cGF0aCBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjUzMzMzMjg1O3N0cm9rZS13aWR0aDoxLjQ1NjgxMTE5IiBkPSJtIDQxLjAwNTMxLDQwLjg0NDA2MiBjIC0xLjEzNzc2OCwxLjEzNzc2NSAtMi45ODIwODgsMS4xMzc3NjUgLTQuMTE5ODYxLDAgTCAyNi4wNjg2MjgsMzAuMDI3MjM0IDE0LjczNzU1MSw0MS4zNTgzMSBjIC0xLjEzNzc3MSwxLjEzNzc3MSAtMi45ODIwOTMsMS4xMzc3NzEgLTQuMTE5ODYxLDAgLTEuMTM3NzcyMiwtMS4xMzc3NjggLTEuMTM3NzcyMiwtMi45ODIwODggMCwtNC4xMTk4NjEgTCAyMS45NDg3NjYsMjUuOTA3MzcyIDExLjEzMTkzOCwxNS4wOTA1NTEgYyAtMS4xMzc3NjQ3LC0xLjEzNzc3MSAtMS4xMzc3NjQ3LC0yLjk4MzU1MyAwLC00LjExOTg2MSAxLjEzNzc3NCwtMS4xMzc3NzIxIDIuOTgyMDk4LC0xLjEzNzc3MjEgNC4xMTk4NjUsMCBMIDI2LjA2ODYyOCwyMS43ODc1MTIgMzYuMzY5NzM5LDExLjQ4NjM5OSBjIDEuMTM3NzY4LC0xLjEzNzc2OCAyLjk4MjA5MywtMS4xMzc3NjggNC4xMTk4NjIsMCAxLjEzNzc2NywxLjEzNzc2OSAxLjEzNzc2NywyLjk4MjA5NCAwLDQuMTE5ODYyIEwgMzAuMTg4NDg5LDI1LjkwNzM3MiA0MS4wMDUzMSwzNi43MjQxOTcgYyAxLjEzNzc3MSwxLjEzNzc2NyAxLjEzNzc3MSwyLjk4MjA5MSAwLDQuMTE5ODY1IHoiIC8+Cjwvc3ZnPgo=";
        case "loading":
            return "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0nMTIwcHgnIGhlaWdodD0nMTIwcHgnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiBjbGFzcz0idWlsLXJpbmctYWx0Ij4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0ibm9uZSIgY2xhc3M9ImJrIj48L3JlY3Q+CiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIHN0cm9rZT0ibm9uZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj48L2NpcmNsZT4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MCIgc3Ryb2tlPSIjNmY2ZjZmIiBmaWxsPSJub25lIiBzdHJva2Utd2lkdGg9IjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CiAgICA8YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJzdHJva2UtZGFzaG9mZnNldCIgZHVyPSIycyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGZyb209IjAiIHRvPSI1MDIiPjwvYW5pbWF0ZT4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9InN0cm9rZS1kYXNoYXJyYXkiIGR1cj0iMnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IjE1MC42IDEwMC40OzEgMjUwOzE1MC42IDEwMC40Ij48L2FuaW1hdGU+CiAgPC9jaXJjbGU+Cjwvc3ZnPgo=";
        }
        return "";
    }
}

customElements.define("component-icon", Icon);


================================================
FILE: public/assets/components/loader.js
================================================
import { createElement } from "../lib/skeleton/index.js";
import rxjs from "../lib/rx.js";
import { animate, opacityIn } from "../lib/animate.js";

class Loader extends HTMLElement {
    constructor() {
        super();
        this.timeout = setTimeout(() => {
            this.innerHTML = this.render({
                inline: this.hasAttribute("inlined"),
            });
        }, parseInt(this.getAttribute("delay") || "0"));
    }

    disconnectedCallback() {
        clearTimeout(this.timeout);
    }

    render({ inline }) {
        const fixedCss = `
        position: fixed;
        left: 0;
        right: 0;
        top: calc(50% - 200px);`;
        return `
<div class="component_loader">
    <svg width="120px" height="120px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
        <rect x="0" y="0" width="100" height="100" fill="none"></rect>
        <circle cx="50" cy="50" r="40" stroke="rgba(100%,100%,100%,0.679)" fill="none" stroke-width="10" stroke-linecap="round"></circle>
        <circle cx="50" cy="50" r="40" stroke="#6f6f6f" fill="none" stroke-width="6" stroke-linecap="round">
            <animate attributeName="stroke-dashoffset" dur="2s" repeatCount="indefinite" from="0" to="502"></animate>
            <animate attributeName="stroke-dasharray" dur="2s" repeatCount="indefinite" values="150.6 100.4;1 250;150.6 100.4"></animate>
        </circle>
    </svg>
    <style>
    .component_loader{
        text-align: center;
        margin: 100px auto 0 auto;
        ${inline ? "" : fixedCss}
    }
    </style>
</div>`;
    }
}

customElements.define("component-loader", Loader);
export function createLoader($parent, opts = {}) {
    const {
        wait = 250,
        append = ($loader) => $parent.appendChild($loader),
    } = opts;
    const $icon = createElement(`
            <div class="component_loader">
                <style>
                    .component_loader {
                        display: block;
                        text-align: center;
                        margin-top: 100px;
                    }
                </style>
                <component-icon name="loading"></component-icon>
            </div>
    `);
    const alreadyHasLoader = () => !!$parent.querySelector(".component_loader");
    const id = setTimeout(() => {
        if (alreadyHasLoader()) return;
        append($icon);
        animate($icon, { time: 750, keyframes: opacityIn() });
    }, wait);
    const cancel = () => {
        clearTimeout(id);
        $icon.remove();
    };

    return rxjs.pipe(
        rxjs.tap(() => cancel()),
        rxjs.finalize(() => cancel())
    );
}

// > after this should be deprecated
export default createElement("<component-loader></component-loader>");
export function toggle($node, show = false) {
    if (show === true) return rxjs.tap(() => $node.appendChild(createElement("<component-loader></component-loader>")));
    else return rxjs.tap(() => $node.querySelector("component-loader")?.remove());
}


================================================
FILE: public/assets/components/modal.css
================================================
.component_modal{
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: #f2f3f5f0;
    z-index: 1000;
    display: flex;
}
.component_modal > div{
    box-shadow: 1px 2px 20px rgba(0, 0, 0, 0.1);
    background: white;
    width: 80%;
    max-width: 320px;
    padding: 20px 20px 0 20px;
    border-radius: 2px;
    margin: auto;
}

.dark-mode .component_modal{
    background: var(--bg-color);
    color: rgba(0,0,0,0.7);
}

.component_popup .popup--content {
  font-size: 1.1em;
  margin: 0;
}
.component_popup .popup--content p {
    margin: 0;
}
.component_popup .popup--content .modal-error-message {
    font-size: 15px;
}
.component_popup .buttons {
  margin: 15px -20px 0 -20px;
  display: flex;
}
.component_popup .buttons > div {
    display: flex;
    width: 100%;
}
.component_popup .buttons [type="submit"] {
    border-radius: 10px 0 0;
}
.component_popup .buttons > button {
    width: 50%;
    margin-left: auto;
}
.component_popup .buttons button {
    text-transform: uppercase;
}
.component_popup .modal-error-message {
    color: var(--error);
}
.component_popup .center {
    text-align: center;
}


================================================
FILE: public/assets/components/modal.js
================================================
import { createElement } from "../lib/skeleton/index.js";
import assert from "../lib/assert.js";
import rxjs, { applyMutation } from "../lib/rx.js";
import { animate } from "../lib/animate.js";
import { qs, qsa } from "../lib/dom.js";
import { loadCSS } from "../helpers/loader.js";

export function createModal(opts) {
    const $dom = assert.type(qs(document.body, "component-modal"), HTMLElement);
    assert.type($dom, ModalComponent);

    return ($node, fn) => $dom.trigger($node, { onQuit: fn, ...opts });
}

export const MODAL_LEFT_BUTTON = 1;
export const MODAL_RIGHT_BUTTON = 2;
export const MODAL_QUIT = 0;

const $modal = createElement(`
    <div class="component_modal" id="modal-box" role="dialog" aria-modal="true">
        <div>
            <div class="component_popup">
                <div class="popup--content">
                    <div class="modal-message" data-bind="body"><!-- MODAL BODY --></div>
                </div>
                <div class="buttons">
                    <button type="button" disabled></button>
                    <button type="submit" class="emphasis" disabled></button>
                </div>
            </div>
        </div>
    </div>
`);
const $app = qs(document.body, "#app");

class ModalComponent extends HTMLElement {
    async connectedCallback() {
        await loadCSS(import.meta.url, "./modal.css");
    }

    trigger($node, { withButtonsLeft = null, withButtonsRight = null, onQuit = (_a, _b) => Promise.resolve() }) {
        const close$ = new rxjs.Subject();

        // feature: build the dom
        qs($modal, `[data-bind="body"]`).replaceChildren($node);
        $app.setAttribute("inert", "true");
        this.replaceChildren($modal);
        qsa($modal, ".component_popup > div.buttons > button").forEach(($button, i) => {
            assert.truthy(i >= 0 && i <= 2);
            let currentLabel = null;
            let buttonIndex = null;
            if (i === 0) {
                currentLabel = withButtonsLeft;
                buttonIndex = MODAL_LEFT_BUTTON;
            } else if (i === 1) {
                currentLabel = withButtonsRight;
                buttonIndex = MODAL_RIGHT_BUTTON;
            }

            if (currentLabel !== null) {
                $button.classList.remove("hidden");
                $button.removeAttribute("disabled");
                $button.textContent = currentLabel;
                $button.onclick = () => close$.next(buttonIndex);
            } else {
                $button.classList.add("hidden");
                $button.setAttribute("disabled", "true");
            }
        });
        effect(rxjs.fromEvent($modal, "mousedown").pipe(
            rxjs.filter((e) => e.target.getAttribute("id") === "modal-box"),
            rxjs.tap(() => close$.next(MODAL_QUIT)),
        ));
        effect(rxjs.fromEvent(window, "keydown").pipe(
            rxjs.filter((e) => e.keyCode === 27),
            rxjs.tap(() => close$.next(MODAL_QUIT)),
        ));

        // feature: closing the modal
        const $body = () => qs($modal, "div > div");
        effect(close$.pipe(
            rxjs.tap(() => $app.removeAttribute("inert")),
            rxjs.mergeMap((data) => onQuit(data, $node) || Promise.resolve()),
            rxjs.tap(() => animate($body(), {
                time: 200,
                keyframes: [
                    { opacity: 1, transform: "translateY(0)" },
                    { opacity: 0, transform: "translateY(20px)" },
                ],
            })),
            rxjs.delay(100),
            rxjs.tap(() => animate($modal, {
                time: 200,
                keyframes: [{ opacity: 1 }, { opacity: 0 }],
            })),
            rxjs.mapTo([]), applyMutation($modal, "remove"),
            rxjs.tap(free),
        ));

        // feature: animate opening
        effect(rxjs.of(null).pipe(
            rxjs.tap(() => animate($modal, {
                onEnter: () => $body().style.setProperty("opacity", "0"),
                onExit: () => $body().style.setProperty("opacity", "1"),
                time: 250,
                keyframes: [
                    { opacity: 0 },
                    { opacity: 1 },
                ],
            })),
            rxjs.delay(50),
            rxjs.tap(() => animate($body(), {
                time: 200,
                keyframes: [
                    { opacity: 0, transform: "translateY(10px)" },
                    { opacity: 1, transform: "translateY(0)" },
                ],
            })),
        ));

        return (id) => close$.next(id);
    }
}
customElements.define("component-modal", ModalComponent);

let _observables = [];
const effect = (obs) => _observables.push(obs.subscribe());
const free = () => {
    for (let i = 0; i < _observables.length; i++) {
        _o
Download .txt
gitextract_gaclg1k0/

├── .assets/
│   └── raw/
│       ├── Makefile
│       └── photo.xcf
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.md
│   │   ├── feature.md
│   │   └── support.md
│   └── stale.yml
├── CONTRIBUTING.md
├── Jenkinsfile
├── LICENSE
├── Makefile
├── README.md
├── cmd/
│   └── main.go
├── config/
│   ├── config.json
│   └── mime.json
├── docker/
│   ├── Dockerfile
│   └── docker-compose.yml
├── embed.go
├── go.mod
├── go.sum
├── public/
│   ├── Makefile
│   ├── assets/
│   │   ├── boot/
│   │   │   ├── bundler_complete.js
│   │   │   ├── bundler_init.js
│   │   │   ├── common.js
│   │   │   ├── ctrl_boot.d.ts
│   │   │   ├── ctrl_boot_backoffice.js
│   │   │   ├── ctrl_boot_frontoffice.js
│   │   │   ├── router_backoffice.js
│   │   │   └── router_frontoffice.js
│   │   ├── components/
│   │   │   ├── breadcrumb.css
│   │   │   ├── breadcrumb.js
│   │   │   ├── decorator_shell_filemanager.css
│   │   │   ├── decorator_shell_filemanager.js
│   │   │   ├── dropdown.css
│   │   │   ├── dropdown.js
│   │   │   ├── fab.css
│   │   │   ├── fab.js
│   │   │   ├── form.js
│   │   │   ├── icon.js
│   │   │   ├── loader.js
│   │   │   ├── modal.css
│   │   │   ├── modal.js
│   │   │   ├── notification.css
│   │   │   ├── notification.js
│   │   │   ├── sidebar.css
│   │   │   ├── sidebar.js
│   │   │   ├── sidebar_files.js
│   │   │   ├── sidebar_tags.js
│   │   │   └── skeleton.js
│   │   ├── css/
│   │   │   ├── designsystem.css
│   │   │   ├── designsystem_alert.css
│   │   │   ├── designsystem_box.css
│   │   │   ├── designsystem_button.css
│   │   │   ├── designsystem_checkbox.css
│   │   │   ├── designsystem_container.css
│   │   │   ├── designsystem_darkmode.css
│   │   │   ├── designsystem_dropdown.css
│   │   │   ├── designsystem_formbuilder.css
│   │   │   ├── designsystem_icon.css
│   │   │   ├── designsystem_input.css
│   │   │   ├── designsystem_inputgroup.css
│   │   │   ├── designsystem_skeleton.css
│   │   │   ├── designsystem_textarea.css
│   │   │   └── designsystem_utils.css
│   │   ├── embed/
│   │   │   ├── filestash-image.js
│   │   │   ├── filestash-map.js
│   │   │   └── filestash-table.js
│   │   ├── helpers/
│   │   │   ├── loader.d.ts
│   │   │   ├── loader.js
│   │   │   ├── loader_wasm.js
│   │   │   ├── log.d.ts
│   │   │   ├── log.js
│   │   │   └── sdk.js
│   │   ├── index.js
│   │   ├── lib/
│   │   │   ├── ajax.js
│   │   │   ├── animate.d.ts
│   │   │   ├── animate.js
│   │   │   ├── assert.js
│   │   │   ├── chromecast.js
│   │   │   ├── dom.d.ts
│   │   │   ├── dom.js
│   │   │   ├── error.d.ts
│   │   │   ├── error.js
│   │   │   ├── form.d.ts
│   │   │   ├── form.js
│   │   │   ├── path.js
│   │   │   ├── polyfill.js
│   │   │   ├── random.d.ts
│   │   │   ├── random.js
│   │   │   ├── rx.d.ts
│   │   │   ├── rx.js
│   │   │   ├── settings.js
│   │   │   ├── skeleton/
│   │   │   │   ├── index.d.ts
│   │   │   │   ├── index.js
│   │   │   │   ├── lifecycle.d.ts
│   │   │   │   ├── lifecycle.js
│   │   │   │   ├── router.d.ts
│   │   │   │   └── router.js
│   │   │   ├── store.js
│   │   │   └── vendor/
│   │   │       ├── bcrypt.js
│   │   │       ├── codemirror/
│   │   │       │   ├── .editorconfig
│   │   │       │   ├── .gitattributes
│   │   │       │   ├── .npmignore
│   │   │       │   ├── AUTHORS
│   │   │       │   ├── CHANGELOG.md
│   │   │       │   ├── CONTRIBUTING.md
│   │   │       │   ├── LICENSE
│   │   │       │   ├── README.md
│   │   │       │   ├── addon/
│   │   │       │   │   ├── comment/
│   │   │       │   │   │   ├── comment.js
│   │   │       │   │   │   └── continuecomment.js
│   │   │       │   │   ├── dialog/
│   │   │       │   │   │   ├── dialog.css
│   │   │       │   │   │   └── dialog.js
│   │   │       │   │   ├── display/
│   │   │       │   │   │   ├── autorefresh.js
│   │   │       │   │   │   ├── fullscreen.css
│   │   │       │   │   │   ├── fullscreen.js
│   │   │       │   │   │   ├── panel.js
│   │   │       │   │   │   ├── placeholder.js
│   │   │       │   │   │   └── rulers.js
│   │   │       │   │   ├── edit/
│   │   │       │   │   │   ├── closebrackets.js
│   │   │       │   │   │   ├── closetag.js
│   │   │       │   │   │   ├── continuelist.js
│   │   │       │   │   │   ├── matchbrackets.js
│   │   │       │   │   │   ├── matchtags.js
│   │   │       │   │   │   └── trailingspace.js
│   │   │       │   │   ├── fold/
│   │   │       │   │   │   ├── brace-fold.js
│   │   │       │   │   │   ├── comment-fold.js
│   │   │       │   │   │   ├── foldcode.js
│   │   │       │   │   │   ├── foldgutter.css
│   │   │       │   │   │   ├── foldgutter.js
│   │   │       │   │   │   ├── indent-fold.js
│   │   │       │   │   │   ├── markdown-fold.js
│   │   │       │   │   │   └── xml-fold.js
│   │   │       │   │   ├── hint/
│   │   │       │   │   │   ├── anyword-hint.js
│   │   │       │   │   │   ├── css-hint.js
│   │   │       │   │   │   ├── html-hint.js
│   │   │       │   │   │   ├── javascript-hint.js
│   │   │       │   │   │   ├── show-hint.css
│   │   │       │   │   │   ├── show-hint.js
│   │   │       │   │   │   ├── sql-hint.js
│   │   │       │   │   │   └── xml-hint.js
│   │   │       │   │   ├── lint/
│   │   │       │   │   │   ├── coffeescript-lint.js
│   │   │       │   │   │   ├── css-lint.js
│   │   │       │   │   │   ├── html-lint.js
│   │   │       │   │   │   ├── javascript-lint.js
│   │   │       │   │   │   ├── json-lint.js
│   │   │       │   │   │   ├── lint.css
│   │   │       │   │   │   ├── lint.js
│   │   │       │   │   │   └── yaml-lint.js
│   │   │       │   │   ├── merge/
│   │   │       │   │   │   ├── merge.css
│   │   │       │   │   │   └── merge.js
│   │   │       │   │   ├── mode/
│   │   │       │   │   │   ├── loadmode.js
│   │   │       │   │   │   ├── multiplex.js
│   │   │       │   │   │   ├── multiplex_test.js
│   │   │       │   │   │   ├── overlay.js
│   │   │       │   │   │   └── simple.js
│   │   │       │   │   ├── runmode/
│   │   │       │   │   │   ├── colorize.js
│   │   │       │   │   │   ├── runmode-standalone.js
│   │   │       │   │   │   ├── runmode.js
│   │   │       │   │   │   └── runmode.node.js
│   │   │       │   │   ├── scroll/
│   │   │       │   │   │   ├── annotatescrollbar.js
│   │   │       │   │   │   ├── scrollpastend.js
│   │   │       │   │   │   ├── simplescrollbars.css
│   │   │       │   │   │   └── simplescrollbars.js
│   │   │       │   │   ├── search/
│   │   │       │   │   │   ├── jump-to-line.js
│   │   │       │   │   │   ├── match-highlighter.js
│   │   │       │   │   │   ├── matchesonscrollbar.css
│   │   │       │   │   │   ├── matchesonscrollbar.js
│   │   │       │   │   │   ├── search.js
│   │   │       │   │   │   └── searchcursor.js
│   │   │       │   │   ├── selection/
│   │   │       │   │   │   ├── active-line.js
│   │   │       │   │   │   ├── mark-selection.js
│   │   │       │   │   │   └── selection-pointer.js
│   │   │       │   │   ├── tern/
│   │   │       │   │   │   ├── tern.css
│   │   │       │   │   │   ├── tern.js
│   │   │       │   │   │   └── worker.js
│   │   │       │   │   └── wrap/
│   │   │       │   │       └── hardwrap.js
│   │   │       │   ├── bin/
│   │   │       │   │   ├── authors.sh
│   │   │       │   │   ├── lint
│   │   │       │   │   ├── release
│   │   │       │   │   ├── source-highlight
│   │   │       │   │   └── upload-release.js
│   │   │       │   ├── demo/
│   │   │       │   │   ├── activeline.html
│   │   │       │   │   ├── anywordhint.html
│   │   │       │   │   ├── bidi.html
│   │   │       │   │   ├── btree.html
│   │   │       │   │   ├── buffers.html
│   │   │       │   │   ├── changemode.html
│   │   │       │   │   ├── closebrackets.html
│   │   │       │   │   ├── closetag.html
│   │   │       │   │   ├── complete.html
│   │   │       │   │   ├── emacs.html
│   │   │       │   │   ├── folding.html
│   │   │       │   │   ├── fullscreen.html
│   │   │       │   │   ├── hardwrap.html
│   │   │       │   │   ├── html5complete.html
│   │   │       │   │   ├── indentwrap.html
│   │   │       │   │   ├── lint.html
│   │   │       │   │   ├── loadmode.html
│   │   │       │   │   ├── marker.html
│   │   │       │   │   ├── markselection.html
│   │   │       │   │   ├── matchhighlighter.html
│   │   │       │   │   ├── matchtags.html
│   │   │       │   │   ├── merge.html
│   │   │       │   │   ├── multiplex.html
│   │   │       │   │   ├── mustache.html
│   │   │       │   │   ├── panel.html
│   │   │       │   │   ├── placeholder.html
│   │   │       │   │   ├── preview.html
│   │   │       │   │   ├── requirejs.html
│   │   │       │   │   ├── resize.html
│   │   │       │   │   ├── rulers.html
│   │   │       │   │   ├── runmode-standalone.html
│   │   │       │   │   ├── runmode.html
│   │   │       │   │   ├── search.html
│   │   │       │   │   ├── simplemode.html
│   │   │       │   │   ├── simplescrollbars.html
│   │   │       │   │   ├── spanaffectswrapping_shim.html
│   │   │       │   │   ├── sublime.html
│   │   │       │   │   ├── tern.html
│   │   │       │   │   ├── theme.html
│   │   │       │   │   ├── trailingspace.html
│   │   │       │   │   ├── variableheight.html
│   │   │       │   │   ├── vim.html
│   │   │       │   │   ├── visibletabs.html
│   │   │       │   │   ├── widget.html
│   │   │       │   │   └── xmlcomplete.html
│   │   │       │   ├── doc/
│   │   │       │   │   ├── activebookmark.js
│   │   │       │   │   ├── docs.css
│   │   │       │   │   ├── internals.html
│   │   │       │   │   ├── manual.html
│   │   │       │   │   ├── realworld.html
│   │   │       │   │   ├── releases.html
│   │   │       │   │   ├── reporting.html
│   │   │       │   │   ├── upgrade_v2.2.html
│   │   │       │   │   ├── upgrade_v3.html
│   │   │       │   │   └── upgrade_v4.html
│   │   │       │   ├── index.html
│   │   │       │   ├── keymap/
│   │   │       │   │   ├── emacs.js
│   │   │       │   │   ├── sublime.js
│   │   │       │   │   └── vim.js
│   │   │       │   ├── lib/
│   │   │       │   │   ├── codemirror.css
│   │   │       │   │   └── codemirror.js
│   │   │       │   ├── mode/
│   │   │       │   │   ├── apl/
│   │   │       │   │   │   ├── apl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── asciiarmor/
│   │   │       │   │   │   ├── asciiarmor.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── asn.1/
│   │   │       │   │   │   ├── asn.1.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── asterisk/
│   │   │       │   │   │   ├── asterisk.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── brainfuck/
│   │   │       │   │   │   ├── brainfuck.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── clike/
│   │   │       │   │   │   ├── clike.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── scala.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── clojure/
│   │   │       │   │   │   ├── clojure.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── cmake/
│   │   │       │   │   │   ├── cmake.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── cobol/
│   │   │       │   │   │   ├── cobol.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── coffeescript/
│   │   │       │   │   │   ├── coffeescript.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── commonlisp/
│   │   │       │   │   │   ├── commonlisp.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── crystal/
│   │   │       │   │   │   ├── crystal.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── css/
│   │   │       │   │   │   ├── css.js
│   │   │       │   │   │   ├── gss.html
│   │   │       │   │   │   ├── gss_test.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── less.html
│   │   │       │   │   │   ├── less_test.js
│   │   │       │   │   │   ├── scss.html
│   │   │       │   │   │   ├── scss_test.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── cypher/
│   │   │       │   │   │   ├── cypher.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── d/
│   │   │       │   │   │   ├── d.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── dart/
│   │   │       │   │   │   ├── dart.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── diff/
│   │   │       │   │   │   ├── diff.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── django/
│   │   │       │   │   │   ├── django.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── dockerfile/
│   │   │       │   │   │   ├── dockerfile.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── dtd/
│   │   │       │   │   │   ├── dtd.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── dylan/
│   │   │       │   │   │   ├── dylan.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── ebnf/
│   │   │       │   │   │   ├── ebnf.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── ecl/
│   │   │       │   │   │   ├── ecl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── eiffel/
│   │   │       │   │   │   ├── eiffel.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── elm/
│   │   │       │   │   │   ├── elm.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── erlang/
│   │   │       │   │   │   ├── erlang.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── factor/
│   │   │       │   │   │   ├── factor.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── fcl/
│   │   │       │   │   │   ├── fcl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── forth/
│   │   │       │   │   │   ├── forth.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── fortran/
│   │   │       │   │   │   ├── fortran.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── gas/
│   │   │       │   │   │   ├── gas.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── gfm/
│   │   │       │   │   │   ├── gfm.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── gherkin/
│   │   │       │   │   │   ├── gherkin.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── go/
│   │   │       │   │   │   ├── go.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── groovy/
│   │   │       │   │   │   ├── groovy.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haml/
│   │   │       │   │   │   ├── haml.js
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── handlebars/
│   │   │       │   │   │   ├── handlebars.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haskell/
│   │   │       │   │   │   ├── haskell.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haskell-literate/
│   │   │       │   │   │   ├── haskell-literate.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── haxe/
│   │   │       │   │   │   ├── haxe.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── htmlembedded/
│   │   │       │   │   │   ├── htmlembedded.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── htmlmixed/
│   │   │       │   │   │   ├── htmlmixed.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── http/
│   │   │       │   │   │   ├── http.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── idl/
│   │   │       │   │   │   ├── idl.js
│   │   │       │   │   │   └── index.html
│   │   │       │   │   ├── index.html
│   │   │       │   │   ├── javascript/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── javascript.js
│   │   │       │   │   │   ├── json-ld.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── typescript.html
│   │   │       │   │   ├── jinja2/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── jinja2.js
│   │   │       │   │   ├── jsx/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── jsx.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── julia/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── julia.js
│   │   │       │   │   ├── livescript/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── livescript.js
│   │   │       │   │   ├── lua/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── lua.js
│   │   │       │   │   ├── markdown/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── markdown.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── mathematica/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mathematica.js
│   │   │       │   │   ├── mbox/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mbox.js
│   │   │       │   │   ├── meta.js
│   │   │       │   │   ├── mirc/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mirc.js
│   │   │       │   │   ├── mllike/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mllike.js
│   │   │       │   │   ├── modelica/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── modelica.js
│   │   │       │   │   ├── mscgen/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── mscgen.js
│   │   │       │   │   │   ├── mscgen_test.js
│   │   │       │   │   │   ├── msgenny_test.js
│   │   │       │   │   │   └── xu_test.js
│   │   │       │   │   ├── mumps/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── mumps.js
│   │   │       │   │   ├── nginx/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── nginx.js
│   │   │       │   │   ├── nsis/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── nsis.js
│   │   │       │   │   ├── ntriples/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── ntriples.js
│   │   │       │   │   ├── octave/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── octave.js
│   │   │       │   │   ├── oz/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── oz.js
│   │   │       │   │   ├── pascal/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pascal.js
│   │   │       │   │   ├── pegjs/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pegjs.js
│   │   │       │   │   ├── perl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── perl.js
│   │   │       │   │   ├── php/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── php.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── pig/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pig.js
│   │   │       │   │   ├── powershell/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── powershell.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── properties/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── properties.js
│   │   │       │   │   ├── protobuf/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── protobuf.js
│   │   │       │   │   ├── pug/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── pug.js
│   │   │       │   │   ├── puppet/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── puppet.js
│   │   │       │   │   ├── python/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── python.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── q/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── q.js
│   │   │       │   │   ├── r/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── r.js
│   │   │       │   │   ├── rpm/
│   │   │       │   │   │   ├── changes/
│   │   │       │   │   │   │   └── index.html
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── rpm.js
│   │   │       │   │   ├── rst/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── rst.js
│   │   │       │   │   ├── ruby/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── ruby.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── rust/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── rust.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── sas/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sas.js
│   │   │       │   │   ├── sass/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── sass.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── scheme/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── scheme.js
│   │   │       │   │   ├── shell/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── shell.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── sieve/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sieve.js
│   │   │       │   │   ├── slim/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── slim.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── smalltalk/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── smalltalk.js
│   │   │       │   │   ├── smarty/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── smarty.js
│   │   │       │   │   ├── solr/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── solr.js
│   │   │       │   │   ├── soy/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── soy.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── sparql/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sparql.js
│   │   │       │   │   ├── spreadsheet/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── spreadsheet.js
│   │   │       │   │   ├── sql/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── sql.js
│   │   │       │   │   ├── stex/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── stex.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── stylus/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── stylus.js
│   │   │       │   │   ├── swift/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── swift.js
│   │   │       │   │   │   └── test.js
│   │   │       │   │   ├── tcl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── tcl.js
│   │   │       │   │   ├── textile/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── textile.js
│   │   │       │   │   ├── tiddlywiki/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── tiddlywiki.css
│   │   │       │   │   │   └── tiddlywiki.js
│   │   │       │   │   ├── tiki/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── tiki.css
│   │   │       │   │   │   └── tiki.js
│   │   │       │   │   ├── toml/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── toml.js
│   │   │       │   │   ├── tornado/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── tornado.js
│   │   │       │   │   ├── troff/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── troff.js
│   │   │       │   │   ├── ttcn/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── ttcn.js
│   │   │       │   │   ├── ttcn-cfg/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── ttcn-cfg.js
│   │   │       │   │   ├── turtle/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── turtle.js
│   │   │       │   │   ├── twig/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── twig.js
│   │   │       │   │   ├── vb/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vb.js
│   │   │       │   │   ├── vbscript/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vbscript.js
│   │   │       │   │   ├── velocity/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── velocity.js
│   │   │       │   │   ├── verilog/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── verilog.js
│   │   │       │   │   ├── vhdl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vhdl.js
│   │   │       │   │   ├── vue/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── vue.js
│   │   │       │   │   ├── wast/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── wast.js
│   │   │       │   │   ├── webidl/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── webidl.js
│   │   │       │   │   ├── xml/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── xml.js
│   │   │       │   │   ├── xquery/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   ├── test.js
│   │   │       │   │   │   └── xquery.js
│   │   │       │   │   ├── yacas/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── yacas.js
│   │   │       │   │   ├── yaml/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── yaml.js
│   │   │       │   │   ├── yaml-frontmatter/
│   │   │       │   │   │   ├── index.html
│   │   │       │   │   │   └── yaml-frontmatter.js
│   │   │       │   │   └── z80/
│   │   │       │   │       ├── index.html
│   │   │       │   │       └── z80.js
│   │   │       │   ├── package.json
│   │   │       │   ├── rollup.config.js
│   │   │       │   ├── src/
│   │   │       │   │   ├── addon/
│   │   │       │   │   │   └── runmode/
│   │   │       │   │   │       ├── codemirror-standalone.js
│   │   │       │   │   │       ├── codemirror.node.js
│   │   │       │   │   │       ├── runmode-standalone.js
│   │   │       │   │   │       └── runmode.node.js
│   │   │       │   │   ├── codemirror.js
│   │   │       │   │   ├── display/
│   │   │       │   │   │   ├── Display.js
│   │   │       │   │   │   ├── focus.js
│   │   │       │   │   │   ├── gutters.js
│   │   │       │   │   │   ├── highlight_worker.js
│   │   │       │   │   │   ├── line_numbers.js
│   │   │       │   │   │   ├── mode_state.js
│   │   │       │   │   │   ├── operations.js
│   │   │       │   │   │   ├── scroll_events.js
│   │   │       │   │   │   ├── scrollbars.js
│   │   │       │   │   │   ├── scrolling.js
│   │   │       │   │   │   ├── selection.js
│   │   │       │   │   │   ├── update_display.js
│   │   │       │   │   │   ├── update_line.js
│   │   │       │   │   │   ├── update_lines.js
│   │   │       │   │   │   └── view_tracking.js
│   │   │       │   │   ├── edit/
│   │   │       │   │   │   ├── CodeMirror.js
│   │   │       │   │   │   ├── commands.js
│   │   │       │   │   │   ├── deleteNearSelection.js
│   │   │       │   │   │   ├── drop_events.js
│   │   │       │   │   │   ├── fromTextArea.js
│   │   │       │   │   │   ├── global_events.js
│   │   │       │   │   │   ├── key_events.js
│   │   │       │   │   │   ├── legacy.js
│   │   │       │   │   │   ├── main.js
│   │   │       │   │   │   ├── methods.js
│   │   │       │   │   │   ├── mouse_events.js
│   │   │       │   │   │   ├── options.js
│   │   │       │   │   │   └── utils.js
│   │   │       │   │   ├── input/
│   │   │       │   │   │   ├── ContentEditableInput.js
│   │   │       │   │   │   ├── TextareaInput.js
│   │   │       │   │   │   ├── indent.js
│   │   │       │   │   │   ├── input.js
│   │   │       │   │   │   ├── keymap.js
│   │   │       │   │   │   ├── keynames.js
│   │   │       │   │   │   └── movement.js
│   │   │       │   │   ├── line/
│   │   │       │   │   │   ├── highlight.js
│   │   │       │   │   │   ├── line_data.js
│   │   │       │   │   │   ├── pos.js
│   │   │       │   │   │   ├── saw_special_spans.js
│   │   │       │   │   │   ├── spans.js
│   │   │       │   │   │   └── utils_line.js
│   │   │       │   │   ├── measurement/
│   │   │       │   │   │   ├── position_measurement.js
│   │   │       │   │   │   └── widgets.js
│   │   │       │   │   ├── model/
│   │   │       │   │   │   ├── Doc.js
│   │   │       │   │   │   ├── change_measurement.js
│   │   │       │   │   │   ├── changes.js
│   │   │       │   │   │   ├── chunk.js
│   │   │       │   │   │   ├── document_data.js
│   │   │       │   │   │   ├── history.js
│   │   │       │   │   │   ├── line_widget.js
│   │   │       │   │   │   ├── mark_text.js
│   │   │       │   │   │   ├── selection.js
│   │   │       │   │   │   └── selection_updates.js
│   │   │       │   │   ├── modes.js
│   │   │       │   │   └── util/
│   │   │       │   │       ├── StringStream.js
│   │   │       │   │       ├── bidi.js
│   │   │       │   │       ├── browser.js
│   │   │       │   │       ├── dom.js
│   │   │       │   │       ├── event.js
│   │   │       │   │       ├── feature_detection.js
│   │   │       │   │       ├── misc.js
│   │   │       │   │       └── operation_group.js
│   │   │       │   └── theme/
│   │   │       │       ├── 3024-day.css
│   │   │       │       ├── 3024-night.css
│   │   │       │       ├── abbott.css
│   │   │       │       ├── abcdef.css
│   │   │       │       ├── ambiance-mobile.css
│   │   │       │       ├── ambiance.css
│   │   │       │       ├── ayu-dark.css
│   │   │       │       ├── ayu-mirage.css
│   │   │       │       ├── base16-dark.css
│   │   │       │       ├── base16-light.css
│   │   │       │       ├── bespin.css
│   │   │       │       ├── blackboard.css
│   │   │       │       ├── cobalt.css
│   │   │       │       ├── colorforth.css
│   │   │       │       ├── darcula.css
│   │   │       │       ├── dracula.css
│   │   │       │       ├── duotone-dark.css
│   │   │       │       ├── duotone-light.css
│   │   │       │       ├── eclipse.css
│   │   │       │       ├── elegant.css
│   │   │       │       ├── erlang-dark.css
│   │   │       │       ├── gruvbox-dark.css
│   │   │       │       ├── hopscotch.css
│   │   │       │       ├── icecoder.css
│   │   │       │       ├── idea.css
│   │   │       │       ├── isotope.css
│   │   │       │       ├── juejin.css
│   │   │       │       ├── lesser-dark.css
│   │   │       │       ├── liquibyte.css
│   │   │       │       ├── lucario.css
│   │   │       │       ├── material-darker.css
│   │   │       │       ├── material-ocean.css
│   │   │       │       ├── material-palenight.css
│   │   │       │       ├── material.css
│   │   │       │       ├── mbo.css
│   │   │       │       ├── mdn-like.css
│   │   │       │       ├── midnight.css
│   │   │       │       ├── monokai.css
│   │   │       │       ├── moxer.css
│   │   │       │       ├── neat.css
│   │   │       │       ├── neo.css
│   │   │       │       ├── night.css
│   │   │       │       ├── nord.css
│   │   │       │       ├── oceanic-next.css
│   │   │       │       ├── panda-syntax.css
│   │   │       │       ├── paraiso-dark.css
│   │   │       │       ├── paraiso-light.css
│   │   │       │       ├── pastel-on-dark.css
│   │   │       │       ├── railscasts.css
│   │   │       │       ├── rubyblue.css
│   │   │       │       ├── seti.css
│   │   │       │       ├── shadowfox.css
│   │   │       │       ├── solarized.css
│   │   │       │       ├── ssms.css
│   │   │       │       ├── the-matrix.css
│   │   │       │       ├── tomorrow-night-bright.css
│   │   │       │       ├── tomorrow-night-eighties.css
│   │   │       │       ├── ttcn.css
│   │   │       │       ├── twilight.css
│   │   │       │       ├── vibrant-ink.css
│   │   │       │       ├── xq-dark.css
│   │   │       │       ├── xq-light.css
│   │   │       │       ├── yeti.css
│   │   │       │       ├── yonce.css
│   │   │       │       └── zenburn.css
│   │   │       ├── exif-js.js
│   │   │       ├── hlsjs/
│   │   │       │   └── hls.js
│   │   │       ├── leaflet/
│   │   │       │   ├── Control.Draw.js
│   │   │       │   ├── Leaflet.Draw.Event.js
│   │   │       │   ├── Leaflet.draw.js
│   │   │       │   ├── Toolbar.js
│   │   │       │   ├── Tooltip.js
│   │   │       │   ├── draw/
│   │   │       │   │   ├── DrawToolbar.js
│   │   │       │   │   └── handler/
│   │   │       │   │       ├── Draw.Circle.js
│   │   │       │   │       ├── Draw.CircleMarker.js
│   │   │       │   │       ├── Draw.Feature.js
│   │   │       │   │       ├── Draw.Marker.js
│   │   │       │   │       ├── Draw.Polygon.js
│   │   │       │   │       ├── Draw.Polyline.js
│   │   │       │   │       ├── Draw.Rectangle.js
│   │   │       │   │       └── Draw.SimpleShape.js
│   │   │       │   ├── edit/
│   │   │       │   │   ├── EditToolbar.js
│   │   │       │   │   └── handler/
│   │   │       │   │       ├── Edit.Circle.js
│   │   │       │   │       ├── Edit.CircleMarker.js
│   │   │       │   │       ├── Edit.Marker.js
│   │   │       │   │       ├── Edit.Poly.js
│   │   │       │   │       ├── Edit.Rectangle.js
│   │   │       │   │       ├── Edit.SimpleShape.js
│   │   │       │   │       ├── EditToolbar.Delete.js
│   │   │       │   │       └── EditToolbar.Edit.js
│   │   │       │   ├── ext/
│   │   │       │   │   ├── GeometryUtil.js
│   │   │       │   │   ├── LatLngUtil.js
│   │   │       │   │   ├── LineUtil.Intersect.js
│   │   │       │   │   ├── Polygon.Intersect.js
│   │   │       │   │   ├── Polyline.Intersect.js
│   │   │       │   │   └── TouchEvents.js
│   │   │       │   ├── leaflet-measure.css
│   │   │       │   ├── leaflet-measure.js
│   │   │       │   ├── leaflet.css
│   │   │       │   ├── leaflet.draw.css
│   │   │       │   ├── leaflet.js
│   │   │       │   └── shp.esm.js
│   │   │       ├── pdfjs/
│   │   │       │   ├── pdf.js
│   │   │       │   ├── pdf.sandbox.js
│   │   │       │   └── pdf.worker.js
│   │   │       ├── three/
│   │   │       │   ├── FontLoader.js
│   │   │       │   ├── OrbitControls.js
│   │   │       │   ├── Projector.js
│   │   │       │   ├── TextGeometry.js
│   │   │       │   ├── three.module.js
│   │   │       │   └── viewcube.js
│   │   │       └── wavesurfer.js
│   │   ├── locales/
│   │   │   ├── _.json
│   │   │   ├── az.json
│   │   │   ├── be.json
│   │   │   ├── bg.json
│   │   │   ├── ca.json
│   │   │   ├── cs.json
│   │   │   ├── da.json
│   │   │   ├── de.json
│   │   │   ├── el.json
│   │   │   ├── es.json
│   │   │   ├── et.json
│   │   │   ├── eu.json
│   │   │   ├── fi.json
│   │   │   ├── fr.json
│   │   │   ├── gl.json
│   │   │   ├── hr.json
│   │   │   ├── hu.json
│   │   │   ├── id.json
│   │   │   ├── index.js
│   │   │   ├── is.json
│   │   │   ├── it.json
│   │   │   ├── ja.json
│   │   │   ├── ka.json
│   │   │   ├── ko.json
│   │   │   ├── lt.json
│   │   │   ├── lv.json
│   │   │   ├── mn.json
│   │   │   ├── nb.json
│   │   │   ├── nl.json
│   │   │   ├── no.json
│   │   │   ├── pl.json
│   │   │   ├── pt.json
│   │   │   ├── ro.json
│   │   │   ├── ru.json
│   │   │   ├── script.js
│   │   │   ├── sk.json
│   │   │   ├── sl.json
│   │   │   ├── sr.json
│   │   │   ├── sv.json
│   │   │   ├── th.json
│   │   │   ├── tr.json
│   │   │   ├── uk.json
│   │   │   ├── vi.json
│   │   │   ├── zh.json
│   │   │   └── zh_tw.json
│   │   ├── model/
│   │   │   ├── backend.js
│   │   │   ├── chromecast.js
│   │   │   ├── config.d.ts
│   │   │   ├── config.js
│   │   │   ├── plugin.js
│   │   │   └── session.js
│   │   └── pages/
│   │       ├── adminpage/
│   │       │   ├── animate.js
│   │       │   ├── component_box-item.js
│   │       │   ├── ctrl_about.css
│   │       │   ├── ctrl_about.js
│   │       │   ├── ctrl_activity.js
│   │       │   ├── ctrl_activity_audit.js
│   │       │   ├── ctrl_activity_form.js
│   │       │   ├── ctrl_activity_graph.css
│   │       │   ├── ctrl_activity_graph.js
│   │       │   ├── ctrl_activity_viewer.css
│   │       │   ├── ctrl_activity_viewer.js
│   │       │   ├── ctrl_login.css
│   │       │   ├── ctrl_login.js
│   │       │   ├── ctrl_settings.js
│   │       │   ├── ctrl_setup.css
│   │       │   ├── ctrl_setup.js
│   │       │   ├── ctrl_storage.css
│   │       │   ├── ctrl_storage.js
│   │       │   ├── ctrl_storage_component_authentication.js
│   │       │   ├── ctrl_storage_component_backend.js
│   │       │   ├── ctrl_storage_component_banner.js
│   │       │   ├── ctrl_storage_state.js
│   │       │   ├── ctrl_workflow.css
│   │       │   ├── ctrl_workflow.js
│   │       │   ├── ctrl_workflow_details.js
│   │       │   ├── ctrl_workflow_list.js
│   │       │   ├── decorator.js
│   │       │   ├── decorator_admin_only.js
│   │       │   ├── decorator_sidemenu.css
│   │       │   ├── decorator_sidemenu.js
│   │       │   ├── helper_form.js
│   │       │   ├── index.css
│   │       │   ├── model_admin_session.js
│   │       │   ├── model_audit.js
│   │       │   ├── model_auth_middleware.js
│   │       │   ├── model_backend.js
│   │       │   ├── model_config.js
│   │       │   ├── model_log.js
│   │       │   ├── model_release.js
│   │       │   ├── model_setup.js
│   │       │   └── model_workflow.js
│   │       ├── connectpage/
│   │       │   ├── ctrl_forkme.js
│   │       │   ├── ctrl_form.css
│   │       │   ├── ctrl_form.js
│   │       │   ├── ctrl_form_state.js
│   │       │   ├── ctrl_poweredby.js
│   │       │   ├── model_backend.js
│   │       │   └── model_config.js
│   │       ├── ctrl_adminpage.js
│   │       ├── ctrl_connectpage.css
│   │       ├── ctrl_connectpage.js
│   │       ├── ctrl_error.js
│   │       ├── ctrl_filespage.css
│   │       ├── ctrl_filespage.js
│   │       ├── ctrl_homepage.js
│   │       ├── ctrl_logout.js
│   │       ├── ctrl_notfound.js
│   │       ├── ctrl_sharepage.css
│   │       ├── ctrl_sharepage.js
│   │       ├── ctrl_viewerpage.css
│   │       ├── ctrl_viewerpage.js
│   │       ├── filespage/
│   │       │   ├── cache.js
│   │       │   ├── ctrl_filesystem.css
│   │       │   ├── ctrl_filesystem.js
│   │       │   ├── ctrl_frequentlyaccess.css
│   │       │   ├── ctrl_frequentlyaccess.js
│   │       │   ├── ctrl_newitem.css
│   │       │   ├── ctrl_newitem.js
│   │       │   ├── ctrl_submenu.css
│   │       │   ├── ctrl_submenu.js
│   │       │   ├── ctrl_upload.css
│   │       │   ├── ctrl_upload.d.ts
│   │       │   ├── ctrl_upload.js
│   │       │   ├── helper.js
│   │       │   ├── modal.css
│   │       │   ├── modal_delete.js
│   │       │   ├── modal_rename.js
│   │       │   ├── modal_share.css
│   │       │   ├── modal_share.js
│   │       │   ├── modal_tag.css
│   │       │   ├── modal_tag.js
│   │       │   ├── model_acl.js
│   │       │   ├── model_files.js
│   │       │   ├── model_tag.js
│   │       │   ├── model_virtual_layer.js
│   │       │   ├── state_config.js
│   │       │   ├── state_newthing.js
│   │       │   ├── state_selection.js
│   │       │   ├── thing.css
│   │       │   ├── thing.d.ts
│   │       │   └── thing.js
│   │       └── viewerpage/
│   │           ├── application_3d/
│   │           │   ├── init.js
│   │           │   ├── scene_cube.js
│   │           │   ├── scene_light.js
│   │           │   └── toolbar.js
│   │           ├── application_3d.css
│   │           ├── application_3d.d.ts
│   │           ├── application_3d.js
│   │           ├── application_audio.css
│   │           ├── application_audio.d.ts
│   │           ├── application_audio.js
│   │           ├── application_downloader.css
│   │           ├── application_downloader.js
│   │           ├── application_ebook.css
│   │           ├── application_ebook.d.ts
│   │           ├── application_ebook.js
│   │           ├── application_editor/
│   │           │   ├── clike.js
│   │           │   ├── clojure.js
│   │           │   ├── cmake.js
│   │           │   ├── commonlisp.js
│   │           │   ├── css.js
│   │           │   ├── diff.js
│   │           │   ├── dockerfile.js
│   │           │   ├── elm.js
│   │           │   ├── emacs-org.js
│   │           │   ├── erlang.js
│   │           │   ├── go.js
│   │           │   ├── groovy.js
│   │           │   ├── htmlmixed.js
│   │           │   ├── java.js
│   │           │   ├── javascript.js
│   │           │   ├── jsx.js
│   │           │   ├── keymap_base.js
│   │           │   ├── keymap_vim.js
│   │           │   ├── lua.js
│   │           │   ├── orgmode.js
│   │           │   ├── perl.js
│   │           │   ├── php.js
│   │           │   ├── properties.js
│   │           │   ├── python.js
│   │           │   ├── r.js
│   │           │   ├── ruby.js
│   │           │   ├── rust.js
│   │           │   ├── sass.js
│   │           │   ├── shell.js
│   │           │   ├── sparql.js
│   │           │   ├── spreadsheet.js
│   │           │   ├── sql.js
│   │           │   ├── stex.js
│   │           │   ├── text.js
│   │           │   ├── xml.js
│   │           │   ├── yaml-frontmatter.js
│   │           │   └── yaml.js
│   │           ├── application_editor.css
│   │           ├── application_editor.d.ts
│   │           ├── application_editor.js
│   │           ├── application_editor_orgmode.js
│   │           ├── application_form.css
│   │           ├── application_form.js
│   │           ├── application_iframe.css
│   │           ├── application_iframe.js
│   │           ├── application_image/
│   │           │   ├── information.css
│   │           │   ├── information.js
│   │           │   ├── pagination.css
│   │           │   ├── pagination.js
│   │           │   └── zoom.js
│   │           ├── application_image.css
│   │           ├── application_image.d.ts
│   │           ├── application_image.js
│   │           ├── application_map.css
│   │           ├── application_map.d.ts
│   │           ├── application_map.js
│   │           ├── application_pdf.css
│   │           ├── application_pdf.d.ts
│   │           ├── application_pdf.js
│   │           ├── application_skeleton.css
│   │           ├── application_skeleton.js
│   │           ├── application_table.css
│   │           ├── application_table.js
│   │           ├── application_url.js
│   │           ├── application_video.css
│   │           ├── application_video.js
│   │           ├── common.js
│   │           ├── common_fab.js
│   │           ├── common_icon.js
│   │           ├── common_player.js
│   │           ├── component_menubar.css
│   │           ├── component_menubar.js
│   │           ├── mimetype.js
│   │           └── model_files.js
│   ├── global.d.ts
│   ├── index.backoffice.html
│   ├── index.frontoffice.html
│   ├── tsconfig.json
│   ├── vite.config.js
│   └── vite.setup.js
└── server/
    ├── common/
    │   ├── app.go
    │   ├── backend.go
    │   ├── cache.go
    │   ├── config.go
    │   ├── config_state.go
    │   ├── constants.go
    │   ├── crypto.go
    │   ├── debug.go
    │   ├── default.go
    │   ├── dummy.go
    │   ├── error.go
    │   ├── files.go
    │   ├── files_all.go
    │   ├── files_linux.go
    │   ├── log.go
    │   ├── mime.go
    │   ├── plugin.go
    │   ├── recovery.go
    │   ├── response.go
    │   ├── ssl/
    │   │   ├── cert.go
    │   │   ├── generate.go
    │   │   ├── index.go
    │   │   ├── private.go
    │   │   └── root.go
    │   ├── token.go
    │   ├── types.go
    │   └── utils.go
    ├── ctrl/
    │   ├── about.go
    │   ├── admin.go
    │   ├── config.go
    │   ├── files.go
    │   ├── metadata.go
    │   ├── plugin.go
    │   ├── report.go
    │   ├── search.go
    │   ├── session.go
    │   ├── share.go
    │   ├── static/
    │   │   ├── 404.html
    │   │   └── loader.html
    │   ├── static.go
    │   ├── tmpl.go
    │   └── webdav.go
    ├── generator/
    │   ├── constants.go
    │   ├── emacs-el.go
    │   └── mime.go
    ├── middleware/
    │   ├── context.go
    │   ├── http.go
    │   ├── index.go
    │   ├── session.go
    │   └── telemetry.go
    ├── model/
    │   ├── audit.go
    │   ├── files.go
    │   ├── formater/
    │   │   ├── README.md
    │   │   ├── office.go
    │   │   ├── pdf.go
    │   │   └── txt.go
    │   ├── index.go
    │   ├── permissions.go
    │   ├── plugin.go
    │   ├── plugin_adapter.go
    │   ├── share.go
    │   └── webdav.go
    ├── pkg/
    │   ├── compress/
    │   │   ├── cgo.go
    │   │   └── nocgo.go
    │   ├── index.go
    │   ├── sqlite/
    │   │   ├── cgo.go
    │   │   └── nocgo.go
    │   └── workflow/
    │       ├── action.go
    │       ├── actions/
    │       │   ├── notify_email.go
    │       │   ├── run_api.go
    │       │   ├── tools_debug.go
    │       │   └── utils.go
    │       ├── config.go
    │       ├── handler.go
    │       ├── index.go
    │       ├── job.go
    │       ├── model/
    │       │   ├── block.go
    │       │   ├── index.go
    │       │   ├── job.go
    │       │   └── workflow.go
    │       ├── trigger/
    │       │   ├── fileaction.go
    │       │   ├── filewatch.go
    │       │   ├── index.go
    │       │   ├── schedule.go
    │       │   └── webhook.go
    │       └── trigger.go
    ├── plugin/
    │   ├── index.go
    │   ├── plg_application_docxjs/
    │   │   ├── Makefile
    │   │   ├── loader_docx.css
    │   │   ├── loader_docx.js
    │   │   └── manifest.json
    │   ├── plg_application_office/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── loader_lowa.css
    │   │   ├── loader_lowa.go
    │   │   ├── loader_lowa.js
    │   │   ├── loader_lowa.uno.js
    │   │   ├── manifest.json
    │   │   └── middleware.c
    │   ├── plg_authenticate_admin/
    │   │   └── index.go
    │   ├── plg_authenticate_htpasswd/
    │   │   ├── deps/
    │   │   │   └── crypt/
    │   │   │       ├── AUTHORS.md
    │   │   │       ├── LICENSE
    │   │   │       ├── README.md
    │   │   │       ├── apr1_crypt/
    │   │   │       │   └── apr1_crypt.go
    │   │   │       ├── common/
    │   │   │       │   ├── base64.go
    │   │   │       │   ├── doc.go
    │   │   │       │   └── salt.go
    │   │   │       ├── crypt.go
    │   │   │       ├── md5_crypt/
    │   │   │       │   └── md5_crypt.go
    │   │   │       ├── sha256_crypt/
    │   │   │       │   └── sha256_crypt.go
    │   │   │       └── sha512_crypt/
    │   │   │           └── sha512_crypt.go
    │   │   └── index.go
    │   ├── plg_authenticate_ldap/
    │   │   └── index.go
    │   ├── plg_authenticate_local/
    │   │   ├── README.md
    │   │   ├── auth.go
    │   │   ├── config.go
    │   │   ├── data.go
    │   │   ├── handler.go
    │   │   ├── handler.html
    │   │   ├── index.go
    │   │   ├── notify.go
    │   │   ├── service.go
    │   │   └── utils.go
    │   ├── plg_authenticate_passthrough/
    │   │   └── index.go
    │   ├── plg_authenticate_wordpress/
    │   │   ├── README.md
    │   │   ├── helper.go
    │   │   └── index.go
    │   ├── plg_authorisation_example/
    │   │   └── index.go
    │   ├── plg_backend_artifactory/
    │   │   └── index.go
    │   ├── plg_backend_azure/
    │   │   └── index.go
    │   ├── plg_backend_backblaze/
    │   │   └── index.go
    │   ├── plg_backend_dav/
    │   │   └── index.go
    │   ├── plg_backend_dropbox/
    │   │   └── index.go
    │   ├── plg_backend_ftp/
    │   │   └── index.go
    │   ├── plg_backend_ftp_only/
    │   │   └── index.go
    │   ├── plg_backend_gdrive/
    │   │   └── index.go
    │   ├── plg_backend_git/
    │   │   └── index.go
    │   ├── plg_backend_ipfs/
    │   │   ├── README.md
    │   │   └── index.go
    │   ├── plg_backend_ldap/
    │   │   └── index.go
    │   ├── plg_backend_local/
    │   │   └── index.go
    │   ├── plg_backend_mysql/
    │   │   └── index.go
    │   ├── plg_backend_nfs/
    │   │   ├── auth_helper.go
    │   │   ├── auth_unix.go
    │   │   └── index.go
    │   ├── plg_backend_nfs4/
    │   │   ├── index.go
    │   │   └── repo/
    │   │       ├── README.md
    │   │       ├── internal/
    │   │       │   ├── cleanuper.go
    │   │       │   ├── nfs4.go
    │   │       │   ├── nfs4.x
    │   │       │   ├── nfsconst.go
    │   │       │   ├── rpc.go
    │   │       │   ├── rpc.x
    │   │       │   └── types.go
    │   │       └── nfs4/
    │   │           ├── client.go
    │   │           ├── nfs_err.go
    │   │           └── supervised_conn.go
    │   ├── plg_backend_nop/
    │   │   └── index.go
    │   ├── plg_backend_perkeep/
    │   │   ├── index.go
    │   │   └── types.go
    │   ├── plg_backend_psql/
    │   │   ├── index.go
    │   │   ├── index_cat.go
    │   │   ├── index_ls.go
    │   │   ├── index_rm.go
    │   │   ├── index_save.go
    │   │   ├── types.go
    │   │   └── utils.go
    │   ├── plg_backend_s3/
    │   │   └── index.go
    │   ├── plg_backend_samba/
    │   │   └── index.go
    │   ├── plg_backend_sftp/
    │   │   └── index.go
    │   ├── plg_backend_storj/
    │   │   └── index.go
    │   ├── plg_backend_syncthing/
    │   │   ├── README.md
    │   │   ├── index.go
    │   │   └── index_helper.go
    │   ├── plg_backend_tmp/
    │   │   └── index.go
    │   ├── plg_backend_url/
    │   │   └── index.go
    │   ├── plg_backend_webdav/
    │   │   └── index.go
    │   ├── plg_editor_onlyoffice/
    │   │   └── index.go
    │   ├── plg_editor_wopi/
    │   │   ├── config.go
    │   │   ├── handler.go
    │   │   └── index.go
    │   ├── plg_handler_console/
    │   │   ├── generator.go
    │   │   ├── index.go
    │   │   ├── index_linux.go
    │   │   └── src/
    │   │       └── app.css
    │   ├── plg_handler_mcp/
    │   │   ├── README.md
    │   │   ├── config/
    │   │   │   └── config.go
    │   │   ├── handler.go
    │   │   ├── handler_auth.go
    │   │   ├── handler_state.go
    │   │   ├── impl/
    │   │   │   ├── completion.go
    │   │   │   ├── prompts.go
    │   │   │   ├── prompts_fs.go
    │   │   │   ├── public/
    │   │   │   │   └── file-list.html
    │   │   │   ├── resources.go
    │   │   │   ├── tools.go
    │   │   │   └── tools_fs.go
    │   │   ├── index.go
    │   │   ├── types/
    │   │   │   ├── mcp_completion.go
    │   │   │   ├── mcp_init.go
    │   │   │   ├── mcp_notification.go
    │   │   │   ├── mcp_prompts.go
    │   │   │   ├── mcp_resources.go
    │   │   │   ├── mcp_tools.go
    │   │   │   ├── resources.go
    │   │   │   ├── rpc.go
    │   │   │   └── session.go
    │   │   └── utils/
    │   │       ├── cors.go
    │   │       ├── default.go
    │   │       ├── json.go
    │   │       ├── mcp.go
    │   │       └── response.go
    │   ├── plg_handler_site/
    │   │   ├── config.go
    │   │   ├── index.go
    │   │   ├── middleware.go
    │   │   └── template.go
    │   ├── plg_handler_syncthing/
    │   │   └── index.go
    │   ├── plg_image_ascii/
    │   │   └── index.go
    │   ├── plg_image_bimg/
    │   │   └── index.go
    │   ├── plg_image_c/
    │   │   ├── image_gif.c
    │   │   ├── image_gif.go
    │   │   ├── image_gif.h
    │   │   ├── image_gif_vendor.h
    │   │   ├── image_jpeg.c
    │   │   ├── image_jpeg.h
    │   │   ├── image_jpeg_freebsd.go
    │   │   ├── image_jpeg_linux.go
    │   │   ├── image_png.c
    │   │   ├── image_png.h
    │   │   ├── image_png_freebsd.go
    │   │   ├── image_png_linux.go
    │   │   ├── image_psd.c
    │   │   ├── image_psd.go
    │   │   ├── image_psd.h
    │   │   ├── image_psd_generator.go
    │   │   ├── image_raw.c
    │   │   ├── image_raw.h
    │   │   ├── image_raw_freebsd.go
    │   │   ├── image_raw_linux.go
    │   │   ├── image_webp.c
    │   │   ├── image_webp.go
    │   │   ├── image_webp.h
    │   │   ├── index.go
    │   │   └── utils.h
    │   ├── plg_image_golang/
    │   │   └── index.go
    │   ├── plg_image_light/
    │   │   ├── deps/
    │   │   │   ├── README.md
    │   │   │   ├── create_libresize.sh
    │   │   │   ├── create_libtranscode.sh
    │   │   │   └── src/
    │   │   │       ├── libresize.c
    │   │   │       ├── libresize.h
    │   │   │       ├── libresize_test.c
    │   │   │       ├── libtranscode.c
    │   │   │       ├── libtranscode.h
    │   │   │       └── libtranscode_test.c
    │   │   ├── index.go
    │   │   ├── install.sh
    │   │   ├── lib_resize.go
    │   │   ├── lib_resize_linux_amd64.go
    │   │   ├── lib_resize_linux_arm.go
    │   │   ├── lib_transcode.go
    │   │   ├── lib_transcode_linux_amd64.go
    │   │   └── lib_transcode_linux_arm.go
    │   ├── plg_image_transcode/
    │   │   ├── index.go
    │   │   ├── transcode_bmp.go
    │   │   ├── transcode_dicom.go
    │   │   ├── transcode_svg.go
    │   │   └── transcode_tiff.go
    │   ├── plg_license/
    │   │   └── index.go
    │   ├── plg_metadata_sqlite/
    │   │   └── index.go
    │   ├── plg_override_actiondelete/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── filespage_thing.diff
    │   │   ├── index.go
    │   │   └── manifest.json
    │   ├── plg_override_download/
    │   │   ├── README.md
    │   │   ├── assets/
    │   │   │   └── pages/
    │   │   │       └── filespage/
    │   │   │           └── thing.js
    │   │   └── index.go
    │   ├── plg_search_example/
    │   │   └── index.go
    │   ├── plg_search_sqlitefts/
    │   │   ├── config/
    │   │   │   └── configuration.go
    │   │   ├── converter/
    │   │   │   └── index.go
    │   │   ├── crawler/
    │   │   │   ├── daemon.go
    │   │   │   ├── daemon_state.go
    │   │   │   ├── events.go
    │   │   │   ├── phase.go
    │   │   │   ├── phase_explore.go
    │   │   │   ├── phase_indexing.go
    │   │   │   ├── phase_maintain.go
    │   │   │   ├── phase_pause.go
    │   │   │   ├── phase_utils.go
    │   │   │   └── types.go
    │   │   ├── index.go
    │   │   ├── indexer/
    │   │   │   ├── error.go
    │   │   │   ├── index.go
    │   │   │   └── query.go
    │   │   ├── query.go
    │   │   └── workflow/
    │   │       └── index.go
    │   ├── plg_search_stateless/
    │   │   ├── config.go
    │   │   ├── index.go
    │   │   └── scoring.go
    │   ├── plg_security_scanner/
    │   │   └── index.go
    │   ├── plg_security_svg/
    │   │   └── index.go
    │   ├── plg_starter_http/
    │   │   └── index.go
    │   ├── plg_starter_http2/
    │   │   └── index.go
    │   ├── plg_starter_https/
    │   │   └── index.go
    │   ├── plg_starter_tor/
    │   │   └── index.go
    │   ├── plg_video_thumbnail/
    │   │   └── index.go
    │   ├── plg_video_transcoder/
    │   │   └── index.go
    │   ├── plg_widget_chat/
    │   │   ├── assets/
    │   │   │   ├── sidebar.diff
    │   │   │   └── sidebar_chat.js
    │   │   ├── config.go
    │   │   ├── db.go
    │   │   ├── handler.go
    │   │   ├── index.go
    │   │   ├── type.go
    │   │   ├── utils.go
    │   │   └── workflow.go
    │   ├── plg_widget_description/
    │   │   ├── assets/
    │   │   │   ├── sidebar.diff
    │   │   │   └── sidebar_description.js
    │   │   ├── config.go
    │   │   ├── db.go
    │   │   ├── handler.go
    │   │   ├── index.go
    │   │   ├── type.go
    │   │   └── utils.go
    │   ├── plg_widget_favourite/
    │   │   ├── assets/
    │   │   │   ├── favourite.diff
    │   │   │   └── sidebar_favourite.js
    │   │   ├── config.go
    │   │   └── index.go
    │   ├── plg_widget_pgp/
    │   │   ├── assets/
    │   │   │   ├── pgp.diff
    │   │   │   └── pgp.js
    │   │   └── index.go
    │   └── plg_widget_recent/
    │       ├── ai.go
    │       ├── config.go
    │       ├── db.go
    │       ├── decorator.go
    │       ├── index.go
    │       └── service.go
    └── routes.go
Download .txt
Showing preview only (1,247K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (16051 symbols across 671 files)

FILE: cmd/main.go
  function main (line 21) | func main() {
  function Run (line 25) | func Run(router *mux.Router) {
  function check (line 52) | func check(err error, msg string) {
  function withSignal (line 60) | func withSignal() context.Context {

FILE: embed.go
  function init (line 19) | func init() {

FILE: public/assets/boot/common.js
  function $error (line 1) | function $error(msg) {

FILE: public/assets/boot/ctrl_boot.d.ts
  type IChromecast (line 3) | interface IChromecast {
  type Window (line 8) | interface Window {

FILE: public/assets/boot/ctrl_boot_backoffice.js
  function main (line 4) | async function main() {
  function setup_device (line 21) | async function setup_device() {
  function setup_blue_death_screen (line 26) | async function setup_blue_death_screen() {
  function setup_history (line 33) | async function setup_history() {

FILE: public/assets/boot/ctrl_boot_frontoffice.js
  function main (line 10) | async function main() {
  function setup_xdg_open (line 37) | async function setup_xdg_open() {
  function setup_device (line 42) | async function setup_device() {
  function setup_blue_death_screen (line 53) | async function setup_blue_death_screen() {
  function setup_history (line 67) | async function setup_history() {
  function setup_title (line 71) | async function setup_title(config) {
  function setup_polyfill (line 75) | async function setup_polyfill() {
  function verify_origin (line 81) | async function verify_origin(config) {
  function verify_iframe_origin (line 96) | async function verify_iframe_origin(_) {

FILE: public/assets/components/breadcrumb.js
  class ComponentBreadcrumb (line 19) | class ComponentBreadcrumb extends HTMLElement {
    method constructor (line 20) | constructor() {
    method __init (line 29) | async __init() {
    method attributeChangedCallback (line 46) | attributeChangedCallback(name, oldValue, newValue) {
    method observedAttributes (line 60) | static get observedAttributes() {
    method renderPath (line 64) | async renderPath({ path = "", previous }) {
    method renderIndicator (line 146) | async renderIndicator() {
    method setupDragDropTarget (line 171) | setupDragDropTarget() {
    method __htmlLogout (line 196) | __htmlLogout() {
    method __normalised (line 205) | __normalised(path) {
  function init (line 212) | function init() {

FILE: public/assets/components/decorator_shell_filemanager.js
  function init (line 57) | function init() {

FILE: public/assets/components/dropdown.js
  class ComponentDropdown (line 6) | class ComponentDropdown extends HTMLElement {
    method constructor (line 7) | constructor() {
    method connectedCallback (line 12) | async connectedCallback() {
    method observedAttributes (line 16) | static get observedAttributes() {
    method render (line 20) | render() {

FILE: public/assets/components/fab.js
  class ComponentFab (line 4) | class ComponentFab extends HTMLButtonElement {
    method constructor (line 5) | constructor() {
    method render (line 11) | async render($icon) {

FILE: public/assets/components/form.js
  function formTmpl (line 8) | function formTmpl(options = {}) {
  function $renderInput (line 45) | function $renderInput(options = {}) {
  function format (line 331) | function format(name) {
  function multicomplete (line 346) | function multicomplete(input, datalist) {

FILE: public/assets/components/icon.js
  class Icon (line 1) | class Icon extends HTMLElement {
    method observedAttributes (line 2) | static get observedAttributes() {
    method attributeChangedCallback (line 6) | attributeChangedCallback() {
    method render (line 14) | render({ alt, img }) {
    method _mapOfIcon (line 22) | _mapOfIcon(name) {

FILE: public/assets/components/loader.js
  class Loader (line 5) | class Loader extends HTMLElement {
    method constructor (line 6) | constructor() {
    method disconnectedCallback (line 15) | disconnectedCallback() {
    method render (line 19) | render({ inline }) {
  function createLoader (line 47) | function createLoader($parent, opts = {}) {
  function toggle (line 83) | function toggle($node, show = false) {

FILE: public/assets/components/modal.js
  function createModal (line 8) | function createModal(opts) {
  constant MODAL_LEFT_BUTTON (line 15) | const MODAL_LEFT_BUTTON = 1;
  constant MODAL_RIGHT_BUTTON (line 16) | const MODAL_RIGHT_BUTTON = 2;
  constant MODAL_QUIT (line 17) | const MODAL_QUIT = 0;
  class ModalComponent (line 36) | class ModalComponent extends HTMLElement {
    method connectedCallback (line 37) | async connectedCallback() {
    method trigger (line 41) | trigger($node, { withButtonsLeft = null, withButtonsRight = null, onQu...

FILE: public/assets/components/notification.js
  class NotificationComponent (line 25) | class NotificationComponent extends HTMLElement {
    method connectedCallback (line 28) | async connectedCallback() {
    method trigger (line 32) | async trigger(message, type) {
    method run (line 44) | async run() {
  function find (line 77) | function find() {
  class Notification (line 83) | class Notification {
    method info (line 84) | static info(msg) {
    method success (line 88) | static success(msg) {
    method error (line 92) | static error(msg) {

FILE: public/assets/components/sidebar.js
  function ctrlSidebar (line 13) | async function ctrlSidebar(render, {}) {
  function init (line 131) | function init() {

FILE: public/assets/components/sidebar_files.js
  function ctrlNavigationPane (line 12) | async function ctrlNavigationPane(render, { $sidebar, path }) {
  function _createListOfFiles (line 98) | async function _createListOfFiles(path, { basename = null, dirname = nul...

FILE: public/assets/components/sidebar_tags.js
  function ctrlTagPane (line 11) | async function ctrlTagPane(render, { tags, path }) {

FILE: public/assets/components/skeleton.js
  function generateSkeleton (line 1) | function generateSkeleton(n) {

FILE: public/assets/embed/filestash-image.js
  class FilestashImage (line 1) | class FilestashImage extends HTMLElement {
    method constructor (line 2) | constructor() {
    method observedAttributes (line 15) | static get observedAttributes() {
    method attributeChangedCallback (line 19) | attributeChangedCallback(name, oldValue, newValue) {
    method disconnectedCallback (line 32) | disconnectedCallback() {
    method connectedCallback (line 37) | connectedCallback() {

FILE: public/assets/embed/filestash-map.js
  class FilestashMap (line 1) | class FilestashMap extends HTMLElement {
    method constructor (line 2) | constructor() {
    method observedAttributes (line 14) | static get observedAttributes() {
    method attributeChangedCallback (line 18) | attributeChangedCallback(name, oldValue, newValue) {
    method disconnectedCallback (line 31) | disconnectedCallback() {
    method connectedCallback (line 36) | connectedCallback() {

FILE: public/assets/embed/filestash-table.js
  class FilestashTable (line 1) | class FilestashTable extends HTMLElement {
    method constructor (line 2) | constructor() {
    method observedAttributes (line 14) | static get observedAttributes() {
    method attributeChangedCallback (line 18) | attributeChangedCallback(name, oldValue, newValue) {
    method disconnectedCallback (line 31) | disconnectedCallback() {
    method connectedCallback (line 36) | connectedCallback() {

FILE: public/assets/helpers/loader.js
  function loadJS (line 3) | async function loadJS(baseURL, path, opts = {}) {
  function loadCSS (line 18) | async function loadCSS(baseURL, path) {
  function loadWorker (line 32) | async function loadWorker(baseURL, path, opts = {}) {
  function loadCSSInline (line 57) | async function loadCSSInline(baseURL, filename) {
  function CSS (line 66) | async function CSS(baseURL, ...arrayOfFilenames) {

FILE: public/assets/helpers/loader_wasm.js
  constant DEBUG (line 1) | const DEBUG = false;
  function setWasiInstance (line 7) | function setWasiInstance(instance) {
  function writeFS (line 42) | function writeFS(buffer, path = "") {
  function readFS (line 53) | function readFS(fd) {
  function clearFS (line 62) | function clearFS() {
  function getFile (line 69) | function getFile(path) {
  method fd_write (line 194) | fd_write(fd, iovs, iovs_len, nwritten) {
  method fd_read (line 233) | fd_read(fd, iovs, iovs_len, nread) {
  method fd_pread (line 269) | fd_pread(fd, iovs, iovs_len, offset_lo, offset_hi, nread) {
  method fd_seek (line 303) | fd_seek(fd, offsetBigInt, _, whence) {
  method fd_close (line 330) | fd_close(fd) {
  method _emscripten_memcpy_js (line 338) | _emscripten_memcpy_js(dest, src, num) {
  method emscripten_resize_heap (line 344) | emscripten_resize_heap(requested) {
  method environ_sizes_get (line 349) | environ_sizes_get() {
  method environ_get (line 354) | environ_get() {
  method clock_time_get (line 359) | clock_time_get() {
  method __syscall_openat (line 364) | __syscall_openat(dirFd, pathPtr, flags, mode) {
  method __syscall_stat64 (line 380) | __syscall_stat64(pathPtr, buf) {
  method __cxa_throw (line 429) | __cxa_throw(ptr, type, destructor) {
  method random_get (line 434) | random_get() {
  method proc_exit (line 439) | proc_exit() {
  method __syscall_fstat64 (line 444) | __syscall_fstat64(fd, buf) {

FILE: public/assets/helpers/log.js
  function report (line 4) | function report(msg, err, link, lineNo, columnNo) {

FILE: public/assets/helpers/sdk.js
  function isSDK (line 4) | function isSDK() {
  function urlSDK (line 9) | function urlSDK(url) {

FILE: public/assets/index.js
  function render (line 25) | function render(module, $app, opts = {}) {
  function assertArgs (line 30) | function assertArgs(module, $app) {
  function execute (line 35) | function execute(module, $app, opts) {

FILE: public/assets/lib/ajax.js
  function parseDataUrl (line 49) | function parseDataUrl(url) {
  function processError (line 69) | function processError(xhr, err) {

FILE: public/assets/lib/animate.d.ts
  type TransitionEnter (line 1) | type TransitionEnter = {
  type TransitionLeave (line 5) | type TransitionLeave = {
  type AnimationFrames (line 9) | type AnimationFrames = {

FILE: public/assets/lib/animate.js
  function transition (line 3) | function transition($node, opts = {}) {
  function animate (line 13) | function animate($node, opts = {}) {

FILE: public/assets/lib/assert.js
  class assert (line 1) | class assert {
    method type (line 9) | static type(object, type, msg) {
    method typeof (line 22) | static typeof(object, type, msg) {
    method truthy (line 33) | static truthy(object, msg) {
    method fail (line 42) | static fail(msg) {

FILE: public/assets/lib/chromecast.js
  class ChromecastManager (line 1) | class ChromecastManager {
    method init (line 2) | init() {
    method origin (line 22) | origin() {
    method isAvailable (line 26) | isAvailable() {
    method createRequest (line 39) | createRequest(mediaInfo, authorization) {
    method context (line 53) | context() {
    method session (line 58) | session() {
    method media (line 64) | media() {

FILE: public/assets/lib/dom.js
  function qs (line 1) | function qs($node, selector) {
  function qsa (line 8) | function qsa($node, selector) {
  function safe (line 13) | function safe(str) {

FILE: public/assets/lib/error.d.ts
  class AjaxError (line 1) | class AjaxError extends Error {
  class ApplicationError (line 8) | class ApplicationError extends Error {

FILE: public/assets/lib/error.js
  class AjaxError (line 1) | class AjaxError extends Error {
    method constructor (line 2) | constructor(message, err = null, code = "UNDEFINED_CODE") {
    method code (line 9) | code() {
    method err (line 13) | err() {
    method type (line 17) | type() {
  class ApplicationError (line 22) | class ApplicationError extends Error {
    method constructor (line 23) | constructor(message, debug) {
    method type (line 28) | type() {
    method debug (line 32) | debug() {

FILE: public/assets/lib/form.js
  function mutateForm (line 5) | function mutateForm(formSpec, formState) {
  function createFormNodes (line 22) | async function createFormNodes(node, { renderNode, renderLeaf, renderInp...
  function createForm (line 116) | async function createForm(node, opts) {

FILE: public/assets/lib/path.js
  function basename (line 1) | function basename(str, sep = "/") {
  function extname (line 5) | function extname(str) {
  function join (line 9) | function join(baseURL, segment) {
  function forwardURLParams (line 14) | function forwardURLParams(url, allowed = []) {

FILE: public/assets/lib/polyfill.js
  function replaceChildren (line 5) | function replaceChildren(...new_children) {

FILE: public/assets/lib/random.js
  function gid (line 1) | function gid(prefix = "") {
  function randomString (line 16) | function randomString(size = 16) {

FILE: public/assets/lib/rx.js
  function effect (line 9) | function effect(obs) {
  function applyMutation (line 21) | function applyMutation($node, ...keys) {
  function applyMutations (line 27) | function applyMutations($node, ...keys) {
  function stateMutation (line 33) | function stateMutation($node, attr) {
  function preventDefault (line 38) | function preventDefault() {
  function onClick (line 42) | function onClick($node, opts = { preventDefault: false }) {
  function onLoad (line 56) | function onLoad($node) {

FILE: public/assets/lib/settings.js
  function settings_get (line 3) | function settings_get(key, def = null) {
  function settings_put (line 10) | function settings_put(key, value) {

FILE: public/assets/lib/skeleton/index.js
  function load (line 31) | async function load(route, opts) {
  function createElement (line 59) | function createElement(str) {
  function createFragment (line 66) | function createFragment(str) {
  function createRender (line 75) | function createRender($parent) {
  function nop (line 85) | function nop() { Promise.resolve(); }

FILE: public/assets/lib/skeleton/lifecycle.js
  function init (line 3) | async function init($root) {
  function onDestroy (line 11) | async function onDestroy(fn) {

FILE: public/assets/lib/skeleton/router.js
  function init (line 9) | async function init($root) {
  function navigate (line 18) | async function navigate(href) {
  function currentRoute (line 31) | function currentRoute(r, notFoundRoute) {
  function _getHref (line 41) | function _getHref($node, $root) {

FILE: public/assets/lib/store.js
  function settingsGet (line 1) | function settingsGet(initialValues, prefix = "") {
  function settingsSave (line 12) | function settingsSave(currentValues, prefix = "") {

FILE: public/assets/lib/vendor/bcrypt.js
  function random (line 28) | function random(len) {
  function stringToBytes (line 248) | function stringToBytes(str) {
  function base64_encode (line 297) | function base64_encode(b, len) {
  function base64_decode (line 334) | function base64_decode(s, len) {
  function _encipher (line 846) | function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905...
  function _streamtoword (line 876) | function _streamtoword(data, offp) {
  function _key (line 889) | function _key(key, P, S) {
  function _ekskey (line 917) | function _ekskey(data, key, P, S) {
  function _crypt (line 961) | function _crypt(b, salt, rounds, callback, progressCallback) {
  function _hash (line 1049) | function _hash(s, salt, callback, progressCallback) {

FILE: public/assets/lib/vendor/codemirror/addon/comment/comment.js
  function firstNonWS (line 18) | function firstNonWS(str) {
  function probablyInsideString (line 48) | function probablyInsideString(cm, pos, line) {
  function getMode (line 52) | function getMode(cm, pos) {

FILE: public/assets/lib/vendor/codemirror/addon/comment/continuecomment.js
  function continueComment (line 14) | function continueComment(cm) {
  function nonspaceAfter (line 87) | function nonspaceAfter(ch, str) {
  function continueLineCommentEnabled (line 93) | function continueLineCommentEnabled(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/dialog/dialog.js
  function dialogDiv (line 14) | function dialogDiv(cm, template, bottom) {
  function closeNotification (line 32) | function closeNotification(cm, newVal) {
  function close (line 45) | function close(newVal) {
  function close (line 106) | function close() {
  function close (line 145) | function close() {

FILE: public/assets/lib/vendor/codemirror/addon/display/autorefresh.js
  function startListening (line 23) | function startListening(cm, state) {
  function stopListening (line 42) | function stopListening(_cm, state) {

FILE: public/assets/lib/vendor/codemirror/addon/display/fullscreen.js
  function setFullscreen (line 21) | function setFullscreen(cm) {
  function setNormal (line 32) | function setNormal(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/display/panel.js
  function Panel (line 51) | function Panel(cm, node, options, height) {
  function initPanels (line 78) | function initPanels(cm) {
  function removePanels (line 114) | function removePanels(cm) {
  function isAtTop (line 128) | function isAtTop(cm, dom) {

FILE: public/assets/lib/vendor/codemirror/addon/display/placeholder.js
  function clearPlaceholder (line 33) | function clearPlaceholder(cm) {
  function setPlaceholder (line 39) | function setPlaceholder(cm) {
  function onComposition (line 51) | function onComposition(cm) {
  function onBlur (line 64) | function onBlur(cm) {
  function onChange (line 67) | function onChange(cm) {
  function isEmpty (line 75) | function isEmpty(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/display/rulers.js
  function drawRulers (line 28) | function drawRulers(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/edit/closebrackets.js
  function getOption (line 33) | function getOption(conf, name) {
  function ensureBound (line 40) | function ensureBound(chars) {
  function handler (line 48) | function handler(ch) {
  function getConfig (line 52) | function getConfig(cm) {
  function handleBackspace (line 59) | function handleBackspace(cm) {
  function handleEnter (line 76) | function handleEnter(cm) {
  function moveSel (line 100) | function moveSel(cm, dir) {
  function contractSelection (line 111) | function contractSelection(sel) {
  function handleChar (line 117) | function handleChar(cm, ch) {
  function charsAround (line 190) | function charsAround(cm, pos) {
  function stringStartsAfter (line 196) | function stringStartsAfter(cm, pos) {

FILE: public/assets/lib/vendor/codemirror/addon/edit/closetag.js
  function autoCloseGT (line 55) | function autoCloseGT(cm) {
  function autoCloseCurrent (line 108) | function autoCloseCurrent(cm, typingSlash) {
  function autoCloseSlash (line 148) | function autoCloseSlash(cm) {
  function indexOf (line 155) | function indexOf(collection, elt) {
  function closingTagExists (line 164) | function closingTagExists(cm, context, tagName, pos, newTag) {

FILE: public/assets/lib/vendor/codemirror/addon/edit/continuelist.js
  function incrementRemainingMarkdownListNumbers (line 67) | function incrementRemainingMarkdownListNumbers(cm, pos) {

FILE: public/assets/lib/vendor/codemirror/addon/edit/matchbrackets.js
  function bracketRegex (line 19) | function bracketRegex(config) {
  function findMatchingBracket (line 23) | function findMatchingBracket(cm, where, config) {
  function scanForBracket (line 54) | function scanForBracket(cm, where, dir, style, config) {
  function matchBrackets (line 82) | function matchBrackets(cm, autoclear, config) {
  function doMatchBrackets (line 112) | function doMatchBrackets(cm) {
  function clearHighlighted (line 122) | function clearHighlighted(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/edit/matchtags.js
  function clear (line 28) | function clear(cm) {
  function doMatchTags (line 34) | function doMatchTags(cm) {
  function maybeUpdateMatch (line 55) | function maybeUpdateMatch(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/fold/brace-fold.js
  function bracketFolding (line 14) | function bracketFolding(pairs) {
  function hasImport (line 77) | function hasImport(line) {
  function hasInclude (line 101) | function hasInclude(line) {

FILE: public/assets/lib/vendor/codemirror/addon/fold/foldcode.js
  function doFold (line 14) | function doFold(cm, pos, options, force) {
  function makeWidget (line 63) | function makeWidget(cm, options, range) {
  function getOption (line 147) | function getOption(cm, options, name) {

FILE: public/assets/lib/vendor/codemirror/addon/fold/foldgutter.js
  function State (line 41) | function State(options) {
  function parseOptions (line 46) | function parseOptions(opts) {
  function isFolded (line 54) | function isFolded(cm, line) {
  function marker (line 65) | function marker(spec) {
  function updateFoldInfo (line 75) | function updateFoldInfo(cm, from, to) {
  function classTest (line 104) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
  function updateInViewport (line 106) | function updateInViewport(cm) {
  function onGutterClick (line 115) | function onGutterClick(cm, line, gutter) {
  function optionChange (line 125) | function optionChange(cm, option) {
  function onChange (line 129) | function onChange(cm) {
  function onViewportChange (line 138) | function onViewportChange(cm) {
  function onFold (line 162) | function onFold(cm, from) {

FILE: public/assets/lib/vendor/codemirror/addon/fold/indent-fold.js
  function lineIndent (line 14) | function lineIndent(cm, lineNo) {

FILE: public/assets/lib/vendor/codemirror/addon/fold/markdown-fold.js
  function isHeader (line 17) | function isHeader(lineNo) {
  function headerLevel (line 22) | function headerLevel(lineNo, line, nextLine) {

FILE: public/assets/lib/vendor/codemirror/addon/fold/xml-fold.js
  function cmp (line 15) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }
  function Iter (line 21) | function Iter(cm, line, ch, range) {
  function tagAt (line 28) | function tagAt(iter, ch) {
  function nextLine (line 33) | function nextLine(iter) {
  function prevLine (line 39) | function prevLine(iter) {
  function toTagEnd (line 46) | function toTagEnd(iter) {
  function toTagStart (line 57) | function toTagStart(iter) {
  function toNextTag (line 69) | function toNextTag(iter) {
  function toPrevTag (line 79) | function toPrevTag(iter) {
  function findMatchingClose (line 91) | function findMatchingClose(iter, tag) {
  function findMatchingOpen (line 112) | function findMatchingOpen(iter, tag) {

FILE: public/assets/lib/vendor/codemirror/addon/hint/css-hint.js
  function add (line 41) | function add(keywords) {

FILE: public/assets/lib/vendor/codemirror/addon/hint/html-hint.js
  function populate (line 335) | function populate(obj) {
  function htmlHint (line 345) | function htmlHint(cm, options) {

FILE: public/assets/lib/vendor/codemirror/addon/hint/javascript-hint.js
  function forEach (line 14) | function forEach(arr, f) {
  function arrayContains (line 18) | function arrayContains(arr, item) {
  function scriptHint (line 31) | function scriptHint(editor, keywords, getToken, options) {
  function javascriptHint (line 62) | function javascriptHint(editor, options) {
  function getCoffeeScriptToken (line 69) | function getCoffeeScriptToken(editor, cur) {
  function coffeescriptHint (line 87) | function coffeescriptHint(editor, options) {
  function forAllProps (line 102) | function forAllProps(obj, callback) {
  function getCompletions (line 111) | function getCompletions(token, context, keywords, options) {

FILE: public/assets/lib/vendor/codemirror/addon/hint/show-hint.js
  function Completion (line 55) | function Completion(cm, options) {
  function parseOptions (line 159) | function parseOptions(cm, pos, options) {
  function getText (line 171) | function getText(completion) {
  function buildKeyMap (line 176) | function buildKeyMap(completion, handle) {
  function getHintElement (line 219) | function getHintElement(hintsElement, el) {
  function Widget (line 226) | function Widget(completion, data) {
  function applicableHelpers (line 437) | function applicableHelpers(cm, helpers) {
  function fetchHints (line 445) | function fetchHints(hint, cm, options, callback) {
  function resolveAutoHints (line 455) | function resolveAutoHints(cm, pos) {

FILE: public/assets/lib/vendor/codemirror/addon/hint/sql-hint.js
  function isArray (line 24) | function isArray(val) { return Object.prototype.toString.call(val) == "[...
  function getModeConf (line 26) | function getModeConf(editor, field) {
  function getKeywords (line 30) | function getKeywords(editor) {
  function getIdentifierQuote (line 34) | function getIdentifierQuote(editor) {
  function getText (line 38) | function getText(item) {
  function wrapTable (line 42) | function wrapTable(name, value) {
  function parseTables (line 48) | function parseTables(input) {
  function getTable (line 62) | function getTable(name) {
  function shallowClone (line 66) | function shallowClone(object) {
  function match (line 73) | function match(string, word) {
  function addMatches (line 79) | function addMatches(result, search, wordlist, formatter) {
  function cleanName (line 95) | function cleanName(name) {
  function insertIdentifierQuotes (line 108) | function insertIdentifierQuotes(name) {
  function nameCompletion (line 122) | function nameCompletion(cur, token, result, editor) {
  function eachWord (line 187) | function eachWord(lineText, f) {
  function findTableByAlias (line 193) | function findTableByAlias(alias, editor) {

FILE: public/assets/lib/vendor/codemirror/addon/hint/xml-hint.js
  function matches (line 16) | function matches(hint, typed, matchInMiddle) {
  function getHints (line 21) | function getHints(cm, options) {

FILE: public/assets/lib/vendor/codemirror/addon/lint/javascript-lint.js
  function validator (line 17) | function validator(text, options) {
  function parseErrors (line 34) | function parseErrors(errors, output) {

FILE: public/assets/lib/vendor/codemirror/addon/lint/lint.js
  function showTooltip (line 16) | function showTooltip(cm, e, content) {
  function rm (line 37) | function rm(elt) {
  function hideTooltip (line 40) | function hideTooltip(tt) {
  function showTooltipFor (line 47) | function showTooltipFor(cm, e, content, node) {
  function LintState (line 64) | function LintState(cm, conf, hasGutter) {
  function clearMarks (line 96) | function clearMarks(cm) {
  function clearErrorLines (line 105) | function clearErrorLines(cm) {
  function makeMarker (line 112) | function makeMarker(cm, labels, severity, multiple, tooltips) {
  function getMaxSeverity (line 127) | function getMaxSeverity(a, b) {
  function groupByLine (line 132) | function groupByLine(annotations) {
  function annotationTooltip (line 141) | function annotationTooltip(ann) {
  function lintAsync (line 154) | function lintAsync(cm, getAnnotations) {
  function startLinting (line 170) | function startLinting(cm) {
  function updateLinting (line 192) | function updateLinting(cm, annotationsNotSorted) {
  function onChange (line 231) | function onChange(cm) {
  function popupTooltips (line 238) | function popupTooltips(cm, annotations, e) {
  function onMouseOver (line 248) | function onMouseOver(cm, e) {

FILE: public/assets/lib/vendor/codemirror/addon/merge/merge.js
  function DiffView (line 18) | function DiffView(mv, type) {
  function ensureDiff (line 75) | function ensureDiff(dv) {
  function registerUpdate (line 85) | function registerUpdate(dv) {
  function registerScroll (line 150) | function registerScroll(dv, otherDv) {
  function syncScroll (line 160) | function syncScroll(dv, toOrig) {
  function getOffsets (line 206) | function getOffsets(editor, around) {
  function setScrollLock (line 213) | function setScrollLock(dv, val, action) {
  function removeClass (line 221) | function removeClass(editor, line, classes) {
  function clearMarks (line 230) | function clearMarks(editor, arr, classes) {
  function updateMarks (line 242) | function updateMarks(editor, diff, state, type, classes) {
  function addClass (line 262) | function addClass(editor, lineNr, classes, main, start, end) {
  function markChanges (line 272) | function markChanges(editor, diff, type, marks, from, to, classes) {
  function makeConnections (line 316) | function makeConnections(dv) {
  function getMatchingOrigLine (line 338) | function getMatchingOrigLine(editLine, chunks) {
  function alignableFor (line 353) | function alignableFor(cm, chunks, isOrig) {
  function mergeAlignable (line 375) | function mergeAlignable(result, origAlignable, chunks, setIndex) {
  function findAlignedLines (line 410) | function findAlignedLines(dv, other) {
  function alignChunks (line 427) | function alignChunks(dv, force) {
  function alignLines (line 463) | function alignLines(cm, cmOffset, lines, aligners) {
  function padAbove (line 477) | function padAbove(cm, line, size) {
  function drawConnectorsForChunk (line 489) | function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) {
  function copyChunk (line 532) | function copyChunk(dv, to, from, chunk) {
  function buildGap (line 607) | function buildGap(dv) {
  function asString (line 657) | function asString(obj) {
  function getDiff (line 664) | function getDiff(a, b, ignoreWhitespace) {
  function getChunks (line 681) | function getChunks(diff) {
  function endOfLineClean (line 709) | function endOfLineClean(diff, i) {
  function startOfLineClean (line 718) | function startOfLineClean(diff, i) {
  function chunkBoundariesAround (line 727) | function chunkBoundariesAround(chunks, n, nInEdit) {
  function collapseSingle (line 743) | function collapseSingle(cm, from, to) {
  function collapseStretch (line 765) | function collapseStretch(size, editors) {
  function unclearNearChunks (line 779) | function unclearNearChunks(dv, margin, off, clear) {
  function collapseIdenticalStretches (line 789) | function collapseIdenticalStretches(mv, margin) {
  function elt (line 813) | function elt(tag, content, className, style) {
  function clear (line 822) | function clear(node) {
  function attrs (line 827) | function attrs(elt) {
  function copyObj (line 832) | function copyObj(obj, target) {
  function moveOver (line 838) | function moveOver(pos, str, copy, other) {
  function TrackAlignable (line 857) | function TrackAlignable(cm) {
  function posMin (line 977) | function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a ...
  function posMax (line 978) | function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a ...
  function posEq (line 979) | function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }
  function findPrevDiff (line 981) | function findPrevDiff(chunks, start, isOrig) {
  function findNextDiff (line 989) | function findNextDiff(chunks, start, isOrig) {
  function goNearbyDiff (line 997) | function goNearbyDiff(cm, dir) {

FILE: public/assets/lib/vendor/codemirror/addon/mode/loadmode.js
  function splitCallback (line 15) | function splitCallback(cont, n) {
  function ensureDeps (line 19) | function ensureDeps(mode, cont, options) {

FILE: public/assets/lib/vendor/codemirror/addon/mode/multiplex.js
  function indexOf (line 18) | function indexOf(string, pattern, from, returnEnd) {

FILE: public/assets/lib/vendor/codemirror/addon/mode/multiplex_test.js
  function MT (line 22) | function MT(name) {

FILE: public/assets/lib/vendor/codemirror/addon/mode/simple.js
  function ensureState (line 61) | function ensureState(states, name) {
  function toRegex (line 66) | function toRegex(val, caret) {
  function asToken (line 79) | function asToken(val) {
  function Rule (line 89) | function Rule(data, states) {
  function tokenFunction (line 96) | function tokenFunction(states, config) {
  function cmp (line 158) | function cmp(a, b) {
  function enterLocalMode (line 170) | function enterLocalMode(config, state, spec, token) {
  function indexOf (line 186) | function indexOf(val, arr) {
  function indentFunction (line 190) | function indentFunction(states, meta) {

FILE: public/assets/lib/vendor/codemirror/addon/runmode/colorize.js
  function textContent (line 16) | function textContent(node, out) {

FILE: public/assets/lib/vendor/codemirror/addon/runmode/runmode-standalone.js
  function copyObj (line 4) | function copyObj(obj, target, overwrite) {
  function countColumn (line 14) | function countColumn(string, end, tabSize, startIndex, startValue) {
  function nothing (line 29) | function nothing() {}
  function createObj (line 31) | function createObj(base, props) {
  function defineMode (line 134) | function defineMode(name, mode) {
  function defineMIME (line 140) | function defineMIME(mime, spec) {
  function resolveMode (line 146) | function resolveMode(spec) {
  function getMode (line 165) | function getMode(options, spec) {
  function extendMode (line 189) | function extendMode(mode, properties) {
  function copyState (line 194) | function copyState(mode, state) {
  function innerMode (line 208) | function innerMode(mode, state) {
  function startState (line 219) | function startState(mode, a1, a2) {

FILE: public/assets/lib/vendor/codemirror/addon/runmode/runmode.node.js
  function copyObj (line 3) | function copyObj(obj, target, overwrite) {
  function countColumn (line 13) | function countColumn(string, end, tabSize, startIndex, startValue) {
  function nothing (line 28) | function nothing() {}
  function createObj (line 30) | function createObj(base, props) {
  function defineMode (line 133) | function defineMode(name, mode) {
  function defineMIME (line 139) | function defineMIME(mime, spec) {
  function resolveMode (line 145) | function resolveMode(spec) {
  function getMode (line 164) | function getMode(options, spec) {
  function extendMode (line 188) | function extendMode(mode, properties) {
  function copyState (line 193) | function copyState(mode, state) {
  function innerMode (line 207) | function innerMode(mode, state) {
  function startState (line 218) | function startState(mode, a1, a2) {

FILE: public/assets/lib/vendor/codemirror/addon/scroll/annotatescrollbar.js
  function Annotation (line 21) | function Annotation(cm, options) {
  function getY (line 76) | function getY(pos, top) {

FILE: public/assets/lib/vendor/codemirror/addon/scroll/scrollpastend.js
  function onChange (line 28) | function onChange(cm, change) {
  function updateBottomMargin (line 33) | function updateBottomMargin(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/scroll/simplescrollbars.js
  function Bar (line 14) | function Bar(cls, orientation, scroll) {
  function SimpleScrollbars (line 96) | function SimpleScrollbars(cls, place, scroll) {

FILE: public/assets/lib/vendor/codemirror/addon/search/jump-to-line.js
  function dialog (line 19) | function dialog(cm, text, shortText, deflt, f) {
  function getJumpDialog (line 24) | function getJumpDialog(cm) {
  function interpretLine (line 28) | function interpretLine(cm, string) {

FILE: public/assets/lib/vendor/codemirror/addon/search/match-highlighter.js
  function State (line 42) | function State(options) {
  function cursorActivity (line 71) | function cursorActivity(cm) {
  function onFocus (line 76) | function onFocus(cm) {
  function scheduleHighlight (line 84) | function scheduleHighlight(cm, state) {
  function addOverlay (line 89) | function addOverlay(cm, query, hasBoundary, style) {
  function removeOverlay (line 101) | function removeOverlay(cm) {
  function highlightMatches (line 113) | function highlightMatches(cm) {
  function isWord (line 136) | function isWord(cm, from, to) {
  function boundariesAround (line 153) | function boundariesAround(stream, re) {
  function makeOverlay (line 158) | function makeOverlay(query, hasBoundary, style) {

FILE: public/assets/lib/vendor/codemirror/addon/search/matchesonscrollbar.js
  function SearchAnnotation (line 20) | function SearchAnnotation(cm, query, caseFold, options) {
  function offsetLine (line 60) | function offsetLine(line, changeStart, sizeChange) {

FILE: public/assets/lib/vendor/codemirror/addon/search/search.js
  function searchOverlay (line 25) | function searchOverlay(query, caseInsensitive) {
  function SearchState (line 45) | function SearchState() {
  function getSearchState (line 50) | function getSearchState(cm) {
  function queryCaseInsensitive (line 54) | function queryCaseInsensitive(query) {
  function getSearchCursor (line 58) | function getSearchCursor(cm, query, pos) {
  function persistentDialog (line 63) | function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {
  function dialog (line 74) | function dialog(cm, text, shortText, deflt, f) {
  function confirmDialog (line 79) | function confirmDialog(cm, text, shortText, fs) {
  function parseString (line 84) | function parseString(string) {
  function parseQuery (line 94) | function parseQuery(query) {
  function startSearch (line 107) | function startSearch(cm, state, query) {
  function doSearch (line 119) | function doSearch(cm, rev, persistent, immediate) {
  function findNext (line 170) | function findNext(cm, rev, callback) {cm.operation(function() {
  function clearSearch (line 183) | function clearSearch(cm) {cm.operation(function() {
  function el (line 192) | function el(tag, attrs) {
  function getQueryDialog (line 204) | function getQueryDialog(cm)  {
  function getReplaceQueryDialog (line 214) | function getReplaceQueryDialog(cm) {
  function getReplacementQueryDialog (line 220) | function getReplacementQueryDialog(cm) {
  function getDoReplaceConfirm (line 225) | function getDoReplaceConfirm(cm) {
  function replaceAll (line 234) | function replaceAll(cm, query, text) {
  function replace (line 245) | function replace(cm, all) {

FILE: public/assets/lib/vendor/codemirror/addon/search/searchcursor.js
  function regexpFlags (line 15) | function regexpFlags(regexp) {
  function ensureFlags (line 22) | function ensureFlags(regexp, flags) {
  function maybeMultiline (line 29) | function maybeMultiline(regexp) {
  function searchRegexpForward (line 33) | function searchRegexpForward(doc, regexp, start) {
  function searchRegexpForwardMultiline (line 45) | function searchRegexpForwardMultiline(doc, regexp, start) {
  function lastMatchIn (line 75) | function lastMatchIn(string, regexp, endMargin) {
  function searchRegexpBackward (line 90) | function searchRegexpBackward(doc, regexp, start) {
  function searchRegexpBackwardMultiline (line 102) | function searchRegexpBackwardMultiline(doc, regexp, start) {
  function adjustPos (line 136) | function adjustPos(orig, folded, pos, foldFunc) {
  function searchStringForward (line 148) | function searchStringForward(doc, query, start, caseFold) {
  function searchStringBackward (line 176) | function searchStringBackward(doc, query, start, caseFold) {
  function SearchCursor (line 203) | function SearchCursor(doc, query, pos, options) {

FILE: public/assets/lib/vendor/codemirror/addon/selection/active-line.js
  function clearActiveLines (line 32) | function clearActiveLines(cm) {
  function sameArray (line 40) | function sameArray(a, b) {
  function updateActiveLines (line 47) | function updateActiveLines(cm, ranges) {
  function selectionChange (line 69) | function selectionChange(cm, sel) {

FILE: public/assets/lib/vendor/codemirror/addon/selection/mark-selection.js
  function onCursorActivity (line 36) | function onCursorActivity(cm) {
  function onChange (line 41) | function onChange(cm) {
  function coverRange (line 50) | function coverRange(cm, from, to, addAt) {
  function clear (line 66) | function clear(cm) {
  function reset (line 72) | function reset(cm) {
  function update (line 79) | function update(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/selection/selection-pointer.js
  function mousemove (line 43) | function mousemove(cm, event) {
  function mouseout (line 54) | function mouseout(cm, event) {
  function reset (line 62) | function reset(cm) {
  function scheduleUpdate (line 67) | function scheduleUpdate(cm) {
  function update (line 77) | function update(cm) {

FILE: public/assets/lib/vendor/codemirror/addon/tern/tern.js
  function getFile (line 150) | function getFile(ts, name, c) {
  function findDoc (line 160) | function findDoc(ts, doc, name) {
  function resolveDoc (line 172) | function resolveDoc(ts, id) {
  function trackChange (line 178) | function trackChange(ts, doc, change) {
  function sendDoc (line 198) | function sendDoc(ts, doc) {
  function hint (line 207) | function hint(ts, cm, c) {
  function typeToIcon (line 241) | function typeToIcon(type) {
  function showContextInfo (line 253) | function showContextInfo(ts, cm, pos, queryName, c) {
  function updateArgHints (line 276) | function updateArgHints(ts, cm) {
  function showArgHints (line 318) | function showArgHints(ts, cm, pos) {
  function parseFnType (line 343) | function parseFnType(text) {
  function jumpToDef (line 376) | function jumpToDef(ts, cm) {
  function jumpBack (line 404) | function jumpBack(ts, cm) {
  function moveTo (line 410) | function moveTo(ts, curDoc, doc, start, end) {
  function findContext (line 419) | function findContext(doc, data) {
  function atInterestingExpression (line 449) | function atInterestingExpression(cm) {
  function rename (line 457) | function rename(ts, cm) {
  function selectName (line 468) | function selectName(ts, cm) {
  function applyChanges (line 487) | function applyChanges(ts, changes) {
  function buildRequest (line 507) | function buildRequest(ts, doc, query, pos) {
  function getFragmentAround (line 549) | function getFragmentAround(data, start, end) {
  function elt (line 580) | function elt(tagname, cls /*, ... elts*/) {
  function dialog (line 591) | function dialog(cm, text, f) {
  function tempTooltip (line 606) | function tempTooltip(cm, content, ts) {
  function onEditorActivity (line 632) | function onEditorActivity(cm, f) {
  function makeTooltip (line 645) | function makeTooltip(x, y, content, cm, className) {
  function remove (line 686) | function remove(node) {
  function fadeOut (line 691) | function fadeOut(tooltip) {
  function showError (line 696) | function showError(ts, cm, msg) {
  function closeArgHints (line 703) | function closeArgHints(ts) {
  function docValue (line 711) | function docValue(ts, doc) {
  function WorkerServer (line 719) | function WorkerServer(ts) {

FILE: public/assets/lib/vendor/codemirror/addon/tern/worker.js
  function getFile (line 26) | function getFile(file, c) {
  function startServer (line 31) | function startServer(defs, plugins, scripts) {

FILE: public/assets/lib/vendor/codemirror/addon/wrap/hardwrap.js
  function findParagraph (line 16) | function findParagraph(cm, pos, options) {
  function findBreakPoint (line 32) | function findBreakPoint(text, column, wrapOn, killTrailingSpace, forceBr...
  function wrapRange (line 55) | function wrapRange(cm, from, to, options) {

FILE: public/assets/lib/vendor/codemirror/bin/upload-release.js
  function post (line 12) | function post(host, path, body) {

FILE: public/assets/lib/vendor/codemirror/doc/activebookmark.js
  function updateSoon (line 9) | function updateSoon() {
  function update (line 16) | function update() {

FILE: public/assets/lib/vendor/codemirror/keymap/emacs.js
  function posEq (line 16) | function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }
  function addToRing (line 21) | function addToRing(str) {
  function growRingTop (line 25) | function growRingTop(str) {
  function getFromRing (line 29) | function getFromRing(n) { return killRing[killRing.length - (n ? Math.mi...
  function popFromRing (line 30) | function popFromRing() { if (killRing.length > 1) killRing.pop(); return...
  function _kill (line 35) | function _kill(cm, from, to, ring, text) {
  function byChar (line 50) | function byChar(cm, pos, dir) {
  function byWord (line 54) | function byWord(cm, pos, dir) {
  function byLine (line 58) | function byLine(cm, pos, dir) {
  function byPage (line 62) | function byPage(cm, pos, dir) {
  function byParagraph (line 66) | function byParagraph(cm, pos, dir) {
  function bySentence (line 81) | function bySentence(cm, pos, dir) {
  function byExpr (line 100) | function byExpr(cm, pos, dir) {
  function getPrefix (line 121) | function getPrefix(cm, precise) {
  function repeated (line 128) | function repeated(cmd) {
  function findEnd (line 137) | function findEnd(cm, pos, by, dir) {
  function move (line 148) | function move(by, dir) {
  function killTo (line 156) | function killTo(cm, by, dir, ring) {
  function _killRegion (line 165) | function _killRegion(cm, ring) {
  function addPrefix (line 177) | function addPrefix(cm, digit) {
  function maybeClearPrefix (line 190) | function maybeClearPrefix(cm, arg) {
  function clearPrefix (line 195) | function clearPrefix(cm) {
  function maybeDuplicateInput (line 201) | function maybeDuplicateInput(cm, event) {
  function maybeRemovePrefixMap (line 210) | function maybeRemovePrefixMap(cm, arg) {
  function clearMark (line 226) | function clearMark(cm) {
  function makePrompt (line 231) | function makePrompt(msg) {
  function getInput (line 241) | function getInput(cm, msg, f) {
  function operateOnWord (line 248) | function operateOnWord(cm, op) {
  function toEnclosingExpr (line 254) | function toEnclosingExpr(cm) {
  function regPrefix (line 538) | function regPrefix(d) {

FILE: public/assets/lib/vendor/codemirror/keymap/sublime.js
  function findPosSubword (line 21) | function findPosSubword(doc, start, dir) {
  function moveSubword (line 47) | function moveSubword(cm, dir) {
  function insertLine (line 105) | function insertLine(cm, above) {
  function wordAt (line 127) | function wordAt(cm, pos) {
  function addCursorToSelection (line 169) | function addCursorToSelection(cm, dir) {
  function isSelectedRange (line 190) | function isSelectedRange(ranges, from, to) {
  function selectBetweenBrackets (line 198) | function selectBetweenBrackets(cm) {
  function puncType (line 231) | function puncType(type) {
  function sortLines (line 342) | function sortLines(cm, caseSensitive, direction) {
  function modifyWordOrSelection (line 446) | function modifyWordOrSelection(cm, mod) {
  function getTarget (line 544) | function getTarget(cm) {
  function findAndGoTo (line 555) | function findAndGoTo(cm, forward) {

FILE: public/assets/lib/vendor/codemirror/keymap/vim.js
  function initVim$1 (line 46) | function initVim$1(CodeMirror) {
  function initVim (line 5969) | function initVim(CodeMirror5) {

FILE: public/assets/lib/vendor/codemirror/lib/codemirror.js
  function classTest (line 51) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
  function removeChildren (line 62) | function removeChildren(e) {
  function removeChildrenAndAdd (line 68) | function removeChildrenAndAdd(parent, e) {
  function elt (line 72) | function elt(tag, content, className, style) {
  function eltP (line 81) | function eltP(tag, content, className, style) {
  function contains (line 104) | function contains(parent, child) {
  function activeElt (line 115) | function activeElt(rootNode) {
  function addClass (line 131) | function addClass(node, cls) {
  function joinClasses (line 135) | function joinClasses(a, b) {
  function doc (line 148) | function doc(cm) { return cm.display.wrapper.ownerDocument }
  function root (line 150) | function root(cm) {
  function rootNode (line 154) | function rootNode(element) {
  function win (line 159) | function win(cm) { return doc(cm).defaultView }
  function bind (line 161) | function bind(f) {
  function copyObj (line 166) | function copyObj(obj, target, overwrite) {
  function countColumn (line 176) | function countColumn(string, end, tabSize, startIndex, startValue) {
  function indexOf (line 215) | function indexOf(array, elt) {
  function findColumn (line 233) | function findColumn(string, goal, tabSize) {
  function spaceStr (line 248) | function spaceStr(n) {
  function lst (line 254) | function lst(arr) { return arr[arr.length-1] }
  function map (line 256) | function map(array, f) {
  function insertSorted (line 262) | function insertSorted(array, value, score) {
  function nothing (line 268) | function nothing() {}
  function createObj (line 270) | function createObj(base, props) {
  function isWordCharBasic (line 283) | function isWordCharBasic(ch) {
  function isWordChar (line 287) | function isWordChar(ch, helper) {
  function isEmpty (line 293) | function isEmpty(obj) {
  function isExtendingChar (line 304) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
  function skipExtendingChars (line 307) | function skipExtendingChars(str, pos, dir) {
  function findFirst (line 315) | function findFirst(pred, from, to) {
  function iterateBidiSections (line 330) | function iterateBidiSections(order, from, to, f) {
  function getBidiPartAt (line 344) | function getBidiPartAt(order, ch, sticky) {
  function charType (line 390) | function charType(code) {
  function BidiSpan (line 403) | function BidiSpan(level, from, to) {
  function getOrder (line 536) | function getOrder(line, direction) {
  function getHandlers (line 560) | function getHandlers(emitter, type) {
  function off (line 564) | function off(emitter, type, f) {
  function signal (line 579) | function signal(emitter, type /*, values...*/) {
  function signalDOMEvent (line 589) | function signalDOMEvent(cm, e, override) {
  function signalCursorActivity (line 596) | function signalCursorActivity(cm) {
  function hasHandler (line 604) | function hasHandler(emitter, type) {
  function eventMixin (line 610) | function eventMixin(ctor) {
  function e_preventDefault (line 618) | function e_preventDefault(e) {
  function e_stopPropagation (line 622) | function e_stopPropagation(e) {
  function e_defaultPrevented (line 626) | function e_defaultPrevented(e) {
  function e_stop (line 629) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
  function e_target (line 631) | function e_target(e) {return e.target || e.srcElement}
  function e_button (line 632) | function e_button(e) {
  function zeroWidthElement (line 653) | function zeroWidthElement(measure) {
  function hasBadBidiRects (line 668) | function hasBadBidiRects(measure) {
  function hasBadZoomedRects (line 717) | function hasBadZoomedRects(measure) {
  function defineMode (line 731) | function defineMode(name, mode) {
  function defineMIME (line 737) | function defineMIME(mime, spec) {
  function resolveMode (line 743) | function resolveMode(spec) {
  function getMode (line 762) | function getMode(options, spec) {
  function extendMode (line 786) | function extendMode(mode, properties) {
  function copyState (line 791) | function copyState(mode, state) {
  function innerMode (line 805) | function innerMode(mode, state) {
  function startState (line 816) | function startState(mode, a1, a2) {
  function getLine (line 906) | function getLine(doc, n) {
  function getBetween (line 922) | function getBetween(doc, start, end) {
  function getLines (line 934) | function getLines(doc, from, to) {
  function updateLineHeight (line 942) | function updateLineHeight(line, height) {
  function lineNo (line 949) | function lineNo(line) {
  function lineAtHeight (line 963) | function lineAtHeight(chunk, h) {
  function isLine (line 983) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
  function lineNumberFor (line 985) | function lineNumberFor(options, i) {
  function Pos (line 990) | function Pos(line, ch, sticky) {
  function cmp (line 1001) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
  function equalCursorPos (line 1003) | function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b)...
  function copyPos (line 1005) | function copyPos(x) {return Pos(x.line, x.ch)}
  function maxPos (line 1006) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
  function minPos (line 1007) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
  function clipLine (line 1011) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
  function clipPos (line 1012) | function clipPos(doc, pos) {
  function clipToLen (line 1018) | function clipToLen(pos, linelen) {
  function clipPosArray (line 1024) | function clipPosArray(doc, array) {
  function highlightLine (line 1081) | function highlightLine(cm, line, context, forceToEnd) {
  function getLineStyles (line 1126) | function getLineStyles(cm, line, updateFrontier) {
  function getContextBefore (line 1142) | function getContextBefore(cm, n, precise) {
  function processLine (line 1162) | function processLine(cm, text, context, startAt) {
  function callBlankLine (line 1173) | function callBlankLine(mode, state) {
  function readToken (line 1180) | function readToken(mode, stream, state, inner) {
  function takeToken (line 1197) | function takeToken(cm, pos, precise, asArray) {
  function extractLineClasses (line 1211) | function extractLineClasses(type, output) {
  function runMode (line 1226) | function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
  function findStartLine (line 1270) | function findStartLine(cm, n, precise) {
  function retreatFrontier (line 1287) | function retreatFrontier(doc, n) {
  function seeReadOnlySpans (line 1307) | function seeReadOnlySpans() {
  function seeCollapsedSpans (line 1311) | function seeCollapsedSpans() {
  function MarkedSpan (line 1317) | function MarkedSpan(marker, from, to) {
  function getMarkedSpanFor (line 1323) | function getMarkedSpanFor(spans, marker) {
  function removeMarkedSpan (line 1332) | function removeMarkedSpan(spans, span) {
  function addMarkedSpan (line 1340) | function addMarkedSpan(line, span, op) {
  function markedSpansBefore (line 1355) | function markedSpansBefore(old, startCh, isInsert) {
  function markedSpansAfter (line 1367) | function markedSpansAfter(old, endCh, isInsert) {
  function stretchSpansOverChange (line 1387) | function stretchSpansOverChange(doc, change) {
  function clearEmptySpans (line 1449) | function clearEmptySpans(spans) {
  function removeReadOnlyRanges (line 1460) | function removeReadOnlyRanges(doc, from, to) {
  function detachMarkedSpans (line 1489) | function detachMarkedSpans(line) {
  function attachMarkedSpans (line 1496) | function attachMarkedSpans(line, spans) {
  function extraLeft (line 1505) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
  function extraRight (line 1506) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
  function compareCollapsedMarkers (line 1511) | function compareCollapsedMarkers(a, b) {
  function collapsedSpanAtSide (line 1524) | function collapsedSpanAtSide(line, start) {
  function collapsedSpanAtStart (line 1534) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
  function collapsedSpanAtEnd (line 1535) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
  function collapsedSpanAround (line 1537) | function collapsedSpanAround(line, ch) {
  function conflictingCollapsedRange (line 1550) | function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
  function visualLine (line 1570) | function visualLine(line) {
  function visualLineEnd (line 1577) | function visualLineEnd(line) {
  function visualLineContinued (line 1586) | function visualLineContinued(line) {
  function visualLineNo (line 1597) | function visualLineNo(doc, lineN) {
  function visualLineEndNo (line 1605) | function visualLineEndNo(doc, lineN) {
  function lineIsHidden (line 1617) | function lineIsHidden(doc, line) {
  function lineIsHiddenInner (line 1628) | function lineIsHiddenInner(doc, line, span) {
  function heightAtLine (line 1645) | function heightAtLine(lineObj) {
  function lineLength (line 1667) | function lineLength(line) {
  function findMaxLine (line 1686) | function findMaxLine(cm) {
  function updateLine (line 1716) | function updateLine(line, text, markedSpans, estimateHeight) {
  function cleanUpLine (line 1728) | function cleanUpLine(line) {
  function interpretTokenStyle (line 1737) | function interpretTokenStyle(style, options) {
  function buildLineContent (line 1749) | function buildLineContent(cm, lineView) {
  function defaultSpecialCharPlaceholder (line 1807) | function defaultSpecialCharPlaceholder(ch) {
  function buildToken (line 1816) | function buildToken(builder, text, style, startStyle, endStyle, css, att...
  function splitSpaces (line 1883) | function splitSpaces(text, trailingBefore) {
  function buildTokenBadBidi (line 1898) | function buildTokenBadBidi(inner, order) {
  function buildCollapsedSpan (line 1918) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
  function insertLineContent (line 1936) | function insertLineContent(line, builder, styles) {
  function LineView (line 2015) | function LineView(doc, line, lineN) {
  function buildViewArray (line 2027) | function buildViewArray(cm, from, to) {
  function pushOperation (line 2039) | function pushOperation(op) {
  function fireCallbacksForOps (line 2050) | function fireCallbacksForOps(group) {
  function finishOperation (line 2066) | function finishOperation(op, endCb) {
  function signalLater (line 2086) | function signalLater(emitter, type /*, values...*/) {
  function fireOrphanDelayed (line 2106) | function fireOrphanDelayed() {
  function updateLineForChanges (line 2115) | function updateLineForChanges(cm, lineView, lineN, dims) {
  function ensureLineWrapped (line 2128) | function ensureLineWrapped(lineView) {
  function updateLineBackground (line 2139) | function updateLineBackground(cm, lineView) {
  function getLineContent (line 2154) | function getLineContent(cm, lineView) {
  function updateLineText (line 2167) | function updateLineText(cm, lineView) {
  function updateLineClasses (line 2182) | function updateLineClasses(cm, lineView) {
  function updateLineGutter (line 2192) | function updateLineGutter(cm, lineView, lineN, dims) {
  function updateLineWidgets (line 2231) | function updateLineWidgets(cm, lineView, dims) {
  function buildLineElement (line 2242) | function buildLineElement(cm, lineView, lineN, dims) {
  function insertLineWidgets (line 2256) | function insertLineWidgets(cm, lineView, dims) {
  function insertLineWidgetsFor (line 2262) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
  function positionLineWidget (line 2278) | function positionLineWidget(widget, node, lineView, dims) {
  function widgetHeight (line 2296) | function widgetHeight(widget) {
  function eventInWidget (line 2312) | function eventInWidget(display, e) {
  function paddingTop (line 2322) | function paddingTop(display) {return display.lineSpace.offsetTop}
  function paddingVert (line 2323) | function paddingVert(display) {return display.mover.offsetHeight - displ...
  function paddingH (line 2324) | function paddingH(display) {
  function scrollGap (line 2333) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
  function displayWidth (line 2334) | function displayWidth(cm) {
  function displayHeight (line 2337) | function displayHeight(cm) {
  function ensureLineHeights (line 2345) | function ensureLineHeights(cm, lineView, rect) {
  function mapFromLineView (line 2366) | function mapFromLineView(lineView, line, lineN) {
  function updateExternalMeasurement (line 2381) | function updateExternalMeasurement(cm, line) {
  function measureChar (line 2394) | function measureChar(cm, line, ch, bias) {
  function findViewForLine (line 2399) | function findViewForLine(cm, lineN) {
  function prepareMeasureForLine (line 2412) | function prepareMeasureForLine(cm, line) {
  function measureCharPrepared (line 2434) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
  function nodeAndOffsetInLineMap (line 2456) | function nodeAndOffsetInLineMap(map, ch, bias) {
  function getUsefulRect (line 2494) | function getUsefulRect(rects, bias) {
  function measureCharInner (line 2504) | function measureCharInner(cm, prepared, ch, bias) {
  function maybeUpdateRectForZooming (line 2557) | function maybeUpdateRectForZooming(measure, rect) {
  function clearLineMeasurementCacheFor (line 2567) | function clearLineMeasurementCacheFor(lineView) {
  function clearLineMeasurementCache (line 2576) | function clearLineMeasurementCache(cm) {
  function clearCaches (line 2583) | function clearCaches(cm) {
  function pageScrollX (line 2590) | function pageScrollX(doc) {
  function pageScrollY (line 2597) | function pageScrollY(doc) {
  function widgetTopHeight (line 2602) | function widgetTopHeight(lineObj) {
  function intoCoordSystem (line 2615) | function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
  function fromCoordSystem (line 2637) | function fromCoordSystem(cm, coords, context) {
  function charCoords (line 2654) | function charCoords(cm, pos, context, lineObj, bias) {
  function cursorCoords (line 2675) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
  function estimateCoords (line 2706) | function estimateCoords(cm, pos) {
  function PosWithInfo (line 2721) | function PosWithInfo(line, ch, sticky, outside, xRel) {
  function coordsChar (line 2730) | function coordsChar(cm, x, y) {
  function wrappedLineExtent (line 2750) | function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
  function wrappedLineExtentChar (line 2758) | function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
  function boxIsAfter (line 2766) | function boxIsAfter(box, x, y, left) {
  function coordsCharInner (line 2770) | function coordsCharInner(cm, lineObj, lineNo, x, y) {
  function coordsBidiPart (line 2837) | function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, ...
  function coordsBidiPartWrapped (line 2861) | function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, or...
  function textHeight (line 2896) | function textHeight(display) {
  function charWidth (line 2916) | function charWidth(display) {
  function getDimensions (line 2928) | function getDimensions(cm) {
  function compensateForHScroll (line 2946) | function compensateForHScroll(display) {
  function estimateHeight (line 2953) | function estimateHeight(cm) {
  function estimateLineHeights (line 2971) | function estimateLineHeights(cm) {
  function posFromMouse (line 2984) | function posFromMouse(cm, e, liberal, forRect) {
  function findViewIndex (line 3002) | function findViewIndex(cm, n) {
  function regChange (line 3019) | function regChange(cm, from, to, lendiff) {
  function regLineChange (line 3084) | function regLineChange(cm, line, type) {
  function resetView (line 3098) | function resetView(cm) {
  function viewCuttingPoint (line 3104) | function viewCuttingPoint(cm, oldN, newN, dir) {
  function adjustView (line 3131) | function adjustView(cm, from, to) {
  function countDirtyView (line 3152) | function countDirtyView(cm) {
  function updateSelection (line 3161) | function updateSelection(cm) {
  function prepareSelection (line 3165) | function prepareSelection(cm, primary) {
  function drawSelectionCursor (line 3192) | function drawSelectionCursor(cm, head, output) {
  function cmpCoords (line 3216) | function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
  function drawSelectionRange (line 3219) | function drawSelectionRange(cm, range, output) {
  function restartBlink (line 3312) | function restartBlink(cm) {
  function ensureFocus (line 3327) | function ensureFocus(cm) {
  function delayBlurEvent (line 3334) | function delayBlurEvent(cm) {
  function onFocus (line 3342) | function onFocus(cm, e) {
  function onBlur (line 3361) | function onBlur(cm, e) {
  function updateHeightsInViewport (line 3375) | function updateHeightsInViewport(cm) {
  function updateWidgetHeight (line 3420) | function updateWidgetHeight(line) {
  function visibleLines (line 3430) | function visibleLines(display, doc, viewport) {
  function maybeScrollWindow (line 3455) | function maybeScrollWindow(cm, rect) {
  function scrollPosIntoView (line 3473) | function scrollPosIntoView(cm, pos, end, margin) {
  function scrollIntoView (line 3507) | function scrollIntoView(cm, rect) {
  function calculateScrollPos (line 3517) | function calculateScrollPos(cm, rect) {
  function addToScrollTop (line 3548) | function addToScrollTop(cm, top) {
  function ensureCursorVisible (line 3556) | function ensureCursorVisible(cm) {
  function scrollToCoords (line 3562) | function scrollToCoords(cm, x, y) {
  function scrollToRange (line 3568) | function scrollToRange(cm, range) {
  function resolveScrollToPos (line 3577) | function resolveScrollToPos(cm) {
  function scrollToCoordsRange (line 3586) | function scrollToCoordsRange(cm, from, to, margin) {
  function updateScrollTop (line 3598) | function updateScrollTop(cm, val) {
  function setScrollTop (line 3606) | function setScrollTop(cm, val, forceScroll) {
  function setScrollLeft (line 3616) | function setScrollLeft(cm, val, isScroller, forceScroll) {
  function measureForScrollbars (line 3629) | function measureForScrollbars(cm) {
  function maybeDisable (line 3722) | function maybeDisable() {
  function updateScrollbars (line 3751) | function updateScrollbars(cm, measure) {
  function updateScrollbarsInner (line 3765) | function updateScrollbarsInner(cm, measure) {
  function initScrollbars (line 3787) | function initScrollbars(cm) {
  function startOperation (line 3817) | function startOperation(cm) {
  function endOperation (line 3840) | function endOperation(cm) {
  function endOperations (line 3851) | function endOperations(group) {
  function endOperation_R1 (line 3865) | function endOperation_R1(op) {
  function endOperation_W1 (line 3878) | function endOperation_W1(op) {
  function endOperation_R2 (line 3882) | function endOperation_R2(op) {
  function endOperation_W2 (line 3903) | function endOperation_W2(op) {
  function endOperation_finish (line 3928) | function endOperation_finish(op) {
  function runInOp (line 3967) | function runInOp(cm, f) {
  function operation (line 3974) | function operation(cm, f) {
  function methodOp (line 3984) | function methodOp(f) {
  function docMethodOp (line 3992) | function docMethodOp(f) {
  function startWorker (line 4004) | function startWorker(cm, time) {
  function highlightWorker (line 4009) | function highlightWorker(cm) {
  function maybeClipScrollbars (line 4077) | function maybeClipScrollbars(cm) {
  function selectionSnapshot (line 4088) | function selectionSnapshot(cm) {
  function restoreSelection (line 4105) | function restoreSelection(snapshot) {
  function updateDisplayIfNeeded (line 4123) | function updateDisplayIfNeeded(cm, update) {
  function postUpdateDisplay (line 4195) | function postUpdateDisplay(cm, update) {
  function updateDisplaySimple (line 4227) | function updateDisplaySimple(cm, viewport) {
  function patchDisplay (line 4244) | function patchDisplay(cm, updateNumbersFrom, dims) {
  function updateGutterSpace (line 4285) | function updateGutterSpace(display) {
  function setDocumentHeight (line 4292) | function setDocumentHeight(cm, measure) {
  function alignHorizontally (line 4300) | function alignHorizontally(cm) {
  function maybeUpdateLineNumberWidth (line 4323) | function maybeUpdateLineNumberWidth(cm) {
  function getGutters (line 4341) | function getGutters(gutters, lineNumbers) {
  function renderGutters (line 4358) | function renderGutters(display) {
  function updateGutters (line 4377) | function updateGutters(cm) {
  function Display (line 4387) | function Display(place, doc, input, options) {
  function wheelEventDelta (line 4516) | function wheelEventDelta(e) {
  function wheelEventPixels (line 4523) | function wheelEventPixels(e) {
  function onScrollWheel (line 4530) | function onScrollWheel(cm, e) {
  function normalizeSelection (line 4678) | function normalizeSelection(cm, ranges, primIndex) {
  function simpleSelection (line 4696) | function simpleSelection(anchor, head) {
  function changeEnd (line 4702) | function changeEnd(change) {
  function adjustForChange (line 4710) | function adjustForChange(pos, change) {
  function computeSelAfterChange (line 4719) | function computeSelAfterChange(doc, change) {
  function offsetPos (line 4729) | function offsetPos(pos, old, nw) {
  function computeReplacedSel (line 4738) | function computeReplacedSel(doc, changes, hint) {
  function loadMode (line 4759) | function loadMode(cm) {
  function resetModeState (line 4764) | function resetModeState(cm) {
  function isWholeLineUpdate (line 4780) | function isWholeLineUpdate(doc, change) {
  function updateDoc (line 4786) | function updateDoc(doc, change, markedSpans, estimateHeight) {
  function linkedDocs (line 4838) | function linkedDocs(doc, f, sharedHistOnly) {
  function attachDoc (line 4853) | function attachDoc(cm, doc) {
  function setDirectionClass (line 4866) | function setDirectionClass(cm) {
  function directionChanged (line 4870) | function directionChanged(cm) {
  function History (line 4877) | function History(prev) {
  function historyChangeFromChange (line 4894) | function historyChangeFromChange(doc, change) {
  function clearSelectionEvents (line 4903) | function clearSelectionEvents(array) {
  function lastChangeEvent (line 4913) | function lastChangeEvent(hist, force) {
  function addChangeToHistory (line 4928) | function addChangeToHistory(doc, change, selAfter, opId) {
  function selectionEventCanBeMerged (line 4971) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
  function addSelectionToHistory (line 4984) | function addSelectionToHistory(doc, sel, opId, options) {
  function pushSelectionToHistory (line 5006) | function pushSelectionToHistory(sel, dest) {
  function attachLocalSpans (line 5013) | function attachLocalSpans(doc, change, from, to) {
  function removeClearedSpans (line 5024) | function removeClearedSpans(spans) {
  function getOldSpans (line 5035) | function getOldSpans(doc, change) {
  function mergeOldSpans (line 5048) | function mergeOldSpans(doc, change) {
  function copyHistoryArray (line 5072) | function copyHistoryArray(events, newGroup, instantiateSel) {
  function extendRange (line 5104) | function extendRange(range, head, other, extend) {
  function extendSelection (line 5123) | function extendSelection(doc, head, other, options, extend) {
  function extendSelections (line 5130) | function extendSelections(doc, heads, options) {
  function replaceOneSelection (line 5140) | function replaceOneSelection(doc, i, range, options) {
  function setSimpleSelection (line 5147) | function setSimpleSelection(doc, anchor, head, options) {
  function filterSelectionChange (line 5153) | function filterSelectionChange(doc, sel, options) {
  function setSelectionReplaceHistory (line 5170) | function setSelectionReplaceHistory(doc, sel, options) {
  function setSelection (line 5181) | function setSelection(doc, sel, options) {
  function setSelectionNoUndo (line 5186) | function setSelectionNoUndo(doc, sel, options) {
  function setSelectionInner (line 5198) | function setSelectionInner(doc, sel) {
  function reCheckSelection (line 5213) | function reCheckSelection(doc) {
  function skipAtomicInSelection (line 5219) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
  function skipAtomicInner (line 5234) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
  function skipAtomic (line 5274) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
  function movePos (line 5287) | function movePos(doc, pos, dir, line) {
  function selectAll (line 5299) | function selectAll(cm) {
  function filterChange (line 5306) | function filterChange(doc, change, update) {
  function makeChange (line 5333) | function makeChange(doc, change, ignoreReadOnly) {
  function makeChangeInner (line 5355) | function makeChangeInner(doc, change) {
  function makeChangeFromHistory (line 5373) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
  function shiftDoc (line 5449) | function shiftDoc(doc, distance) {
  function makeChangeSingleDoc (line 5465) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
  function makeChangeSingleDocInEditor (line 5501) | function makeChangeSingleDocInEditor(cm, change, spans) {
  function replaceRange (line 5559) | function replaceRange(doc, code, from, to, origin) {
  function rebaseHistSelSingle (line 5570) | function rebaseHistSelSingle(pos, from, to, diff) {
  function rebaseHistArray (line 5586) | function rebaseHistArray(array, from, to, diff) {
  function rebaseHist (line 5614) | function rebaseHist(hist, change) {
  function changeLine (line 5623) | function changeLine(doc, handle, changeType, op) {
  function LeafChunk (line 5645) | function LeafChunk(lines) {
  function BranchChunk (line 5690) | function BranchChunk(children) {
  function adjustScrollWhenAboveVisible (line 5839) | function adjustScrollWhenAboveVisible(cm, line, diff) {
  function addLineWidget (line 5844) | function addLineWidget(doc, handle, node, options) {
  function markText (line 6000) | function markText(doc, from, to, options, type) {
  function markTextShared (line 6095) | function markTextShared(doc, from, to, options, type) {
  function findSharedMarkers (line 6110) | function findSharedMarkers(doc) {
  function copySharedMarkers (line 6114) | function copySharedMarkers(doc, markers) {
  function detachSharedMarkers (line 6126) | function detachSharedMarkers(markers) {
  function onDrop (line 6564) | function onDrop(e) {
  function onDragStart (line 6635) | function onDragStart(cm, e) {
  function onDragOver (line 6658) | function onDragOver(cm, e) {
  function clearDragCursor (line 6670) | function clearDragCursor(cm) {
  function forEachCodeMirror (line 6681) | function forEachCodeMirror(f) {
  function ensureGlobalHandlers (line 6694) | function ensureGlobalHandlers() {
  function registerGlobalHandlers (line 6699) | function registerGlobalHandlers() {
  function onResize (line 6712) | function onResize(cm) {
  function normalizeKeyName (line 6782) | function normalizeKeyName(name) {
  function normalizeKeyMap (line 6806) | function normalizeKeyMap(keymap) {
  function lookupKey (line 6833) | function lookupKey(key, map, handle, context) {
  function isModifierKey (line 6852) | function isModifierKey(value) {
  function addModifierNames (line 6857) | function addModifierNames(name, event, noShift) {
  function keyName (line 6867) | function keyName(event, noShift) {
  function getKeyMap (line 6877) | function getKeyMap(val) {
  function deleteNearSelection (line 6883) | function deleteNearSelection(cm, compute) {
  function moveCharLogically (line 6906) | function moveCharLogically(line, ch, dir) {
  function moveLogically (line 6911) | function moveLogically(line, start, dir) {
  function endOfLine (line 6916) | function endOfLine(visually, cm, lineObj, lineNo, dir) {
  function moveVisually (line 6944) | function moveVisually(cm, line, start, dir) {
  function lineStart (line 7156) | function lineStart(cm, lineN) {
  function lineEnd (line 7162) | function lineEnd(cm, lineN) {
  function lineStartSmart (line 7168) | function lineStartSmart(cm, pos) {
  function doHandleBinding (line 7181) | function doHandleBinding(cm, bound, dropShift) {
  function lookupKeyForEditor (line 7201) | function lookupKeyForEditor(cm, name, handle) {
  function dispatchKey (line 7215) | function dispatchKey(cm, name, e, handle) {
  function dispatchKeyInner (line 7233) | function dispatchKeyInner(cm, name, e, handle) {
  function handleKeyBinding (line 7250) | function handleKeyBinding(cm, e) {
  function handleCharBinding (line 7269) | function handleCharBinding(cm, e, ch) {
  function onKeyDown (line 7274) | function onKeyDown(e) {
  function showCrossHair (line 7298) | function showCrossHair(cm) {
  function onKeyUp (line 7313) | function onKeyUp(e) {
  function onKeyPress (line 7318) | function onKeyPress(e) {
  function clickRepeat (line 7346) | function clickRepeat(pos, button) {
  function onMouseDown (line 7367) | function onMouseDown(e) {
  function handleMappedButton (line 7404) | function handleMappedButton(cm, button, pos, repeat, event) {
  function configureMouse (line 7424) | function configureMouse(cm, repeat, event) {
  function leftButtonDown (line 7437) | function leftButtonDown(cm, pos, repeat, event) {
  function leftButtonStartDrag (line 7455) | function leftButtonStartDrag(cm, event, pos, behavior) {
  function rangeForUnit (line 7498) | function rangeForUnit(cm, pos, unit) {
  function leftButtonSelect (line 7507) | function leftButtonSelect(cm, event, start, behavior) {
  function bidiSimplify (line 7645) | function bidiSimplify(cm, range) {
  function gutterEvent (line 7680) | function gutterEvent(cm, e, type, prevent) {
  function clickInGutter (line 7709) | function clickInGutter(cm, e) {
  function onContextMenu (line 7718) | function onContextMenu(cm, e) {
  function contextMenuInGutter (line 7724) | function contextMenuInGutter(cm, e) {
  function themeChanged (line 7729) | function themeChanged(cm) {
  function defineOptions (line 7740) | function defineOptions(CodeMirror) {
  function dragDropChanged (line 7884) | function dragDropChanged(cm, value, old) {
  function wrappingChanged (line 7897) | function wrappingChanged(cm) {
  function CodeMirror (line 7915) | function CodeMirror(place, options) {
  function registerEventHandlers (line 7992) | function registerEventHandlers(cm) {
  function indentLine (line 8110) | function indentLine(cm, n, how, aggressive) {
  function setLastCopied (line 8174) | function setLastCopied(newLastCopied) {
  function applyTextInput (line 8178) | function applyTextInput(cm, inserted, deleted, sel, origin) {
  function handlePaste (line 8226) | function handlePaste(e, cm) {
  function triggerElectric (line 8236) | function triggerElectric(cm, inserted) {
  function copyableRanges (line 8260) | function copyableRanges(cm) {
  function disableBrowserMagic (line 8271) | function disableBrowserMagic(field, spellcheck, autocorrect, autocapital...
  function hiddenTextarea (line 8277) | function hiddenTextarea() {
  function addEditorMethods (line 8299) | function addEditorMethods(CodeMirror) {
  function findPosH (line 8739) | function findPosH(doc, pos, dir, unit, visually) {
  function findPosV (line 8808) | function findPosV(cm, pos, dir, unit) {
  function belongsToInput (line 8847) | function belongsToInput(e) {
  function onCopyCut (line 8880) | function onCopyCut(e) {
  function poll (line 9050) | function poll() {
  function posToDOM (line 9216) | function posToDOM(cm, pos) {
  function isInGutter (line 9232) | function isInGutter(node) {
  function badPos (line 9238) | function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
  function domTextBetween (line 9240) | function domTextBetween(cm, from, to, fromLine, toLine) {
  function domToPos (line 9293) | function domToPos(cm, node, offset) {
  function locateNodeInLineView (line 9312) | function locateNodeInLineView(lineView, node, offset) {
  function prepareCopyCut (line 9410) | function prepareCopyCut(e) {
  function p (line 9571) | function p() {
  function prepareSelectAllHack (line 9675) | function prepareSelectAllHack() {
  function rehide (line 9688) | function rehide() {
  function fromTextArea (line 9736) | function fromTextArea(textarea, options) {
  function addLegacyProps (line 9793) | function addLegacyProps(CodeMirror) {

FILE: public/assets/lib/vendor/codemirror/mode/asciiarmor/asciiarmor.js
  function errorIfNotEmpty (line 14) | function errorIfNotEmpty(stream) {

FILE: public/assets/lib/vendor/codemirror/mode/asn.1/asn.1.js
  function tokenBase (line 29) | function tokenBase(stream, state) {
  function tokenString (line 68) | function tokenString(quote) {
  function Context (line 90) | function Context(indented, column, type, align, prev) {
  function pushContext (line 97) | function pushContext(state, col, type) {
  function popContext (line 103) | function popContext(state) {
  function words (line 162) | function words(str) {

FILE: public/assets/lib/vendor/codemirror/mode/asterisk/asterisk.js
  function basicToken (line 66) | function basicToken(stream,state){

FILE: public/assets/lib/vendor/codemirror/mode/clike/clike.js
  function Context (line 14) | function Context(indented, column, type, info, align, prev) {
  function pushContext (line 22) | function pushContext(state, col, type, info) {
  function popContext (line 28) | function popContext(state) {
  function typeBefore (line 35) | function typeBefore(stream, state, pos) {
  function isTopScope (line 41) | function isTopScope(context) {
  function tokenBase (line 75) | function tokenBase(stream, state) {
  function tokenString (line 128) | function tokenString(quote) {
  function tokenComment (line 141) | function tokenComment(stream, state) {
  function maybeEOL (line 153) | function maybeEOL(stream, state) {
  function words (line 258) | function words(str) {
  function contains (line 263) | function contains(words, word) {
  function cTypes (line 306) | function cTypes(identifier) {
  function objCTypes (line 311) | function objCTypes(identifier) {
  function cppHook (line 318) | function cppHook(stream, state) {
  function pointerHook (line 333) | function pointerHook(_stream, state) {
  function cIsReservedIdentifier (line 340) | function cIsReservedIdentifier(token) {
  function cpp14Literal (line 346) | function cpp14Literal(stream) {
  function cpp11StringHook (line 351) | function cpp11StringHook(stream, state) {
  function cppLooksLikeConstructor (line 375) | function cppLooksLikeConstructor(word) {
  function tokenAtString (line 381) | function tokenAtString(stream, state) {
  function tokenRawString (line 394) | function tokenRawString(stream, state) {
  function def (line 405) | function def(mimes, mode) {
  function tokenTripleString (line 541) | function tokenTripleString(stream, state) {
  function tokenNestedComment (line 553) | function tokenNestedComment(depth) {
  function tokenKotlinString (line 640) | function tokenKotlinString(tripleString){
  function tokenCeylonString (line 863) | function tokenCeylonString(type) {

FILE: public/assets/lib/vendor/codemirror/mode/clike/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function MTCPP (line 70) | function MTCPP(name) { test.mode(name, mode_cpp, Array.prototype.slice.c...
  function MTOBJC (line 89) | function MTOBJC(name) { test.mode(name, mode_objc, Array.prototype.slice...
  function MTSCALA (line 131) | function MTSCALA(name) { test.mode("scala_" + name, mode_scala, Array.pr...
  function MTJAVA (line 140) | function MTJAVA(name) { test.mode("java_" + name, mode_java, Array.proto...

FILE: public/assets/lib/vendor/codemirror/mode/clojure/clojure.js
  function base (line 168) | function base(stream, state) {
  function inString (line 197) | function inString(stream, state) {
  function inComment (line 208) | function inComment(stream, state) {
  function createLookupMap (line 225) | function createLookupMap(words) {
  function is (line 233) | function is(value, test) {

FILE: public/assets/lib/vendor/codemirror/mode/clojure/test.js
  function MT (line 7) | function MT(name) {
  function testFormsThatHaveBodyParameter (line 363) | function testFormsThatHaveBodyParameter(forms) {
  function typeTokenPairs (line 381) | function typeTokenPairs(type, tokens) {

FILE: public/assets/lib/vendor/codemirror/mode/cmake/cmake.js
  function tokenString (line 17) | function tokenString(stream, state) {
  function tokenize (line 37) | function tokenize(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/cobol/cobol.js
  function makeKeywords (line 22) | function makeKeywords(str) {
  function isNumber (line 150) | function isNumber(ch, stream){

FILE: public/assets/lib/vendor/codemirror/mode/coffeescript/coffeescript.js
  function wordRegexp (line 21) | function wordRegexp(words) {
  function tokenBase (line 50) | function tokenBase(stream, state) {
  function tokenFactory (line 179) | function tokenFactory(delimiter, singleline, outclass) {
  function longComment (line 206) | function longComment(stream, state) {
  function indent (line 218) | function indent(stream, state, type) {
  function dedent (line 242) | function dedent(stream, state) {
  function tokenLexer (line 266) | function tokenLexer(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/commonlisp/commonlisp.js
  function readSym (line 21) | function readSym(stream) {
  function base (line 30) | function base(stream, state) {
  function inString (line 64) | function inString(stream, state) {
  function inComment (line 73) | function inComment(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/crystal/crystal.js
  function wordRegExp (line 15) | function wordRegExp(words, end) {
  function chain (line 19) | function chain(tokenize, stream, state) {
  function tokenBase (line 58) | function tokenBase(stream, state) {
  function tokenNest (line 237) | function tokenNest(begin, end, style, started) {
  function tokenMacro (line 256) | function tokenMacro(begin, end, started) {
  function tokenMacroDef (line 274) | function tokenMacroDef(stream, state) {
  function tokenFollowIdent (line 291) | function tokenFollowIdent(stream, state) {
  function tokenFollowType (line 305) | function tokenFollowType(stream, state) {
  function tokenQuote (line 315) | function tokenQuote(end, style, embed) {
  function tokenHereDoc (line 354) | function tokenHereDoc(phrase, embed) {

FILE: public/assets/lib/vendor/codemirror/mode/css/css.js
  function ret (line 36) | function ret(style, tp) { type = tp; return style; }
  function tokenBase (line 40) | function tokenBase(stream, state) {
  function tokenString (line 94) | function tokenString(quote) {
  function tokenParenthesized (line 109) | function tokenParenthesized(stream, state) {
  function Context (line 120) | function Context(type, indent, prev) {
  function pushContext (line 126) | function pushContext(state, stream, type, indent) {
  function popContext (line 131) | function popContext(state) {
  function pass (line 137) | function pass(type, stream, state) {
  function popAndPass (line 140) | function popAndPass(type, stream, state, n) {
  function wordAsValue (line 148) | function wordAsValue(stream) {
  function keySet (line 419) | function keySet(array) {
  function tokenCComment (line 725) | function tokenCComment(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/css/gss_test.js
  function MT (line 8) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/css/less_test.js
  function MT (line 8) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/css/scss_test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/css/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/cypher/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/d/d.js
  function tokenBase (line 27) | function tokenBase(stream, state) {
  function tokenString (line 77) | function tokenString(quote) {
  function tokenComment (line 90) | function tokenComment(stream, state) {
  function tokenNestedComment (line 102) | function tokenNestedComment(stream, state) {
  function Context (line 114) | function Context(indented, column, type, align, prev) {
  function pushContext (line 121) | function pushContext(state, col, type) {
  function popContext (line 127) | function popContext(state) {
  function words (line 194) | function words(str) {

FILE: public/assets/lib/vendor/codemirror/mode/d/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/dart/dart.js
  function set (line 23) | function set(words) {
  function pushInterpolationStack (line 29) | function pushInterpolationStack(state) {
  function popInterpolationStack (line 33) | function popInterpolationStack(state) {
  function sizeInterpolationStack (line 37) | function sizeInterpolationStack(state) {
  function tokenString (line 94) | function tokenString(quote, stream, state, raw) {
  function tokenInterpolation (line 121) | function tokenInterpolation(stream, state) {
  function tokenInterpolationIdentifier (line 133) | function tokenInterpolationIdentifier(stream, state) {
  function tokenNestedComment (line 139) | function tokenNestedComment(depth) {

FILE: public/assets/lib/vendor/codemirror/mode/django/django.js
  function tokenBase (line 49) | function tokenBase (stream, state) {
  function inString (line 71) | function inString (delimiter, previousTokenizer) {
  function inVariable (line 94) | function inVariable (stream, state) {
  function inTag (line 193) | function inTag (stream, state) {
  function inComment (line 319) | function inComment (stream, state) {
  function inBlockComment (line 326) | function inBlockComment (stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/dockerfile/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/dtd/dtd.js
  function ret (line 23) | function ret(style, tp) {type = tp; return style;}
  function tokenBase (line 25) | function tokenBase(stream, state) {
  function tokenSGMLComment (line 54) | function tokenSGMLComment(stream, state) {
  function tokenString (line 66) | function tokenString(quote) {
  function inBlock (line 80) | function inBlock(style, terminator) {

FILE: public/assets/lib/vendor/codemirror/mode/dylan/dylan.js
  function forEach (line 14) | function forEach(arr, f) {
  function some (line 17) | function some(arr, f) {
  function chain (line 160) | function chain(stream, state, f) {
  function tokenBase (line 165) | function tokenBase(stream, state) {
  function tokenComment (line 295) | function tokenComment(stream, state) {
  function tokenString (line 314) | function tokenString(quote, style) {

FILE: public/assets/lib/vendor/codemirror/mode/dylan/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/ecl/ecl.js
  function words (line 16) | function words(str) {
  function metaHook (line 22) | function metaHook(stream, state) {
  function tokenBase (line 41) | function tokenBase(stream, state) {
  function tokenString (line 107) | function tokenString(quote) {
  function tokenComment (line 120) | function tokenComment(stream, state) {
  function Context (line 132) | function Context(indented, column, type, align, prev) {
  function pushContext (line 139) | function pushContext(state, col, type) {
  function popContext (line 142) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/eiffel/eiffel.js
  function wordObj (line 15) | function wordObj(words) {
  function chain (line 88) | function chain(newtok, stream, state) {
  function tokenBase (line 93) | function tokenBase(stream, state) {
  function readQuoted (line 119) | function readQuoted(quote, style,  unescaped) {

FILE: public/assets/lib/vendor/codemirror/mode/elm/elm.js
  function switchState (line 16) | function switchState(source, setState, f)
  function normal (line 32) | function normal()
  function chompMultiComment (line 125) | function chompMultiComment(nest)
  function chompMultiString (line 155) | function chompMultiString(source, setState)
  function chompSingleString (line 169) | function chompSingleString(source, setState)
  function chompChar (line 183) | function chompChar(source, setState)
  function chompGlsl (line 197) | function chompGlsl(source, setState)

FILE: public/assets/lib/vendor/codemirror/mode/erlang/erlang.js
  function tokenizer (line 103) | function tokenizer(stream,state) {
  function nongreedy (line 290) | function nongreedy(stream,re,words) {
  function greedy (line 304) | function greedy(stream,re,words) {
  function doubleQuote (line 321) | function doubleQuote(stream) {
  function singleQuote (line 325) | function singleQuote(stream) {
  function quote (line 329) | function quote(stream,quoteChar,escapeChar) {
  function lookahead (line 341) | function lookahead(stream) {
  function is_member (line 346) | function is_member(element,list) {
  function rval (line 350) | function rval(state,stream,type) {
  function aToken (line 384) | function aToken(tok,col,ind,typ) {
  function realToken (line 391) | function realToken(type,stream) {
  function fakeToken (line 398) | function fakeToken(type) {
  function peekToken (line 402) | function peekToken(state,depth) {
  function pushToken (line 413) | function pushToken(state,token) {
  function maybe_drop_pre (line 421) | function maybe_drop_pre(s,token) {
  function maybe_drop_post (line 435) | function maybe_drop_post(s) {
  function d (line 463) | function d(stack,tt) {
  function indenter (line 503) | function indenter(state,textAfter) {
  function wordafter (line 546) | function wordafter(str) {
  function postcommaToken (line 552) | function postcommaToken(state) {
  function defaultToken (line 559) | function defaultToken(state) {
  function getToken (line 573) | function getToken(state,tokens) {
  function getTokenIndex (line 580) | function getTokenIndex(objs,propname,propvals) {
  function truthy (line 590) | function truthy(x) {

FILE: public/assets/lib/vendor/codemirror/mode/fcl/fcl.js
  function tokenBase (line 48) | function tokenBase(stream, state) {
  function tokenComment (line 89) | function tokenComment(stream, state) {
  function Context (line 101) | function Context(indented, column, type, align, prev) {
  function pushContext (line 109) | function pushContext(state, col, type) {
  function popContext (line 113) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/forth/forth.js
  function toWordList (line 16) | function toWordList(words) {
  function searchWordList (line 67) | function searchWordList (wordList, word) {

FILE: public/assets/lib/vendor/codemirror/mode/fortran/fortran.js
  function words (line 15) | function words(array) {
  function tokenBase (line 117) | function tokenBase(stream, state) {
  function tokenString (line 155) | function tokenString(quote) {

FILE: public/assets/lib/vendor/codemirror/mode/gas/gas.js
  function x86 (line 144) | function x86(_parserConfig) {
  function armv6 (line 199) | function armv6(_parserConfig) {
  function nextUntilUnescaped (line 242) | function nextUntilUnescaped(stream, end) {
  function clikeComment (line 253) | function clikeComment(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/gfm/gfm.js
  function blankLine (line 18) | function blankLine(state) {

FILE: public/assets/lib/vendor/codemirror/mode/gfm/test.js
  function MT (line 7) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function FT (line 9) | function FT(name) { test.mode(name, modeHighlightFormatting, Array.proto...

FILE: public/assets/lib/vendor/codemirror/mode/go/go.js
  function tokenBase (line 41) | function tokenBase(stream, state) {
  function tokenString (line 85) | function tokenString(quote) {
  function tokenComment (line 98) | function tokenComment(stream, state) {
  function Context (line 110) | function Context(indented, column, type, align, prev) {
  function pushContext (line 117) | function pushContext(state, col, type) {
  function popContext (line 120) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/groovy/groovy.js
  function words (line 15) | function words(str) {
  function tokenBase (line 31) | function tokenBase(stream, state) {
  function startString (line 81) | function startString(quote, stream, state) {
  function tokenBaseUntilBrace (line 112) | function tokenBaseUntilBrace() {
  function tokenVariableDeref (line 130) | function tokenVariableDeref(stream, state) {
  function tokenComment (line 139) | function tokenComment(stream, state) {
  function expectExpression (line 151) | function expectExpression(last, newline) {
  function Context (line 157) | function Context(indented, column, type, align, prev) {
  function pushContext (line 164) | function pushContext(state, col, type) {
  function popContext (line 167) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/haml/haml.js
  function rubyInQuote (line 19) | function rubyInQuote(endQuote) {
  function ruby (line 33) | function ruby(stream, state) {
  function html (line 41) | function html(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/haml/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/haskell/haskell.js
  function switchState (line 16) | function switchState(source, setState, f) {
  function normal (line 32) | function normal(source, setState) {
  function ncomment (line 125) | function ncomment(type, nest) {
  function stringLiteral (line 149) | function stringLiteral(source, setState) {
  function stringGap (line 172) | function stringGap(source, setState) {
  function setType (line 184) | function setType(t) {

FILE: public/assets/lib/vendor/codemirror/mode/haxe/haxe.js
  function kw (line 19) | function kw(type) {return {type: type, style: "keyword"};}
  function chain (line 37) | function chain(stream, state, f) {
  function toUnescaped (line 42) | function toUnescaped(stream, end) {
  function ret (line 54) | function ret(tp, style, cont) {
  function haxeTokenBase (line 59) | function haxeTokenBase(stream, state) {
  function haxeTokenString (line 110) | function haxeTokenString(quote) {
  function haxeTokenComment (line 118) | function haxeTokenComment(stream, state) {
  function HaxeLexical (line 134) | function HaxeLexical(indented, column, type, align, prev, info) {
  function inScope (line 143) | function inScope(state, varname) {
  function parseHaxe (line 148) | function parseHaxe(state, style, type, content, stream) {
  function imported (line 170) | function imported(state, typename) {
  function registerimport (line 178) | function registerimport(importname) {
  function pass (line 187) | function pass() {
  function cont (line 190) | function cont() {
  function inList (line 194) | function inList(name, list) {
  function register (line 199) | function register(varname) {
  function pushcontext (line 214) | function pushcontext() {
  function popcontext (line 218) | function popcontext() {
  function pushlex (line 223) | function pushlex(type, info) {
  function poplex (line 231) | function poplex() {
  function expect (line 241) | function expect(wanted) {
  function statement (line 250) | function statement(type) {
  function expression (line 272) | function expression(type) {
  function maybeexpression (line 283) | function maybeexpression(type) {
  function maybeoperator (line 288) | function maybeoperator(type, value) {
  function maybeattribute (line 297) | function maybeattribute(type) {
  function metadef (line 303) | function metadef(type) {
  function metaargs (line 308) | function metaargs(type) {
  function importdef (line 312) | function importdef (type, value) {
  function typedef (line 317) | function typedef (type, value)
  function maybelabel (line 323) | function maybelabel(type) {
  function property (line 327) | function property(type) {
  function objprop (line 330) | function objprop(type) {
  function commasep (line 334) | function commasep(what, end) {
  function block (line 345) | function block(type) {
  function vardef1 (line 349) | function vardef1(type, value) {
  function vardef2 (line 353) | function vardef2(type, value) {
  function forspec1 (line 357) | function forspec1(type, value) {
  function forin (line 365) | function forin(_type, value) {
  function functiondef (line 368) | function functiondef(type, value) {
  function typeuse (line 374) | function typeuse(type) {
  function typestring (line 377) | function typestring(type) {
  function typeprop (line 382) | function typeprop(type) {
  function funarg (line 385) | function funarg(type, value) {

FILE: public/assets/lib/vendor/codemirror/mode/htmlmixed/htmlmixed.js
  function maybeBackup (line 29) | function maybeBackup(stream, pat, style) {
  function getAttrRegexp (line 41) | function getAttrRegexp(attr) {
  function getAttrValue (line 47) | function getAttrValue(text, attr) {
  function getTagRegexp (line 52) | function getTagRegexp(tagName, anchored) {
  function addTags (line 56) | function addTags(from, to) {
  function findMatchingMode (line 65) | function findMatchingMode(tagInfo, tagText) {
  function html (line 88) | function html(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/http/http.js
  function failFirstLine (line 15) | function failFirstLine(stream, state) {
  function start (line 21) | function start(stream, state) {
  function responseStatusCode (line 33) | function responseStatusCode(stream, state) {
  function responseStatusText (line 54) | function responseStatusText(stream, state) {
  function requestPath (line 60) | function requestPath(stream, state) {
  function requestProtocol (line 66) | function requestProtocol(stream, state) {
  function header (line 75) | function header(stream) {
  function body (line 89) | function body(stream) {

FILE: public/assets/lib/vendor/codemirror/mode/idl/idl.js
  function wordRegexp (line 14) | function wordRegexp(words) {
  function tokenBase (line 244) | function tokenBase(stream) {

FILE: public/assets/lib/vendor/codemirror/mode/javascript/javascript.js
  function kw (line 26) | function kw(type) {return {type: type, style: "keyword"};}
  function readRegexp (line 47) | function readRegexp(stream) {
  function ret (line 62) | function ret(tp, style, cont) {
  function tokenBase (line 66) | function tokenBase(stream, state) {
  function tokenString (line 137) | function tokenString(quote) {
  function tokenComment (line 153) | function tokenComment(stream, state) {
  function tokenQuasi (line 165) | function tokenQuasi(stream, state) {
  function findFatArrow (line 185) | function findFatArrow(stream, state) {
  function JSLexical (line 225) | function JSLexical(indented, column, type, align, prev, info) {
  function inScope (line 234) | function inScope(state, varname) {
  function parseJS (line 244) | function parseJS(state, style, type, content, stream) {
  function pass (line 268) | function pass() {
  function cont (line 271) | function cont() {
  function inList (line 275) | function inList(name, list) {
  function register (line 279) | function register(varname) {
  function registerVarScoped (line 300) | function registerVarScoped(varname, context) {
  function isModifier (line 315) | function isModifier(name) {
  function Context (line 321) | function Context(prev, vars, block) { this.prev = prev; this.vars = vars...
  function Var (line 322) | function Var(name, next) { this.name = name; this.next = next }
  function pushcontext (line 325) | function pushcontext() {
  function pushblockcontext (line 329) | function pushblockcontext() {
  function popcontext (line 334) | function popcontext() {
  function pushlex (line 339) | function pushlex(type, info) {
  function poplex (line 350) | function poplex() {
  function expect (line 360) | function expect(wanted) {
  function statement (line 369) | function statement(type, value) {
  function maybeCatchBinding (line 418) | function maybeCatchBinding(type) {
  function expression (line 421) | function expression(type, value) {
  function expressionNoComma (line 424) | function expressionNoComma(type, value) {
  function parenExpr (line 427) | function parenExpr(type) {
  function expressionInner (line 431) | function expressionInner(type, value, noComma) {
  function maybeexpression (line 451) | function maybeexpression(type) {
  function maybeoperatorComma (line 456) | function maybeoperatorComma(type, value) {
  function maybeoperatorNoComma (line 460) | function maybeoperatorNoComma(type, value, noComma) {
  function quasi (line 483) | function quasi(type, value) {
  function continueQuasi (line 488) | function continueQuasi(type) {
  function arrowBody (line 495) | function arrowBody(type) {
  function arrowBodyNoComma (line 499) | function arrowBodyNoComma(type) {
  function maybeTarget (line 503) | function maybeTarget(noComma) {
  function target (line 510) | function target(_, value) {
  function targetNoComma (line 513) | function targetNoComma(_, value) {
  function maybelabel (line 516) | function maybelabel(type) {
  function property (line 520) | function property(type) {
  function objprop (line 523) | function objprop(type, value) {
  function getterSetter (line 553) | function getterSetter(type) {
  function afterprop (line 558) | function afterprop(type) {
  function commasep (line 562) | function commasep(what, end, sep) {
  function contCommasep (line 581) | function contCommasep(what, end, info) {
  function block (line 586) | function block(type) {
  function maybetype (line 590) | function maybetype(type, value) {
  function maybetypeOrIn (line 596) | function maybetypeOrIn(type, value) {
  function mayberettype (line 599) | function mayberettype(type) {
  function isKW (line 605) | function isKW(_, value) {
  function typeexpr (line 611) | function typeexpr(type, value) {
  function maybeReturnType (line 628) | function maybeReturnType(type) {
  function typeprops (line 631) | function typeprops(type) {
  function typeprop (line 636) | function typeprop(type, value) {
  function quasiType (line 652) | function quasiType(type, value) {
  function continueQuasiType (line 657) | function continueQuasiType(type) {
  function typearg (line 664) | function typearg(type, value) {
  function afterType (line 670) | function afterType(type, value) {
  function maybeTypeArgs (line 677) | function maybeTypeArgs(_, value) {
  function typeparam (line 680) | function typeparam() {
  function maybeTypeDefault (line 683) | function maybeTypeDefault(_, value) {
  function vardef (line 686) | function vardef(_, value) {
  function pattern (line 690) | function pattern(type, value) {
  function proppattern (line 697) | function proppattern(type, value) {
  function eltpattern (line 708) | function eltpattern() {
  function maybeAssign (line 711) | function maybeAssign(_type, value) {
  function vardefCont (line 714) | function vardefCont(type) {
  function maybeelse (line 717) | function maybeelse(type, value) {
  function forspec (line 720) | function forspec(type, value) {
  function forspec1 (line 724) | function forspec1(type) {
  function forspec2 (line 729) | function forspec2(type, value) {
  function functiondef (line 735) | function functiondef(type, value) {
  function functiondecl (line 741) | function functiondecl(type, value) {
  function typename (line 747) | function typename(type, value) {
  function funarg (line 755) | function funarg(type, value) {
  function classExpression (line 762) | function classExpression(type, value) {
  function className (line 767) | function className(type, value) {
  function classNameAfter (line 770) | function classNameAfter(type, value) {
  function classBody (line 778) | function classBody(type, value) {
  function classfield (line 802) | function classfield(type, value) {
  function afterExport (line 810) | function afterExport(type, value) {
  function exportField (line 816) | function exportField(type, value) {
  function afterImport (line 820) | function afterImport(type) {
  function importSpec (line 826) | function importSpec(type, value) {
  function maybeMoreImports (line 832) | function maybeMoreImports(type) {
  function maybeAs (line 835) | function maybeAs(_type, value) {
  function maybeFrom (line 838) | function maybeFrom(_type, value) {
  function arrayLiteral (line 841) | function arrayLiteral(type) {
  function enumdef (line 845) | function enumdef() {
  function enummember (line 848) | function enummember() {
  function isContinuedStatement (line 852) | function isContinuedStatement(state, textAfter) {
  function expressionAllowed (line 858) | function expressionAllowed(stream, state, backUp) {

FILE: public/assets/lib/vendor/codemirror/mode/javascript/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function TS (line 329) | function TS(name) {
  function LD (line 488) | function LD(name) {

FILE: public/assets/lib/vendor/codemirror/mode/jinja2/jinja2.js
  function tokenBase (line 36) | function tokenBase (stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/jsx/jsx.js
  function Context (line 17) | function Context(state, mode, depth, prev) {
  function copyContext (line 21) | function copyContext(context) {
  function flatXMLIndent (line 32) | function flatXMLIndent(state) {
  function token (line 40) | function token(stream, state) {
  function xmlToken (line 47) | function xmlToken(stream, state, cx) {
  function jsToken (line 105) | function jsToken(stream, state, cx) {

FILE: public/assets/lib/vendor/codemirror/mode/jsx/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function TS (line 84) | function TS(name) { test.mode(name, ts_mode, Array.prototype.slice.call(...

FILE: public/assets/lib/vendor/codemirror/mode/julia/julia.js
  function wordRegexp (line 15) | function wordRegexp(words, end, pre) {
  function inArray (line 73) | function inArray(state) {
  function inGenerator (line 77) | function inGenerator(state) {
  function currentScope (line 81) | function currentScope(state, n) {
  function tokenBase (line 90) | function tokenBase(stream, state) {
  function tokenAnnotation (line 261) | function tokenAnnotation(stream, state) {
  function tokenComment (line 276) | function tokenComment(stream, state) {
  function tokenChar (line 291) | function tokenChar(stream, state) {
  function tokenStringFactory (line 318) | function tokenStringFactory(delimiter) {

FILE: public/assets/lib/vendor/codemirror/mode/lua/lua.js
  function prefixRE (line 21) | function prefixRE(words) {
  function wordRE (line 24) | function wordRE(words) {
  function readBracket (line 70) | function readBracket(stream) {
  function normal (line 77) | function normal(stream, state) {
  function bracketed (line 100) | function bracketed(level, style) {
  function string (line 113) | function string(quote) {

FILE: public/assets/lib/vendor/codemirror/mode/markdown/markdown.js
  function getMode (line 19) | function getMode(name) {
  function switchInline (line 100) | function switchInline(stream, state, f) {
  function switchBlock (line 105) | function switchBlock(stream, state, f) {
  function lineIsEmpty (line 110) | function lineIsEmpty(line) {
  function blankLine (line 116) | function blankLine(state) {
  function blockNormal (line 153) | function blockNormal(stream, state) {
  function htmlBlock (line 284) | function htmlBlock(stream, state) {
  function local (line 299) | function local(stream, state) {
  function getType (line 324) | function getType(state) {
  function handleText (line 407) | function handleText(stream, state) {
  function inlineNormal (line 414) | function inlineNormal(stream, state) {
  function linkInline (line 644) | function linkInline(stream, state) {
  function linkHref (line 664) | function linkHref(stream, state) {
  function getLinkHrefInside (line 684) | function getLinkHrefInside(endChar) {
  function footnoteLink (line 702) | function footnoteLink(stream, state) {
  function footnoteLinkInside (line 713) | function footnoteLinkInside(stream, state) {
  function footnoteUrl (line 727) | function footnoteUrl(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/markdown/test.js
  function MT (line 7) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function FT (line 9) | function FT(name) { test.mode(name, modeHighlightFormatting, Array.proto...
  function MT_noXml (line 11) | function MT_noXml(name) { test.mode(name, modeMT_noXml, Array.prototype....
  function MT_noFencedHighlight (line 13) | function MT_noFencedHighlight(name) { test.mode(name, modeMT_noFencedHig...
  function AtxNoSpaceTest (line 15) | function AtxNoSpaceTest(name) { test.mode(name, modeAtxNoSpace, Array.pr...
  function TokenTypeOverrideTest (line 40) | function TokenTypeOverrideTest(name) { test.mode(name, modeOverrideClass...
  function FormatTokenTypeOverrideTest (line 47) | function FormatTokenTypeOverrideTest(name) { test.mode(name, modeFormatt...
  function ET (line 49) | function ET(name) { test.mode(name, modeET, Array.prototype.slice.call(a...

FILE: public/assets/lib/vendor/codemirror/mode/mathematica/mathematica.js
  function tokenBase (line 32) | function tokenBase(stream, state) {
  function tokenString (line 133) | function tokenString(stream, state) {
  function tokenComment (line 148) | function tokenComment(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/mbox/mbox.js
  function styleForHeader (line 35) | function styleForHeader(header) {
  function readToken (line 40) | function readToken(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/mirc/mirc.js
  function parseWords (line 18) | function parseWords(str) {
  function chain (line 86) | function chain(stream, state, f) {
  function tokenBase (line 90) | function tokenBase(stream, state) {
  function tokenComment (line 153) | function tokenComment(stream, state) {
  function tokenUnparsed (line 164) | function tokenUnparsed(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/mllike/mllike.js
  function tokenBase (line 48) | function tokenBase(stream, state) {
  function tokenString (line 110) | function tokenString(stream, state) {
  function tokenComment (line 125) | function tokenComment(stream, state) {
  function tokenLongString (line 138) | function tokenLongString(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/modelica/modelica.js
  function tokenLineComment (line 30) | function tokenLineComment(stream, state) {
  function tokenBlockComment (line 36) | function tokenBlockComment(stream, state) {
  function tokenString (line 48) | function tokenString(stream, state) {
  function tokenIdent (line 62) | function tokenIdent(stream, state) {
  function tokenQIdent (line 81) | function tokenQIdent(stream, state) {
  function tokenUnsignedNumber (line 93) | function tokenUnsignedNumber(stream, state) {
  function words (line 202) | function words(str) {
  function def (line 213) | function def(mimes, mode) {

FILE: public/assets/lib/vendor/codemirror/mode/mscgen/mscgen.js
  function wordRegexpBoundary (line 74) | function wordRegexpBoundary(pWords) {
  function wordRegexp (line 78) | function wordRegexp(pWords) {
  function startStateFn (line 82) | function startStateFn() {
  function copyStateFn (line 91) | function copyStateFn(pState) {
  function produceTokenFunction (line 100) | function produceTokenFunction(pConfig) {

FILE: public/assets/lib/vendor/codemirror/mode/mscgen/mscgen_test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/mscgen/msgenny_test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/mscgen/xu_test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/mumps/mumps.js
  function wordRegexp (line 19) | function wordRegexp(words) {
  function tokenBase (line 34) | function tokenBase(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/nginx/nginx.js
  function words (line 16) | function words(str) {
  function ret (line 36) | function ret(style, tp) {type = tp; return style;}
  function tokenBase (line 38) | function tokenBase(stream, state) {
  function tokenCComment (line 97) | function tokenCComment(stream, state) {
  function tokenSGMLComment (line 109) | function tokenSGMLComment(stream, state) {
  function tokenString (line 121) | function tokenString(quote) {

FILE: public/assets/lib/vendor/codemirror/mode/ntriples/ntriples.js
  function transitState (line 59) | function transitState(currState, c) {

FILE: public/assets/lib/vendor/codemirror/mode/octave/octave.js
  function wordRegexp (line 15) | function wordRegexp(words) {
  function tokenTranspose (line 46) | function tokenTranspose(stream, state) {
  function tokenComment (line 57) | function tokenComment(stream, state) {
  function tokenBase (line 66) | function tokenBase(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/oz/oz.js
  function wordRegexp (line 16) | function wordRegexp(words) {
  function tokenBase (line 37) | function tokenBase(stream, state) {
  function tokenClass (line 139) | function tokenClass(stream, state) {
  function tokenMeth (line 148) | function tokenMeth(stream, state) {
  function tokenFunProc (line 157) | function tokenFunProc(stream, state) {
  function tokenComment (line 178) | function tokenComment(stream, state) {
  function tokenString (line 190) | function tokenString(quote) {
  function buildElectricInputRegEx (line 206) | function buildElectricInputRegEx() {

FILE: public/assets/lib/vendor/codemirror/mode/pascal/pascal.js
  function words (line 15) | function words(str) {
  function tokenBase (line 39) | function tokenBase(stream, state) {
  function tokenString (line 81) | function tokenString(quote) {
  function tokenComment (line 93) | function tokenComment(stream, state) {
  function tokenCommentBraces (line 105) | function tokenCommentBraces(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/pegjs/pegjs.js
  function identifier (line 17) | function identifier(stream) {

FILE: public/assets/lib/vendor/codemirror/mode/perl/perl.js
  function tokenChain (line 483) | function tokenChain(stream,state,chain,style,tail){     // NOTE: chain.l...
  function tokenSOMETHING (line 503) | function tokenSOMETHING(stream,state,string){
  function tokenPerl (line 511) | function tokenPerl(stream,state){
  function look (line 803) | function look(stream, c){
  function prefix (line 808) | function prefix(stream, c){
  function suffix (line 818) | function suffix(stream, c){
  function eatSuffix (line 825) | function eatSuffix(stream, c){

FILE: public/assets/lib/vendor/codemirror/mode/php/php.js
  function keywords (line 14) | function keywords(str) {
  function matchSequence (line 21) | function matchSequence(list, end, escapes) {
  function phpString (line 33) | function phpString(closing, escapes) {
  function phpString_ (line 36) | function phpString_(stream, state, closing, escapes) {
  function dispatch (line 157) | function dispatch(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/php/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function build_recursive_monsters (line 78) | function build_recursive_monsters(nt, t, n){
  function build_recursive_monsters_2 (line 124) | function build_recursive_monsters_2(mf1, mf2, nt, t, n){

FILE: public/assets/lib/vendor/codemirror/mode/pig/pig.js
  function chain (line 28) | function chain(stream, state, f) {
  function tokenComment (line 33) | function tokenComment(stream, state) {
  function tokenString (line 46) | function tokenString(quote) {
  function tokenBase (line 62) | function tokenBase(stream, state) {
  function keywords (line 140) | function keywords(str) {

FILE: public/assets/lib/vendor/codemirror/mode/powershell/powershell.js
  function buildRegexp (line 16) | function buildRegexp(patterns, options) {
  function tokenBase (line 162) | function tokenBase(stream, state) {
  function tokenSingleQuoteString (line 237) | function tokenSingleQuoteString(stream, state) {
  function tokenDoubleQuoteString (line 251) | function tokenDoubleQuoteString(stream, state) {
  function tokenStringInterpolation (line 274) | function tokenStringInterpolation(stream, state) {
  function tokenMultiStringReturn (line 278) | function tokenMultiStringReturn(stream, state) {
  function tokenHereStringInterpolation (line 284) | function tokenHereStringInterpolation(stream, state) {
  function tokenInterpolation (line 288) | function tokenInterpolation(stream, state, parentTokenize) {
  function tokenComment (line 312) | function tokenComment(stream, state) {
  function tokenVariable (line 324) | function tokenVariable(stream, state) {
  function tokenVariableWithBraces (line 339) | function tokenVariableWithBraces(stream, state) {
  function tokenMultiString (line 350) | function tokenMultiString(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/powershell/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...
  function forEach (line 8) | function forEach(arr, f) { for (var i = 0; i < arr.length; i++) f(arr[i]...

FILE: public/assets/lib/vendor/codemirror/mode/protobuf/protobuf.js
  function wordRegexp (line 14) | function wordRegexp(words) {
  function tokenBase (line 31) | function tokenBase(stream) {

FILE: public/assets/lib/vendor/codemirror/mode/pug/pug.js
  function State (line 29) | function State() {
  function javaScript (line 105) | function javaScript(stream, state) {
  function javaScriptArguments (line 122) | function javaScriptArguments(stream, state) {
  function yieldStatement (line 143) | function yieldStatement(stream) {
  function doctype (line 149) | function doctype(stream) {
  function interpolation (line 155) | function interpolation(stream, state) {
  function interpolationContinued (line 163) | function interpolationContinued(stream, state) {
  function caseStatement (line 179) | function caseStatement(stream, state) {
  function when (line 186) | function when(stream, state) {
  function defaultStatement (line 194) | function defaultStatement(stream) {
  function extendsStatement (line 200) | function extendsStatement(stream, state) {
  function append (line 207) | function append(stream, state) {
  function prepend (line 213) | function prepend(stream, state) {
  function block (line 219) | function block(stream, state) {
  function include (line 226) | function include(stream, state) {
  function includeFiltered (line 233) | function includeFiltered(stream, state) {
  function includeFilteredContinued (line 240) | function includeFilteredContinued(stream, state) {
  function mixin (line 249) | function mixin(stream, state) {
  function call (line 256) | function call(stream, state) {
  function callArguments (line 270) | function callArguments(stream, state) {
  function conditional (line 281) | function conditional(stream, state) {
  function each (line 288) | function each(stream, state) {
  function eachContinued (line 294) | function eachContinued(stream, state) {
  function whileStatement (line 309) | function whileStatement(stream, state) {
  function tag (line 316) | function tag(stream, state) {
  function filter (line 327) | function filter(stream, state) {
  function code (line 344) | function code(stream, state) {
  function id (line 351) | function id(stream) {
  function className (line 357) | function className(stream) {
  function attrs (line 363) | function attrs(stream, state) {
  function attrsContinued (line 375) | function attrsContinued(stream, state) {
  function attributesBlock (line 419) | function attributesBlock(stream, state) {
  function indent (line 427) | function indent(stream) {
  function comment (line 433) | function comment(stream, state) {
  function colon (line 441) | function colon(stream) {
  function text (line 447) | function text(stream, state) {
  function dot (line 459) | function dot(stream, state) {
  function fail (line 472) | function fail(stream) {
  function setInnerMode (line 478) | function setInnerMode(stream, state, mode) {
  function innerMode (line 491) | function innerMode(stream, state, force) {
  function restOfLine (line 511) | function restOfLine(stream, state) {
  function startState (line 525) | function startState() {
  function copyState (line 528) | function copyState(state) {
  function nextToken (line 537) | function nextToken(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/puppet/puppet.js
  function define (line 22) | function define(style, string) {
  function tokenString (line 47) | function tokenString(stream, state) {
  function tokenize (line 68) | function tokenize(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/python/python.js
  function wordRegexp (line 14) | function wordRegexp(words) {
  function top (line 37) | function top(state) {
  function tokenBase (line 78) | function tokenBase(stream, state) {
  function tokenBaseInner (line 101) | function tokenBaseInner(stream, state, inFormat) {
  function formatStringFactory (line 183) | function formatStringFactory(delimiter, tokenOuter) {
  function tokenStringFactory (line 244) | function tokenStringFactory(delimiter, tokenOuter) {
  function pushPyScope (line 277) | function pushPyScope(state) {
  function pushBracketScope (line 284) | function pushBracketScope(stream, state, type) {
  function dedent (line 291) | function dedent(stream, state) {
  function tokenLexer (line 300) | function tokenLexer(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/python/test.js
  function MT (line 9) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/q/q.js
  function buildRE (line 19) | function buildRE(w){return new RegExp("^("+w.join("|")+")$");}
  function tokenBase (line 20) | function tokenBase(stream,state){
  function tokenLineComment (line 62) | function tokenLineComment(stream,state){
  function tokenBlockComment (line 65) | function tokenBlockComment(stream,state){
  function tokenCommentToEOF (line 72) | function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";}
  function tokenString (line 73) | function tokenString(stream,state){
  function pushContext (line 82) | function pushContext(state,type,col){state.context={prev:state.context,i...
  function popContext (line 83) | function popContext(state){state.indent=state.context.indent;state.conte...

FILE: public/assets/lib/vendor/codemirror/mode/r/r.js
  function wordObj (line 17) | function wordObj(words) {
  function tokenBase (line 36) | function tokenBase(stream, state) {
  function tokenString (line 97) | function tokenString(quote) {
  function push (line 120) | function push(state, type, stream) {
  function setFlag (line 127) | function setFlag(state, flag) {
  function pop (line 135) | function pop(state) {

FILE: public/assets/lib/vendor/codemirror/mode/rst/rst.js
  function format (line 76) | function format(string) {
  function to_normal (line 156) | function to_normal(stream, state) {
  function to_explicit (line 356) | function to_explicit(stream, state) {
  function to_comment (line 463) | function to_comment(stream, state) {
  function to_verbatim (line 467) | function to_verbatim(stream, state) {
  function as_block (line 471) | function as_block(stream, state, token) {
  function to_mode (line 484) | function to_mode(stream, state) {
  function context (line 503) | function context(phase, stage, mode, local) {
  function change (line 507) | function change(state, tok, ctx) {
  function stage (line 512) | function stage(state) {
  function phase (line 516) | function phase(state) {

FILE: public/assets/lib/vendor/codemirror/mode/ruby/ruby.js
  function wordObj (line 14) | function wordObj(words) {
  function chain (line 38) | function chain(newtok, stream, state) {
  function tokenBase (line 43) | function tokenBase(stream, state) {
  function regexpAhead (line 143) | function regexpAhead(stream) {
  function tokenBaseUntilBrace (line 165) | function tokenBaseUntilBrace(depth) {
  function tokenBaseOnce (line 181) | function tokenBaseOnce() {
  function readQuoted (line 192) | function readQuoted(quote, style, embed, unescaped) {
  function readHereDoc (line 223) | function readHereDoc(phrase, mayIndent) {
  function readBlockComment (line 231) | function readBlockComment(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/ruby/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/rust/test.js
  function MT (line 6) | function MT(name) {test.mode(name, mode, Array.prototype.slice.call(argu...

FILE: public/assets/lib/vendor/codemirror/mode/sas/sas.js
  function define (line 51) | function define(style, string, context) {
  function tokenize (line 95) | function tokenize(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/sass/sass.js
  function tokenRegexp (line 21) | function tokenRegexp(words) {
  function isEndLine (line 36) | function isEndLine(stream) {
  function urlTokens (line 40) | function urlTokens(stream, state) {
  function comment (line 60) | function comment(indentation, multiLine) {
  function buildStringTokenizer (line 79) | function buildStringTokenizer(quote, greedy) {
  function buildInterpolationTokenizer (line 108) | function buildInterpolationTokenizer(currentTokenizer) {
  function indent (line 120) | function indent(state) {
  function dedent (line 129) | function dedent(state) {
  function tokenBase (line 135) | function tokenBase(stream, state) {
  function tokenLexer (line 396) | function tokenLexer(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/sass/test.js
  function MT (line 9) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/scheme/scheme.js
  function makeKeywords (line 24) | function makeKeywords(str) {
  function stateStack (line 33) | function stateStack(indent, type, prev) { // represents a state stack ob...
  function pushStack (line 39) | function pushStack(state, indent, type) {
  function popStack (line 43) | function popStack(state) {
  function isBinaryNumber (line 52) | function isBinaryNumber (stream) {
  function isOctalNumber (line 56) | function isOctalNumber (stream) {
  function isDecimalNumber (line 60) | function isDecimalNumber (stream, backup) {
  function isHexNumber (line 67) | function isHexNumber (stream) {
  function processEscapedSequence (line 71) | function processEscapedSequence(stream, options) {

FILE: public/assets/lib/vendor/codemirror/mode/shell/shell.js
  function define (line 17) | function define(style, dict) {
  function tokenBase (line 39) | function tokenBase(stream, state) {
  function tokenString (line 93) | function tokenString(quote, style) {
  function tokenStringStart (line 120) | function tokenStringStart(quote, style) {
  function tokenHeredoc (line 140) | function tokenHeredoc(delim) {
  function tokenize (line 148) | function tokenize(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/shell/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/sieve/sieve.js
  function words (line 15) | function words(str) {
  function tokenBase (line 25) | function tokenBase(stream, state) {
  function tokenMultiLineString (line 112) | function tokenMultiLineString(stream, state)
  function tokenCComment (line 137) | function tokenCComment(stream, state) {
  function tokenString (line 149) | function tokenString(quote) {

FILE: public/assets/lib/vendor/codemirror/mode/slim/slim.js
  function backup (line 72) | function backup(pos, tokenize, style) {
  function maybeBackup (line 87) | function maybeBackup(stream, state, pat, offset, style) {
  function continueLine (line 97) | function continueLine(state, column) {
  function finishContinue (line 106) | function finishContinue(state) {
  function lineContinuable (line 113) | function lineContinuable(column, tokenize) {
  function commaContinuable (line 127) | function commaContinuable(column, tokenize) {
  function rubyInQuote (line 138) | function rubyInQuote(endQuote, tokenize) {
  function startRubySplat (line 152) | function startRubySplat(tokenize) {
  function ruby (line 174) | function ruby(stream, state) {
  function htmlLine (line 178) | function htmlLine(stream, state) {
  function html (line 184) | function html(stream, state) {
  function startHtmlLine (line 192) | function startHtmlLine(lastTokenize) {
  function startHtmlMode (line 200) | function startHtmlMode(stream, state, offset) {
  function comment (line 211) | function comment(stream, state) {
  function commentMode (line 216) | function commentMode(stream, state) {
  function attributeWrapper (line 227) | function attributeWrapper(stream, state) {
  function attributeWrapperAssign (line 241) | function attributeWrapperAssign(stream, state) {
  function attributeWrapperValue (line 248) | function attributeWrapperValue(stream, state) {
  function startAttributeWrapperMode (line 265) | function startAttributeWrapperMode(state, endQuote, tokenize) {
  function sub (line 278) | function sub(stream, state) {
  function firstSub (line 292) | function firstSub(stream, state) {
  function createMode (line 298) | function createMode(mode) {
  function getMode (line 311) | function getMode(mode) {
  function startSubMode (line 318) | function startSubMode(mode, state) {
  function doctypeLine (line 335) | function doctypeLine(stream, _state) {
  function startLine (line 340) | function startLine(stream, state) {
  function slim (line 368) | function slim(stream, state) {
  function slimTag (line 375) | function slimTag(stream, state) {
  function slimTagExtras (line 386) | function slimTagExtras(stream, state) {
  function slimClass (line 393) | function slimClass(stream, state) {
  function slimAttribute (line 404) | function slimAttribute(stream, state) {
  function slimAttributeAssign (line 419) | function slimAttributeAssign(stream, state) {
  function slimAttributeValue (line 428) | function slimAttributeValue(stream, state) {
  function slimAttributeSymbols (line 447) | function slimAttributeSymbols(stream, state) {
  function readQuoted (line 456) | function readQuoted(quote, style, embed, unescaped, nextTokenize) {
  function slimContent (line 490) | function slimContent(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/slim/test.js
  function MT (line 8) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/smarty/smarty.js
  function cont (line 32) | function cont(style, lastType) {
  function chain (line 37) | function chain(stream, state, parser) {
  function doesNotCount (line 43) | function doesNotCount(stream, pos) {
  function tokenTop (line 49) | function tokenTop(stream, state) {
  function tokenSmarty (line 75) | function tokenSmarty(stream, state) {
  function tokenAttribute (line 158) | function tokenAttribute(quote) {
  function tokenBlock (line 174) | function tokenBlock(style, terminator) {

FILE: public/assets/lib/vendor/codemirror/mode/solr/solr.js
  function isNumber (line 21) | function isNumber(word) {
  function tokenString (line 25) | function tokenString(quote) {
  function tokenOperator (line 38) | function tokenOperator(operator) {
  function tokenWord (line 57) | function tokenWord(ch) {
  function tokenBase (line 76) | function tokenBase(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/soy/soy.js
  function last (line 73) | function last(array) {
  function tokenUntil (line 77) | function tokenUntil(stream, state, untilRegExp) {
  function contains (line 99) | function contains(list, element) {
  function prepend (line 107) | function prepend(list, element) {
  function popcontext (line 114) | function popcontext(state) {
  function ref (line 124) | function ref(list, name, loose) {
  function Context (line 129) | function Context(previousContext, tag, scope) {
  function expression (line 136) | function expression(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/soy/test.js
  function MT (line 6) | function MT(name) {test.mode(name, mode, Array.prototype.slice.call(argu...

FILE: public/assets/lib/vendor/codemirror/mode/sparql/sparql.js
  function wordRegexp (line 18) | function wordRegexp(words) {
  function tokenBase (line 40) | function tokenBase(stream, state) {
  function eatPnLocal (line 91) | function eatPnLocal(stream) {
  function tokenLiteral (line 95) | function tokenLiteral(quote) {
  function pushContext (line 109) | function pushContext(state, type, col) {
  function popContext (line 112) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/sql/sql.js
  function tokenBase (line 27) | function tokenBase(stream, state) {
  function tokenLiteral (line 131) | function tokenLiteral(quote, backslashEscapes) {
  function tokenComment (line 144) | function tokenComment(depth) {
  function pushContext (line 155) | function pushContext(stream, state, type) {
  function popContext (line 164) | function popContext(state) {
  function hookIdentifier (line 214) | function hookIdentifier(stream) {
  function hookIdentifierDoublequote (line 226) | function hookIdentifierDoublequote(stream) {
  function hookVar (line 239) | function hookVar(stream) {
  function hookClient (line 266) | function hookClient(stream) {
  function set (line 281) | function set(str) {

FILE: public/assets/lib/vendor/codemirror/mode/stex/stex.js
  function pushCommand (line 22) | function pushCommand(state, command) {
  function peekCommand (line 26) | function peekCommand(state) {
  function popCommand (line 34) | function popCommand(state) {
  function getMostPowerful (line 42) | function getMostPowerful(state) {
  function addPluginPattern (line 54) | function addPluginPattern(pluginName, cmdStyle, styles) {
  function setState (line 96) | function setState(state, f) {
  function normal (line 101) | function normal(source, state) {
  function inMathMode (line 172) | function inMathMode(source, state, endModeSeq) {
  function beginParams (line 217) | function beginParams(source, state) {

FILE: public/assets/lib/vendor/codemirror/mode/stex/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/stylus/stylus.js
  function tokenBase (line 47) | function tokenBase(stream, state) {
  function tokenCComment (line 164) | function tokenCComment(stream, state) {
  function tokenString (line 179) | function tokenString(quote) {
  function tokenParenthesized (line 197) | function tokenParenthesized(stream, state) {
  function Context (line 209) | function Context(type, indent, prev, line) {
  function pushContext (line 216) | function pushContext(state, stream, type, indent) {
  function popContext (line 222) | function popContext(state, currentIndent) {
  function pass (line 230) | function pass(type, stream, state) {
  function popAndPass (line 234) | function popAndPass(type, stream, state, n) {
  function wordIsTag (line 244) | function wordIsTag(word) {
  function wordIsProperty (line 248) | function wordIsProperty(word) {
  function wordIsBlock (line 253) | function wordIsBlock(word) {
  function wordIsVendorPrefix (line 257) | function wordIsVendorPrefix(word) {
  function wordAsValue (line 261) | function wordAsValue(word) {
  function typeIsBlock (line 275) | function typeIsBlock(type, stream) {
  function typeIsInterpolation (line 279) | function typeIsInterpolation(type, stream) {
  function typeIsPseudo (line 283) | function typeIsPseudo(type, stream) {
  function startOfLine (line 287) | function startOfLine(stream) {
  function endOfLine (line 291) | function endOfLine(stream) {
  function firstWordOfLine (line 295) | function firstWordOfLine(line) {
  function wordRegexp (line 758) | function wordRegexp(words) {
  function keySet (line 763) | function keySet(array) {
  function escapeRegExp (line 769) | function escapeRegExp(text) {

FILE: public/assets/lib/vendor/codemirror/mode/swift/swift.js
  function wordSet (line 16) | function wordSet(words) {
  function tokenBase (line 45) | function tokenBase(stream, state, prev) {
  function tokenUntilClosingParen (line 100) | function tokenUntilClosingParen() {
  function tokenString (line 119) | function tokenString(openQuote, stream, state) {
  function tokenComment (line 144) | function tokenComment(stream, state) {
  function Context (line 157) | function Context(prev, align, indented) {
  function pushContext (line 163) | function pushContext(state, stream) {
  function popContext (line 168) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/swift/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/tcl/tcl.js
  function parseWords (line 17) | function parseWords(str) {
  function chain (line 37) | function chain(stream, state, f) {
  function tokenBase (line 41) | function tokenBase(stream, state) {
  function tokenString (line 84) | function tokenString(quote) {
  function tokenComment (line 98) | function tokenComment(stream, state) {
  function tokenUnparsed (line 109) | function tokenUnparsed(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/textile/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/textile/textile.js
  function startNewLine (line 49) | function startNewLine(stream, state) {
  function handlePhraseModifier (line 58) | function handlePhraseModifier(stream, state, ch) {
  function togglePhraseModifier (line 119) | function togglePhraseModifier(stream, state, phraseModifier, closeRE, op...
  function tokenStyles (line 136) | function tokenStyles(state) {
  function textileDisabled (line 153) | function textileDisabled(state) {
  function tokenStylesWith (line 168) | function tokenStylesWith(state, extraStyles) {
  function activeStyles (line 179) | function activeStyles(state) {
  function blankLine (line 188) | function blankLine(state) {
  function RE (line 288) | function RE(name) {

FILE: public/assets/lib/vendor/codemirror/mode/tiddlywiki/tiddlywiki.js
  function chain (line 61) | function chain(stream, state, f) {
  function tokenBase (line 66) | function tokenBase(stream, state) {
  function twTokenComment (line 179) | function twTokenComment(stream, state) {
  function twTokenStrong (line 192) | function twTokenStrong(stream, state) {
  function twTokenCode (line 206) | function twTokenCode(stream, state) {
  function twTokenEm (line 228) | function twTokenEm(stream, state) {
  function twTokenUnderline (line 242) | function twTokenUnderline(stream, state) {
  function twTokenStrike (line 257) | function twTokenStrike(stream, state) {
  function twTokenMacro (line 271) | function twTokenMacro(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/tiki/tiki.js
  function inBlock (line 15) | function inBlock(style, terminator, returnTokenizer) {
  function inLine (line 31) | function inLine(style) {
  function inText (line 41) | function inText(stream, state) {
  function inPlugin (line 133) | function inPlugin(stream, state) {
  function inAttribute (line 167) | function inAttribute(quote) {
  function inAttributeNoQuote (line 179) | function inAttributeNoQuote() {
  function pass (line 194) | function pass() {
  function cont (line 198) | function cont() {
  function pushContext (line 203) | function pushContext(pluginName, startOfLine) {
  function popContext (line 214) | function popContext() {
  function element (line 218) | function element(type) {
  function endplugin (line 239) | function endplugin(startOfLine) {
  function endcloseplugin (line 251) | function endcloseplugin(err) {
  function attributes (line 259) | function attributes(type) {
  function attvalue (line 264) | function attvalue(type) {
  function attvaluemaybe (line 269) | function attvaluemaybe(type) {

FILE: public/assets/lib/vendor/codemirror/mode/tornado/tornado.js
  function tokenBase (line 25) | function tokenBase (stream, state) {
  function inTag (line 35) | function inTag (close) {

FILE: public/assets/lib/vendor/codemirror/mode/troff/troff.js
  function tokenBase (line 18) | function tokenBase(stream) {
  function tokenize (line 68) | function tokenize(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/ttcn-cfg/ttcn-cfg.js
  function tokenBase (line 24) | function tokenBase(stream, state) {
  function tokenString (line 61) | function tokenString(quote) {
  function Context (line 83) | function Context(indented, column, type, align, prev) {
  function pushContext (line 90) | function pushContext(state, col, type) {
  function popContext (line 96) | function popContext(state) {
  function words (line 154) | function words(str) {

FILE: public/assets/lib/vendor/codemirror/mode/ttcn/ttcn.js
  function tokenBase (line 37) | function tokenBase(stream, state) {
  function tokenString (line 105) | function tokenString(quote) {
  function tokenComment (line 127) | function tokenComment(stream, state) {
  function Context (line 139) | function Context(indented, column, type, align, prev) {
  function pushContext (line 147) | function pushContext(state, col, type) {
  function popContext (line 154) | function popContext(state) {
  function words (line 216) | function words(str) {
  function def (line 222) | function def(mimes, mode) {

FILE: public/assets/lib/vendor/codemirror/mode/turtle/turtle.js
  function wordRegexp (line 18) | function wordRegexp(words) {
  function tokenBase (line 25) | function tokenBase(stream, state) {
  function tokenLiteral (line 77) | function tokenLiteral(quote) {
  function pushContext (line 91) | function pushContext(state, type, col) {
  function popContext (line 94) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/twig/twig.js
  function tokenBase (line 24) | function tokenBase (stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/vb/vb.js
  function wordRegexp (line 17) | function wordRegexp(words) {
  function indent (line 54) | function indent(_stream, state) {
  function dedent (line 58) | function dedent(_stream, state) {
  function tokenBase (line 62) | function tokenBase(stream, state) {
  function tokenStringFactory (line 172) | function tokenStringFactory(delimiter) {
  function tokenLexer (line 198) | function tokenLexer(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/vbscript/vbscript.js
  function wordRegexp (line 28) | function wordRegexp(words) {
  function indent (line 108) | function indent(_stream, state) {
  function dedent (line 112) | function dedent(_stream, state) {
  function tokenBase (line 116) | function tokenBase(stream, state) {
  function tokenStringFactory (line 259) | function tokenStringFactory(delimiter) {
  function tokenLexer (line 285) | function tokenLexer(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/velocity/velocity.js
  function parseWords (line 15) | function parseWords(str) {
  function chain (line 28) | function chain(stream, state, f) {
  function tokenBase (line 32) | function tokenBase(stream, state) {
  function tokenString (line 130) | function tokenString(quote) {
  function tokenComment (line 150) | function tokenComment(stream, state) {
  function tokenUnparsed (line 162) | function tokenUnparsed(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/verilog/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/verilog/verilog.js
  function words (line 29) | function words(str) {
  function tokenBase (line 122) | function tokenBase(stream, state) {
  function tokenString (line 249) | function tokenString(quote) {
  function tokenComment (line 262) | function tokenComment(stream, state) {
  function Context (line 274) | function Context(indented, column, type, scopekind, align, prev) {
  function pushContext (line 282) | function pushContext(state, col, type, scopekind) {
  function popContext (line 287) | function popContext(state) {
  function isClosing (line 295) | function isClosing(text, contextClosing) {
  function isInsideScopeKind (line 310) | function isInsideScopeKind(ctx, scopekind) {
  function buildElectricInputRegEx (line 320) | function buildElectricInputRegEx() {
  function tlvScopeStyle (line 554) | function tlvScopeStyle(state, indentation, type) {
  function tlvIdentNext (line 561) | function tlvIdentNext(stream) {

FILE: public/assets/lib/vendor/codemirror/mode/vhdl/vhdl.js
  function words (line 15) | function words(str) {
  function metaHook (line 27) | function metaHook(stream) {
  function tokenBase (line 51) | function tokenBase(stream, state) {
  function tokenString (line 93) | function tokenString(quote) {
  function tokenString2 (line 105) | function tokenString2(quote) {
  function Context (line 118) | function Context(indented, column, type, align, prev) {
  function pushContext (line 125) | function pushContext(state, col, type) {
  function popContext (line 128) | function popContext(state) {

FILE: public/assets/lib/vendor/codemirror/mode/wast/test.js
  function MT (line 6) | function MT(name) {test.mode(name, mode, Array.prototype.slice.call(argu...

FILE: public/assets/lib/vendor/codemirror/mode/webidl/webidl.js
  function wordRegexp (line 14) | function wordRegexp(words) {
  function readToken (line 94) | function readToken(stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/xml/test.js
  function MT (line 6) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/xml/xml.js
  function inText (line 69) | function inText(stream, state) {
  function inTag (line 117) | function inTag(stream, state) {
  function inAttribute (line 142) | function inAttribute(quote) {
  function inBlock (line 156) | function inBlock(style, terminator) {
  function doctype (line 169) | function doctype(depth) {
  function lower (line 190) | function lower(tagName) {
  function Context (line 194) | function Context(state, tagName, startOfLine) {
  function popContext (line 202) | function popContext(state) {
  function maybePopContext (line 205) | function maybePopContext(state, nextTagName) {
  function baseState (line 220) | function baseState(type, stream, state) {
  function tagNameState (line 230) | function tagNameState(type, stream, state) {
  function closeTagNameState (line 243) | function closeTagNameState(type, stream, state) {
  function closeState (line 265) | function closeState(type, _stream, state) {
  function closeStateErr (line 273) | function closeStateErr(type, stream, state) {
  function attrState (line 278) | function attrState(type, _stream, state) {
  function attrEqState (line 297) | function attrEqState(type, stream, state) {
  function attrValueState (line 302) | function attrValueState(type, stream, state) {
  function attrContinuedState (line 308) | function attrContinuedState(type, stream, state) {

FILE: public/assets/lib/vendor/codemirror/mode/xquery/test.js
  function MT (line 11) | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arg...

FILE: public/assets/lib/vendor/codemirror/mode/xquery/xquery.js
  function kw (line 21) | function kw(type) {return {type: type, style: "keyword"};}
  function chain (line 82) | function chain(stream, state, f) {
  function tokenBase (line 88) | function tokenBase(stream, state) {
  function tokenComment (line 221) | function tokenComment(stream, state) {
  function tokenString (line 244) | function tokenString(quote, f) {
  function tokenVariable (line 284) | function tokenVariable(stream, state) {
  function tokenTag (line 301) | function tokenTag(name, isclose) {
  function tokenAttribute (line 324) | function tokenAttribute(stream, state) {
  function tokenXMLComment (line 359) | function tokenXMLComment(stream, state) {
  function tokenCDATA (line 371) | function tokenCDATA(stream, state) {
  function tokenPreProcessing (line 382) | function tokenPreProcessing(stream, state) {
  function isInXmlBlock (line 394) | function isInXmlBlock(state) { return isIn(state, "tag"); }
  function isInXmlAttributeBlock (line 395) | function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); }
  function isInXmlConstructor (line 396) | function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"...
  function isInString (line 397) | function isInString(state) { return isIn(state, "string"); }
  function isEQNameAhead (line 399) | function isEQNameAhead(stream) {
  function isIn (line 409) | function isIn(state, type) {
  function pushStateStack (line 413) | function pushStateStack(state, newState) {
  function popStateStack (line 417) | function popStateStack(state) {

FILE: public/assets/lib/vendor/codemirror/mode/yacas/yacas.js
  function words (line 19) | function words(str) {
  function tokenBase (line 42) | function tokenBase(stream, state) {
  function tokenString (line 136) | function tokenString(stream, state) {
  function tokenComment (line 151) | function tokenComment(stream, state) {
  function currentScope (line 163) | function currentScope(state) {

FILE: public/assets/lib/vendor/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js
  function localMode (line 20) | function localMode(state) {

FILE: public/assets/lib/vendor/codemirror/src/display/Display.js
  function Display (line 10) | function Display(place, doc, input, options) {

FILE: public/assets/lib/vendor/codemirror/src/display/focus.js
  function ensureFocus (line 6) | function ensureFocus(cm) {
  function delayBlurEvent (line 13) | function delayBlurEvent(cm) {
  function onFocus (line 21) | function onFocus(cm, e) {
  function onBlur (line 40) | function onBlur(cm, e) {

FILE: public/assets/lib/vendor/codemirror/src/display/gutters.js
  function getGutters (line 6) | function getGutters(gutters, lineNumbers) {
  function renderGutters (line 23) | function renderGutters(display) {
  function updateGutters (line 40) | function updateGutters(cm) {

FILE: public/assets/lib/vendor/codemirror/src/display/highlight_worker.js
  function startWorker (line 10) | function startWorker(cm, time) {
  function highlightWorker (line 15) | function highlightWorker(cm) {

FILE: public/assets/lib/vendor/codemirror/src/display/line_numbers.js
  function alignHorizontally (line 9) | function alignHorizontally(cm) {
  function maybeUpdateLineNumberWidth (line 32) | function maybeUpdateLineNumberWidth(cm) {

FILE: public/assets/lib/vendor/codemirror/src/display/mode_state.js
  function loadMode (line 8) | function loadMode(cm) {
  function resetModeState (line 13) | function resetModeState(cm) {

FILE: public/assets/lib/vendor/codemirror/src/display/operations.js
  function startOperation (line 23) | function startOperation(cm) {
  function endOperation (line 46) | function endOperation(cm) {
  function endOperations (line 57) | function endOperations(group) {
  function endOperation_R1 (line 71) | function endOperation_R1(op) {
  function endOperation_W1 (line 84) | function endOperation_W1(op) {
  function endOperation_R2 (line 88) | function endOperation_R2(op) {
  function endOperation_W2 (line 109) | function endOperation_W2(op) {
  function endOperation_finish (line 134) | function endOperation_finish(op) {
  function runInOp (line 173) | function runInOp(cm, f) {
  function operation (line 180) | function operation(cm, f) {
  function methodOp (line 190) | function methodOp(f) {
  function docMethodOp (line 198) | function docMethodOp(f) {

FILE: public/assets/lib/vendor/codemirror/src/display/scroll_events.js
  function wheelEventDelta (line 28) | function wheelEventDelta(e) {
  function wheelEventPixels (line 35) | function wheelEventPixels(e) {
  function onScrollWheel (line 42) | function onScrollWheel(cm, e) {

FILE: public/assets/lib/vendor/codemirror/src/display/scrollbars.js
  function measureForScrollbars (line 14) | function measureForScrollbars(cm) {
  class NativeScrollbars (line 30) | class NativeScrollbars {
    method constructor (line 31) | constructor(place, scroll, cm) {
    method update (line 50) | update(measure) {
    method setScrollLeft (line 88) | setScrollLeft(pos) {
    method setScrollTop (line 93) | setScrollTop(pos) {
    method zeroWidthHack (line 98) | zeroWidthHack() {
    method enableZeroWidthBar (line 106) | enableZeroWidthBar(bar, delay, type) {
    method clear (line 124) | clear() {
  class NullScrollbars (line 131) | class NullScrollbars {
    method update (line 132) | update() { return {bottom: 0, right: 0} }
    method setScrollLeft (line 133) | setScrollLeft() {}
    method setScrollTop (line 134) | setScrollTop() {}
    method clear (line 135) | clear() {}
  function updateScrollbars (line 138) | function updateScrollbars(cm, measure) {
  function updateScrollbarsInner (line 152) | function updateScrollbarsInner(cm, measure) {
  function initScrollbars (line 174) | function initScrollbars(cm) {

FILE: public/assets/lib/vendor/codemirror/src/display/scrolling.js
  function maybeScrollWindow (line 15) | function maybeScrollWindow(cm, rect) {
  function scrollPosIntoView (line 36) | function scrollPosIntoView(cm, pos, end, margin) {
  function scrollIntoView (line 70) | function scrollIntoView(cm, rect) {
  function calculateScrollPos (line 80) | function calculateScrollPos(cm, rect) {
  function addToScrollTop (line 111) | function addToScrollTop(cm, top) {
  function ensureCursorVisible (line 119) | function ensureCursorVisible(cm) {
  function scrollToCoords (line 125) | function scrollToCoords(cm, x, y) {
  function scrollToRange (line 131) | function scrollToRange(cm, range) {
  function resolveScrollToPos (line 140) | function resolveScrollToPos(cm) {
  function scrollToCoordsRange (line 149) | function scrollToCoordsRange(cm, from, to, margin) {
  function updateScrollTop (line 161) | function updateScrollTop(cm, val) {
  function setScrollTop (line 169) | function setScrollTop(cm, val, forceScroll) {
  function setScrollLeft (line 179) | function setScrollLeft(cm, val, isScroller, forceScroll) {

FILE: public/assets/lib/vendor/codemirror/src/display/selection.js
  function updateSelection (line 9) | function updateSelection(cm) {
  function prepareSelection (line 13) | function prepareSelection(cm, primary = true) {
  function drawSelectionCursor (line 38) | function drawSelectionCursor(cm, head, output) {
  function cmpCoords (line 62) | function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
  function drawSelectionRange (line 65) | function drawSelectionRange(cm, range, output) {
  function restartBlink (line 160) | function restartBlink(cm) {

FILE: public/assets/lib/vendor/codemirror/src/display/update_display.js
  class DisplayUpdate (line 21) | class DisplayUpdate {
    method constructor (line 22) | constructor(cm, viewport, force) {
    method signal (line 37) | signal(emitter, type) {
    method finish (line 41) | finish() {
  function maybeClipScrollbars (line 47) | function maybeClipScrollbars(cm) {
  function selectionSnapshot (line 58) | function selectionSnapshot(cm) {
  function restoreSelection (line 75) | function restoreSelection(snapshot) {
  function updateDisplayIfNeeded (line 93) | function updateDisplayIfNeeded(cm, update) {
  function postUpdateDisplay (line 165) | function postUpdateDisplay(cm, update) {
  function updateDisplaySimple (line 197) | function updateDisplaySimple(cm, viewport) {
  function patchDisplay (line 214) | function patchDisplay(cm, updateNumbersFrom, dims) {
  function updateGutterSpace (line 256) | function updateGutterSpace(display) {
  function setDocumentHeight (line 263) | function setDocumentHeight(cm, measure) {

FILE: public/assets/lib/vendor/codemirror/src/display/update_line.js
  function updateLineForChanges (line 10) | function updateLineForChanges(cm, lineView, lineN, dims) {
  function ensureLineWrapped (line 23) | function ensureLineWrapped(lineView) {
  function updateLineBackground (line 34) | function updateLineBackground(cm, lineView) {
  function getLineContent (line 49) | function getLineContent(cm, lineView) {
  function updateLineText (line 62) | function updateLineText(cm, lineView) {
  function updateLineClasses (line 77) | function updateLineClasses(cm, lineView) {
  function updateLineGutter (line 87) | function updateLineGutter(cm, lineView, lineN, dims) {
  function updateLineWidgets (line 126) | function updateLineWidgets(cm, lineView, dims) {
  function buildLineElement (line 137) | function buildLineElement(cm, lineView, lineN, dims) {
  function insertLineWidgets (line 151) | function insertLineWidgets(cm, lineView, dims) {
  function insertLineWidgetsFor (line 157) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
  function positionLineWidget (line 173) | function positionLineWidget(widget, node, lineView, dims) {

FILE: public/assets/lib/vendor/codemirror/src/display/update_lines.js
  function updateHeightsInViewport (line 8) | function updateHeightsInViewport(cm) {
  function updateWidgetHeight (line 53) | function updateWidgetHeight(line) {
  function visibleLines (line 63) | function visibleLines(display, doc, viewport) {

FILE: public/assets/lib/vendor/codemirror/src/display/view_tracking.js
  function regChange (line 13) | function regChange(cm, from, to, lendiff) {
  function regLineChange (line 78) | function regLineChange(cm, line, type) {
  function resetView (line 92) | function resetView(cm) {
  function viewCuttingPoint (line 98) | function viewCuttingPoint(cm, oldN, newN, dir) {
  function adjustView (line 125) | function adjustView(cm, from, to) {
  function countDirtyView (line 146) | function countDirtyView(cm) {

FILE: public/assets/lib/vendor/codemirror/src/edit/CodeMirror.js
  function CodeMirror (line 29) | function CodeMirror(place, options) {
  function registerEventHandlers (line 106) | function registerEventHandlers(cm) {

FILE: public/assets/lib/vendor/codemirror/src/edit/commands.js
  function lineStart (line 156) | function lineStart(cm, lineN) {
  function lineEnd (line 162) | function lineEnd(cm, lineN) {
  function lineStartSmart (line 168) | function lineStartSmart(cm, pos) {

FILE: public/assets/lib/vendor/codemirror/src/edit/deleteNearSelection.js
  function deleteNearSelection (line 9) | function deleteNearSelection(cm, compute) {

FILE: public/assets/lib/vendor/codemirror/src/edit/drop_events.js
  function onDrop (line 19) | function onDrop(e) {
  function onDragStart (line 90) | function onDragStart(cm, e) {
  function onDragOver (line 113) | function onDragOver(cm, e) {
  function clearDragCursor (line 125) | function clearDragCursor(cm) {

FILE: public/assets/lib/vendor/codemirror/src/edit/fromTextArea.js
  function fromTextArea (line 6) | function fromTextArea(textarea, options) {

FILE: public/assets/lib/vendor/codemirror/src/edit/global_events.js
  function forEachCodeMirror (line 8) | function forEachCodeMirror(f) {
  function ensureGlobalHandlers (line 21) | function ensureGlobalHandlers() {
  function registerGlobalHandlers (line 26) | function registerGlobalHandlers() {
  function onResize (line 39) | function onResize(cm) {

FILE: public/assets/lib/vendor/codemirror/src/edit/key_events.js
  function doHandleBinding (line 14) | function doHandleBinding(cm, bound, dropShift) {
  function lookupKeyForEditor (line 34) | function lookupKeyForEditor(cm, name, handle) {
  function dispatchKey (line 48) | function dispatchKey(cm, name, e, handle) {
  function dispatchKeyInner (line 66) | function dispatchKeyInner(cm, name, e, handle) {
  function handleKeyBinding (line 83) | function handleKeyBinding(cm, e) {
  function handleCharBinding (line 102) | function handleCharBinding(cm, e, ch) {
  function onKeyDown (line 107) | function onKeyDown(e) {
  function showCrossHair (line 131) | function showCrossHair(cm) {
  function onKeyUp (line 146) | function onKeyUp(e) {
  function onKeyPress (line 151) | function onKeyPress(e) {

FILE: public/assets/lib/vendor/codemirror/src/edit/legacy.js
  function addLegacyProps (line 20) | function addLegacyProps(CodeMirror) {

FILE: public/assets/lib/vendor/codemirror/src/edit/methods.js
  function findPosH (line 468) | function findPosH(doc, pos, dir, unit, visually) {
  function findPosV (line 537) | function findPosV(cm, pos, dir, unit) {

FILE: public/assets/lib/vendor/codemirror/src/edit/mouse_events.js
  constant DOUBLECLICK_DELAY (line 22) | const DOUBLECLICK_DELAY = 400
  class PastClick (line 24) | class PastClick {
    method constructor (line 25) | constructor(time, pos, button) {
    method compare (line 31) | compare(time, pos, button) {
  function clickRepeat (line 38) | function clickRepeat(pos, button) {
  function onMouseDown (line 59) | function onMouseDown(e) {
  function handleMappedButton (line 96) | function handleMappedButton(cm, button, pos, repeat, event) {
  function configureMouse (line 116) | function configureMouse(cm, repeat, event) {
  function leftButtonDown (line 129) | function leftButtonDown(cm, pos, repeat, event) {
  function leftButtonStartDrag (line 147) | function leftButtonStartDrag(cm, event, pos, behavior) {
  function rangeForUnit (line 190) | function rangeForUnit(cm, pos, unit) {
  function leftButtonSelect (line 199) | function leftButtonSelect(cm, event, start, behavior) {
  function bidiSimplify (line 337) | function bidiSimplify(cm, range) {
  function gutterEvent (line 370) | function gutterEvent(cm, e, type, prevent) {
  function clickInGutter (line 399) | function clickInGutter(cm, e) {
  function onContextMenu (line 408) | function onContextMenu(cm, e) {
  function contextMenuInGutter (line 414) | function contextMenuInGutter(cm, e) {

FILE: public/assets/lib/vendor/codemirror/src/edit/options.js
  function defineOptions (line 24) | function defineOptions(CodeMirror) {
  function dragDropChanged (line 168) | function dragDropChanged(cm, value, old) {
  function wrappingChanged (line 181) | function wrappingChanged(cm) {

FILE: public/assets/lib/vendor/codemirror/src/edit/utils.js
  function themeChanged (line 3) | function themeChanged(cm) {

FILE: public/assets/lib/vendor/codemirror/src/input/ContentEditableInput.js
  class ContentEditableInput (line 19) | class ContentEditableInput {
    method constructor (line 20) | constructor(cm) {
    method init (line 29) | init(display) {
    method screenReaderLabelChanged (line 112) | screenReaderLabelChanged(label) {
    method prepareSelection (line 121) | prepareSelection() {
    method showSelection (line 127) | showSelection(info, takeFocus) {
    method getSelection (line 133) | getSelection() {
    method showPrimarySelection (line 137) | showPrimarySelection() {
    method startGracePeriod (line 188) | startGracePeriod() {
    method showMultipleSelections (line 197) | showMultipleSelections(info) {
    method rememberSelection (line 202) | rememberSelection() {
    method selectionInEditor (line 208) | selectionInEditor() {
    method focus (line 215) | focus() {
    method blur (line 222) | blur() { this.div.blur() }
    method getField (line 223) | getField() { return this.div }
    method supportsTouch (line 225) | supportsTouch() { return true }
    method receivedFocus (line 227) | receivedFocus() {
    method selectionChanged (line 243) | selectionChanged() {
    method pollSelection (line 249) | pollSelection() {
    method pollContent (line 274) | pollContent() {
    method ensurePolled (line 345) | ensurePolled() {
    method reset (line 348) | reset() {
    method forceCompositionEnd (line 351) | forceCompositionEnd() {
    method readFromDOMSoon (line 359) | readFromDOMSoon() {
    method updateFromDOM (line 371) | updateFromDOM() {
    method setUneditable (line 376) | setUneditable(node) {
    method onKeyPress (line 380) | onKeyPress(e) {
    method readOnlyChanged (line 387) | readOnlyChanged(val) {
    method onContextMenu (line 391) | onContextMenu() {}
    method resetPosition (line 392) | resetPosition() {}
  function posToDOM (line 397) | function posToDOM(cm, pos) {
  function isInGutter (line 413) | function isInGutter(node) {
  function badPos (line 419) | function badPos(pos, bad) { if (bad) pos.bad = true; return pos }
  function domTextBetween (line 421) | function domTextBetween(cm, from, to, fromLine, toLine) {
  function domToPos (line 474) | function domToPos(cm, node, offset) {
  function locateNodeInLineView (line 493) | function locateNodeInLineView(lineView, node, offset) {

FILE: public/assets/lib/vendor/codemirror/src/input/TextareaInput.js
  class TextareaInput (line 16) | class TextareaInput {
    method constructor (line 17) | constructor(cm) {
    method init (line 34) | init(display) {
    method createField (line 114) | createField(_display) {
    method screenReaderLabelChanged (line 124) | screenReaderLabelChanged(label) {
    method prepareSelection (line 133) | prepareSelection() {
    method showSelection (line 151) | showSelection(drawn) {
    method reset (line 163) | reset(typing) {
    method getField (line 180) | getField() { return this.textarea }
    method supportsTouch (line 182) | supportsTouch() { return false }
    method focus (line 184) | focus() {
    method blur (line 191) | blur() { this.textarea.blur() }
    method resetPosition (line 193) | resetPosition() {
    method receivedFocus (line 197) | receivedFocus() { this.slowPoll() }
    method slowPoll (line 201) | slowPoll() {
    method fastPoll (line 212) | fastPoll() {
    method poll (line 229) | poll() {
    method ensurePolled (line 278) | ensurePolled() {
    method onKeyPress (line 282) | onKeyPress() {
    method onContextMenu (line 287) | onContextMenu(e) {
    method readOnlyChanged (line 371) | readOnlyChanged(val) {
    method setUneditable (line 377) | setUneditable() {}

FILE: public/assets/lib/vendor/codemirror/src/input/indent.js
  function indentLine (line 14) | function indentLine(cm, n, how, aggressive) {

FILE: public/assets/lib/vendor/codemirror/src/input/input.js
  function setLastCopied (line 19) | function setLastCopied(newLastCopied) {
  function applyTextInput (line 23) | function applyTextInput(cm, inserted, deleted, sel, origin) {
  function handlePaste (line 71) | function handlePaste(e, cm) {
  function triggerElectric (line 81) | function triggerElectric(cm, inserted) {
  function copyableRanges (line 105) | function copyableRanges(cm) {
  function disableBrowserMagic (line 116) | function disableBrowserMagic(field, spellcheck, autocorrect, autocapital...
  function hiddenTextarea (line 122) | function hiddenTextarea() {

FILE: public/assets/lib/vendor/codemirror/src/input/keymap.js
  function normalizeKeyName (line 50) | function normalizeKeyName(name) {
  function normalizeKeyMap (line 74) | function normalizeKeyMap(keymap) {
  function lookupKey (line 101) | function lookupKey(key, map, handle, context) {
  function isModifierKey (line 120) | function isModifierKey(value) {
  function addModifierNames (line 125) | function addModifierNames(name, event, noShift) {
  function keyName (line 135) | function keyName(event, noShift) {
  function getKeyMap (line 145) | function getKeyMap(val) {

FILE: public/assets/lib/vendor/codemirror/src/input/movement.js
  function moveCharLogically (line 6) | function moveCharLogically(line, ch, dir) {
  function moveLogically (line 11) | function moveLogically(line, start, dir) {
  function endOfLine (line 16) | function endOfLine(visually, cm, lineObj, lineNo, dir) {
  function moveVisually (line 44) | function moveVisually(cm, line, start, dir) {

FILE: public/assets/lib/vendor/codemirror/src/line/highlight.js
  class SavedContext (line 8) | class SavedContext {
    method constructor (line 9) | constructor(state, lookAhead) {
  class Context (line 15) | class Context {
    method constructor (line 16) | constructor(doc, state, line, lookAhead) {
    method lookAhead (line 25) | lookAhead(n) {
    method baseToken (line 31) | baseToken(n) {
    method nextLine (line 40) | nextLine() {
    method fromSaved (line 45) | static fromSaved(doc, saved, line) {
    method save (line 52) | save(copy) {
  function highlightLine (line 63) | function highlightLine(cm, line, context, forceToEnd) {
  function getLineStyles (line 106) | function getLineStyles(cm, line, updateFrontier) {
  function getContextBefore (line 122) | function getContextBefore(cm, n, precise) {
  function processLine (line 142) | function processLine(cm, text, context, startAt) {
  function callBlankLine (line 153) | function callBlankLine(mode, state) {
  function readToken (line 160) | function readToken(mode, stream, state, inner) {
  class Token (line 169) | class Token {
    method constructor (line 170) | constructor(stream, type, state) {
  function takeToken (line 179) | function takeToken(cm, pos, precise, asArray) {
  function extractLineClasses (line 193) | function extractLineClasses(type, output) {
  function runMode (line 208) | function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
  function findStartLine (line 252) | function findStartLine(cm, n, precise) {
  function retreatFrontier (line 269) | function retreatFrontier(doc, n) {

FILE: public/assets/lib/vendor/codemirror/src/line/line_data.js
  class Line (line 16) | class Line {
    method constructor (line 17) | constructor(text, markedSpans, estimateHeight) {
    method lineNo (line 23) | lineNo() { return lineNo(this) }
  function updateLine (line 30) | function updateLine(line, text, markedSpans, estimateHeight) {
  function cleanUpLine (line 42) | function cleanUpLine(line) {
  function interpretTokenStyle (line 51) | function interpretTokenStyle(style, options) {
  function buildLineContent (line 63) | function buildLineContent(cm, lineView) {
  function defaultSpecialCharPlaceholder (line 121) | function defaultSpecialCharPlaceholder(ch) {
  function buildToken (line 130) | function buildToken(builder, text, style, startStyle, endStyle, css, att...
  function splitSpaces (line 197) | function splitSpaces(text, trailingBefore) {
  function buildTokenBadBidi (line 212) | function buildTokenBadBidi(inner, order) {
  function buildCollapsedSpan (line 232) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
  function insertLineContent (line 250) | function insertLineContent(line, builder, styles) {
  function LineView (line 329) | function LineView(doc, line, lineN) {
  function buildViewArray (line 341) | function buildViewArray(cm, from, to) {

FILE: public/assets/lib/vendor/codemirror/src/line/pos.js
  function Pos (line 4) | function Pos(line, ch, sticky = null) {
  function cmp (line 13) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
  function equalCursorPos (line 15) | function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b)...
  function copyPos (line 17) | function copyPos(x) {return Pos(x.line, x.ch)}
  function maxPos (line 18) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
  function minPos (line 19) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
  function clipLine (line 23) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
  function clipPos (line 24) | function clipPos(doc, pos) {
  function clipToLen (line 30) | function clipToLen(pos, linelen) {
  function clipPosArray (line 36) | function clipPosArray(doc, array) {

FILE: public/assets/lib/vendor/codemirror/src/line/saw_special_spans.js
  function seeReadOnlySpans (line 4) | function seeReadOnlySpans() {
  function seeCollapsedSpans (line 8) | function seeCollapsedSpans() {

FILE: public/assets/lib/vendor/codemirror/src/line/spans.js
  function MarkedSpan (line 9) | function MarkedSpan(marker, from, to) {
  function getMarkedSpanFor (line 15) | function getMarkedSpanFor(spans, marker) {
  function removeMarkedSpan (line 24) | function removeMarkedSpan(spans, span) {
  function addMarkedSpan (line 32) | function addMarkedSpan(line, span, op) {
  function markedSpansBefore (line 47) | function markedSpansBefore(old, startCh, isInsert) {
  function markedSpansAfter (line 59) | function markedSpansAfter(old, endCh, isInsert) {
  function stretchSpansOverChange (line 79) | function stretchSpansOverChange(doc, change) {
  function clearEmptySpans (line 141) | function clearEmptySpans(spans) {
  function removeReadOnlyRanges (line 152) | function removeReadOnlyRanges(doc, from, to) {
  function detachMarkedSpans (line 181) | function detachMarkedSpans(line) {
  function attachMarkedSpans (line 188) | function attachMarkedSpans(line, spans) {
  function extraLeft (line 197) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
  function extraRight (line 198) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
  function compareCollapsedMarkers (line 203) | function compareCollapsedMarkers(a, b) {
  function collapsedSpanAtSide (line 216) | function collapsedSpanAtSide(line, start) {
  function collapsedSpanAtStart (line 226) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
  function collapsedSpanAtEnd (line 227) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
  function collapsedSpanAround (line 229) | function collapsedSpanAround(line, ch) {
  function conflictingCollapsedRange (line 242) | function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
  function visualLine (line 262) | function visualLine(line) {
  function visualLineEnd (line 269) | function visualLineEnd(line) {
  function visualLineContinued (line 278) | function visualLineContinued(line) {
  function visualLineNo (line 289) | function visualLineNo(doc, lineN) {
  function visualLineEndNo (line 297) | function visualLineEndNo(doc, lineN) {
  function lineIsHidden (line 309) | function lineIsHidden(doc, line) {
  function lineIsHiddenInner (line 320) | function lineIsHiddenInner(doc, line, span) {
  function heightAtLine (line 337) | function heightAtLine(lineObj) {
  function lineLength (line 359) | function lineLength(line) {
  function findMaxLine (line 378) | function findMaxLine(cm) {

FILE: public/assets/lib/vendor/codemirror/src/line/utils_line.js
  function getLine (line 4) | function getLine(doc, n) {
  function getBetween (line 20) | function getBetween(doc, start, end) {
  function getLines (line 32) | function getLines(doc, from, to) {
  function updateLineHeight (line 40) | function updateLineHeight(line, height) {
  function lineNo (line 47) | function lineNo(line) {
  function lineAtHeight (line 61) | function lineAtHeight(chunk, h) {
  function isLine (line 81) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
  function lineNumberFor (line 83) | function lineNumberFor(options, i) {

FILE: public/assets/lib/vendor/codemirror/src/measurement/position_measurement.js
  function paddingTop (line 17) | function paddingTop(display) {return display.lineSpace.offsetTop}
  function paddingVert (line 18) | function paddingVert(display) {return display.mover.offsetHeight - displ...
  function paddingH (line 19) | function paddingH(display) {
  function scrollGap (line 28) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
  function displayWidth (line 29) | function displayWidth(cm) {
  function displayHeight (line 32) | function displayHeight(cm) {
  function ensureLineHeights (line 40) | function ensureLineHeights(cm, lineView, rect) {
  function mapFromLineView (line 61) | function mapFromLineView(lineView, line, lineN) {
  function updateExternalMeasurement (line 76) | function updateExternalMeasurement(cm, line) {
  function measureChar (line 89) | function measureChar(cm, line, ch, bias) {
  function findViewForLine (line 94) | function findViewForLine(cm, lineN) {
  function prepareMeasureForLine (line 107) | function prepareMeasureForLine(cm, line) {
  function measureCharPrepared (line 129) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
  function nodeAndOffsetInLineMap (line 151) | function nodeAndOffsetInLineMap(map, ch, bias) {
  function getUsefulRect (line 189) | function getUsefulRect(rects, bias) {
  function measureCharInner (line 199) | function measureCharInner(cm, prepared, ch, bias) {
  function maybeUpdateRectForZooming (line 252) | function maybeUpdateRectForZooming(measure, rect) {
  function clearLineMeasurementCacheFor (line 262) | function clearLineMeasurementCacheFor(lineView) {
  function clearLineMeasurementCache (line 271) | function clearLineMeasurementCache(cm) {
  function clearCaches (line 278) | function clearCaches(cm) {
  function pageScrollX (line 285) | function pageScrollX(doc) {
  function pageScrollY (line 292) | function pageScrollY(doc) {
  function widgetTopHeight (line 297) | function widgetTopHeight(lineObj) {
  function intoCoordSystem (line 308) | function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
  function fromCoordSystem (line 330) | function fromCoordSystem(cm, coords, context) {
  function charCoords (line 347) | function charCoords(cm, pos, context, lineObj, bias) {
  function cursorCoords (line 368) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
  function estimateCoords (line 399) | function estimateCoords(cm, pos) {
  function PosWithInfo (line 414) | function PosWithInfo(line, ch, sticky, outside, xRel) {
  function coordsChar (line 423) | function coordsChar(cm, x, y) {
  function wrappedLineExtent (line 443) | function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
  function wrappedLineExtentChar (line 451) | function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
  function boxIsAfter (line 459) | function boxIsAfter(box, x, y, left) {
  function coordsCharInner (line 463) | function coordsCharInner(cm, lineObj, lineNo, x, y) {
  function coordsBidiPart (line 530) | function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, ...
  function coordsBidiPartWrapped (line 554) | function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, or...
  function textHeight (line 587) | function textHeight(display) {
  function charWidth (line 607) | function charWidth(display) {
  function getDimensions (line 619) | function getDimensions(cm) {
  function compensateForHScroll (line 637) | function compensateForHScroll(display) {
  function estimateHeight (line 644) | function estimateHeight(cm) {
  function estimateLineHeights (line 662) | function estimateLineHeights(cm) {
  function posFromMouse (line 675) | function posFromMouse(cm, e, liberal, forRect) {
  function findViewIndex (line 693) | function findViewIndex(cm, n) {

FILE: public/assets/lib/vendor/codemirror/src/measurement/widgets.js
  function widgetHeight (line 4) | function widgetHeight(widget) {
  function eventInWidget (line 20) | function eventInWidget(display, e) {

FILE: public/assets/lib/vendor/codemirror/src/model/change_measurement.js
  function changeEnd (line 8) | function changeEnd(change) {
  function adjustForChange (line 16) | function adjustForChange(pos, change) {
  function computeSelAfterChange (line 25) | function computeSelAfterChange(doc, change) {
  function offsetPos (line 35) | function offsetPos(pos, old, nw) {
  function computeReplacedSel (line 44) | function computeReplacedSel(doc, changes, hint) {

FILE: public/assets/lib/vendor/codemirror/src/model/changes.js
  function filterChange (line 23) | function filterChange(doc, change, update) {
  function makeChange (line 50) | function makeChange(doc, change, ignoreReadOnly) {
  function makeChangeInner (line 72) | function makeChangeInner(doc, change) {
  function makeChangeFromHistory (line 90) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
  function shiftDoc (line 160) | function shiftDoc(doc, distance) {
  function makeChangeSingleDoc (line 176) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
  function makeChangeSingleDocInEditor (line 212) | function makeChangeSingleDocInEditor(cm, change, spans) {
  function replaceRange (line 270) | function replaceRange(doc, code, from, to, origin) {
  function rebaseHistSelSingle (line 279) | function rebaseHistSelSingle(pos, from, to, diff) {
  function rebaseHistArray (line 295) | function rebaseHistArray(array, from, to, diff) {
  function rebaseHist (line 323) | function rebaseHist(hist, change) {
  function changeLine (line 332) | function changeLine(doc, handle, changeType, op) {

FILE: public/assets/lib/vendor/codemirror/src/model/chunk.js
  function LeafChunk (line 18) | function LeafChunk(lines) {
  method chunkSize (line 30) | chunkSize() { return this.lines.length }
  method removeInner (line 33) | removeInner(at, n) {
  method collapse (line 44) | collapse(lines) {
  method insertInner (line 50) | insertInner(at, lines, height) {
  method iterN (line 57) | iterN(at, n, op) {
  function BranchChunk (line 63) | function BranchChunk(children) {
  method chunkSize (line 77) | chunkSize() { return this.size }
  method removeInner (line 79) | removeInner(at, n) {
  method collapse (line 103) | collapse(lines) {
  method insertInner (line 107) | insertInner(at, lines, height) {
  method maybeSpill (line 134) | maybeSpill() {
  method iterN (line 156) | iterN(at, n, op) {

FILE: public/assets/lib/vendor/codemirror/src/model/document_data.js
  function isWholeLineUpdate (line 17) | function isWholeLineUpdate(doc, change) {
  function updateDoc (line 23) | function updateDoc(doc, change, markedSpans, estimateHeight) {
  function linkedDocs (line 75) | function linkedDocs(doc, f, sharedHistOnly) {
  function attachDoc (line 90) | function attachDoc(cm, doc) {
  function setDirectionClass (line 103) | function setDirectionClass(cm) {
  function directionChanged (line 107) | function directionChanged(cm) {

FILE: public/assets/lib/vendor/codemirror/src/model/history.js
  function History (line 11) | function History(prev) {
  function historyChangeFromChange (line 28) | function historyChangeFromChange(doc, change) {
  function clearSelectionEvents (line 37) | function clearSelectionEvents(array) {
  function lastChangeEvent (line 47) | function lastChangeEvent(hist, force) {
  function addChangeToHistory (line 62) | function addChangeToHistory(doc, change, selAfter, opId) {
  function selectionEventCanBeMerged (line 105) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
  function addSelectionToHistory (line 118) | function addSelectionToHistory(doc, sel, opId, options) {
  function pushSelectionToHistory (line 140) | function pushSelectionToHistory(sel, dest) {
  function attachLocalSpans (line 147) | function attachLocalSpans(doc, change, from, to) {
  function removeClearedSpans (line 158) | function removeClearedSpans(spans) {
  function getOldSpans (line 169) | function getOldSpans(doc, change) {
  function mergeOldSpans (line 182) | function mergeOldSpans(doc, change) {
  function copyHistoryArray (line 206) | function copyHistoryArray(events, newGroup, instantiateSel) {

FILE: public/assets/lib/vendor/codemirror/src/model/line_widget.js
  class LineWidget (line 13) | class LineWidget {
    method constructor (line 14) | constructor(doc, node, options) {
    method clear (line 21) | clear() {
    method changed (line 37) | changed() {
  function adjustScrollWhenAboveVisible (line 54) | function adjustScrollWhenAboveVisible(cm, line, diff) {
  function addLineWidget (line 59) | function addLineWidget(doc, handle, node, options) {

FILE: public/assets/lib/vendor/codemirror/src/model/mark_text.js
  class TextMarker (line 35) | class TextMarker {
    method constructor (line 36) | constructor(doc, type) {
    method clear (line 44) | clear() {
    method find (line 91) | find(side, lineObj) {
    method changed (line 111) | changed() {
    method attachLine (line 133) | attachLine(line) {
    method detachLine (line 142) | detachLine(line) {
  function markText (line 153) | function markText(doc, from, to, options, type) {
  class SharedTextMarker (line 228) | class SharedTextMarker {
    method constructor (line 229) | constructor(markers, primary) {
    method clear (line 236) | clear() {
    method find (line 244) | find(side, lineObj) {
  function markTextShared (line 250) | function markTextShared(doc, from, to, options, type) {
  function findSharedMarkers (line 265) | function findSharedMarkers(doc) {
  function copySharedMarkers (line 269) | function copySharedMarkers(doc, markers) {
  function detachSharedMarkers (line 281) | function detachSharedMarkers(markers) {

FILE: public/assets/lib/vendor/codemirror/src/model/selection.js
  class Selection (line 9) | class Selection {
    method constructor (line 10) | constructor(ranges, primIndex) {
    method primary (line 15) | primary() { return this.ranges[this.primIndex] }
    method equals (line 17) | equals(other) {
    method deepCopy (line 27) | deepCopy() {
    method somethingSelected (line 34) | somethingSelected() {
    method contains (line 40) | contains(pos, end) {
  class Range (line 51) | class Range {
    method constructor (line 52) | constructor(anchor, head) {
    method from (line 56) | from() { return minPos(this.anchor, this.head) }
    method to (line 57) | to() { return maxPos(this.anchor, this.head) }
    method empty (line 58) | empty() { return this.head.line == this.anchor.line && this.head.ch ==...
  function normalizeSelection (line 64) | function normalizeSelection(cm, ranges, primIndex) {
  function simpleSelection (line 82) | function simpleSelection(anchor, head) {

FILE: public/assets/lib/vendor/codemirror/src/model/selection_updates.js
  function extendRange (line 19) | function extendRange(range, head, other, extend) {
  function extendSelection (line 38) | function extendSelection(doc, head, other, options, extend) {
  function extendSelections (line 45) | function extendSelections(doc, heads, options) {
  function replaceOneSelection (line 55) | function replaceOneSelection(doc, i, range, options) {
  function setSimpleSelection (line 62) | function setSimpleSelection(doc, anchor, head, options) {
  function filterSelectionChange (line 68) | function filterSelectionChange(doc, sel, options) {
  function setSelectionReplaceHistory (line 85) | function setSelectionReplaceHistory(doc, sel, options) {
  function setSelection (line 96) | function setSelection(doc, sel, options) {
  function setSelectionNoUndo (line 101) | function setSelectionNoUndo(doc, sel, options) {
  function setSelectionInner (line 113) | function setSelectionInner(doc, sel) {
  function reCheckSelection (line 128) | function reCheckSelection(doc) {
  function skipAtomicInSelection (line 134) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
  function skipAtomicInner (line 149) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
  function skipAtomic (line 189) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
  function movePos (line 202) | function movePos(doc, pos, dir, line) {
  function selectAll (line 214) | function selectAll(cm) {

FILE: public/assets/lib/vendor/codemirror/src/modes.js
  function defineMode (line 9) | function defineMode(name, mode) {
  function defineMIME (line 15) | function defineMIME(mime, spec) {
  function resolveMode (line 21) | function resolveMode(spec) {
  function getMode (line 40) | function getMode(options, spec) {
  function extendMode (line 64) | function extendMode(mode, properties) {
  function copyState (line 69) | function copyState(mode, state) {
  function innerMode (line 83) | function innerMode(mode, state) {
  function startState (line 94) | function startState(mode, a1, a2) {

FILE: public/assets/lib/vendor/codemirror/src/util/StringStream.js
  class StringStream (line 8) | class StringStream {
    method constructor (line 9) | constructor(string, tabSize, lineOracle) {
    method eol (line 18) | eol() {return this.pos >= this.string.length}
    method sol (line 19) | sol() {return this.pos == this.lineStart}
    method peek (line 20) | peek() {return this.string.charAt(this.pos) || undefined}
    method next (line 21) | next() {
    method eat (line 25) | eat(match) {
    method eatWhile (line 32) | eatWhile(match) {
    method eatSpace (line 37) | eatSpace() {
    method skipToEnd (line 42) | skipToEnd() {this.pos = this.string.length}
    method skipTo (line 43) | skipTo(ch) {
    method backUp (line 47) | backUp(n) {this.pos -= n}
    method column (line 48) | column() {
    method indentation (line 55) | indentation() {
    method match (line 59) | match(pattern, consume, caseInsensitive) {
    method current (line 74) | current(){return this.string.slice(this.start, this.pos)}
    method hideFirstChars (line 75) | hideFirstChars(n, inner) {
    method lookAhead (line 80) | lookAhead(n) {
    method baseToken (line 84) | baseToken() {

FILE: public/assets/lib/vendor/codemirror/src/util/bidi.js
  function iterateBidiSections (line 5) | function iterateBidiSections(order, from, to, f) {
  function getBidiPartAt (line 19) | function getBidiPartAt(order, ch, sticky) {
  function charType (line 65) | function charType(code) {
  function BidiSpan (line 78) | function BidiSpan(level, from, to) {
  function getOrder (line 211) | function getOrder(line, direction) {

FILE: public/assets/lib/vendor/codemirror/src/util/dom.js
  function classTest (line 3) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
  function removeChildren (line 14) | function removeChildren(e) {
  function removeChildrenAndAdd (line 20) | function removeChildrenAndAdd(parent, e) {
  function elt (line 24) | function elt(tag, content, className, style) {
  function eltP (line 33) | function eltP(tag, content, className, style) {
  function contains (line 56) | function contains(parent, child) {
  function activeElt (line 67) | function activeElt(rootNode) {
  function addClass (line 83) | function addClass(node, cls) {
  function joinClasses (line 87) | function joinClasses(a, b) {
  function doc (line 100) | function doc(cm) { return cm.display.wrapper.ownerDocument }
  function root (line 102) | function root(cm) {
  function rootNode (line 106) | function rootNode(element) {
  function win (line 111) | function win(cm) { return doc(cm).defaultView }

FILE: public/assets/lib/vendor/codemirror/src/util/event.js
  function getHandlers (line 22) | function getHandlers(emitter, type) {
  function off (line 26) | function off(emitter, type, f) {
  function signal (line 41) | function signal(emitter, type /*, values...*/) {
  function signalDOMEvent (line 51) | function signalDOMEvent(cm, e, override) {
  function signalCursorActivity (line 58) | function signalCursorActivity(cm) {
  function hasHandler (line 66) | function hasHandler(emitter, type) {
  function eventMixin (line 72) | function eventMixin(ctor) {
  function e_preventDefault (line 80) | function e_preventDefault(e) {
  function e_stopPropagation (line 84) | function e_stopPropagation(e) {
  function e_defaultPrevented (line 88) | function e_defaultPrevented(e) {
  function e_stop (line 91) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)}
  function e_target (line 93) | function e_target(e) {return e.target || e.srcElement}
  function e_button (line 94) | function e_button(e) {

FILE: public/assets/lib/vendor/codemirror/src/util/feature_detection.js
  function zeroWidthElement (line 14) | function zeroWidthElement(measure) {
  function hasBadBidiRects (line 29) | function hasBadBidiRects(measure) {
  function hasBadZoomedRects (line 78) | function hasBadZoomedRects(measure) {

FILE: public/assets/lib/vendor/codemirror/src/util/misc.js
  function bind (line 1) | function bind(f) {
  function copyObj (line 6) | function copyObj(obj, target, overwrite) {
  function countColumn (line 16) | function countColumn(string, end, tabSize, startIndex, startValue) {
  class Delayed (line 31) | class Delayed {
    method constructor (line 32) | constructor() {
    method onTimeout (line 38) | onTimeout(self) {
    method set (line 46) | set(ms, f) {
  function indexOf (line 57) | function indexOf(array, elt) {
  function findColumn (line 75) | function findColumn(string, goal, tabSize) {
  function spaceStr (line 90) | function spaceStr(n) {
  function lst (line 96) | function lst(arr) { return arr[arr.length-1] }
  function map (line 98) | function map(array, f) {
  function insertSorted (line 104) | function insertSorted(array, value, score) {
  function nothing (line 110) | function nothing() {}
  function createObj (line 112) | function createObj(base, props) {
  function isWordCharBasic (line 125) | function isWordCharBasic(ch) {
  function isWordChar (line 129) | function isWordChar(ch, helper) {
  function isEmpty (line 135) | function isEmpty(obj) {
  function isExtendingChar (line 146) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
  function skipExtendingChars (line 149) | function skipExtendingChars(str, pos, dir) {
  function findFirst (line 157) | function findFirst(pred, from, to) {

FILE: public/assets/lib/vendor/codemirror/src/util/operation_group.js
  function pushOperation (line 5) | function pushOperation(op) {
  function fireCallbacksForOps (line 16) | function fireCallbacksForOps(group) {
  function finishOperation (line 32) | function finishOperation(op, endCb) {
  function signalLater (line 52) | function signalLater(emitter, type /*, values...*/) {
  function fireOrphanDelayed (line 68) | function fireOrphanDelayed() {

FILE: public/assets/lib/vendor/exif-js.js
  function i (line 7) | function i(e){return!!e.exifdata}
  function r (line 7) | function r(i,o){function t(e){var t=p(e);i.exifdata=t||{};var n=function...
  function p (line 7) | function p(e){var t=new DataView(e);if(d&&console.log("Got file of lengt...
  function S (line 7) | function S(e,t,n){for(var r,i,o,a,s=new DataView(e),l={},u=t;u<t+n;)28==...
  function P (line 7) | function P(e,t,n,r,i){var o,a,s,l=e.getUint16(n,!i),u={};for(s=0;s<l;s++...
  function F (line 7) | function F(e,t,n,r,i){var o,a,s,l,u,c,d=e.getUint16(t+2,!i),f=e.getUint3...
  function y (line 7) | function y(e,t,r){var i="";for(n=t;n<t+r;n++)i+=String.fromCharCode(e.ge...
  function o (line 7) | function o(e,t){if("Exif"!=y(e,t,4))return d&&console.log("Not valid EXI...
  function b (line 7) | function b(e){var t={};if(1==e.nodeType){if(0<e.attributes.length){t["@a...
  function x (line 7) | function x(e){try{var t={};if(0<e.children.length)for(var n=0;n<e.childr...

FILE: public/assets/lib/vendor/hlsjs/hls.js
  function getDefaultExportFromCjs (line 2) | function getDefaultExportFromCjs (x) {
  function ownKeys (line 180) | function ownKeys(object, enumerableOnly) {
  function _objectSpread2 (line 190) | function _objectSpread2(target) {
  function _defineProperty (line 201) | function _defineProperty(obj, key, value) {
  function _extends (line 215) | function _extends() {
  function
Copy disabled (too large) Download .json
Condensed preview — 1285 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (13,964K chars).
[
  {
    "path": ".assets/raw/Makefile",
    "chars": 191,
    "preview": "all:\n\tconvert -delay 100 -loop 0 navigation_*.png navigation.gif\n\tconvert -delay 100 -loop 0 orgmode_*.png orgmode.gif\n\t"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 74,
    "preview": "# These are supported funding model platforms\n\nopen_collective: filestash\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.md",
    "chars": 670,
    "preview": "---\nname: Bug\nabout: Report a bug\ntitle: \"[bug] \"\nlabels: ''\nassignees: ''\n\n---\n\n# Description of the bug\n\n<!-- TO COMPL"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.md",
    "chars": 117,
    "preview": "---\nname: Feature Request\nabout: Request for a new feature\ntitle: \"[Feature Request] \"\nlabels: ''\nassignees: ''\n\n---\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/support.md",
    "chars": 584,
    "preview": "---\nname: Support\nabout: Technical support is only available on IRC\ntitle: \"[support] DO NOT CREATE A SUPPORT TICKET FRO"
  },
  {
    "path": ".github/stale.yml",
    "chars": 683,
    "preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1428,
    "preview": "# Contributing Guide\n\nThanks for taking the time to join our community and start contributing. This guide will help you "
  },
  {
    "path": "Jenkinsfile",
    "chars": 3238,
    "preview": "pipeline {\n    agent any\n    options {\n        buildDiscarder(logRotator(numToKeepStr: \"10\", artifactNumToKeepStr: \"1\"))"
  },
  {
    "path": "LICENSE",
    "chars": 34520,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "Makefile",
    "chars": 176,
    "preview": "all:\n\tmake init\n\tmake build\n\ninit:\n\tgo get ./...\n\tgo generate -x ./server/...\n\nbuild:\n\tgo build --tags \"fts5\" -o dist/fi"
  },
  {
    "path": "README.md",
    "chars": 12365,
    "preview": "![screenshot](https://raw.githubusercontent.com/mickael-kerjean/filestash_images/master/.assets/photo.jpg)\n\n# What is th"
  },
  {
    "path": "cmd/main.go",
    "chars": 1713,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/mickael-kerjean/filestash\"\n\t\"github.com/mi"
  },
  {
    "path": "config/config.json",
    "chars": 687,
    "preview": "{\n    \"general\": {\n    },\n    \"features\": {\n    },\n    \"log\": {\n    },\n    \"email\": {\n    },\n    \"oauth\": {\n    },\n    \""
  },
  {
    "path": "config/mime.json",
    "chars": 9528,
    "preview": "{\n\t\"10o\": \"image/x-10o\",\n\t\"3dm\": \"model/3dm\",\n\t\"3fr\": \"image/x-hasselblad-3fr\",\n\t\"3gp\": \"video/3gpp\",\n\t\"3gpp\": \"video/3g"
  },
  {
    "path": "docker/Dockerfile",
    "chars": 1429,
    "preview": "# STEP1: CLONE THE CODE\nFROM alpine/git as builder_prepare\nWORKDIR /home/\nARG GIT_REPO=https://github.com/mickael-kerjea"
  },
  {
    "path": "docker/docker-compose.yml",
    "chars": 980,
    "preview": "version: '2'\nservices:\n  app:\n    container_name: filestash\n    image: machines/filestash:latest\n    restart: always\n   "
  },
  {
    "path": "embed.go",
    "chars": 364,
    "preview": "package embed\n\nimport (\n\t\"embed\"\n\t\"io/fs\"\n\t\"net/http\"\n\t\"os\"\n)\n\nvar (\n\t//go:embed public\n\twwwPublic embed.FS\n\tWWWPublic h"
  },
  {
    "path": "go.mod",
    "chars": 8627,
    "preview": "module github.com/mickael-kerjean/filestash\n\ngo 1.24.11\n\nrequire (\n\tcloud.google.com/go/storage v1.59.0\n\tgithub.com/Azur"
  },
  {
    "path": "go.sum",
    "chars": 54622,
    "preview": "cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=\ncel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ"
  },
  {
    "path": "public/Makefile",
    "chars": 516,
    "preview": "compress:\n\tfind . -type f -name '*.html' | xargs brotli -f -k\n\tfind . -type f -name '*.html' | xargs gzip -f -k\n\tfind . "
  },
  {
    "path": "public/assets/boot/bundler_complete.js",
    "chars": 198,
    "preview": "document.head.appendChild(Object.assign(document.createElement(\"script\"), {\n    type: \"importmap\",\n    textContent: JSON"
  },
  {
    "path": "public/assets/boot/bundler_init.js",
    "chars": 1909,
    "preview": "window.bundler = (function(origin) {\n    const esModules = {};\n    return {\n        register: (path, code) => {\n        "
  },
  {
    "path": "public/assets/boot/common.js",
    "chars": 787,
    "preview": "export function $error(msg) {\n    const $code = document.createElement(\"code\");\n    $code.style.display = \"block\";\n    $"
  },
  {
    "path": "public/assets/boot/ctrl_boot.d.ts",
    "chars": 242,
    "preview": "export {};\n\ninterface IChromecast {\n    init: () => Promise<any>;\n}\n\ndeclare global {\n    interface Window {\n        env"
  },
  {
    "path": "public/assets/boot/ctrl_boot_backoffice.js",
    "chars": 1018,
    "preview": "import { report } from \"../helpers/log.js\";\nimport { $error } from \"./common.js\";\n\nexport default async function main() "
  },
  {
    "path": "public/assets/boot/ctrl_boot_frontoffice.js",
    "chars": 3478,
    "preview": "import { toHref } from \"../lib/skeleton/router.js\";\nimport { loadJS } from \"../helpers/loader.js\";\nimport { init as setu"
  },
  {
    "path": "public/assets/boot/router_backoffice.js",
    "chars": 552,
    "preview": "const routes = {\n    \"/admin/storage\": \"/pages/adminpage/ctrl_storage.js\",\n    \"/admin/workflow.*\": \"/pages/adminpage/ct"
  },
  {
    "path": "public/assets/boot/router_frontoffice.js",
    "chars": 373,
    "preview": "const routes = {\n    \"/login\": \"/pages/ctrl_connectpage.js\",\n    \"/logout\": \"/pages/ctrl_logout.js\",\n\n    \"/\": \"/pages/c"
  },
  {
    "path": "public/assets/components/breadcrumb.css",
    "chars": 4704,
    "preview": ".component_breadcrumb {\n    position: relative;\n    z-index: 5;\n}\n.component_breadcrumb .breadcrumb {\n    margin: 0 0 0p"
  },
  {
    "path": "public/assets/components/breadcrumb.js",
    "chars": 11028,
    "preview": "import { toHref } from \"../lib/skeleton/router.js\";\nimport { animate, slideYOut, slideYIn, opacityOut } from \"../lib/ani"
  },
  {
    "path": "public/assets/components/decorator_shell_filemanager.css",
    "chars": 3238,
    "preview": ".component_filemanager_shell {\n    display: flex;\n    height: 100%;\n    background: white;\n}\n\n.component_filemanager_she"
  },
  {
    "path": "public/assets/components/decorator_shell_filemanager.js",
    "chars": 2804,
    "preview": "import { createElement, createRender } from \"../lib/skeleton/index.js\";\nimport { navigate, fromHref } from \"../lib/skele"
  },
  {
    "path": "public/assets/components/dropdown.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "public/assets/components/dropdown.js",
    "chars": 3610,
    "preview": "import { createFragment } from \"../lib/skeleton/index.js\";\nimport { animate, slideYIn } from \"../lib/animate.js\";\nimport"
  },
  {
    "path": "public/assets/components/fab.css",
    "chars": 466,
    "preview": ".component_fab {\n  position: fixed;\n  bottom: 20px;\n  right: 20px;\n  z-index: 2;\n  background: transparent;\n}\n.component"
  },
  {
    "path": "public/assets/components/fab.js",
    "chars": 549,
    "preview": "import { loadCSS } from \"../helpers/loader.js\";\nimport assert from \"../lib/assert.js\";\n\nexport default class ComponentFa"
  },
  {
    "path": "public/assets/components/form.js",
    "chars": 13870,
    "preview": "import { createElement } from \"../lib/skeleton/index.js\";\nimport { qs, safe } from \"../lib/dom.js\";\nimport { gid } from "
  },
  {
    "path": "public/assets/components/icon.js",
    "chars": 4194,
    "preview": "class Icon extends HTMLElement {\n    static get observedAttributes() {\n        return [\"name\"];\n    }\n\n    attributeChan"
  },
  {
    "path": "public/assets/components/loader.js",
    "chars": 3023,
    "preview": "import { createElement } from \"../lib/skeleton/index.js\";\nimport rxjs from \"../lib/rx.js\";\nimport { animate, opacityIn }"
  },
  {
    "path": "public/assets/components/modal.css",
    "chars": 1156,
    "preview": ".component_modal{\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    background: #f2f3f5f0;\n"
  },
  {
    "path": "public/assets/components/modal.js",
    "chars": 4856,
    "preview": "import { createElement } from \"../lib/skeleton/index.js\";\nimport assert from \"../lib/assert.js\";\nimport rxjs, { applyMut"
  },
  {
    "path": "public/assets/components/notification.css",
    "chars": 1696,
    "preview": ".component_notification {\n    position: fixed;\n    bottom: 20px;\n    left: 20px;\n    right: 70px;\n    font-size: 0.95em;"
  },
  {
    "path": "public/assets/components/notification.js",
    "chars": 4378,
    "preview": "import { createElement } from \"../lib/skeleton/index.js\";\nimport { qs } from \"../lib/dom.js\";\nimport { ApplicationError "
  },
  {
    "path": "public/assets/components/sidebar.css",
    "chars": 5194,
    "preview": "[data-bind=\"sidebar\"] {\n    z-index: 1;\n    display: flex;\n    width: 250px;\n}\n@media screen and (min-width: 1600px) {\n "
  },
  {
    "path": "public/assets/components/sidebar.js",
    "chars": 7338,
    "preview": "import { createElement, createRender, onDestroy } from \"../lib/skeleton/index.js\";\nimport rxjs, { effect, onClick } from"
  },
  {
    "path": "public/assets/components/sidebar_files.js",
    "chars": 8783,
    "preview": "import rxjs, { effect } from \"../lib/rx.js\";\nimport { createElement, createRender } from \"../lib/skeleton/index.js\";\nimp"
  },
  {
    "path": "public/assets/components/sidebar_tags.js",
    "chars": 5964,
    "preview": "import rxjs, { effect } from \"../lib/rx.js\";\nimport { createElement, createRender } from \"../lib/skeleton/index.js\";\nimp"
  },
  {
    "path": "public/assets/components/skeleton.js",
    "chars": 199,
    "preview": "export function generateSkeleton(n) {\n    const tmpl = \"<div class=\\\"component_skeleton\\\"></div>\";\n    let html = \"\";\n  "
  },
  {
    "path": "public/assets/css/designsystem.css",
    "chars": 3384,
    "preview": "@import url(\"./designsystem_input.css\");\n@import url(\"./designsystem_textarea.css\");\n@import url(\"./designsystem_inputgr"
  },
  {
    "path": "public/assets/css/designsystem_alert.css",
    "chars": 501,
    "preview": ".alert {\n    background: var(--bg-color);\n    border-radius: 5px;\n    padding: 20px;\n    margin-top: 20px;\n    margin-bo"
  },
  {
    "path": "public/assets/css/designsystem_box.css",
    "chars": 113,
    "preview": ".box{\n    padding: 10px;\n    cursor: pointer;\n    margin: 3px 0;\n    overflow: hidden;\n    position: relative;\n}\n"
  },
  {
    "path": "public/assets/css/designsystem_button.css",
    "chars": 710,
    "preview": "button {\n  border: none;\n  margin: 0;\n  padding: 6px;\n  display: inline-block;\n  cursor: pointer;\n  font-size: inherit;\n"
  },
  {
    "path": "public/assets/css/designsystem_checkbox.css",
    "chars": 1831,
    "preview": ".component_checkbox {\n  display: inline-block;\n  padding: 0;\n  height: 25px;\n  width: 25px;\n  vertical-align: middle;\n  "
  },
  {
    "path": "public/assets/css/designsystem_container.css",
    "chars": 101,
    "preview": ".component_container{\n    width: 95%;\n    max-width: 800px;\n    margin: 0 auto;\n    padding: 10px;\n}\n"
  },
  {
    "path": "public/assets/css/designsystem_darkmode.css",
    "chars": 188,
    "preview": "body.dark-mode {\n    --bg-color: #1e1f22;\n    --color: #f1f1f1;\n    --light: #dfe1e5;\n\n\n    --border: #303438;\n    --dar"
  },
  {
    "path": "public/assets/css/designsystem_dropdown.css",
    "chars": 2040,
    "preview": ".component_dropdown {\n    position: relative;\n}\n.component_dropdown .dropdown_container {\n    display: none;\n    positio"
  },
  {
    "path": "public/assets/css/designsystem_formbuilder.css",
    "chars": 1424,
    "preview": ".formbuilder .description {\n    margin-top: -2px;\n    margin-bottom: 10px;\n    opacity: 0.7;\n    font-size: 0.9em;\n    l"
  },
  {
    "path": "public/assets/css/designsystem_icon.css",
    "chars": 70,
    "preview": ".component_icon {\n    vertical-align: bottom;\n    max-height: 100%;\n}\n"
  },
  {
    "path": "public/assets/css/designsystem_input.css",
    "chars": 1406,
    "preview": ".component_input, .component_select {\n  background: inherit;\n  border: none;\n  border-radius: 0;\n  width: 100%;\n  displa"
  },
  {
    "path": "public/assets/css/designsystem_inputgroup.css",
    "chars": 827,
    "preview": ".input_group {\n    display: flex;\n    background: #fff;\n    border-radius: 3px;\n    box-shadow: 2px 2px 10px rgba(0,0,0,"
  },
  {
    "path": "public/assets/css/designsystem_skeleton.css",
    "chars": 368,
    "preview": ".component_skeleton {\n    width: 100%;\n    height: 30px;\n    background: linear-gradient(110deg, rgba(0,0,0,0.02) 8%, rg"
  },
  {
    "path": "public/assets/css/designsystem_textarea.css",
    "chars": 1066,
    "preview": "@font-face {\n    font-family: 'text-security-disc';\n    src: url(\"textarea.woff\") format(\"woff2\");\n}\n.component_textarea"
  },
  {
    "path": "public/assets/css/designsystem_utils.css",
    "chars": 763,
    "preview": ".pointer {\n    cursor: pointer;\n}\n\n.hidden{\n    position:absolute!important;\n    left:-10000px!important;\n    top:auto!i"
  },
  {
    "path": "public/assets/embed/filestash-image.js",
    "chars": 5970,
    "preview": "class FilestashImage extends HTMLElement {\n    constructor() {\n        super();\n        this.attachShadow({ mode: \"open\""
  },
  {
    "path": "public/assets/embed/filestash-map.js",
    "chars": 5870,
    "preview": "class FilestashMap extends HTMLElement {\n    constructor() {\n        super();\n        this.attachShadow({ mode: \"open\" }"
  },
  {
    "path": "public/assets/embed/filestash-table.js",
    "chars": 5907,
    "preview": "class FilestashTable extends HTMLElement {\n    constructor() {\n        super();\n        this.attachShadow({ mode: \"open\""
  },
  {
    "path": "public/assets/helpers/loader.d.ts",
    "chars": 447,
    "preview": "export function loadScript(url: string): Promise<string>;\n\nexport function loadJS(baseURL: string, path: string, opts?: "
  },
  {
    "path": "public/assets/helpers/loader.js",
    "chars": 3021,
    "preview": "import { onDestroy } from \"../lib/skeleton/index.js\";\n\nexport async function loadJS(baseURL, path, opts = {}) {\n    cons"
  },
  {
    "path": "public/assets/helpers/loader_wasm.js",
    "chars": 16097,
    "preview": "const DEBUG = false;\nconst log = (msg) => DEBUG && console.log(msg);\n\nconst wasmCache = new Map();\nlet wasiInstance;\n\nex"
  },
  {
    "path": "public/assets/helpers/log.d.ts",
    "chars": 104,
    "preview": "export function report(msg: Event|string, err?: any, link?: string, lineNo?: number, columnno?: number);"
  },
  {
    "path": "public/assets/helpers/log.js",
    "chars": 657,
    "preview": "import { toHref } from \"../lib/skeleton/router.js\";\nimport ajax from \"../lib/ajax.js\";\n\nexport function report(msg, err,"
  },
  {
    "path": "public/assets/helpers/sdk.js",
    "chars": 548,
    "preview": "// feature detection if we're using Filestash as a standalone app or as an SDK\n// see: ../index.js\n\nexport function isSD"
  },
  {
    "path": "public/assets/index.js",
    "chars": 1669,
    "preview": "// Want to create an integration via our SDK in your application? You are in the right place!\n//\n// How it works you may"
  },
  {
    "path": "public/assets/lib/ajax.js",
    "chars": 4444,
    "preview": "import rxjs, { ajax } from \"./rx.js\";\nimport { AjaxError } from \"./error.js\";\nimport { isSDK, urlSDK } from \"../helpers/"
  },
  {
    "path": "public/assets/lib/animate.d.ts",
    "chars": 1028,
    "preview": "type TransitionEnter = {\n    timeEnter: number;\n    enter: AnimationFrames[];\n}\ntype TransitionLeave = {\n    timeLeave: "
  },
  {
    "path": "public/assets/lib/animate.js",
    "chars": 2064,
    "preview": "import { onDestroy, nop } from \"./skeleton/index.js\";\n\nexport function transition($node, opts = {}) {\n    const {\n      "
  },
  {
    "path": "public/assets/lib/assert.js",
    "chars": 1266,
    "preview": "export default class assert {\n    /**\n     * @param {*} object\n     * @param {Function} type\n     * @param {string} [msg"
  },
  {
    "path": "public/assets/lib/chromecast.js",
    "chars": 2657,
    "preview": "class ChromecastManager {\n    init() {\n        // TODO: additional rules for setup\n        const src = \"https://www.gsta"
  },
  {
    "path": "public/assets/lib/dom.d.ts",
    "chars": 207,
    "preview": "export function qs($node: HTMLElement | DocumentFragment, selector: string);\n\nexport function qsa($node: HTMLElement | D"
  },
  {
    "path": "public/assets/lib/dom.js",
    "chars": 625,
    "preview": "export function qs($node, selector) {\n    if (!$node) throw new TypeError(\"undefined node\");\n    const $target = $node.q"
  },
  {
    "path": "public/assets/lib/error.d.ts",
    "chars": 318,
    "preview": "export class AjaxError extends Error {\n    constructor(message: string, err?: any, code?: string);\n    code(): string;\n "
  },
  {
    "path": "public/assets/lib/error.js",
    "chars": 639,
    "preview": "export class AjaxError extends Error {\n    constructor(message, err = null, code = \"UNDEFINED_CODE\") {\n        super(mes"
  },
  {
    "path": "public/assets/lib/form.d.ts",
    "chars": 261,
    "preview": "// type FormOption = {\n// };\n\nexport function mutateForm(formSpec: object, formState: object): object;\n\nexport function "
  },
  {
    "path": "public/assets/lib/form.js",
    "chars": 5652,
    "preview": "import { createElement } from \"./skeleton/index.js\";\nimport { ApplicationError } from \"./error.js\";\nimport { animate } f"
  },
  {
    "path": "public/assets/lib/path.js",
    "chars": 757,
    "preview": "export function basename(str, sep = \"/\") {\n    return str.substr(str.lastIndexOf(sep) + 1);\n}\n\nexport function extname(s"
  },
  {
    "path": "public/assets/lib/polyfill.js",
    "chars": 353,
    "preview": "Document.prototype.replaceChildren = replaceChildren;\nDocumentFragment.prototype.replaceChildren = replaceChildren;\nElem"
  },
  {
    "path": "public/assets/lib/random.d.ts",
    "chars": 98,
    "preview": "export function gid(prefix: string): string;\n\nexport function randomString(size: number): string;\n"
  },
  {
    "path": "public/assets/lib/random.js",
    "chars": 743,
    "preview": "export function gid(prefix = \"\") {\n    let id = prefix;\n    id += new Date().getTime().toString(32);\n    id += Math.rand"
  },
  {
    "path": "public/assets/lib/rx.d.ts",
    "chars": 2586,
    "preview": "import type { Observer, Observable as coreObservable } from \"rx-core\";\n\nimport {\n    fromEvent, startWith, Observable,\n "
  },
  {
    "path": "public/assets/lib/rx.js",
    "chars": 2063,
    "preview": "import { onDestroy } from \"./skeleton/index.js\";\nimport assert from \"./assert.js\";\nimport * as rxjs from \"./vendor/rxjs/"
  },
  {
    "path": "public/assets/lib/settings.js",
    "chars": 410,
    "preview": "const settings = JSON.parse(window.localStorage.getItem(\"settings\") || \"null\") || {};\n\nexport function settings_get(key,"
  },
  {
    "path": "public/assets/lib/skeleton/index.d.ts",
    "chars": 428,
    "preview": "import { onDestroy } from \"./lifecycle\";\nimport { navigate } from \"./router\";\n\nexport default function($root: HTMLElemen"
  },
  {
    "path": "public/assets/lib/skeleton/index.js",
    "chars": 3059,
    "preview": "import { init as initRouter, currentRoute } from \"./router.js\";\nimport { init as initDOM } from \"./lifecycle.js\";\n\nexpor"
  },
  {
    "path": "public/assets/lib/skeleton/lifecycle.d.ts",
    "chars": 113,
    "preview": "export function init($root: HTMLElement): Promise<void>;\n\nexport function onDestroy(fn: Function): Promise<void>;"
  },
  {
    "path": "public/assets/lib/skeleton/lifecycle.js",
    "chars": 266,
    "preview": "let _cleanup = [];\n\nexport async function init($root) {\n    $root.cleanup = () => {\n        const fns = _cleanup.map((fn"
  },
  {
    "path": "public/assets/lib/skeleton/router.d.ts",
    "chars": 277,
    "preview": "export function init($root: HTMLElement): Promise<void>;\n\nexport function navigate(href: string);\n\nexport function curre"
  },
  {
    "path": "public/assets/lib/skeleton/router.js",
    "chars": 1679,
    "preview": "const triggerPageChange = () => window.dispatchEvent(new window.Event(\"pagechange\"));\nconst trimPrefix = (value = \"\", pr"
  },
  {
    "path": "public/assets/lib/store.js",
    "chars": 811,
    "preview": "export function settingsGet(initialValues, prefix = \"\") {\n    const raw = JSON.parse(localStorage.getItem(\"settings\") ||"
  },
  {
    "path": "public/assets/lib/vendor/bcrypt.js",
    "chars": 44963,
    "preview": "// @ts-nocheck\r\n// code was adapted from https://github.com/dcodeIO/bcrypt.js, meaning:\r\n// - we took the code from a CD"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/.editorconfig",
    "chars": 87,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\n"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/.gitattributes",
    "chars": 160,
    "preview": "*.txt   text eol=lf\n*.js    text eol=lf\n*.html  text eol=lf\n*.md    text eol=lf\n*.json  text eol=lf\n*.yml   text eol=lf\n"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/.npmignore",
    "chars": 169,
    "preview": "/node_modules\n/demo\n/doc\n/test\n/test*.html\n/index.html\n/mode/*/*test.js\n/mode/*/*.html\n/mode/index.html\n.*\n/bin/authors."
  },
  {
    "path": "public/assets/lib/vendor/codemirror/AUTHORS",
    "chars": 12810,
    "preview": "List of CodeMirror contributors. Updated before every release.\n\n4oo4\n4r2r\nAaron Brooks\nAbdelouahab\nAbdussalam Abdurrahma"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/CHANGELOG.md",
    "chars": 115850,
    "preview": "## 5.65.16 (2023-11-20)\n\n### Bug fixes\n\nFix focus tracking in shadow DOM.\n\n[go mode](https://codemirror.net/5/mode/go/):"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/CONTRIBUTING.md",
    "chars": 3857,
    "preview": "# How to contribute\n\n- [Getting help](#getting-help)\n- [Submitting bug reports](#submitting-bug-reports)\n- [Contributing"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/LICENSE",
    "chars": 1113,
    "preview": "MIT License\n\nCopyright (C) 2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others\n\nPermission is hereby granted, "
  },
  {
    "path": "public/assets/lib/vendor/codemirror/README.md",
    "chars": 2001,
    "preview": "# CodeMirror 5\n\n**NOTE:** [CodeMirror 6](https://codemirror.net/) exists, and is more mobile-friendly, more accessible, "
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/comment/comment.js",
    "chars": 9230,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/comment/continuecomment.js",
    "chars": 4849,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/dialog/dialog.css",
    "chars": 507,
    "preview": ".CodeMirror-dialog {\n  position: absolute;\n  left: 0; right: 0;\n  background: inherit;\n  z-index: 15;\n  padding: .1em .8"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/dialog/dialog.js",
    "chars": 5252,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/display/autorefresh.js",
    "chars": 1546,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/display/fullscreen.css",
    "chars": 116,
    "preview": ".CodeMirror-fullscreen {\n  position: fixed;\n  top: 0; left: 0; right: 0; bottom: 0;\n  height: auto;\n  z-index: 9;\n}\n"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/display/fullscreen.js",
    "chars": 1497,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/display/panel.js",
    "chars": 4661,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/display/placeholder.js",
    "chars": 2831,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/display/rulers.js",
    "chars": 1918,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/edit/closebrackets.js",
    "chars": 7123,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/edit/closetag.js",
    "chars": 8544,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/edit/continuelist.js",
    "chars": 3989,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/edit/matchbrackets.js",
    "chars": 6818,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/edit/matchtags.js",
    "chars": 2358,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/edit/trailingspace.js",
    "chars": 1006,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/brace-fold.js",
    "chars": 4475,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/comment-fold.js",
    "chars": 2164,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/foldcode.js",
    "chars": 4985,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/foldgutter.css",
    "chars": 435,
    "preview": ".CodeMirror-foldmarker {\n  color: blue;\n  text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1p"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/foldgutter.js",
    "chars": 5539,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/indent-fold.js",
    "chars": 1676,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/markdown-fold.js",
    "chars": 1608,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/fold/xml-fold.js",
    "chars": 6702,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/anyword-hint.js",
    "chars": 1683,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/css-hint.js",
    "chars": 2580,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/html-hint.js",
    "chars": 11458,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/javascript-hint.js",
    "chars": 6855,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/show-hint.css",
    "chars": 649,
    "preview": ".CodeMirror-hints {\n  position: absolute;\n  z-index: 10;\n  overflow: hidden;\n  list-style: none;\n\n  margin: 0;\n  padding"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/show-hint.js",
    "chars": 19792,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/sql-hint.js",
    "chars": 9595,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/hint/xml-hint.js",
    "chars": 5705,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/coffeescript-lint.js",
    "chars": 1468,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/css-lint.js",
    "chars": 1312,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/html-lint.js",
    "chars": 1991,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/javascript-lint.js",
    "chars": 2161,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/json-lint.js",
    "chars": 1335,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/lint.css",
    "chars": 3035,
    "preview": "/* The lint marker gutter */\n.CodeMirror-lint-markers {\n  width: 16px;\n}\n\n.CodeMirror-lint-tooltip {\n  background-color:"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/lint.js",
    "chars": 9841,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/lint/yaml-lint.js",
    "chars": 1257,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/merge/merge.css",
    "chars": 3423,
    "preview": ".CodeMirror-merge {\n  position: relative;\n  border: 1px solid #ddd;\n  white-space: pre;\n}\n\n.CodeMirror-merge, .CodeMirro"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/merge/merge.js",
    "chars": 38660,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/mode/loadmode.js",
    "chars": 2543,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/mode/multiplex.js",
    "chars": 5191,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/mode/multiplex_test.js",
    "chars": 1367,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/mode/overlay.js",
    "chars": 3243,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/mode/simple.js",
    "chars": 8076,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/runmode/colorize.js",
    "chars": 1308,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/runmode/runmode-standalone.js",
    "chars": 12053,
    "preview": "(function () {\n  'use strict';\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for ("
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/runmode/runmode.js",
    "chars": 2777,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/runmode/runmode.node.js",
    "chars": 11498,
    "preview": "'use strict';\n\nfunction copyObj(obj, target, overwrite) {\n  if (!target) { target = {}; }\n  for (var prop in obj)\n    { "
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/scroll/annotatescrollbar.js",
    "chars": 4630,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/scroll/scrollpastend.js",
    "chars": 1584,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/scroll/simplescrollbars.css",
    "chars": 1347,
    "preview": ".CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div {\n  position: absolute;\n  background: #cc"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/scroll/simplescrollbars.js",
    "chars": 5465,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/search/jump-to-line.js",
    "chars": 2143,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/search/match-highlighter.js",
    "chars": 6216,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/search/matchesonscrollbar.css",
    "chars": 188,
    "preview": ".CodeMirror-search-match {\n  background: gold;\n  border-top: 1px solid orange;\n  border-bottom: 1px solid orange;\n  -moz"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/search/matchesonscrollbar.js",
    "chars": 3858,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/search/search.js",
    "chars": 11863,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/search/searchcursor.js",
    "chars": 12234,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/selection/active-line.js",
    "chars": 2509,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/selection/mark-selection.js",
    "chars": 3849,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/selection/selection-pointer.js",
    "chars": 3295,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/tern/tern.css",
    "chars": 1872,
    "preview": ".CodeMirror-Tern-completion {\n  padding-left: 22px;\n  position: relative;\n  line-height: 1.5;\n}\n.CodeMirror-Tern-complet"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/tern/tern.js",
    "chars": 26442,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/tern/worker.js",
    "chars": 1211,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/addon/wrap/hardwrap.js",
    "chars": 6109,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/bin/authors.sh",
    "chars": 351,
    "preview": "# Combine existing list of authors with everyone known in git, sort, add header.\ntail --lines=+3 AUTHORS > AUTHORS.tmp\ng"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/bin/lint",
    "chars": 71,
    "preview": "#!/usr/bin/env node\n\nprocess.exit(require(\"../test/lint\").ok ? 0 : 1);\n"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/bin/release",
    "chars": 1249,
    "preview": "#!/usr/bin/env node\n\nvar fs = require(\"fs\"), child = require(\"child_process\");\n\nvar number, bumpOnly;\n\nfor (var i = 2; i"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/bin/source-highlight",
    "chars": 1389,
    "preview": "#!/usr/bin/env node\n\n// Simple command-line code highlighting tool. Reads code from stdin,\n// spits html to stdout. For "
  },
  {
    "path": "public/assets/lib/vendor/codemirror/bin/upload-release.js",
    "chars": 1234,
    "preview": "\"use strict\"\n\nlet version = process.argv[2]\nlet auth = process.argv[3]\nlet url = require(\"url\")\n\nif (!auth) {\n  console."
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/activeline.html",
    "chars": 3223,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Active Line Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc/d"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/anywordhint.html",
    "chars": 2756,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Any Word Completion Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\""
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/bidi.html",
    "chars": 4241,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Bi-directional Text Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\""
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/btree.html",
    "chars": 2946,
    "preview": "<!doctype html>\n\n<title>CodeMirror: B-Tree visualization</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/buffers.html",
    "chars": 3552,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Multiple Buffer & Split View Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=styleshe"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/changemode.html",
    "chars": 1705,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Mode-Changing Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/closebrackets.html",
    "chars": 1643,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Closebrackets Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/closetag.html",
    "chars": 1381,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Close-Tag Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc/doc"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/complete.html",
    "chars": 4292,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Autocomplete Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc/"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/emacs.html",
    "chars": 2493,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Emacs bindings demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../do"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/folding.html",
    "chars": 5790,
    "preview": "<!doctype html>\n\n<head>\n  <title>CodeMirror: Code Folding Demo</title>\n  <meta charset=\"utf-8\"/>\n  <link rel=stylesheet "
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/fullscreen.html",
    "chars": 3460,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Full Screen Editing</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../do"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/hardwrap.html",
    "chars": 2560,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Hard-wrapping Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/html5complete.html",
    "chars": 1733,
    "preview": "<!doctype html>\n\n<head>\n  <title>CodeMirror: HTML completion demo</title>\n  <meta charset=\"utf-8\"/>\n  <link rel=styleshe"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/indentwrap.html",
    "chars": 2567,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Indented wrapped line demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/lint.html",
    "chars": 4064,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Linter Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc/docs.c"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/loadmode.html",
    "chars": 2212,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Lazy Mode Loading Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\".."
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/marker.html",
    "chars": 1471,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Breakpoint Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../doc/do"
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/markselection.html",
    "chars": 1864,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Selection Marking Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\".."
  },
  {
    "path": "public/assets/lib/vendor/codemirror/demo/matchhighlighter.html",
    "chars": 4827,
    "preview": "<!doctype html>\n\n<title>CodeMirror: Match Highlighter Demo</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\".."
  }
]

// ... and 1085 more files (download for full content)

About this extraction

This page contains the full source code of the mickael-kerjean/filestash GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1285 files (12.5 MB), approximately 3.4M tokens, and a symbol index with 16051 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!