├── .dockerignore ├── .editorconfig ├── .fdignore ├── .github ├── CODEOWNERS ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml └── workflows │ ├── package_wheels.yml │ ├── publish_action.yml │ ├── release.yml │ └── test_embedded.yml ├── .gitignore ├── .gitmodules ├── .nvim.lua ├── .pre-commit-config.yaml ├── .prettierrc ├── .release_ignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── INSTALL.md ├── LICENSE ├── README.md ├── __init__.py ├── biome.json ├── cliff.toml ├── data └── font.ttf ├── endpoint.py ├── env.nu ├── errors.py ├── examples ├── 01-faceswap.json ├── 02-film_interpolation.json ├── 03-animation_builder-condition-lerp.json ├── 04-animation_builder-deforum.json ├── 05-seamless_texture.json ├── 06-seamless_equilateral.json ├── 08-note-plus.json └── README.md ├── html ├── js │ ├── foldable.js │ ├── saveTableData.js │ ├── splitPane.js │ └── tabSwitch.js └── style.css ├── install.py ├── log.py ├── node_list.json ├── nodes ├── __init__.py ├── animation.py ├── audio.py ├── batch.py ├── conditions.py ├── constant.py ├── crop.py ├── curve.py ├── debug.py ├── deep_bump.py ├── faceenhance.py ├── faceswap.py ├── filter.py ├── generate.py ├── graph_utils.py ├── image_interpolation.py ├── image_processing.py ├── image_utils.py ├── io.py ├── latent_processing.py ├── ltx.py ├── mask.py ├── model.py ├── number.py ├── postshot.py ├── prune.py ├── qrcode.py ├── transform.py ├── video.py └── vitmatte.py ├── pyproject.toml ├── pyrightconfig.json ├── requirements.txt ├── scripts ├── a111_extract.py ├── comfy_meta.py ├── download_models.py ├── get_deps.py ├── interpolate_frames.py └── update_changelog.nu ├── styles.csv ├── types ├── shared.d.ts └── typedefs.js ├── utils.py ├── web ├── README.md ├── comfy_shared.js ├── constant.js ├── curve_widget.js ├── debug.js ├── extern │ ├── dom-purify.js │ └── parse-css.js ├── imageFeed.js ├── mtb_input_output_sidebar.js ├── mtb_sidebar.js ├── mtb_ui.js ├── mtb_widgets.js ├── note_plus.constants.js ├── note_plus.js ├── notify.js └── numberInput.js └── web_async ├── ace ├── ace.js ├── ext-beautify.js ├── ext-code_lens.js ├── ext-command_bar.js ├── ext-elastic_tabstops_lite.js ├── ext-emmet.js ├── ext-error_marker.js ├── ext-hardwrap.js ├── ext-inline_autocomplete.js ├── ext-keybinding_menu.js ├── ext-language_tools.js ├── ext-linking.js ├── ext-modelist.js ├── ext-options.js ├── ext-prompt.js ├── ext-rtl.js ├── ext-searchbox.js ├── ext-settings_menu.js ├── ext-simple_tokenizer.js ├── ext-spellcheck.js ├── ext-split.js ├── ext-static_highlight.js ├── ext-statusbar.js ├── ext-textarea.js ├── ext-themelist.js ├── ext-whitespace.js ├── keybinding-emacs.js ├── keybinding-sublime.js ├── keybinding-vim.js ├── keybinding-vscode.js ├── mode-css.js ├── mode-html.js ├── mode-javascript.js ├── mode-json.js ├── mode-json5.js ├── mode-markdown.js ├── mode-python.js ├── mode-svg.js ├── mode-typescript.js ├── snippets │ ├── css.js │ ├── html.js │ ├── json.js │ ├── json5.js │ ├── markdown.js │ ├── python.js │ └── typescript.js ├── theme-ambiance.js ├── theme-chaos.js ├── theme-chrome.js ├── theme-cloud9_day.js ├── theme-cloud9_night.js ├── theme-cloud9_night_low_color.js ├── theme-cloud_editor.js ├── theme-cloud_editor_dark.js ├── theme-clouds.js ├── theme-clouds_midnight.js ├── theme-cobalt.js ├── theme-crimson_editor.js ├── theme-dawn.js ├── theme-dracula.js ├── theme-dreamweaver.js ├── theme-eclipse.js ├── theme-github.js ├── theme-github_dark.js ├── theme-gob.js ├── theme-gruvbox.js ├── theme-gruvbox_dark_hard.js ├── theme-gruvbox_light_hard.js ├── theme-idle_fingers.js ├── theme-iplastic.js ├── theme-katzenmilch.js ├── theme-kr_theme.js ├── theme-kuroir.js ├── theme-merbivore.js ├── theme-merbivore_soft.js ├── theme-mono_industrial.js ├── theme-monokai.js ├── theme-nord_dark.js ├── theme-one_dark.js ├── theme-pastel_on_dark.js ├── theme-solarized_dark.js ├── theme-solarized_light.js ├── theme-sqlserver.js ├── theme-terminal.js ├── theme-textmate.js ├── theme-tomorrow.js ├── theme-tomorrow_night.js ├── theme-tomorrow_night_blue.js ├── theme-tomorrow_night_bright.js ├── theme-tomorrow_night_eighties.js ├── theme-twilight.js ├── theme-vibrant_ink.js ├── theme-xcode.js ├── worker-base.js ├── worker-css.js ├── worker-html.js ├── worker-javascript.js └── worker-json.js ├── mtb_markdown.umd.js └── mtb_markdown_plus.umd.js /.dockerignore: -------------------------------------------------------------------------------- 1 | # Include any files or directories that you don't want to be copied to your 2 | # container here (e.g., local build artifacts, temporary files, etc.). 3 | # 4 | # For more help, visit the .dockerignore file reference guide at 5 | # https://docs.docker.com/engine/reference/builder/#dockerignore-file 6 | 7 | **/.DS_Store 8 | **/__pycache__ 9 | **/.venv 10 | **/.classpath 11 | **/.dockerignore 12 | **/.env 13 | **/.git 14 | **/.gitignore 15 | **/.project 16 | **/.settings 17 | **/.toolstarget 18 | **/.vs 19 | **/.vscode 20 | **/*.*proj.user 21 | **/*.dbmdl 22 | **/*.jfm 23 | **/bin 24 | **/charts 25 | **/docker-compose* 26 | **/compose* 27 | **/Dockerfile* 28 | **/node_modules 29 | **/npm-debug.log 30 | **/obj 31 | **/secrets.dev.yaml 32 | **/values.dev.yaml 33 | LICENSE 34 | README.md 35 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | end_of_line = lf 3 | -------------------------------------------------------------------------------- /.fdignore: -------------------------------------------------------------------------------- 1 | **/GFPGAN/inputs/** 2 | **/GFPGAN/tests/** 3 | **/frame_interpolation/photos/* 4 | moment.gif 5 | node.zip 6 | .DS_Store 7 | 8 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @melMass 2 | extern/GFPGAN/* @TencentARC 3 | extern/SadTalker/* @OpenTalker 4 | nodes/deep_bump.py @HugoTini 5 | web/imageFeed.js @pythongosssss @melMass -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [melMass] 4 | custom: ["https://www.buymeacoffee.com/melmass"] 5 | patreon: # Replace with a single Patreon username 6 | open_collective: # Replace with a single Open Collective username 7 | ko_fi: # Replace with a single Ko-fi username 8 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 9 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 10 | liberapay: # Replace with a single Liberapay username 11 | issuehunt: # Replace with a single IssueHunt username 12 | otechie: # Replace with a single Otechie username 13 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 14 | 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug Report 2 | title: '[bug] ' 3 | description: Report a bug 4 | labels: ['type: 🐛 bug', 'status: 🧹 needs triage'] 5 | assignees: 6 | - melMass 7 | 8 | body: 9 | - type: markdown 10 | attributes: 11 | value: | 12 | ## Before submiting an issue 13 | - Make sure to read the README & INSTALL instructions. 14 | - Please search for [existing issues](https://github.com/melMass/comfy_mtb/issues?q=is%3Aissue) around your problem before filing a report. 15 | - Optionally check the `#mtb-nodes` channel on the Banodoco discord: 16 | [![](https://dcbadge.vercel.app/api/server/AXhsabmDhn?style=flat)](https://discord.gg/IAXhsabmDhn) 17 | 18 | ### Try using the debug mode to get more info 19 | 20 | If you use the env variable `MTB_DEBUG=true`, debug message from the extension will appear in the terminal. 21 | 22 | - type: textarea 23 | id: description 24 | attributes: 25 | label: Describe the bug 26 | description: A clear description of what the bug is. Include screenshots if applicable. 27 | placeholder: Bug description 28 | validations: 29 | required: true 30 | 31 | - type: textarea 32 | id: reproduction 33 | attributes: 34 | label: Reproduction 35 | description: Steps to reproduce the behavior. 36 | placeholder: | 37 | 1. Add node xxx ... 38 | 2. Connect to xxx ... 39 | 3. See error 40 | 41 | - type: textarea 42 | id: expected-behavior 43 | attributes: 44 | label: Expected behavior 45 | description: A clear description of what you expected to happen. 46 | 47 | - type: dropdown 48 | id: os 49 | attributes: 50 | label: Operating System 51 | description: What OS are you using? 52 | options: 53 | - Windows (Default) 54 | - Linux 55 | - Mac 56 | default: 0 57 | validations: 58 | required: true 59 | 60 | - type: dropdown 61 | id: comfy_mode 62 | attributes: 63 | label: Comfy Mode 64 | description: What flavor of Comfy do you use? 65 | options: 66 | - Comfy Portable (embed) (Default) 67 | - In a custom virtual env (venv, virtualenv, conda...) 68 | - Google Colab 69 | - Other (online services, containers etc..) 70 | default: 0 71 | validations: 72 | required: true 73 | 74 | - type: textarea 75 | id: logs 76 | attributes: 77 | label: Console output 78 | description: Paste the console output without backticks 79 | render: sh 80 | 81 | - type: textarea 82 | id: context 83 | attributes: 84 | label: Additional context 85 | description: Add any other context about the problem here. 86 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: 💡 Feature Request 2 | title: "[feat] " 3 | description: Suggest an idea 4 | labels: ["type: 🤚 feature request"] 5 | 6 | body: 7 | - type: textarea 8 | id: problem 9 | attributes: 10 | label: Describe the problem 11 | description: A clear description of the problem this feature would solve 12 | placeholder: "I'm always frustrated when..." 13 | validations: 14 | required: true 15 | 16 | - type: textarea 17 | id: solution 18 | attributes: 19 | label: "Describe the solution you'd like" 20 | description: A clear description of what change you would like 21 | placeholder: "I would like to..." 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | id: alternatives 27 | attributes: 28 | label: Alternatives considered 29 | description: "Any alternative solutions you've considered" 30 | 31 | - type: textarea 32 | id: context 33 | attributes: 34 | label: Additional context 35 | description: Add any other context about the problem here. 36 | -------------------------------------------------------------------------------- /.github/workflows/package_wheels.yml: -------------------------------------------------------------------------------- 1 | name: 📦 Building wheels 2 | 3 | on: 4 | workflow_dispatch: 5 | # push: 6 | # tags: 7 | # - "v*" 8 | 9 | jobs: 10 | build: 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | include: 15 | - os: windows-latest 16 | platform: win32 17 | arch: x64 18 | # - os: macos-latest 19 | # platform: darwin 20 | # arch: arm64 21 | - os: ubuntu-latest 22 | platform: linux 23 | arch: x64 24 | runs-on: ${{ matrix.os }} 25 | env: 26 | archive_name: deps-wheels_${{ matrix.os }}-${{ matrix.platform }}-${{ matrix.arch }} 27 | steps: 28 | - name: ♻️ Checking out the repository 29 | uses: actions/checkout@v3 30 | - name: '🐍 Setting up Python' 31 | uses: actions/setup-python@v4 32 | with: 33 | python-version: '3.10.9' 34 | 35 | - name: 📦 Building and Bundling wheels 36 | shell: bash 37 | run: | 38 | python -m pip wheel --no-cache-dir -r reqs.txt -w ./wheels 2>&1 | tee build.log 39 | 40 | # find source wheels 41 | packages=$(cat build.log | awk -F 'Building wheels for collected packages: ' '{print $2}') 42 | packages=$(echo "$packages" | tr -d '[:space:]') 43 | 44 | IFS=', ' read -r -a package_array <<< "$packages" 45 | 46 | # Save reversed package_array to wheel_order.txt 47 | reversed_array=() 48 | for ((idx=${#package_array[@]}-1; idx>=0; idx--)); do 49 | reversed_array+=("${package_array[idx]}") 50 | done 51 | printf '%s\n' "${reversed_array[@]}" > ./wheels/wheel_order.txt 52 | 53 | printf "Autodetect this source package: \e[32m%s\e[0m\n" "${package_array[@]}" 54 | 55 | # Iterate through the wheel files and remove those that are not source built 56 | for wheel_file in ./wheels/*.whl; do 57 | # Extract the package name from the wheel filename 58 | package_name=$(basename "$wheel_file" .whl | awk -F '-' '{print $1}') 59 | 60 | printf "Checking package: %s\n" "$package_name" 61 | 62 | # Check if the package is not in the array of source built packages 63 | if [[ ! " ${package_array[@]} " =~ " ${package_name} " ]]; then 64 | echo "Removing $wheel_file" 65 | rm "$wheel_file" 66 | fi 67 | done 68 | 69 | 70 | if [ "$RUNNER_OS" == "Windows" ]; then 71 | "C:/Program Files/7-Zip/7z.exe" a -mfb=258 -tzip ${{ env.archive_name }}.zip wheels 72 | else 73 | zip -r -9 -y -m ${{ env.archive_name }}.zip wheels 74 | fi 75 | - name: 💾 Store cache 76 | uses: actions/cache/save@v3 77 | with: 78 | path: ${{ env.archive_name }}.zip 79 | key: ${{ env.archive_name }}-${{ hashFiles('reqs.txt') }} 80 | -------------------------------------------------------------------------------- /.github/workflows/publish_action.yml: -------------------------------------------------------------------------------- 1 | name: 📦 Publish to Comfy registry 2 | on: 3 | workflow_dispatch: 4 | 5 | permissions: 6 | issues: write 7 | 8 | jobs: 9 | publish-node: 10 | name: Publish Custom Node to registry 11 | runs-on: ubuntu-latest 12 | if: ${{ github.repository_owner == 'melMass' }} 13 | steps: 14 | - name: ♻️ Check out code 15 | uses: actions/checkout@v4 16 | with: 17 | submodules: true 18 | - name: 📦 Publish Custom Node 19 | uses: Comfy-Org/publish-node-action@v1 20 | with: 21 | skip_checkout: 'true' 22 | personal_access_token: ${{ secrets.COMFY_REGISTRY_TOKEN }} 23 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: 📦 Release 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | name: 7 | description: Release tag / name ? 8 | required: true 9 | default: 'latest' 10 | type: string 11 | environment: 12 | description: Environment to run tests against 13 | type: environment 14 | required: false 15 | # push: 16 | # tags: 17 | # - "v*" 18 | 19 | jobs: 20 | release: 21 | permissions: 22 | contents: write 23 | runs-on: ubuntu-latest 24 | env: 25 | repo_name: ${{ github.event.repository.name }} 26 | steps: 27 | - name: ♻️ Checking out the repository 28 | uses: actions/checkout@v3 29 | with: 30 | submodules: 'recursive' 31 | path: ${{ env.repo_name }} 32 | 33 | # - name: 📝 Prepare file with paths to remove 34 | # run: | 35 | # find ${{ env.repo_name }} -type f -size +10M > .release_ignore 36 | # find ${{ env.repo_name }} -type d -empty >> .release_ignore 37 | # shell: bash 38 | 39 | - name: 🗑️ Remove files and directories listed in .release_ignore 40 | shell: bash 41 | run: | 42 | release_ignore="${{ env.repo_name }}/.release_ignore" 43 | if [ -f "$release_ignore" ]; then 44 | while IFS= read -r entry || [ -n "$entry" ]; do 45 | target="${{ env.repo_name }}/$entry" 46 | if [ -e "$target" ]; then 47 | if [ -f "$target" ]; then 48 | rm "$target" 49 | elif [ -d "$target" ]; then 50 | rm -r "$target" 51 | fi 52 | else 53 | echo "Warning: $entry does not exist in the repository. Skipping removal." 54 | fi 55 | done < "$release_ignore" 56 | else 57 | echo "No .release_ignore file found. Skipping removal of files and directories." 58 | fi 59 | 60 | - name: 📦 Building custom comfy nodes 61 | shell: bash 62 | run: | 63 | if [ "$RUNNER_OS" == "Windows" ]; then 64 | "C:/Program Files/7-Zip/7z.exe" a -mfb=258 -tzip ${{ env.repo_name }}-${{ inputs.name }}.zip ${{ env.repo_name }} 65 | else 66 | zip -r -9 -y -m ${{ env.repo_name }}-${{ inputs.name }}.zip ${{ env.repo_name }} 67 | fi 68 | 69 | - name: ✅ Create release 70 | uses: softprops/action-gh-release@v1 71 | with: 72 | tag_name: ${{ inputs.name }} 73 | files: | 74 | ${{ env.repo_name }}-${{ inputs.name }}.zip 75 | 76 | release-wheels: 77 | permissions: 78 | contents: write 79 | strategy: 80 | fail-fast: true 81 | matrix: 82 | include: 83 | - os: windows-latest 84 | platform: win32 85 | arch: x64 86 | # - os: macos-latest 87 | # platform: darwin 88 | # arch: arm64 89 | - os: ubuntu-latest 90 | platform: linux 91 | arch: x64 92 | runs-on: ${{ matrix.os }} 93 | env: 94 | archive_name: deps-wheels_${{ matrix.os }}-${{ matrix.platform }}-${{ matrix.arch }} 95 | steps: 96 | - name: 💾 Restore cache 97 | uses: actions/cache/restore@v3 98 | id: cache 99 | with: 100 | path: ${{ env.archive_name }}.zip 101 | key: ${{ env.archive_name }}-${{ hashFiles('reqs.txt') }} 102 | - name: 📦 Unzip wheels 103 | shell: bash 104 | run: | 105 | mkdir -p wheels 106 | unzip -j ${{ env.archive_name }}.zip "**/*.whl" -d wheels 107 | unzip -j ${{ env.archive_name }}.zip "**/*.txt" -d wheels 108 | if: success() 109 | - name: ✅ Add wheels to release 110 | uses: softprops/action-gh-release@v1 111 | with: 112 | tag_name: ${{ inputs.name }} 113 | files: | 114 | wheels/*.whl 115 | wheels/wheel_order.txt 116 | -------------------------------------------------------------------------------- /.github/workflows/test_embedded.yml: -------------------------------------------------------------------------------- 1 | name: 🧪 Test Comfy Portable 2 | 3 | on: workflow_dispatch 4 | jobs: 5 | install-comfy: 6 | runs-on: windows-latest 7 | env: 8 | repo_name: ${{ github.event.repository.name }} 9 | steps: 10 | - name: ⚡️ Restore Cache if Available 11 | id: cache-comfy 12 | uses: actions/cache/restore@v3 13 | with: 14 | path: ComfyUI_windows_portable 15 | key: ${{ runner.os }}-comfy-env 16 | 17 | - name: 🚡 Download and Extract Comfy 18 | id: download-extract-comfy 19 | if: steps.cache-comfy.outputs.cache-hit != 'true' 20 | shell: bash 21 | run: | 22 | mkdir comfy_temp 23 | curl -L -o comfy_temp/comfyui.7z https://github.com/comfyanonymous/ComfyUI/releases/download/latest/ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z 24 | 25 | 7z x comfy_temp/comfyui.7z -o./comfy_temp 26 | 27 | 28 | # mv comfy_temp/ComfyUI_windows_portable/python_embeded . 29 | # mv comfy_temp/ComfyUI_windows_portable/ComfyUI . 30 | # mv comfy_temp/ComfyUI_windows_portable/update . 31 | ls 32 | mv comfy_temp/ComfyUI_windows_portable . 33 | 34 | - name: 💾 Store cache 35 | uses: actions/cache/save@v3 36 | if: steps.cache-comfy.outputs.cache-hit != 'true' 37 | with: 38 | path: ComfyUI_windows_portable 39 | key: ${{ runner.os }}-comfy-env 40 | - name: ⏬ Install other extensions 41 | shell: bash 42 | run: | 43 | export COMFY_PYTHON="${GITHUB_WORKSPACE}/ComfyUI_windows_portable/python_embeded/python.exe" 44 | cd "${GITHUB_WORKSPACE}/ComfyUI_windows_portable/ComfyUI/custom_nodes" 45 | 46 | git clone https://github.com/Fannovel16/comfy_controlnet_preprocessors 47 | cd comfy_controlnet_preprocessors 48 | $COMFY_PYTHON -m pip install -r requirements.txt 49 | 50 | - name: ♻️ Checking out comfy_mtb to custom_nodes 51 | uses: actions/checkout@v3 52 | with: 53 | submodules: 'recursive' 54 | path: ComfyUI_windows_portable/ComfyUI/custom_nodes/${{ env.repo_name }} 55 | 56 | - name: 📦 Install mtb nodes 57 | shell: bash 58 | run: | 59 | # run install 60 | export COMFY_PYTHON="${GITHUB_WORKSPACE}/ComfyUI_windows_portable/python_embeded/python.exe" 61 | cd "${GITHUB_WORKSPACE}/ComfyUI_windows_portable/ComfyUI/custom_nodes" 62 | $COMFY_PYTHON ${{ env.repo_name }}/install.py -w 63 | 64 | - name: ⏬ Import mtb_nodes 65 | shell: bash 66 | run: | 67 | export COMFY_PYTHON="${GITHUB_WORKSPACE}/ComfyUI_windows_portable/python_embeded/python.exe" 68 | cd "${GITHUB_WORKSPACE}/ComfyUI_windows_portable/ComfyUI" 69 | $COMFY_PYTHON -s main.py --quick-test-for-ci --cpu 70 | 71 | $COMFY_PYTHON -m pip freeze 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | *.py[cod] 3 | *.onnx 4 | 5 | wheels/ 6 | node_modules/ 7 | compose.yaml 8 | comfy_mtb.wsb 9 | Dockerfile 10 | 11 | .DS_Store 12 | node.zip 13 | 14 | # I store the gh-pages worktrees (src & build) there 15 | .worktrees 16 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "extern/google-FILM"] 2 | path = extern/frame_interpolation 3 | url = https://github.com/google-research/frame-interpolation 4 | [submodule "extern/GFPGAN"] 5 | path = extern/GFPGAN 6 | url = https://github.com/TencentARC/GFPGAN.git 7 | [submodule "extern/frame_interpolation"] 8 | path = extern/frame_interpolation 9 | url = https://github.com/google-research/frame-interpolation 10 | [submodule "wiki"] 11 | path = wiki 12 | url = https://github.com/melMass/comfy_mtb.wiki.git 13 | -------------------------------------------------------------------------------- /.nvim.lua: -------------------------------------------------------------------------------- 1 | -- HACK: this should theorically not be needed since the lsp should read from the pyproject 2 | -- tried: ruff-lsp or basedpyright 3 | 4 | local comfyRoot = vim.fn.expand("%:p:h:h:h") 5 | 6 | if not vim.env.PYTHONPATH or vim.env.PYTHONPATH == "" then 7 | vim.env.PYTHONPATH = comfyRoot 8 | else 9 | vim.env.PYTHONPATH = vim.env.PYTHONPATH .. ";" .. comfyRoot 10 | end 11 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_language_version: 2 | python: python3.10 3 | repos: 4 | - repo: https://github.com/melmass/hooks 5 | rev: e8c6c18175ed4f6e30f23991de7989411e09c73b 6 | hooks: 7 | - id: fix-trailing-whitespace 8 | - id: bump-version 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "useTabs": false 6 | } -------------------------------------------------------------------------------- /.release_ignore: -------------------------------------------------------------------------------- 1 | extern/frame_interpolation/moment.gif 2 | extern/frame_interpolation/photos 3 | extern/GFPGAN/inputs 4 | .git -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | ## Our Commitment 4 | 5 | We are committed to creating a welcoming and inclusive community for everyone. We believe that a diverse and respectful community is essential for fostering creativity and innovation. We expect all members of our community to adhere to this Code of Conduct. 6 | 7 | ## Our Expectations 8 | 9 | This Code of Conduct applies to all interactions within the mtb community, including: 10 | 11 | * Public communication channels (e.g., GitHub issues, pull requests, discussions, social media) 12 | * Private communication channels (e.g., direct messages, email) 13 | * In-person events (if any) 14 | 15 | We expect all members to: 16 | 17 | * **Be respectful and considerate:** Treat others with kindness and empathy. 18 | * **Be inclusive:** Welcome and respect people of all backgrounds, identities, and experiences. 19 | * **Be constructive:** Focus on providing helpful and positive feedback. 20 | * **Be mindful of your language:** Avoid using offensive, discriminatory, or harassing language. 21 | * **Respect privacy:** Do not share personal information without consent. 22 | 23 | ## Unacceptable Behavior 24 | 25 | The following behaviors are not tolerated: 26 | 27 | * Offensive, discriminatory, or harassing language or conduct 28 | * Personal attacks or insults 29 | * Spamming or trolling 30 | * Sharing of malicious or inappropriate content 31 | * Disrupting the community or hindering collaboration 32 | * Violating the privacy of others 33 | 34 | ## Reporting Violations 35 | 36 | If you experience or witness a violation of this Code of Conduct, please report it to @melmass. All reports will be treated confidentially and investigated promptly. 37 | 38 | ## Enforcement 39 | 40 | Violations of this Code of Conduct may result in the following actions: 41 | 42 | * Warning 43 | * Removal from the community 44 | * Ban from the community 45 | 46 | ## License 47 | [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](code_of_conduct.md) 48 | 49 | ## Contact 50 | 51 | If you have any questions or concerns about this Code of Conduct, please contact @melmass. 52 | 53 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to mtb 2 | 3 | Thank you for your interest in contributing to mtb! We appreciate your help in making this project better. This document outlines how you can contribute to the project. 4 | 5 | ## Project Overview 6 | 7 | This project is a collection of custom nodes for ComfyUI, tailored specifically for animation workflows. It aims to provide a streamlined and user-friendly experience for creating animations within the ComfyUI environment. 8 | 9 | ## Ways to Contribute 10 | 11 | We welcome all kinds of contributions! Here's how you can get involved: 12 | 13 | * **Bug Reports:** If you encounter any issues, please create a new issue on GitHub. Please include clear steps to reproduce the bug, along with any relevant error messages, workflows or screenshots. 14 | * **Feature Requests:** Have an idea for a new node or feature? Create a new issue to discuss it! Please describe the feature in detail, and explain how it would benefit the project. 15 | * **Documentation Improvements:** Help us improve the documentation by fixing errors, adding examples, or clarifying explanations. 16 | * **Code Contributions:** We welcome contributions to the codebase! Please see the "Development Setup" and "File Structure" sections below for more information. 17 | * **Testing:** Help us ensure the stability and reliability of the project by testing new features and bug fixes. 18 | * **Refactoring:** Help us improve the codebase by refactoring existing code to improve readability, maintainability, and performance. 19 | 20 | ## Development Setup 21 | 22 | ```sh 23 | git clone --recursive https://github.com/melmass/comfy_mtb 24 | ``` 25 | 26 | ## File Structure 27 | 28 | Understanding the project structure is crucial for making effective contributions. 29 | 30 | * **`./nodes/*.py`:** This directory contains the definitions for all custom nodes. Nodes are automatically registered when a file defines an array named `__nodes__` containing the node classes. Make sure your node follows the ComfyUI node definition structure. 31 | * **`./web/*.js`:** This directory contains all the frontend JavaScript code for the extension's user interface. 32 | * **`./wiki`:** This directory is a Git submodule that contains the project's Wiki documentation, written in Markdown. Node documentation should be created or updated in the corresponding Markdown files within this submodule. This is then referenced by the UI for in-GUI help 33 | 34 | ## Coding Style 35 | 36 | We use **Ruff** for code formatting to ensure consistency. Please run Ruff on your code before submitting a pull request. No specific configuration is required, so the default Ruff settings will be used. 37 | 38 | ## Contribution Workflow 39 | 40 | 1. **Create a Branch:** Create a new branch for your feature or fix. Use a descriptive branch name (e.g., `feature/new-node`, `fix/bug-in-ui`). **Do not fork the main branch directly.** 41 | 2. **Make Changes:** Implement your changes in your branch. 42 | 3. **Run Tests:** (Add instructions on how to run tests if available.) 43 | 4. **Format Code:** Run Ruff on your code to ensure it is properly formatted. 44 | 5. **Create a Pull Request:** Submit a pull request to the `main` branch. Please provide a clear and concise description of your changes. 45 | 46 | ## Code of Conduct 47 | 48 | We are committed to creating a welcoming and inclusive community. We expect all contributors to adhere to a respectful and professional code of conduct. (Consider adding a link to a CODE_OF_CONDUCT.md file or a standard code of conduct.) 49 | 50 | ## Tools and Libraries 51 | 52 | * **Python:** The primary programming language for this project. 53 | * **ComfyUI:** The underlying framework for the custom nodes. 54 | 55 | ## Current Focus 56 | 57 | We are currently focused on a major refactor to clean up the project's codebase. Contributions related to this effort are particularly welcome! 58 | 59 | ## Thank You! 60 | 61 | Thank you for considering contributing to mtb! Your contributions are greatly appreciated. We look forward to reviewing your pull requests! 62 | 63 | -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | - [Installation](#installation) 3 | - [Automatic Install (Recommended)](#automatic-install-recommended) 4 | - [ComfyUI Manager](#comfyui-manager) 5 | - [Virtual Env](#virtual-env) 6 | - [Models Download](#models-download) 7 | - [Old installation method (MANUAL)](#old-installation-method-manual) 8 | - [Dependencies](#dependencies) 9 | 10 | ## Automatic Install (Recommended) 11 | 12 | ### ComfyUI Manager 13 | 14 | As of version 0.1.0, this extension is meant to be installed with the [ComfyUI-Manager](https://github.com/ltdrdata/ComfyUI-Manager), which helps a lot with handling the various install issues faced by various environments. 15 | 16 | ### Virtual Env 17 | There is also an experimental one liner install using the following command from ComfyUI's root. It will download the code, install the dependencies and run the install script: 18 | 19 | ```bash 20 | curl -sSL "https://raw.githubusercontent.com/username/repo/main/install.py" | python3 - 21 | ``` 22 | 23 | ## Models Download 24 | Some nodes require extra models to be downloaded, you can interactively do it using the same python environment as above: 25 | ```bash 26 | python scripts/download_models.py 27 | ``` 28 | 29 | then follow the prompt or just press enter to download every models. 30 | 31 | > **Note** 32 | > You can use the following to download all models without prompt: 33 | ```bash 34 | python scripts/download_models.py -y 35 | ``` 36 | 37 | 38 | ## Old installation method (MANUAL) 39 | ### Dependencies 40 |

Custom Virtualenv (I use this mainly)

41 | 42 | 1. Make sure you are in the Python environment you use for ComfyUI. 43 | 2. Install the required dependencies by running the following command: 44 | ```bash 45 | pip install -r comfy_mtb/requirements.txt 46 | ``` 47 | 48 |
49 | 50 |

Comfy-portable / standalone (from ComfyUI releases)

51 | 52 | If you use the `python-embeded` from ComfyUI standalone then you are not able to pip install dependencies with binaries when they don't have wheels, in this case check the last [release](https://github.com/melMass/comfy_mtb/releases) there is a bundle for linux and windows with prebuilt wheels (only the ones that require building from source), check [this issue (#1)](https://github.com/melMass/comfy_mtb/issues/1) for more info. 53 | ![image](https://github.com/melMass/comfy_mtb/assets/7041726/2934fa14-3725-427c-8b9e-2b4f60ba1b7b) 54 | 55 | 56 | 57 |
58 | 59 |

Google Colab

60 | 61 | Add a new code cell just after the **Run ComfyUI with localtunnel (Recommended Way)** header (before the code cell) 62 | ![preview of where to add it on colab](https://github.com/melMass/comfy_mtb/assets/7041726/35df2ef1-14f9-44cd-aa65-353829188cd7) 63 | 64 | 65 | ```python 66 | # download the nodes 67 | !git clone --recursive https://github.com/melMass/comfy_mtb.git custom_nodes/comfy_mtb 68 | 69 | # download all models 70 | !python custom_nodes/comfy_mtb/scripts/download_models.py -y 71 | 72 | # install the dependencies 73 | !pip install -r custom_nodes/comfy_mtb/reqs.txt -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0/index.html 74 | ``` 75 | If after running this, colab complains about needing to restart runtime, do it, and then do not rerun earlier cells, just the one to run the localtunnel. (you might have to add a cell with `%cd ComfyUI` first...) 76 | 77 | 78 | > **Note**: 79 | > If you don't need all models, remove the `-y` as collab actually supports user input: ![image](https://github.com/melMass/comfy_mtb/assets/7041726/40fc3602-f1d4-432a-98fd-ce2240f5ad06) 80 | 81 | > **Preview** 82 | > ![image](https://github.com/melMass/comfy_mtb/assets/7041726/b5b2b2d9-f1e8-4c43-b1db-7dfc5e07be86) 83 | 84 |
85 | 86 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Mel Massadian 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MTB Nodes 2 | [![embedded test](https://github.com/melMass/comfy_mtb/actions/workflows/test_embedded.yml/badge.svg)](https://github.com/melMass/comfy_mtb/actions/workflows/test_embedded.yml) 3 | 4 | ![home](https://repository-images.githubusercontent.com/649047066/a3eef9a7-20dd-4ef9-b839-884502d4e873) 5 | 6 | 7 | Buy Me A Coffee 8 | 9 | [**Wiki**](https://github.com/melMass/comfy_mtb/wiki) | [**Install Guide**](./INSTALL.md) | [**Examples**](https://github.com/melMass/comfy_mtb/wiki/Examples) 10 | 11 | 12 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": true, 10 | "suspicious": { 11 | "noConsoleLog": "warn" 12 | }, 13 | "style": { 14 | "noParameterAssign": "off", 15 | "noShoutyConstants": "warn", 16 | "useNamingConvention": "off" 17 | } 18 | } 19 | }, 20 | "formatter": { 21 | "indentStyle": "space", 22 | "indentWidth": 2, 23 | "lineEnding": "lf" 24 | }, 25 | "javascript": { 26 | "formatter": { 27 | "quoteStyle": "single", 28 | "semicolons": "asNeeded" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /cliff.toml: -------------------------------------------------------------------------------- 1 | [changelog] 2 | header = """ 3 | # Changelog\n 4 | This is an automated changelog based on the commits in this repository. 5 | 6 | Check the notes in the [releases](https://github.com/melMass/comfy_mtb/releases) for more information. 7 | """ 8 | # https://keats.github.io/tera/docs/#introduction 9 | body = """ 10 | {% if version -%}\ 11 | ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} 12 | {% else %}\ 13 | ## [Unreleased] 14 | {% endif -%}\ 15 | 16 | {% for group, commits in commits | group_by(attribute="group") %} 17 | ### {{ group | upper_first }} 18 | {% for commit in commits %} 19 | - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first | trim }} ([{{ commit.id | truncate(length=7, end="") }}](/commit/{{ commit.id }}))\ 20 | {% if commit.github.username and commit.github.username != remote.github.owner %} by [@{{ commit.github.username }}](https://github.com/{{ commit.github.username }}){%- endif -%} 21 | {% if commit.github.pr_number %} in [#{{ commit.github.pr_number }}](/pull/{{ commit.github.pr_number }}){%- endif -%} 22 | {% endfor %} 23 | {% endfor %} 24 | 25 | {%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} 26 | ## New Contributors 27 | {%- endif -%} 28 | 29 | {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} 30 | * [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) made their first contribution in [#{{ contributor.pr_number }}](/pull/{{ contributor.pr_number }})\ 31 | {%- endfor %}\n 32 | """ 33 | footer = """ 34 | {% for release in releases -%} 35 | {% if release.version -%} 36 | {% if release.previous.version -%} 37 | [{{ release.version | trim_start_matches(pat="v") }}]: \ 38 | /compare/{{ release.previous.version }}..{{ release.version }} 39 | {% endif -%} 40 | {% else -%} 41 | [unreleased]: /compare/{{ release.previous.version }}..HEAD 42 | {% endif -%} 43 | {% endfor %} 44 | """ 45 | trim = true 46 | postprocessors = [ 47 | { pattern = '', replace = "https://github.com/melMass/comfy_mtb" }, # replace repository URL 48 | ] 49 | 50 | [git] 51 | # https://www.conventionalcommits.org 52 | conventional_commits = true 53 | filter_unconventional = true 54 | split_commits = false 55 | commit_preprocessors = [ 56 | # { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))" }, # replace issue numbers 57 | { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, 58 | ] 59 | commit_parsers = [ 60 | { message = "^feat", group = "Features" }, 61 | { message = "^fix", group = "Bug Fixes" }, 62 | { message = "^doc", group = "Documentation" }, 63 | { message = "^perf", group = "Performance" }, 64 | { message = "^refactor", group = "Refactor" }, 65 | { message = "^style", group = "Styling" }, 66 | { message = "^test", group = "Testing" }, 67 | { message = "^chore\\(release\\): prepare for", skip = true }, 68 | { message = "^chore\\(deps\\)", skip = true }, 69 | { message = "^chore\\(pr\\)", skip = true }, 70 | { message = "^chore\\(pull\\)", skip = true }, 71 | { message = "^chore|ci", group = "Miscellaneous Tasks" }, 72 | { body = ".*security", group = "Security" }, 73 | { message = "^revert", group = "Revert" }, 74 | ] 75 | protect_breaking_commits = false 76 | filter_commits = false 77 | tag_pattern = "v[0-9].*" 78 | topo_order = false 79 | sort_commits = "newest" 80 | 81 | [remote.github] 82 | owner = "melMass" 83 | repo = "comfy_mtb" 84 | -------------------------------------------------------------------------------- /data/font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/melMass/comfy_mtb/4574c6451c1d7c256cdd062a01eff95099caf99f/data/font.ttf -------------------------------------------------------------------------------- /errors.py: -------------------------------------------------------------------------------- 1 | class ModelNotFound(Exception): 2 | def __init__(self, model_name, *args, **kwargs): 3 | super().__init__( 4 | f"The model {model_name} could not be found, make sure to download it using ComfyManager first.\nrepository: https://github.com/ltdrdata/ComfyUI-Manager", 5 | *args, 6 | **kwargs, 7 | ) 8 | -------------------------------------------------------------------------------- /examples/08-note-plus.json: -------------------------------------------------------------------------------- 1 | {"last_node_id":9,"last_link_id":0,"nodes":[{"id":9,"type":"Note Plus (mtb)","pos":[332, 139, 0, 0, 0, 0, 0, 0, 0, 0],"size":[573.4446126650389, 1292.5298919072263],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"title":"Note+ (mtb)","properties":{},"widgets_values":["# Note+ Demo\n\n# Images \nyou can resize them (see showdown syntax)\n\n![Minion](https://octodex.github.com/images/minion.png =120x*)\n\n# iFrame (embeds)\n\n\n# Headings\n\n# h1 Heading:smile:\n\n## h2 Heading\n\n### h3 Heading\n\n#### h4 Heading\n\n##### h5 Heading\n\n###### h6 Heading\n\n# Tables\n\nColons can be used to align columns.\n\n| Tables|Are|Cool |\n| ------------- |:-----------:| ----:|\n| col 3 is| right-aligned | $1600 |\n| col 2 is| centered| $12 |\n| zebra stripes | are neat|$1 |\n\nEmphasis, aka italics, with _asterisks_ or _underscores_.\n\nStrong emphasis, aka bold, with **asterisks** or **underscores**.\n\nCombined emphasis with **asterisks and _underscores_**.\n\nStrikethrough uses two tildes. ~~Scratch this.~~\n\n**This is bold text**\n\n**This is bold text**\n\n_This is italic text_\n\n_This is italic text_\n\n~~Strikethrough~~\n\n1. First ordered list item\n2. Another item\n\n- Unordered sub-list.\n\n1. Actual numbers don't matter, just that it's a number\n1. Ordered sub-list\n1. And another item.\n1.\n\n- [x] Finish my changes\n- [] Push my commits to GitHub\n- [] Open a pull request\n- [x] mentions:@melmass, #refs, [links](), **formatting**, and tags supported\n- [x] list syntax required (any unordered or ordered list supported)\n- [x] this is a complete item\n- [] this is an incomplete item\n","markdown","*{\ncolor:whitesmoke;\n}\n\nh1{\ncolor:cyan;\n}\nh2{\ncolor:yellow;\n}\nh3{\ncolor:pink;\n}\n\nstrong{\ncolor:red;\n}"],"color":"#223","bgcolor":"#335","shape":1}],"links":[],"groups":[],"config":{},"extra":{},"version":0.4} 2 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | All the examples use the [RevAnimated model 1.22](https://civitai.com/models/7371?modelVersionId=46846) 3 | ## 01 Faceswap 4 | 5 | This example showcase the `Face Swap` & `Restore Face` nodes to replace the character with Georges Lucas's face. 6 | The face reference image is using the `Load Image From Url` node to avoid bundling input images. 7 | 8 | 9 | 10 | ## 02 FILM interpolation 11 | This example showcase the FILM interpolation implementation. Here we do text replacement on the condition of two distinct images sharing the same model, input latent & seed to get relatively close images. 12 | 13 | -------------------------------------------------------------------------------- /html/js/foldable.js: -------------------------------------------------------------------------------- 1 | /** 2 | * File: foldable.js 3 | * Project: comfy_mtb 4 | * Author: Mel Massadian 5 | * 6 | * Copyright (c) 2023 Mel Massadian 7 | * 8 | */ 9 | 10 | function toggleFoldable(elementId, symbolId) { 11 | const content = document.getElementById(elementId) 12 | const symbol = document.getElementById(symbolId) 13 | if (content.style.display === 'none' || content.style.display === '') { 14 | content.style.display = 'flex' 15 | symbol.innerHTML = '▽' // Down arrow 16 | } else { 17 | content.style.display = 'none' 18 | symbol.innerHTML = '▷' // Right arrow 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /html/js/saveTableData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * File: saveTableData.js 3 | * Project: comfy_mtb 4 | * Author: Mel Massadian 5 | * 6 | * Copyright (c) 2023 Mel Massadian 7 | * 8 | */ 9 | 10 | function saveTableData(identifier) { 11 | const table = document.querySelector( 12 | `#style-editor table[data-id='${identifier}']` 13 | ) 14 | 15 | let currentData = [] 16 | const rows = table.querySelectorAll('tr') 17 | const filename = table.getAttribute('data-id') 18 | 19 | rows.forEach((row, rowIndex) => { 20 | const rowData = [] 21 | const cells = 22 | rowIndex === 0 23 | ? row.querySelectorAll('th') 24 | : row.querySelectorAll('td input, td textarea') 25 | 26 | cells.forEach((cell) => { 27 | rowData.push(rowIndex === 0 ? cell.textContent : cell.value) 28 | }) 29 | 30 | currentData.push(rowData) 31 | }) 32 | 33 | let tablesData = {} 34 | tablesData[filename] = currentData 35 | 36 | console.debug('Sending styles to manage endpoint:', tablesData) 37 | fetch('/mtb/actions', { 38 | method: 'POST', 39 | headers: { 40 | 'Content-Type': 'application/json', 41 | }, 42 | body: JSON.stringify({ 43 | name: 'saveStyle', 44 | args: tablesData, 45 | }), 46 | }) 47 | .then((response) => response.json()) 48 | .then((data) => { 49 | console.debug('Success:', data) 50 | }) 51 | .catch((error) => { 52 | console.error('Error:', error) 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /html/js/splitPane.js: -------------------------------------------------------------------------------- 1 | /** 2 | * File: splitPane.js 3 | * Project: comfy_mtb 4 | * Author: Mel Massadian 5 | * 6 | * Copyright (c) 2023 Mel Massadian 7 | * 8 | */ 9 | 10 | function initSplitPane(vertical) { 11 | let resizer = document.getElementById('resizer') 12 | let left = document.getElementById('leftPane') 13 | let right = document.getElementById('rightPane') 14 | resizer.addEventListener('mousedown', function (e) { 15 | document.addEventListener('mousemove', onMouseMove) 16 | document.addEventListener('mouseup', function () { 17 | document.removeEventListener('mousemove', onMouseMove) 18 | }) 19 | }) 20 | 21 | const onMouseMove = (e) => { 22 | if (vertical) { 23 | let leftWidth = e.clientX 24 | let rightWidth = window.innerWidth - e.clientX 25 | left.style.width = leftWidth + 'px' 26 | right.style.width = rightWidth + 'px' 27 | } else { 28 | let topHeight = e.clientY 29 | let bottomHeight = window.innerHeight - e.clientY 30 | left.style.height = topHeight + 'px' 31 | right.style.height = bottomHeight + 'px' 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /html/js/tabSwitch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * File: tabSwitch.js 3 | * Project: comfy_mtb 4 | * Author: Mel Massadian 5 | * 6 | * Copyright (c) 2023 Mel Massadian 7 | * 8 | */ 9 | 10 | function openTab(evt, tabName) { 11 | var i, tabcontent, tablinks 12 | tabcontent = document.getElementsByClassName('tabcontent') 13 | for (i = 0; i < tabcontent.length; i++) { 14 | tabcontent[i].style.display = 'none' 15 | } 16 | tablinks = document.getElementsByClassName('tablinks') 17 | for (i = 0; i < tablinks.length; i++) { 18 | tablinks[i].className = tablinks[i].className.replace(' active', '') 19 | } 20 | document.getElementById(tabName).style.display = 'block' 21 | evt.currentTarget.className += ' active' 22 | } 23 | -------------------------------------------------------------------------------- /log.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | import re 4 | 5 | base_log_level = logging.DEBUG if os.environ.get("MTB_DEBUG") else logging.INFO 6 | 7 | 8 | # Custom object that discards the output 9 | class NullWriter: 10 | def write(self, text): 11 | pass 12 | 13 | 14 | class Formatter(logging.Formatter): 15 | grey = "\x1b[38;20m" 16 | cyan = "\x1b[36;20m" 17 | purple = "\x1b[35;20m" 18 | yellow = "\x1b[33;20m" 19 | red = "\x1b[31;20m" 20 | bold_red = "\x1b[31;1m" 21 | reset = "\x1b[0m" 22 | # format = "%(asctime)s - [%(name)s] - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)" 23 | format = "[%(name)s] | %(levelname)s -> %(message)s" 24 | 25 | FORMATS = { 26 | logging.DEBUG: purple + format + reset, 27 | logging.INFO: cyan + format + reset, 28 | logging.WARNING: yellow + format + reset, 29 | logging.ERROR: red + format + reset, 30 | logging.CRITICAL: bold_red + format + reset, 31 | } 32 | 33 | def format(self, record): 34 | log_fmt = self.FORMATS.get(record.levelno) 35 | formatter = logging.Formatter(log_fmt) 36 | return formatter.format(record) 37 | 38 | 39 | def mklog(name: str, level: int = base_log_level): 40 | logger = logging.getLogger(name) 41 | logger.setLevel(level) 42 | 43 | for handler in logger.handlers: 44 | logger.removeHandler(handler) 45 | 46 | ch = logging.StreamHandler() 47 | ch.setLevel(level) 48 | ch.setFormatter(Formatter()) 49 | logger.addHandler(ch) 50 | 51 | # Disable log propagation 52 | logger.propagate = False 53 | 54 | return logger 55 | 56 | 57 | # - The main app logger 58 | log = mklog(__package__, base_log_level) 59 | 60 | 61 | def log_user(arg: str): 62 | print(f"\033[34mComfy MTB Utils:\033[0m {arg}") 63 | 64 | 65 | def get_summary(docstring: str): 66 | return docstring.strip().split("\n\n", 1)[0] 67 | 68 | 69 | def blue_text(text: str): 70 | return f"\033[94m{text}\033[0m" 71 | 72 | 73 | def cyan_text(text: str): 74 | return f"\033[96m{text}\033[0m" 75 | 76 | 77 | def get_label(label: str): 78 | if label.startswith("MTB_"): 79 | label = label[4:] 80 | 81 | words = re.findall( 82 | r"(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z]))", 83 | label, 84 | ) 85 | reformatted_label = re.sub(r"([A-Z]+)", r" \1", label).strip() 86 | words = reformatted_label.split() 87 | return " ".join(words).strip() 88 | -------------------------------------------------------------------------------- /nodes/__init__.py: -------------------------------------------------------------------------------- 1 | """MTB Nodes module.""" 2 | -------------------------------------------------------------------------------- /nodes/animation.py: -------------------------------------------------------------------------------- 1 | from ..log import log 2 | 3 | 4 | class MTB_AnimationBuilder: 5 | """Simple maths for animation.""" 6 | 7 | @classmethod 8 | def INPUT_TYPES(cls): 9 | return { 10 | "required": { 11 | "total_frames": ("INT", {"default": 100, "min": 0}), 12 | # "fps": ("INT", {"default": 12, "min": 0}), 13 | "scale_float": ("FLOAT", {"default": 1.0, "min": 0.0}), 14 | "loop_count": ("INT", {"default": 1, "min": 0}), 15 | "raw_iteration": ("INT", {"default": 0, "min": 0}), 16 | "raw_loop": ("INT", {"default": 0, "min": 0}), 17 | }, 18 | } 19 | 20 | RETURN_TYPES = ("INT", "FLOAT", "INT", "BOOLEAN") 21 | RETURN_NAMES = ("frame", "0-1 (scaled)", "count", "loop_ended") 22 | CATEGORY = "mtb/animation" 23 | FUNCTION = "build_animation" 24 | DESCRIPTION = """ 25 | # Animation Builder 26 | 27 | Check the 28 | [wiki page](https://github.com/melMass/comfy_mtb/wiki/nodes-animation-builder) 29 | for more info. 30 | 31 | 32 | - This basic example should help to understand the meaning of 33 | its inputs and outputs thanks to the [debug](nodes-debug) node. 34 | 35 | ![](https://github.com/melMass/comfy_mtb/assets/7041726/2b5c7e4f-372d-4494-9e73-abb2daa7cb36) 36 | 37 | - In this other example Animation Builder is used in combination with 38 | [Batch From History](https://github.com/melMass/comfy_mtb/wiki/nodes-batch-from-history) 39 | to create a zoom-in animation on a static image 40 | 41 | ![](https://github.com/melMass/comfy_mtb/assets/7041726/77d37da1-0a8e-4519-a493-dfdef7f755ea) 42 | 43 | ## Inputs 44 | 45 | | name | description | 46 | | ---- | :----------:| 47 | | total_frames | The number of frame to queue (this is multiplied by the `loop_count`)| 48 | | scale_float | Convenience input to scale the normalized `current value` (a float between 0 and 1 lerp over the current queue length) | 49 | | loop_count | The number of loops to queue | 50 | | **Reset Button** | resets the internal counters, although the node is though around using its queue button it should still work fine when using the regular queue button of comfy | 51 | | **Queue Button** | Convenience button to run the queues (`total_frames` * `loop_count`) | 52 | 53 | """ 54 | 55 | def build_animation( 56 | self, 57 | total_frames=100, 58 | # fps=12, 59 | scale_float=1.0, 60 | loop_count=1, # set in js 61 | raw_iteration=0, # set in js 62 | raw_loop=0, # set in js 63 | ): 64 | frame = raw_iteration % (total_frames) 65 | scaled = (frame / (total_frames - 1)) * scale_float 66 | # if frame == 0: 67 | # log.debug("Reseting history") 68 | # PromptServer.instance.prompt_queue.wipe_history() 69 | log.debug(f"frame: {frame}/{total_frames} scaled: {scaled}") 70 | 71 | return (frame, scaled, raw_loop, (frame == (total_frames - 1))) 72 | 73 | 74 | __nodes__ = [MTB_AnimationBuilder] 75 | -------------------------------------------------------------------------------- /nodes/constant.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..log import log 4 | 5 | 6 | class MTB_Constant: 7 | @classmethod 8 | def INPUT_TYPES(cls): 9 | return { 10 | "required": {"Value": ("*",)}, 11 | } 12 | 13 | RETURN_TYPES = ("*",) 14 | RETURN_NAMES = ("output",) 15 | CATEGORY = "mtb/utils" 16 | FUNCTION = "execute" 17 | 18 | def execute( 19 | self, 20 | **kwargs, 21 | ): 22 | log.debug("Received kwargs") 23 | log.debug(json.dumps(kwargs, check_circular=True)) 24 | return (kwargs.get("Value"),) 25 | 26 | 27 | # __nodes__ = [MTB_Constant] 28 | -------------------------------------------------------------------------------- /nodes/curve.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..log import log 4 | 5 | 6 | def deserialize_curve(curve): 7 | if isinstance(curve, str): 8 | curve = json.loads(curve) 9 | return curve 10 | 11 | 12 | def serialize_curve(curve): 13 | if not isinstance(curve, str): 14 | curve = json.dumps(curve) 15 | return curve 16 | 17 | 18 | class MTB_Curve: 19 | """A basic FLOAT_CURVE input node.""" 20 | 21 | @classmethod 22 | def INPUT_TYPES(cls): 23 | return { 24 | "required": { 25 | "curve": ("FLOAT_CURVE",), 26 | }, 27 | } 28 | 29 | RETURN_TYPES = ("FLOAT_CURVE",) 30 | FUNCTION = "do_curve" 31 | 32 | CATEGORY = "mtb/curve" 33 | 34 | def do_curve(self, curve): 35 | log.debug(f"Curve: {curve}") 36 | return (curve,) 37 | 38 | 39 | class MTB_CurveToFloat: 40 | """Convert a FLOAT_CURVE to a FLOAT or FLOATS""" 41 | 42 | @classmethod 43 | def INPUT_TYPES(cls): 44 | return { 45 | "required": { 46 | "curve": ("FLOAT_CURVE", {"forceInput": True}), 47 | "steps": ("INT", {"default": 10, "min": 2}), 48 | }, 49 | } 50 | 51 | RETURN_TYPES = ("FLOATS", "FLOAT") 52 | FUNCTION = "do_curve" 53 | 54 | CATEGORY = "mtb/curve" 55 | 56 | def do_curve(self, curve, steps): 57 | log.debug(f"Curve: {curve}") 58 | 59 | # sort by x (should be handled by the widget) 60 | sorted_points = sorted(curve.items(), key=lambda item: item[1]["x"]) 61 | # Extract X and Y values 62 | x_values = [point[1]["x"] for point in sorted_points] 63 | y_values = [point[1]["y"] for point in sorted_points] 64 | # Calculate step size 65 | step_size = (max(x_values) - min(x_values)) / (steps - 1) 66 | 67 | # Interpolate Y values for each step 68 | interpolated_y_values = [] 69 | for step in range(steps): 70 | current_x = min(x_values) + step_size * step 71 | 72 | # Find the indices of the two points between which the current_x falls 73 | idx1 = max(idx for idx, x in enumerate(x_values) if x <= current_x) 74 | idx2 = min(idx for idx, x in enumerate(x_values) if x >= current_x) 75 | 76 | # If the current_x matches one of the points, no interpolation is needed 77 | if current_x == x_values[idx1]: 78 | interpolated_y_values.append(y_values[idx1]) 79 | elif current_x == x_values[idx2]: 80 | interpolated_y_values.append(y_values[idx2]) 81 | else: 82 | # Interpolate Y value using linear interpolation 83 | y1 = y_values[idx1] 84 | y2 = y_values[idx2] 85 | x1 = x_values[idx1] 86 | x2 = x_values[idx2] 87 | interpolated_y = y1 + (y2 - y1) * (current_x - x1) / (x2 - x1) 88 | interpolated_y_values.append(interpolated_y) 89 | 90 | return (interpolated_y_values, interpolated_y_values) 91 | 92 | 93 | __nodes__ = [MTB_Curve, MTB_CurveToFloat] 94 | -------------------------------------------------------------------------------- /nodes/filter.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | 4 | class MTB_FilterZ: 5 | """Filters an image based on a depth map""" 6 | 7 | @classmethod 8 | def INPUT_TYPES(cls): 9 | return { 10 | "required": { 11 | "image": ("IMAGE",), 12 | "depth": ("IMAGE",), 13 | "to_black": ("BOOLEAN", {"default": True}), 14 | "threshold": ( 15 | "FLOAT", 16 | {"default": 0.5, "step": 0.01, "min": 0.0, "max": 1.0}, 17 | ), 18 | "invert": ("BOOLEAN", {"default": True}), 19 | }, 20 | } 21 | 22 | RETURN_TYPES = ("IMAGE",) 23 | FUNCTION = "filter" 24 | CATEGORY = "mtb/filters" 25 | 26 | def filter( 27 | self, 28 | image: torch.Tensor, 29 | depth: torch.Tensor, 30 | to_black, 31 | threshold: float, 32 | invert, 33 | ): 34 | # Normalize depth map to be in range [0, 1] 35 | depth_normalized = (depth - depth.min()) / (depth.max() - depth.min()) 36 | 37 | # Calculate the difference from the threshold 38 | diff_from_threshold = torch.abs(depth_normalized - threshold) 39 | 40 | out_img = None 41 | 42 | if to_black: 43 | if invert: 44 | soft_mask = diff_from_threshold >= threshold 45 | else: 46 | soft_mask = diff_from_threshold <= threshold 47 | 48 | out_img = image.clone() 49 | out_img[soft_mask] = 0 50 | return (out_img,) 51 | else: 52 | alpha_channel = 1 - diff_from_threshold / threshold 53 | alpha_channel = torch.clamp(alpha_channel, 0, 1) 54 | 55 | if invert: 56 | # Invert the alpha channel 57 | alpha_channel = 1 - alpha_channel 58 | 59 | # Ensure alpha_channel has the correct shape 60 | # It should have the shape [batch_size, height, width, 1] 61 | alpha_channel = alpha_channel.unsqueeze(-1) 62 | 63 | # Combine RGB channels with alpha channel 64 | out_img = torch.cat((image, alpha_channel), dim=-1) 65 | 66 | return (out_img,) 67 | 68 | 69 | __nodes__ = [MTB_FilterZ] 70 | -------------------------------------------------------------------------------- /nodes/latent_processing.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | 4 | class MTB_LatentLerp: 5 | """Linear interpolation (blend) between two latent vectors""" 6 | 7 | @classmethod 8 | def INPUT_TYPES(cls): 9 | return { 10 | "required": { 11 | "A": ("LATENT",), 12 | "B": ("LATENT",), 13 | "t": ( 14 | "FLOAT", 15 | {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}, 16 | ), 17 | } 18 | } 19 | 20 | RETURN_TYPES = ("LATENT",) 21 | FUNCTION = "lerp_latent" 22 | 23 | CATEGORY = "mtb/latent" 24 | 25 | def lerp_latent(self, A, B, t): 26 | a = A.copy() 27 | b = B.copy() 28 | 29 | torch.lerp(a["samples"], b["samples"], t, out=a["samples"]) 30 | 31 | return (a,) 32 | 33 | 34 | __nodes__ = [ 35 | MTB_LatentLerp, 36 | ] 37 | -------------------------------------------------------------------------------- /nodes/mask.py: -------------------------------------------------------------------------------- 1 | import comfy.utils 2 | from PIL import Image 3 | 4 | from ..utils import pil2tensor, tensor2pil 5 | 6 | 7 | class MTB_ImageRemoveBackgroundRembg: 8 | """Removes the background from the input using Rembg.""" 9 | 10 | @classmethod 11 | def INPUT_TYPES(cls): 12 | return { 13 | "required": { 14 | "image": ("IMAGE",), 15 | "alpha_matting": ( 16 | "BOOLEAN", 17 | {"default": False}, 18 | ), 19 | "alpha_matting_foreground_threshold": ( 20 | "INT", 21 | {"default": 240, "min": 0, "max": 255}, 22 | ), 23 | "alpha_matting_background_threshold": ( 24 | "INT", 25 | {"default": 10, "min": 0, "max": 255}, 26 | ), 27 | "alpha_matting_erode_size": ( 28 | "INT", 29 | {"default": 10, "min": 0, "max": 255}, 30 | ), 31 | "post_process_mask": ( 32 | "BOOLEAN", 33 | {"default": False}, 34 | ), 35 | "bgcolor": ( 36 | "COLOR", 37 | {"default": "#000000"}, 38 | ), 39 | }, 40 | } 41 | 42 | RETURN_TYPES = ( 43 | "IMAGE", 44 | "MASK", 45 | "IMAGE", 46 | ) 47 | RETURN_NAMES = ( 48 | "Image (rgba)", 49 | "Mask", 50 | "Image", 51 | ) 52 | FUNCTION = "remove_background" 53 | CATEGORY = "mtb/image" 54 | 55 | # bgcolor: Optional[Tuple[int, int, int, int]] 56 | def remove_background( 57 | self, 58 | image, 59 | alpha_matting, 60 | alpha_matting_foreground_threshold, 61 | alpha_matting_background_threshold, 62 | alpha_matting_erode_size, 63 | post_process_mask, 64 | bgcolor, 65 | ): 66 | from rembg import remove 67 | 68 | pbar = comfy.utils.ProgressBar(image.size(0)) 69 | images = tensor2pil(image) 70 | 71 | out_img = [] 72 | out_mask = [] 73 | out_img_on_bg = [] 74 | 75 | for img in images: 76 | img_rm = remove( 77 | data=img, 78 | alpha_matting=alpha_matting, 79 | alpha_matting_foreground_threshold=alpha_matting_foreground_threshold, 80 | alpha_matting_background_threshold=alpha_matting_background_threshold, 81 | alpha_matting_erode_size=alpha_matting_erode_size, 82 | session=None, 83 | only_mask=False, 84 | post_process_mask=post_process_mask, 85 | bgcolor=None, 86 | ) 87 | 88 | # extract the alpha to a new image 89 | mask = img_rm.getchannel(3) 90 | 91 | # add our bgcolor behind the image 92 | image_on_bg = Image.new("RGBA", img_rm.size, bgcolor) 93 | 94 | image_on_bg.paste(img_rm, mask=mask) 95 | 96 | image_on_bg = image_on_bg.convert("RGB") 97 | 98 | out_img.append(img_rm) 99 | out_mask.append(mask) 100 | out_img_on_bg.append(image_on_bg) 101 | 102 | pbar.update(1) 103 | 104 | return ( 105 | pil2tensor(out_img), 106 | pil2tensor(out_mask), 107 | pil2tensor(out_img_on_bg), 108 | ) 109 | 110 | 111 | __nodes__ = [ 112 | MTB_ImageRemoveBackgroundRembg, 113 | ] 114 | -------------------------------------------------------------------------------- /nodes/number.py: -------------------------------------------------------------------------------- 1 | class MTB_IntToBool: 2 | """Basic int to bool conversion""" 3 | 4 | @classmethod 5 | def INPUT_TYPES(cls): 6 | return { 7 | "required": { 8 | "int": ( 9 | "INT", 10 | { 11 | "default": 0, 12 | }, 13 | ), 14 | } 15 | } 16 | 17 | RETURN_TYPES = ("BOOLEAN",) 18 | FUNCTION = "int_to_bool" 19 | CATEGORY = "mtb/number" 20 | 21 | def int_to_bool(self, int): 22 | return (bool(int),) 23 | 24 | 25 | class MTB_IntToNumber: 26 | """Node addon for the WAS Suite. Converts a "comfy" INT to a NUMBER.""" 27 | 28 | @classmethod 29 | def INPUT_TYPES(cls): 30 | return { 31 | "required": { 32 | "int": ( 33 | "INT", 34 | { 35 | "default": 0, 36 | "min": -1e9, 37 | "max": 1e9, 38 | "step": 1, 39 | "forceInput": True, 40 | }, 41 | ), 42 | } 43 | } 44 | 45 | RETURN_TYPES = ("NUMBER",) 46 | FUNCTION = "int_to_number" 47 | CATEGORY = "mtb/number" 48 | 49 | def int_to_number(self, int): 50 | return (int,) 51 | 52 | 53 | class MTB_FloatToNumber: 54 | """Node addon for the WAS Suite. Converts a "comfy" FLOAT to a NUMBER.""" 55 | 56 | @classmethod 57 | def INPUT_TYPES(cls): 58 | return { 59 | "required": { 60 | "float": ( 61 | "FLOAT", 62 | { 63 | "default": 0, 64 | "min": -1e9, 65 | "max": 1e9, 66 | "step": 1, 67 | "forceInput": True, 68 | }, 69 | ), 70 | } 71 | } 72 | 73 | RETURN_TYPES = ("NUMBER",) 74 | FUNCTION = "float_to_number" 75 | CATEGORY = "mtb/number" 76 | 77 | def float_to_number(self, float): 78 | return (float,) 79 | 80 | 81 | __nodes__ = [ 82 | MTB_FloatToNumber, 83 | MTB_IntToBool, 84 | MTB_IntToNumber, 85 | ] 86 | -------------------------------------------------------------------------------- /nodes/qrcode.py: -------------------------------------------------------------------------------- 1 | import qrcode 2 | import torch 3 | from PIL import Image 4 | 5 | from ..log import log 6 | from ..utils import pil2tensor 7 | 8 | 9 | class MTB_QrCode: 10 | """Basic QR Code generator.""" 11 | 12 | @classmethod 13 | def INPUT_TYPES(cls): 14 | return { 15 | "required": { 16 | "url": ("STRING", {"default": "https://www.github.com"}), 17 | "width": ( 18 | "INT", 19 | {"default": 256, "max": 8096, "min": 0, "step": 1}, 20 | ), 21 | "height": ( 22 | "INT", 23 | {"default": 256, "max": 8096, "min": 0, "step": 1}, 24 | ), 25 | "error_correct": (("L", "M", "Q", "H"), {"default": "L"}), 26 | "box_size": ( 27 | "INT", 28 | {"default": 10, "max": 8096, "min": 0, "step": 1}, 29 | ), 30 | "border": ( 31 | "INT", 32 | {"default": 4, "max": 8096, "min": 0, "step": 1}, 33 | ), 34 | "invert": (("BOOLEAN",), {"default": False}), 35 | } 36 | } 37 | 38 | RETURN_TYPES = ("IMAGE",) 39 | FUNCTION = "do_qr" 40 | CATEGORY = "mtb/generate" 41 | 42 | def do_qr( 43 | self, 44 | *, 45 | url: str, 46 | width: int, 47 | height: int, 48 | error_correct: str, 49 | box_size: int, 50 | border: int, 51 | invert: bool, 52 | ) -> tuple[torch.Tensor]: 53 | log.warning( 54 | "This node will soon be deprecated, there are much better alternatives like https://github.com/coreyryanhanson/comfy-qr" 55 | ) 56 | if error_correct == "L" or error_correct not in ["M", "Q", "H"]: 57 | error_correct = qrcode.constants.ERROR_CORRECT_L 58 | elif error_correct == "M": 59 | error_correct = qrcode.constants.ERROR_CORRECT_M 60 | elif error_correct == "Q": 61 | error_correct = qrcode.constants.ERROR_CORRECT_Q 62 | else: 63 | error_correct = qrcode.constants.ERROR_CORRECT_H 64 | 65 | qr = qrcode.QRCode( 66 | version=1, 67 | error_correction=error_correct, 68 | box_size=box_size, 69 | border=border, 70 | ) 71 | qr.add_data(url) 72 | qr.make(fit=True) 73 | 74 | back_color = (255, 255, 255) if invert else (0, 0, 0) 75 | fill_color = (0, 0, 0) if invert else (255, 255, 255) 76 | 77 | code = qr.make_image(back_color=back_color, fill_color=fill_color) 78 | 79 | # that we now resize without filtering 80 | code = code.resize((width, height), Image.NEAREST) 81 | 82 | return (pil2tensor(code),) 83 | 84 | 85 | __nodes__ = [MTB_QrCode] 86 | -------------------------------------------------------------------------------- /pyrightconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": [ 3 | "**/node_modules", 4 | "**/__pycache__", 5 | ], 6 | "ignore": [ 7 | "extern" 8 | ], 9 | "defineConstant": { 10 | "DEBUG": true 11 | }, 12 | "venvPath": "../../../.venv/", 13 | "reportMissingImports": true, 14 | "reportMissingTypeStubs": false, 15 | "pythonVersion": "3.10", 16 | "pythonPlatform": "All", 17 | "reportOptionalMemberAccess": "none" 18 | } -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | qrcode[pil] 2 | onnxruntime-gpu 3 | requirements-parser 4 | # opencv-contrib 5 | rembg 6 | imageio_ffmpeg 7 | rich 8 | rich_argparse 9 | matplotlib 10 | pillow 11 | cachetools 12 | transformers 13 | -------------------------------------------------------------------------------- /scripts/get_deps.py: -------------------------------------------------------------------------------- 1 | import os 2 | import ast 3 | import json 4 | import sys 5 | from rich.console import Console 6 | from rich.table import Table 7 | from rich.progress import Progress 8 | 9 | console = Console(stderr=True) 10 | 11 | 12 | def get_imported_modules(filename): 13 | with open(filename, "r") as file: 14 | tree = ast.parse(file.read()) 15 | 16 | imported_modules = [] 17 | for node in ast.walk(tree): 18 | if isinstance(node, ast.Import): 19 | imported_modules.extend( 20 | (alias.name, alias.name in sys.builtin_module_names) 21 | for alias in node.names 22 | ) 23 | elif isinstance(node, ast.ImportFrom): 24 | if node.module: 25 | imported_modules.append( 26 | (node.module, node.module in sys.builtin_module_names) 27 | ) 28 | 29 | return imported_modules 30 | 31 | 32 | def list_imported_modules(folder): 33 | modules = [] 34 | 35 | file_count = sum(len(files) for _, _, files in os.walk(folder)) 36 | progress = Progress() 37 | 38 | task = progress.add_task("[cyan]Scanning files...", total=file_count) 39 | 40 | for root, _, files in os.walk(folder): 41 | for file in files: 42 | if file.endswith(".py"): 43 | file_path = os.path.join(root, file) 44 | imported_modules = get_imported_modules(file_path) 45 | modules.extend(imported_modules) 46 | progress.update(task, advance=1) 47 | 48 | progress.stop() 49 | 50 | return modules 51 | 52 | 53 | if __name__ == "__main__": 54 | if len(sys.argv) < 2: 55 | console.print( 56 | "[bold red]Please provide the folder path as a command-line argument.[/bold red]" 57 | ) 58 | sys.exit(1) 59 | 60 | # folder_path = input("Enter the folder path: ") 61 | # while not os.path.isdir(folder_path): 62 | # console.print("[bold red]Invalid folder path![/bold red]") 63 | # folder_path = input("Enter the folder path: ") 64 | folder_path = sys.argv[1] 65 | if not os.path.isdir(folder_path): 66 | console.print("[bold red]Invalid folder path![/bold red]") 67 | sys.exit(1) 68 | 69 | console.print("[bold green]=== Python Imported Modules ===[/bold green]\n") 70 | console.print(f"Scanning folder: [bold]{folder_path}[/bold]\n") 71 | 72 | imported_modules = list_imported_modules(folder_path) 73 | 74 | console.print(f"\n[bold green]Imported Modules:[/bold green]\n") 75 | 76 | table = Table(show_header=True, header_style="bold cyan") 77 | table.add_column("Module") 78 | table.add_column("Type") 79 | 80 | for module, is_builtin in imported_modules: 81 | module_type = "Built-in" if is_builtin else "External" 82 | table.add_row(module, module_type) 83 | 84 | console.print(table) 85 | 86 | json_data = json.dumps( 87 | [ 88 | {"module": module, "type": "Built-in" if is_builtin else "External"} 89 | for module, is_builtin in imported_modules 90 | ], 91 | indent=4, 92 | ) 93 | print(json_data) 94 | -------------------------------------------------------------------------------- /scripts/update_changelog.nu: -------------------------------------------------------------------------------- 1 | $env.GITHUB_TOKEN = (gh auth token) 2 | git cliff --tag main | save -f CHANGELOG.md -------------------------------------------------------------------------------- /styles.csv: -------------------------------------------------------------------------------- 1 | name,prompt,negative_prompt 2 | ❌Low Token,,"embedding:EasyNegative, NSFW, Cleavage, Pubic Hair, Nudity, Naked, censored" 3 | ✅Line Art / Manga,"(Anime Scene, Toonshading, Satoshi Kon, Ken Sugimori, Hiromu Arakawa:1.2), (Anime Style, Manga Style:1.3), Low detail, sketch, concept art, line art, webtoon, manhua, hand drawn, defined lines, simple shades, minimalistic, High contrast, Linear compositions, Scalable artwork, Digital art, High Contrast Shadows, glow effects, humorous illustration, big depth of field, Masterpiece, colors, concept art, trending on artstation, Vivid colors, dramatic", 4 | -------------------------------------------------------------------------------- /types/shared.d.ts: -------------------------------------------------------------------------------- 1 | // Some manual types I use to facilitate developing on top of 2 | // Comfy's Litegraph implementation. 3 | 4 | import type { 5 | ContextMenuItem, 6 | LGraphNode, 7 | IWidget, 8 | LGraph, 9 | } from '../../../web/types/litegraph' 10 | 11 | export type { 12 | ComfyExtension, 13 | ComfyObjectInfo, 14 | ComfyObjectInfoConfig, 15 | } from '../../../web/types/comfy' 16 | 17 | export type { 18 | ContextMenuItem, 19 | IWidget, 20 | LLink, 21 | INodeInputSlot, 22 | INodeOutputSlot, 23 | } from '../../../web/types/litegraph' 24 | 25 | export type VectorWidget = IWidget 26 | export interface NodeData { 27 | category: str 28 | description: str 29 | display_name: str 30 | input: NodeInput 31 | name: str 32 | output: [str] 33 | output_is_list: [boolean] 34 | output_name: [str] 35 | output_node: boolean 36 | } 37 | 38 | export interface ComfyDialog { 39 | element: Element 40 | close: () => void 41 | show: (html: str) => void 42 | } 43 | 44 | export interface ComfySettingsDialog { 45 | app: ComfyApp 46 | element: Element 47 | settingsValues: Record 48 | settingsLookup: Record 49 | load: () => Promise 50 | setSettingValueAsync: (id: string, value: unknown) => Promise 51 | } 52 | 53 | export interface ComfyUI { 54 | app: ComfyApp 55 | dialog: ComfyDialog 56 | settings: ComfySettingsDialog 57 | autoQueueMode: 'instant' | 'change' 58 | batchCount: number 59 | lastQueueSize: number 60 | graphHasChanged: boolean 61 | queue: ComfyList 62 | history: ComfyList 63 | } 64 | 65 | /**Very incomplete Comfy App definition*/ 66 | interface ComfyApp { 67 | graph: LGraph 68 | queueItems: { number: number; batchCount: number }[] 69 | processingQueue: boolean 70 | ui: ComfyUI 71 | extensions: ComfyExtension[] 72 | nodeOutputs: Record 73 | nodePreviewImages: Record 74 | shiftDown: boolean 75 | isImageNode: (node: LGraphNodeExtended) => boolean 76 | queuePrompt: (number: number, batchCount: number) => Promise 77 | /** Loads workflow data from the specified file*/ 78 | handleFile: (file: File) => Promise 79 | } 80 | 81 | export type { ComfyApp as App } 82 | 83 | export interface LGraphNodeExtension { 84 | addDOMWidget: ( 85 | name: string, 86 | type: string, 87 | element: Element, 88 | options: Record, 89 | ) => IWidget 90 | onNodeCreated: () => void 91 | getExtraMenuOptions: () => ContextMenuItem[] 92 | prototype: LGraphNodeExtended 93 | } 94 | 95 | export type LGraphNodeExtended = LGraphNode & LGraphNodeExtension 96 | 97 | export interface NodeType /*extends LGraphNode*/ { 98 | category: str 99 | comfyClass: str 100 | length: 0 101 | name: str 102 | nodeData: NodeData 103 | prototype: LGraphNodeExtended 104 | title: str 105 | type: str 106 | } 107 | 108 | export interface NodeInput { 109 | required: object 110 | } 111 | 112 | // NOTE: for prototype overriding 113 | export type OnDrawWidgetParams = Parameters 114 | export type OnDrawForegroundParams = Parameters 115 | export type OnMouseDownParams = Parameters 116 | export type OnConnectionsChangeParams = Parameters< 117 | LGraphNode['onConnectionsChange'] 118 | > 119 | export type OnNodeCreatedParams = Parameters< 120 | LGraphNodeExtension['onNodeCreated'] 121 | > 122 | 123 | export interface DocumentationOptions { 124 | icon_size?: number 125 | icon_margin?: number 126 | } 127 | -------------------------------------------------------------------------------- /types/typedefs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import("./shared.d.ts").NodeData} NodeData 3 | * @typedef {import("./shared.d.ts").NodeType} NodeType 4 | * @typedef {import("./shared.d.ts").DocumentationOptions} DocumentationOptions 5 | * @typedef {import("./shared.d.ts").OnDrawForegroundParams} OnDrawForegroundParams 6 | * @typedef {import("./shared.d.ts").OnMouseDownParams} OnMouseDownParams 7 | * @typedef {import("./shared.d.ts").OnConnectionsChangeParams} OnConnectionsChangeParams 8 | * @typedef {import("./shared.d.ts").ContextMenuItem} ContextMenuItem 9 | * @typedef {import("./shared.d.ts").IWidget} IWidget 10 | * @typedef {import("./shared.d.ts").VectorWidget} VectorWidget 11 | * @typedef {import("./shared.d.ts").LGraphNodeExtended} LGraphNode 12 | * @typedef {import("./shared.d.ts").LLink} LLink 13 | * @typedef {import("./shared.d.ts").App} App 14 | * @typedef {import("./shared.d.ts").OnDrawWidgetParams} OnDrawWidgetParams 15 | * @typedef {import("./shared.d.ts").INodeInputSlot} INodeInputSlot 16 | * @typedef {import("./shared.d.ts").INodeOutputSlot} INodeOutputSlot 17 | */ 18 | 19 | /** 20 | * @typedef {Object} ResultItem 21 | * @property {string} [filename] - The filename of the item. 22 | * @property {string} [subfolder] - The subfolder of the item. 23 | * @property {string} [type] - The type of the item. 24 | */ 25 | 26 | /** 27 | * @typedef {Object} Outputs 28 | * @property {ResultItem[]} [audio] - Audio result items. 29 | * @property {ResultItem[]} [images] - Image result items. 30 | * @property {ResultItem[]} [animated] - Animated result items. 31 | */ 32 | 33 | /** 34 | * @typedef {Record} TaskOutput 35 | * - A record mapping Node IDs to their Outputs. 36 | */ 37 | 38 | /** 39 | * @typedef {Array} TaskPrompt 40 | * @property {QueueIndex} [0] - The queue index. 41 | * @property {PromptId} [1] - The unique prompt ID. 42 | * @property {PromptInputs} [2] - The prompt inputs. 43 | * @property {ExtraData} [3] - Extra data. 44 | * @property {OutputsToExecute} [4] - The outputs to execute. 45 | */ 46 | 47 | /** 48 | * @typedef {Object} HistoryTaskItem 49 | * @property {'History'} taskType - The type of task. 50 | * @property {TaskPrompt} prompt - The task prompt. 51 | * @property {Status} [status] - The status of the task. 52 | * @property {TaskOutput} outputs - The task outputs. 53 | * @property {TaskMeta} [meta] - Optional task metadata. 54 | */ 55 | 56 | /** 57 | * @typedef {Object} ExecInfo 58 | * @property {number} queue_remaining - The number of items remaining in the queue. 59 | */ 60 | 61 | /** 62 | * @typedef {Object} StatusWsMessageStatus 63 | * @property {ExecInfo} exec_info - Execution information. 64 | */ 65 | 66 | -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | ## Core 2 | These 3 scripts cannot be used independently and must all be present to work, they are mostly enhancing the frontend of python nodes 3 | - `comfy_shared`: library of methods used in `mtb_widgets` and `debug` 4 | 5 | **mtb_widgets** define ui callbacks, and various widgets like the `COLOR` type: 6 | 7 | 8 | or the `BOOL` type: 9 | 10 | 11 | There is also `Debug` which is a node that should be able to display any data input, it handle a few cases and fallback to the string representation of the 12 | data otherwise: 13 | ![debug](https://github.com/melMass/comfy_mtb/assets/7041726/1f4393e4-1c3d-4807-9501-fe8888bfae25) 14 | 15 | 16 | **note +** 17 | A basic HTML note mainly to add better looking notes/instructions for workflow makers: 18 | ![image](https://github.com/melMass/comfy_mtb/assets/7041726/2ba1f832-0044-4bad-974c-e6387981af57) 19 | 20 | 21 | ## Standalone 22 | These scripts can be taken and placed independently of `comfy_mtb` or any other files, mimicking what pythongosss did for their 23 | 24 | - **imageFeed**: a fork of @pythongosssss ' s [image feed](https://github.com/pythongosssss/ComfyUI-Custom-Scripts/tree/main/js), it adds support for: a lightbox to see images bigger, a way to load the current session history (in case of a web page reload), and different icons, most of the work come from the original script. 25 | 26 | 27 | > **NOTE** 28 | > 29 | > The original imagefeed got updated since and offer more options, ideally I would clean my lightbox thing and PR it to pythongoss later but in the meantime the script will detect if you already use the original one and not load this fork 30 | 31 | 32 | - ![imagefeed2-hd](https://github.com/melMass/comfy_mtb/assets/7041726/8539f46f-78e1-459a-a11c-fddd44e63ca9) 33 | 34 | 35 | - **notify**: a basic toast notification system that I use in some places accross mtb, it can be used by simply calling `window.MTB.notify("Hello world!")` 36 | ![extract](https://github.com/melMass/comfy_mtb/assets/7041726/450c67fc-a7e9-4bea-ae49-b610d693098d) 37 | -------------------------------------------------------------------------------- /web/mtb_sidebar.js: -------------------------------------------------------------------------------- 1 | // NOTE: this will be the LT part of mtb API system 2 | // I need to properly publish the source and fix a few things before 3 | 4 | // import { app } from '../../scripts/app.js' 5 | // // import { api } from '../../scripts/api.js' 6 | // 7 | // import * as shared from './comfy_shared.js' 8 | // import { createOutliner } from './dist/mtb_inspector.js' 9 | // 10 | // if (window?.__COMFYUI_FRONTEND_VERSION__) { 11 | // const version = window?.__COMFYUI_FRONTEND_VERSION__ 12 | // console.log(`%c ${version}`, 'background: orange; color: white;') 13 | // 14 | // const panel = app.extensionManager.registerSidebarTab({ 15 | // id: 'mtb-nodes', 16 | // icon: 'pi pi-bolt', 17 | // title: 'MTB', 18 | // tooltip: 'MTB: API outliner', 19 | // type: 'custom', 20 | // // this is run everytime the tab's diplay is toggled on. 21 | // render: (el) => { 22 | // const outliner = createOutliner(el) 23 | // const inputs = shared.getAPIInputs() 24 | // console.log('INPUTS', inputs) 25 | // outliner.$$set({ inputs }) 26 | // }, 27 | // }) 28 | // } 29 | -------------------------------------------------------------------------------- /web/notify.js: -------------------------------------------------------------------------------- 1 | /** 2 | * File: notify.js 3 | * Project: comfy_mtb 4 | * Author: Mel Massadian 5 | * 6 | * Copyright (c) 2023 Mel Massadian 7 | * 8 | */ 9 | 10 | import { app } from '../../scripts/app.js' 11 | 12 | const log = (...args) => { 13 | if (window.MTB?.TRACE) { 14 | console.debug(...args) 15 | } 16 | } 17 | 18 | let transition_time = 300 19 | 20 | const containerStyle = ` 21 | position: fixed; 22 | top: 20px; 23 | left: 20px; 24 | font-family: monospace; 25 | z-index: 99999; 26 | height: 0; 27 | overflow: hidden; 28 | transition: height ${transition_time}ms ease-in-out; 29 | 30 | ` 31 | 32 | const toastStyle = ` 33 | background-color: #333; 34 | color: #fff; 35 | padding: 10px; 36 | border-radius: 5px; 37 | opacity: 0; 38 | overflow:hidden; 39 | height:20px; 40 | transition-property: opacity, height, padding; 41 | transition-duration: ${transition_time}ms; 42 | ` 43 | 44 | function notify(message, timeout = 3000) { 45 | log('Creating toast') 46 | const container = document.getElementById('mtb-notify-container') 47 | const toast = document.createElement('div') 48 | toast.style.cssText = toastStyle 49 | toast.innerText = message 50 | container.appendChild(toast) 51 | 52 | toast.addEventListener('transitionend', (e) => { 53 | // Only on out 54 | if ( 55 | e.target === toast && 56 | e.propertyName === 'height' && 57 | e.elapsedTime > transition_time / 1000 - Number.EPSILON 58 | ) { 59 | log('Transition out') 60 | const totalHeight = Array.from(container.children).reduce( 61 | (acc, child) => acc + child.offsetHeight + 10, // Add spacing of 10px between toasts 62 | 0 63 | ) 64 | container.style.height = `${totalHeight}px` 65 | 66 | // If there are no toasts left, set the container's height to 0 67 | if (container.children.length === 0) { 68 | container.style.height = '0' 69 | } 70 | 71 | setTimeout(() => { 72 | container.removeChild(toast) 73 | log('Removed toast from DOM') 74 | }, transition_time) 75 | } else { 76 | log('Transition') 77 | } 78 | }) 79 | 80 | // Fading in the toast 81 | toast.style.opacity = '1' 82 | 83 | // Update container's height to fit new toast 84 | const totalHeight = Array.from(container.children).reduce( 85 | (acc, child) => acc + child.offsetHeight + 10, // Add spacing of 10px between toasts 86 | 0 87 | ) 88 | container.style.height = `${totalHeight}px` 89 | 90 | // remove the toast after the specified timeout 91 | setTimeout(() => { 92 | // trigger the transitions 93 | toast.style.opacity = '0' 94 | toast.style.height = '0' 95 | toast.style.paddingTop = '0' 96 | toast.style.paddingBottom = '0' 97 | }, timeout - transition_time) 98 | } 99 | 100 | app.registerExtension({ 101 | name: 'mtb.Notify', 102 | setup() { 103 | if (!window.MTB) { 104 | window.MTB = {} 105 | } 106 | 107 | const container = document.createElement('div') 108 | container.id = 'mtb-notify-container' 109 | container.style.cssText = containerStyle 110 | 111 | document.body.appendChild(container) 112 | window.MTB.notify = notify 113 | // window.MTB.notify('Hello world!') 114 | }, 115 | }) 116 | -------------------------------------------------------------------------------- /web_async/ace/ext-elastic_tabstops_lite.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"],function(e,t,n){"use strict";var r=function(){function e(e){this.$editor=e;var t=this,n=[],r=!1;this.onAfterExec=function(){r=!1,t.processRows(n),n=[]},this.onExec=function(){r=!0},this.onChange=function(e){r&&(n.indexOf(e.start.row)==-1&&n.push(e.start.row),e.end.row!=e.start.row&&n.push(e.end.row))}}return e.prototype.processRows=function(e){this.$inChange=!0;var t=[];for(var n=0,r=e.length;n-1)continue;var s=this.$findCellWidthsForBlock(i),o=this.$setBlockCellWidthsToMax(s.cellWidths),u=s.firstRow;for(var a=0,f=o.length;a=0){n=this.$cellWidthsForRow(r);if(n.length==0)break;t.unshift(n),r--}var i=r+1;r=e;var s=this.$editor.session.getLength();while(r0&&(this.$editor.session.getDocument().insertInLine({row:e,column:f+1},Array(l+1).join(" ")+" "),this.$editor.session.getDocument().removeInLine(e,f,f+1),r+=l),l<0&&p>=-l&&(this.$editor.session.getDocument().removeInLine(e,f+l,f),r+=l)}},e.prototype.$izip_longest=function(e){if(!e[0])return[];var t=e[0].length,n=e.length;for(var r=1;rt&&(t=i)}var s=[];for(var o=0;o=t.length?t.length:e.length,r=[];for(var i=0;in)return{start:o.index,end:o.index+o[2].length};if(s&&s[2])return u=t+s[2].length,{start:u,end:u+s[3].length}}var n=t.column||e.getOption("printMarginColumn"),i=t.allowMerge!=0,s=Math.min(t.startRow,t.endRow),o=Math.max(t.startRow,t.endRow),u=e.session;while(s<=o){var a=u.getLine(s);if(a.length>n){var f=m(a,n,5);if(f){var l=/^\s*/.exec(a)[0];u.replace(new r(s,f.start,s,f.end),"\n"+l)}o++}else if(i&&/\S/.test(a)&&s!=o){var c=u.getLine(s+1);if(c&&/\S/.test(c)){var h=a.replace(/\s+$/,""),p=c.replace(/^\s+/,""),d=h+" "+p,f=m(d,n,5);if(f&&f.start>h.length||d.length0?t.getSelection().moveCursorTo(n.row-1,t.session.getLine(n.row-1).length):t.getSelection().isEmpty()?n.column+=1:n.setPosition(n.row,n.column+1))}function o(e){e.editor.session.$bidiHandler.isMoveLeftOperation=/gotoleft|selectleft|backspace|removewordleft/.test(e.command.name)}function u(e,t){var n=t.session;n.$bidiHandler.currentRow=null;if(n.$bidiHandler.isRtlLine(e.start.row)&&e.action==="insert"&&e.lines.length>1)for(var r=e.start.row;r 0!";if(e==this.$splits)return;if(e>this.$splits){while(this.$splitse)t=this.$editors[this.$splits-1],this.$container.removeChild(t.container),this.$splits--;this.resize()},this.getSplits=function(){return this.$splits},this.getEditor=function(e){return this.$editors[e]},this.getCurrentEditor=function(){return this.$cEditor},this.focus=function(){this.$cEditor.focus()},this.blur=function(){this.$cEditor.blur()},this.setTheme=function(e){this.$editors.forEach(function(t){t.setTheme(e)})},this.setKeyboardHandler=function(e){this.$editors.forEach(function(t){t.setKeyboardHandler(e)})},this.forEach=function(e,t){this.$editors.forEach(e,t)},this.$fontSize="",this.setFontSize=function(e){this.$fontSize=e,this.forEach(function(t){t.setFontSize(e)})},this.$cloneSession=function(e){var t=new a(e.getDocument(),e.getMode()),n=e.getUndoManager();return t.setUndoManager(n),t.setTabSize(e.getTabSize()),t.setUseSoftTabs(e.getUseSoftTabs()),t.setOverwrite(e.getOverwrite()),t.setBreakpoints(e.getBreakpoints()),t.setUseWrapMode(e.getUseWrapMode()),t.setUseWorker(e.getUseWorker()),t.setWrapLimitRange(e.$wrapLimitRange.min,e.$wrapLimitRange.max),t.$foldData=e.$cloneFoldData(),t},this.setSession=function(e,t){var n;t==null?n=this.$cEditor:n=this.$editors[t];var r=this.$editors.some(function(t){return t.session===e});return r&&(e=this.$cloneSession(e)),n.setSession(e),e},this.getOrientation=function(){return this.$orientation},this.setOrientation=function(e){if(this.$orientation==e)return;this.$orientation=e,this.resize()},this.resize=function(){var e=this.$container.clientWidth,t=this.$container.clientHeight,n;if(this.$orientation==this.BESIDE){var r=e/this.$splits;for(var i=0;i0&&!(s%l)&&!(f%l)&&(r[l]=(r[l]||0)+1),n[f]=(n[f]||0)+1}s=f}while(up.score&&(p={score:v,length:u})}if(p.score&&p.score>1.4)var m=p.length;if(i>d+1){if(m==1||di+1)return{ch:" ",length:m}},t.detectIndentation=function(e){var n=e.getLines(0,1e3),r=t.$detectIndentation(n)||{};return r.ch&&e.setUseSoftTabs(r.ch==" "),r.length&&e.setTabSize(r.length),r},t.trimTrailingSpace=function(e,t){var n=e.getDocument(),r=n.getAllLines(),i=t&&t.trimEmpty?-1:0,s=[],o=-1;t&&t.keepCursorPosition&&(e.selection.rangeCount?e.selection.rangeList.ranges.forEach(function(e,t,n){var r=n[t+1];if(r&&r.cursor.row==e.cursor.row)return;s.push(e.cursor)}):s.push(e.selection.getCursor()),o=0);var u=s[o]&&s[o].row;for(var a=0,f=r.length;ai&&(c=s[o].column),o++,u=s[o]?s[o].row:-1),c>i&&n.removeInLine(a,c,l.length)}},t.convertIndentation=function(e,t,n){var i=e.getTabString()[0],s=e.getTabSize();n||(n=s),t||(t=i);var o=t==" "?t:r.stringRepeat(t,n),u=e.doc,a=u.getAllLines(),f={},l={};for(var c=0,h=a.length;c span {\n font-weight: normal !important;\n}\n\n.ace-github .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-github .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-github .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-github .ace_gutter-active-line {\n background-color : rgba(0, 0, 0, 0.07);\n}\n\n.ace-github .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-github .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-github .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-github .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-github .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n}\n'}),ace.define("ace/theme/github",["require","exports","module","ace/theme/github-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-github",t.cssText=e("./github-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/github"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-github_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/github_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-github-dark .ace_gutter {\n background: #24292e;\n color: #7388b5\n}\n\n.ace-github-dark .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-github-dark {\n background-color: #24292e;\n color: #FFFFFF\n}\n\n.ace-github-dark .ace_constant.ace_other,\n.ace-github-dark .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-github-dark .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-github-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #24292e;\n}\n\n.ace-github-dark .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-github-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-github-dark .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-github-dark .ace_gutter-active-line {\n background-color: #24292e\n}\n\n.ace-github-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-github-dark .ace_invisible {\n color: #404F7D\n}\n\n.ace-github-dark .ace_keyword,\n.ace-github-dark .ace_meta,\n.ace-github-dark .ace_storage,\n.ace-github-dark .ace_storage.ace_type,\n.ace-github-dark .ace_support.ace_type {\n color: #ff7b72\n}\n\n.ace-github-dark .ace_keyword.ace_operator {\n color: #79c0ff\n}\n\n.ace-github-dark .ace_constant.ace_character,\n.ace-github-dark .ace_constant.ace_language,\n.ace-github-dark .ace_constant.ace_numeric,\n.ace-github-dark .ace_keyword.ace_other.ace_unit,\n.ace-github-dark .ace_support.ace_constant,\n.ace-github-dark .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-github-dark .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-github-dark .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #ff7b72\n}\n\n.ace-github-dark .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-github-dark .ace_entity.ace_name.ace_function,\n.ace-github-dark .ace_support.ace_function,\n.ace-github-dark .ace_variable {\n color: #BBDAFF\n}\n\n.ace-github-dark .ace_support.ace_class,\n.ace-github-dark .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-github-dark .ace_heading,\n.ace-github-dark .ace_markup.ace_heading,\n.ace-github-dark .ace_string {\n color: #9fcef6\n}\n\n.ace-github-dark .ace_entity.ace_name.ace_tag,\n.ace-github-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-github-dark .ace_meta.ace_tag,\n.ace-github-dark .ace_string.ace_regexp,\n.ace-github-dark .ace_variable {\n color: #FF9DA4\n}\n\n.ace-github-dark .ace_comment {\n color: #7285B7\n}\n\n.ace-github-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-github-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-github-dark .ace_constant.ace_buildin {\n color: #0086B3;\n}\n\n.ace-github-dark .ace_variable.ace_language {\n color: #ffffff;\n}\n "}),ace.define("ace/theme/github_dark",["require","exports","module","ace/theme/github_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-github-dark",t.cssText=e("./github_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/github_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-gob.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/gob-css",["require","exports","module"],function(e,t,n){n.exports=".ace-gob .ace_gutter {\n background: #0B1818;\n color: #03EE03\n}\n\n.ace-gob .ace_print-margin {\n width: 1px;\n background: #131313\n}\n\n.ace-gob {\n background-color: #0B0B0B;\n color: #00FF00\n}\n\n.ace-gob .ace_cursor {\n border-color: rgba(16, 248, 255, 0.90);\n background-color: rgba(16, 240, 248, 0.70);\n opacity: 0.4;\n}\n\n.ace-gob .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-gob.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-gob .ace_marker-layer .ace_step {\n background: rgb(16, 128, 0)\n}\n\n.ace-gob .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(64, 255, 255, 0.25)\n}\n\n.ace-gob .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(192, 240, 255, 0.20)\n}\n\n.ace-gob .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-gob .ace_keyword,\n.ace-gob .ace_meta {\n color: #10D8E8\n}\n\n.ace-gob .ace_constant,\n.ace-gob .ace_constant.ace_character,\n.ace-gob .ace_constant.ace_character.ace_escape,\n.ace-gob .ace_constant.ace_other,\n.ace-gob .ace_heading,\n.ace-gob .ace_markup.ace_heading,\n.ace-gob .ace_support.ace_constant {\n color: #10F0A0\n}\n\n.ace-gob .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-gob .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #20F8C0\n}\n\n.ace-gob .ace_support {\n color: #20E8B0\n}\n\n.ace-gob .ace_fold {\n background-color: #50B8B8;\n border-color: #70F8F8\n}\n\n.ace-gob .ace_support.ace_function {\n color: #00F800\n}\n\n.ace-gob .ace_list,\n.ace-gob .ace_markup.ace_list,\n.ace-gob .ace_storage {\n color: #10FF98\n}\n\n.ace-gob .ace_entity.ace_name.ace_function,\n.ace-gob .ace_meta.ace_tag,\n.ace-gob .ace_variable {\n color: #00F868\n}\n\n.ace-gob .ace_string {\n color: #10F060\n}\n\n.ace-gob .ace_string.ace_regexp {\n color: #20F090;\n}\n\n.ace-gob .ace_comment {\n font-style: italic;\n color: #00E060;\n}\n\n.ace-gob .ace_variable {\n color: #00F888;\n}\n\n.ace-gob .ace_xml-pe {\n color: #488858;\n}\n\n.ace-gob .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-gob .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/gob",["require","exports","module","ace/theme/gob-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-gob",t.cssText=e("./gob-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/gob"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-gruvbox.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/gruvbox-css",["require","exports","module"],function(e,t,n){n.exports='.ace-gruvbox .ace_gutter-active-line {\n background-color: #3C3836;\n}\n\n.ace-gruvbox {\n color: #EBDAB4;\n background-color: #1D2021;\n}\n\n.ace-gruvbox .ace_invisible {\n color: #504945;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selection {\n background: rgba(179, 101, 57, 0.75)\n}\n\n.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002240;\n}\n\n.ace-gruvbox .ace_keyword {\n color: #8ec07c;\n}\n\n.ace-gruvbox .ace_comment {\n font-style: italic;\n color: #928375;\n}\n\n.ace-gruvbox .ace-statement {\n color: red;\n}\n\n.ace-gruvbox .ace_variable {\n color: #84A598;\n}\n\n.ace-gruvbox .ace_variable.ace_language {\n color: #D2879B;\n}\n\n.ace-gruvbox .ace_constant {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_language {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_numeric {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_string {\n color: #B8BA37;\n}\n\n.ace-gruvbox .ace_support {\n color: #F9BC41;\n}\n\n.ace-gruvbox .ace_support.ace_function {\n color: #F84B3C;\n}\n\n.ace-gruvbox .ace_storage {\n color: #8FBF7F;\n}\n\n.ace-gruvbox .ace_keyword.ace_operator {\n color: #EBDAB4;\n}\n\n.ace-gruvbox .ace_punctuation.ace_operator {\n color: yellow;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_active-line {\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selected-word {\n border-radius: 4px;\n border: 8px solid #3f475d;\n}\n\n.ace-gruvbox .ace_print-margin {\n width: 5px;\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC") right repeat-y;\n}\n\n.ace-gruvbox .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n'}),ace.define("ace/theme/gruvbox",["require","exports","module","ace/theme/gruvbox-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-gruvbox",t.cssText=e("./gruvbox-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/gruvbox"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-gruvbox_dark_hard.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/gruvbox_dark_hard-css",["require","exports","module"],function(e,t,n){n.exports=".ace-gruvbox-dark-hard .ace_gutter {\n background: #1d2021;\n color: rgb(132,126,106)\n}\n\n.ace-gruvbox-dark-hard .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-gruvbox-dark-hard {\n background-color: #1d2021;\n color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_cursor {\n color: #a89984\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1d2021;\n border-radius: 2px\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(235, 219, 178, 0.15)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_gutter-active-line {\n background-color: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\n border: 1px solid #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_fold {\n background-color: #b8bb26;\n border-color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_keyword {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\n color: #b16286\n}\n\n.ace-gruvbox-dark-hard .ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_other {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_function {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_class {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_type {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_storage {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_invalid {\n color: #f9f5d7;\n background-color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_string {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_string.ace_regexp {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_comment {\n font-style: italic;\n color: #928374\n}\n\n.ace-gruvbox-dark-hard .ace_variable {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_language {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_meta.ace_tag {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_heading {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_list {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/theme/gruvbox_dark_hard-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-gruvbox-dark-hard",t.cssText=e("./gruvbox_dark_hard-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() { 2 | ace.require(["ace/theme/gruvbox_dark_hard"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-idle_fingers.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/idle_fingers-css",["require","exports","module"],function(e,t,n){n.exports=".ace-idle-fingers .ace_gutter {\n background: #3b3b3b;\n color: rgb(153,153,153)\n}\n\n.ace-idle-fingers .ace_print-margin {\n width: 1px;\n background: #3b3b3b\n}\n\n.ace-idle-fingers {\n background-color: #323232;\n color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_cursor {\n color: #91FF00\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selection {\n background: rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #323232;\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_active-line {\n background: #353637\n}\n\n.ace-idle-fingers .ace_gutter-active-line {\n background-color: #353637\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers .ace_invisible {\n color: #404040\n}\n\n.ace-idle-fingers .ace_keyword,\n.ace-idle-fingers .ace_meta {\n color: #CC7833\n}\n\n.ace-idle-fingers .ace_constant,\n.ace-idle-fingers .ace_constant.ace_character,\n.ace-idle-fingers .ace_constant.ace_character.ace_escape,\n.ace-idle-fingers .ace_constant.ace_other,\n.ace-idle-fingers .ace_support.ace_constant {\n color: #6C99BB\n}\n\n.ace-idle-fingers .ace_invalid {\n color: #FFFFFF;\n background-color: #FF0000\n}\n\n.ace-idle-fingers .ace_fold {\n background-color: #CC7833;\n border-color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_support.ace_function {\n color: #B83426\n}\n\n.ace-idle-fingers .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-idle-fingers .ace_string {\n color: #A5C261\n}\n\n.ace-idle-fingers .ace_string.ace_regexp {\n color: #CCCC33\n}\n\n.ace-idle-fingers .ace_comment {\n font-style: italic;\n color: #BC9458\n}\n\n.ace-idle-fingers .ace_meta.ace_tag {\n color: #FFE5BB\n}\n\n.ace-idle-fingers .ace_entity.ace_name {\n color: #FFC66D\n}\n\n.ace-idle-fingers .ace_collab.ace_user1 {\n color: #323232;\n background-color: #FFF980\n}\n\n.ace-idle-fingers .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-idle-fingers .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/idle_fingers",["require","exports","module","ace/theme/idle_fingers-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-idle-fingers",t.cssText=e("./idle_fingers-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/idle_fingers"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-kr_theme.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/kr_theme-css",["require","exports","module"],function(e,t,n){n.exports=".ace-kr-theme .ace_gutter {\n background: #1c1917;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_print-margin {\n width: 1px;\n background: #1c1917\n}\n\n.ace-kr-theme {\n background-color: #0B0A09;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_cursor {\n color: #FF9900\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selection {\n background: rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0B0A09;\n}\n\n.ace-kr-theme .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_active-line {\n background: #38403D\n}\n\n.ace-kr-theme .ace_gutter-active-line {\n background-color : #38403D\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme .ace_invisible {\n color: rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_keyword,\n.ace-kr-theme .ace_meta {\n color: #949C8B\n}\n\n.ace-kr-theme .ace_constant,\n.ace-kr-theme .ace_constant.ace_character,\n.ace-kr-theme .ace_constant.ace_character.ace_escape,\n.ace-kr-theme .ace_constant.ace_other {\n color: rgba(210, 117, 24, 0.76)\n}\n\n.ace-kr-theme .ace_invalid {\n color: #F8F8F8;\n background-color: #A41300\n}\n\n.ace-kr-theme .ace_support {\n color: #9FC28A\n}\n\n.ace-kr-theme .ace_support.ace_constant {\n color: #C27E66\n}\n\n.ace-kr-theme .ace_fold {\n background-color: #949C8B;\n border-color: #FCFFE0\n}\n\n.ace-kr-theme .ace_support.ace_function {\n color: #85873A\n}\n\n.ace-kr-theme .ace_storage {\n color: #FFEE80\n}\n\n.ace-kr-theme .ace_string {\n color: rgba(164, 161, 181, 0.8)\n}\n\n.ace-kr-theme .ace_string.ace_regexp {\n color: rgba(125, 255, 192, 0.65)\n}\n\n.ace-kr-theme .ace_comment {\n font-style: italic;\n color: #706D5B\n}\n\n.ace-kr-theme .ace_variable {\n color: #D1A796\n}\n\n.ace-kr-theme .ace_list,\n.ace-kr-theme .ace_markup.ace_list {\n background-color: #0F0040\n}\n\n.ace-kr-theme .ace_variable.ace_language {\n color: #FF80E1\n}\n\n.ace-kr-theme .ace_meta.ace_tag {\n color: #BABD9C\n}\n\n.ace-kr-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-kr-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/kr_theme",["require","exports","module","ace/theme/kr_theme-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-kr-theme",t.cssText=e("./kr_theme-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/kr_theme"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-kuroir.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/kuroir-css",["require","exports","module"],function(e,t,n){n.exports='/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */\n\n.ace-kuroir .ace_gutter {\n background: #e8e8e8;\n color: #333;\n}\n\n.ace-kuroir .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-kuroir {\n background-color: #E8E9E8;\n color: #363636;\n}\n\n.ace-kuroir .ace_cursor {\n color: #202020;\n}\n\n.ace-kuroir .ace_marker-layer .ace_selection {\n background: rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #E8E9E8;\n}\n\n.ace-kuroir .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-kuroir .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(0, 0, 0, 0.29);\n}\n\n.ace-kuroir .ace_marker-layer .ace_active-line {\n background: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_gutter-active-line {\n background-color: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-kuroir .ace_fold {\n border-color: #363636;\n}\n\n\n\n\n\n.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\nbackground-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\nfont-style:italic;\ncolor:#FD1732;\nbackground-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\nbackground-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\nbackground-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\nbackground-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\n\n.ace-kuroir .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-kuroir .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/kuroir",["require","exports","module","ace/theme/kuroir-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-kuroir",t.cssText=e("./kuroir-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/kuroir"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-merbivore.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/merbivore-css",["require","exports","module"],function(e,t,n){n.exports=".ace-merbivore .ace_gutter {\n background: #202020;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-merbivore {\n background-color: #161616;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore .ace_marker-layer .ace_selection {\n background: #454545\n}\n\n.ace-merbivore.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #161616;\n}\n\n.ace-merbivore .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore .ace_marker-layer .ace_selected-word {\n border: 1px solid #454545\n}\n\n.ace-merbivore .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore .ace_entity.ace_name.ace_tag,\n.ace-merbivore .ace_keyword,\n.ace-merbivore .ace_meta,\n.ace-merbivore .ace_meta.ace_tag,\n.ace-merbivore .ace_storage,\n.ace-merbivore .ace_support.ace_function {\n color: #FC6F09\n}\n\n.ace-merbivore .ace_constant,\n.ace-merbivore .ace_constant.ace_character,\n.ace-merbivore .ace_constant.ace_character.ace_escape,\n.ace-merbivore .ace_constant.ace_other,\n.ace-merbivore .ace_support.ace_type {\n color: #1EDAFB\n}\n\n.ace-merbivore .ace_constant.ace_character.ace_escape {\n color: #519F50\n}\n\n.ace-merbivore .ace_constant.ace_language {\n color: #FDC251\n}\n\n.ace-merbivore .ace_constant.ace_library,\n.ace-merbivore .ace_string,\n.ace-merbivore .ace_support.ace_constant {\n color: #8DFF0A\n}\n\n.ace-merbivore .ace_constant.ace_numeric {\n color: #58C554\n}\n\n.ace-merbivore .ace_invalid {\n color: #FFFFFF;\n background-color: #990000\n}\n\n.ace-merbivore .ace_fold {\n background-color: #FC6F09;\n border-color: #E6E1DC\n}\n\n.ace-merbivore .ace_comment {\n font-style: italic;\n color: #AD2EA4\n}\n\n.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\n color: #FFFF89\n}\n\n.ace-merbivore .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/merbivore",["require","exports","module","ace/theme/merbivore-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-merbivore",t.cssText=e("./merbivore-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/merbivore"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-merbivore_soft.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/merbivore_soft-css",["require","exports","module"],function(e,t,n){n.exports=".ace-merbivore-soft .ace_gutter {\n background: #262424;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_print-margin {\n width: 1px;\n background: #262424\n}\n\n.ace-merbivore-soft {\n background-color: #1C1C1C;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selection {\n background: #494949\n}\n\n.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1C1C1C;\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore-soft .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\n border: 1px solid #494949\n}\n\n.ace-merbivore-soft .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\n.ace-merbivore-soft .ace_keyword,\n.ace-merbivore-soft .ace_meta,\n.ace-merbivore-soft .ace_meta.ace_tag,\n.ace-merbivore-soft .ace_storage {\n color: #FC803A\n}\n\n.ace-merbivore-soft .ace_constant,\n.ace-merbivore-soft .ace_constant.ace_character,\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\n.ace-merbivore-soft .ace_constant.ace_other,\n.ace-merbivore-soft .ace_support.ace_type {\n color: #68C1D8\n}\n\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\n color: #B3E5B4\n}\n\n.ace-merbivore-soft .ace_constant.ace_language {\n color: #E1C582\n}\n\n.ace-merbivore-soft .ace_constant.ace_library,\n.ace-merbivore-soft .ace_string,\n.ace-merbivore-soft .ace_support.ace_constant {\n color: #8EC65F\n}\n\n.ace-merbivore-soft .ace_constant.ace_numeric {\n color: #7FC578\n}\n\n.ace-merbivore-soft .ace_invalid,\n.ace-merbivore-soft .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #FE3838\n}\n\n.ace-merbivore-soft .ace_fold {\n background-color: #FC803A;\n border-color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_comment,\n.ace-merbivore-soft .ace_meta {\n font-style: italic;\n color: #AC4BB8\n}\n\n.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\n color: #EAF1A3\n}\n\n.ace-merbivore-soft .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore-soft .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/merbivore_soft",["require","exports","module","ace/theme/merbivore_soft-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-merbivore-soft",t.cssText=e("./merbivore_soft-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/merbivore_soft"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-mono_industrial.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/mono_industrial-css",["require","exports","module"],function(e,t,n){n.exports=".ace-mono-industrial .ace_gutter {\n background: #1d2521;\n color: #C5C9C9\n}\n\n.ace-mono-industrial .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-mono-industrial {\n background-color: #222C28;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selection {\n background: rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #222C28;\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_active-line {\n background: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_gutter-active-line {\n background-color: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial .ace_invisible {\n color: rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_string {\n background-color: #151C19;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_keyword,\n.ace-mono-industrial .ace_meta {\n color: #A39E64\n}\n\n.ace-mono-industrial .ace_constant,\n.ace-mono-industrial .ace_constant.ace_character,\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\n.ace-mono-industrial .ace_constant.ace_numeric,\n.ace-mono-industrial .ace_constant.ace_other {\n color: #E98800\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\n.ace-mono-industrial .ace_keyword.ace_operator,\n.ace-mono-industrial .ace_variable {\n color: #A8B3AB\n}\n\n.ace-mono-industrial .ace_invalid {\n color: #FFFFFF;\n background-color: rgba(153, 0, 0, 0.68)\n}\n\n.ace-mono-industrial .ace_support.ace_constant {\n color: #C87500\n}\n\n.ace-mono-industrial .ace_fold {\n background-color: #A8B3AB;\n border-color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_support.ace_function {\n color: #588E60\n}\n\n.ace-mono-industrial .ace_entity.ace_name,\n.ace-mono-industrial .ace_support.ace_class,\n.ace-mono-industrial .ace_support.ace_type {\n color: #5778B6\n}\n\n.ace-mono-industrial .ace_storage {\n color: #C23B00\n}\n\n.ace-mono-industrial .ace_variable.ace_language,\n.ace-mono-industrial .ace_variable.ace_parameter {\n color: #648BD2\n}\n\n.ace-mono-industrial .ace_comment {\n color: #666C68;\n background-color: #151C19\n}\n\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\n color: #909993\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\n color: #A65EFF\n}\n\n.ace-mono-industrial .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-mono-industrial .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/mono_industrial",["require","exports","module","ace/theme/mono_industrial-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-mono-industrial",t.cssText=e("./mono_industrial-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/mono_industrial"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-monokai.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/monokai-css",["require","exports","module"],function(e,t,n){n.exports=".ace-monokai .ace_gutter {\n background: #2F3129;\n color: #8F908A\n}\n\n.ace-monokai .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-monokai {\n background-color: #272822;\n color: #F8F8F2\n}\n\n.ace-monokai .ace_cursor {\n color: #F8F8F0\n}\n\n.ace-monokai .ace_marker-layer .ace_selection {\n background: #49483E\n}\n\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #272822;\n}\n\n.ace-monokai .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-monokai .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_marker-layer .ace_active-line {\n background: #202020\n}\n\n.ace-monokai .ace_gutter-active-line {\n background-color: #272727\n}\n\n.ace-monokai .ace_marker-layer .ace_selected-word {\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_invisible {\n color: #52524d\n}\n\n.ace-monokai .ace_entity.ace_name.ace_tag,\n.ace-monokai .ace_keyword,\n.ace-monokai .ace_meta.ace_tag,\n.ace-monokai .ace_storage {\n color: #F92672\n}\n\n.ace-monokai .ace_punctuation,\n.ace-monokai .ace_punctuation.ace_tag {\n color: #fff\n}\n\n.ace-monokai .ace_constant.ace_character,\n.ace-monokai .ace_constant.ace_language,\n.ace-monokai .ace_constant.ace_numeric,\n.ace-monokai .ace_constant.ace_other {\n color: #AE81FF\n}\n\n.ace-monokai .ace_invalid {\n color: #F8F8F0;\n background-color: #F92672\n}\n\n.ace-monokai .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #AE81FF\n}\n\n.ace-monokai .ace_support.ace_constant,\n.ace-monokai .ace_support.ace_function {\n color: #66D9EF\n}\n\n.ace-monokai .ace_fold {\n background-color: #A6E22E;\n border-color: #F8F8F2\n}\n\n.ace-monokai .ace_storage.ace_type,\n.ace-monokai .ace_support.ace_class,\n.ace-monokai .ace_support.ace_type {\n font-style: italic;\n color: #66D9EF\n}\n\n.ace-monokai .ace_entity.ace_name.ace_function,\n.ace-monokai .ace_entity.ace_other,\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\n.ace-monokai .ace_variable {\n color: #A6E22E\n}\n\n.ace-monokai .ace_variable.ace_parameter {\n font-style: italic;\n color: #FD971F\n}\n\n.ace-monokai .ace_string {\n color: #E6DB74\n}\n\n.ace-monokai .ace_comment {\n color: #75715E\n}\n\n.ace-monokai .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-monokai .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/monokai",["require","exports","module","ace/theme/monokai-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=e("./monokai-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/monokai"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-nord_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/nord_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-nord-dark .ace_gutter {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_print-margin {\n width: 1px;\n background: #4c566a;\n}\n\n.ace-nord-dark {\n background-color: #2e3440;\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-nord-dark .ace_storage {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_cursor {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_string.ace_regexp {\n color: #bf616a;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_active-line {\n background: #434c5ecc;\n}\n.ace-nord-dark .ace_marker-layer .ace_selection {\n background: #434c5ecc;\n}\n\n.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2e3440;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_step {\n background: #ebcb8b;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_gutter-active-line {\n background-color: #434c5ecc;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_invisible {\n color: #4c566a;\n}\n\n.ace-nord-dark .ace_keyword,\n.ace-nord-dark .ace_meta,\n.ace-nord-dark .ace_support.ace_class,\n.ace-nord-dark .ace_support.ace_type {\n color: #81a1c1;\n}\n\n.ace-nord-dark .ace_constant.ace_character,\n.ace-nord-dark .ace_constant.ace_other {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_constant.ace_language {\n color: #5e81ac;\n}\n\n.ace-nord-dark .ace_constant.ace_escape {\n color: #ebcB8b;\n}\n\n.ace-nord-dark .ace_constant.ace_numeric {\n color: #b48ead;\n}\n\n.ace-nord-dark .ace_fold {\n background-color: #4c566a;\n border-color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_name.ace_function,\n.ace-nord-dark .ace_entity.ace_name.ace_tag,\n.ace-nord-dark .ace_support.ace_function,\n.ace-nord-dark .ace_variable,\n.ace-nord-dark .ace_variable.ace_language {\n color: #8fbcbb;\n}\n\n.ace-nord-dark .ace_string {\n color: #a3be8c;\n}\n\n.ace-nord-dark .ace_comment {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_indent-guide {\n box-shadow: inset -1px 0 0 0 #434c5eb3;\n}\n\n.ace-nord-dark .ace_indent-guide-active {\n box-shadow: inset -1px 0 0 0 #8395b8b3;\n}\n"}),ace.define("ace/theme/nord_dark",["require","exports","module","ace/theme/nord_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-nord-dark",t.cssText=e("./nord_dark-css"),t.$selectionColorConflict=!0;var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/nord_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-one_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/one_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-one-dark .ace_gutter {\n background: #282c34;\n color: #6a6f7a\n}\n\n.ace-one-dark .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-one-dark {\n background-color: #282c34;\n color: #abb2bf\n}\n\n.ace-one-dark .ace_cursor {\n color: #528bff\n}\n\n.ace-one-dark .ace_marker-layer .ace_selection {\n background: #3d4350\n}\n\n.ace-one-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0 #282c34;\n border-radius: 2px\n}\n\n.ace-one-dark .ace_marker-layer .ace_step {\n background: #c6dbae\n}\n\n.ace-one-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #747369\n}\n\n.ace-one-dark .ace_marker-layer .ace_active-line {\n background: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_gutter-active-line {\n background-color: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #3d4350\n}\n\n.ace-one-dark .ace_fold {\n background-color: #61afef;\n border-color: #abb2bf\n}\n\n.ace-one-dark .ace_keyword {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_operator {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_other.ace_unit {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_language {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_numeric {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_character {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_constant.ace_other {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_support.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_support.ace_constant {\n color: #d19a66\n}\n\n.ace-one-dark .ace_support.ace_class {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_support.ace_type {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_storage {\n color: #c678dd\n}\n\n.ace-one-dark .ace_storage.ace_type {\n color: #c678dd\n}\n\n.ace-one-dark .ace_invalid {\n color: #fff;\n background-color: #f2777a\n}\n\n.ace-one-dark .ace_invalid.ace_deprecated {\n color: #272b33;\n background-color: #d27b53\n}\n\n.ace-one-dark .ace_string {\n color: #98c379\n}\n\n.ace-one-dark .ace_string.ace_regexp {\n color: #e06c75\n}\n\n.ace-one-dark .ace_comment {\n font-style: italic;\n color: #5c6370\n}\n\n.ace-one-dark .ace_variable {\n color: #e06c75\n}\n\n.ace-one-dark .ace_variable.ace_parameter {\n color: #d19a66\n}\n\n.ace-one-dark .ace_meta.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_markup.ace_heading {\n color: #98c379\n}\n\n.ace-one-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-one-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/one_dark",["require","exports","module","ace/theme/one_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-one-dark",t.cssText=e("./one_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/one_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-pastel_on_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/pastel_on_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-pastel-on-dark .ace_gutter {\n background: #353030;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_print-margin {\n width: 1px;\n background: #353030\n}\n\n.ace-pastel-on-dark {\n background-color: #2C2828;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2C2828;\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_keyword,\n.ace-pastel-on-dark .ace_meta {\n color: #757aD8\n}\n\n.ace-pastel-on-dark .ace_constant,\n.ace-pastel-on-dark .ace_constant.ace_character,\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\n.ace-pastel-on-dark .ace_constant.ace_other {\n color: #4FB7C5\n}\n\n.ace-pastel-on-dark .ace_keyword.ace_operator {\n color: #797878\n}\n\n.ace-pastel-on-dark .ace_constant.ace_character {\n color: #AFA472\n}\n\n.ace-pastel-on-dark .ace_constant.ace_language {\n color: #DE8E30\n}\n\n.ace-pastel-on-dark .ace_constant.ace_numeric {\n color: #CCCCCC\n}\n\n.ace-pastel-on-dark .ace_invalid,\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-pastel-on-dark .ace_fold {\n background-color: #757aD8;\n border-color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_support.ace_function {\n color: #AEB2F8\n}\n\n.ace-pastel-on-dark .ace_string {\n color: #66A968\n}\n\n.ace-pastel-on-dark .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-pastel-on-dark .ace_comment {\n color: #A6C6FF\n}\n\n.ace-pastel-on-dark .ace_variable {\n color: #BEBF55\n}\n\n.ace-pastel-on-dark .ace_variable.ace_language {\n color: #C1C144\n}\n\n.ace-pastel-on-dark .ace_xml-pe {\n color: #494949\n}\n\n.ace-pastel-on-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-pastel-on-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/pastel_on_dark",["require","exports","module","ace/theme/pastel_on_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-pastel-on-dark",t.cssText=e("./pastel_on_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/pastel_on_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-solarized_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/solarized_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-solarized-dark .ace_gutter {\n background: #01313f;\n color: #d0edf7\n}\n\n.ace-solarized-dark .ace_print-margin {\n width: 1px;\n background: #33555E\n}\n\n.ace-solarized-dark {\n background-color: #002B36;\n color: #839496\n}\n\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-solarized-dark .ace_storage {\n color: #839496\n}\n\n.ace-solarized-dark .ace_cursor,\n.ace-solarized-dark .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\n.ace-solarized-dark .ace_marker-layer .ace_selection {\n background: rgba(255, 255, 255, 0.1)\n}\n\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002B36;\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_gutter-active-line {\n background-color: #0d3440\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #073642\n}\n\n.ace-solarized-dark .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_keyword,\n.ace-solarized-dark .ace_meta,\n.ace-solarized-dark .ace_support.ace_class,\n.ace-solarized-dark .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-dark .ace_constant.ace_character,\n.ace-solarized-dark .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-dark .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-dark .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-dark .ace_fold {\n background-color: #268BD2;\n border-color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\n.ace-solarized-dark .ace_support.ace_function,\n.ace-solarized-dark .ace_variable,\n.ace-solarized-dark .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-dark .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-dark .ace_comment {\n font-style: italic;\n color: #657B83\n}\n\n.ace-solarized-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/solarized_dark",["require","exports","module","ace/theme/solarized_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-solarized-dark",t.cssText=e("./solarized_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/solarized_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-solarized_light.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/solarized_light-css",["require","exports","module"],function(e,t,n){n.exports='.ace-solarized-light .ace_gutter {\n background: #fbf1d3;\n color: #333\n}\n\n.ace-solarized-light .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-solarized-light {\n background-color: #FDF6E3;\n color: #586E75\n}\n\n.ace-solarized-light .ace_cursor {\n color: #000000\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selection {\n background: rgba(7, 54, 67, 0.09)\n}\n\n.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FDF6E3;\n}\n\n.ace-solarized-light .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_active-line {\n background: #EEE8D5\n}\n\n.ace-solarized-light .ace_gutter-active-line {\n background-color : #EDE5C1\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selected-word {\n border: 1px solid #7f9390\n}\n\n.ace-solarized-light .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_keyword,\n.ace-solarized-light .ace_meta,\n.ace-solarized-light .ace_support.ace_class,\n.ace-solarized-light .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-light .ace_constant.ace_character,\n.ace-solarized-light .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-light .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-light .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-light .ace_fold {\n background-color: #268BD2;\n border-color: #586E75\n}\n\n.ace-solarized-light .ace_entity.ace_name.ace_function,\n.ace-solarized-light .ace_entity.ace_name.ace_tag,\n.ace-solarized-light .ace_support.ace_function,\n.ace-solarized-light .ace_variable,\n.ace-solarized-light .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-light .ace_storage {\n color: #073642\n}\n\n.ace-solarized-light .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-light .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-light .ace_comment,\n.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\n color: #93A1A1\n}\n\n.ace-solarized-light .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-light .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/solarized_light",["require","exports","module","ace/theme/solarized_light-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-solarized-light",t.cssText=e("./solarized_light-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/solarized_light"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-terminal.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/terminal-css",["require","exports","module"],function(e,t,n){n.exports=".ace-terminal-theme .ace_gutter {\n background: #1a0005;\n color: steelblue\n}\n\n.ace-terminal-theme .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-terminal-theme {\n background-color: black;\n color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px black;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_step {\n background: rgb(0, 0, 0)\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\n margin: -1px 0 0 -1px;\n border: 1px solid #900\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-terminal-theme .ace_gutter-active-line {\n background-color: #2A112A\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid #424242\n}\n\n.ace-terminal-theme .ace_invisible {\n color: #343434\n}\n\n.ace-terminal-theme .ace_keyword,\n.ace-terminal-theme .ace_meta,\n.ace-terminal-theme .ace_storage,\n.ace-terminal-theme .ace_storage.ace_type,\n.ace-terminal-theme .ace_support.ace_type {\n color: tomato\n}\n\n.ace-terminal-theme .ace_keyword.ace_operator {\n color: deeppink\n}\n\n.ace-terminal-theme .ace_constant.ace_character,\n.ace-terminal-theme .ace_constant.ace_language,\n.ace-terminal-theme .ace_constant.ace_numeric,\n.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\n.ace-terminal-theme .ace_support.ace_constant,\n.ace-terminal-theme .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-terminal-theme .ace_constant.ace_other {\n color: gold\n}\n\n.ace-terminal-theme .ace_invalid {\n color: yellow;\n background-color: red\n}\n\n.ace-terminal-theme .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-terminal-theme .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_function,\n.ace-terminal-theme .ace_support.ace_function,\n.ace-terminal-theme .ace_variable {\n color: #7AA6DA\n}\n\n.ace-terminal-theme .ace_support.ace_class,\n.ace-terminal-theme .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-terminal-theme .ace_heading,\n.ace-terminal-theme .ace_string {\n color: #B9CA4A\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_tag,\n.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\n.ace-terminal-theme .ace_meta.ace_tag,\n.ace-terminal-theme .ace_string.ace_regexp,\n.ace-terminal-theme .ace_variable {\n color: #D54E53\n}\n\n.ace-terminal-theme .ace_comment {\n color: orangered\n}\n\n.ace-terminal-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-terminal-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/terminal",["require","exports","module","ace/theme/terminal-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-terminal-theme",t.cssText=e("./terminal-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/terminal"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-textmate.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText=e("./textmate-css"),t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/textmate"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-tomorrow.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/tomorrow-css",["require","exports","module"],function(e,t,n){n.exports='.ace-tomorrow .ace_gutter {\n background: #f6f6f6;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_print-margin {\n width: 1px;\n background: #f6f6f6\n}\n\n.ace-tomorrow {\n background-color: #FFFFFF;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selection {\n background: #D6D6D6\n}\n\n.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-tomorrow .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-tomorrow .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #D1D1D1\n}\n\n.ace-tomorrow .ace_marker-layer .ace_active-line {\n background: #EFEFEF\n}\n\n.ace-tomorrow .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selected-word {\n border: 1px solid #D6D6D6\n}\n\n.ace-tomorrow .ace_invisible {\n color: #D1D1D1\n}\n\n.ace-tomorrow .ace_keyword,\n.ace-tomorrow .ace_meta,\n.ace-tomorrow .ace_storage,\n.ace-tomorrow .ace_storage.ace_type,\n.ace-tomorrow .ace_support.ace_type {\n color: #8959A8\n}\n\n.ace-tomorrow .ace_keyword.ace_operator {\n color: #3E999F\n}\n\n.ace-tomorrow .ace_constant.ace_character,\n.ace-tomorrow .ace_constant.ace_language,\n.ace-tomorrow .ace_constant.ace_numeric,\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow .ace_support.ace_constant,\n.ace-tomorrow .ace_variable.ace_parameter {\n color: #F5871F\n}\n\n.ace-tomorrow .ace_constant.ace_other {\n color: #666969\n}\n\n.ace-tomorrow .ace_invalid {\n color: #FFFFFF;\n background-color: #C82829\n}\n\n.ace-tomorrow .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #8959A8\n}\n\n.ace-tomorrow .ace_fold {\n background-color: #4271AE;\n border-color: #4D4D4C\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_function,\n.ace-tomorrow .ace_support.ace_function,\n.ace-tomorrow .ace_variable {\n color: #4271AE\n}\n\n.ace-tomorrow .ace_support.ace_class,\n.ace-tomorrow .ace_support.ace_type {\n color: #C99E00\n}\n\n.ace-tomorrow .ace_heading,\n.ace-tomorrow .ace_markup.ace_heading,\n.ace-tomorrow .ace_string {\n color: #718C00\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow .ace_meta.ace_tag,\n.ace-tomorrow .ace_string.ace_regexp,\n.ace-tomorrow .ace_variable {\n color: #C82829\n}\n\n.ace-tomorrow .ace_comment {\n color: #8E908C\n}\n\n.ace-tomorrow .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-tomorrow .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/tomorrow",["require","exports","module","ace/theme/tomorrow-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tomorrow",t.cssText=e("./tomorrow-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/tomorrow"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-tomorrow_night.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/tomorrow_night-css",["require","exports","module"],function(e,t,n){n.exports=".ace-tomorrow-night .ace_gutter {\n background: #25282c;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_print-margin {\n width: 1px;\n background: #25282c\n}\n\n.ace-tomorrow-night {\n background-color: #1D1F21;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\n background: #373B41\n}\n\n.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1D1F21;\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #4B4E55\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_active-line {\n background: #282A2E\n}\n\n.ace-tomorrow-night .ace_gutter-active-line {\n background-color: #282A2E\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #373B41\n}\n\n.ace-tomorrow-night .ace_invisible {\n color: #4B4E55\n}\n\n.ace-tomorrow-night .ace_keyword,\n.ace-tomorrow-night .ace_meta,\n.ace-tomorrow-night .ace_storage,\n.ace-tomorrow-night .ace_storage.ace_type,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #B294BB\n}\n\n.ace-tomorrow-night .ace_keyword.ace_operator {\n color: #8ABEB7\n}\n\n.ace-tomorrow-night .ace_constant.ace_character,\n.ace-tomorrow-night .ace_constant.ace_language,\n.ace-tomorrow-night .ace_constant.ace_numeric,\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night .ace_support.ace_constant,\n.ace-tomorrow-night .ace_variable.ace_parameter {\n color: #DE935F\n}\n\n.ace-tomorrow-night .ace_constant.ace_other {\n color: #CED1CF\n}\n\n.ace-tomorrow-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night .ace_fold {\n background-color: #81A2BE;\n border-color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night .ace_support.ace_function,\n.ace-tomorrow-night .ace_variable {\n color: #81A2BE\n}\n\n.ace-tomorrow-night .ace_support.ace_class,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #F0C674\n}\n\n.ace-tomorrow-night .ace_heading,\n.ace-tomorrow-night .ace_markup.ace_heading,\n.ace-tomorrow-night .ace_string {\n color: #B5BD68\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night .ace_meta.ace_tag,\n.ace-tomorrow-night .ace_string.ace_regexp,\n.ace-tomorrow-night .ace_variable {\n color: #CC6666\n}\n\n.ace-tomorrow-night .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/theme/tomorrow_night-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night",t.cssText=e("./tomorrow_night-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/tomorrow_night"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-tomorrow_night_blue.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/tomorrow_night_blue-css",["require","exports","module"],function(e,t,n){n.exports=".ace-tomorrow-night-blue .ace_gutter {\n background: #00204b;\n color: #7388b5\n}\n\n.ace-tomorrow-night-blue .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-tomorrow-night-blue {\n background-color: #002451;\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_other,\n.ace-tomorrow-night-blue .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002451;\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-tomorrow-night-blue .ace_gutter-active-line {\n background-color: #022040\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-tomorrow-night-blue .ace_invisible {\n color: #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_keyword,\n.ace-tomorrow-night-blue .ace_meta,\n.ace-tomorrow-night-blue .ace_storage,\n.ace-tomorrow-night-blue .ace_storage.ace_type,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_keyword.ace_operator {\n color: #99FFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_character,\n.ace-tomorrow-night-blue .ace_constant.ace_language,\n.ace-tomorrow-night-blue .ace_constant.ace_numeric,\n.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-blue .ace_support.ace_constant,\n.ace-tomorrow-night-blue .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-tomorrow-night-blue .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-blue .ace_support.ace_function,\n.ace-tomorrow-night-blue .ace_variable {\n color: #BBDAFF\n}\n\n.ace-tomorrow-night-blue .ace_support.ace_class,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-tomorrow-night-blue .ace_heading,\n.ace-tomorrow-night-blue .ace_markup.ace_heading,\n.ace-tomorrow-night-blue .ace_string {\n color: #D1F1A9\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-blue .ace_meta.ace_tag,\n.ace-tomorrow-night-blue .ace_string.ace_regexp,\n.ace-tomorrow-night-blue .ace_variable {\n color: #FF9DA4\n}\n\n.ace-tomorrow-night-blue .ace_comment {\n color: #7285B7\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/theme/tomorrow_night_blue-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night-blue",t.cssText=e("./tomorrow_night_blue-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/tomorrow_night_blue"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-twilight.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/twilight-css",["require","exports","module"],function(e,t,n){n.exports=".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/twilight",["require","exports","module","ace/theme/twilight-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-twilight",t.cssText=e("./twilight-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/twilight"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-vibrant_ink.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/vibrant_ink-css",["require","exports","module"],function(e,t,n){n.exports=".ace-vibrant-ink .ace_gutter {\n background: #1a1a1a;\n color: #BEBEBE\n}\n\n.ace-vibrant-ink .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-vibrant-ink {\n background-color: #0F0F0F;\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selection {\n background: #6699CC\n}\n\n.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0F0F0F;\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_active-line {\n background: #333333\n}\n\n.ace-vibrant-ink .ace_gutter-active-line {\n background-color: #333333\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\n border: 1px solid #6699CC\n}\n\n.ace-vibrant-ink .ace_invisible {\n color: #404040\n}\n\n.ace-vibrant-ink .ace_keyword,\n.ace-vibrant-ink .ace_meta {\n color: #FF6600\n}\n\n.ace-vibrant-ink .ace_constant,\n.ace-vibrant-ink .ace_constant.ace_character,\n.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\n.ace-vibrant-ink .ace_constant.ace_other {\n color: #339999\n}\n\n.ace-vibrant-ink .ace_constant.ace_numeric {\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_invalid,\n.ace-vibrant-ink .ace_invalid.ace_deprecated {\n color: #CCFF33;\n background-color: #000000\n}\n\n.ace-vibrant-ink .ace_fold {\n background-color: #FFCC00;\n border-color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_entity.ace_name.ace_function,\n.ace-vibrant-ink .ace_support.ace_function,\n.ace-vibrant-ink .ace_variable {\n color: #FFCC00\n}\n\n.ace-vibrant-ink .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-vibrant-ink .ace_string {\n color: #66FF00\n}\n\n.ace-vibrant-ink .ace_string.ace_regexp {\n color: #44B4CC\n}\n\n.ace-vibrant-ink .ace_comment {\n color: #9933CC\n}\n\n.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\n font-style: italic;\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-vibrant-ink .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/vibrant_ink",["require","exports","module","ace/theme/vibrant_ink-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-vibrant-ink",t.cssText=e("./vibrant_ink-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/vibrant_ink"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web_async/ace/theme-xcode.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/xcode-css",["require","exports","module"],function(e,t,n){n.exports='/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */\n\n.ace-xcode .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-xcode .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-xcode {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-xcode .ace_cursor {\n color: #000000\n}\n\n.ace-xcode .ace_marker-layer .ace_selection {\n background: #B5D5FF\n}\n\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-xcode .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-xcode .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-xcode .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_marker-layer .ace_selected-word {\n border: 1px solid #B5D5FF\n}\n\n.ace-xcode .ace_constant.ace_language,\n.ace-xcode .ace_keyword,\n.ace-xcode .ace_meta,\n.ace-xcode .ace_variable.ace_language {\n color: #C800A4\n}\n\n.ace-xcode .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-xcode .ace_constant.ace_character,\n.ace-xcode .ace_constant.ace_other {\n color: #275A5E\n}\n\n.ace-xcode .ace_constant.ace_numeric {\n color: #3A00DC\n}\n\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\n.ace-xcode .ace_support.ace_constant,\n.ace-xcode .ace_support.ace_function {\n color: #450084\n}\n\n.ace-xcode .ace_fold {\n background-color: #C800A4;\n border-color: #000000\n}\n\n.ace-xcode .ace_entity.ace_name.ace_tag,\n.ace-xcode .ace_support.ace_class,\n.ace-xcode .ace_support.ace_type {\n color: #790EAD\n}\n\n.ace-xcode .ace_storage {\n color: #C900A4\n}\n\n.ace-xcode .ace_string {\n color: #DF0002\n}\n\n.ace-xcode .ace_comment {\n color: #008E00\n}\n\n.ace-xcode .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-xcode .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/xcode",["require","exports","module","ace/theme/xcode-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-xcode",t.cssText=e("./xcode-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/xcode"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | --------------------------------------------------------------------------------