├── LICENSE ├── README.md ├── adv.png ├── backup.sh ├── build.py ├── build.sh ├── build_old ├── config.json.js ├── koolclash.tar.gz ├── koolclash ├── bin │ ├── clash-linux-amd64 │ ├── subconverter.tar.gz │ └── yq_linux_amd64 ├── init.d │ └── S99koolclash.sh ├── install.sh ├── koolclash │ └── config │ │ ├── Country.mmdb │ │ ├── GeoSite.dat │ │ ├── china_ip_route.ipset │ │ ├── dns.yml │ │ └── profile.yml ├── scripts │ ├── koolclash_acl_mode.sh │ ├── koolclash_check_yaml.sh │ ├── koolclash_config.sh │ ├── koolclash_control.sh │ ├── koolclash_debug.sh │ ├── koolclash_download_config.sh │ ├── koolclash_firewall.sh │ ├── koolclash_flow_status.sh │ ├── koolclash_getarp.sh │ ├── koolclash_node_memory.sh │ ├── koolclash_return_chnip.sh │ ├── koolclash_save_config.sh │ ├── koolclash_save_control.sh │ ├── koolclash_save_dns_config.sh │ ├── koolclash_status.sh │ ├── koolclash_sub.sh │ ├── koolclash_subconverter.sh │ ├── koolclash_switch_direct.sh │ ├── koolclash_switch_global.sh │ ├── koolclash_switch_rule.sh │ ├── koolclash_update_chn.sh │ ├── koolclash_update_ipdb.sh │ ├── koolclash_update_sub_config.sh │ ├── koolclash_update_sub_cron.sh │ ├── koolclash_update_yaml.sh │ ├── koolclash_watchdog.sh │ └── koolclash_watchdog_config.sh ├── uninstall.sh └── webs │ ├── Module_koolclash.asp │ ├── koolclash │ ├── CNAME │ ├── _headers │ ├── apple-touch-icon-precomposed.png │ ├── assets │ │ ├── Chart.min.708e0ec0.js │ │ ├── Config.38113279.js │ │ ├── Config.56241d16.js │ │ ├── Config.58870520.css │ │ ├── Config.72936d5e.js │ │ ├── Config.7bc73fad.css │ │ ├── Connections.116e606f.js │ │ ├── Connections.11a2597a.js │ │ ├── Connections.1e70ab68.css │ │ ├── Connections.5e0f762d.js │ │ ├── Connections.c7e8fa7e.css │ │ ├── Fab.33a60e0e.css │ │ ├── Fab.4a89b536.js │ │ ├── Fab.78b2c04b.js │ │ ├── Fab.a0a7e573.css │ │ ├── Fab.b64825a9.js │ │ ├── Logs.029b1e0c.css │ │ ├── Logs.0a3446ce.js │ │ ├── Logs.2ca4cbd7.js │ │ ├── Logs.d68ca431.css │ │ ├── Logs.e13d481f.js │ │ ├── Proxies.2247dbcf.js │ │ ├── Proxies.3fa3509d.css │ │ ├── Proxies.5f891988.js │ │ ├── Proxies.e1ed6325.css │ │ ├── Proxies.f41466fa.js │ │ ├── Rules.521c574f.js │ │ ├── Rules.5927d70a.js │ │ ├── Rules.72ed8383.css │ │ ├── Rules.c9171055.js │ │ ├── Rules.e03c54a8.css │ │ ├── Select.1e55eba1.css │ │ ├── Select.4987ab41.js │ │ ├── Select.9583f722.js │ │ ├── Select.9a98fc65.css │ │ ├── Select.aace7191.css │ │ ├── Select.f2dd4970.js │ │ ├── TextFitler.3d9182a0.css │ │ ├── TextFitler.8b7d1ec3.js │ │ ├── TextFitler.97029c74.js │ │ ├── TextFitler.b21c0577.css │ │ ├── TextFitler.e1325e60.js │ │ ├── chart-lib.1222a339.js │ │ ├── chart-lib.ff648d51.js │ │ ├── chevron-down.2de0fb4e.js │ │ ├── chevron-down.f5a64258.js │ │ ├── debounce.76599460.js │ │ ├── debounce.c2d20996.js │ │ ├── debounce.d080d5e1.js │ │ ├── en.fb34eaf7.js │ │ ├── index.1b77cd1e.css │ │ ├── index.27058ddf.js │ │ ├── index.31d0d1dc.js │ │ ├── index.7c09657a.js │ │ ├── index.afdc8976.js │ │ ├── index.b3e4e94f.js │ │ ├── index.c54634b9.js │ │ ├── index.d2d36d4e.css │ │ ├── index.d6596dd6.js │ │ ├── index.e157d135.css │ │ ├── index.e97a91e5.js │ │ ├── index.efbdc345.js │ │ ├── index.esm.5b55aaed.js │ │ ├── index.esm.8c5915bf.js │ │ ├── index.esm.f1f118db.js │ │ ├── inter-latin-400-normal.9ec803ce.woff │ │ ├── inter-latin-400-normal.d56fec21.woff2 │ │ ├── inter-latin-800-normal.5eea1309.woff2 │ │ ├── inter-latin-800-normal.98c540b2.woff │ │ ├── logs.7cc467a0.js │ │ ├── logs.8963bea3.js │ │ ├── logs.975cc896.js │ │ ├── open-sans-latin-400-normal.cce57747.woff2 │ │ ├── open-sans-latin-400-normal.d7410996.woff │ │ ├── open-sans-latin-700-normal.a61d6725.woff2 │ │ ├── open-sans-latin-700-normal.b1fda8d8.woff │ │ ├── play.1bfea717.js │ │ ├── play.42659ab6.js │ │ ├── roboto-mono-latin-400-normal.2dfc0e86.woff │ │ ├── roboto-mono-latin-400-normal.e1fd013a.woff2 │ │ ├── useRemainingViewPortHeight.49042856.js │ │ ├── useRemainingViewPortHeight.76d7ff5c.js │ │ ├── useRemainingViewPortHeight.91bbcf1d.js │ │ ├── vendor.3cf270b6.js │ │ └── zh.9b79b7bf.js │ ├── index.html │ ├── manifest.webmanifest │ ├── registerSW.js │ ├── sw.js │ ├── yacd-128.png │ ├── yacd-64.png │ └── yacd.ico │ └── res │ ├── icon-koolclash-bg.png │ ├── icon-koolclash.png │ ├── koolclash_.version │ ├── koolclash_base64.js │ └── koolclash_help.js ├── koolclash_version ├── local-build.sh ├── remove_restrictions ├── install.sh └── remove_restrictions.tar.gz └── version /README.md: -------------------------------------------------------------------------------- 1 |

2 | Clash 3 |
KoolClash 4 |

5 | 6 |

7 | A rule based custom proxy for Koolshare OpenWrt/LEDE x64 based on Clash. 8 |
9 | Documentation(zh-Hans) | 10 | From SukkaW | 11 | Download 12 |

13 | 14 |

15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |

31 | 32 |

33 | 34 |

35 | 36 | > KoolClash is for [Koolshare OpenWrt/LEDE x86_64](http://fw.koolcenter.com/LEDE_X64_fw867) ONLY. Use [OpenClash](https://github.com/vernesong/OpenClash/) if you are running original OpenWrt. 37 | 38 | ## Keywords 39 | 40 | - [Clash](https://github.com/Dreamacro/clash) : A multi-platform & rule-base tunnel 41 | - **[KoolClash](https://koolclash.js.org) : This project, a rule based custom proxy for [Koolshare OpenWrt/LEDE x64](https://www.koolcenter.com/) based on Clash.** 42 | 43 | ## Features 44 | 45 | - HTTP/HTTPS and SOCKS protocol 46 | - Surge like configuration 47 | - ~~GeoIP rule support~~ 48 | - ~~Support Vmess/Shadowsocks/Socks5~~ 49 | - Support for Netfilter TCP redirect 50 | - ~~Support Equipment control~~ 51 | 52 | Besides those features that Clash have, KoolClash has more: 53 | 54 | - Install clash and upload config to [Koolshare OpenWrt/LEDE X86](http://fw.koolcenter.com/LEDE_X64_fw867/) 55 | - ~~Transparent proxy for all of your devices~~ 56 | - Proxy gateway like Surge Enhanced Mode 57 | 58 | ## Installation 59 | 60 | Download latest `koolshare.tar.gz` from [GitHub Release](https://github.com/houzi-/Koolshare-Clash-hack/releases), and then upload to Koolshare OpenWrt/LEDE Soft Center as offline installation. 61 | 62 | Read the [detailed installation instructions (written in Chinese)](https://koolclash.js.org/#/install) for more details. 63 | 64 | ## Build 65 | 66 | ```bash 67 | $ git clone https://github.com/houzi-/Koolshare-Clash-hack.git 68 | $ cd Koolshare-Clash-hack 69 | $ ./build # Package installation package 70 | ``` 71 | 72 | ## Clash on Other Platforms 73 | 74 | - [Clash for Windows](https://github.com/Fndroid/clash_for_windows_pkg) : A Windows GUI based on Clash 75 | - [clashX](https://github.com/yichengchen/clashX) : A rule based custom proxy with GUI for Mac base on clash 76 | - [ClashA](https://github.com/ccg2018/ClashA) : An Android GUI for Clash 77 | - [OpenClash](https://github.com/vernesong/OpenClash) : Another Clash Client For OpenWrt 78 | 79 | ## Contributions 80 | 81 | [Report a Bug](https://github.com/houzi-/Koolshare-Clash-hack/issues/new/choose) | [Improve Documentations](https://github.com/SukkaW/Koolshare-Clash/tree/master/docs) | [Fork & Open a New PR](https://github.com/houzi-/Koolshare-Clash-hack/fork) 82 | 83 | All kinds of contributions (enhancements, new features, documentation & code improvements, issues & bugs reporting) are welcome. 84 | 85 | ## License 86 | 87 | KoolClash is released under the GPL-3.0 License - see the [LICENSE](https://github.com/houzi-/Koolshare-Clash-hack/blob/main/LICENSE) file for details. 88 | 89 | Also, this project includes [GeoLite2](https://dev.maxmind.com/geoip/geoip2/geolite2/) data created by [MaxMind](https://www.maxmind.com). 90 | 91 | ## Disclaimer 92 | 93 | KoolClash is not responsible for any loss of any user, including but not limited to Kernel Panic, device fail to boot or can not function normally, storage damage or data loss, atomic bombing, World War III, The CK-Class Restructuring Scenario that SCP Foundation can not prevent, and so on. 94 | 95 | ## Sponsors 96 | 97 | 99 | 100 | ## Maintainer 101 | 102 | **KoolClash** © [Sukka](https://github.com/SukkaW), Released under the [GPL-3.0]([./LICENSE](https://github.com/houzi-/Koolshare-Clash-hack/blob/main/LICENSE)) License.
103 | Authored and maintained by [Sukka](https://github.com/SukkaW) with help from contributors ([list](https://github.com/SukkaW/Koolshare-Clash/contributors)). 104 | 105 | > [Personal Website](https://skk.moe) · [Blog](https://blog.skk.moe) · GitHub [@SukkaW](https://github.com/SukkaW) · Telegram Channel [@SukkaChannel](https://t.me/SukkaChannel) · Twitter [@isukkaw](https://twitter.com/isukkaw) · Keybase [@sukka](https://keybase.io/sukka) 106 | 107 | **KoolClash-hack** © [houzi-](https://github.com/houzi-), Released under the [GPL-3.0]([./LICENSE](https://github.com/houzi-/Koolshare-Clash-hack/blob/main/LICENSE)) License.
108 | Hacker by [houzi-](https://github.com/houzi-) with help from contributors ([list](https://github.com/houzi-/Koolshare-Clash-hack/contributors)). 109 | -------------------------------------------------------------------------------- /adv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/adv.png -------------------------------------------------------------------------------- /backup.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # you can do something here 4 | # this shell scripts will run at the end of build.py scripts 5 | 6 | tar_name="$1.tar.gz" 7 | 8 | mkdir -p history 9 | if [ ! -f ./history/version ];then 10 | touch ./history/version 11 | fi 12 | 13 | version_old=`cat history/version | awk '{print $1}' | sort -rn |sed -n 1p` 14 | version_new=`cat config.json.js |grep "version"|cut -d"\"" -f 4` 15 | md5_old=`cat history/version | sort -nk1 | awk '{print $1}' |sed -n 1p` 16 | md5_new=` md5sum $tar_name | awk '{print $1}'` 17 | 18 | if [ -f ./$tar_name ];then 19 | if [ "$version_old" != "$version_new" ];then 20 | mkdir ./history/$version_new/ 21 | cp ./$tar_name ./history/$version_new/ 22 | echo $version_new $md5_new >> ./history/version 23 | fi 24 | fi 25 | 26 | -------------------------------------------------------------------------------- /build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # _*_ coding:utf-8 _*_ 3 | 4 | import os 5 | import json 6 | import codecs 7 | import hashlib 8 | from string import Template 9 | 10 | parent_path = os.path.dirname(os.path.realpath(__file__)) 11 | 12 | def md5sum(full_path): 13 | with open(full_path, 'rb') as rf: 14 | return hashlib.md5(rf.read()).hexdigest() 15 | 16 | def get_or_create(): 17 | conf_path = os.path.join(parent_path, "config.json.js") 18 | conf = {} 19 | if not os.path.isfile(conf_path): 20 | print u"config.json.js 文件找不到,build.py 一定得放插件根目录。自动为您生成一个config.json.js,其它信息请您自己修改。" 21 | module_name = os.path.basename(parent_path) 22 | conf["module"] = module_name 23 | conf["version"] = "0.0.1" 24 | conf["home_url"] = ("Module_%s.asp" % module_name) 25 | conf["title"] = "title of " + module_name 26 | conf["description"] = "description of " + module_name 27 | else: 28 | with codecs.open(conf_path, "r", "utf-8") as fc: 29 | conf = json.loads(fc.read()) 30 | return conf 31 | 32 | def build_module(): 33 | try: 34 | conf = get_or_create() 35 | except: 36 | print u"config.json.js 文件格式错误" 37 | traceback.print_exc() 38 | if "module" not in conf: 39 | print u"没有 module 在 config.json.js 里" 40 | return 41 | module_path = os.path.join(parent_path, conf["module"]) 42 | if not os.path.isdir(module_path): 43 | print u"找不到对应的 %s 文件夹,config.json.js 里面的 module 值不对?" % module_path 44 | return 45 | install_path = os.path.join(parent_path, conf["module"], "install.sh") 46 | if not os.path.isfile(install_path): 47 | print u"找不到对应的 %s 文件,插件确实 install.sh 文件" 48 | return 49 | print u"生成中..." 50 | t = Template("cd $parent_path && rm -f $module.tar.gz && tar -zcf $module.tar.gz $module") 51 | os.system(t.substitute({"parent_path": parent_path, "module": conf["module"]})) 52 | conf["md5"] = md5sum(os.path.join(parent_path, conf["module"] + ".tar.gz")) 53 | conf_path = os.path.join(parent_path, "config.json.js") 54 | with codecs.open(conf_path, "w", "utf-8") as fw: 55 | json.dump(conf, fw, sort_keys = True, indent = 4, ensure_ascii=False, encoding='utf8') 56 | print u"生成完成", conf["module"] + ".tar.gz" 57 | 58 | build_module() 59 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | MODULE="koolclash" 4 | VERSION=`cat ./koolclash/webs/res/koolclash_.version` 5 | TITLE=koolclash 6 | DESCRIPTION="基于规则的代理程序 Clash" 7 | HOME_URL="Module_koolclash.asp" 8 | CHANGELOG="修复BUG" 9 | 10 | # Check and include base 11 | DIR="$( cd "$( dirname "$BASH_SOURCE[0]" )" && pwd )" 12 | 13 | # now include build_base.sh 14 | . $DIR/local-build.sh 15 | 16 | # change to module directory 17 | cd $DIR 18 | 19 | # do something here 20 | 21 | #do_build_result 22 | 23 | #sh backup.sh $MODULE 24 | -------------------------------------------------------------------------------- /build_old: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | case $1 in 4 | dashboard) 5 | wget https://github.com/Dreamacro/clash-dashboard/archive/gh-pages.zip 6 | unzip gh-pages.zip 7 | rm -rf koolclash/webs/koolclash && mkdir -p koolclash/webs/koolclash 8 | cp -rf clash-dashboard-gh-pages/* koolclash/webs/koolclash 9 | rm -rf gh-pages.zip 10 | rm -rf clash-dashboard-gh-pages 11 | echo '----------------------------------------' 12 | echo 'Update to latest clash-dashboard' 13 | echo '----------------------------------------' 14 | ;; 15 | pack) 16 | mkdir -p koolclash-build/koolclash 17 | cp -rf koolclash/* koolclash-build/koolclash 18 | 19 | cd koolclash-build 20 | 21 | #upx=$(which upx) 22 | # 23 | #if [ "x$upx" != "x" ] && [ -x $upx ]; then 24 | # upx ./koolclash/bin/* 25 | #else 26 | # echo '----------------------------------------' 27 | # echo "You should install upx first!" 28 | # echo '----------------------------------------' 29 | # exit 1 30 | #fi 31 | 32 | tar zcvf ../koolclash.tar.gz koolclash 33 | cd .. 34 | 35 | mkdir -p koolclash-build/fuckkoolshare 36 | cp -rf fuckkoolshare/* koolclash-build/fuckkoolshare 37 | 38 | cd koolclash-build 39 | tar zcvf ../fuckkoolshare.tar.gz fuckkoolshare 40 | cd .. 41 | 42 | rm -rf koolclash-build 43 | 44 | echo '----------------------------------------' 45 | echo 'Build the latest version' 46 | echo '----------------------------------------' 47 | ;; 48 | ipdb) 49 | wget https://static.clash.to/GeoIP2/GeoIP2-Country.tar.gz -O ipdb.tar.gz 50 | mkdir -p geolite 51 | tar zxvf ipdb.tar.gz -C geolite 52 | chmod 644 geolite/GeoIP2-Country_*/* 53 | version=$(ls geolite | grep 'GeoIP2-Country' | sed "s|GeoIP2-Country_||g") 54 | cp -rf geolite/GeoIP2-Country_*/GeoIP2-Country.mmdb koolclash/koolclash/config/Country.mmdb 55 | rm -rf ipdb.tar.gz 56 | rm -rf geolite 57 | echo '----------------------------------------' 58 | echo "Update the ipdb to $version" 59 | echo '----------------------------------------' 60 | ;; 61 | *) 62 | echo '==================================================' 63 | echo ' KoolClash Build Tools' 64 | echo '--------------------------------------------------' 65 | echo 'Usage: build [option]' 66 | echo '' 67 | echo "dashboard\tUpdate clash-dashboard to latest" 68 | echo "ipdb\t\tUpdate GeoLite to latest" 69 | echo "pack\t\tBuild the package" 70 | echo '==================================================' 71 | ;; 72 | esac 73 | -------------------------------------------------------------------------------- /config.json.js: -------------------------------------------------------------------------------- 1 | { 2 | "module":"koolclash", 3 | "version":"0.18.4", 4 | "md5":"e434a35dbc32ae9df11a9dfd7de21fc0", 5 | "home_url":"Module_koolclash.asp", 6 | "title":"koolclash", 7 | "description":"基于规则的代理程序 Clash", 8 | "changelog":"BUG修复", 9 | "build_date":"2023-04-16_19:09:51" 10 | } 11 | -------------------------------------------------------------------------------- /koolclash.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash.tar.gz -------------------------------------------------------------------------------- /koolclash/bin/clash-linux-amd64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/bin/clash-linux-amd64 -------------------------------------------------------------------------------- /koolclash/bin/subconverter.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/bin/subconverter.tar.gz -------------------------------------------------------------------------------- /koolclash/bin/yq_linux_amd64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/bin/yq_linux_amd64 -------------------------------------------------------------------------------- /koolclash/init.d/S99koolclash.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh /etc/rc.common 2 | # 3 | # Copyright (C) 2015 OpenWrt-dist 4 | # Copyright (C) 2016 fw867 5 | # Copyright (C) 2016 sadog 6 | # Copyright (C) 2018 SukkaW 7 | # 8 | # This is free software, licensed under the GNU General Public License v3. 9 | # See /LICENSE for more information. 10 | # 11 | 12 | START=99 13 | STOP=15 14 | 15 | source /koolshare/scripts/base.sh 16 | eval $(dbus export koolclash_) 17 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 18 | 19 | start() { 20 | touch /tmp/upload/koolclash_log.txt 21 | if [ "$koolclash_enable" == "1" ]; then 22 | sh /koolshare/scripts/koolclash_control.sh start >/tmp/upload/koolclash_log.txt 23 | echo_date "KoolClash 开机启动成功" >>/tmp/upload/koolclash_log.txt 24 | echo "XU6J03M6" >>/tmp/upload/koolclash_log.txt 25 | else 26 | echo_date "KoolClash 开机没有启动" >/tmp/upload/koolclash_log.txt 27 | echo "XU6J03M6" >>/tmp/upload/koolclash_log.txt 28 | fi 29 | } 30 | 31 | stop() { 32 | touch /tmp/upload/koolclash_log.txt 33 | sh /koolshare/scripts/koolclash_control.sh stop >/tmp/upload/koolclash_log.txt 34 | echo_date "KoolClash 成功停止" >>/tmp/upload/koolclash_log.txt 35 | echo "XU6J03M6" >>/tmp/upload/koolclash_log.txt 36 | } 37 | -------------------------------------------------------------------------------- /koolclash/install.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | export KSROOT=/koolshare 3 | source $KSROOT/scripts/base.sh 4 | eval $(dbus export koolclash) 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | IPDB_VERSION="2022-08-26" 7 | CHN_VERSION="2022-08-26" 8 | 9 | # 判断路由架构和平台 10 | # Modified from koolss plugin (https://github.com/koolshare/ledesoft/blob/master/koolclash/koolss/install.sh) 11 | case $(uname -m) in 12 | armv7l) 13 | echo_date "KoolClash 插件用于 koolshare OpenWRT/LEDE x86_64 固件平台,arm 平台尚未适配!!!" 14 | echo_date "退出安装!" 15 | exit 1 16 | ;; 17 | mips) 18 | echo_date "KoolClash 插件用于 koolshare OpenWRT/LEDE x86_64 固件平台,mips 平台尚未适配!!!" 19 | echo_date "退出安装!" 20 | exit 1 21 | ;; 22 | x86_64) 23 | fw867=$(cat /etc/banner | grep fw867) 24 | if [ -d "/koolshare" ] && [ -n "$fw867" ]; then 25 | echo_date "固件平台【koolshare OpenWRT/LEDE x86_64】符合安装要求,开始安装插件!" 26 | else 27 | echo_date "KoolClash 插件用于 koolshare OpenWRT/LEDE x86_64 固件平台,其它固件未做适配!!!" 28 | echo_date "退出安装!" 29 | exit 1 30 | fi 31 | ;; 32 | *) 33 | echo_date "KoolClash 插件用于 koolshare OpenWRT/LEDE x86_64 固件平台,其它固件未做适配!!!" 34 | echo_date "退出安装!" 35 | exit 1 36 | ;; 37 | esac 38 | 39 | if [ -n "$(pidof clash)" ]; then 40 | # 停止 KoolClash 41 | koolclash_reenable_after_install=1 42 | echo_date "KoolClash: 检测到 Clash 正在运行..." 43 | echo_date "KoolClash: 停止 Clash 以更新/安装 KoolClash..." 44 | echo_date 'KoolClash:【更新 KoolClash 过程中可能会出现「软件中心异常」的提示,是正常现象!】' 45 | echo_date 'KoolClash:【请不要刷新或关闭页面,务必等待安装完成、页面自动跳转!】' 46 | sleep 4 47 | sh $KSROOT/scripts/koolclash_control.sh stop_for_install 48 | sleep 1 49 | echo_date "KoolClash: Clash 已经停止,继续更新/安装..." 50 | fi 51 | 52 | # 清理 旧文件夹 53 | echo_date "KoolClash: 清理旧版文件..." 54 | rm -rf $KSROOT/bin/clash >/dev/null 2>&1 55 | rm -rf $KSROOT/bin/subconverter >/dev/null 2>&1 56 | rm -rf $KSROOT/bin/yq >/dev/null 2>&1 57 | rm -rf $KSROOT/scripts/koolclash_* >/dev/null 2>&1 58 | rm -rf $KSROOT/init.d/S99koolclash.sh >/dev/null 2>&1 59 | find /etc/rc.d/ -name *koolclash.sh* | xargs rm -rf 60 | rm -rf $KSROOT/webs/Module_koolclash.asp >/dev/null 2>&1 61 | rm -rf $KSROOT/webs/res/icon-koolclash* >/dev/null 2>&1 62 | rm -rf $KSROOT/webs/res/koolclash_* >/dev/null 2>&1 63 | [ -f "/koolshare/webs/files/koolclash.tar.gz" ] && rm -rf /koolshare/webs/files/koolclash.tar.gz >/dev/null 2>&1 64 | 65 | # 创建相关的文件夹 66 | echo_date "KoolClash: 创建文件夹..." 67 | mkdir -p $KSROOT/koolclash/config 68 | mkdir -p $KSROOT/init.d 69 | 70 | # 复制文件 71 | cd /tmp 72 | 73 | echo_date "KoolClash: 复制安装包内的文件到路由器..." 74 | 75 | #cp -rf /tmp/koolclash/bin/* $KSROOT/bin/ 76 | cp -rf /tmp/koolclash/bin/clash-linux-amd64 $KSROOT/bin/clash 77 | cp -rf /tmp/koolclash/bin/yq_linux_amd64 $KSROOT/bin/yq 78 | tar -zxf /tmp/koolclash/bin/subconverter.tar.gz -C $KSROOT/bin 79 | cp -rf /tmp/koolclash/scripts/* $KSROOT/scripts/ 80 | cp -rf /tmp/koolclash/init.d/* $KSROOT/init.d/ 81 | cp -rf /tmp/koolclash/webs/* $KSROOT/webs/ 82 | cp /tmp/koolclash/install.sh $KSROOT/scripts/koolclash_install.sh 83 | cp /tmp/koolclash/uninstall.sh $KSROOT/scripts/uninstall_koolclash.sh 84 | 85 | if [ ! -f $KSROOT/koolclash/config/Country.mmdb ]; then 86 | cp -rf /tmp/koolclash/koolclash/config/Country.mmdb $KSROOT/koolclash/config/Country.mmdb 87 | cp -rf /tmp/koolclash/koolclash/config/GeoSite.dat $KSROOT/koolclash/config/GeoSite.dat 88 | cp -rf /tmp/koolclash/koolclash/config/dns.yml $KSROOT/koolclash/config/dns.yml 89 | cp -rf /tmp/koolclash/koolclash/config/china_ip_route.ipset $KSROOT/koolclash/config/china_ip_route.ipset 90 | cp -rf /tmp/koolclash/koolclash/config/profile.yml $KSROOT/koolclash/config/profile.yml 91 | dbus set koolclash_ipdb_version=$IPDB_VERSION 92 | dbus set koolclash_chn_version=$IPDB_VERSION 93 | fi 94 | 95 | # 删除 Luci 缓存 96 | rm -rf /tmp/luci-* 97 | 98 | # 为新安装文件赋予执行权限... 99 | echo_date "KoolClash: 设置可执行权限" 100 | chmod 755 $KSROOT/bin/* 101 | chmod 755 $KSROOT/bin/subconverter/* 102 | chmod 755 $KSROOT/scripts/koolclash_* 103 | chmod 755 $KSROOT/init.d/S99koolclash.sh 104 | 105 | local_version=$(cat $KSROOT/webs/res/koolclash_.version) 106 | echo_date "KoolClash: 设置版本号为 $local_version..." 107 | dbus set koolclash_version=$local_version 108 | dbus set koolclash_return_chnip=0 109 | dbus set koolclash_acl_list="undefined" 110 | dbus set koolclash_firewall_default_mode=1 111 | dbus set koolclash_firewall_default_port_mode="all" 112 | dbus set koolclash_acl_mode=1 113 | #echo_date "KoolClash: 设置代理模式为 规则模式..." 114 | #dbus set koolclash_switch_config_mode=1 115 | #echo_date "KoolClash: 设置运行模式为 Fake-IP(增强)..." 116 | #dbus set koolclash_switch_run_mode=1 117 | 118 | sleep 1 119 | 120 | echo_date "KoolClash: 删除相关安装包..." 121 | rm -rf /tmp/koolclash* >/dev/null 2>&1 122 | 123 | echo_date "KoolClash: 设置插件信息..." 124 | 125 | dbus set softcenter_module_koolclash_description="基于规则的代理程序 Clash" 126 | dbus set softcenter_module_koolclash_install=1 127 | dbus set softcenter_module_koolclash_name=koolclash 128 | dbus set softcenter_module_koolclash_title=koolclash 129 | dbus set softcenter_module_koolclash_version=$local_version 130 | 131 | # 防火墙默认模式 132 | #[ -z $koolclash_firewall_default_mode ] && dbus set koolclash_firewall_default_mode=1 133 | # 防火墙默认端口模式 134 | #[ -z $koolclash_firewall_default_port_mode ] && dbus set koolclash_firewall_default_port_mode=all 135 | # 看门狗默认禁用 136 | [ -z $koolclash_watchdog_enable ] && dbus set koolclash_watchdog_enable=0 137 | 138 | sleep 1 139 | 140 | if [ "$koolclash_reenable_after_install" == "1" ]; then 141 | echo_date 'KoolClash: 重启 Clash...' 142 | sleep 2 143 | sh $KSROOT/scripts/koolclash_control.sh start_after_install 144 | sleep 1 145 | echo_date 'KoolClash: Clash 重启完成...' 146 | fi 147 | 148 | echo_date "KoolClash: 插件安装完成..." 149 | 150 | dbus remove koolclash_reenable_after_install 151 | -------------------------------------------------------------------------------- /koolclash/koolclash/config/Country.mmdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/koolclash/config/Country.mmdb -------------------------------------------------------------------------------- /koolclash/koolclash/config/GeoSite.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/koolclash/config/GeoSite.dat -------------------------------------------------------------------------------- /koolclash/koolclash/config/dns.yml: -------------------------------------------------------------------------------- 1 | dns: 2 | enable: true 3 | ipv6: false 4 | listen: 0.0.0.0:23453 5 | enhanced-mode: fake-ip 6 | default-nameserver: 7 | - 119.29.29.29 8 | - 119.28.28.28 9 | - 1.0.0.1 10 | - 208.67.222.222 11 | - 1.2.4.8 12 | - 202.100.199.8 13 | - 202.100.192.68 14 | - 114.114.114.114 15 | nameserver: 16 | - 202.100.199.8 17 | - 202.100.192.68 18 | - 114.114.114.114 19 | - 119.29.29.29 20 | - https://doh.pub/dns-query 21 | - https://dns.alidns.com/dns-query 22 | fake-ip-range: 198.18.0.1/16 23 | fallback: 24 | - https://dns.cloudflare.com/dns-query 25 | - https://public.dns.iij.jp/dns-query 26 | - https://jp.tiar.app/dns-query 27 | - https://jp.tiarap.org/dns-query 28 | - tls://dot.tiar.app 29 | fake-ip-filter: 30 | - "+.*" 31 | -------------------------------------------------------------------------------- /koolclash/koolclash/config/profile.yml: -------------------------------------------------------------------------------- 1 | profile: 2 | store-selected: false 3 | store-fake-ip: true -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_acl_mode.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | dbus set koolclash_acl_mode=$2 9 | 10 | http_response "ok" 11 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_check_yaml.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | BOM=$(grep -I -r -l $'\xEF\xBB\xBF' $KSROOT/koolclash/config/origin.yml) 9 | if [ -n "$BOM" ]; then 10 | sed -i $'s/\xef\xbb\xbf//' $KSROOT/koolclash/config/origin.yml 11 | fi 12 | 13 | para1=$(sed -n '/^port:/p' $KSROOT/koolclash/config/origin.yml) 14 | para1_1=$(sed -n '/^mixed-port:/p' $KSROOT/koolclash/config/origin.yml) 15 | if [ -n "$para1_1" ] ; then 16 | sed -i 's/^mixed-port:/port:/g' $KSROOT/koolclash/config/origin.yml 17 | fi 18 | 19 | proxies_line=$(cat $KSROOT/koolclash/config/origin.yml | grep -n "^proxies:" | awk -F ":" '{print $1}') 20 | port_line=$(cat $KSROOT/koolclash/config/origin.yml | grep -n "^port:" | awk -F ":" '{print $1}' | head -1) 21 | 22 | if [ -z "$port_line" ] ; then 23 | return 0 24 | fi 25 | if [ -z "$proxies_line" ]; then 26 | return 0 27 | fi 28 | if [ -z "$para1" ] && [ -z "$para1_1" ]; then 29 | return 0 30 | else 31 | return 1 32 | fi -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | eval $(dbus export koolclash_) 6 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 7 | 8 | get_acl_para() { 9 | echo `dbus get koolclash_acl_list | sed 's/>/\n/g' | sed '/^$/d' | awk NR==$1{print} | cut -d "<" -f "$2"` 10 | } 11 | 12 | factor() { 13 | if [ -z "$1" ] || [ -z "$2" ]; then 14 | echo "" 15 | else 16 | echo "$2 $1" 17 | fi 18 | } 19 | 20 | clear_ipset() { 21 | if [ -n "$(ipset -L | grep -E "koolclash_white_ac_ips|koolclash_white_ac_macs")" ]; then 22 | ipset -F koolclash_white_ac_ips >/dev/null 2>&1 23 | ipset -F koolclash_white_ac_macs >/dev/null 2>&1 24 | fi 25 | if [ -n "$(ipset -L | grep -E "koolclash_black_ac_ips|koolclash_black_ac_macs")" ]; then 26 | ipset -F koolclash_black_ac_ips >/dev/null 2>&1 27 | ipset -F koolclash_black_ac_macs >/dev/null 2>&1 28 | fi 29 | } 30 | 31 | creat_ipset() { 32 | if [ ! -n "$(ipset -L | grep -E "koolclash_white_ac_ips|koolclash_white_ac_macs")" ]; then 33 | ipset create koolclash_white_ac_ips hash:net >/dev/null 2>&1 34 | ipset create koolclash_white_ac_macs hash:mac >/dev/null 2>&1 35 | fi 36 | if [ ! -n "$(ipset -L | grep -E "koolclash_black_ac_ips|koolclash_black_ac_macs")" ]; then 37 | ipset create koolclash_black_ac_ips hash:net >/dev/null 2>&1 38 | ipset create koolclash_black_ac_macs hash:mac >/dev/null 2>&1 39 | fi 40 | } 41 | 42 | creat_iptables() { 43 | if [ ! -n "$(iptables -t nat -S koolclash | grep -E "koolclash_white_ac_ips|koolclash_white_ac_macs")" ]; then 44 | [ "$koolclash_acl_mode" == 1 ] && iptables -t nat -A koolclash -m set --match-set koolclash_white_ac_ips dst -j RETURN >/dev/null 2>&1 45 | [ "$koolclash_acl_mode" == 2 ] && iptables -t nat -A koolclash -m set --match-set koolclash_white_ac_macs dst -j RETURN >/dev/null 2>&1 46 | fi 47 | if [ ! -n "$(iptables -t nat -S koolclash | grep -E "koolclash_black_ac_ips|koolclash_black_ac_macs")" ]; then 48 | [ "$koolclash_acl_mode" == 1 ] && iptables -t nat -A koolclash -m set ! --match-set koolclash_black_ac_ips dst -j RETURN >/dev/null 2>&1 49 | [ "$koolclash_acl_mode" == 2 ] && iptables -t nat -A koolclash -m set ! --match-set koolclash_black_ac_macs dst -j RETURN >/dev/null 2>&1 50 | fi 51 | if [ ! -n "$(iptables -t nat -S koolclash_output | grep -E "koolclash_white_ac_ips|koolclash_white_ac_macs")" ]; then 52 | [ "$koolclash_acl_mode" == 1 ] && iptables -t nat -A koolclash_output -m set --match-set koolclash_white_ac_ips dst -j RETURN >/dev/null 2>&1 53 | [ "$koolclash_acl_mode" == 2 ] && iptables -t nat -A koolclash_output -m set --match-set koolclash_white_ac_macs dst -j RETURN >/dev/null 2>&1 54 | fi 55 | if [ ! -n "$(iptables -t nat -S koolclash_output | grep -E "koolclash_black_ac_ips|koolclash_black_ac_macs")" ]; then 56 | [ "$koolclash_acl_mode" == 1 ] && iptables -t nat -A koolclash_output -m set ! --match-set koolclash_black_ac_ips dst -j RETURN >/dev/null 2>&1 57 | [ "$koolclash_acl_mode" == 2 ] && iptables -t nat -A koolclash_output -m set ! --match-set koolclash_black_ac_macs dst -j RETURN >/dev/null 2>&1 58 | fi 59 | if [ ! -n "$(iptables -t mangle -S koolclash | grep -E "koolclash_white_ac_ips|koolclash_white_ac_macs")" ]; then 60 | [ "$koolclash_acl_mode" == 1 ] && iptables -t mangle -A koolclash -m set --match-set koolclash_white_ac_ips dst -j RETURN >/dev/null 2>&1 61 | [ "$koolclash_acl_mode" == 2 ] && iptables -t mangle -A koolclash -m set --match-set koolclash_white_ac_macs dst -j RETURN >/dev/null 2>&1 62 | fi 63 | if [ ! -n "$(iptables -t mangle -S koolclash | grep -E "koolclash_black_ac_ips|koolclash_black_ac_macs")" ]; then 64 | [ "$koolclash_acl_mode" == 1 ] && iptables -t mangle -A koolclash -m set ! --match-set koolclash_black_ac_ips dst -j RETURN >/dev/null 2>&1 65 | [ "$koolclash_acl_mode" == 2 ] && iptables -t mangle -A koolclash -m set ! --match-set koolclash_black_ac_macs dst -j RETURN >/dev/null 2>&1 66 | fi 67 | } 68 | 69 | lan_acess_control(){ 70 | # lan access control 71 | acl_nu=`dbus get koolclash_acl_list | sed 's/>/\n/g' | sed '/^$/d' | sed '/^ /d' | wc -l` 72 | if [ -n "$acl_nu" ]; then 73 | min="1" 74 | max="$acl_nu" 75 | while [ $min -le $max ] 76 | do 77 | proxy_name=`get_acl_para $min 1` 78 | ipaddr=`get_acl_para $min 2` 79 | mac=`get_acl_para $min 3` 80 | proxy_mode=`get_acl_para $min 4` 81 | 82 | if [ -n "$ipaddr" ]; then 83 | [ "$proxy_mode" == 0 ] && ipset add koolclash_white_ac_ips $ipaddr 84 | [ "$proxy_mode" == 1 ] && ipset add koolclash_black_ac_ips $ipaddr 85 | fi 86 | if [ -n "$mac" ]; then 87 | [ "$proxy_mode" == 0 ] && ipset add koolclash_white_ac_macs $mac 88 | [ "$proxy_mode" == 1 ] && ipset add koolclash_black_ac_macs $mac 89 | fi 90 | min=`expr $min + 1` 91 | done 92 | fi 93 | } 94 | 95 | case $1 in 96 | acl) 97 | if [ "$koolclash_enable" == "1" ]; then 98 | if [ -n "$koolclash_acl_list" ]; then 99 | clear_ipset 100 | creat_ipset 101 | #creat_iptables 102 | lan_acess_control 103 | else 104 | : 105 | fi 106 | else 107 | clear_ipset 108 | fi 109 | ;; 110 | esac 111 | 112 | case $2 in 113 | acl) 114 | if [ "$koolclash_enable" == "1" ]; then 115 | if [ -n "$koolclash_acl_list" ]; then 116 | clear_ipset 117 | creat_ipset 118 | #creat_iptables 119 | lan_acess_control 120 | http_response 'success' 121 | else 122 | : 123 | fi 124 | else 125 | clear_ipset 126 | http_response 'success' 127 | fi 128 | ;; 129 | esac 130 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | eval $(dbus export koolclash_) 8 | 9 | lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address') 10 | #wan_ip=$(ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') 11 | koolshare_version=$(cat /etc/banner | grep Openwrt) 12 | 13 | clash_version=$($KSROOT/bin/clash -v) 14 | 15 | fallbackdns=$(cat $KSROOT/koolclash/config/dns.yml | base64 | xargs) 16 | 17 | if [ ! -f $KSROOT/koolclash/config/config.yaml ]; then 18 | clash_allow_lan='' 19 | clash_ext_controller='' 20 | clash_redir='' 21 | clash_mode='' 22 | clash_dns_enable='' 23 | clash_dns_ipv6='' 24 | clash_dns_mode='' 25 | clash_dns_listen='' 26 | else 27 | clash_allow_lan=$(yq r /koolshare/koolclash/config/config.yaml allow-lan) 28 | clash_ext_controller=$(yq r /koolshare/koolclash/config/config.yaml external-controller) 29 | clash_redir=$(yq r /koolshare/koolclash/config/config.yaml redir-port) 30 | clash_mode=$(yq r /koolshare/koolclash/config/config.yaml mode) 31 | clash_dns_enable=$(yq r /koolshare/koolclash/config/config.yaml dns.enable) 32 | clash_dns_ipv6=$(yq r /koolshare/koolclash/config/config.yaml dns.ipv6) 33 | clash_dns_mode=$(yq r /koolshare/koolclash/config/config.yaml dns.enhanced-mode) 34 | clash_dns_listen=$(yq r /koolshare/koolclash/config/config.yaml dns.listen) 35 | fi 36 | 37 | iptables_mangle=$(iptables -nvL PREROUTING -t mangle | sed 1,2d | grep 'clash' | base64 | base64 | xargs) 38 | iptables_nat=$(iptables -nvL PREROUTING -t nat | sed 1,2d | grep 'clash' | base64 | base64 | xargs) 39 | iptables_mangle_clash=$(iptables -nvL koolclash -t mangle | sed 1,2d | base64 | base64 | xargs) 40 | iptables_nat_clash=$(iptables -nvL koolclash -t nat | sed 1,2d | base64 | base64 | xargs) 41 | iptables_mangle_clash_dns=$(iptables -nvL OUTPUT -t nat | sed 1,2d | base64 | base64 | xargs) 42 | iptables_nat_clash_dns=$(iptables -nvL koolclash_output -t nat | sed 1,2d | base64 | base64 | xargs) 43 | 44 | white_ip=$(ipset list koolclash_white | base64 | xargs) 45 | 46 | ipset_list=$(ipset list | grep "Name:" | grep "koolclash" | base64 | xargs) 47 | 48 | chromecast_nu=$(iptables -t nat -L PREROUTING -v -n --line-numbers | grep "dpt:53" | base64 | xargs) 49 | 50 | clash_process=$(ps | grep clash | grep -v grep | base64 | xargs) 51 | 52 | clash_config_dir=$(ls -lh /koolshare/koolclash/config | base64 | xargs) 53 | 54 | http_response "{ \\\"lan_ip\\\": \\\"${lan_ip}\\\", \\\"koolshare_version\\\": \\\"$koolshare_version\\\", \\\"clash_allow_lan\\\": \\\"$clash_allow_lan\\\", \\\"clash_ext_controller\\\": \\\"$clash_ext_controller\\\", \\\"clash_dns_enable\\\": \\\"$clash_dns_enable\\\", \\\"clash_dns_ipv6\\\": \\\"$clash_dns_ipv6\\\", \\\"clash_dns_mode\\\": \\\"$clash_dns_mode\\\", \\\"clash_dns_listen\\\": \\\"$clash_dns_listen\\\", \\\"fallbackdns\\\": \\\"$fallbackdns\\\", \\\"iptables_mangle\\\": \\\"$iptables_mangle\\\", \\\"iptables_nat\\\": \\\"$iptables_nat\\\", \\\"iptables_mangle_clash\\\": \\\"$iptables_mangle_clash\\\", \\\"iptables_nat_clash\\\": \\\"$iptables_nat_clash\\\", \\\"iptables_mangle_clash_dns\\\": \\\"$iptables_mangle_clash_dns\\\", \\\"iptables_nat_clash_dns\\\": \\\"$iptables_nat_clash_dns\\\", \\\"clash_redir\\\": \\\"$clash_redir\\\", \\\"clash_mode\\\": \\\"$clash_mode\\\", \\\"firewall_white_ip\\\": \\\"$white_ip\\\", \\\"firewall_ipset_list\\\": \\\"$ipset_list\\\", \\\"chromecast_nu\\\": \\\"$chromecast_nu\\\", \\\"clash_process\\\": \\\"$clash_process\\\", \\\"clash_config_dir\\\": \\\"$clash_config_dir\\\", \\\"clash_version\\\": \\\"$clash_version\\\"}" 55 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_download_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | eval $(dbus export koolclash_) 8 | 9 | 10 | # 检测是否能够读取面板上传的 Clash 11 | if [ -f $KSROOT/koolclash/config/config.yaml ]; then 12 | echo_date "开始导出Clash配置!" >>/tmp/upload/koolclash_log.txt 13 | rm -rf $KSROOT/webs/files/config.yaml 14 | # 将clash配置文件复制到 files 目录中 15 | cp $KSROOT/koolclash/config/config.yaml $KSROOT/webs/files/config.yaml 16 | echo_date "Clash 配置导出成功!" >>/tmp/upload/koolclash_log.txt 17 | http_response 'success' 18 | else 19 | echo_date "没有找到Clash配置文件!退出!" >>/tmp/upload/koolclash_log.txt 20 | http_response 'notfound' 21 | exit 1 22 | fi 23 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_firewall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | # From Koolshare DMZ Plugin 8 | lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address') 9 | wan_ip=$(ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') 10 | 11 | case $2 in 12 | white) 13 | dbus set koolclash_firewall_whiteip_base64=$3 14 | http_response 'ok' 15 | ;; 16 | white-domain) 17 | dbus set koolclash_firewall_whitedomain_base64=$3 18 | http_response 'ok' 19 | ;; 20 | black) 21 | dbus set koolclash_firewall_blackip_base64=$3 22 | dbus set koolclash_firewall_blackip_enable=1 23 | http_response 'ok' 24 | ;; 25 | black-domain) 26 | dbus set koolclash_firewall_blackdomain_base64=$3 27 | dbus set koolclash_firewall_blackdomain_enable=1 28 | http_response 'ok' 29 | ;; 30 | default) 31 | # 0 不通过 Clash; 1 通过 Clash 32 | dbus set koolclash_firewall_default_mode=$3 33 | # ['80443', '80,443'], 34 | # ['1', '常用端口'], 35 | # ['all', '全部端口'], 36 | # ['0', '自定义端口'] 37 | dbus set koolclash_firewall_default_port_mode=$4 38 | # ['off', '关闭'], 39 | # ['80443', '80,443'], 40 | # ['1', '常用端口'], 41 | # ['0', '自定义端口'] 42 | dbus set koolclash_firewall_base_port_mode=$5 43 | dbus set koolclash_firewall_default_port_user=$6 44 | http_response 'ok' 45 | ;; 46 | esac 47 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_flow_status.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | curl=$(which curl) 9 | $curl -I -k -s --user-agent "Clash" $koolclash_subconverter_url | grep -i "Subscription-Userinfo:" > /tmp/header.txt 10 | 11 | if [ "$koolclash_update_mode" == "2" ]; then 12 | if grep -i 'Subscription-Userinfo:' /tmp/header.txt >/dev/null 2>&1 13 | then 14 | total=$(cat /tmp/header.txt | awk '{printf $4}' | sed -e 's/total=//g' -e 's/;//g') 15 | down=$(cat /tmp/header.txt | awk '{printf $3}' | sed -e 's/download=//g' -e 's/;//g') 16 | up=$(cat /tmp/header.txt | awk '{printf $2}' | sed -e 's/upload=//g' -e 's/;//g') 17 | time=$(cat /tmp/header.txt | awk '{printf $5}' | sed -e 's/expire=//g' -e 's/;//g') 18 | use_all=$(expr $down + $up) 19 | val_1=$(expr $total / 1073741824) 20 | val_2=$(expr $use_all / 1073741824) 21 | TOTAL=$(echo $val_1) 22 | USED=$(echo $val_2) 23 | expiration_time=$(date -d @$time '+%Y-%m-%d') 24 | if [ -z "$expiration_time" ]; then 25 | dbus set koolclash_sub_expiration_time="无限制" 26 | else 27 | dbus set koolclash_sub_expiration_time="$expiration_time" 28 | fi 29 | dbus set koolclash_sub_information="show" 30 | http_response "$TOTAL>$USED" 31 | else 32 | dbus set koolclash_sub_information="hide" 33 | fi 34 | else 35 | dbus set koolclash_sub_information="hide" 36 | fi -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_getarp.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | #arp=`arp | grep br-lan | grep -v ? |sed 's// /g'| sed 's/ (/#g'` 6 | #arp=`arp -i br-lan | grep 192. | sed 's/?/unknown-device.lan/g' | grep -v '' | sed 's/ (/#g'` 7 | arp_scan=$(which arp-scan) 8 | $arp_scan --interface=br-lan -l | grep "(Unknown" | sed 's/(Unknown.*/(Unknown)/' > /tmp/list.txt 9 | 10 | arp=$(cat /tmp/list.txt | awk '{$3 = $2; print $0}' | awk '{$2 = $1; print $0}' | sed 's/ /#g') 11 | 12 | if [ -n "$arp" ]; then 13 | dbus set koolclash_arp="$arp" 14 | else 15 | dbus set koolclash_arp="undefined" 16 | fi 17 | 18 | http_response "$arp" 19 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_node_memory.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | dbus set koolclash_node_memory_enable=$2 9 | 10 | http_response "ok" 11 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_return_chnip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | source $KSROOT/bin/helper.sh 6 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 7 | eval $(dbus export koolclash_) 8 | 9 | 10 | return_ip_off() { 11 | if [ "$koolclash_return_chnip" == "1" ]; then 12 | dbus set koolclash_return_chnip=0 13 | iptables -t nat -D koolclash -m set --match-set koolclash_chn_white dst -j RETURN >/dev/null 2>&1 14 | iptables -t nat -D koolclash_output -m set --match-set koolclash_chn_white dst -j RETURN >/dev/null 2>&1 15 | iptables -t mangle -D koolclash -m set --match-set koolclash_chn_white dst -j RETURN >/dev/null 2>&1 16 | http_response "chnip_off" 17 | fi 18 | } 19 | 20 | return_ip_on() { 21 | if [ "$koolclash_return_chnip" == "0" ]; then 22 | dbus set koolclash_return_chnip=1 23 | #koolclash_return iptables_nat 24 | koolclash_nu=$(iptables -nvL koolclash -t nat | sed 1,2d | sed -n '/koolclash_white dst/=');let koolclash_nu+=1 25 | [ "$(iptables -t nat -C koolclash -m set --match-set koolclash_chn_white dst -j RETURN >/dev/null 2>&1;echo $?)" == "1" ] && \ 26 | iptables -t nat -I koolclash $koolclash_nu -m set --match-set koolclash_chn_white dst -j RETURN 27 | #koolclash_output_return iptables_nat 28 | koolclash_output_nu=$(iptables -nvL koolclash_output -t nat | sed 1,2d | sed -n '/koolclash_white dst/=');let koolclash_output_nu+=1 29 | [ "$(iptables -t nat -C koolclash_output -m set --match-set koolclash_chn_white dst -j RETURN >/dev/null 2>&1;echo $?)" == "1" ] && \ 30 | iptables -t nat -I koolclash_output $koolclash_output_nu -m set --match-set koolclash_chn_white dst -j RETURN 31 | #koolclash_return iptables_mangle 32 | koolclash_mangle_nu=$(iptables -nvL koolclash -t mangle | sed 1,2d | sed -n '/koolclash_white dst/=');let koolclash_mangle_nu+=1 33 | [ "$(iptables -t mangle -C koolclash -m set --match-set koolclash_chn_white dst -j RETURN >/dev/null 2>&1;echo $?)" == "1" ] && \ 34 | iptables -t mangle -I koolclash $koolclash_mangle_nu -m set --match-set koolclash_chn_white dst -j RETURN 35 | http_response "chnip_on" 36 | fi 37 | } 38 | 39 | return_ip_off 40 | return_ip_on -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_save_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | eval $(dbus export koolclash_) 8 | 9 | # 从 DMZ 插件抄来的获取 LAN/WAN IP 10 | lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address') 11 | wan_ip=$(ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') 12 | # fallback dns 13 | fallbackdns=$(cat $KSROOT/koolclash/config/dns.yml) 14 | 15 | # 检测是否能够读取面板上传的 Clash 16 | if [ "$(cat /tmp/upload/clash.config.yaml)" == "undefined" ]; then 17 | echo_date "没有找到上传的配置文件!退出!" 18 | http_response 'notfound' 19 | exit 1 20 | else 21 | echo_date "开始上传配置!" 22 | mkdir -p $KSROOT/koolclash/config/ 23 | # 将上传的文件复制到 Config 目录中 24 | cp /tmp/upload/clash.config.yaml $KSROOT/koolclash/config/origin.yml 25 | sub_time=$(date +%Y-%m-%d\ %X) 26 | dbus set koolclash_config_version="$sub_time" 27 | fi 28 | # 删除 tmp 目录中上传的配置文件 29 | rm -rf /tmp/upload/clash.config.yaml 30 | 31 | sed -i '/^\-\-\-$/ d' $KSROOT/koolclash/config/origin.yml 32 | sed -i '/^\.\.\.$/ d' $KSROOT/koolclash/config/origin.yml 33 | 34 | echo_date "设置 redir-port 和 allow-lan 属性" 35 | # 覆盖配置文件中的 redir-port 和 allow-lan 的配置 36 | yq w -i $KSROOT/koolclash/config/origin.yml redir-port 23456 37 | yq w -i $KSROOT/koolclash/config/origin.yml allow-lan true 38 | 39 | # Change proxy mode 40 | if [ "$koolclash_switch_config_mode" == "1" ]; then 41 | yq w -i $KSROOT/koolclash/config/origin.yml mode "Rule" 42 | elif [ "$koolclash_switch_config_mode" == "2" ]; then 43 | yq w -i $KSROOT/koolclash/config/origin.yml mode "Global" 44 | elif [ "$koolclash_switch_config_mode" == "3" ]; then 45 | yq w -i $KSROOT/koolclash/config/origin.yml mode "Direct" 46 | fi 47 | 48 | # 如果没有外部监听控制就使用 LAN IP:6170 49 | if [ ! -n "$koolclash_api_host" ]; then 50 | dbus remove koolclash_api_host 51 | ext_control_ip=$lan_ip 52 | else 53 | ext_control_ip=$koolclash_api_host 54 | fi 55 | 56 | yq w -i $KSROOT/koolclash/config/origin.yml external-controller "$ext_control_ip:6170" 57 | # 启用 external-ui 58 | yq w -i $KSROOT/koolclash/config/origin.yml external-ui "/koolshare/webs/koolclash/" 59 | # 设置 secret 60 | yq w -i $KSROOT/koolclash/config/origin.yml secret "clash" 61 | 62 | cp $KSROOT/koolclash/config/origin.yml $KSROOT/koolclash/config/config.yaml 63 | 64 | #--------------------------------------------------------------------- 65 | # 强制覆盖 DNS、Fake-IP 的设置 66 | 67 | overwrite_dns_config() { 68 | # 确保启用 DNS 69 | yq w -i $KSROOT/koolclash/config/config.yaml dns.enable "true" 70 | # 修改端口 71 | yq w -i $KSROOT/koolclash/config/config.yaml dns.listen "0.0.0.0:23453" 72 | # 修改模式 73 | yq w -i $KSROOT/koolclash/config/config.yaml dns.enhanced-mode "fake-ip" 74 | # Fake IP Range 75 | yq w -i $KSROOT/koolclash/config/config.yaml dns.fake-ip-range "198.18.0.1/16" 76 | } 77 | #--------------------------------------------------------------------- 78 | 79 | # 判断是否存在 DNS 字段、DNS 是否启用、DNS 是否使用 redir-host / fake-ip 模式 80 | if [ $(yq r $KSROOT/koolclash/config/config.yaml dns.enable) == 'true' ] && [[ $(yq r $KSROOT/koolclash/config/config.yaml dns.enhanced-mode) == 'fake-ip' || $(yq r $KSROOT/koolclash/config/config.yaml dns.enhanced-mode) == 'redir-host' ]]; then 81 | if [ "$koolclash_dnsmode" == "2" ] && [ -n "$fallbackdns" ]; then 82 | # dnsmode 是 2 应该用自定义 DNS 配置进行覆盖 83 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 84 | yq d -i $KSROOT/koolclash/config/config.yaml dns 85 | 86 | echo_date "将提交的自定义 DNS 设置覆盖 Clash 配置文件..." 87 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 88 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 89 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/profile.yml 90 | 91 | dbus set koolclash_dnsmode=2 92 | else 93 | # 可能 dnsmode 是 2 但是没有自定义 DNS 配置;或者本来之前就是 1 94 | dbus set koolclash_dnsmode=1 95 | fi 96 | 97 | overwrite_dns_config 98 | echo_date "Clash 配置文件上传成功!" 99 | http_response 'success' 100 | else 101 | echo_date "在 Clash 配置文件中没有找到 DNS 配置!" 102 | if [ ! -n "$fallbackdns" ]; then 103 | echo_date "没有找到后备 DNS 配置!请前往「配置文件」提交后备 DNS 配置!" 104 | # 设置 DNS Mode 为 3 105 | dbus set koolclash_dnsmode=3 106 | http_response 'nofallbackdns' 107 | else 108 | echo_date "找到后备 DNS 配置!合并到 Clash 配置文件中..." 109 | 110 | dbus set koolclash_dnsmode=4 111 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 112 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 113 | yq d -i $KSROOT/koolclash/config/config.yaml dns 114 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 115 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/profile.yml 116 | 117 | overwrite_dns_config 118 | 119 | echo_date "Clash 配置文件上传成功!" 120 | http_response 'success' 121 | fi 122 | fi 123 | 124 | [ ! -z "$koolclash_firewall_blackip_base64" ] && dbus set koolclash_firewall_blackip_enable=1 125 | [ ! -z "$koolclash_firewall_blackdomain_base64" ] && dbus set koolclash_firewall_blackdomain_enable=1 -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_save_control.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | source $KSROOT/bin/helper.sh 6 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 7 | eval $(dbus export koolclash_) 8 | 9 | lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address') 10 | wan_ip=$(ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') 11 | 12 | if [ ! -n "$2" ]; then 13 | dbus remove koolclash_api_host 14 | ext_control_ip=$lan_ip 15 | else 16 | dbus set koolclash_api_host=$2 17 | ext_control_ip=$2 18 | fi 19 | 20 | yq w -i $KSROOT/koolclash/config/config.yaml external-controller "$ext_control_ip:6170" 21 | 22 | http_response "$external_controller@$secret" 23 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_save_dns_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | #--------------------------------------------------------------------- 9 | # 强制覆盖 DNS、Fake-IP 的设置 10 | 11 | overwrite_dns_config() { 12 | # 启用 external-ui 13 | yq w -i $KSROOT/koolclash/config/config.yaml external-ui "/koolshare/webs/koolclash/" 14 | # 确保启用 DNS 15 | yq w -i $KSROOT/koolclash/config/config.yaml dns.enable "true" 16 | # 修改端口 17 | yq w -i $KSROOT/koolclash/config/config.yaml dns.listen "0.0.0.0:23453" 18 | # 修改模式 19 | yq w -i $KSROOT/koolclash/config/config.yaml dns.enhanced-mode "fake-ip" 20 | # Fake IP Range 21 | yq w -i $KSROOT/koolclash/config/config.yaml dns.fake-ip-range "198.18.0.1/16" 22 | } 23 | #--------------------------------------------------------------------- 24 | 25 | touch $KSROOT/koolclash/config/dns.yml 26 | 27 | echo $2 | base64 -d | tee $KSROOT/koolclash/config/dns.yml 28 | 29 | fallbackdns=$(cat $KSROOT/koolclash/config/dns.yml) 30 | 31 | rm -rf $KSROOT/koolclash/config/config.yaml 32 | cp $KSROOT/koolclash/config/origin.yml $KSROOT/koolclash/config/config.yaml 33 | 34 | if [ "$koolclash_dnsmode" == "1" ] && [ "$3" == "1" ]; then 35 | # Clash 配置文件存在且 DNS 配置合法,不显示 DNS 配置输入,此时 dnsmode 为 1 36 | # 但是用户想要用自己的 DNS 配置覆盖 37 | if [ ! -n "$fallbackdns" ]; then 38 | # 你不是想覆盖 DNS 配置么怎么提交个空的上来? 39 | echo_date "没有找到自定义 DNS 配置!请前往「配置文件」提交 DNS 配置!" 40 | http_response 'nofallbackdns' 41 | else 42 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 43 | yq d -i $KSROOT/koolclash/config/config.yaml dns 44 | 45 | echo_date "将提交的自定义 DNS 设置覆盖 Clash 配置文件..." 46 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 47 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 48 | 49 | overwrite_dns_config 50 | # 强制生效 DNS 配置,修改 dnsmode 为 2 51 | dbus set koolclash_dnsmode=2 52 | echo_date "后备 DNS 设置提交成功!" 53 | http_response 'success' 54 | fi 55 | elif [ "$koolclash_dnsmode" == "2" ] && [ "$3" == "0" ]; then 56 | # 用户已经要用自己的 DNS 配置覆盖,dnsmode 为 2 57 | # 但是取消勾选了 DNS 配置文件的勾,是想要还原原始 Clash 配置文件 58 | rm -rf $KSROOT/koolclash/config/config.yaml 59 | cp $KSROOT/koolclash/config/origin.yml $KSROOT/koolclash/config/config.yaml 60 | overwrite_dns_config 61 | dbus set koolclash_dnsmode=1 62 | echo_date "自定义 DNS 设置提交成功!" 63 | http_response 'success' 64 | elif [ "$koolclash_dnsmode" == "2" ] && [ "$3" == "1" ]; then 65 | # 用户已经要用自己的 DNS 配置覆盖,dnsmode 为 2 66 | if [ ! -n "$fallbackdns" ]; then 67 | # 看来你是想还原原始 Clash 配置文件同时还删除自定义 DNS 配置 68 | rm -rf $KSROOT/koolclash/config/config.yaml 69 | cp $KSROOT/koolclash/config/origin.yml $KSROOT/koolclash/config/config.yaml 70 | overwrite_dns_config 71 | dbus set koolclash_dnsmode=1 72 | echo_date "自定义 DNS 设置提交成功!" 73 | http_response 'success' 74 | else 75 | # 你应该是想更新一下自定义 DNS 配置 76 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 77 | yq d -i $KSROOT/koolclash/config/config.yaml dns 78 | 79 | echo_date "将提交的自定义 DNS 设置覆盖 Clash 配置文件..." 80 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 81 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 82 | 83 | 84 | overwrite_dns_config 85 | # 强制生效 DNS 配置,修改 dnsmode 为 2 86 | dbus set koolclash_dnsmode=2 87 | echo_date "后备 DNS 设置提交成功!" 88 | http_response 'success' 89 | fi 90 | elif [ "$koolclash_dnsmode" == "3" ]; then 91 | # 你这是要提交自定义 DNS 配置来完善你上传的 Clash 配置文件 92 | if [ ! -n "$fallbackdns" ]; then 93 | # 本来你 Clash 配置就没有 DNS 配置了,你还提交个空的干嘛? 94 | echo_date "没有找到自定义 DNS 配置!请前往「配置文件」提交后备 DNS 配置!" 95 | http_response 'nofallbackdns' 96 | else 97 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 98 | yq d -i $KSROOT/koolclash/config/config.yaml dns 99 | 100 | echo_date "将提交的后备 DNS 设置合并到 Clash 配置文件中..." 101 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 102 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 103 | 104 | 105 | overwrite_dns_config 106 | 107 | echo_date "后备 DNS 设置提交成功!" 108 | http_response 'success' 109 | fi 110 | elif [ "$koolclash_dnsmode" == "4" ]; then 111 | # 你已经提交了自定义 DNS 配置了,想要更新一下自定义配置 112 | if [ ! -n "$fallbackdns" ]; then 113 | # 你不是想更新吗,你还提交个空的干嘛? 114 | echo_date "没有找到自定义 DNS 配置!请前往「配置文件」提交后备 DNS 配置!" 115 | http_response 'nofallbackdns' 116 | else 117 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 118 | yq d -i $KSROOT/koolclash/config/config.yaml dns 119 | 120 | echo_date "将提交的后备 DNS 设置合并到 Clash 配置文件中..." 121 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 122 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 123 | 124 | 125 | overwrite_dns_config 126 | 127 | echo_date "后备 DNS 设置提交成功!" 128 | http_response 'success' 129 | fi 130 | fi 131 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_status.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | eval $(dbus export koolclash_) 6 | 7 | lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address') 8 | #wan_ip=$(ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') 9 | 10 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 11 | 12 | pid_clash=$(pidof clash) 13 | pid_watchdog=$(ps | grep koolclash_watchdog.sh | grep -v grep | awk '{print $1}') 14 | date=$(echo_date) 15 | 16 | if [ ! -f $KSROOT/koolclash/config/config.yaml ]; then 17 | host='' 18 | secret='' 19 | else 20 | host=$(yq r /koolshare/koolclash/config/config.yaml external-controller) 21 | secret=$(yq r /koolshare/koolclash/config/config.yaml secret) 22 | fi 23 | 24 | if [ ! -f $KSROOT/koolclash/config/config.yaml ]; then 25 | # 没有找到 Clash 配置文件,不显示 DNS 配置输入,dnsmode 为 0 26 | dbus set koolclash_dnsmode=0 27 | dnsmode=0 28 | elif [ $koolclash_dnsmode = 2 ]; then 29 | # Clash 配置文件存在且 DNS 配置合法,但是用户选择了自定义 DNS 配置,显示 DNS 配置输入,dnsmode 为 2 30 | dnsmode=2 31 | elif [ $(yq r $KSROOT/koolclash/config/origin.yml dns.enable) == 'true' ] && [ $(yq r $KSROOT/koolclash/config/origin.yml dns.enhanced-mode) == 'fake-ip' ]; then 32 | # Clash 配置文件存在且 DNS 配置合法,不显示 DNS 配置输入,dnsmode 为 1 33 | dbus set koolclash_dnsmode=1 34 | dnsmode=1 35 | elif [ ! -f $KSROOT/koolclash/config/dns.yml ]; then 36 | dbus set koolclash_dnsmode=3 37 | # Clash 配置文件存在但 DNS 配置不存在或者不合法,并且没有提交独立 DNS 配置,显示 DNS 配置输入,dnsmode 为 3 38 | dnsmode=3 39 | else 40 | dbus set koolclash_dnsmode=4 41 | # Clash 配置文件存在但 DNS 配置不存在或者不合法,但是已经提交独立 DNS 配置,显示 DNS 配置输入,dnsmode 为 4 42 | dnsmode=4 43 | fi 44 | 45 | if [ -n "$pid_clash" ]; then 46 | text1="$date Clash 进程运行正常!(PID: $pid_clash)" 47 | else 48 | text1="$date Clash 进程未在运行!" 49 | fi 50 | 51 | if [ -n "$pid_watchdog" ]; then 52 | text2="$date Clash 看门狗运行正常!(PID: $pid_watchdog)" 53 | else 54 | text2="$date Clash 看门狗未在运行!" 55 | fi 56 | 57 | touch $KSROOT/koolclash/config/dns.yml 58 | 59 | fallbackdns=$(cat $KSROOT/koolclash/config/dns.yml | base64 | xargs) 60 | 61 | http_response "$text1@$text2@$dnsmode@$host@$secret@$lan_ip@$fallbackdns" 62 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_sub.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | # From Koolshare DMZ Plugin 8 | lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address') 9 | wan_ip=$(ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') 10 | 11 | fallbackdns=$(cat $KSROOT/koolclash/config/dns.yml) 12 | 13 | # 如果没有外部监听控制就使用 LAN IP:6170 14 | if [ ! -n "$koolclash_api_host" ]; then 15 | dbus remove koolclash_api_host 16 | ext_control_ip=$lan_ip 17 | else 18 | ext_control_ip=$koolclash_api_host 19 | fi 20 | 21 | #--------------------------------------------------------------------- 22 | # 强制覆盖 DNS、Fake-IP 的设置 23 | 24 | overwrite_dns_config() { 25 | # 确保启用 DNS 26 | yq w -i $KSROOT/koolclash/config/config.yaml dns.enable "true" 27 | # 修改端口 28 | yq w -i $KSROOT/koolclash/config/config.yaml dns.listen "0.0.0.0:23453" 29 | # 修改模式 30 | yq w -i $KSROOT/koolclash/config/config.yaml dns.enhanced-mode "fake-ip" 31 | # Fake IP Range 32 | yq w -i $KSROOT/koolclash/config/config.yaml dns.fake-ip-range "198.18.0.1/16" 33 | } 34 | #--------------------------------------------------------------------- 35 | 36 | case $2 in 37 | del) 38 | if [ "$koolclash_update_mode" == "1" ]; then 39 | dbus remove koolclash_suburl 40 | CRONTAB_SUB=$(cat /etc/crontabs/root | grep koolclash_update_sub_cron.sh) 41 | [ ! -z "$CRONTAB_SUB" ] && echo_date "删除定时更新 Clash 配置文件CRON..." && sed -i '/koolclash_update_sub_cron/d' /etc/crontabs/root >/dev/null 2>&1 42 | http_response '1' 43 | else 44 | if [ "$koolclash_update_mode" == "2" ]; then 45 | dbus remove koolclash_subconverter_url 46 | CRONTAB_SUB=$(cat /etc/crontabs/root | grep koolclash_update_sub_cron.sh) 47 | [ ! -z "$CRONTAB_SUB" ] && echo_date "删除定时更新 Clash 配置文件CRON..." && sed -i '/koolclash_update_sub_cron/d' /etc/crontabs/root >/dev/null 2>&1 48 | http_response '2' 49 | fi 50 | fi 51 | ;; 52 | 53 | update) 54 | url=$(echo "$3" | base64 -d) 55 | if [ "$url" == "" ]; then 56 | # 你提交个空的上来干嘛?是不是想删掉? 57 | dbus remove koolclash_suburl 58 | http_response 'ok' 59 | else 60 | dbus set koolclash_suburl="$url" 61 | dbus set koolclash_update_mode=1 62 | sub_url=$(dbus get koolclash_suburl | sed -e 's;?;\\?;g' -e 's;&;\\&;g') 63 | curl=$(which curl) 64 | 65 | cp $KSROOT/koolclash/config/origin.yml $KSROOT/koolclash/config/origin-backup.yml 66 | rm -rf $KSROOT/koolclash/config/origin.yml 67 | 68 | if [ "x$curl" != "x" ] && [ -x $curl ]; then 69 | #$curl -L "$sub_url" -o $KSROOT/koolclash/config/origin.yml 70 | $KSROOT/scripts/koolclash_update_yaml.sh 71 | $KSROOT/koolclash/config/sub.sh 72 | sed -i '/^\-\-\-$/ d' $KSROOT/koolclash/config/origin.yml 73 | sed -i '/^\.\.\.$/ d' $KSROOT/koolclash/config/origin.yml 74 | else 75 | http_response 'nocurl' 76 | cp $KSROOT/koolclash/config/origin-backup.yml $KSROOT/koolclash/config/origin.yml 77 | exit 1 78 | fi 79 | 80 | if [ "$(yq r $KSROOT/koolclash/config/origin.yml port | sed 's|[0-9]||g')" == "" ]; then 81 | # 下载成功了 82 | rm -rf $KSROOT/koolclash/config/origin-backup.yml 83 | 84 | echo_date "设置 redir-port 和 allow-lan 属性" 85 | # 覆盖配置文件中的 redir-port 和 allow-lan 的配置 86 | yq w -i $KSROOT/koolclash/config/origin.yml redir-port 23456 87 | yq w -i $KSROOT/koolclash/config/origin.yml allow-lan true 88 | 89 | yq w -i $KSROOT/koolclash/config/origin.yml external-controller "$ext_control_ip:6170" 90 | # 启用 external-ui 91 | yq w -i $KSROOT/koolclash/config/origin.yml external-ui "/koolshare/webs/koolclash/" 92 | # 设置 secret 93 | yq w -i $KSROOT/koolclash/config/origin.yml secret "clash" 94 | 95 | # Change proxy mode 96 | if [ "$koolclash_switch_config_mode" == "1" ]; then 97 | yq w -i $KSROOT/koolclash/config/origin.yml mode "rule" 98 | elif [ "$koolclash_switch_config_mode" == "2" ]; then 99 | yq w -i $KSROOT/koolclash/config/origin.yml mode "global" 100 | elif [ "$koolclash_switch_config_mode" == "3" ]; then 101 | yq w -i $KSROOT/koolclash/config/origin.yml mode "direct" 102 | fi 103 | 104 | cp $KSROOT/koolclash/config/origin.yml $KSROOT/koolclash/config/config.yaml 105 | 106 | # 判断是否存在 DNS 字段、DNS 是否启用、DNS 是否使用 redir-host / fake-ip 模式 107 | if [ $(yq r $KSROOT/koolclash/config/config.yaml dns.enable) == 'true' ] && [[ $(yq r $KSROOT/koolclash/config/config.yaml dns.enhanced-mode) == 'fake-ip' || $(yq r $KSROOT/koolclash/config/config.yaml dns.enhanced-mode) == 'redir-host' ]]; then 108 | if [ "$koolclash_dnsmode" == "2" ] && [ -n "$fallbackdns" ]; then 109 | # dnsmode 是 2 应该用自定义 DNS 配置进行覆盖 110 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 111 | yq d -i $KSROOT/koolclash/config/config.yaml dns 112 | 113 | echo_date "将提交的自定义 DNS 设置覆盖 Clash 配置文件..." 114 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 115 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 116 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/profile.yml 117 | dbus set koolclash_dnsmode=2 118 | else 119 | # 可能 dnsmode 是 2 但是没有自定义 DNS 配置;或者本来之前就是 1 120 | dbus set koolclash_dnsmode=1 121 | fi 122 | 123 | 124 | overwrite_dns_config 125 | echo_date "Clash 配置文件上传成功!" 126 | http_response 'success' 127 | else 128 | echo_date "在 Clash 配置文件中没有找到 DNS 配置!" 129 | if [ ! -n "$fallbackdns" ]; then 130 | echo_date "没有找到后备 DNS 配置!请前往「配置文件」提交后备 DNS 配置!" 131 | # 设置 DNS Mode 为 3 132 | dbus set koolclash_dnsmode=3 133 | http_response 'nofallbackdns' 134 | else 135 | echo_date "找到后备 DNS 配置!合并到 Clash 配置文件中..." 136 | 137 | dbus set koolclash_dnsmode=4 138 | # 将后备 DNS 配置以覆盖的方式与 config.yaml 合并 139 | echo_date "删除 Clash 配置文件中原有的 DNS 配置" 140 | yq d -i $KSROOT/koolclash/config/config.yaml dns 141 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/dns.yml 142 | yq m -x -i $KSROOT/koolclash/config/config.yaml $KSROOT/koolclash/config/profile.yml 143 | 144 | overwrite_dns_config 145 | 146 | echo_date "Clash 配置文件上传成功!" 147 | http_response 'success' 148 | fi 149 | fi 150 | else 151 | # 下载失败了 152 | rm -rf $KSROOT/koolclash/config/origin.yml 153 | cp $KSROOT/koolclash/config/origin-backup.yml $KSROOT/koolclash/config/origin.yml 154 | rm -rf $KSROOT/koolclash/config/origin-backup.yml 155 | http_response 'fail' 156 | fi 157 | fi 158 | ;; 159 | esac 160 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_switch_direct.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | eval $(dbus export koolclash_) 8 | 9 | #提取 Clash 配置认证码 10 | secret=$(yq r $KSROOT/koolclash/config/config.yaml secret) 11 | #提取 Clash 配置监听端口和 IP 地址 12 | ipaddr_port=$(yq r $KSROOT/koolclash/config/config.yaml external-controller) 13 | 14 | curl -sv \ 15 | -H "Authorization: Bearer $secret" \ 16 | -X PATCH "http://$ipaddr_port/configs/" -d "{\"mode\": \"direct\"}" 2>&1 17 | 18 | curl -sv \ 19 | -H "Authorization: Bearer $secret" \ 20 | -X DELETE "http://$ipaddr_port/connections" 2>&1 21 | 22 | dbus set koolclash_switch_config_mode=3 23 | yq w -i $KSROOT/koolclash/config/config.yaml mode "Direct" 24 | http_response 'direct' 25 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_switch_global.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | eval $(dbus export koolclash_) 8 | 9 | #提取 Clash 配置认证码 10 | secret=$(yq r $KSROOT/koolclash/config/config.yaml secret) 11 | #提取 Clash 配置监听端口和 IP 地址 12 | ipaddr_port=$(yq r $KSROOT/koolclash/config/config.yaml external-controller) 13 | 14 | curl -sv \ 15 | -H "Authorization: Bearer $secret" \ 16 | -X PATCH "http://$ipaddr_port/configs/" -d "{\"mode\": \"global\"}" 2>&1 17 | 18 | curl -sv \ 19 | -H "Authorization: Bearer $secret" \ 20 | -X DELETE "http://$ipaddr_port/connections" 2>&1 21 | 22 | dbus set koolclash_switch_config_mode=2 23 | yq w -i $KSROOT/koolclash/config/config.yaml mode "Global" 24 | http_response 'global' 25 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_switch_rule.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | eval $(dbus export koolclash_) 8 | 9 | #提取 Clash 配置认证码 10 | secret=$(yq r $KSROOT/koolclash/config/config.yaml secret) 11 | #提取 Clash 配置监听端口和 IP 地址 12 | ipaddr_port=$(yq r $KSROOT/koolclash/config/config.yaml external-controller) 13 | 14 | curl -sv \ 15 | -H "Authorization: Bearer $secret" \ 16 | -X PATCH "http://$ipaddr_port/configs/" -d "{\"mode\": \"rule\"}" 2>&1 17 | 18 | curl -sv \ 19 | -H "Authorization: Bearer $secret" \ 20 | -X DELETE "http://$ipaddr_port/connections" 2>&1 21 | 22 | dbus set koolclash_switch_config_mode=1 23 | yq w -i $KSROOT/koolclash/config/config.yaml mode "Rule" 24 | http_response 'rule' 25 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_update_chn.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | mkdir -p $KSROOT/koolclash/chn 9 | 10 | curl=$(which curl) 11 | wget=$(which wget) 12 | 13 | ipdb_url="https://ispip.clang.cn/all_cn.txt" 14 | 15 | rm -rf /tmp/upload/koolclash_log.txt && touch /tmp/upload/koolclash_log.txt 16 | sleep 1 17 | 18 | if [ "x$wget" != "x" ] && [ -x $wget ]; then 19 | command="$wget --no-check-certificate $ipdb_url -O $KSROOT/koolclash/all_cn.txt" 20 | elif [ "x$curl" != "x" ] && [ test -x $curl ]; then 21 | command="$curl -k --compressed $ipdb_url -o $KSROOT/koolclash/all_cn.txt" 22 | else 23 | echo_date "没有找到 wget 或 curl,无法更新 CHN 数据库!" >>/tmp/upload/koolclash_log.txt 24 | http_response 'nodl' 25 | exit 1 26 | fi 27 | 28 | echo_date "开始下载最新 CHN 数据库..." >>/tmp/upload/koolclash_log.txt 29 | $command 30 | 31 | if [ ! -f "$KSROOT/koolclash/all_cn.txt" ]; then 32 | echo_date "下载 CHN 数据库失败!" >>/tmp/upload/koolclash_log.txt 33 | exit 1 34 | fi 35 | 36 | echo_date "下载完成,开始复制" >>/tmp/upload/koolclash_log.txt 37 | cp -rf $KSROOT/koolclash/all_cn.txt $KSROOT/koolclash/chn 38 | 39 | version=$(ls --full-time $KSROOT/koolclash/all_cn.txt | awk '{print $6}') 40 | 41 | cp -rf $KSROOT/koolclash/chn/all_cn.txt $KSROOT/koolclash/config/china_ip_route.ipset 42 | 43 | echo_date "更新 CHN 数据库至 $version 版本" >>/tmp/upload/koolclash_log.txt 44 | dbus set koolclash_chn_version=$version 45 | 46 | echo_date "清理临时文件..." >>/tmp/upload/koolclash_log.txt 47 | rm -rf $KSROOT/koolclash/all_cn.txt 48 | rm -rf $KSROOT/koolclash/chn 49 | 50 | echo_date "CHN 数据库更新完成!" >>/tmp/upload/koolclash_log.txt 51 | echo_date "注意!新版 CHN 数据库将在下次启动 Clash 时生效!" >>/tmp/upload/koolclash_log.txt 52 | 53 | sleep 1 54 | 55 | echo "XU6J03M6" >>/tmp/upload/koolclash_log.txt 56 | 57 | http_response 'ok' 58 | exit 0 -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_update_ipdb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | 7 | mkdir -p $KSROOT/koolclash/ipdb 8 | 9 | curl=$(which curl) 10 | wget=$(which wget) 11 | 12 | ipdb_url="http://www.ideame.top/mmdb/lite/Country.mmdb" 13 | 14 | rm -rf /tmp/upload/koolclash_log.txt && touch /tmp/upload/koolclash_log.txt 15 | sleep 1 16 | 17 | if [ "x$wget" != "x" ] && [ -x $wget ]; then 18 | command="$wget --no-check-certificate $ipdb_url -q -O $KSROOT/koolclash/Country.mmdb" 19 | else 20 | echo_date "没有找到 wget 或 curl,无法更新 IP 数据库!" >>/tmp/upload/koolclash_log.txt 21 | http_response 'nodl' 22 | exit 1 23 | fi 24 | 25 | echo_date "开始下载最新 IP 数据库..." >>/tmp/upload/koolclash_log.txt 26 | $command 27 | 28 | if [ ! -f "$KSROOT/koolclash/Country.mmdb" ]; then 29 | echo_date "下载 IP 数据库失败!" >>/tmp/upload/koolclash_log.txt 30 | exit 1 31 | fi 32 | 33 | echo_date "下载完成,开始复制" >>/tmp/upload/koolclash_log.txt 34 | cp -rf $KSROOT/koolclash/Country.mmdb $KSROOT/koolclash/ipdb 35 | 36 | chmod 644 $KSROOT/koolclash/ipdb/* 37 | version=$(ls --full-time $KSROOT/koolclash/Country.mmdb | awk '{print $6}') 38 | 39 | cp -rf $KSROOT/koolclash/ipdb/Country.mmdb $KSROOT/koolclash/config 40 | 41 | echo_date "更新 IP 数据库至 $version 版本" >>/tmp/upload/koolclash_log.txt 42 | dbus set koolclash_ipdb_version=$version 43 | 44 | echo_date "清理临时文件..." >>/tmp/upload/koolclash_log.txt 45 | rm -rf $KSROOT/koolclash/Country.mmdb 46 | rm -rf $KSROOT/koolclash/ipdb 47 | 48 | echo_date "IP 数据库更新完成!" >>/tmp/upload/koolclash_log.txt 49 | echo_date "注意!新版 IP 数据库将在下次启动 Clash 时生效!" >>/tmp/upload/koolclash_log.txt 50 | 51 | sleep 1 52 | 53 | echo "XU6J03M6" >>/tmp/upload/koolclash_log.txt 54 | 55 | http_response 'ok' 56 | exit 0 57 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_update_sub_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | enable=`echo ${2:0:1}` 9 | time=`echo ${2:2}` 10 | 11 | dbus set koolclash_update_sub_enable=$enable 12 | dbus set koolclash_update_sub_time=$time 13 | 14 | sub_enable=$(dbus get koolclash_update_sub_enable) 15 | sub_time=$(dbus get koolclash_update_sub_time) 16 | 17 | rm -rf /tmp/upload/koolclash_log.txt && touch /tmp/upload/koolclash_log.txt 18 | sleep 1 19 | 20 | if [ "$koolclash_enable" == "1" ]; then 21 | if [ "$sub_enable" == "1" ]; then 22 | [ ! -f "/etc/crontabs/root" ] && touch /etc/crontabs/root 23 | CRONTAB_SUB=$(cat /etc/crontabs/root | grep koolclash_update_sub_cron.sh) 24 | if [ -f "$KSROOT/koolclash/config/sub.sh" ]; then 25 | sed -i '/koolclash_update_sub_cron/d' /etc/crontabs/root >/dev/null 2>&1 26 | echo_date "每天 $sub_time 点定时更新 Clash 配置文件命令写入CRON中..." >>/tmp/upload/koolclash_log.txt && echo "0 $sub_time * * * $KSROOT/scripts/koolclash_update_sub_cron.sh update" >> /etc/crontabs/root 27 | else 28 | echo_date "更新 Clash 配置文件命令写入CRON失败!" >>/tmp/upload/koolclash_log.txt 29 | fi 30 | else 31 | CRONTAB_SUB=$(cat /etc/crontabs/root | grep koolclash_update_sub_cron.sh) 32 | [ ! -z "$CRONTAB_SUB" ] && echo_date "删除定时更新 Clash 配置文件CRON..." >>/tmp/upload/koolclash_log.txt && sed -i '/koolclash_update_sub_cron/d' /etc/crontabs/root >/dev/null 2>&1 33 | fi 34 | else 35 | if [ "$sub_enable" == "1" ]; then 36 | CRONTAB_SUB=$(cat /etc/crontabs/root | grep koolclash_update_sub_cron.sh) 37 | [ ! -z "$CRONTAB_SUB" ] && echo_date "删除定时更新 Clash 配置文件CRON..." >>/tmp/upload/koolclash_log.txt && sed -i '/koolclash_update_sub_cron/d' /etc/crontabs/root >/dev/null 2>&1 38 | fi 39 | fi 40 | 41 | http_response "ok" 42 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_update_yaml.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | sub_url=$(dbus get koolclash_suburl | sed -e 's;?;\\?;g' -e 's;&;\\&;g') 8 | 9 | rm -rf $KSROOT/koolclash/config/sub.sh > /dev/null 2>&1 10 | 11 | echo -e " 12 | #!/bin/sh 13 | curl=\$(which curl) 14 | \$curl -L ${sub_url} -o ${KSROOT}/koolclash/config/origin.yml 15 | sub_time=\$(date +%Y-%m-%d\ %X) 16 | dbus set koolclash_config_version=\"\$sub_time\"" >> $KSROOT/koolclash/config/sub.sh 17 | 18 | sed -i '/^$/d' $KSROOT/koolclash/config/sub.sh 19 | chmod -R 755 $KSROOT/koolclash/config/sub.sh -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_watchdog.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | eval $(dbus export koolclash_) 6 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 7 | 8 | while [ "$koolclash_enable" == "1" ]; do 9 | echo_date "开始检查进程状态..." 10 | 11 | if [ ! -n "$(pidof clash)" ]; then 12 | start-stop-daemon -S -q -b -m \ 13 | -p /tmp/run/koolclash.pid \ 14 | -x /koolshare/bin/clash \ 15 | -- -d $KSROOT/koolclash/config/ 16 | echo_date "重启 Clash 进程" 17 | fi 18 | 19 | sleep 15 20 | continue 21 | done 22 | -------------------------------------------------------------------------------- /koolclash/scripts/koolclash_watchdog_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | alias echo_date='echo 【$(date +%Y年%m月%d日\ %X)】:' 6 | eval $(dbus export koolclash_) 7 | 8 | dbus set koolclash_watchdog_enable=$2 9 | 10 | http_response "ok" 11 | -------------------------------------------------------------------------------- /koolclash/uninstall.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | export KSROOT=/koolshare 4 | source $KSROOT/scripts/base.sh 5 | 6 | if [ -d "$KSROOT/koolclash" ]; then 7 | sh $KSROOT/scripts/koolclash_control.sh stop >/dev/null 2>&1 8 | sleep 2 9 | fi 10 | 11 | rm -rf $KSROOT/koolclash 12 | rm -rf $KSROOT/scripts/koolclash_* 13 | rm -rf $KSROOT/init.d/S99koolclash.sh 14 | rm -rf $KSROOT/bin/clash 15 | rm -rf $KSROOT/bin/clash-linux-amd64 16 | rm -rf $KSROOT/bin/yq 17 | rm -rf $KSROOT/bin/subconverter 18 | rm -rf $KSROOT/webs/Module_koolclash.asp 19 | rm -rf $KSROOT/webs/koolclash 20 | rm -rf $KSROOT/webs/res/icon-koolclash* 21 | rm -rf $KSROOT/webs/res/koolclash_* 22 | 23 | rm -rf /tmp/luci-* 24 | 25 | confs=$(dbus list koolclash | cut -d "=" -f1) 26 | for conf in $confs; do 27 | dbus remove $conf 28 | done 29 | 30 | dbus remove softcenter_module_koolclash_description 31 | dbus remove softcenter_module_koolclash_install 32 | dbus remove softcenter_module_koolclash_name 33 | dbus remove softcenter_module_koolclash_title 34 | dbus remove softcenter_module_koolclash_version 35 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/CNAME: -------------------------------------------------------------------------------- 1 | yacd.haishan.me 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/_headers: -------------------------------------------------------------------------------- 1 | # for netlify hosting 2 | # https://docs.netlify.com/routing/headers/#syntax-for-the-headers-file 3 | 4 | /* 5 | X-Frame-Options: DENY 6 | X-XSS-Protection: 1; mode=block 7 | X-Content-Type-Options: nosniff 8 | Referrer-Policy: same-origin 9 | /*.css 10 | Cache-Control: public, max-age=31536000, immutable 11 | /*.js 12 | Cache-Control: public, max-age=31536000, immutable 13 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Config.38113279.js: -------------------------------------------------------------------------------- 1 | var J=Object.defineProperty,K=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var b=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,T=Object.prototype.propertyIsEnumerable;var $=(e,t,a)=>t in e?J(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a,p=(e,t)=>{for(var a in t||(t={}))R.call(t,a)&&$(e,a,t[a]);if(b)for(var a of b(t))T.call(t,a)&&$(e,a,t[a]);return e},f=(e,t)=>K(e,Q(t));var M=(e,t)=>{var a={};for(var o in e)R.call(e,o)&&t.indexOf(o)<0&&(a[o]=e[o]);if(e!=null&&b)for(var o of b(e))t.indexOf(o)<0&&T.call(e,o)&&(a[o]=e[o]);return a};import{r as X,b as c,j as n,P as w,s as A,R as Y,c as Z,i as ee,k as z,l as E,n as te,h as B,d as D,o as ne,g as U,q as ae,t as oe,v as _,w as le,u as se,C as re,x as ce,B as ie,y as de,z as ue}from"./index.27058ddf.js";import{r as pe}from"./logs.7cc467a0.js";import{S as x}from"./Select.4987ab41.js";function he(e,t){if(e==null)return{};var a=ge(e,t),o,r;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&(!Object.prototype.propertyIsEnumerable.call(e,o)||(a[o]=e[o]))}return a}function ge(e,t){if(e==null)return{};var a={},o=Object.keys(e),r,s;for(s=0;s=0)&&(a[r]=e[r]);return a}var I=X.exports.forwardRef(function(e,t){var a=e.color,o=a===void 0?"currentColor":a,r=e.size,s=r===void 0?24:r,u=he(e,["color","size"]);return c("svg",f(p({ref:t,xmlns:"http://www.w3.org/2000/svg",width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:o,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},u),{children:[n("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),n("polyline",{points:"16 17 21 12 16 7"}),n("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}))});I.propTypes={color:w.string,size:w.oneOfType([w.string,w.number])};I.displayName="LogOut";var fe=I;const{useState:me,useRef:ve,useEffect:ye,useCallback:Ce}=Y;function be(e){return n("input",p({className:A.input},e))}function we(a){var o=a,{value:e}=o,t=M(o,["value"]);const[r,s]=me(e),u=ve(e);ye(()=>{u.current!==e&&s(e),u.current=e},[e]);const g=Ce(k=>s(k.target.value),[s]);return n("input",p({className:A.input,value:r,onChange:g},t))}const ke="_root_1tdl3_1",Se="_section_1tdl3_2",_e="_wrapSwitch_1tdl3_26",xe="_sep_1tdl3_32",Oe="_label_1tdl3_45";var d={root:ke,section:Se,wrapSwitch:_e,sep:xe,label:Oe};const Ie="_fieldset_1ghjp_1",Ne="_input_1ghjp_9",Pe="_cnt_1ghjp_9";var O={fieldset:Ie,input:Ne,cnt:Pe};function Le({OptionComponent:e,optionPropsList:t,selectedIndex:a,onChange:o}){const r=Z("visually-hidden",O.input),s=u=>{o(u.target.value)};return n("fieldset",{className:O.fieldset,children:t.map((u,g)=>c("label",{children:[n("input",{type:"radio",checked:a===g,name:"selection",value:g,"aria-labelledby":"traffic chart type "+g,onChange:s,className:r}),n("div",{className:O.cnt,children:n(e,p({},u))})]},g))})}const{useMemo:je}=B,$e={plugins:{legend:{display:!1}},scales:{x:{display:!1,type:"category"},y:{display:!1,type:"linear"}}},V=[23e3,35e3,46e3,33e3,9e4,68e3,23e3,45e3],Re=[184e3,183e3,196e3,182e3,19e4,186e3,182e3,189e3],Te=V;function Me({id:e}){const t=ee.read(),a=je(()=>({labels:Te,datasets:[f(p(p({},z),E[e].up),{data:V}),f(p(p({},z),E[e].down),{data:Re})]}),[e]),o="chart-"+e;return te(t.Chart,o,a,null,$e),n("div",{style:{width:100,padding:5},children:n("canvas",{id:o})})}const{useEffect:W,useState:ze,useCallback:m,useRef:Ee,useMemo:Ae}=B,Be=[{id:0},{id:1},{id:2},{id:3}],De=[["debug","Debug"],["warning","Warning"],["info","Info"],["error","Error"],["silent","Silent"]],Ue=[{key:"port",label:"HTTP Proxy Port"},{key:"socks-port",label:"SOCKS5 Proxy Port"},{key:"mixed-port",label:"Mixed Port"},{key:"redir-port",label:"Redir Port"}],Ve=[["zh","\u4E2D\u6587"],["en","English"]],We=[["Global","Global"],["Rule","Rule"],["Direct","Direct"]],He=e=>({configs:ne(e),apiConfig:U(e)}),Ge=e=>({selectedChartStyleIndex:de(e),latencyTestUrl:ue(e),apiConfig:U(e)}),qe=D(Ge)(Je);var Ze=D(He)(Fe);function Fe({dispatch:e,configs:t,apiConfig:a}){return W(()=>{e(ae(a))},[e,a]),n(qe,{configs:t})}function Je({dispatch:e,configs:t,selectedChartStyleIndex:a,latencyTestUrl:o,apiConfig:r}){const[s,u]=ze(t),g=Ee(t);W(()=>{g.current!==t&&u(t),g.current=t},[t]);const k=m(()=>{e(oe("apiConfig"))},[e]),v=m((l,i)=>{u(f(p({},s),{[l]:i}))},[s]),H=m(l=>{const i="allow-lan",h=l;v(i,h),e(_(r,{"allow-lan":h}))},[r,e,v]),y=m(({name:l,value:i})=>{switch(l){case"mode":case"log-level":v(l,i),e(_(r,{[l]:i})),l==="log-level"&&pe(f(p({},r),{logLevel:i}));break;case"redir-port":case"socks-port":case"mixed-port":case"port":if(i!==""){const h=parseInt(i,10);if(h<0||h>65535)return}v(l,i);break;default:return}},[r,e,v]),G=m(l=>y(l.target),[y]),{selectChartStyleIndex:q,updateAppConfig:N}=le(),P=m(l=>{const i=l.target,{name:h,value:j}=i;switch(h){case"port":case"socks-port":case"mixed-port":case"redir-port":{const S=parseInt(j,10);if(S<0||S>65535)return;e(_(r,{[h]:S}));break}case"latencyTestUrl":{N(h,j);break}default:throw new Error(`unknown input name ${h}`)}},[r,e,N]),F=Ae(()=>{const l=s.mode;return typeof l=="string"&&l[0].toUpperCase()+l.slice(1)},[s.mode]),{t:C,i18n:L}=se();return c("div",{children:[n(re,{title:C("Config")}),c("div",{className:d.root,children:[Ue.map(l=>s[l.key]!==void 0?c("div",{children:[n("div",{className:d.label,children:l.label}),n(be,{name:l.key,value:s[l.key],onChange:G,onBlur:P})]},l.key):null),c("div",{children:[n("div",{className:d.label,children:"Mode"}),n(x,{options:We,selected:F,onChange:l=>y({name:"mode",value:l.target.value})})]}),c("div",{children:[n("div",{className:d.label,children:"Log Level"}),n(x,{options:De,selected:s["log-level"],onChange:l=>y({name:"log-level",value:l.target.value})})]}),c("div",{children:[n("div",{className:d.label,children:"Allow LAN"}),n("div",{className:d.wrapSwitch,children:n(ce,{name:"allow-lan",checked:s["allow-lan"],onChange:H})})]})]}),n("div",{className:d.sep,children:n("div",{})}),c("div",{className:d.section,children:[c("div",{children:[n("div",{className:d.label,children:C("latency_test_url")}),n(we,{name:"latencyTestUrl",type:"text",value:o,onBlur:P})]}),c("div",{children:[n("div",{className:d.label,children:C("lang")}),n("div",{children:n(x,{options:Ve,selected:L.language,onChange:l=>L.changeLanguage(l.target.value)})})]}),c("div",{children:[n("div",{className:d.label,children:C("chart_style")}),n(Le,{OptionComponent:Me,optionPropsList:Be,selectedIndex:a,onChange:q})]}),c("div",{children:[n("div",{className:d.label,children:"Action"}),n(ie,{start:n(fe,{size:16}),label:"Switch backend",onClick:k})]})]})]})}export{Ze as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Config.56241d16.js: -------------------------------------------------------------------------------- 1 | import{r as U,b as c,j as t,i as y,s as P,R as V,c as W,k as H,l as N,n as L,o as G,h as j,d as $,q,g as R,t as F,v as J,w as b,x as K,u as Q,C as X,y as Y,B as Z,z as ee,A as te}from"./index.31d0d1dc.js";import{r as ne}from"./logs.975cc896.js";import{S as w}from"./Select.f2dd4970.js";function ae(e,s){if(e==null)return{};var r=oe(e,s),l,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&(!Object.prototype.propertyIsEnumerable.call(e,l)||(r[l]=e[l]))}return r}function oe(e,s){if(e==null)return{};var r={},l=Object.keys(e),a,o;for(o=0;o=0)&&(r[a]=e[a]);return r}var S=U.exports.forwardRef(function(e,s){var r=e.color,l=r===void 0?"currentColor":r,a=e.size,o=a===void 0?24:a,u=ae(e,["color","size"]);return c("svg",{ref:s,xmlns:"http://www.w3.org/2000/svg",width:o,height:o,viewBox:"0 0 24 24",fill:"none",stroke:l,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...u,children:[t("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),t("polyline",{points:"16 17 21 12 16 7"}),t("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]})});S.propTypes={color:y.exports.string,size:y.exports.oneOfType([y.exports.string,y.exports.number])};S.displayName="LogOut";const se=S,{useState:le,useRef:re,useEffect:ce,useCallback:ie}=V;function de(e){return t("input",{className:P.input,...e})}function ue({value:e,...s}){const[r,l]=le(e),a=re(e);ce(()=>{a.current!==e&&l(e),a.current=e},[e]);const o=ie(u=>l(u.target.value),[l]);return t("input",{className:P.input,value:r,onChange:o,...s})}const pe="_root_1tdl3_1",he="_section_1tdl3_2",ge="_wrapSwitch_1tdl3_26",fe="_sep_1tdl3_32",me="_label_1tdl3_45",d={root:pe,section:he,wrapSwitch:ge,sep:fe,label:me},ve="_fieldset_1ghjp_1",ye="_input_1ghjp_9",Ce="_cnt_1ghjp_9",k={fieldset:ve,input:ye,cnt:Ce};function be({OptionComponent:e,optionPropsList:s,selectedIndex:r,onChange:l}){const a=W("visually-hidden",k.input),o=u=>{l(u.target.value)};return t("fieldset",{className:k.fieldset,children:s.map((u,h)=>c("label",{children:[t("input",{type:"radio",checked:r===h,name:"selection",value:h,"aria-labelledby":"traffic chart type "+h,onChange:o,className:a}),t("div",{className:k.cnt,children:t(e,{...u})})]},h))})}const{useMemo:we}=j,ke={plugins:{legend:{display:!1}},scales:{x:{display:!1,type:"category"},y:{display:!1,type:"linear"}}},T=[23e3,35e3,46e3,33e3,9e4,68e3,23e3,45e3],Se=[184e3,183e3,196e3,182e3,19e4,186e3,182e3,189e3],_e=T;function xe({id:e}){const s=H.read(),r=we(()=>({labels:_e,datasets:[{...N,...L[e].up,data:T},{...N,...L[e].down,data:Se}]}),[e]),l="chart-"+e;return G(s.Chart,l,r,null,ke),t("div",{style:{width:100,padding:5},children:t("canvas",{id:l})})}const{useEffect:M,useState:Oe,useCallback:g,useRef:Ie,useMemo:Ne}=j,Le=[{id:0},{id:1},{id:2},{id:3}],Pe=[["debug","Debug"],["info","Info"],["warning","Warning"],["error","Error"],["silent","Silent"]],je=[{key:"port",label:"HTTP Proxy Port"},{key:"socks-port",label:"SOCKS5 Proxy Port"},{key:"mixed-port",label:"Mixed Port"},{key:"redir-port",label:"Redir Port"}],$e=[["zh","\u4E2D\u6587"],["en","English"]],Re=[["Global","Global"],["Rule","Rule"],["Direct","Direct"]],Te=e=>({configs:q(e),apiConfig:R(e)}),Me=e=>({selectedChartStyleIndex:ee(e),latencyTestUrl:te(e),apiConfig:R(e)}),ze=$(Me)(Ee),Ve=$(Te)(Ae);function Ae({dispatch:e,configs:s,apiConfig:r}){return M(()=>{e(F(r))},[e,r]),t(ze,{configs:s})}function Ee({dispatch:e,configs:s,selectedChartStyleIndex:r,latencyTestUrl:l,apiConfig:a}){const[o,u]=Oe(s),h=Ie(s);M(()=>{h.current!==s&&u(s),h.current=s},[s]);const z=g(()=>{e(J("apiConfig"))},[e]),f=g((n,i)=>{u({...o,[n]:i})},[o]),A=g(n=>{const i="allow-lan",p=n;f(i,p),e(b(a,{"allow-lan":p}))},[a,e,f]),m=g(({name:n,value:i})=>{switch(n){case"mode":case"log-level":f(n,i),e(b(a,{[n]:i})),n==="log-level"&&ne({...a,logLevel:i});break;case"redir-port":case"socks-port":case"mixed-port":case"port":if(i!==""){const p=parseInt(i,10);if(p<0||p>65535)return}f(n,i);break;default:return}},[a,e,f]),E=g(n=>m(n.target),[m]),{selectChartStyleIndex:B,updateAppConfig:_}=K(),x=g(n=>{const i=n.target,{name:p,value:I}=i;switch(p){case"port":case"socks-port":case"mixed-port":case"redir-port":{const C=parseInt(I,10);if(C<0||C>65535)return;e(b(a,{[p]:C}));break}case"latencyTestUrl":{_(p,I);break}default:throw new Error(`unknown input name ${p}`)}},[a,e,_]),D=Ne(()=>{const n=o.mode;return typeof n=="string"&&n[0].toUpperCase()+n.slice(1)},[o.mode]),{t:v,i18n:O}=Q();return c("div",{children:[t(X,{title:v("Config")}),c("div",{className:d.root,children:[je.map(n=>o[n.key]!==void 0?c("div",{children:[t("div",{className:d.label,children:n.label}),t(de,{name:n.key,value:o[n.key],onChange:E,onBlur:x})]},n.key):null),c("div",{children:[t("div",{className:d.label,children:"Mode"}),t(w,{options:Re,selected:D,onChange:n=>m({name:"mode",value:n.target.value})})]}),c("div",{children:[t("div",{className:d.label,children:"Log Level"}),t(w,{options:Pe,selected:o["log-level"],onChange:n=>m({name:"log-level",value:n.target.value})})]}),c("div",{children:[t("div",{className:d.label,children:"Allow LAN"}),t("div",{className:d.wrapSwitch,children:t(Y,{name:"allow-lan",checked:o["allow-lan"],onChange:A})})]})]}),t("div",{className:d.sep,children:t("div",{})}),c("div",{className:d.section,children:[c("div",{children:[t("div",{className:d.label,children:v("latency_test_url")}),t(ue,{name:"latencyTestUrl",type:"text",value:l,onBlur:x})]}),c("div",{children:[t("div",{className:d.label,children:v("lang")}),t("div",{children:t(w,{options:$e,selected:O.language,onChange:n=>O.changeLanguage(n.target.value)})})]}),c("div",{children:[t("div",{className:d.label,children:v("chart_style")}),t(be,{OptionComponent:xe,optionPropsList:Le,selectedIndex:r,onChange:B})]}),c("div",{children:[t("div",{className:d.label,children:"Action"}),t(Z,{start:t(se,{size:16}),label:"Switch backend",onClick:z})]})]})]})}export{Ve as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Config.58870520.css: -------------------------------------------------------------------------------- 1 | ._root_1tdl3_1,._section_1tdl3_2{display:grid;grid-template-columns:repeat(auto-fill,minmax(345px,1fr));max-width:900px;gap:5px}@media screen and (min-width: 30em){._root_1tdl3_1,._section_1tdl3_2{gap:15px}}._root_1tdl3_1,._section_1tdl3_2{padding:6px 15px 10px}@media screen and (min-width: 30em){._root_1tdl3_1,._section_1tdl3_2{padding:10px 40px 15px}}._wrapSwitch_1tdl3_26{height:40px;display:flex;align-items:center}._sep_1tdl3_32{max-width:900px;padding:0 15px}@media screen and (min-width: 30em){._sep_1tdl3_32{padding:0 40px}}._sep_1tdl3_32>div{border-top:1px dashed #373737}._label_1tdl3_45{padding:11px 0}._fieldset_1ghjp_1{margin:0;padding:0;border:0;display:flex;flex-wrap:wrap}._input_1ghjp_9+._cnt_1ghjp_9{border:1px solid transparent;border-radius:8px;cursor:pointer;margin-right:5px;margin-bottom:5px}._input_1ghjp_9:focus+._cnt_1ghjp_9{border-color:#387cec}._input_1ghjp_9:checked+._cnt_1ghjp_9{border-color:#387cec} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Config.72936d5e.js: -------------------------------------------------------------------------------- 1 | var J=Object.defineProperty,q=Object.defineProperties;var F=Object.getOwnPropertyDescriptors;var v=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable;var P=(e,n,l)=>n in e?J(e,n,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[n]=l,u=(e,n)=>{for(var l in n||(n={}))O.call(n,l)&&P(e,l,n[l]);if(v)for(var l of v(n))R.call(n,l)&&P(e,l,n[l]);return e},E=(e,n)=>q(e,F(n));var A=(e,n)=>{var l={};for(var s in e)O.call(e,s)&&n.indexOf(s)<0&&(l[s]=e[s]);if(e!=null&&v)for(var s of v(e))n.indexOf(s)<0&&R.call(e,s)&&(l[s]=e[s]);return l};import{R as m,g as K,r as t,k as W,J as Q,j as X}from"./vendor.3cf270b6.js";import{r as Y}from"./logs.8963bea3.js";import{S}from"./Select.9583f722.js";import{s as M,b as Z,d as T,e as $,u as ee,c as j,h as te,g as B,i as ne,o as ae,j as k,k as le,C as se,l as re,B as oe,n as ce,q as ie}from"./index.d6596dd6.js";const{useState:pe,useRef:ue,useEffect:me,useCallback:de}=m;function ge(e){return m.createElement("input",u({className:M.input},e))}function fe(l){var s=l,{value:e}=s,n=A(s,["value"]);const[i,r]=pe(e),d=ue(e);me(()=>{d.current!==e&&r(e),d.current=e},[e]);const g=de(b=>r(b.target.value),[r]);return m.createElement("input",u({className:M.input,value:i,onChange:g},n))}const xe="_root_1tdl3_1",Ee="_section_1tdl3_2",he="_wrapSwitch_1tdl3_26",Ce="_sep_1tdl3_32",ve="_label_1tdl3_45";var c={root:xe,section:Ee,wrapSwitch:he,sep:Ce,label:ve};const be="_fieldset_1ghjp_1",ye="_input_1ghjp_9",Se="_cnt_1ghjp_9";var _={fieldset:be,input:ye,cnt:Se};function ke({OptionComponent:e,optionPropsList:n,selectedIndex:l,onChange:s}){const i=K("visually-hidden",_.input),r=d=>{s(d.target.value)};return m.createElement("fieldset",{className:_.fieldset},n.map((d,g)=>m.createElement("label",{key:g},m.createElement("input",{type:"radio",checked:l===g,name:"selection",value:g,"aria-labelledby":"traffic chart type "+g,onChange:r,className:i}),m.createElement("div",{className:_.cnt},m.createElement(e,u({},d))))))}const _e={legend:{display:!1},scales:{xAxes:[{display:!1}],yAxes:[{display:!1}]}},D=[23e3,35e3,46e3,33e3,9e4,68e3,23e3,45e3],we=[184e3,183e3,196e3,182e3,19e4,186e3,182e3,189e3],Ie=D;function Ne({id:e}){const n=Z.read(),l=t.exports.useMemo(()=>({labels:Ie,datasets:[E(u(u({},T),$[e].up),{data:D}),E(u(u({},T),$[e].down),{data:we})]}),[e]),s="chart-"+e;return ee(n,s,l,null,_e),m.createElement("div",{style:{width:100,padding:5}},m.createElement("canvas",{id:s}))}const{useEffect:U,useState:Le,useCallback:f,useRef:Pe,useMemo:Oe}=X,Re=[{id:0},{id:1},{id:2},{id:3}],Ae=[["debug","Debug"],["warning","Warning"],["info","Info"],["error","Error"],["silent","Silent"]],Te=[{key:"port",label:"HTTP Proxy Port"},{key:"socks-port",label:"SOCKS5 Proxy Port"},{key:"mixed-port",label:"Mixed Port"},{key:"redir-port",label:"Redir Port"}],$e=[["zh","\u4E2D\u6587"],["en","English"]],Me=[["Global","Global"],["Rule","Rule"],["Direct","Direct"]],je=e=>({configs:te(e),apiConfig:B(e)}),Be=e=>({selectedChartStyleIndex:ce(e),latencyTestUrl:ie(e),apiConfig:B(e)}),De=j(Be)(Ve);var Fe=j(je)(Ue);function Ue({dispatch:e,configs:n,apiConfig:l}){return U(()=>{e(ne(l))},[e,l]),t.exports.createElement(De,{configs:n})}function Ve({dispatch:e,configs:n,selectedChartStyleIndex:l,latencyTestUrl:s,apiConfig:i}){const[r,d]=Le(n),g=Pe(n);U(()=>{g.current!==n&&d(n),g.current=n},[n]);const b=f(()=>{e(ae("apiConfig"))},[e]),x=f((a,o)=>{d(E(u({},r),{[a]:o}))},[r]),V=f(a=>{const o="allow-lan",p=a;x(o,p),e(k(i,{"allow-lan":p}))},[i,e,x]),h=f(({name:a,value:o})=>{switch(a){case"mode":case"log-level":x(a,o),e(k(i,{[a]:o})),a==="log-level"&&Y(E(u({},i),{logLevel:o}));break;case"redir-port":case"socks-port":case"mixed-port":case"port":if(o!==""){const p=parseInt(o,10);if(p<0||p>65535)return}x(a,o);break;default:return}},[i,e,x]),z=f(a=>h(a.target),[h]),{selectChartStyleIndex:G,updateAppConfig:w}=le(),I=f(a=>{const o=a.target,{name:p,value:L}=o;switch(p){case"port":case"socks-port":case"mixed-port":case"redir-port":{const y=parseInt(L,10);if(y<0||y>65535)return;e(k(i,{[p]:y}));break}case"latencyTestUrl":{w(p,L);break}default:throw new Error(`unknown input name ${p}`)}},[i,e,w]),H=Oe(()=>{const a=r.mode;return typeof a=="string"&&a[0].toUpperCase()+a.slice(1)},[r.mode]),{t:C,i18n:N}=W();return t.exports.createElement("div",null,t.exports.createElement(se,{title:C("Config")}),t.exports.createElement("div",{className:c.root},Te.map(a=>r[a.key]!==void 0?t.exports.createElement("div",{key:a.key},t.exports.createElement("div",{className:c.label},a.label),t.exports.createElement(ge,{name:a.key,value:r[a.key],onChange:z,onBlur:I})):null),t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},"Mode"),t.exports.createElement(S,{options:Me,selected:H,onChange:a=>h({name:"mode",value:a.target.value})})),t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},"Log Level"),t.exports.createElement(S,{options:Ae,selected:r["log-level"],onChange:a=>h({name:"log-level",value:a.target.value})})),t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},"Allow LAN"),t.exports.createElement("div",{className:c.wrapSwitch},t.exports.createElement(re,{name:"allow-lan",checked:r["allow-lan"],onChange:V})))),t.exports.createElement("div",{className:c.sep},t.exports.createElement("div",null)),t.exports.createElement("div",{className:c.section},t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},C("latency_test_url")),t.exports.createElement(fe,{name:"latencyTestUrl",type:"text",value:s,onBlur:I})),t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},C("lang")),t.exports.createElement("div",null,t.exports.createElement(S,{options:$e,selected:N.language,onChange:a=>N.changeLanguage(a.target.value)}))),t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},C("chart_style")),t.exports.createElement(ke,{OptionComponent:Ne,optionPropsList:Re,selectedIndex:l,onChange:G})),t.exports.createElement("div",null,t.exports.createElement("div",{className:c.label},"Action"),t.exports.createElement(oe,{start:t.exports.createElement(Q,{size:16}),label:"Switch backend",onClick:b}))))}export{Fe as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Config.7bc73fad.css: -------------------------------------------------------------------------------- 1 | ._root_1tdl3_1,._section_1tdl3_2{display:grid;grid-template-columns:repeat(auto-fill,minmax(345px,1fr));max-width:900px;gap:5px}@media screen and (min-width: 30em){._root_1tdl3_1,._section_1tdl3_2{gap:15px}}._root_1tdl3_1,._section_1tdl3_2{padding:6px 15px 10px}@media screen and (min-width: 30em){._root_1tdl3_1,._section_1tdl3_2{padding:10px 40px 15px}}._wrapSwitch_1tdl3_26{height:40px;display:flex;align-items:center}._sep_1tdl3_32{max-width:900px;padding:0 15px}@media screen and (min-width: 30em){._sep_1tdl3_32{padding:0 40px}}._sep_1tdl3_32>div{border-top:1px dashed #373737}._label_1tdl3_45{padding:11px 0}._fieldset_1ghjp_1{margin:0;padding:0;border:0;display:flex;flex-wrap:wrap}._input_1ghjp_9+._cnt_1ghjp_9{border:1px solid transparent;border-radius:8px;cursor:pointer;margin-right:5px;margin-bottom:5px}._input_1ghjp_9:focus+._cnt_1ghjp_9{border-color:#387cec}._input_1ghjp_9:checked+._cnt_1ghjp_9{border-color:#387cec} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Connections.1e70ab68.css: -------------------------------------------------------------------------------- 1 | .react-tabs{-webkit-tap-highlight-color:transparent}.react-tabs__tab-list{margin:0 0 10px;padding:0 30px}.react-tabs__tab{display:inline-flex;align-items:center;border:1px solid transparent;border-radius:5px;bottom:-1px;position:relative;list-style:none;padding:6px 10px;cursor:pointer;font-size:1.2em;opacity:.5}.react-tabs__tab--selected{opacity:1}.react-tabs__tab--disabled{color:GrayText;cursor:default}.react-tabs__tab:focus{border-color:#0188fe;outline:none}.react-tabs__tab:focus:after{content:"";position:absolute}.react-tabs__tab-panel{display:none}.react-tabs__tab-panel--selected{display:block}._placeHolder_12xws_1{height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-background);opacity:.1}._connQty_12xws_10{font-family:var(--font-normal);font-size:.75em;margin-left:3px;padding:2px 7px;display:inline-flex;justify-content:center;align-items:center;background-color:var(--bg-near-transparent);border-radius:30px}._inputWrapper_12xws_22{margin:0 30px;width:100%;max-width:350px;justify-self:flex-end}._input_12xws_22{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:18px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:36px;outline:none;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._tr_198pq_1{display:grid;grid-template-columns:repeat(11,minmax(-webkit-max-content,auto));grid-template-columns:repeat(11,minmax(max-content,auto))}._th_198pq_7{padding:8px 10px;height:50px;background:var(--color-background);position:-webkit-sticky;position:sticky;top:0;font-size:.8em;text-align:center;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:space-between}._th_198pq_7:hover{color:var(--color-text-highlight)}._td_198pq_24{padding:8px 13px;font-size:.9em;font-family:var(--font-normal)}._td_198pq_24._odd_198pq_30{background:var(--color-row-odd)}._du_198pq_35{text-align:right}._sortIconContainer_198pq_39{display:inline-flex;margin-left:10px;width:16px;height:16px}._rotate180_198pq_46{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._overlay_148w6_1{background-color:#0009}._cnt_148w6_5{background-color:var(--bg-modal);color:var(--color-text);max-width:300px;line-height:1.4;-webkit-transform:translate(-50%,-50%) scale(1.2);transform:translate(-50%,-50%) scale(1.2);opacity:.6;transition:all .3s ease}._afterOpen_148w6_15{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}._btngrp_148w6_20{display:flex;align-items:center;justify-content:center;margin-top:30px} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Connections.c7e8fa7e.css: -------------------------------------------------------------------------------- 1 | .react-tabs{-webkit-tap-highlight-color:transparent}.react-tabs__tab-list{margin:0 0 10px;padding:0 30px}.react-tabs__tab{display:inline-flex;align-items:center;border:1px solid transparent;border-radius:5px;bottom:-1px;position:relative;list-style:none;padding:6px 10px;cursor:pointer;font-size:1.2em;opacity:.5}.react-tabs__tab--selected{opacity:1}.react-tabs__tab--disabled{color:GrayText;cursor:default}.react-tabs__tab:focus{border-color:#0188fe;outline:none}.react-tabs__tab:focus:after{content:"";position:absolute}.react-tabs__tab-panel{display:none}.react-tabs__tab-panel--selected{display:block}._placeHolder_12xws_1{height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-background);opacity:.1}._connQty_12xws_10{font-family:var(--font-normal);font-size:.75em;margin-left:3px;padding:2px 7px;display:inline-flex;justify-content:center;align-items:center;background-color:var(--bg-near-transparent);border-radius:30px}._inputWrapper_12xws_22{margin:0 30px;width:100%;max-width:350px;justify-self:flex-end}._input_12xws_22{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:18px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:36px;outline:none;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._tr_198pq_1{display:grid;grid-template-columns:repeat(11,minmax(-webkit-max-content,auto));grid-template-columns:repeat(11,minmax(max-content,auto))}._th_198pq_7{padding:8px 10px;height:50px;background:var(--color-background);position:-webkit-sticky;position:sticky;top:0;font-size:.8em;text-align:center;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:space-between}._th_198pq_7:hover{color:var(--color-text-highlight)}._td_198pq_24{padding:8px 13px;font-size:.9em;font-family:var(--font-normal)}._td_198pq_24._odd_198pq_30{background:var(--color-row-odd)}._du_198pq_35{text-align:right}._sortIconContainer_198pq_39{display:inline-flex;margin-left:10px;width:16px;height:16px}._rotate180_198pq_46{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._overlay_148w6_1{background-color:#0009}._cnt_148w6_5{background-color:var(--bg-modal);color:var(--color-text);max-width:300px;line-height:1.4;-webkit-transform:translate(-50%,-50%) scale(1.2);transform:translate(-50%,-50%) scale(1.2);opacity:.6;transition:all .3s ease}._afterOpen_148w6_15{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}._btngrp_148w6_20{display:flex;align-items:center;justify-content:center;margin-top:30px} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Fab.33a60e0e.css: -------------------------------------------------------------------------------- 1 | .rtf{box-sizing:border-box;margin:25px;position:fixed;white-space:nowrap;z-index:9998;padding-left:0;list-style:none}.rtf.open .rtf--mb{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.rtf.open .rtf--mb>ul{list-style:none;margin:0;padding:0}.rtf.open .rtf--ab__c:hover>span{transition:ease-in-out opacity .2s;opacity:.9}.rtf.open .rtf--ab__c>span.always-show{transition:ease-in-out opacity .2s;opacity:.9}.rtf.open .rtf--ab__c:nth-child(1){-webkit-transform:translateY(-60px) scale(1);transform:translateY(-60px) scale(1);transition-delay:.03s}.rtf.open .rtf--ab__c:nth-child(1).top{-webkit-transform:translateY(60px) scale(1);transform:translateY(60px) scale(1)}.rtf.open .rtf--ab__c:nth-child(2){-webkit-transform:translateY(-120px) scale(1);transform:translateY(-120px) scale(1);transition-delay:.09s}.rtf.open .rtf--ab__c:nth-child(2).top{-webkit-transform:translateY(120px) scale(1);transform:translateY(120px) scale(1)}.rtf.open .rtf--ab__c:nth-child(3){-webkit-transform:translateY(-180px) scale(1);transform:translateY(-180px) scale(1);transition-delay:.12s}.rtf.open .rtf--ab__c:nth-child(3).top{-webkit-transform:translateY(180px) scale(1);transform:translateY(180px) scale(1)}.rtf.open .rtf--ab__c:nth-child(4){-webkit-transform:translateY(-240px) scale(1);transform:translateY(-240px) scale(1);transition-delay:.15s}.rtf.open .rtf--ab__c:nth-child(4).top{-webkit-transform:translateY(240px) scale(1);transform:translateY(240px) scale(1)}.rtf.open .rtf--ab__c:nth-child(5){-webkit-transform:translateY(-300px) scale(1);transform:translateY(-300px) scale(1);transition-delay:.18s}.rtf.open .rtf--ab__c:nth-child(5).top{-webkit-transform:translateY(300px) scale(1);transform:translateY(300px) scale(1)}.rtf.open .rtf--ab__c:nth-child(6){-webkit-transform:translateY(-360px) scale(1);transform:translateY(-360px) scale(1);transition-delay:.21s}.rtf.open .rtf--ab__c:nth-child(6).top{-webkit-transform:translateY(360px) scale(1);transform:translateY(360px) scale(1)}.rtf--mb__c{padding:25px;margin:-25px}.rtf--mb__c *:last-child{margin-bottom:0}.rtf--mb__c:hover>span{transition:ease-in-out opacity .2s;opacity:.9}.rtf--mb__c>span.always-show{transition:ease-in-out opacity .2s;opacity:.9}.rtf--mb__c>span{opacity:0;transition:ease-in-out opacity .2s;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:6px;margin-left:4px;background:rgba(0,0,0,.75);padding:2px 4px;border-radius:2px;color:#fff;font-size:13px;box-shadow:0 0 4px #00000024,0 4px 8px #00000047}.rtf--mb__c>span.right{right:100%}.rtf--mb{width:48px;height:48px;background:var(--btn-bg);z-index:9999;display:inline-flex;justify-content:center;align-items:center;position:relative;border:none;border-radius:50%;box-shadow:0 0 4px #00000024,0 4px 8px #00000047;cursor:pointer;outline:none;padding:0;-webkit-user-drag:none;font-weight:700;color:#f1f1f1;font-size:18px}.rtf--mb>*{transition:ease-in-out transform .2s}.rtf--ab__c{display:block;position:absolute;top:0;right:1px;padding:10px 0;margin:-10px 0;transition:ease-in-out transform .2s}.rtf--ab__c>span{opacity:0;transition:ease-in-out opacity .2s;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:6px;background:rgba(0,0,0,.75);padding:2px 4px;border-radius:2px;color:#fff;font-size:13px;box-shadow:0 0 4px #00000024,0 4px 8px #00000047}.rtf--ab__c>span.right{right:100%}.rtf--ab__c:nth-child(1){-webkit-transform:translateY(-60px) scale(0);transform:translateY(-60px) scale(0);transition-delay:.21s}.rtf--ab__c:nth-child(1).top{-webkit-transform:translateY(60px) scale(0);transform:translateY(60px) scale(0)}.rtf--ab__c:nth-child(2){-webkit-transform:translateY(-120px) scale(0);transform:translateY(-120px) scale(0);transition-delay:.18s}.rtf--ab__c:nth-child(2).top{-webkit-transform:translateY(120px) scale(0);transform:translateY(120px) scale(0)}.rtf--ab__c:nth-child(3){-webkit-transform:translateY(-180px) scale(0);transform:translateY(-180px) scale(0);transition-delay:.15s}.rtf--ab__c:nth-child(3).top{-webkit-transform:translateY(180px) scale(0);transform:translateY(180px) scale(0)}.rtf--ab__c:nth-child(4){-webkit-transform:translateY(-240px) scale(0);transform:translateY(-240px) scale(0);transition-delay:.12s}.rtf--ab__c:nth-child(4).top{-webkit-transform:translateY(240px) scale(0);transform:translateY(240px) scale(0)}.rtf--ab__c:nth-child(5){-webkit-transform:translateY(-300px) scale(0);transform:translateY(-300px) scale(0);transition-delay:.09s}.rtf--ab__c:nth-child(5).top{-webkit-transform:translateY(300px) scale(0);transform:translateY(300px) scale(0)}.rtf--ab__c:nth-child(6){-webkit-transform:translateY(-360px) scale(0);transform:translateY(-360px) scale(0);transition-delay:.03s}.rtf--ab__c:nth-child(6).top{-webkit-transform:translateY(360px) scale(0);transform:translateY(360px) scale(0)}.rtf--ab{height:40px;width:40px;margin-right:4px;background-color:#aaa;display:inline-flex;justify-content:center;align-items:center;position:relative;border:none;border-radius:50%;box-shadow:0 0 4px #00000024,0 4px 8px #00000047;cursor:pointer;outline:none;padding:0;-webkit-user-drag:none;font-weight:700;color:#f1f1f1;font-size:16px;z-index:10000}.rtf--ab:hover{background:#387cec;border:1px solid #387cec;color:#fff}.rtf--ab:focus{border-color:var(--color-focus-blue)}._spining_4i8sg_1{position:relative;border-radius:50%;background:linear-gradient(60deg,#e66465,#9198e5);width:48px;height:48px;display:flex;justify-content:center;align-items:center}._spining_4i8sg_1:before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;-webkit-animation:_spining_keyframes_4i8sg_1 1s linear infinite;animation:_spining_keyframes_4i8sg_1 1s linear infinite}@-webkit-keyframes _spining_keyframes_4i8sg_1{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes _spining_keyframes_4i8sg_1{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Fab.4a89b536.js: -------------------------------------------------------------------------------- 1 | import{j as e,b,h as y,r as l}from"./index.31d0d1dc.js";const F="_spining_4i8sg_1",M="_spining_keyframes_4i8sg_1",j={spining:F,spining_keyframes:M},{useState:v}=y;function B({children:s}){return e("span",{className:j.spining,children:s})}const H={right:10,bottom:10},L=({children:s,...n})=>e("button",{type:"button",...n,className:"rtf--ab",children:s}),E=({children:s,...n})=>e("button",{type:"button",className:"rtf--mb",...n,children:s}),O={bottom:24,right:24},R=({event:s="hover",style:n=O,alwaysShowTitle:i=!1,children:f,icon:g,mainButtonStyles:h,onClick:p,text:d,..._})=>{const[a,r]=v(!1),c=i||!a,u=()=>r(!0),m=()=>r(!1),x=()=>s==="hover"&&u(),k=()=>s==="hover"&&m(),N=t=>p?p(t):(t.persist(),s==="click"?a?m():u():null),$=(t,o)=>{t.persist(),r(!1),setTimeout(()=>{o(t)},1)},C=()=>l.exports.Children.map(f,(t,o)=>l.exports.isValidElement(t)?b("li",{className:`rtf--ab__c ${"top"in n?"top":""}`,children:[l.exports.cloneElement(t,{"data-testid":`action-button-${o}`,"aria-label":t.props.text||`Menu button ${o+1}`,"aria-hidden":c,tabIndex:a?0:-1,...t.props,onClick:I=>{t.props.onClick&&$(I,t.props.onClick)}}),t.props.text&&e("span",{className:`${"right"in n?"right":""} ${i?"always-show":""}`,"aria-hidden":c,children:t.props.text})]}):null);return e("ul",{onMouseEnter:x,onMouseLeave:k,className:`rtf ${a?"open":"closed"}`,"data-testid":"fab",style:n,..._,children:b("li",{className:"rtf--mb__c",children:[e(E,{onClick:N,style:h,"data-testid":"main-button",role:"button","aria-label":"Floating menu",tabIndex:0,children:g}),d&&e("span",{className:`${"right"in n?"right":""} ${i?"always-show":""}`,"aria-hidden":c,children:d}),e("ul",{children:C()})]})})};export{L as A,R as F,B as I,H as p}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Fab.78b2c04b.js: -------------------------------------------------------------------------------- 1 | var A=Object.defineProperty,B=Object.defineProperties;var j=Object.getOwnPropertyDescriptors;var p=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var _=(t,e,s)=>e in t?A(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s,o=(t,e)=>{for(var s in e||(e={}))k.call(e,s)&&_(t,s,e[s]);if(p)for(var s of p(e))N.call(e,s)&&_(t,s,e[s]);return t},b=(t,e)=>B(t,j(e));var c=(t,e)=>{var s={};for(var n in t)k.call(t,n)&&e.indexOf(n)<0&&(s[n]=t[n]);if(t!=null&&p)for(var n of p(t))e.indexOf(n)<0&&N.call(t,n)&&(s[n]=t[n]);return s};import{r,j as H}from"./vendor.3cf270b6.js";const L="_spining_4i8sg_1",R="_spining_keyframes_4i8sg_1";var V={spining:L,spining_keyframes:R};const{useState:q}=H;function K({children:t}){return r.exports.createElement("span",{className:V.spining},t)}const P={right:10,bottom:10},Q=s=>{var n=s,{children:t}=n,e=c(n,["children"]);return r.exports.createElement("button",b(o({type:"button"},e),{className:"rtf--ab"}),t)},w=s=>{var n=s,{children:t}=n,e=c(n,["children"]);return r.exports.createElement("button",o({type:"button",className:"rtf--mb"},e),t)},z={bottom:24,right:24},S=D=>{var g=D,{event:t="hover",style:e=z,alwaysShowTitle:s=!1,children:n,icon:$,mainButtonStyles:h,onClick:d,text:f}=g,v=c(g,["event","style","alwaysShowTitle","children","icon","mainButtonStyles","onClick","text"]);const[i,m]=q(!1),u=s||!i,x=()=>m(!0),E=()=>m(!1),C=()=>t==="hover"&&x(),I=()=>t==="hover"&&E(),y=a=>d?d(a):(a.persist(),t==="click"?i?E():x():null),F=(a,l)=>{a.persist(),m(!1),setTimeout(()=>{l(a)},1)},M=()=>r.exports.Children.map(n,(a,l)=>r.exports.isValidElement(a)?r.exports.createElement("li",{className:`rtf--ab__c ${"top"in e?"top":""}`},r.exports.cloneElement(a,b(o({"data-testid":`action-button-${l}`,"aria-label":a.props.text||`Menu button ${l+1}`,"aria-hidden":u,tabIndex:i?0:-1},a.props),{onClick:O=>{a.props.onClick&&F(O,a.props.onClick)}})),a.props.text&&r.exports.createElement("span",{className:`${"right"in e?"right":""} ${s?"always-show":""}`,"aria-hidden":u},a.props.text)):null);return r.exports.createElement("ul",o({onMouseEnter:C,onMouseLeave:I,className:`rtf ${i?"open":"closed"}`,"data-testid":"fab",style:e},v),r.exports.createElement("li",{className:"rtf--mb__c"},r.exports.createElement(w,{onClick:y,style:h,"data-testid":"main-button",role:"button","aria-label":"Floating menu",tabIndex:0},$),f&&r.exports.createElement("span",{className:`${"right"in e?"right":""} ${s?"always-show":""}`,"aria-hidden":u},f),r.exports.createElement("ul",null,M())))};export{Q as A,S as F,K as I,P as p}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Fab.a0a7e573.css: -------------------------------------------------------------------------------- 1 | .rtf{box-sizing:border-box;margin:25px;position:fixed;white-space:nowrap;z-index:9998;padding-left:0;list-style:none}.rtf.open .rtf--mb{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.rtf.open .rtf--mb>ul{list-style:none;margin:0;padding:0}.rtf.open .rtf--ab__c:hover>span{transition:ease-in-out opacity .2s;opacity:.9}.rtf.open .rtf--ab__c>span.always-show{transition:ease-in-out opacity .2s;opacity:.9}.rtf.open .rtf--ab__c:nth-child(1){-webkit-transform:translateY(-60px) scale(1);transform:translateY(-60px) scale(1);transition-delay:.03s}.rtf.open .rtf--ab__c:nth-child(1).top{-webkit-transform:translateY(60px) scale(1);transform:translateY(60px) scale(1)}.rtf.open .rtf--ab__c:nth-child(2){-webkit-transform:translateY(-120px) scale(1);transform:translateY(-120px) scale(1);transition-delay:.09s}.rtf.open .rtf--ab__c:nth-child(2).top{-webkit-transform:translateY(120px) scale(1);transform:translateY(120px) scale(1)}.rtf.open .rtf--ab__c:nth-child(3){-webkit-transform:translateY(-180px) scale(1);transform:translateY(-180px) scale(1);transition-delay:.12s}.rtf.open .rtf--ab__c:nth-child(3).top{-webkit-transform:translateY(180px) scale(1);transform:translateY(180px) scale(1)}.rtf.open .rtf--ab__c:nth-child(4){-webkit-transform:translateY(-240px) scale(1);transform:translateY(-240px) scale(1);transition-delay:.15s}.rtf.open .rtf--ab__c:nth-child(4).top{-webkit-transform:translateY(240px) scale(1);transform:translateY(240px) scale(1)}.rtf.open .rtf--ab__c:nth-child(5){-webkit-transform:translateY(-300px) scale(1);transform:translateY(-300px) scale(1);transition-delay:.18s}.rtf.open .rtf--ab__c:nth-child(5).top{-webkit-transform:translateY(300px) scale(1);transform:translateY(300px) scale(1)}.rtf.open .rtf--ab__c:nth-child(6){-webkit-transform:translateY(-360px) scale(1);transform:translateY(-360px) scale(1);transition-delay:.21s}.rtf.open .rtf--ab__c:nth-child(6).top{-webkit-transform:translateY(360px) scale(1);transform:translateY(360px) scale(1)}.rtf--mb__c{padding:25px;margin:-25px}.rtf--mb__c *:last-child{margin-bottom:0}.rtf--mb__c:hover>span{transition:ease-in-out opacity .2s;opacity:.9}.rtf--mb__c>span.always-show{transition:ease-in-out opacity .2s;opacity:.9}.rtf--mb__c>span{opacity:0;transition:ease-in-out opacity .2s;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:6px;margin-left:4px;background:rgba(0,0,0,.75);padding:2px 4px;border-radius:2px;color:#fff;font-size:13px;box-shadow:0 0 4px #00000024,0 4px 8px #00000047}.rtf--mb__c>span.right{right:100%}.rtf--mb{width:48px;height:48px;background:var(--btn-bg);z-index:9999;display:inline-flex;justify-content:center;align-items:center;position:relative;border:none;border-radius:50%;box-shadow:0 0 4px #00000024,0 4px 8px #00000047;cursor:pointer;outline:none;padding:0;-webkit-user-drag:none;font-weight:700;color:#f1f1f1;font-size:18px}.rtf--mb>*{transition:ease-in-out transform .2s}.rtf--ab__c{display:block;position:absolute;top:0;right:1px;padding:10px 0;margin:-10px 0;transition:ease-in-out transform .2s}.rtf--ab__c>span{opacity:0;transition:ease-in-out opacity .2s;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:6px;background:rgba(0,0,0,.75);padding:2px 4px;border-radius:2px;color:#fff;font-size:13px;box-shadow:0 0 4px #00000024,0 4px 8px #00000047}.rtf--ab__c>span.right{right:100%}.rtf--ab__c:nth-child(1){-webkit-transform:translateY(-60px) scale(0);transform:translateY(-60px) scale(0);transition-delay:.21s}.rtf--ab__c:nth-child(1).top{-webkit-transform:translateY(60px) scale(0);transform:translateY(60px) scale(0)}.rtf--ab__c:nth-child(2){-webkit-transform:translateY(-120px) scale(0);transform:translateY(-120px) scale(0);transition-delay:.18s}.rtf--ab__c:nth-child(2).top{-webkit-transform:translateY(120px) scale(0);transform:translateY(120px) scale(0)}.rtf--ab__c:nth-child(3){-webkit-transform:translateY(-180px) scale(0);transform:translateY(-180px) scale(0);transition-delay:.15s}.rtf--ab__c:nth-child(3).top{-webkit-transform:translateY(180px) scale(0);transform:translateY(180px) scale(0)}.rtf--ab__c:nth-child(4){-webkit-transform:translateY(-240px) scale(0);transform:translateY(-240px) scale(0);transition-delay:.12s}.rtf--ab__c:nth-child(4).top{-webkit-transform:translateY(240px) scale(0);transform:translateY(240px) scale(0)}.rtf--ab__c:nth-child(5){-webkit-transform:translateY(-300px) scale(0);transform:translateY(-300px) scale(0);transition-delay:.09s}.rtf--ab__c:nth-child(5).top{-webkit-transform:translateY(300px) scale(0);transform:translateY(300px) scale(0)}.rtf--ab__c:nth-child(6){-webkit-transform:translateY(-360px) scale(0);transform:translateY(-360px) scale(0);transition-delay:.03s}.rtf--ab__c:nth-child(6).top{-webkit-transform:translateY(360px) scale(0);transform:translateY(360px) scale(0)}.rtf--ab{height:40px;width:40px;margin-right:4px;background-color:#aaa;display:inline-flex;justify-content:center;align-items:center;position:relative;border:none;border-radius:50%;box-shadow:0 0 4px #00000024,0 4px 8px #00000047;cursor:pointer;outline:none;padding:0;-webkit-user-drag:none;font-weight:700;color:#f1f1f1;font-size:16px;z-index:10000}.rtf--ab:hover{background:#387cec;border:1px solid #387cec;color:#fff}.rtf--ab:focus{border-color:var(--color-focus-blue)}._spining_4i8sg_1{position:relative;border-radius:50%;background:linear-gradient(60deg,#e66465,#9198e5);width:48px;height:48px;display:flex;justify-content:center;align-items:center}._spining_4i8sg_1:before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;-webkit-animation:_spining_keyframes_4i8sg_1 1s linear infinite;animation:_spining_keyframes_4i8sg_1 1s linear infinite}@-webkit-keyframes _spining_keyframes_4i8sg_1{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes _spining_keyframes_4i8sg_1{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Fab.b64825a9.js: -------------------------------------------------------------------------------- 1 | var B=Object.defineProperty,H=Object.defineProperties;var L=Object.getOwnPropertyDescriptors;var p=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var k=(t,s,n)=>s in t?B(t,s,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[s]=n,o=(t,s)=>{for(var n in s||(s={}))N.call(s,n)&&k(t,n,s[n]);if(p)for(var n of p(s))$.call(s,n)&&k(t,n,s[n]);return t},r=(t,s)=>H(t,L(s));var d=(t,s)=>{var n={};for(var e in t)N.call(t,e)&&s.indexOf(e)<0&&(n[e]=t[e]);if(t!=null&&p)for(var e of p(t))s.indexOf(e)<0&&$.call(t,e)&&(n[e]=t[e]);return n};import{j as i,b as v,r as b,h as R}from"./index.27058ddf.js";const V="_spining_4i8sg_1",q="_spining_keyframes_4i8sg_1";var w={spining:V,spining_keyframes:q};const{useState:z}=R;function Q({children:t}){return i("span",{className:w.spining,children:t})}const S={right:10,bottom:10},U=n=>{var e=n,{children:t}=e,s=d(e,["children"]);return i("button",r(o({type:"button"},s),{className:"rtf--ab",children:t}))},D=n=>{var e=n,{children:t}=e,s=d(e,["children"]);return i("button",r(o({type:"button",className:"rtf--mb"},s),{children:t}))},G={bottom:24,right:24},W=J=>{var h=J,{event:t="hover",style:s=G,alwaysShowTitle:n=!1,children:e,icon:C,mainButtonStyles:I,onClick:f,text:g}=h,y=d(h,["event","style","alwaysShowTitle","children","icon","mainButtonStyles","onClick","text"]);const[l,u]=z(!1),m=n||!l,_=()=>u(!0),x=()=>u(!1),F=()=>t==="hover"&&_(),M=()=>t==="hover"&&x(),j=a=>f?f(a):(a.persist(),t==="click"?l?x():_():null),E=(a,c)=>{a.persist(),u(!1),setTimeout(()=>{c(a)},1)},O=()=>b.exports.Children.map(e,(a,c)=>b.exports.isValidElement(a)?v("li",{className:`rtf--ab__c ${"top"in s?"top":""}`,children:[b.exports.cloneElement(a,r(o({"data-testid":`action-button-${c}`,"aria-label":a.props.text||`Menu button ${c+1}`,"aria-hidden":m,tabIndex:l?0:-1},a.props),{onClick:A=>{a.props.onClick&&E(A,a.props.onClick)}})),a.props.text&&i("span",{className:`${"right"in s?"right":""} ${n?"always-show":""}`,"aria-hidden":m,children:a.props.text})]}):null);return i("ul",r(o({onMouseEnter:F,onMouseLeave:M,className:`rtf ${l?"open":"closed"}`,"data-testid":"fab",style:s},y),{children:v("li",{className:"rtf--mb__c",children:[i(D,{onClick:j,style:I,"data-testid":"main-button",role:"button","aria-label":"Floating menu",tabIndex:0,children:C}),g&&i("span",{className:`${"right"in s?"right":""} ${n?"always-show":""}`,"aria-hidden":m,children:g}),i("ul",{children:O()})]})}))};export{U as A,W as F,Q as I,S as p}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Logs.029b1e0c.css: -------------------------------------------------------------------------------- 1 | ._RuleSearch_1gcst_1{padding:0 40px 5px}._RuleSearchContainer_1gcst_5{position:relative;height:40px}._inputWrapper_1gcst_10{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._input_1gcst_10{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._iconWrapper_1gcst_35{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}._logMeta_1dg5t_1{display:flex;align-items:center;flex-wrap:wrap;font-size:.9em}._logType_1dg5t_8{color:#eee;flex-shrink:0;text-align:center;width:66px;border-radius:100px;padding:3px 5px;margin:0 8px}._logTime_1dg5t_18{flex-shrink:0;color:#999;font-size:14px}._logText_1dg5t_24{flex-shrink:0;display:flex;font-family:Roboto Mono,Menlo,monospace;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._logsWrapper_1dg5t_37{margin:0;padding:0;color:var(--color-text)}._logsWrapper_1dg5t_37 .log{padding:10px 40px;background:var(--color-background)}._logsWrapper_1dg5t_37 .log.even{background:var(--color-background)}._logPlaceholder_1dg5t_51{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._logPlaceholder_1dg5t_51 div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}._logPlaceholderIcon_1dg5t_64{opacity:.3} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Logs.0a3446ce.js: -------------------------------------------------------------------------------- 1 | var R=Object.defineProperty,w=Object.defineProperties;var C=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var T=(e,t,o)=>t in e?R(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,p=(e,t)=>{for(var o in t||(t={}))N.call(t,o)&&T(e,o,t[o]);if(S)for(var o of S(t))W.call(t,o)&&T(e,o,t[o]);return e},m=(e,t)=>w(e,C(t));import{r as _,b as l,j as a,P as f,d as P,G as k,H as j,w as z,J as I,u as O,C as F,S as M,K as $,L as H,g as A,N as B,h as D,c as E}from"./index.27058ddf.js";import{a as K,F as q}from"./index.esm.f1f118db.js";import{r as G,s as J,f as V}from"./logs.7cc467a0.js";import{d as Y}from"./debounce.d080d5e1.js";import{u as Q}from"./useRemainingViewPortHeight.49042856.js";import{F as U,p as X}from"./Fab.b64825a9.js";import{P as Z,a as ee}from"./play.1bfea717.js";function te(e,t){if(e==null)return{};var o=oe(e,t),n,r;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&(!Object.prototype.propertyIsEnumerable.call(e,n)||(o[n]=e[n]))}return o}function oe(e,t){if(e==null)return{};var o={},n=Object.keys(e),r,s;for(s=0;s=0)&&(o[r]=e[r]);return o}var x=_.exports.forwardRef(function(e,t){var o=e.color,n=o===void 0?"currentColor":o,r=e.size,s=r===void 0?24:r,g=te(e,["color","size"]);return l("svg",m(p({ref:t,xmlns:"http://www.w3.org/2000/svg",width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:n,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},g),{children:[a("circle",{cx:"11",cy:"11",r:"8"}),a("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]}))});x.propTypes={color:f.string,size:f.oneOfType([f.string,f.number])};x.displayName="Search";var re=x;const ae="_RuleSearch_1gcst_1",ne="_RuleSearchContainer_1gcst_5",se="_inputWrapper_1gcst_10",ce="_input_1gcst_10",ie="_iconWrapper_1gcst_35";var d={RuleSearch:ae,RuleSearchContainer:ne,inputWrapper:se,input:ce,iconWrapper:ie};function le({dispatch:e,searchText:t,updateSearchText:o}){const[n,r]=_.exports.useState(t),s=_.exports.useCallback(i=>{e(o(i))},[e,o]),g=_.exports.useMemo(()=>Y(s,300),[s]),h=i=>{r(i.target.value),g(i.target.value)};return a("div",{className:d.RuleSearch,children:l("div",{className:d.RuleSearchContainer,children:[a("div",{className:d.inputWrapper,children:a("input",{type:"text",value:n,onChange:h,className:d.input})}),a("div",{className:d.iconWrapper,children:a(re,{size:20})})]})})}const ge=e=>({searchText:k(e),updateSearchText:j});var pe=P(ge)(le);const de="_logMeta_1dg5t_1",he="_logType_1dg5t_8",ue="_logTime_1dg5t_18",me="_logText_1dg5t_24",fe="_logsWrapper_1dg5t_37",_e="_logPlaceholder_1dg5t_51",ve="_logPlaceholderIcon_1dg5t_64";var c={logMeta:de,logType:he,logTime:ue,logText:me,logsWrapper:fe,logPlaceholder:_e,logPlaceholderIcon:ve};const{useCallback:b,memo:xe,useEffect:ye}=D,v=30,Se={debug:"#28792c",info:"var(--bg-log-info-tag)",warning:"#b99105",error:"#c11c1c"};function Te({time:e,even:t,payload:o,type:n}){const r=E({even:t},"log");return a("div",{className:r,children:l("div",{className:c.logMeta,children:[a("div",{className:c.logTime,children:e}),a("div",{className:c.logType,style:{backgroundColor:Se[n]},children:n}),a("div",{className:c.logText,children:o})]})})}function be(e,t){return t[e].id}const Pe=xe(({index:e,style:t,data:o})=>{const n=o[e];return a("div",{style:t,children:a(Te,p({},n))})},K);function Le({dispatch:e,logLevel:t,apiConfig:o,logs:n,logStreamingPaused:r}){const s=z(),g=b(()=>{r?G(m(p({},o),{logLevel:t})):J(),s.app.updateAppConfig("logStreamingPaused",!r)},[o,t,r,s.app]),h=b(L=>e(I(L)),[e]);ye(()=>{V(m(p({},o),{logLevel:t}),h)},[o,t,h]);const[i,y]=Q(),{t:u}=O();return l("div",{children:[a(F,{title:u("Logs")}),a(pe,{}),a("div",{ref:i,style:{paddingBottom:v},children:n.length===0?l("div",{className:c.logPlaceholder,style:{height:y-v},children:[a("div",{className:c.logPlaceholderIcon,children:a(M,{width:200,height:200})}),a("div",{children:u("no_logs")})]}):l("div",{className:c.logsWrapper,children:[a(q,{height:y-v,width:"100%",itemCount:n.length,itemSize:80,itemData:n,itemKey:be,children:Pe}),a(U,{icon:r?a(Z,{size:16}):a(ee,{size:16}),mainButtonStyles:r?{background:"#e74c3c"}:{},style:X,text:u(r?"Resume Refresh":"Pause Refresh"),onClick:g})]})})]})}const Re=e=>({logs:$(e),logLevel:H(e),apiConfig:A(e),logStreamingPaused:B(e)});var Oe=P(Re)(Le);export{Oe as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Logs.2ca4cbd7.js: -------------------------------------------------------------------------------- 1 | import{r as m,b as l,j as o,i as u,d as y,H as T,J as b,x as L,K as P,u as R,C,S as N,L as W,N as w,g as k,O as j,h as z,c as I}from"./index.31d0d1dc.js";import{a as O,F}from"./index.esm.8c5915bf.js";import{r as M,s as $,f as H}from"./logs.975cc896.js";import{d as A}from"./debounce.c2d20996.js";import{u as B}from"./useRemainingViewPortHeight.76d7ff5c.js";import{F as D,p as E}from"./Fab.4a89b536.js";import{P as K,a as q}from"./play.42659ab6.js";function J(e,s){if(e==null)return{};var r=V(e,s),n,t;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(t=0;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,n)||(r[n]=e[n]))}return r}function V(e,s){if(e==null)return{};var r={},n=Object.keys(e),t,a;for(a=0;a=0)&&(r[t]=e[t]);return r}var _=m.exports.forwardRef(function(e,s){var r=e.color,n=r===void 0?"currentColor":r,t=e.size,a=t===void 0?24:t,p=J(e,["color","size"]);return l("svg",{ref:s,xmlns:"http://www.w3.org/2000/svg",width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:n,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...p,children:[o("circle",{cx:"11",cy:"11",r:"8"}),o("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})});_.propTypes={color:u.exports.string,size:u.exports.oneOfType([u.exports.string,u.exports.number])};_.displayName="Search";const Y=_,G="_RuleSearch_1gcst_1",Q="_RuleSearchContainer_1gcst_5",U="_inputWrapper_1gcst_10",X="_input_1gcst_10",Z="_iconWrapper_1gcst_35",g={RuleSearch:G,RuleSearchContainer:Q,inputWrapper:U,input:X,iconWrapper:Z};function ee({dispatch:e,searchText:s,updateSearchText:r}){const[n,t]=m.exports.useState(s),a=m.exports.useCallback(i=>{e(r(i))},[e,r]),p=m.exports.useMemo(()=>A(a,300),[a]),d=i=>{t(i.target.value),p(i.target.value)};return o("div",{className:g.RuleSearch,children:l("div",{className:g.RuleSearchContainer,children:[o("div",{className:g.inputWrapper,children:o("input",{type:"text",value:n,onChange:d,className:g.input})}),o("div",{className:g.iconWrapper,children:o(Y,{size:20})})]})})}const te=e=>({searchText:T(e),updateSearchText:b}),oe=y(te)(ee),re="_logMeta_1dg5t_1",ne="_logType_1dg5t_8",se="_logTime_1dg5t_18",ae="_logText_1dg5t_24",ce="_logsWrapper_1dg5t_37",ie="_logPlaceholder_1dg5t_51",le="_logPlaceholderIcon_1dg5t_64",c={logMeta:re,logType:ne,logTime:se,logText:ae,logsWrapper:ce,logPlaceholder:ie,logPlaceholderIcon:le},{useCallback:x,memo:pe,useEffect:ge}=z,f=30,de={debug:"#28792c",info:"var(--bg-log-info-tag)",warning:"#b99105",error:"#c11c1c"};function he({time:e,even:s,payload:r,type:n}){const t=I({even:s},"log");return o("div",{className:t,children:l("div",{className:c.logMeta,children:[o("div",{className:c.logTime,children:e}),o("div",{className:c.logType,style:{backgroundColor:de[n]},children:n}),o("div",{className:c.logText,children:r})]})})}function ue(e,s){return s[e].id}const me=pe(({index:e,style:s,data:r})=>{const n=r[e];return o("div",{style:s,children:o(he,{...n})})},O);function fe({dispatch:e,logLevel:s,apiConfig:r,logs:n,logStreamingPaused:t}){const a=L(),p=x(()=>{t?M({...r,logLevel:s}):$(),a.app.updateAppConfig("logStreamingPaused",!t)},[r,s,t,a.app]),d=x(S=>e(P(S)),[e]);ge(()=>{H({...r,logLevel:s},d)},[r,s,d]);const[i,v]=B(),{t:h}=R();return l("div",{children:[o(C,{title:h("Logs")}),o(oe,{}),o("div",{ref:i,style:{paddingBottom:f},children:n.length===0?l("div",{className:c.logPlaceholder,style:{height:v-f},children:[o("div",{className:c.logPlaceholderIcon,children:o(N,{width:200,height:200})}),o("div",{children:h("no_logs")})]}):l("div",{className:c.logsWrapper,children:[o(F,{height:v-f,width:"100%",itemCount:n.length,itemSize:80,itemData:n,itemKey:ue,children:me}),o(D,{icon:t?o(K,{size:16}):o(q,{size:16}),mainButtonStyles:t?{background:"#e74c3c"}:{},style:E,text:h(t?"Resume Refresh":"Pause Refresh"),onClick:p})]})})]})}const _e=e=>({logs:W(e),logLevel:w(e),apiConfig:k(e),logStreamingPaused:j(e)}),Pe=y(_e)(fe);export{Pe as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Logs.d68ca431.css: -------------------------------------------------------------------------------- 1 | ._RuleSearch_1gcst_1{padding:0 40px 5px}._RuleSearchContainer_1gcst_5{position:relative;height:40px}._inputWrapper_1gcst_10{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._input_1gcst_10{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._iconWrapper_1gcst_35{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}._logMeta_1dg5t_1{display:flex;align-items:center;flex-wrap:wrap;font-size:.9em}._logType_1dg5t_8{color:#eee;flex-shrink:0;text-align:center;width:66px;border-radius:100px;padding:3px 5px;margin:0 8px}._logTime_1dg5t_18{flex-shrink:0;color:#999;font-size:14px}._logText_1dg5t_24{flex-shrink:0;display:flex;font-family:Roboto Mono,Menlo,monospace;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._logsWrapper_1dg5t_37{margin:0;padding:0;color:var(--color-text)}._logsWrapper_1dg5t_37 .log{padding:10px 40px;background:var(--color-background)}._logsWrapper_1dg5t_37 .log.even{background:var(--color-background)}._logPlaceholder_1dg5t_51{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._logPlaceholder_1dg5t_51 div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}._logPlaceholderIcon_1dg5t_64{opacity:.3} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Logs.e13d481f.js: -------------------------------------------------------------------------------- 1 | var T=Object.defineProperty,C=Object.defineProperties;var y=Object.getOwnPropertyDescriptors;var E=Object.getOwnPropertySymbols;var L=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var v=(e,t,a)=>t in e?T(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a,u=(e,t)=>{for(var a in t||(t={}))L.call(t,a)&&v(e,a,t[a]);if(E)for(var a of E(t))N.call(t,a)&&v(e,a,t[a]);return e},h=(e,t)=>C(e,y(t));import{r as o,R as l,K as P,k as W,P as b,D as I,j as k,g as w}from"./vendor.3cf270b6.js";import{a as z,F as D}from"./index.esm.5b55aaed.js";import{r as F,s as M,f as A}from"./logs.8963bea3.js";import{c as S,w as $,x as H,k as B,y as K,C as j,S as q,z as V,A as Y,g as G,D as J}from"./index.d6596dd6.js";import{d as O}from"./debounce.76599460.js";import{u as Q}from"./useRemainingViewPortHeight.91bbcf1d.js";import{F as U,p as X}from"./Fab.78b2c04b.js";const Z="_RuleSearch_1gcst_1",ee="_RuleSearchContainer_1gcst_5",te="_inputWrapper_1gcst_10",ae="_input_1gcst_10",oe="_iconWrapper_1gcst_35";var i={RuleSearch:Z,RuleSearchContainer:ee,inputWrapper:te,input:ae,iconWrapper:oe};function re({dispatch:e,searchText:t,updateSearchText:a}){const[r,s]=o.exports.useState(t),p=o.exports.useCallback(c=>{e(a(c))},[e,a]),d=o.exports.useMemo(()=>O(p,300),[p]),g=c=>{s(c.target.value),d(c.target.value)};return l.createElement("div",{className:i.RuleSearch},l.createElement("div",{className:i.RuleSearchContainer},l.createElement("div",{className:i.inputWrapper},l.createElement("input",{type:"text",value:r,onChange:g,className:i.input})),l.createElement("div",{className:i.iconWrapper},l.createElement(P,{size:20}))))}const se=e=>({searchText:$(e),updateSearchText:H});var ne=S(se)(re);const ce="_logMeta_1dg5t_1",le="_logType_1dg5t_8",pe="_logTime_1dg5t_18",ie="_logText_1dg5t_24",ge="_logsWrapper_1dg5t_37",me="_logPlaceholder_1dg5t_51",ue="_logPlaceholderIcon_1dg5t_64";var n={logMeta:ce,logType:le,logTime:pe,logText:ie,logsWrapper:ge,logPlaceholder:me,logPlaceholderIcon:ue};const{useCallback:f,memo:de,useEffect:he}=k,x=30,xe={debug:"#28792c",info:"var(--bg-log-info-tag)",warning:"#b99105",error:"#c11c1c"};function _e({time:e,even:t,payload:a,type:r}){const s=w({even:t},"log");return o.exports.createElement("div",{className:s},o.exports.createElement("div",{className:n.logMeta},o.exports.createElement("div",{className:n.logTime},e),o.exports.createElement("div",{className:n.logType,style:{backgroundColor:xe[r]}},r),o.exports.createElement("div",{className:n.logText},a)))}function Ee(e,t){return t[e].id}const ve=de(({index:e,style:t,data:a})=>{const r=a[e];return o.exports.createElement("div",{style:t},o.exports.createElement(_e,u({},r)))},z);function fe({dispatch:e,logLevel:t,apiConfig:a,logs:r,logStreamingPaused:s}){const p=B(),d=f(()=>{s?F(h(u({},a),{logLevel:t})):M(),p.app.updateAppConfig("logStreamingPaused",!s)},[a,t,s,p.app]),g=f(R=>e(K(R)),[e]);he(()=>{A(h(u({},a),{logLevel:t}),g)},[a,t,g]);const[c,_]=Q(),{t:m}=W();return o.exports.createElement("div",null,o.exports.createElement(j,{title:m("Logs")}),o.exports.createElement(ne,null),o.exports.createElement("div",{ref:c,style:{paddingBottom:x}},r.length===0?o.exports.createElement("div",{className:n.logPlaceholder,style:{height:_-x}},o.exports.createElement("div",{className:n.logPlaceholderIcon},o.exports.createElement(q,{width:200,height:200})),o.exports.createElement("div",null,m("no_logs"))):o.exports.createElement("div",{className:n.logsWrapper},o.exports.createElement(D,{height:_-x,width:"100%",itemCount:r.length,itemSize:80,itemData:r,itemKey:Ee},ve),o.exports.createElement(U,{icon:s?o.exports.createElement(b,{size:16}):o.exports.createElement(I,{size:16}),mainButtonStyles:s?{background:"#e74c3c"}:{},style:X,text:m(s?"Resume Refresh":"Pause Refresh"),onClick:d}))))}const Se=e=>({logs:V(e),logLevel:Y(e),apiConfig:G(e),logStreamingPaused:J(e)});var be=S(Se)(fe);export{be as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Proxies.3fa3509d.css: -------------------------------------------------------------------------------- 1 | ._FlexCenter_1380a_1{display:flex;justify-content:center;align-items:center}._header_1y9js_1{display:flex;align-items:center}._header_1y9js_1:focus{outline:none}._header_1y9js_1 ._arrow_1y9js_8{display:inline-flex;-webkit-transform:rotate(0deg);transform:rotate(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}._header_1y9js_1 ._arrow_1y9js_8._isOpen_1y9js_13{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._header_1y9js_1 ._arrow_1y9js_8:focus{outline:var(--color-focus-blue) solid 1px}._btn_1y9js_20{margin-left:5px}._qty_1y9js_25{font-family:var(--font-normal);font-size:.75em;margin-left:3px;padding:2px 7px;display:inline-flex;justify-content:center;align-items:center;background-color:var(--bg-near-transparent);border-radius:30px}._header_5pmv2_1{margin-bottom:12px}._groupHead_5pmv2_5{display:flex;flex-wrap:wrap;align-items:center}._action_5pmv2_11{margin:0 5px}._proxy_8ev0l_1{margin:3px;padding:5px;position:relative;border-radius:8px;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;outline:none;border:1px solid transparent;max-width:200px;background-color:var(--color-bg-proxy)}._proxy_8ev0l_1:focus{border:1px solid var(--color-focus-blue)}@media screen and (min-width: 30em){._proxy_8ev0l_1{min-width:200px;border-radius:10px;padding:10px}}._proxy_8ev0l_1._now_8ev0l_25{background-color:var(--color-focus-blue);color:#ddd}._proxy_8ev0l_1._error_8ev0l_29{opacity:.5}._proxy_8ev0l_1._selectable_8ev0l_32{transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;cursor:pointer}._proxy_8ev0l_1._selectable_8ev0l_32:hover{border-color:hsl(0deg,0%,var(--card-hover-border-lightness))}._proxyType_8ev0l_40{font-family:var(--font-mono);font-size:.6em;margin-right:3px}@media screen and (min-width: 30em){._proxyType_8ev0l_40{font-size:.85em}}._row_8ev0l_51{display:flex;align-items:center;justify-content:space-between}._proxyName_8ev0l_57{width:100%;margin-bottom:5px;font-size:.85em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._proxySmall_8ev0l_66{--size: 13px;width:var(--size);height:var(--size);border-radius:50%;position:relative}._proxySmall_8ev0l_66._now_8ev0l_25{--size: 15px}._proxySmall_8ev0l_66._now_8ev0l_25:before{--size-dot: 7px;content:"";position:absolute;width:var(--size-dot);height:var(--size-dot);background-color:#fff;border:1px solid var(--color-proxy-dot-selected-ind-bo);border-radius:4px;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}._proxySmall_8ev0l_66._selectable_8ev0l_32{transition:-webkit-transform .1s ease-in-out;transition:transform .1s ease-in-out;transition:transform .1s ease-in-out,-webkit-transform .1s ease-in-out;cursor:pointer}._proxySmall_8ev0l_66._selectable_8ev0l_32:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}._proxyLatency_hz69v_1{border-radius:20px;color:#eee;font-size:.6em}@media screen and (min-width: 30em){._proxyLatency_hz69v_1{font-size:.85em}}._list_1oy7w_1{display:flex;flex-wrap:wrap;margin:8px 0 8px -3px}._listSummaryView_1oy7w_8{margin:14px 0;display:grid;grid-template-columns:repeat(auto-fill,13px);grid-gap:10px;place-items:center;max-width:900px}._updatedAt_1rx92_1{margin-bottom:12px}._updatedAt_1rx92_1 small{color:#777}._main_1rx92_8{padding:10px 15px}@media screen and (min-width: 30em){._main_1rx92_8{padding:10px 40px}}._head_1rx92_17{display:flex;align-items:center;flex-wrap:wrap}._action_1rx92_23{margin:0 5px;display:grid;grid-template-columns:auto auto;gap:10px;place-items:center}._refresh_1rx92_31{display:flex;justify-content:center;align-items:center;cursor:pointer}._labeledInput_cmki0_1{max-width:85vw;width:400px;display:flex;justify-content:space-between;align-items:center;font-size:13px;padding:13px 0}hr{height:1px;background-color:var(--color-separator);border:none;outline:none;margin:1rem 0px}._overlay_uuk3b_1{background-color:#0009}._cnt_uuk3b_5{position:absolute;background-color:var(--bg-modal);color:var(--color-text);line-height:1.4;opacity:.6;transition:all .3s ease;-webkit-transform:translate(-50%,-50%) scale(1.2);transform:translate(-50%,-50%) scale(1.2);box-shadow:#0000001f 0 4px 4px,#0000003d 0 16px 32px}._afterOpen_uuk3b_16{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}._topBar_jgy4z_1{position:-webkit-sticky;position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;z-index:1;background-color:var(--color-background2);-webkit-backdrop-filter:blur(36px);backdrop-filter:blur(36px)}._topBarRight_jgy4z_13{display:flex;align-items:center;flex-wrap:wrap;flex:1;justify-content:flex-end;margin-right:20px}._textFilterContainer_jgy4z_22{max-width:350px;min-width:150px;flex:1;margin-right:8px}._group_jgy4z_29{padding:10px 15px}@media screen and (min-width: 30em){._group_jgy4z_29{padding:10px 40px}} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Proxies.e1ed6325.css: -------------------------------------------------------------------------------- 1 | ._FlexCenter_1380a_1{display:flex;justify-content:center;align-items:center}._header_1y9js_1{display:flex;align-items:center}._header_1y9js_1:focus{outline:none}._header_1y9js_1 ._arrow_1y9js_8{display:inline-flex;-webkit-transform:rotate(0deg);transform:rotate(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}._header_1y9js_1 ._arrow_1y9js_8._isOpen_1y9js_13{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._header_1y9js_1 ._arrow_1y9js_8:focus{outline:var(--color-focus-blue) solid 1px}._btn_1y9js_20{margin-left:5px}._qty_1y9js_25{font-family:var(--font-normal);font-size:.75em;margin-left:3px;padding:2px 7px;display:inline-flex;justify-content:center;align-items:center;background-color:var(--bg-near-transparent);border-radius:30px}._header_1g0y5_1{margin-bottom:12px}._zapWrapper_1g0y5_5{width:20px;height:20px;display:flex;align-items:center;justify-content:center}._proxy_sq0tg_1{margin:3px;padding:5px;position:relative;border-radius:8px;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;outline:none;border:1px solid transparent;max-width:280px;background-color:var(--color-bg-proxy)}._proxy_sq0tg_1:focus{border:1px solid var(--color-focus-blue)}@media screen and (min-width: 30em){._proxy_sq0tg_1{min-width:200px;border-radius:10px;padding:10px}}._proxy_sq0tg_1._now_sq0tg_25{background-color:var(--color-focus-blue);color:#ddd}._proxy_sq0tg_1._error_sq0tg_29{opacity:.5}._proxy_sq0tg_1._selectable_sq0tg_32{transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;cursor:pointer}._proxy_sq0tg_1._selectable_sq0tg_32:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px)}._proxyType_sq0tg_40{font-family:var(--font-mono);font-size:.6em;margin-right:3px}@media screen and (min-width: 30em){._proxyType_sq0tg_40{font-size:.85em}}._row_sq0tg_51{display:flex;align-items:center;justify-content:space-between}._proxyName_sq0tg_57{width:100%;margin-bottom:5px;font-size:.85em}@media screen and (min-width: 30em){._proxyName_sq0tg_57{font-size:1em}}._proxySmall_sq0tg_68{width:13px;height:13px;border-radius:50%;border:1px solid var(--color-background)}._proxySmall_sq0tg_68._now_sq0tg_25{border-color:var(--color-text-secondary)}._proxySmall_sq0tg_68._selectable_sq0tg_32{transition:-webkit-transform .1s ease-in-out;transition:transform .1s ease-in-out;transition:transform .1s ease-in-out,-webkit-transform .1s ease-in-out;cursor:pointer}._proxySmall_sq0tg_68._selectable_sq0tg_32:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}._proxyLatency_15kyb_1{border-radius:20px;color:#eee;font-size:.6em}@media screen and (min-width: 30em){._proxyLatency_15kyb_1{font-size:1em}}._list_10y5m_1{display:flex;flex-wrap:wrap;margin:8px 0 8px -3px}._listSummaryView_10y5m_8{margin:8px 0;display:grid;grid-template-columns:repeat(auto-fill,13px);grid-gap:10px}._updatedAt_1ql33_1{margin-bottom:12px}._updatedAt_1ql33_1 small{color:#777}._body_1ql33_8{padding:10px 15px}@media screen and (min-width: 30em){._body_1ql33_8{padding:10px 40px}}._actionFooter_1ql33_17{display:flex}._actionFooter_1ql33_17 button{margin:0 5px}._actionFooter_1ql33_17 button:first-child{margin-left:0}._refresh_1ql33_27{display:flex;justify-content:center;align-items:center;cursor:pointer}._labeledInput_cmki0_1{max-width:85vw;width:400px;display:flex;justify-content:space-between;align-items:center;font-size:13px;padding:13px 0}hr{height:1px;background-color:var(--color-separator);border:none;outline:none;margin:1rem 0px}._overlay_uuk3b_1{background-color:#0009}._cnt_uuk3b_5{position:absolute;background-color:var(--bg-modal);color:var(--color-text);line-height:1.4;opacity:.6;transition:all .3s ease;-webkit-transform:translate(-50%,-50%) scale(1.2);transform:translate(-50%,-50%) scale(1.2);box-shadow:#0000001f 0 4px 4px,#0000003d 0 16px 32px}._afterOpen_uuk3b_16{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}._topBar_jgy4z_1{position:-webkit-sticky;position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;z-index:1;background-color:var(--color-background2);-webkit-backdrop-filter:blur(36px);backdrop-filter:blur(36px)}._topBarRight_jgy4z_13{display:flex;align-items:center;flex-wrap:wrap;flex:1;justify-content:flex-end;margin-right:20px}._textFilterContainer_jgy4z_22{max-width:350px;min-width:150px;flex:1;margin-right:8px}._group_jgy4z_29{padding:10px 15px}@media screen and (min-width: 30em){._group_jgy4z_29{padding:10px 40px}} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Rules.521c574f.js: -------------------------------------------------------------------------------- 1 | import{E as v,ah as C,ai as _,V as k,aj as y,ak as R,b as c,j as a,U as B,B as T,u as g,d as F,g as S,C as $,h as A}from"./index.31d0d1dc.js";import{a as j,V as q}from"./index.esm.8c5915bf.js";import{R as P,T as z}from"./TextFitler.e1325e60.js";import{f as E}from"./index.c54634b9.js";import{F as L,p as Q}from"./Fab.4a89b536.js";import{u as D}from"./useRemainingViewPortHeight.76d7ff5c.js";import"./debounce.c2d20996.js";function U(e){const r=e.providers,t=Object.keys(r),s={};for(let n=0;n=0,"there is no valid rules list in the rules API response"),e.rules.map((r,t)=>({...r,id:t}))}async function G(e,r){let t={rules:[]};try{const{url:s,init:n}=v(r),i=await fetch(s+e,n);i.ok&&(t=await i.json())}catch(s){console.log("failed to fetch rules",s)}return O(t)}const w=C({key:"ruleFilterText",default:""});function J(e,r){const t=y(),{mutate:s,isLoading:n}=R(I,{onSuccess:()=>{t.invalidateQueries("/providers/rules")}});return[o=>{o.preventDefault(),s({name:e,apiConfig:r})},n]}function K(e){const r=y(),{data:t}=N(e),{mutate:s,isLoading:n}=R(W,{onSuccess:()=>{r.invalidateQueries("/providers/rules")}});return[o=>{o.preventDefault(),s({names:t.names,apiConfig:e})},n]}function N(e){return _(["/providers/rules",e],()=>V("/providers/rules",e))}function X(e){const{data:r,isFetching:t}=_(["/rules",e],()=>G("/rules",e)),{data:s}=N(e),[n]=k(w);if(n==="")return{rules:r,provider:s,isFetching:t};{const i=n.toLowerCase();return{rules:r.filter(o=>o.payload.toLowerCase().indexOf(i)>=0),isFetching:t,provider:{byName:s.byName,names:s.names.filter(o=>o.toLowerCase().indexOf(i)>=0)}}}}const Y="_RuleProviderItem_12aid_1",Z="_left_12aid_7",ee="_middle_12aid_14",te="_gray_12aid_21",re="_action_12aid_25",ne="_refreshBtn_12aid_32",u={RuleProviderItem:Y,left:Z,middle:ee,gray:te,action:re,refreshBtn:ne};function se({idx:e,name:r,vehicleType:t,behavior:s,updatedAt:n,ruleCount:i,apiConfig:o}){const[d,l]=J(r,o),m=E(new Date(n),new Date);return c("div",{className:u.RuleProviderItem,children:[a("span",{className:u.left,children:e}),c("div",{className:u.middle,children:[a(B,{name:r,type:`${t} / ${s}`}),a("div",{className:u.gray,children:i<2?`${i} rule`:`${i} rules`}),c("div",{className:u.action,children:[c(T,{onClick:d,disabled:l,className:u.refreshBtn,children:[a(P,{isRotating:l,size:13}),a("span",{className:"visually-hidden",children:"Refresh"})]}),c("small",{className:u.gray,children:["Updated ",m," ago"]})]})]})]})}function ie({apiConfig:e}){const[r,t]=K(e),{t:s}=g();return a(L,{icon:a(P,{isRotating:t}),text:s("update_all_rule_provider"),style:Q,onClick:r})}const ae="_rule_1ymqx_1",oe="_left_1ymqx_12",le="_a_1ymqx_19",ce="_b_1ymqx_26",ue="_type_1ymqx_37",f={rule:ae,left:oe,a:le,b:ce,type:ue},h={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function de({proxy:e}){let r=h._default;return h[e]&&(r=h[e]),{color:r}}function me({type:e,payload:r,proxy:t,id:s}){const n=de({proxy:t});return c("div",{className:f.rule,children:[a("div",{className:f.left,children:s}),c("div",{children:[a("div",{className:f.b,children:r}),c("div",{className:f.a,children:[a("div",{className:f.type,children:e}),a("div",{style:n,children:t})]})]})]})}const fe="_header_1j1w3_1",he="_RuleProviderItemWrapper_1j1w3_17",b={header:fe,RuleProviderItemWrapper:he},{memo:ve}=A,p=30;function pe(e,{rules:r,provider:t}){const s=t.names.length;return e{const{rules:s,provider:n,apiConfig:i}=t,o=n.names.length;if(e({apiConfig:S(e)}),ke=F(Re)(ge);function ge({apiConfig:e}){const[r,t]=D(),{rules:s,provider:n}=X(e),i=_e({provider:n}),{t:o}=g();return c("div",{children:[c("div",{className:b.header,children:[a($,{title:o("Rules")}),a(z,{placeholder:"Filter",textAtom:w})]}),a("div",{ref:r,style:{paddingBottom:p},children:a(q,{height:t-p,width:"100%",itemCount:s.length+n.names.length,itemSize:i,itemData:{rules:s,provider:n,apiConfig:e},itemKey:pe,children:ye})}),n&&n.names&&n.names.length>0?a(ie,{apiConfig:e}):null]})}export{ke as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Rules.5927d70a.js: -------------------------------------------------------------------------------- 1 | var A=Object.defineProperty,F=Object.defineProperties;var L=Object.getOwnPropertyDescriptors;var O=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var I=(e,s,r)=>s in e?A(e,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[s]=r,f=(e,s)=>{for(var r in s||(s={}))$.call(s,r)&&I(e,r,s[r]);if(O)for(var r of O(s))q.call(s,r)&&I(e,r,s[r]);return e},g=(e,s)=>F(e,L(s));import{_ as D,Q as b,ad as Q,ae as M,af as j,R as m,ag as W,ah as P,ai as z,aj as V,D as w,ak as H,al as S,U as G,b as c,j as a,T as J,B as K,u as x,d as X,g as Y,C as Z}from"./index.27058ddf.js";import{a as ee,V as te}from"./index.esm.f1f118db.js";import{R as N,T as re}from"./TextFitler.8b7d1ec3.js";import{f as ne}from"./index.e97a91e5.js";import{F as se,p as ie}from"./Fab.b64825a9.js";import{u as oe}from"./useRemainingViewPortHeight.49042856.js";import"./debounce.d080d5e1.js";var ae=function(e){D(s,e);function s(i,n){var t;return t=e.call(this)||this,t.client=i,t.setOptions(n),t.bindMethods(),t.updateResult(),t}var r=s.prototype;return r.bindMethods=function(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)},r.setOptions=function(n){this.options=this.client.defaultMutationOptions(n)},r.onUnsubscribe=function(){if(!this.listeners.length){var n;(n=this.currentMutation)==null||n.removeObserver(this)}},r.onMutationUpdate=function(n){this.updateResult();var t={listeners:!0};n.type==="success"?t.onSuccess=!0:n.type==="error"&&(t.onError=!0),this.notify(t)},r.getCurrentResult=function(){return this.currentResult},r.reset=function(){this.currentMutation=void 0,this.updateResult(),this.notify({listeners:!0})},r.mutate=function(n,t){return this.mutateOptions=t,this.currentMutation&&this.currentMutation.removeObserver(this),this.currentMutation=this.client.getMutationCache().build(this.client,b({},this.options,{variables:typeof n!="undefined"?n:this.options.variables})),this.currentMutation.addObserver(this),this.currentMutation.execute()},r.updateResult=function(){var n=this.currentMutation?this.currentMutation.state:Q(),t=b({},n,{isLoading:n.status==="loading",isSuccess:n.status==="success",isError:n.status==="error",isIdle:n.status==="idle",mutate:this.mutate,reset:this.reset});this.currentResult=t},r.notify=function(n){var t=this;M.batch(function(){t.mutateOptions&&(n.onSuccess?(t.mutateOptions.onSuccess==null||t.mutateOptions.onSuccess(t.currentResult.data,t.currentResult.variables,t.currentResult.context),t.mutateOptions.onSettled==null||t.mutateOptions.onSettled(t.currentResult.data,null,t.currentResult.variables,t.currentResult.context)):n.onError&&(t.mutateOptions.onError==null||t.mutateOptions.onError(t.currentResult.error,t.currentResult.variables,t.currentResult.context),t.mutateOptions.onSettled==null||t.mutateOptions.onSettled(void 0,t.currentResult.error,t.currentResult.variables,t.currentResult.context))),n.listeners&&t.listeners.forEach(function(o){o(t.currentResult)})})},s}(j);function E(e,s,r){var i=m.useRef(!1),n=m.useState(0),t=n[1],o=W(e,s,r),d=P(),u=m.useRef();u.current?u.current.setOptions(o):u.current=new ae(d,o);var l=u.current.getCurrentResult();m.useEffect(function(){i.current=!0;var R=u.current.subscribe(M.batchCalls(function(){i.current&&t(function(y){return y+1})}));return function(){i.current=!1,R()}},[]);var v=m.useCallback(function(R,y){u.current.mutate(R,y).catch(z)},[]);if(l.error&&V(void 0,u.current.options.useErrorBoundary,[l.error]))throw l.error;return b({},l,{mutate:v,mutateAsync:l.mutate})}function ue(e){const s=e.providers,r=Object.keys(s),i={};for(let n=0;n=0,"there is no valid rules list in the rules API response"),e.rules.map((s,r)=>g(f({},s),{id:r}))}async function me(e,s){let r={rules:[]};try{const{url:i,init:n}=w(s),t=await fetch(i+e,n);t.ok&&(r=await t.json())}catch(i){console.log("failed to fetch rules",i)}return he(r)}const k=H({key:"ruleFilterText",default:""});function pe(e,s){const r=P(),{mutate:i,isLoading:n}=E(T,{onSuccess:()=>{r.invalidateQueries("/providers/rules")}});return[o=>{o.preventDefault(),i({name:e,apiConfig:s})},n]}function ve(e){const s=P(),{data:r}=B(e),{mutate:i,isLoading:n}=E(ce,{onSuccess:()=>{s.invalidateQueries("/providers/rules")}});return[o=>{o.preventDefault(),i({names:r.names,apiConfig:e})},n]}function B(e){return S(["/providers/rules",e],()=>le("/providers/rules",e))}function Re(e){const{data:s,isFetching:r}=S(["/rules",e],()=>me("/rules",e)),{data:i}=B(e),[n]=G(k);if(n==="")return{rules:s,provider:i,isFetching:r};{const t=n.toLowerCase();return{rules:s.filter(o=>o.payload.toLowerCase().indexOf(t)>=0),isFetching:r,provider:{byName:i.byName,names:i.names.filter(o=>o.toLowerCase().indexOf(t)>=0)}}}}const ye="_RuleProviderItem_ly9yn_1",ge="_left_ly9yn_7",_e="_middle_ly9yn_14",be="_gray_ly9yn_20",Pe="_refreshButtonWrapper_ly9yn_24";var h={RuleProviderItem:ye,left:ge,middle:_e,gray:be,refreshButtonWrapper:Pe};function we({idx:e,name:s,vehicleType:r,behavior:i,updatedAt:n,ruleCount:t,apiConfig:o}){const[d,u]=pe(s,o),l=ne(new Date(n),new Date);return c("div",{className:h.RuleProviderItem,children:[a("span",{className:h.left,children:e}),c("div",{className:h.middle,children:[a(J,{name:s,type:`${r} / ${i}`}),a("div",{className:h.gray,children:t<2?`${t} rule`:`${t} rules`}),c("small",{className:h.gray,children:["Updated ",l," ago"]})]}),a("span",{className:h.refreshButtonWrapper,children:a(K,{onClick:d,disabled:u,children:a(N,{isRotating:u})})})]})}function Oe({apiConfig:e}){const[s,r]=ve(e),{t:i}=x();return a(se,{icon:a(N,{isRotating:r}),text:i("update_all_rule_provider"),style:ie,onClick:s})}const Ie="_rule_1ymqx_1",Ce="_left_1ymqx_12",Me="_a_1ymqx_19",Se="_b_1ymqx_26",xe="_type_1ymqx_37";var p={rule:Ie,left:Ce,a:Me,b:Se,type:xe};const _={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function Ne({proxy:e}){let s=_._default;return _[e]&&(s=_[e]),{color:s}}function Ee({type:e,payload:s,proxy:r,id:i}){const n=Ne({proxy:r});return c("div",{className:p.rule,children:[a("div",{className:p.left,children:i}),c("div",{children:[a("div",{className:p.b,children:s}),c("div",{className:p.a,children:[a("div",{className:p.type,children:e}),a("div",{style:n,children:r})]})]})]})}const Te="_header_1j1w3_1",ke="_RuleProviderItemWrapper_1j1w3_17";var U={header:Te,RuleProviderItemWrapper:ke};const{memo:Be}=m,C=30;function Ue(e,{rules:s,provider:r}){const i=r.names.length;return e{const{rules:i,provider:n,apiConfig:t}=r,o=n.names.length;if(e({apiConfig:Y(e)});var Ge=X(Le)($e);function $e({apiConfig:e}){const[s,r]=oe(),{rules:i,provider:n}=Re(e),t=Ae({provider:n}),{t:o}=x();return c("div",{children:[c("div",{className:U.header,children:[a(Z,{title:o("Rules")}),a(re,{placeholder:"Filter",textAtom:k})]}),a("div",{ref:s,style:{paddingBottom:C},children:a(te,{height:r-C,width:"100%",itemCount:i.length+n.names.length,itemSize:t,itemData:{rules:i,provider:n,apiConfig:e},itemKey:Ue,children:Fe})}),n&&n.names&&n.names.length>0?a(Oe,{apiConfig:e}):null]})}export{Ge as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Rules.72ed8383.css: -------------------------------------------------------------------------------- 1 | ._RuleProviderItem_ly9yn_1{display:grid;grid-template-columns:40px 1fr 46px;height:100%}._left_ly9yn_7{display:inline-flex;align-items:center;color:var(--color-text-secondary);opacity:.4}._middle_ly9yn_14{display:grid;grid-template-rows:1fr auto auto;align-items:center}._gray_ly9yn_20{color:#777}._refreshButtonWrapper_ly9yn_24{display:grid;place-items:center;opacity:0;transition:opacity .2s}._RuleProviderItem_ly9yn_1:hover ._refreshButtonWrapper_ly9yn_24{opacity:1}._rule_1ymqx_1{display:flex;align-items:center;padding:6px 15px}@media screen and (min-width: 30em){._rule_1ymqx_1{padding:10px 40px}}._left_1ymqx_12{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}._a_1ymqx_19{display:flex;align-items:center;font-size:12px;opacity:.8}._b_1ymqx_26{padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:16px}@media screen and (min-width: 30em){._b_1ymqx_26{font-size:19px}}._type_1ymqx_37{width:110px}._header_1j1w3_1{display:grid;grid-template-columns:1fr minmax(auto,330px);align-items:center;padding-right:15px}@media screen and (min-width: 30em){._header_1j1w3_1{padding-right:40px}}._RuleProviderItemWrapper_1j1w3_17{padding:6px 15px}@media screen and (min-width: 30em){._RuleProviderItemWrapper_1j1w3_17{padding:10px 40px}} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Rules.c9171055.js: -------------------------------------------------------------------------------- 1 | var T=Object.defineProperty,F=Object.defineProperties;var S=Object.getOwnPropertyDescriptors;var _=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var R=(e,t,r)=>t in e?T(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,u=(e,t)=>{for(var r in t||(t={}))$.call(t,r)&&R(e,r,t[r]);if(_)for(var r of _(t))A.call(t,r)&&R(e,r,t[r]);return e},v=(e,t)=>F(e,S(t));import{e as q,u as E,N as L,U as P,V as x,r as i,k as I,R as o}from"./vendor.3cf270b6.js";import{a as Q,V as W}from"./index.esm.5b55aaed.js";import{t as h,E as z,B as D,c as U,g as V,C as j}from"./index.d6596dd6.js";import{R as w,T as H}from"./TextFitler.97029c74.js";import{f as M}from"./index.afdc8976.js";import{F as O,p as G}from"./Fab.78b2c04b.js";import{u as J}from"./useRemainingViewPortHeight.91bbcf1d.js";import"./debounce.76599460.js";function K(e){const t=e.providers,r=Object.keys(t),s={};for(let n=0;n=0,"there is no valid rules list in the rules API response"),e.rules.map((t,r)=>v(u({},t),{id:r}))}async function re(e,t){let r={rules:[]};try{const{url:s,init:n}=h(t),a=await fetch(s+e,n);a.ok&&(r=await a.json())}catch(s){console.log("failed to fetch rules",s)}return te(r)}const b=q({key:"ruleFilterText",default:""});function ne(e,t){const r=P(),{mutate:s,isLoading:n}=x(N,{onSuccess:()=>{r.invalidateQueries("/providers/rules")}});return[l=>{l.preventDefault(),s({name:e,apiConfig:t})},n]}function se(e){const t=P(),{data:r}=C(e),{mutate:s,isLoading:n}=x(Y,{onSuccess:()=>{t.invalidateQueries("/providers/rules")}});return[l=>{l.preventDefault(),s({names:r.names,apiConfig:e})},n]}function C(e){return E(["/providers/rules",e],()=>X("/providers/rules",e))}function ae(e){const{data:t,isFetching:r}=E(["/rules",e],()=>re("/rules",e)),{data:s}=C(e),[n]=L(b);if(n==="")return{rules:t,provider:s,isFetching:r};{const a=n.toLowerCase();return{rules:t.filter(l=>l.payload.toLowerCase().indexOf(a)>=0),isFetching:r,provider:{byName:s.byName,names:s.names.filter(l=>l.toLowerCase().indexOf(a)>=0)}}}}const oe="_RuleProviderItem_ly9yn_1",le="_left_ly9yn_7",ie="_middle_ly9yn_14",ce="_gray_ly9yn_20",ue="_refreshButtonWrapper_ly9yn_24";var m={RuleProviderItem:oe,left:le,middle:ie,gray:ce,refreshButtonWrapper:ue};function me({idx:e,name:t,vehicleType:r,behavior:s,updatedAt:n,ruleCount:a,apiConfig:l}){const[d,c]=ne(t,l),f=M(new Date(n),new Date);return i.exports.createElement("div",{className:m.RuleProviderItem},i.exports.createElement("span",{className:m.left},e),i.exports.createElement("div",{className:m.middle},i.exports.createElement(z,{name:t,type:`${r} / ${s}`}),i.exports.createElement("div",{className:m.gray},a<2?`${a} rule`:`${a} rules`),i.exports.createElement("small",{className:m.gray},"Updated ",f," ago")),i.exports.createElement("span",{className:m.refreshButtonWrapper},i.exports.createElement(D,{onClick:d,disabled:c},i.exports.createElement(w,{isRotating:c}))))}function de({apiConfig:e}){const[t,r]=se(e),{t:s}=I();return i.exports.createElement(O,{icon:i.exports.createElement(w,{isRotating:r}),text:s("update_all_rule_provider"),style:G,onClick:t})}const fe="_rule_1ymqx_1",pe="_left_1ymqx_12",ve="_a_1ymqx_19",ye="_b_1ymqx_26",he="_type_1ymqx_37";var p={rule:fe,left:pe,a:ve,b:ye,type:he};const y={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function _e({proxy:e}){let t=y._default;return y[e]&&(t=y[e]),{color:t}}function Re({type:e,payload:t,proxy:r,id:s}){const n=_e({proxy:r});return o.createElement("div",{className:p.rule},o.createElement("div",{className:p.left},s),o.createElement("div",null,o.createElement("div",{className:p.b},t),o.createElement("div",{className:p.a},o.createElement("div",{className:p.type},e),o.createElement("div",{style:n},r))))}const ge="_header_1j1w3_1",Ee="_RuleProviderItemWrapper_1j1w3_17";var k={header:ge,RuleProviderItemWrapper:Ee};const{memo:Pe}=o,g=30;function xe(e,{rules:t,provider:r}){const s=r.names.length;return e{const{rules:s,provider:n,apiConfig:a}=r,l=n.names.length;if(e({apiConfig:V(e)});var Le=U(Ne)(be);function be({apiConfig:e}){const[t,r]=J(),{rules:s,provider:n}=ae(e),a=Ie({provider:n}),{t:l}=I();return o.createElement("div",null,o.createElement("div",{className:k.header},o.createElement(j,{title:l("Rules")}),o.createElement(H,{placeholder:"Filter",textAtom:b})),o.createElement("div",{ref:t,style:{paddingBottom:g}},o.createElement(W,{height:r-g,width:"100%",itemCount:s.length+n.names.length,itemSize:a,itemData:{rules:s,provider:n,apiConfig:e},itemKey:xe},we)),n&&n.names&&n.names.length>0?o.createElement(de,{apiConfig:e}):null)}export{Le as default}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Rules.e03c54a8.css: -------------------------------------------------------------------------------- 1 | ._RuleProviderItem_12aid_1{display:grid;grid-template-columns:40px 1fr 46px;height:100%}._left_12aid_7{display:inline-flex;align-items:center;color:var(--color-text-secondary);opacity:.4}._middle_12aid_14{display:grid;gap:6px;grid-template-rows:1fr auto auto;align-items:center}._gray_12aid_21{color:#777}._action_12aid_25{display:grid;gap:4px;grid-template-columns:auto 1fr;align-items:center}._refreshBtn_12aid_32{padding:5px}._rule_1ymqx_1{display:flex;align-items:center;padding:6px 15px}@media screen and (min-width: 30em){._rule_1ymqx_1{padding:10px 40px}}._left_1ymqx_12{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}._a_1ymqx_19{display:flex;align-items:center;font-size:12px;opacity:.8}._b_1ymqx_26{padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:16px}@media screen and (min-width: 30em){._b_1ymqx_26{font-size:19px}}._type_1ymqx_37{width:110px}._header_1j1w3_1{display:grid;grid-template-columns:1fr minmax(auto,330px);align-items:center;padding-right:15px}@media screen and (min-width: 30em){._header_1j1w3_1{padding-right:40px}}._RuleProviderItemWrapper_1j1w3_17{padding:6px 15px}@media screen and (min-width: 30em){._RuleProviderItemWrapper_1j1w3_17{padding:10px 40px}} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Select.1e55eba1.css: -------------------------------------------------------------------------------- 1 | ._select_13zm8_1{height:40px;line-height:1.5;width:100%;padding-left:8px;-webkit-appearance:none;appearance:none;background-color:var(--color-input-bg);color:var(--color-text);padding-right:20px;border-radius:4px;border:1px solid var(--color-input-border);background-image:url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20);background-position:right 8px center;background-repeat:no-repeat}._select_13zm8_1:hover,._select_13zm8_1:focus{border-color:#343434;outline:none!important;color:var(--color-text-highlight);background-image:var(--select-bg-hover)}._select_13zm8_1:focus{box-shadow:#4299e199 0 0 0 3px}._select_13zm8_1 option{background-color:var(--color-background)} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Select.4987ab41.js: -------------------------------------------------------------------------------- 1 | import{j as s}from"./index.27058ddf.js";const n="_select_13zm8_1";var o={select:n};function i({options:t,selected:c,onChange:l}){return s("select",{className:o.select,value:c,onChange:l,children:t.map(([e,r])=>s("option",{value:e,children:r},e))})}export{i as S}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Select.9583f722.js: -------------------------------------------------------------------------------- 1 | import{r as t}from"./vendor.3cf270b6.js";const l="_select_1mr76_1";var o={select:l};function n({options:r,selected:s,onChange:c}){return t.exports.createElement("select",{className:o.select,value:s,onChange:c},r.map(([e,a])=>t.exports.createElement("option",{key:e,value:e},a)))}export{n as S}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Select.9a98fc65.css: -------------------------------------------------------------------------------- 1 | ._select_1mr76_1{height:40px;line-height:1.5;width:100%;padding-left:8px;-webkit-appearance:none;appearance:none;background-color:var(--color-input-bg);color:var(--color-text);padding-right:20px;border-radius:4px;border:1px solid var(--color-input-border);background-image:url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20);background-position:right 8px center;background-repeat:no-repeat}._select_1mr76_1:hover,._select_1mr76_1:focus{border-color:#343434;outline:none!important;color:var(--color-text-highlight);background-image:var(--select-bg-hover)}._select_1mr76_1:focus{box-shadow:#4299e199 0 0 0 3px}._select_1mr76_1 option{background-color:var(--color-background)} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Select.aace7191.css: -------------------------------------------------------------------------------- 1 | ._select_13zm8_1{height:40px;line-height:1.5;width:100%;padding-left:8px;-webkit-appearance:none;appearance:none;background-color:var(--color-input-bg);color:var(--color-text);padding-right:20px;border-radius:4px;border:1px solid var(--color-input-border);background-image:url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20);background-position:right 8px center;background-repeat:no-repeat}._select_13zm8_1:hover,._select_13zm8_1:focus{border-color:#343434;outline:none!important;color:var(--color-text-highlight);background-image:var(--select-bg-hover)}._select_13zm8_1:focus{box-shadow:#4299e199 0 0 0 3px}._select_13zm8_1 option{background-color:var(--color-background)} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/Select.f2dd4970.js: -------------------------------------------------------------------------------- 1 | import{j as s}from"./index.31d0d1dc.js";const o="_select_13zm8_1",r={select:o};function i({options:t,selected:c,onChange:l}){return s("select",{className:r.select,value:c,onChange:l,children:t.map(([e,n])=>s("option",{value:e,children:n},e))})}export{i as S}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/TextFitler.3d9182a0.css: -------------------------------------------------------------------------------- 1 | ._rotate_1dspl_1{display:inline-flex}._isRotating_1dspl_5{-webkit-animation:_rotating_1dspl_1 3s infinite linear;animation:_rotating_1dspl_1 3s infinite linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes _rotating_1dspl_1{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes _rotating_1dspl_1{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}._input_16a1f_1{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;outline:none;padding:8px 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._input_16a1f_1:focus{border:1px solid var(--color-focus-blue)} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/TextFitler.8b7d1ec3.js: -------------------------------------------------------------------------------- 1 | var h=Object.defineProperty,v=Object.defineProperties;var x=Object.getOwnPropertyDescriptors;var p=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,b=Object.prototype.propertyIsEnumerable;var u=(t,e,o)=>e in t?h(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,f=(t,e)=>{for(var o in e||(e={}))_.call(e,o)&&u(t,o,e[o]);if(p)for(var o of p(e))b.call(e,o)&&u(t,o,e[o]);return t},g=(t,e)=>v(t,x(e));import{r as y,b as m,j as i,P as c,c as w,U as R,h as j}from"./index.27058ddf.js";import{d as O}from"./debounce.d080d5e1.js";function T(t,e){if(t==null)return{};var o=k(t,e),r,n;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n=0)&&(!Object.prototype.propertyIsEnumerable.call(t,r)||(o[r]=t[r]))}return o}function k(t,e){if(t==null)return{};var o={},r=Object.keys(t),n,a;for(a=0;a=0)&&(o[n]=t[n]);return o}var l=y.exports.forwardRef(function(t,e){var o=t.color,r=o===void 0?"currentColor":o,n=t.size,a=n===void 0?24:n,s=T(t,["color","size"]);return m("svg",g(f({ref:e,xmlns:"http://www.w3.org/2000/svg",width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:r,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},s),{children:[i("polyline",{points:"23 4 23 10 17 10"}),i("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]}))});l.propTypes={color:c.string,size:c.oneOfType([c.string,c.number])};l.displayName="RotateCw";var C=l;const P="_rotate_1dspl_1",z="_isRotating_1dspl_5",L="_rotating_1dspl_1";var d={rotate:P,isRotating:z,rotating:L};function E({isRotating:t}){const e=w(d.rotate,{[d.isRotating]:t});return i("span",{className:e,children:i(C,{width:16})})}const{useCallback:$,useState:I,useMemo:N}=j;function W(t){const[,e]=R(t),[o,r]=I(""),n=N(()=>O(e,300),[e]);return[$(s=>{r(s.target.value),n(s.target.value)},[n]),o]}const M="_input_16a1f_1";var S={input:M};function F(t){const[e,o]=W(t.textAtom);return i("input",{className:S.input,type:"text",value:o,onChange:e,placeholder:t.placeholder})}export{E as R,F as T,C as a}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/TextFitler.97029c74.js: -------------------------------------------------------------------------------- 1 | import{g as i,r as n,O as l,N as u,j as p}from"./vendor.3cf270b6.js";import{d as x}from"./debounce.76599460.js";const _="_rotate_1dspl_1",g="_isRotating_1dspl_5",m="_rotating_1dspl_1";var r={rotate:_,isRotating:g,rotating:m};function N({isRotating:t}){const e=i(r.rotate,{[r.isRotating]:t});return n.exports.createElement("span",{className:e},n.exports.createElement(l,{width:16}))}const{useCallback:d,useState:R,useMemo:f}=p;function h(t){const[,e]=u(t),[a,c]=R(""),o=f(()=>x(e,300),[e]);return[d(s=>{c(s.target.value),o(s.target.value)},[o]),a]}const T="_input_16a1f_1";var v={input:T};function w(t){const[e,a]=h(t.textAtom);return n.exports.createElement("input",{className:v.input,type:"text",value:a,onChange:e,placeholder:t.placeholder})}export{N as R,w as T}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/TextFitler.b21c0577.css: -------------------------------------------------------------------------------- 1 | ._rotate_1dspl_1{display:inline-flex}._isRotating_1dspl_5{-webkit-animation:_rotating_1dspl_1 3s infinite linear;animation:_rotating_1dspl_1 3s infinite linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes _rotating_1dspl_1{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes _rotating_1dspl_1{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}._input_16a1f_1{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;outline:none;padding:8px 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._input_16a1f_1:focus{border:1px solid var(--color-focus-blue)} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/TextFitler.e1325e60.js: -------------------------------------------------------------------------------- 1 | import{r as u,b as g,j as i,i as c,c as f,V as x,h as d}from"./index.31d0d1dc.js";import{d as h}from"./debounce.c2d20996.js";function v(t,n){if(t==null)return{};var o=_(t,n),r,e;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(e=0;e=0)&&(!Object.prototype.propertyIsEnumerable.call(t,r)||(o[r]=t[r]))}return o}function _(t,n){if(t==null)return{};var o={},r=Object.keys(t),e,s;for(s=0;s=0)&&(o[e]=t[e]);return o}var l=u.exports.forwardRef(function(t,n){var o=t.color,r=o===void 0?"currentColor":o,e=t.size,s=e===void 0?24:e,a=v(t,["color","size"]);return g("svg",{ref:n,xmlns:"http://www.w3.org/2000/svg",width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:r,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...a,children:[i("polyline",{points:"23 4 23 10 17 10"}),i("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})});l.propTypes={color:c.exports.string,size:c.exports.oneOfType([c.exports.string,c.exports.number])};l.displayName="RotateCw";const b=l,y="_rotate_1dspl_1",m="_isRotating_1dspl_5",R="_rotating_1dspl_1",p={rotate:y,isRotating:m,rotating:R};function P(t){const n=t.size||16,o=f(p.rotate,{[p.isRotating]:t.isRotating});return i("span",{className:o,children:i(b,{size:n})})}const{useCallback:w,useState:j,useMemo:O}=d;function T(t){const[,n]=x(t),[o,r]=j(""),e=O(()=>h(n,300),[n]);return[w(a=>{r(a.target.value),e(a.target.value)},[e]),o]}const k="_input_16a1f_1",C={input:k};function $(t){const[n,o]=T(t.textAtom);return i("input",{className:C.input,type:"text",value:o,onChange:n,placeholder:t.placeholder})}export{P as R,$ as T,b as a}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/chevron-down.2de0fb4e.js: -------------------------------------------------------------------------------- 1 | var u=Object.defineProperty,y=Object.defineProperties;var g=Object.getOwnPropertyDescriptors;var l=Object.getOwnPropertySymbols;var w=Object.prototype.hasOwnProperty,b=Object.prototype.propertyIsEnumerable;var p=(r,e,o)=>e in r?u(r,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[e]=o,f=(r,e)=>{for(var o in e||(e={}))w.call(e,o)&&p(r,o,e[o]);if(l)for(var o of l(e))b.call(e,o)&&p(r,o,e[o]);return r},v=(r,e)=>y(r,g(e));import{r as d,j as c,P as s}from"./index.27058ddf.js";function j(r,e){if(r==null)return{};var o=O(r,e),n,t;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);for(t=0;t=0)&&(!Object.prototype.propertyIsEnumerable.call(r,n)||(o[n]=r[n]))}return o}function O(r,e){if(r==null)return{};var o={},n=Object.keys(r),t,i;for(i=0;i=0)&&(o[t]=r[t]);return o}var a=d.exports.forwardRef(function(r,e){var o=r.color,n=o===void 0?"currentColor":o,t=r.size,i=t===void 0?24:t,h=j(r,["color","size"]);return c("svg",v(f({ref:e,xmlns:"http://www.w3.org/2000/svg",width:i,height:i,viewBox:"0 0 24 24",fill:"none",stroke:n,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},h),{children:c("polyline",{points:"6 9 12 15 18 9"})}))});a.propTypes={color:s.string,size:s.oneOfType([s.string,s.number])};a.displayName="ChevronDown";var x=a;export{x as C}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/chevron-down.f5a64258.js: -------------------------------------------------------------------------------- 1 | import{r as f,j as l,i as s}from"./index.31d0d1dc.js";function c(r,i){if(r==null)return{};var n=v(r,i),o,e;if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);for(e=0;e=0)&&(!Object.prototype.propertyIsEnumerable.call(r,o)||(n[o]=r[o]))}return n}function v(r,i){if(r==null)return{};var n={},o=Object.keys(r),e,t;for(t=0;t=0)&&(n[e]=r[e]);return n}var p=f.exports.forwardRef(function(r,i){var n=r.color,o=n===void 0?"currentColor":n,e=r.size,t=e===void 0?24:e,a=c(r,["color","size"]);return l("svg",{ref:i,xmlns:"http://www.w3.org/2000/svg",width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:o,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...a,children:l("polyline",{points:"6 9 12 15 18 9"})})});p.propTypes={color:s.exports.string,size:s.exports.oneOfType([s.exports.string,s.exports.number])};p.displayName="ChevronDown";const u=p;export{u as C}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/debounce.76599460.js: -------------------------------------------------------------------------------- 1 | function S(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var M=typeof global=="object"&&global&&global.Object===Object&&global,R=M,w=typeof self=="object"&&self&&self.Object===Object&&self,B=R||w||Function("return this")(),W=B,F=function(){return W.Date.now()},p=F,G=/\s/;function U(e){for(var n=e.length;n--&&G.test(e.charAt(n)););return n}var _=/^\s+/;function D(e){return e&&e.slice(0,U(e)+1).replace(_,"")}var H=W.Symbol,y=H,L=Object.prototype,X=L.hasOwnProperty,q=L.toString,g=y?y.toStringTag:void 0;function z(e){var n=X.call(e,g),i=e[g];try{e[g]=void 0;var o=!0}catch{}var f=q.call(e);return o&&(n?e[g]=i:delete e[g]),f}var J=Object.prototype,K=J.toString;function Q(e){return K.call(e)}var V="[object Null]",Y="[object Undefined]",$=y?y.toStringTag:void 0;function Z(e){return e==null?e===void 0?Y:V:$&&$ in Object(e)?z(e):Q(e)}function ee(e){return e!=null&&typeof e=="object"}var ne="[object Symbol]";function te(e){return typeof e=="symbol"||ee(e)&&Z(e)==ne}var E=0/0,re=/^[-+]0x[0-9a-f]+$/i,ie=/^0b[01]+$/i,oe=/^0o[0-7]+$/i,ae=parseInt;function k(e){if(typeof e=="number")return e;if(te(e))return E;if(S(e)){var n=typeof e.valueOf=="function"?e.valueOf():e;e=S(n)?n+"":n}if(typeof e!="string")return e===0?e:+e;e=D(e);var i=ie.test(e);return i||oe.test(e)?ae(e.slice(2),i?2:8):re.test(e)?E:+e}var fe="Expected a function",ce=Math.max,ue=Math.min;function se(e,n,i){var o,f,s,u,r,c,d=0,O=!1,l=!1,T=!0;if(typeof e!="function")throw new TypeError(fe);n=k(n)||0,S(i)&&(O=!!i.leading,l="maxWait"in i,s=l?ce(k(i.maxWait)||0,n):s,T="trailing"in i?!!i.trailing:T);function j(t){var a=o,b=f;return o=f=void 0,d=t,u=e.apply(b,a),u}function N(t){return d=t,r=setTimeout(m,n),O?j(t):u}function P(t){var a=t-c,b=t-d,I=n-a;return l?ue(I,s-b):I}function h(t){var a=t-c,b=t-d;return c===void 0||a>=n||a<0||l&&b>=s}function m(){var t=p();if(h(t))return x(t);r=setTimeout(m,P(t))}function x(t){return r=void 0,T&&o?j(t):(o=f=void 0,u)}function A(){r!==void 0&&clearTimeout(r),d=0,o=c=f=r=void 0}function C(){return r===void 0?u:x(p())}function v(){var t=p(),a=h(t);if(o=arguments,f=this,c=t,a){if(r===void 0)return N(c);if(l)return clearTimeout(r),r=setTimeout(m,n),j(c)}return r===void 0&&(r=setTimeout(m,n)),u}return v.cancel=A,v.flush=C,v}export{se as d}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/debounce.c2d20996.js: -------------------------------------------------------------------------------- 1 | function O(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var M=typeof global=="object"&&global&&global.Object===Object&&global;const R=M;var w=typeof self=="object"&&self&&self.Object===Object&&self,B=R||w||Function("return this")();const W=B;var F=function(){return W.Date.now()};const S=F;var G=/\s/;function U(e){for(var n=e.length;n--&&G.test(e.charAt(n)););return n}var _=/^\s+/;function D(e){return e&&e.slice(0,U(e)+1).replace(_,"")}var H=W.Symbol;const y=H;var L=Object.prototype,X=L.hasOwnProperty,q=L.toString,g=y?y.toStringTag:void 0;function z(e){var n=X.call(e,g),i=e[g];try{e[g]=void 0;var o=!0}catch{}var f=q.call(e);return o&&(n?e[g]=i:delete e[g]),f}var J=Object.prototype,K=J.toString;function Q(e){return K.call(e)}var V="[object Null]",Y="[object Undefined]",$=y?y.toStringTag:void 0;function Z(e){return e==null?e===void 0?Y:V:$&&$ in Object(e)?z(e):Q(e)}function ee(e){return e!=null&&typeof e=="object"}var ne="[object Symbol]";function te(e){return typeof e=="symbol"||ee(e)&&Z(e)==ne}var E=0/0,re=/^[-+]0x[0-9a-f]+$/i,ie=/^0b[01]+$/i,oe=/^0o[0-7]+$/i,ae=parseInt;function k(e){if(typeof e=="number")return e;if(te(e))return E;if(O(e)){var n=typeof e.valueOf=="function"?e.valueOf():e;e=O(n)?n+"":n}if(typeof e!="string")return e===0?e:+e;e=D(e);var i=ie.test(e);return i||oe.test(e)?ae(e.slice(2),i?2:8):re.test(e)?E:+e}var fe="Expected a function",ce=Math.max,ue=Math.min;function se(e,n,i){var o,f,s,u,r,c,d=0,v=!1,l=!1,T=!0;if(typeof e!="function")throw new TypeError(fe);n=k(n)||0,O(i)&&(v=!!i.leading,l="maxWait"in i,s=l?ce(k(i.maxWait)||0,n):s,T="trailing"in i?!!i.trailing:T);function j(t){var a=o,b=f;return o=f=void 0,d=t,u=e.apply(b,a),u}function N(t){return d=t,r=setTimeout(m,n),v?j(t):u}function P(t){var a=t-c,b=t-d,I=n-a;return l?ue(I,s-b):I}function h(t){var a=t-c,b=t-d;return c===void 0||a>=n||a<0||l&&b>=s}function m(){var t=S();if(h(t))return x(t);r=setTimeout(m,P(t))}function x(t){return r=void 0,T&&o?j(t):(o=f=void 0,u)}function A(){r!==void 0&&clearTimeout(r),d=0,o=c=f=r=void 0}function C(){return r===void 0?u:x(S())}function p(){var t=S(),a=h(t);if(o=arguments,f=this,c=t,a){if(r===void 0)return N(c);if(l)return clearTimeout(r),r=setTimeout(m,n),j(c)}return r===void 0&&(r=setTimeout(m,n)),u}return p.cancel=A,p.flush=C,p}export{se as d}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/debounce.d080d5e1.js: -------------------------------------------------------------------------------- 1 | function S(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var M=typeof global=="object"&&global&&global.Object===Object&&global,R=M,w=typeof self=="object"&&self&&self.Object===Object&&self,B=R||w||Function("return this")(),W=B,F=function(){return W.Date.now()},p=F,G=/\s/;function U(e){for(var n=e.length;n--&&G.test(e.charAt(n)););return n}var _=/^\s+/;function D(e){return e&&e.slice(0,U(e)+1).replace(_,"")}var H=W.Symbol,y=H,L=Object.prototype,X=L.hasOwnProperty,q=L.toString,g=y?y.toStringTag:void 0;function z(e){var n=X.call(e,g),i=e[g];try{e[g]=void 0;var o=!0}catch{}var f=q.call(e);return o&&(n?e[g]=i:delete e[g]),f}var J=Object.prototype,K=J.toString;function Q(e){return K.call(e)}var V="[object Null]",Y="[object Undefined]",$=y?y.toStringTag:void 0;function Z(e){return e==null?e===void 0?Y:V:$&&$ in Object(e)?z(e):Q(e)}function ee(e){return e!=null&&typeof e=="object"}var ne="[object Symbol]";function te(e){return typeof e=="symbol"||ee(e)&&Z(e)==ne}var E=0/0,re=/^[-+]0x[0-9a-f]+$/i,ie=/^0b[01]+$/i,oe=/^0o[0-7]+$/i,ae=parseInt;function k(e){if(typeof e=="number")return e;if(te(e))return E;if(S(e)){var n=typeof e.valueOf=="function"?e.valueOf():e;e=S(n)?n+"":n}if(typeof e!="string")return e===0?e:+e;e=D(e);var i=ie.test(e);return i||oe.test(e)?ae(e.slice(2),i?2:8):re.test(e)?E:+e}var fe="Expected a function",ce=Math.max,ue=Math.min;function se(e,n,i){var o,f,s,u,r,c,d=0,O=!1,l=!1,T=!0;if(typeof e!="function")throw new TypeError(fe);n=k(n)||0,S(i)&&(O=!!i.leading,l="maxWait"in i,s=l?ce(k(i.maxWait)||0,n):s,T="trailing"in i?!!i.trailing:T);function j(t){var a=o,b=f;return o=f=void 0,d=t,u=e.apply(b,a),u}function N(t){return d=t,r=setTimeout(m,n),O?j(t):u}function P(t){var a=t-c,b=t-d,I=n-a;return l?ue(I,s-b):I}function h(t){var a=t-c,b=t-d;return c===void 0||a>=n||a<0||l&&b>=s}function m(){var t=p();if(h(t))return x(t);r=setTimeout(m,P(t))}function x(t){return r=void 0,T&&o?j(t):(o=f=void 0,u)}function A(){r!==void 0&&clearTimeout(r),d=0,o=c=f=r=void 0}function C(){return r===void 0?u:x(p())}function v(){var t=p(),a=h(t);if(o=arguments,f=this,c=t,a){if(r===void 0)return N(c);if(l)return clearTimeout(r),r=setTimeout(m,n),j(c)}return r===void 0&&(r=setTimeout(m,n)),u}return v.cancel=A,v.flush=C,v}export{se as d}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/en.fb34eaf7.js: -------------------------------------------------------------------------------- 1 | const e={Overview:"Overview",Proxies:"Proxies",Rules:"Rules",Conns:"Conns",Config:"Config",Logs:"Logs",Upload:"Upload",Download:"Download","Upload Total":"Upload Total","Download Total":"Download Total","Active Connections":"Active Connections","Pause Refresh":"Pause Refresh","Resume Refresh":"Resume Refresh",Up:"Up",Down:"Down","Test Latency":"Test Latency",settings:"settings",sort_in_grp:"Sorting in group",hide_unavail_proxies:"Hide unavailable proxies",auto_close_conns:"Automatically close old connections",order_natural:"Original order in config file",order_latency_asc:"By latency from small to big",order_latency_desc:"By latency from big to small",order_name_asc:"By name alphabetically (A-Z)",order_name_desc:"By name alphabetically (Z-A)",Connections:"Connections",Active:"Active",Closed:"Closed",switch_theme:"Switch theme",theme:"theme",about:"about",no_logs:"No logs yet, hang tight...",chart_style:"Chart Style",latency_test_url:"Latency Test URL",lang:"Language",update_all_rule_provider:"Update all rule providers",update_all_proxy_provider:"Update all proxy providers"};export{e as data}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/inter-latin-400-normal.9ec803ce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/inter-latin-400-normal.9ec803ce.woff -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/inter-latin-400-normal.d56fec21.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/inter-latin-400-normal.d56fec21.woff2 -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/inter-latin-800-normal.5eea1309.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/inter-latin-800-normal.5eea1309.woff2 -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/inter-latin-800-normal.98c540b2.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/inter-latin-800-normal.98c540b2.woff -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/logs.7cc467a0.js: -------------------------------------------------------------------------------- 1 | var $=Object.defineProperty,k=Object.defineProperties;var y=Object.getOwnPropertyDescriptors;var h=Object.getOwnPropertySymbols;var E=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var S=(e,t,n)=>t in e?$(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,b=(e,t)=>{for(var n in t||(t={}))E.call(t,n)&&S(e,n,t[n]);if(h)for(var n of h(t))A.call(t,n)&&S(e,n,t[n]);return e},v=(e,t)=>k(e,y(t));import{A as O,D as R,E as u}from"./index.27058ddf.js";const L="/logs",x=new TextDecoder("utf-8"),F=()=>Math.floor((1+Math.random())*65536).toString(16);let p=!1,i=!1,f="",s,g;function m(e,t){let n;try{n=JSON.parse(e)}catch{console.log("JSON.parse error",JSON.parse(e))}const r=new Date,l=H(r);n.time=l,n.id=+r-0+F(),n.even=p=!p,t(n)}function H(e){const t=e.getFullYear()%100,n=u(e.getMonth()+1,2),r=u(e.getDate(),2),l=u(e.getHours(),2),o=u(e.getMinutes(),2),c=u(e.getSeconds(),2);return`${t}-${n}-${r} ${l}:${o}:${c}`}function M(e,t){return e.read().then(({done:n,value:r})=>{f+=x.decode(r,{stream:!n});const o=f.split(` 2 | `),c=o[o.length-1];for(let d=0;de[n]).join("|")}let w,a;function J(e,t){if(e.logLevel==="uninit"||i||s&&s.readyState===1)return;g=t;const n=O(e,L);s=new WebSocket(n),s.addEventListener("error",()=>{N(e,t)}),s.addEventListener("message",function(r){m(r.data,t)})}function Y(){s.close(),a&&a.abort()}function j(e){!g||!s||(s.close(),i=!1,J(e,g))}function N(e,t){if(a&&D(e)!==w)a.abort();else if(i)return;i=!0,w=D(e),a=new AbortController;const n=a.signal,{url:r,init:l}=R(e);fetch(r+L+"?level="+e.logLevel,v(b({},l),{signal:n})).then(o=>{const c=o.body.getReader();M(c,t)},o=>{i=!1,!n.aborted&&console.log("GET /logs error:",o.message)})}export{J as f,j as r,Y as s}; 3 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/logs.8963bea3.js: -------------------------------------------------------------------------------- 1 | var $=Object.defineProperty,k=Object.defineProperties;var y=Object.getOwnPropertyDescriptors;var h=Object.getOwnPropertySymbols;var E=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var S=(e,t,n)=>t in e?$(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,v=(e,t)=>{for(var n in t||(t={}))E.call(t,n)&&S(e,n,t[n]);if(h)for(var n of h(t))O.call(t,n)&&S(e,n,t[n]);return e},b=(e,t)=>k(e,y(t));import{r as R,t as x,v as u}from"./index.d6596dd6.js";const L="/logs",A=new TextDecoder("utf-8"),F=()=>Math.floor((1+Math.random())*65536).toString(16);let p=!1,i=!1,f="",s,g;function m(e,t){let n;try{n=JSON.parse(e)}catch{console.log("JSON.parse error",JSON.parse(e))}const r=new Date,l=H(r);n.time=l,n.id=+r-0+F(),n.even=p=!p,t(n)}function H(e){const t=e.getFullYear()%100,n=u(e.getMonth()+1,2),r=u(e.getDate(),2),l=u(e.getHours(),2),o=u(e.getMinutes(),2),c=u(e.getSeconds(),2);return`${t}-${n}-${r} ${l}:${o}:${c}`}function M(e,t){return e.read().then(({done:n,value:r})=>{f+=A.decode(r,{stream:!n});const o=f.split(` 2 | `),c=o[o.length-1];for(let d=0;de[n]).join("|")}let D,a;function J(e,t){if(e.logLevel==="uninit"||i||s&&s.readyState===1)return;g=t;const n=R(e,L);s=new WebSocket(n),s.addEventListener("error",()=>{N(e,t)}),s.addEventListener("message",function(r){m(r.data,t)})}function Y(){s.close(),a&&a.abort()}function j(e){!g||!s||(s.close(),i=!1,J(e,g))}function N(e,t){if(a&&w(e)!==D)a.abort();else if(i)return;i=!0,D=w(e),a=new AbortController;const n=a.signal,{url:r,init:l}=x(e);fetch(r+L+"?level="+e.logLevel,b(v({},l),{signal:n})).then(o=>{const c=o.body.getReader();M(c,t)},o=>{i=!1,!n.aborted&&console.log("GET /logs error:",o.message)})}export{J as f,j as r,Y as s}; 3 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/logs.975cc896.js: -------------------------------------------------------------------------------- 1 | import{D,E as w,G as u}from"./index.31d0d1dc.js";const v="/logs",L=new TextDecoder("utf-8"),M=()=>Math.floor((1+Math.random())*65536).toString(16);let h=!1,i=!1,f="",s,g;function m(e,n){let t;try{t=JSON.parse(e)}catch{console.log("JSON.parse error",JSON.parse(e))}const r=new Date,l=$(r);t.time=l,t.id=+r-0+M(),t.even=h=!h,n(t)}function $(e){const n=e.getFullYear()%100,t=u(e.getMonth()+1,2),r=u(e.getDate(),2),l=u(e.getHours(),2),o=u(e.getMinutes(),2),c=u(e.getSeconds(),2);return`${n}-${t}-${r} ${l}:${o}:${c}`}function p(e,n){return e.read().then(({done:t,value:r})=>{f+=L.decode(r,{stream:!t});const o=f.split(` 2 | `),c=o[o.length-1];for(let d=0;de[t]).join("|")}let b,a;function k(e,n){if(e.logLevel==="uninit"||i||s&&s.readyState===1)return;g=n;const t=D(e,v);s=new WebSocket(t),s.addEventListener("error",()=>{y(e,n)}),s.addEventListener("message",function(r){m(r.data,n)})}function O(){s.close(),a&&a.abort()}function R(e){!g||!s||(s.close(),i=!1,k(e,g))}function y(e,n){if(a&&S(e)!==b)a.abort();else if(i)return;i=!0,b=S(e),a=new AbortController;const t=a.signal,{url:r,init:l}=w(e);fetch(r+v+"?level="+e.logLevel,{...l,signal:t}).then(o=>{const c=o.body.getReader();p(c,n)},o=>{i=!1,!t.aborted&&console.log("GET /logs error:",o.message)})}export{k as f,R as r,O as s}; 3 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/open-sans-latin-400-normal.cce57747.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/open-sans-latin-400-normal.cce57747.woff2 -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/open-sans-latin-400-normal.d7410996.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/open-sans-latin-400-normal.d7410996.woff -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/open-sans-latin-700-normal.a61d6725.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/open-sans-latin-700-normal.a61d6725.woff2 -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/open-sans-latin-700-normal.b1fda8d8.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/open-sans-latin-700-normal.b1fda8d8.woff -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/play.1bfea717.js: -------------------------------------------------------------------------------- 1 | var h=Object.defineProperty,d=Object.defineProperties;var w=Object.getOwnPropertyDescriptors;var y=Object.getOwnPropertySymbols;var b=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var v=(e,t,r)=>t in e?h(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,p=(e,t)=>{for(var r in t||(t={}))b.call(t,r)&&v(e,r,t[r]);if(y)for(var r of y(t))O.call(t,r)&&v(e,r,t[r]);return e},f=(e,t)=>d(e,w(t));import{r as g,b as j,j as a,P as s}from"./index.27058ddf.js";function P(e,t){if(e==null)return{};var r=k(e,t),i,o;if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0)&&(!Object.prototype.propertyIsEnumerable.call(e,i)||(r[i]=e[i]))}return r}function k(e,t){if(e==null)return{};var r={},i=Object.keys(e),o,n;for(n=0;n=0)&&(r[o]=e[o]);return r}var c=g.exports.forwardRef(function(e,t){var r=e.color,i=r===void 0?"currentColor":r,o=e.size,n=o===void 0?24:o,l=P(e,["color","size"]);return j("svg",f(p({ref:t,xmlns:"http://www.w3.org/2000/svg",width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:i,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},l),{children:[a("rect",{x:"6",y:"4",width:"4",height:"16"}),a("rect",{x:"14",y:"4",width:"4",height:"16"})]}))});c.propTypes={color:s.string,size:s.oneOfType([s.string,s.number])};c.displayName="Pause";var L=c;function x(e,t){if(e==null)return{};var r=m(e,t),i,o;if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0)&&(!Object.prototype.propertyIsEnumerable.call(e,i)||(r[i]=e[i]))}return r}function m(e,t){if(e==null)return{};var r={},i=Object.keys(e),o,n;for(n=0;n=0)&&(r[o]=e[o]);return r}var u=g.exports.forwardRef(function(e,t){var r=e.color,i=r===void 0?"currentColor":r,o=e.size,n=o===void 0?24:o,l=x(e,["color","size"]);return a("svg",f(p({ref:t,xmlns:"http://www.w3.org/2000/svg",width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:i,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},l),{children:a("polygon",{points:"5 3 19 12 5 21 5 3"})}))});u.propTypes={color:s.string,size:s.oneOfType([s.string,s.number])};u.displayName="Play";var W=u;export{W as P,L as a}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/play.42659ab6.js: -------------------------------------------------------------------------------- 1 | import{r as c,b as u,j as p,i as s}from"./index.31d0d1dc.js";function y(e,n){if(e==null)return{};var i=g(e,n),t,r;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&(!Object.prototype.propertyIsEnumerable.call(e,t)||(i[t]=e[t]))}return i}function g(e,n){if(e==null)return{};var i={},t=Object.keys(e),r,o;for(o=0;o=0)&&(i[r]=e[r]);return i}var l=c.exports.forwardRef(function(e,n){var i=e.color,t=i===void 0?"currentColor":i,r=e.size,o=r===void 0?24:r,a=y(e,["color","size"]);return u("svg",{ref:n,xmlns:"http://www.w3.org/2000/svg",width:o,height:o,viewBox:"0 0 24 24",fill:"none",stroke:t,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...a,children:[p("rect",{x:"6",y:"4",width:"4",height:"16"}),p("rect",{x:"14",y:"4",width:"4",height:"16"})]})});l.propTypes={color:s.exports.string,size:s.exports.oneOfType([s.exports.string,s.exports.number])};l.displayName="Pause";const d=l;function h(e,n){if(e==null)return{};var i=v(e,n),t,r;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&(!Object.prototype.propertyIsEnumerable.call(e,t)||(i[t]=e[t]))}return i}function v(e,n){if(e==null)return{};var i={},t=Object.keys(e),r,o;for(o=0;o=0)&&(i[r]=e[r]);return i}var f=c.exports.forwardRef(function(e,n){var i=e.color,t=i===void 0?"currentColor":i,r=e.size,o=r===void 0?24:r,a=h(e,["color","size"]);return p("svg",{ref:n,xmlns:"http://www.w3.org/2000/svg",width:o,height:o,viewBox:"0 0 24 24",fill:"none",stroke:t,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...a,children:p("polygon",{points:"5 3 19 12 5 21 5 3"})})});f.propTypes={color:s.exports.string,size:s.exports.oneOfType([s.exports.string,s.exports.number])};f.displayName="Play";const w=f;export{w as P,d as a}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/roboto-mono-latin-400-normal.2dfc0e86.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/roboto-mono-latin-400-normal.2dfc0e86.woff -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/roboto-mono-latin-400-normal.e1fd013a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/assets/roboto-mono-latin-400-normal.e1fd013a.woff2 -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/useRemainingViewPortHeight.49042856.js: -------------------------------------------------------------------------------- 1 | import{h as r}from"./index.27058ddf.js";const{useState:s,useRef:u,useCallback:a,useLayoutEffect:c}=r;function d(){const t=u(null),[n,i]=s(200),e=a(()=>{const{top:o}=t.current.getBoundingClientRect();i(window.innerHeight-o)},[]);return c(()=>(e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}),[e]),[t,n]}export{d as u}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/useRemainingViewPortHeight.76d7ff5c.js: -------------------------------------------------------------------------------- 1 | import{h as r}from"./index.31d0d1dc.js";const{useState:s,useRef:u,useCallback:a,useLayoutEffect:c}=r;function d(){const t=u(null),[n,i]=s(200),e=a(()=>{const{top:o}=t.current.getBoundingClientRect();i(window.innerHeight-o)},[]);return c(()=>(e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}),[e]),[t,n]}export{d as u}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/useRemainingViewPortHeight.91bbcf1d.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor.3cf270b6.js";const{useState:s,useRef:u,useCallback:a,useLayoutEffect:c}=r;function d(){const t=u(null),[n,i]=s(200),e=a(()=>{const{top:o}=t.current.getBoundingClientRect();i(window.innerHeight-o)},[]);return c(()=>(e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}),[e]),[t,n]}export{d as u}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/assets/zh.9b79b7bf.js: -------------------------------------------------------------------------------- 1 | const u={Overview:"\u6982\u89C8",Proxies:"\u4EE3\u7406",Rules:"\u89C4\u5219",Conns:"\u8FDE\u63A5",Config:"\u914D\u7F6E",Logs:"\u65E5\u5FD7",Upload:"\u4E0A\u4F20",Download:"\u4E0B\u8F7D","Upload Total":"\u4E0A\u4F20\u603B\u91CF","Download Total":"\u4E0B\u8F7D\u603B\u91CF","Active Connections":"\u6D3B\u52A8\u8FDE\u63A5","Pause Refresh":"\u6682\u505C\u5237\u65B0","Resume Refresh":"\u7EE7\u7EED\u5237\u65B0",Up:"\u4E0A\u4F20",Down:"\u4E0B\u8F7D","Test Latency":"\u5EF6\u8FDF\u6D4B\u901F",settings:"\u8BBE\u7F6E",sort_in_grp:"\u4EE3\u7406\u7EC4\u6761\u76EE\u6392\u5E8F",hide_unavail_proxies:"\u9690\u85CF\u4E0D\u53EF\u7528\u4EE3\u7406",auto_close_conns:"\u5207\u6362\u4EE3\u7406\u65F6\u81EA\u52A8\u65AD\u5F00\u65E7\u8FDE\u63A5",order_natural:"\u539F config \u6587\u4EF6\u4E2D\u7684\u6392\u5E8F",order_latency_asc:"\u6309\u5EF6\u8FDF\u4ECE\u5C0F\u5230\u5927",order_latency_desc:"\u6309\u5EF6\u8FDF\u4ECE\u5927\u5230\u5C0F",order_name_asc:"\u6309\u540D\u79F0\u5B57\u6BCD\u6392\u5E8F (A-Z)",order_name_desc:"\u6309\u540D\u79F0\u5B57\u6BCD\u6392\u5E8F (Z-A)",Connections:"\u8FDE\u63A5",Active:"\u6D3B\u52A8",Closed:"\u5DF2\u65AD\u5F00",switch_theme:"\u5207\u6362\u4E3B\u9898",theme:"\u4E3B\u9898",about:"\u5173\u4E8E",no_logs:"\u6682\u65E0\u65E5\u5FD7...",chart_style:"\u6D41\u91CF\u56FE\u6837\u5F0F",latency_test_url:"\u5EF6\u8FDF\u6D4B\u901F URL",lang:"\u8BED\u8A00",update_all_rule_provider:"\u66F4\u65B0\u6240\u6709 rule provider",update_all_proxy_provider:"\u66F4\u65B0\u6240\u6709 proxy providers"};export{u as data}; 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | yacd 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"yacd","short_name":"yacd","start_url":"./","display":"standalone","background_color":"#ffffff","lang":"en","scope":"./"} 2 | -------------------------------------------------------------------------------- /koolclash/webs/koolclash/registerSW.js: -------------------------------------------------------------------------------- 1 | if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('./sw.js', { scope: './' })})} -------------------------------------------------------------------------------- /koolclash/webs/koolclash/yacd-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/yacd-128.png -------------------------------------------------------------------------------- /koolclash/webs/koolclash/yacd-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/yacd-64.png -------------------------------------------------------------------------------- /koolclash/webs/koolclash/yacd.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/koolclash/yacd.ico -------------------------------------------------------------------------------- /koolclash/webs/res/icon-koolclash-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/res/icon-koolclash-bg.png -------------------------------------------------------------------------------- /koolclash/webs/res/icon-koolclash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/koolclash/webs/res/icon-koolclash.png -------------------------------------------------------------------------------- /koolclash/webs/res/koolclash_.version: -------------------------------------------------------------------------------- 1 | 0.18.4 2 | -------------------------------------------------------------------------------- /koolclash/webs/res/koolclash_base64.js: -------------------------------------------------------------------------------- 1 | /* 2 | * base64.js | BSD 3-Clause 3 | * https://github.com/dankogai/js-base64 4 | */ 5 | (function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory(global):typeof define==="function"&&define.amd?define(factory):factory(global)})(typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:this,function(global){"use strict";var _Base64=global.Base64;var version="2.5.0";var buffer;if(typeof module!=="undefined"&&module.exports){try{buffer=eval("require('buffer').Buffer")}catch(err){buffer=undefined}}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(u){return(u.constructor===buffer.constructor?u:buffer.from(u)).toString("base64")}:function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var _atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/\S{1,4}/g,cb_decode)};var atob=function(a){return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g,""))};var _decode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(a){return(a.constructor===buffer.constructor?a:buffer.from(a,"base64")).toString()}:function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(_atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict,__buffer__:buffer};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}if(global["Meteor"]){Base64=global.Base64}if(typeof module!=="undefined"&&module.exports){module.exports.Base64=global.Base64}else if(typeof define==="function"&&define.amd){define([],function(){return global.Base64})}return{Base64:global.Base64}}); -------------------------------------------------------------------------------- /koolclash/webs/res/koolclash_help.js: -------------------------------------------------------------------------------- 1 | /* 2 | * koolclash_help.js | @houzi- 3 | * https://github.com/houzi-/Koolshare-Clash-hack 4 | */ 5 | function koolclash_helpSwitchMode() { 6 | layer.open({ 7 | type: 0, 8 | shade: 0.1, 9 | skin: 'layui-layer-lan', 10 | scrollbar: 0, 11 | title: '运行模式【指南】', 12 | area: ['400px', '250px'], 13 | fixed: false, //不固定 14 | resize: false, //禁止拉伸 15 | maxmin: true, 16 | shadeClose: 1, 17 | id: 'LAY_switch_rule_mode', 18 | content: '● 规则【Rule】所有请求根据配置文件规则进行分流
● 全局【Global】所有请求直接发往代理服务器
(该模式需要在面板选择全局代理服务器节点)
● 直连【Direct】所有请求直接发往目的地', 19 | }); 20 | } 21 | 22 | function koolclash_helpFlow() { 23 | layer.open({ 24 | type: 0, 25 | shade: 0.1, 26 | skin: 'layui-layer-lan', 27 | scrollbar: 0, 28 | title: 'Clash 订阅流量信息【指南】', 29 | area: ['500px', '280px'], 30 | fixed: false, //不固定 31 | resize: false, //禁止拉伸 32 | maxmin: true, 33 | shadeClose: 1, 34 | id: 'LAY_helpFlow_mode', 35 | content: '此订阅流量显示只要机场提供接口信息都能获取到,比如:
● 大分部机场都会提供
● 不是通过订阅链接获取的信息无法显示
● 上传 Clash 配置文件的流量也无法显示
● 流量使用情况会有误差和延时,请以机场流量使用情况为准
● 多订阅无法进行准确的流量显示', 36 | }); 37 | } 38 | 39 | function koolclash_helpCHN() { 40 | layer.open({ 41 | type: 0, 42 | shade: 0.1, 43 | skin: 'layui-layer-lan', 44 | scrollbar: 0, 45 | title: 'Clash 绕过大陆IP【指南】', 46 | area: ['460px', '280px'], 47 | fixed: false, //不固定 48 | resize: false, //禁止拉伸 49 | maxmin: true, 50 | shadeClose: 1, 51 | id: 'LAY_helpCHN_mode', 52 | content: '● 开关显示绿色为开启状态、灰色为关闭状态
● 绕过大陆IP基于 iptables 权限高于 Clash 分流规则集
● 使用【访问控制】功能时,请关闭绕过大陆IP
● 绕过大陆IP是基于 CHNRoute 来进行分流
● 绕过大陆IP和 Clash 内置的分流规则一起配合使用,分流更加精准', 53 | }); 54 | } 55 | 56 | function koolclash_helpSubConverter() { 57 | layer.open({ 58 | type: 0, 59 | shade: 0.1, 60 | skin: 'layui-layer-lan', 61 | scrollbar: 0, 62 | title: 'Clash 订阅转换 URL【指南】', 63 | area: ['500px', '260px'], 64 | fixed: false, //不固定 65 | resize: false, //禁止拉伸 66 | maxmin: true, 67 | shadeClose: 1, 68 | id: 'LAY_helpSubConverter_mode', 69 | content: '可以转换SS|SSR|V2ray|Trojan|Clash等订阅链接,比如
● ss://xxx|ssr://xxxx|vemss://xxx|trojan://xxx|https://xxx
● 支持多订阅合并成一个配置,使用“|”分开即可,格式:链接1|链接2
● 订阅框一次输入不能太多(比如超过10个分享链接)可能订阅失败
● 如果需要定时更新,到【附加功能】开启', 70 | }); 71 | } 72 | 73 | function koolclash_portControl_pass() { 74 | layer.open({ 75 | type: 0, 76 | shade: 0.1, 77 | skin: 'layui-layer-lan', 78 | scrollbar: 0, 79 | title: '通过Clash 目标端口【指南】', 80 | area: ['580px', '280px'], 81 | fixed: false, //不固定 82 | resize: false, //禁止拉伸 83 | maxmin: true, 84 | shadeClose: 1, 85 | id: 'LAY_portControl_pass_mode', 86 | content: '●   通过Clash的模式,目标端口默认是全部端口
● 【80,443】Clash 只代理80和443端口流量
● 【常用端口】Clash 只代理常用端口流量
● 【全部端口】Clash 代理全部端口流量👉推荐👈
●   如果选择【全部端口】导致NAS或者一些设备访问不正常,请开启【不通过Clash】解决', 87 | }); 88 | } 89 | 90 | function koolclash_portControl_return() { 91 | layer.open({ 92 | type: 0, 93 | shade: 0.1, 94 | skin: 'layui-layer-lan', 95 | scrollbar: 0, 96 | title: '不通过Clash 目标端口【指南】', 97 | area: ['620px', '280px'], 98 | fixed: false, //不固定 99 | resize: false, //禁止拉伸 100 | maxmin: true, 101 | shadeClose: 1, 102 | id: 'LAY_portControl_return_mode', 103 | content: '●   不通过Clash的模式,目标端口默认是关闭
● 【80,443】80和443端口流量不经过 Clash
● 【常用端口】常用端口流量不经过 Clash
● 【自定义端口】自己自定义端口流量不经过 Clash,输入格式为:80 443 8080
●   如果使用 Clash 代理的过程中导致NAS或者一些设备无法使用,可以使用【不通过Clash】模式下的【自定义端口】来使 Clash 绕过这些设备的端口,使其恢复正常', 104 | }); 105 | } 106 | 107 | function koolclash_CheckIP() { 108 | layer.open({ 109 | type: 2, 110 | //skin: 'myskin', 111 | shade: 0.1, 112 | scrollbar: false, 113 | title: 'IP地址详情页', 114 | area: ['750px', '170px'], 115 | fixed: false, //不固定 116 | resize: false, //禁止拉伸 117 | move: false, 118 | maxmin: true, 119 | shadeClose: 1, 120 | id: 'LAY_koolclash-ip', 121 | content: ['https://ip.skk.moe/simple/', 'no'], 122 | }); 123 | } -------------------------------------------------------------------------------- /koolclash_version: -------------------------------------------------------------------------------- 1 | 0.18.4 2 | -------------------------------------------------------------------------------- /local-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | MODULE="koolclash" 4 | VERSION=`cat ./koolclash/webs/res/koolclash_.version` 5 | TITLE=koolclash 6 | DESCRIPTION="基于规则的代理程序 Clash" 7 | HOME_URL="Module_koolclash.asp" 8 | CHANGELOG="BUG修复" 9 | 10 | # Check and include base 11 | rm -f ${MODULE}.tar.gz 12 | #清理mac os 下文件 13 | #rm -f $MODULE/.DS_Store 14 | #rm -f $MODULE/*/.DS_Store 15 | 16 | rm -f ${MODULE}.tar.gz 17 | tar -zcvf ${MODULE}.tar.gz $MODULE 18 | md5value=`md5sum ${MODULE}.tar.gz|tr " " "\n"|sed -n 1p` 19 | cat > ./version < ./koolclash_version < ./config.json.js <" 8 | echo_date "* 开始解除 Koolshare 软件中心离线安装限制" 9 | 10 | sed -i 's/\tdetect_package/\t# detect_package/g' $KSROOT/scripts/ks_tar_install.sh 11 | 12 | echo_date "* 限制解除完成!" 13 | echo_date "* 你将会看见 Koolshare 软件中心提示安装失败,这是正常现象!" 14 | 15 | exit 1 16 | -------------------------------------------------------------------------------- /remove_restrictions/remove_restrictions.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houzi-/Koolshare-Clash-hack/5f925ac3e9471a701898da5b5ce29e01fe863eec/remove_restrictions/remove_restrictions.tar.gz -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | 0.18.4 2 | e434a35dbc32ae9df11a9dfd7de21fc0 3 | --------------------------------------------------------------------------------