diff --git a/clashoo/Makefile b/clashoo/Makefile index fa45e2c98..72c125524 100644 --- a/clashoo/Makefile +++ b/clashoo/Makefile @@ -6,13 +6,13 @@ PKG_UPSTREAM_TAG:=v$(PKG_UPSTREAM_VERSION) PKG_SHORT_SHA:=3f27ef3 PKG_VERSION:=2026.11.04.$(PKG_UPSTREAM_VERSION) -PKG_RELEASE:=27 +PKG_RELEASE:=28 PKG_SOURCE:=$(PKG_NAME)-stable-$(PKG_UPSTREAM_TAG)-$(PKG_SHORT_SHA).tar.gz PKG_SOURCE_SUBDIR:=$(PKG_NAME)-stable-$(PKG_UPSTREAM_TAG)-$(PKG_SHORT_SHA) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR) PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-clashoo/releases/download/mihomo-src -PKG_SOURCE_VERSION:=205f65fc18f4dd0579b421a2271e9d46ba8cb6f3 +PKG_SOURCE_VERSION:=afda9f677ba3fe1e6150936e01569c273f91af2d PKG_HASH:=skip PKG_BUILD_VERSION:=$(PKG_UPSTREAM_TAG) diff --git a/clashoo/files/usr/share/clashoo/nftables/geoip6_cn.nft b/clashoo/files/usr/share/clashoo/nftables/geoip6_cn.nft index daf983914..8c529b732 100644 --- a/clashoo/files/usr/share/clashoo/nftables/geoip6_cn.nft +++ b/clashoo/files/usr/share/clashoo/nftables/geoip6_cn.nft @@ -87,24 +87,7 @@ set clashoo_china6 { 2400:3cc0::/32, 2400:3e00::/32, 2400:3f40::/32, - 2400:3f60::/46, - 2400:3f60:5::/48, - 2400:3f60:6::/47, - 2400:3f60:8::/45, - 2400:3f60:13::/48, - 2400:3f60:14::/46, - 2400:3f60:18::/45, - 2400:3f60:20::/43, - 2400:3f60:40::/42, - 2400:3f60:80::/41, - 2400:3f60:100::/40, - 2400:3f60:200::/39, - 2400:3f60:400::/38, - 2400:3f60:800::/37, - 2400:3f60:1000::/36, - 2400:3f60:2000::/35, - 2400:3f60:4000::/34, - 2400:3f60:8000::/33, + 2400:3f60::/32, 2400:3fc0::/32, 2400:4440::/32, 2400:44c0::/32, @@ -588,7 +571,6 @@ set clashoo_china6 { 2401:8680:4020::/43, 2401:8680:4040::/42, 2401:8680:4080::/41, - 2401:8680:4100::/48, 2401:8680:4103::/48, 2401:8680:4104::/46, 2401:8680:4108::/45, @@ -962,6 +944,7 @@ set clashoo_china6 { 2402:7da0::/32, 2402:7e20::/32, 2402:7ee0::/32, + 2402:8160::/32, 2402:8180::/32, 2402:8300::/32, 2402:8380::/32, @@ -1259,7 +1242,7 @@ set clashoo_china6 { 2403:6380::/44, 2403:6380:20::/44, 2403:6380:33::/48, - 2403:6380:34::/46, + 2403:6380:36::/47, 2403:6380:38::/45, 2403:6380:41::/48, 2403:6380:44::/46, @@ -1491,9 +1474,6 @@ set clashoo_china6 { 2404:1e80::/32, 2404:1f40::/32, 2404:21c0::/32, - 2404:2280:1000::/36, - 2404:2280:2000::/35, - 2404:2280:4000::/36, 2404:30c0::/32, 2404:3140::/32, 2404:31c0::/32, @@ -1603,6 +1583,7 @@ set clashoo_china6 { 2405:480::/32, 2405:580::/32, 2405:680::/32, + 2405:6c0:1::/48, 2405:6c0:2::/47, 2405:6c0:4::/46, 2405:6c0:8::/45, @@ -2068,8 +2049,8 @@ set clashoo_china6 { 2406:840:a40::/42, 2406:840:a80::/41, 2406:840:b00::/40, - 2406:840:c00::/47, - 2406:840:c03::/48, + 2406:840:c00::/48, + 2406:840:c02::/47, 2406:840:c04::/46, 2406:840:c08::/45, 2406:840:c10::/44, @@ -2226,10 +2207,7 @@ set clashoo_china6 { 2406:840:5d00::/40, 2406:840:5e00::/39, 2406:840:6000::/35, - 2406:840:8000::/40, - 2406:840:8200::/39, - 2406:840:8400::/38, - 2406:840:8800::/37, + 2406:840:8000::/36, 2406:840:9010::/44, 2406:840:9020::/43, 2406:840:9040::/42, @@ -2284,10 +2262,7 @@ set clashoo_china6 { 2406:840:9968::/46, 2406:840:996d::/48, 2406:840:996e::/47, - 2406:840:9970::/46, - 2406:840:9974::/47, - 2406:840:9976::/48, - 2406:840:9978::/45, + 2406:840:9970::/44, 2406:840:9981::/48, 2406:840:9982::/47, 2406:840:9984::/46, @@ -2319,9 +2294,7 @@ set clashoo_china6 { 2406:840:e0d0::/44, 2406:840:e0e4::/48, 2406:840:e0e6::/47, - 2406:840:e0e9::/48, - 2406:840:e0ea::/47, - 2406:840:e0ec::/46, + 2406:840:e0e8::/45, 2406:840:e0f0::/44, 2406:840:e100::/45, 2406:840:e108::/46, @@ -2342,9 +2315,7 @@ set clashoo_china6 { 2406:840:e220::/43, 2406:840:e240::/43, 2406:840:e260::/44, - 2406:840:e271::/48, - 2406:840:e272::/47, - 2406:840:e274::/46, + 2406:840:e270::/45, 2406:840:e278::/46, 2406:840:e27c::/47, 2406:840:e27e::/48, @@ -2408,7 +2379,7 @@ set clashoo_china6 { 2406:840:ea00::/40, 2406:840:eb06::/48, 2406:840:eb09::/48, - 2406:840:eb0a::/47, + 2406:840:eb0a::/48, 2406:840:eb0c::/47, 2406:840:eb0e::/48, 2406:840:eb10::/44, @@ -2656,7 +2627,10 @@ set clashoo_china6 { 2406:840:fee8::/46, 2406:840:feec::/48, 2406:840:feee::/47, - 2406:840:ff00::/40, + 2406:840:feff::/48, + 2406:840:ff20::/43, + 2406:840:ff40::/42, + 2406:840:ff80::/41, 2406:880::/32, 2406:8c0::/32, 2406:d80::/32, @@ -3064,7 +3038,26 @@ set clashoo_china6 { 2407:fb80::/32, 2407:fc80::/32, 2407:fd80::/32, - 2408:4000::/28, + 2408:4000::/40, + 2408:4000:100::/47, + 2408:4000:103::/48, + 2408:4000:104::/46, + 2408:4000:108::/45, + 2408:4000:110::/44, + 2408:4000:120::/43, + 2408:4000:140::/42, + 2408:4000:180::/41, + 2408:4000:200::/39, + 2408:4000:400::/38, + 2408:4000:800::/37, + 2408:4000:1000::/36, + 2408:4000:2000::/35, + 2408:4000:4000::/34, + 2408:4000:8000::/33, + 2408:4001::/32, + 2408:4002::/31, + 2408:4004::/30, + 2408:4008::/29, 2408:4010::/30, 2408:4014::/31, 2408:4016:1::/48, @@ -3130,40 +3123,6 @@ set clashoo_china6 { 240a:a000::/20, 240a:c000::/20, 240b:2000::/22, - 240b:4000::/31, - 240b:4002::/36, - 240b:4002:1000::/44, - 240b:4002:1011::/48, - 240b:4002:1012::/47, - 240b:4002:1014::/46, - 240b:4002:1018::/45, - 240b:4002:1020::/43, - 240b:4002:1040::/42, - 240b:4002:1080::/41, - 240b:4002:1100::/40, - 240b:4002:1200::/39, - 240b:4002:1400::/38, - 240b:4002:1800::/37, - 240b:4002:2000::/35, - 240b:4002:4000::/34, - 240b:4002:8000::/33, - 240b:4004::/31, - 240b:4006::/48, - 240b:4006:1000::/43, - 240b:4006:1020::/44, - 240b:4006:1100::/44, - 240b:4006:1110::/45, - 240b:4006:1118::/46, - 240b:4007::/32, - 240b:4009::/32, - 240b:400b::/32, - 240b:400c::/30, - 240b:4010:fffe::/47, - 240b:4011::/32, - 240b:4012::/31, - 240b:4014::/30, - 240b:4018::/30, - 240b:401f::/32, 240b:6000::/20, 240b:8000::/21, 240b:a000::/25, @@ -3320,6 +3279,7 @@ set clashoo_china6 { 2a04:f580:9280::/48, 2a04:f580:9290::/48, 2a05:1085::/32, + 2a06:9801:20::/48, 2a0a:2840::/29, 2a0a:d680::/37, 2a0a:d680:800::/39, @@ -3361,7 +3321,6 @@ set clashoo_china6 { 2a0a:d682::/33, 2a0a:d682:8000::/34, 2a0a:d682:c000::/36, - 2a0a:d683::/32, 2a0a:d684::/32, 2a0a:d685::/40, 2a0a:d685:100::/41, @@ -3377,7 +3336,6 @@ set clashoo_china6 { 2a0a:d685:1f0::/45, 2a0a:d685:1f8::/47, 2a0a:d685:1fa::/48, - 2a0a:d685:200::/48, 2a0a:d685:202::/47, 2a0a:d685:204::/46, 2a0a:d685:208::/45, @@ -3386,7 +3344,10 @@ set clashoo_china6 { 2a0a:d685:240::/42, 2a0a:d685:280::/41, 2a0a:d685:400::/40, - 2a0a:d685:500::/45, + 2a0a:d685:500::/48, + 2a0a:d685:502::/47, + 2a0a:d685:504::/48, + 2a0a:d685:506::/47, 2a0a:d685:508::/48, 2a0a:d685:50a::/47, 2a0a:d685:50c::/46, diff --git a/clashoo/files/usr/share/clashoo/nftables/geoip_cn.nft b/clashoo/files/usr/share/clashoo/nftables/geoip_cn.nft index 37b399112..18befeb01 100644 --- a/clashoo/files/usr/share/clashoo/nftables/geoip_cn.nft +++ b/clashoo/files/usr/share/clashoo/nftables/geoip_cn.nft @@ -64,7 +64,6 @@ set clashoo_china { 5.10.138.0/23, 5.10.140.0/24, 5.10.143.0/24, - 5.181.224.0/23, 8.128.4.0/22, 8.128.32.0/19, 8.128.64.0/19, @@ -89,95 +88,14 @@ set clashoo_china { 8.162.0.0/17, 8.163.0.0/16, 8.164.0.0/14, - 8.168.0.0/15, + 8.168.0.0/14, 8.176.0.0/17, 8.176.128.0/19, - 8.208.0.0/17, - 8.208.128.0/21, - 8.208.140.0/22, - 8.208.144.0/20, - 8.208.160.0/19, - 8.208.192.0/18, - 8.209.0.0/19, - 8.209.36.0/22, - 8.209.40.0/21, - 8.209.48.0/20, - 8.209.64.0/18, - 8.209.128.0/18, - 8.209.192.0/24, - 8.209.194.0/23, - 8.209.196.0/22, - 8.209.200.0/21, - 8.209.208.0/20, - 8.209.224.0/19, - 8.210.0.0/16, - 8.211.0.0/17, - 8.211.128.0/18, - 8.211.192.0/19, - 8.211.224.0/22, - 8.211.232.0/21, - 8.211.240.0/20, - 8.212.0.0/18, - 8.212.64.0/20, - 8.212.80.0/21, - 8.212.88.0/22, - 8.212.92.0/24, - 8.212.94.0/23, - 8.212.96.0/22, - 8.212.104.0/21, - 8.212.112.0/20, - 8.212.128.0/19, - 8.212.160.0/20, - 8.212.176.0/21, - 8.212.188.0/22, - 8.212.192.0/18, - 8.213.0.0/16, - 8.214.0.0/17, - 8.214.128.0/19, - 8.214.164.0/22, - 8.214.168.0/21, - 8.214.176.0/20, - 8.214.192.0/18, - 8.215.0.0/17, - 8.215.128.0/19, - 8.215.160.0/22, - 8.215.168.0/21, - 8.215.176.0/20, - 8.215.192.0/18, - 8.216.0.0/18, - 8.216.64.0/21, - 8.216.72.0/22, - 8.216.80.0/20, - 8.216.96.0/19, - 8.216.128.0/17, - 8.217.0.0/16, - 8.218.0.0/15, - 8.220.0.0/18, - 8.220.64.0/19, - 8.220.96.0/20, - 8.220.112.0/21, - 8.220.120.0/22, - 8.220.128.0/19, - 8.220.160.0/21, - 8.220.172.0/22, - 8.220.176.0/20, - 8.220.192.0/19, - 8.220.224.0/21, - 8.220.232.0/22, - 8.220.240.0/21, - 8.221.0.0/17, - 8.221.128.0/20, - 8.221.144.0/21, - 8.221.156.0/22, - 8.221.160.0/19, - 8.221.192.0/18, - 8.222.0.0/15, 14.0.0.0/21, 14.0.12.0/22, 14.1.0.0/22, 14.1.24.0/22, 14.1.108.0/22, - 14.1.112.0/22, 14.16.0.0/12, 14.102.128.0/22, 14.102.180.0/22, @@ -208,6 +126,7 @@ set clashoo_china { 27.54.72.0/21, 27.54.152.0/21, 27.54.192.0/18, + 27.98.202.0/23, 27.98.208.0/20, 27.98.224.0/19, 27.99.128.0/17, @@ -390,79 +309,6 @@ set clashoo_china { 42.242.0.0/15, 42.244.0.0/14, 42.248.0.0/13, - 43.90.0.0/16, - 43.92.0.0/15, - 43.94.0.0/18, - 43.96.0.0/23, - 43.96.2.130/32, - 43.96.3.0/24, - 43.96.4.0/22, - 43.96.8.0/22, - 43.96.16.130/32, - 43.96.18.0/24, - 43.96.20.0/22, - 43.96.24.0/22, - 43.96.32.0/22, - 43.96.36.130/32, - 43.96.40.0/24, - 43.96.42.0/24, - 43.96.44.0/23, - 43.96.46.0/24, - 43.96.48.0/21, - 43.96.59.0/24, - 43.96.60.0/24, - 43.96.62.0/23, - 43.96.64.0/21, - 43.96.72.0/22, - 43.96.77.131/32, - 43.96.78.0/24, - 43.96.80.0/23, - 43.96.85.0/24, - 43.96.86.0/24, - 43.96.88.0/23, - 43.96.90.0/24, - 43.96.92.0/22, - 43.96.96.0/23, - 43.96.100.0/23, - 43.96.103.0/24, - 43.96.104.0/23, - 43.96.107.0/24, - 43.96.109.0/24, - 43.96.110.0/23, - 43.96.112.0/22, - 43.96.116.0/24, - 43.96.118.0/23, - 43.96.120.0/24, - 43.96.122.0/24, - 43.96.124.0/23, - 43.96.126.0/24, - 43.97.0.0/17, - 43.98.0.0/15, - 43.100.0.0/15, - 43.102.0.0/17, - 43.102.192.0/18, - 43.103.0.0/16, - 43.104.0.0/14, - 43.108.0.0/16, - 43.110.0.0/15, - 43.112.0.0/15, - 43.114.0.0/16, - 43.116.0.0/17, - 43.116.160.0/24, - 43.116.192.0/18, - 43.117.0.0/16, - 43.118.0.0/17, - 43.118.128.0/18, - 43.119.0.0/16, - 43.120.0.0/15, - 43.122.0.0/16, - 43.123.0.0/17, - 43.123.128.0/18, - 43.124.0.0/16, - 43.125.0.0/19, - 43.125.32.0/20, - 43.125.48.0/21, - 43.126.0.0/17, 43.136.0.0/13, 43.144.0.0/15, 43.148.0.0/14, @@ -765,7 +611,9 @@ set clashoo_china { 45.113.168.0/22, 45.113.176.0/22, 45.113.184.0/22, - 45.113.200.0/21, + 45.113.200.0/23, + 45.113.202.0/24, + 45.113.204.0/22, 45.113.208.0/20, 45.113.240.0/22, 45.113.252.0/22, @@ -885,7 +733,6 @@ set clashoo_china { 45.127.128.0/22, 45.127.144.0/21, 45.127.156.0/22, - 45.199.179.0/24, 45.248.8.0/22, 45.248.80.0/21, 45.248.96.0/20, @@ -989,158 +836,8 @@ set clashoo_china { 45.255.224.0/20, 45.255.240.0/21, 45.255.248.0/22, - 47.52.0.0/16, - 47.56.0.0/16, - 47.57.0.0/17, - 47.57.128.0/18, - 47.57.192.0/22, - 47.57.196.0/24, - 47.57.198.0/23, - 47.57.200.0/21, - 47.57.208.0/20, - 47.57.224.0/19, - 47.74.0.0/15, - 47.76.0.0/16, - 47.77.0.0/20, - 47.77.16.0/21, - 47.77.24.0/22, - 47.77.32.0/19, - 47.77.64.0/19, - 47.77.96.0/20, - 47.77.112.0/23, - 47.77.128.0/17, - 47.78.0.0/15, - 47.80.0.0/14, - 47.84.0.0/15, - 47.86.0.0/16, - 47.87.0.0/20, - 47.87.16.0/21, - 47.87.32.0/19, - 47.87.64.0/21, - 47.87.80.0/20, - 47.87.96.0/19, - 47.87.128.0/20, - 47.87.144.0/21, - 47.87.156.0/22, - 47.87.160.0/19, - 47.87.192.0/18, - 47.88.0.0/16, - 47.89.0.0/18, - 47.89.72.0/21, - 47.89.80.0/22, - 47.89.84.0/24, - 47.89.88.0/23, - 47.89.90.0/24, - 47.89.92.0/22, - 47.89.96.0/20, - 47.89.122.0/23, - 47.89.124.0/23, - 47.89.128.0/17, - 47.90.0.0/17, - 47.90.128.0/19, - 47.90.160.0/21, - 47.90.168.0/22, - 47.90.176.0/20, - 47.90.192.0/18, - 47.91.0.0/16, 47.92.0.0/14, 47.96.0.0/11, - 47.235.0.0/21, - 47.235.8.0/22, - 47.235.12.0/23, - 47.235.16.0/20, - 47.236.0.0/17, - 47.236.128.0/18, - 47.236.192.0/20, - 47.236.208.0/21, - 47.236.220.0/22, - 47.236.224.0/19, - 47.237.0.0/17, - 47.237.128.0/18, - 47.237.192.0/19, - 47.237.224.0/20, - 47.237.240.0/21, - 47.237.249.0/24, - 47.237.250.0/23, - 47.237.252.0/22, - 47.238.0.0/20, - 47.238.16.0/21, - 47.238.28.0/22, - 47.238.32.0/19, - 47.238.64.0/18, - 47.238.128.0/17, - 47.239.0.0/16, - 47.240.0.0/14, - 47.244.0.0/16, - 47.245.0.0/17, - 47.245.128.0/20, - 47.245.144.0/21, - 47.245.152.0/22, - 47.245.160.0/19, - 47.245.192.0/20, - 47.245.208.0/21, - 47.245.216.0/22, - 47.245.224.0/19, - 47.246.32.0/22, - 47.246.66.0/23, - 47.246.68.0/23, - 47.246.72.0/21, - 47.246.82.0/23, - 47.246.84.0/22, - 47.246.88.0/23, - 47.246.91.0/24, - 47.246.92.0/23, - 47.246.96.0/22, - 47.246.101.0/24, - 47.246.102.0/23, - 47.246.104.0/21, - 47.246.120.0/24, - 47.246.122.0/23, - 47.246.124.0/23, - 47.246.128.0/23, - 47.246.131.0/24, - 47.246.132.0/23, - 47.246.135.0/24, - 47.246.136.0/21, - 47.246.144.0/22, - 47.246.150.0/23, - 47.246.152.0/22, - 47.246.157.0/24, - 47.246.158.0/23, - 47.246.160.0/23, - 47.246.162.0/24, - 47.246.164.0/22, - 47.246.168.0/21, - 47.246.176.0/20, - 47.246.192.0/20, - 47.246.208.0/23, - 47.246.212.0/22, - 47.246.216.0/22, - 47.250.0.0/18, - 47.250.68.0/22, - 47.250.72.0/21, - 47.250.80.0/20, - 47.250.96.0/21, - 47.250.108.0/22, - 47.250.112.0/20, - 47.250.128.0/17, - 47.251.0.0/17, - 47.251.132.0/22, - 47.251.136.0/21, - 47.251.144.0/20, - 47.251.160.0/19, - 47.251.196.0/22, - 47.251.200.0/21, - 47.251.208.0/20, - 47.251.224.0/19, - 47.252.0.0/16, - 47.253.0.0/18, - 47.253.64.0/19, - 47.253.96.0/20, - 47.253.112.0/21, - 47.253.120.0/22, - 47.253.128.0/17, - 47.254.0.0/16, 49.4.0.0/17, 49.4.128.0/22, 49.4.160.0/20, @@ -1191,7 +888,7 @@ set clashoo_china { 58.30.0.0/15, 58.32.0.0/11, 58.65.232.0/21, - 58.67.128.0/17, + 58.66.0.0/15, 58.68.224.0/19, 58.82.0.0/17, 58.83.0.0/16, @@ -1207,9 +904,7 @@ set clashoo_china { 59.32.0.0/11, 59.64.0.0/12, 59.80.0.0/14, - 59.107.0.0/17, - 59.107.226.0/24, - 59.107.255.0/24, + 59.107.0.0/16, 59.108.0.0/14, 59.151.0.0/17, 59.152.16.0/20, @@ -1278,7 +973,6 @@ set clashoo_china { 61.232.0.0/14, 61.236.0.0/15, 61.240.0.0/14, - 62.182.190.0/23, 62.234.0.0/16, 63.140.0.0/24, 63.140.3.0/24, @@ -1305,6 +999,7 @@ set clashoo_china { 81.173.28.0/24, 82.156.0.0/15, 94.191.0.0/17, + 95.82.8.0/23, 101.0.0.0/22, 101.1.0.0/22, 101.2.172.0/22, @@ -1524,7 +1219,7 @@ set clashoo_china { 103.19.64.0/21, 103.19.72.0/22, 103.19.233.0/24, - 103.19.234.0/23, + 103.19.235.0/24, 103.20.12.0/22, 103.20.32.0/24, 103.20.34.0/23, @@ -1801,7 +1496,8 @@ set clashoo_china { 103.53.64.0/21, 103.53.92.0/22, 103.53.100.0/22, - 103.53.124.0/22, + 103.53.124.0/23, + 103.53.126.0/24, 103.53.128.0/20, 103.53.144.0/22, 103.53.180.0/22, @@ -1982,6 +1678,7 @@ set clashoo_china { 103.74.48.0/22, 103.74.56.0/21, 103.74.80.0/22, + 103.74.124.0/24, 103.74.126.0/23, 103.74.148.0/22, 103.74.152.0/21, @@ -2042,7 +1739,7 @@ set clashoo_china { 103.81.120.0/22, 103.81.148.0/22, 103.81.164.0/22, - 103.81.184.0/22, + 103.81.184.0/23, 103.81.200.0/22, 103.81.232.0/22, 103.82.60.0/22, @@ -2337,6 +2034,7 @@ set clashoo_china { 103.114.212.0/22, 103.114.236.0/22, 103.114.240.0/22, + 103.115.19.0/24, 103.115.52.0/22, 103.115.68.0/22, 103.115.92.0/22, @@ -2364,7 +2062,6 @@ set clashoo_china { 103.118.64.0/21, 103.118.72.0/22, 103.118.88.0/22, - 103.118.210.0/23, 103.118.212.0/22, 103.118.216.0/22, 103.118.248.0/22, @@ -2653,6 +2350,7 @@ set clashoo_china { 103.177.28.0/23, 103.177.44.0/23, 103.177.71.0/24, + 103.177.136.0/24, 103.177.162.0/23, 103.178.240.0/23, 103.179.76.0/22, @@ -3259,7 +2957,16 @@ set clashoo_china { 110.6.0.0/15, 110.16.0.0/14, 110.34.40.0/21, - 110.40.0.0/14, + 110.40.0.0/15, + 110.42.0.0/20, + 110.42.16.0/24, + 110.42.18.0/23, + 110.42.20.0/22, + 110.42.24.0/21, + 110.42.32.0/19, + 110.42.64.0/18, + 110.42.128.0/17, + 110.43.0.0/16, 110.44.12.0/22, 110.44.144.0/20, 110.48.0.0/16, @@ -3578,7 +3285,6 @@ set clashoo_china { 116.242.0.0/15, 116.244.0.0/14, 116.248.0.0/15, - 116.251.64.0/18, 116.252.0.0/15, 116.254.104.0/21, 116.254.128.0/17, @@ -3870,7 +3576,9 @@ set clashoo_china { 121.248.0.0/14, 121.255.0.0/16, 122.0.64.0/18, - 122.0.128.0/17, + 122.0.160.0/19, + 122.0.192.0/19, + 122.0.224.0/20, 122.4.0.0/14, 122.8.52.0/22, 122.8.57.0/24, @@ -4035,10 +3743,19 @@ set clashoo_china { 124.6.64.0/18, 124.14.0.0/15, 124.16.0.0/15, - 124.20.0.0/16, + 124.20.32.0/19, + 124.20.64.0/19, + 124.20.96.0/20, + 124.20.128.0/18, + 124.20.192.0/19, + 124.20.240.0/20, 124.21.32.0/19, - 124.21.64.0/18, - 124.21.128.0/17, + 124.21.80.0/20, + 124.21.96.0/19, + 124.21.144.0/20, + 124.21.160.0/19, + 124.21.208.0/20, + 124.21.224.0/19, 124.22.0.0/15, 124.28.192.0/18, 124.29.0.0/17, @@ -4076,15 +3793,7 @@ set clashoo_china { 124.151.0.0/16, 124.152.0.0/16, 124.160.0.0/13, - 124.172.87.0/24, - 124.172.88.0/23, - 124.172.91.0/24, - 124.172.93.0/24, - 124.172.128.0/17, - 124.173.64.0/18, - 124.173.128.0/18, - 124.173.205.0/24, - 124.174.0.0/15, + 124.172.0.0/14, 124.192.0.0/15, 124.196.0.0/16, 124.197.56.0/21, @@ -4153,15 +3862,6 @@ set clashoo_china { 139.5.212.0/22, 139.5.244.0/22, 139.9.0.0/16, - 139.95.0.0/20, - 139.95.16.0/22, - 139.95.22.0/23, - 139.95.24.0/21, - 139.95.32.0/21, - 139.95.40.0/23, - 139.95.64.0/23, - 139.95.96.0/22, - 139.95.128.0/17, 139.129.0.0/16, 139.148.0.0/16, 139.155.0.0/16, @@ -4222,7 +3922,14 @@ set clashoo_china { 140.179.0.0/16, 140.205.0.0/16, 140.206.0.0/15, - 140.210.0.0/16, + 140.210.0.0/20, + 140.210.17.0/24, + 140.210.18.0/24, + 140.210.20.0/22, + 140.210.24.0/21, + 140.210.32.0/19, + 140.210.64.0/18, + 140.210.128.0/17, 140.224.0.0/16, 140.237.0.0/16, 140.240.0.0/16, @@ -4279,23 +3986,9 @@ set clashoo_china { 146.222.94.0/24, 147.78.132.0/24, 147.78.134.0/24, - 147.139.0.0/17, - 147.139.128.0/18, - 147.139.192.0/19, - 147.139.224.0/20, - 147.139.240.0/21, - 147.139.248.0/22, 148.70.0.0/16, 149.41.64.0/18, 149.41.192.0/19, - 149.129.0.0/20, - 149.129.16.0/21, - 149.129.32.0/19, - 149.129.64.0/18, - 149.129.128.0/19, - 149.129.168.0/21, - 149.129.176.0/20, - 149.129.192.0/18, 150.0.0.0/16, 150.115.0.0/16, 150.121.0.0/16, @@ -4335,7 +4028,7 @@ set clashoo_china { 151.158.14.0/23, 151.158.78.0/23, 151.158.80.0/23, - 151.158.122.0/23, + 151.158.123.0/24, 152.104.128.0/17, 152.136.0.0/16, 153.0.0.0/16, @@ -4353,10 +4046,6 @@ set clashoo_china { 156.107.170.0/24, 156.107.179.0/24, 156.107.181.0/24, - 156.227.20.0/24, - 156.236.12.0/24, - 156.236.17.0/24, - 156.245.1.0/24, 157.0.0.0/16, 157.10.34.0/23, 157.10.36.0/23, @@ -4452,7 +4141,6 @@ set clashoo_china { 160.250.170.0/23, 160.250.214.0/23, 160.250.252.0/23, - 161.117.0.0/16, 161.163.0.0/21, 161.163.28.0/23, 161.189.0.0/16, @@ -4510,7 +4198,9 @@ set clashoo_china { 163.204.0.0/16, 163.223.28.0/23, 163.223.32.0/23, + 163.223.72.0/23, 163.223.124.0/23, + 163.223.216.0/24, 163.223.222.0/23, 163.227.34.0/23, 163.227.40.0/23, @@ -4538,29 +4228,6 @@ set clashoo_china { 167.189.0.0/16, 167.220.244.0/22, 168.160.0.0/16, - 170.33.15.0/24, - 170.33.20.0/22, - 170.33.24.0/24, - 170.33.29.0/24, - 170.33.30.0/23, - 170.33.32.0/22, - 170.33.41.0/24, - 170.33.64.0/23, - 170.33.66.0/24, - 170.33.68.0/23, - 170.33.72.0/23, - 170.33.76.0/22, - 170.33.80.0/22, - 170.33.84.0/24, - 170.33.104.0/22, - 170.33.112.0/23, - 170.33.114.0/24, - 170.33.129.0/24, - 170.33.130.0/23, - 170.33.136.0/23, - 170.33.138.0/24, - 170.33.168.0/23, - 170.33.192.0/23, 170.179.0.0/16, 171.8.0.0/13, 171.34.0.0/15, @@ -4601,7 +4268,10 @@ set clashoo_china { 177.201.160.0/19, 177.203.96.0/19, 177.203.224.0/19, + 178.236.38.0/23, + 178.236.233.0/24, 178.236.234.0/24, + 178.236.237.0/24, 179.236.0.0/19, 180.76.16.0/20, 180.76.32.0/19, @@ -4739,12 +4409,6 @@ set clashoo_china { 193.119.0.0/19, 194.138.202.0/23, 194.138.245.0/24, - 198.11.128.0/20, - 198.11.145.0/24, - 198.11.146.0/23, - 198.11.148.0/22, - 198.11.152.0/21, - 198.11.160.0/19, 198.175.100.0/22, 198.208.17.0/24, 198.208.19.0/24, @@ -5115,7 +4779,8 @@ set clashoo_china { 202.143.56.0/21, 202.143.100.0/22, 202.143.104.0/22, - 202.144.196.0/22, + 202.144.196.0/23, + 202.144.198.0/24, 202.146.160.0/20, 202.146.184.0/23, 202.146.186.0/24, @@ -6100,7 +5765,17 @@ set clashoo_china { 203.104.32.0/20, 203.105.96.0/19, 203.105.128.0/19, - 203.107.0.0/17, + 203.107.0.0/23, + 203.107.2.0/24, + 203.107.4.0/22, + 203.107.8.0/21, + 203.107.16.0/20, + 203.107.32.0/19, + 203.107.69.0/24, + 203.107.70.0/23, + 203.107.72.0/21, + 203.107.80.0/20, + 203.107.96.0/19, 203.110.160.0/19, 203.110.208.0/20, 203.110.232.0/23, @@ -6238,8 +5913,6 @@ set clashoo_china { 203.223.16.0/24, 203.223.21.0/24, 203.223.22.0/23, - 205.204.96.0/19, - 206.109.70.0/23, 206.109.75.0/24, 210.2.0.0/19, 210.5.0.0/19, @@ -6286,7 +5959,7 @@ set clashoo_china { 211.100.0.0/15, 211.102.0.0/17, 211.102.128.0/21, - 211.102.144.0/21, + 211.102.144.0/20, 211.102.160.0/20, 211.102.192.0/18, 211.103.0.0/16, @@ -6295,6 +5968,7 @@ set clashoo_china { 211.148.0.0/16, 211.149.0.0/19, 211.149.32.0/22, + 211.149.44.0/22, 211.149.48.0/21, 211.149.64.0/21, 211.149.80.0/21, @@ -6336,9 +6010,7 @@ set clashoo_china { 218.30.32.0/22, 218.30.36.0/23, 218.30.38.0/24, - 218.30.40.0/22, - 218.30.45.0/24, - 218.30.46.0/23, + 218.30.40.0/21, 218.30.48.0/21, 218.30.56.0/22, 218.30.60.0/23, @@ -6492,9 +6164,11 @@ set clashoo_china { 223.122.18.0/23, 223.122.20.0/22, 223.122.26.0/23, - 223.122.28.0/23, + 223.122.29.0/24, + 223.123.176.0/21, 223.123.196.0/22, - 223.123.204.0/22, + 223.123.205.0/24, + 223.123.206.0/23, 223.123.208.0/20, 223.123.224.0/19, 223.124.0.0/14, diff --git a/clashoo/files/usr/share/clashoo/ruleset/cn-ip.srs b/clashoo/files/usr/share/clashoo/ruleset/cn-ip.srs index 03e9ee7ff..29c86af01 100644 Binary files a/clashoo/files/usr/share/clashoo/ruleset/cn-ip.srs and b/clashoo/files/usr/share/clashoo/ruleset/cn-ip.srs differ diff --git a/clashoo/files/usr/share/clashoo/ruleset/geolocation-!cn.srs b/clashoo/files/usr/share/clashoo/ruleset/geolocation-!cn.srs index b1101499d..aa25f70b0 100644 Binary files a/clashoo/files/usr/share/clashoo/ruleset/geolocation-!cn.srs and b/clashoo/files/usr/share/clashoo/ruleset/geolocation-!cn.srs differ diff --git a/clashoo/files/usr/share/clashoo/ruleset/geosite-cn.srs b/clashoo/files/usr/share/clashoo/ruleset/geosite-cn.srs index 9e4d515d8..ed14dfc06 100644 Binary files a/clashoo/files/usr/share/clashoo/ruleset/geosite-cn.srs and b/clashoo/files/usr/share/clashoo/ruleset/geosite-cn.srs differ diff --git a/dae/Makefile b/dae/Makefile index 8d62c0f85..7a31a0500 100644 --- a/dae/Makefile +++ b/dae/Makefile @@ -5,10 +5,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dae -PKG_VERSION:=2026.11.05 -PKG_RELEASE:=54 +PKG_VERSION:=2026.11.09 +PKG_RELEASE:=55 -PKG_SOURCE:=dae-src-2026.11.05-7cf97ff42dc6.tar.gz +PKG_SOURCE:=dae-src-2026.11.09-45df6d7de7ee.tar.gz PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_HASH:=skip diff --git a/daed/Makefile b/daed/Makefile index ae25fad28..ab1cc7caf 100644 --- a/daed/Makefile +++ b/daed/Makefile @@ -5,10 +5,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=daed -PKG_VERSION:=2026.11.05 -PKG_RELEASE:=66 +PKG_VERSION:=2026.11.09 +PKG_RELEASE:=67 -PKG_SOURCE:=daed-src-2026.11.05-b1e30bc02200.tar.gz +PKG_SOURCE:=daed-src-2026.11.09-82f4f6af67da.tar.gz PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_HASH:=skip diff --git a/ddns-go/Makefile b/ddns-go/Makefile index f1d4d5016..7e41a763d 100644 --- a/ddns-go/Makefile +++ b/ddns-go/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ddns-go -PKG_VERSION:=6.17.7 -PKG_RELEASE:=24 +PKG_VERSION:=6.17.8 +PKG_RELEASE:=25 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)? diff --git a/fastnet/Makefile b/fastnet/Makefile index 5499467be..6c0258e9b 100644 --- a/fastnet/Makefile +++ b/fastnet/Makefile @@ -9,8 +9,8 @@ include $(TOPDIR)/rules.mk PKG_ARCH_FASTNET:=$(ARCH) PKG_NAME:=fastnet -PKG_VERSION:=0.8.0 -PKG_RELEASE:=8 +PKG_VERSION:=0.8.1 +PKG_RELEASE:=9 PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/fastnet-runtime-v$(PKG_VERSION)/ diff --git a/luci-app-fastnet/Makefile b/luci-app-fastnet/Makefile index ce5764f0c..f9d807f63 100644 --- a/luci-app-fastnet/Makefile +++ b/luci-app-fastnet/Makefile @@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI support for fastnet LUCI_DEPENDS:=+fastnet +luci-lib-linkeaseauth +linkease-app-entry LUCI_PKGARCH:=all -PKG_VERSION:=0.8.0-r5 -PKG_RELEASE:=6 +PKG_VERSION:=0.8.1-r5 +PKG_RELEASE:=7 LUCI_MINIFY_CSS:=0 LUCI_MINIFY_JS:=0 diff --git a/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js b/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js index 16098d4a3..b25a7b4a9 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js @@ -240,7 +240,7 @@ function renderListeners(s, uciconfig, isClient) { } } o.renderWidget = function(section_id, option_index, cfgvalue) { - let node = form.Value.prototype.renderWidget.call(this, section_id, option_index, cfgvalue); + let node = form.Value.prototype.renderWidget.apply(this, arguments); const cbid = this.cbid(section_id) + '._keytype_select'; const selected = this.hm_options.type; @@ -305,7 +305,7 @@ function renderListeners(s, uciconfig, isClient) { o = s.taboption('field_general', form.DynamicList, 'sudoku_custom_tables', _('Custom byte layout'), _('Only applies to the %s.').format(_('Low-entropy data stream'))); - o.renderWidget = function(/* ... */) { + o.renderWidget = function(section_id, option_index, cfgvalue) { let node = form.DynamicList.prototype.renderWidget.apply(this, arguments); (node.querySelector('.control-group') || node).appendChild(E('button', { @@ -954,7 +954,7 @@ function renderListeners(s, uciconfig, isClient) { } } o.renderWidget = function(section_id, option_index, cfgvalue) { - let node = hm.TextValue.prototype.renderWidget.call(this, section_id, option_index, cfgvalue); + let node = hm.TextValue.prototype.renderWidget.apply(this, arguments); const cbid = this.cbid(section_id) + '._keytype_select'; const selected = this.hm_options.type; @@ -1216,7 +1216,7 @@ function renderListeners(s, uciconfig, isClient) { } } o.renderWidget = function(section_id, option_index, cfgvalue) { - let node = hm.TextValue.prototype.renderWidget.call(this, section_id, option_index, cfgvalue); + let node = hm.TextValue.prototype.renderWidget.apply(this, arguments); const cbid = this.cbid(section_id) + '._outer_sni'; node.appendChild(E('div', { 'class': 'control-group' }, [ diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js index 63735986c..5e46b3688 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js @@ -596,7 +596,7 @@ return view.extend({ } } so.renderWidget = function(section_id, option_index, cfgvalue) { - let node = hm.TextValue.prototype.renderWidget.call(this, section_id, option_index, cfgvalue); + let node = hm.TextValue.prototype.renderWidget.apply(this, arguments); const cbid = this.cbid(section_id) + '._outer_sni'; node.appendChild(E('div', { 'class': 'control-group' }, [ diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js index 94fcca8f9..84cc2e400 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js @@ -2459,7 +2459,7 @@ return view.extend({ } } so.renderWidget = function(section_id, option_index, cfgvalue) { - let node = form.Value.prototype.renderWidget.call(this, section_id, option_index, cfgvalue); + let node = form.Value.prototype.renderWidget.apply(this, arguments); const cbid = this.cbid(section_id) + '._keytype_select'; const selected = this.hm_options.type; diff --git a/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc b/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc index c3e9c8242..9952da33e 100644 --- a/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc +++ b/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc @@ -121,6 +121,20 @@ function parse_filter(cfg) { return cfg; } +function get_listener(cfg, no_verify) { + if (isEmpty(cfg)) + return null; + + const label = uci.get(uciconf, cfg, 'label'); + if (isEmpty(label)) { + if (no_verify) + return cfg; + else + die(sprintf("%s's label is missing, please check your configuration.", cfg)); + } else + return label; +} + function get_proxy(cfg, no_verify) { if (isEmpty(cfg)) return null; @@ -179,7 +193,11 @@ function parse_entry(cfg) { function _payloadStrategy(payload) { // LOGIC_TYPE,((payload1),(payload2)) if (payload.factor === null || (type(payload.factor) in ['bool', 'int', 'string'])) { - return sprintf(payload.deny ? 'NOT,((%s))' : '%s', join(',', [payload.type, payload.factor ?? ''])); + return sprintf(payload.deny ? 'NOT,((%s))' : '%s', join(',', + (payload.type === 'IN-NAME') + ? [payload.type, get_listener(payload.factor) ?? ''] + : [payload.type, payload.factor ?? ''] + )); } else if (type(payload.factor) === 'array') { return sprintf(`${payload.type},(%s)`, join(',', map(payload.factor, p => `(${_payloadStrategy(p)})`))); } else if (type(payload.factor) === 'object') { @@ -352,22 +370,7 @@ uci.foreach(uciconf, uciinbd, (cfg) => { if (cfg.enabled === '0') return; - const listener = parseListener(cfg); - listener.proxy = get_proxy(listener.proxy); - if (listener["reality-config"]) - listener["reality-config"].proxy = get_proxy(listener["reality-config"].proxy); - if (listener["shadow-tls"]) - listener["shadow-tls"].handshake.proxy = get_proxy(listener["shadow-tls"].handshake.proxy); - if (listener["res-tls"]) - listener["res-tls"].proxy = get_proxy(listener["res-tls"].proxy); - if (listener["jls-config"]) - listener["jls-config"].proxy = get_proxy(listener["jls-config"].proxy); - if (listener["jls-upstream"]) - listener["jls-upstream"].proxy = get_proxy(listener["jls-upstream"].proxy); - if (listener["realm-opts"]) - listener["realm-opts"].proxy = get_proxy(listener["realm-opts"].proxy); - - push(config.listeners, listener); + push(config.listeners, parseListener(cfg, get_proxy)); }); /* Tun settings */ if (match(proxy_mode, /tun/)) diff --git a/luci-app-fchomo/root/usr/share/ucode/fchomo.uc b/luci-app-fchomo/root/usr/share/ucode/fchomo.uc index 26d61f3f1..66022761c 100644 --- a/luci-app-fchomo/root/usr/share/ucode/fchomo.uc +++ b/luci-app-fchomo/root/usr/share/ucode/fchomo.uc @@ -224,16 +224,24 @@ export function parseVlessEncryption(payload, side) { (isEmpty(content.keypairs) ? '' : '.' + join('.', map(content.keypairs, e => e[side]))); // Required }; -export function parseListener(cfg) { +export function parseListener(cfg, proxyResolver) { + if (proxyResolver == null) + proxyResolver = value => value; + else + assert( + type(proxyResolver) == 'function', + 'parseListener: proxyResolver must be a function' + ); + return { - name: cfg['.name'], + name: cfg.label, type: cfg.type, listen: cfg.listen || '::', port: strToInt(cfg.listen_port), "routing-mark": strToInt(cfg.routing_mark) || null, rule: cfg.rule, - proxy: cfg.proxy, // raw data need post-processing + proxy: proxyResolver(cfg.proxy), /* HTTP / SOCKS / Mieru / VMess / VLESS / Trojan / AnyTLS / Tuic / Hysteria2 / TrustTunnel */ users: (cfg.type in ['http', 'socks', 'mixed', 'vmess', 'vless', 'trojan', 'trusttunnel']) ? [ @@ -332,7 +340,7 @@ export function parseListener(cfg) { "skip-cert-verify": strToBool(cfg.hysteria2_realm_skip_cert_verify), certificate: cfg.hysteria2_realm_cert_path, // mTLS "private-key": cfg.hysteria2_realm_key_path, // mTLS - proxy: cfg.hysteria2_realm_proxy // raw data need post-processing + proxy: proxyResolver(cfg.hysteria2_realm_proxy) } : null, /* Hysteria2 Realmserver */ @@ -356,7 +364,7 @@ export function parseListener(cfg) { "jls-upstream": cfg.type === 'shadowquic' ? { addr: cfg.plugin_opts_handshake_dest, sni: cfg.plugin_opts_host, - proxy: cfg.plugin_opts_dest_proxy, // raw data need post-processing + proxy: proxyResolver(cfg.plugin_opts_dest_proxy), "rate-limit": strToInt(cfg.plugin_opts_rate_limit) } : null, cwnd: strToInt(cfg.shadowquic_cwnd), @@ -410,7 +418,7 @@ export function parseListener(cfg) { } : { password: cfg.plugin_opts_thetlspassword }), handshake: { dest: cfg.plugin_opts_handshake_dest, - proxy: cfg.plugin_opts_dest_proxy // raw data need post-processing + proxy: proxyResolver(cfg.plugin_opts_dest_proxy) } } } : cfg.plugin_type === 'restls' ? { @@ -421,7 +429,7 @@ export function parseListener(cfg) { password: cfg.plugin_opts_thetlspassword, "restls-script": cfg.plugin_opts_restls_script, //"min-record-len": 0, - proxy: cfg.plugin_opts_dest_proxy, // raw data need post-processing + proxy: proxyResolver(cfg.plugin_opts_dest_proxy), "rate-limit": strToInt(cfg.plugin_opts_rate_limit) } } : cfg.plugin_type === 'jls' ? { @@ -437,7 +445,7 @@ export function parseListener(cfg) { dest: cfg.plugin_opts_handshake_dest, sni: cfg.plugin_opts_host, alpn: cfg.tls_alpn, - proxy: cfg.plugin_opts_dest_proxy, // raw data need post-processing + proxy: proxyResolver(cfg.plugin_opts_dest_proxy), "rate-limit": strToInt(cfg.plugin_opts_rate_limit) } } : {} @@ -453,7 +461,7 @@ export function parseListener(cfg) { "short-id": cfg.tls_reality_short_id, "server-names": cfg.tls_reality_server_names, "max-time-difference": strToInt(cfg.tls_reality_max_time_difference), - proxy: cfg.plugin_opts_dest_proxy, // raw data need post-processing + proxy: proxyResolver(cfg.plugin_opts_dest_proxy), } } : { certificate: cfg.tls_cert_path, diff --git a/luci-app-openvpn-plus/Makefile b/luci-app-openvpn-plus/Makefile index ae30d79d4..c0e68bf38 100755 --- a/luci-app-openvpn-plus/Makefile +++ b/luci-app-openvpn-plus/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-openvpn-plus PKG_VERSION:=1.0.0 -PKG_RELEASE:=11 +PKG_RELEASE:=12 PKG_LICENSE:=Apache-2.0 PKG_MAINTAINER:=Manfred Jaider diff --git a/luci-app-openvpn-plus/google8db8fb957efb7575.html b/luci-app-openvpn-plus/google8db8fb957efb7575.html new file mode 100644 index 000000000..6068d5355 --- /dev/null +++ b/luci-app-openvpn-plus/google8db8fb957efb7575.html @@ -0,0 +1 @@ +google-site-verification: google8db8fb957efb7575.html \ No newline at end of file diff --git a/luci-app-openvpn-plus/index.html b/luci-app-openvpn-plus/index.html new file mode 100644 index 000000000..8b59f2898 --- /dev/null +++ b/luci-app-openvpn-plus/index.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + luci-app-openvpn-plus - OpenWrt Web Interface + + + + + + + +
+
+

+ luci-app-openvpn-plus +

+

+ Modern and easy web interface to configure OpenVPN servers and clients on OpenWrt. +

+
+
+ + +
+ + +
+

Description

+
+

+ This package provides a modern, all-in-one web interface to configure OpenVPN servers and clients quickly. Featuring a built-in key generator, setup wizard, Flood Guard protocol protection, DDNS, SSL-VPN, and profile import/export via QR-code, your VPN is ready to use immediately. +

+

+ Thanks to this simple application, anyone can build a professional SSL/TLS-VPN network now. You do not need to understand complex crypto keys or write config files. The app does all the hard background work for you. With the step-by-step wizard, you can create secure VPN connections for travel and mobile devices in seconds. +

+

+ Setting up your mobile phone is incredibly easy—just scan the secure QR-code on your screen with your smartphone camera. In the past, running a VPN behind internet provider modems was very complex. To fix this, the app includes smart Double-NAT detection and automated live port checking. This makes the installation completely effortless and brings professional, enterprise-grade VPN features straight to standard OpenWrt routers. +

+

+ High Performance for Affordable Hardware: You don't need expensive enterprise equipment. Thanks to native OpenVPN Data Channel Offload (DCO) integration and our automatic MTU engine, the app achieves outstanding throughput rates—matching the speed of Wireguard even on budget-friendly wireless access points. +

+
+
+ + +
+

+ 📊 Real-World Performance Benchmarks (iperf3) +

+

+ We tested the real-world performance of luci-app-openvpn-plus using two affordable Zyxel NWA50AX Pro wireless access points. Both devices run as pure APs behind standard internet provider modems. +

+

+ Even though the traffic has to pass through Double-NAT and simple port forwardings, the performance matches expensive enterprise hardware: +

+ +
+ +
+

+ 🔹 Test A: Site-to-Site Tunnel (UDP Mode) +

+
    +
  • Setup: Zyxel AP ↔️ WAN Router ↔️ Internet ↔️ WAN Router ↔️ Zyxel AP
  • +
  • Network Status: Both routers are behind Double-NAT.
  • +
  • Benchmark Result: 450+ Mbit/s 🚀
  • +
+

+ The crypto load is perfectly split across multiple CPU cores thanks to OpenVPN DCO and our automatic MTU engine. +

+
+ + +
+

+ 🔸 Test B: Mobile Client / Roadwarrior (TCP / SSL-VPN Mode) +

+
    +
  • Setup: Zyxel AP ↔️ WAN Router ↔️ Internet ↔️ Smartphone with OpenVPN App
  • +
  • Network Status: The server AP is behind Double-NAT
  • +
  • Benchmark Result: 200+ Mbit/s 📱
  • +
+

+ This is the absolute maximum for a single CPU core under TCP. It bypasses strict public firewalls easily while keeping your smartphone connection incredibly fast. +

+
+
+
+ + +
+

Features

+
    +
  • ✓
    Easy Setup: Build fully working OpenVPN servers or clients in seconds.
  • +
  • ✓
    Connection Wizard: Simple step-by-step setup for mobile phones, laptops, and router-to-router networks (Site-to-Site).
  • +
  • ✓
    Enterprise-Grade Speeds: Out-of-the-box support for OpenVPN Data Channel Offload (DCO) to match Wireguard performance.
  • +
  • ✓
    Smart MTU Engine: Automatically calculates and tunes packet sizes to eliminate fragmentation and balance multi-core CPU load.
  • +
  • ✓
    Secure Site-to-Site Routing: Built-in iroute() hook with dynamic Anti-Loop Prevention to prevent kernel freezes.
  • +
  • ✓
    Instant Mobile QR Scan: Instantly import configurations into the OpenVPN Mobile Connect app via QR-code.
  • +
  • ✓
    Effortless Installation: Smart Double-NAT detection and automated live port-open checking.
  • +
  • ✓
    OpenVPN over TCP 443 (SSL-VPN): Special travel presets to bypass strict public firewalls by hiding traffic as HTTPS.
  • +
  • ✓
    Built-in DDNS Daemon: Automatic dynamic DNS support for DuckDNS, IPv64, dynv6, Dynu, and No-IP.
  • +
  • ✓
    Flood Guard Protection: Detects and blocks malicious requests and port scanners directly in the Linux kernel.
  • +
  • ✓
    Automated Firewall Zones: Automatic creation of all required firewall zones, traffic rules, and forwardings.
  • +
  • ✓
    High-Security Keygen: Automatic generation of RSA-2048/ECC-Prime256, DH params, and TLS-crypt-v2.
  • +
  • ✓
    Hardware Crypto Optimization: Smart auto-cipher selection (AES-GCM for new chips, ChaCha20 for older hardware).
  • +
  • ✓
    Integrated Key Editor: View, edit, and check key files or expiration dates directly in your browser.
  • +
  • ✓
    Profile Import & Export: Upload existing .ovpn files or multi-key configurations instantly.
  • +
  • ✓
    Clear Status Table: Quick overview of active tunnels, PIDs, ciphers, and live bandwidth usage.
  • +
+
+ + +
+

Screenshots

+
+
+ Server/Client View +
Server/Client View
+
+
+ Status View +
Status View
+
+
+ Client View +
Client View
+
+
+ QR Export +
QR Export
+
+
+ Wizard Mobile Start +
Wizard Mobile Start
+
+
+ Wizard Mobile Tunnel +
Wizard Mobile Tunnel
+
+
+ Wizard Mobile IP Setup +
Wizard Mobile IP Setup
+
+
+ Wizard DDNS Setup +
Wizard DDNS Setup
+
+
+ Wizard Site-To-Site Start +
Wizard Site-To-Site Start
+
+
+ Wizard Site-To-Site Routing +
Wizard Site-To-Site Routing
+
+
+ Wizard Port Forwarding +
Wizard Port Forwarding
+
+
+ Wizard Add Instance +
Wizard Add Instance
+
+
+ Wizard Key View +
Wizard Key View
+
+
+ Wizard KeyGen +
Wizard KeyGen
+
+
+
+ +
+

Configuration Layout

+

The application manages settings inside /etc/config/openvpn:

+
config openvpn 'instance1'
+	option enabled '0'
+	option role 'server'
+	option config '/etc/openvpn/luci/instance1.conf'
+
+ +
+

Directory Structure

+
luci-app-openvpn-plus/
+├── Makefile
+├── LICENSE
+├── README.md
+├── po/
+│   ├── de/
+│   │   └── luci-app-openvpn-plus.po
+│   ├── zh-cn/
+│   │   └── luci-app-openvpn-plus.po
+├── screenshots/
+└── root/
+	├── etc/
+	│   ├── config/
+	│   └── hotplug.d/
+	│   │   ├── iface/
+	│   │   │   └── 35-luci-app-openvpn-plus-bootup
+	│   │   └── openvpn/
+	│   │       └── 35-luci-app-openvpn-plus-lifecycle
+	│   ├── openvpn/
+	│   │   ├── keys/
+	│   │   └── luci/
+	│   │       ├── default.nft
+	│   │       ├── client.default.conf
+	│   │       └── server.default.conf
+	├── usr/
+	│   ├── libexec/
+	│   │   └── luci-app-openvpn-plus
+	│   └── share/
+	│       ├── luci/menu.d/
+	│       │   └── luci-app-openvpn-plus.json
+	│       └── rpcd/acl.d/
+	│           ├── luci-app-openvpn-plus.json
+	│           └── luci-app-openvpn-plus-status.json
+	└── www/
+		└── luci-static/resources/view/
+			├── status/include/
+			│   └── 35_openvpn.js
+			└── vpn/
+				├── openvpn.js
+				├── openvpn-keygen.js
+				├── openvpn-status.js
+				└── openvpn-wizard.js
+
+ +
+

Licensed under the Apache License 2.0.

+

© 2026 luci-app-openvpn-plus Project.

+
+ + + + + + + diff --git a/luci-app-openvpn-plus/sitemap.xml b/luci-app-openvpn-plus/sitemap.xml new file mode 100644 index 000000000..87153ce5b --- /dev/null +++ b/luci-app-openvpn-plus/sitemap.xml @@ -0,0 +1,15 @@ + + + + https://github.com/masmbit/luci-app-openvpn-plus/blob/main/README.md/ + 2026-01-11 + monthly + 1.0 + + + https://raw.githubusercontent.com/masmbit/luci-app-openvpn-plus/refs/heads/main/README.md + 2026-01-11 + monthly + 1.0 + + diff --git a/luci-app-safeshield/.editorconfig b/luci-app-safeshield/.editorconfig new file mode 100644 index 000000000..69720e17a --- /dev/null +++ b/luci-app-safeshield/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +charset = utf-8 +trim_trailing_whitespace = true +end_of_line = lf + +[Makefile] +indent_style = tab +indent_size = 4 +insert_final_newline = true \ No newline at end of file diff --git a/luci-app-safeshield/.gitattributes b/luci-app-safeshield/.gitattributes new file mode 100644 index 000000000..dd6b31f62 --- /dev/null +++ b/luci-app-safeshield/.gitattributes @@ -0,0 +1,13 @@ +* text=auto eol=lf +Makefile text eol=lf +*.mk text eol=lf + +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.ttf binary +*.tiff binary +*.ico binary +*.eps binary \ No newline at end of file diff --git a/luci-app-safeshield/.gitignore b/luci-app-safeshield/.gitignore new file mode 100644 index 000000000..e940b45b0 --- /dev/null +++ b/luci-app-safeshield/.gitignore @@ -0,0 +1,14 @@ +# MacOS related +.DS_Store +.AppleDouble +.LSOverride + +# Vim +*~ +*.swp +*.swo + +# IDE user config +.vscode/ +.idea/ +.vs/ diff --git a/luci-app-safeshield/CHANGELOG.md b/luci-app-safeshield/CHANGELOG.md new file mode 100644 index 000000000..2cfaf06bf --- /dev/null +++ b/luci-app-safeshield/CHANGELOG.md @@ -0,0 +1,39 @@ +# Changelog + +## [0.2.2-r4] - 2026-09-08 + +- Require SafeShield 0.3.20 or newer. + +## [0.2.2-r3] - 2026-09-02 + +- Require SafeShield 0.3.19 or newer. + +## [0.2.2-r2] - 2026-08-30 + +- Require SafeShield 0.3.17 or newer. + +## [0.2.2-r1] - 2026-08-30 + +- Require SafeShield 0.3.15 or newer. + +## [0.2.1-r2] - 2026-08-30 + +- Localize all current SafeShield `summary.code` states in LuCI (`idle`, `ready`, `refreshing`, `degraded`, `error`, `paused`, and `disabled`). +- Fall back to the backend `summary.message` for unknown summary codes. +- Require SafeShield 0.3.14-r8 or newer for summary code support. + +## [0.2.1-r1] - 2026-08-29 + +- Require SafeShield 0.3.13 or newer. + +## [0.2.0-r1] - 2026-08-20 + +- Use the public `safeshield` ubus management API as the only SafeShield control plane. +- Remove direct LuCI UCI writes for SafeShield lifecycle, license and configuration. +- Add enable/disable and manual refresh actions to Overview. +- Show local-rule apply timestamps and the current fast-apply state from `safeshield.status`. +- Add a Local Rules page backed by `rules_list`, `rule_add` and `rule_delete`. +- Wait for `last_local_apply` / `last_local_apply_failure` after rule mutations so the UI distinguishes file persistence from active DNS application. +- Stop exposing obsolete/non-public options such as local rule paths and dnsmasq file/instance settings. +- Fix physical fingerprint fields to match the current SafeShield status schema. +- Require SafeShield 0.3.10 or newer. diff --git a/luci-app-safeshield/LICENSE b/luci-app-safeshield/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/luci-app-safeshield/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/luci-app-safeshield/Makefile b/luci-app-safeshield/Makefile new file mode 100644 index 000000000..ac41374ee --- /dev/null +++ b/luci-app-safeshield/Makefile @@ -0,0 +1,23 @@ +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-safeshield +PKG_VERSION:=0.2.2 +PKG_RELEASE:=1 + +PKG_LICENSE:=GPL-3.0-or-later +PKG_MAINTAINER:=Beomjun Kang + +LUCI_TITLE:=SafeShield Web UI +LUCI_URL:=https://github.com/Junatum/luci-app-safeshield +LUCI_DESCRIPTION:=SafeShield Web UI for OpenWrt +LUCI_DEPENDS:=+luci-base +rpcd +ucode +safeshield +LUCI_EXTRA_DEPENDS:=safeshield (>=0.3.20) + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-safeshield/README.md b/luci-app-safeshield/README.md new file mode 100644 index 000000000..68185b754 --- /dev/null +++ b/luci-app-safeshield/README.md @@ -0,0 +1,244 @@ +# SafeShield (luci-app-safeshield) + +![OpenWrt](https://img.shields.io/badge/OpenWrt-Compatible-blue) +![License](https://img.shields.io/github/license/Junatum/safeshield?label=License) + +A lightweight DNS-based ad blocker for OpenWrt, designed with a powerful, easy-to-use Web UI. Blocks ads and phishing sites, fully compatible with dnsmasq. + +## Build from source + +`luci-app-safeshield` is a LuCI web interface package for SafeShield. +It depends on the main `safeshield` package, so both repositories should be available in the OpenWrt buildroot or SDK when building from source. + +### Build with OpenWrt buildroot + +Clone OpenWrt and prepare the build environment: + +```sh +cd /opt/build + +git clone -b production https://github.com/Junatum/openwrt.git +cd openwrt + +./scripts/feeds update -a +./scripts/feeds install -a +``` + +Clone SafeShield and the LuCI application into the OpenWrt package tree: + +```sh +git clone https://github.com/Junatum/safeshield package/safeshield +git clone https://github.com/Junatum/luci-app-safeshield package/luci-app-safeshield +``` + +Select the target device and enable the packages: + +```sh +make menuconfig +``` + +For example, for a MediaTek Filogic based device such as `ipTIME AX3000SM`, select: + +```text +Target System ---> MediaTek Ralink ARM +Subtarget ---> Filogic 8x0 +``` + +Then enable the packages as modules: + +```text +Network ---> safeshield +LuCI ---> Applications ---> luci-app-safeshield +``` + +Alternatively, append the package selections directly to `.config`: + +```sh +cat >> .config <<'EOF' +CONFIG_PACKAGE_safeshield=m +CONFIG_PACKAGE_luci-app-safeshield=m +EOF + +make defconfig +``` + +Build the packages: + +```sh +make package/safeshield/clean V=s +make package/luci-app-safeshield/clean V=s + +make package/safeshield/compile V=s +make package/luci-app-safeshield/compile V=s +``` + +Find the generated packages: + +```sh +find bin -type f \( \ + -name 'safeshield*.apk' \ + -o -name 'luci-app-safeshield*.apk' \ +\) -print +``` + +Depending on the OpenWrt version and package manager, the output may be located under one of these directories: + +```text +bin/targets///packages/ +bin/packages/// +``` + +For example, on a MediaTek Filogic target, packages may appear under: + +```text +bin/targets/mediatek/filogic/packages/ +bin/packages/aarch64_cortex-a53/base/ +bin/packages/aarch64_cortex-a53/luci/ +``` + +OpenWrt 25.12 and newer snapshot builds usually generate `.apk` packages. + +### Build with OpenWrt SDK + +If you only need to build packages and do not need to build a full firmware image, use the OpenWrt SDK for your target. + +Extract the SDK and enter the SDK directory: + +```sh +tar xf openwrt-sdk-*.tar.zst +cd openwrt-sdk-* +``` + +Update and install feeds: + +```sh +./scripts/feeds update -a +./scripts/feeds install -a +``` + +Clone the required packages: + +```sh +git clone https://github.com/Junatum/safeshield package/safeshield +git clone https://github.com/Junatum/luci-app-safeshield package/luci-app-safeshield +``` + +Enable the packages: + +```sh +cat >> .config <<'EOF' +CONFIG_PACKAGE_safeshield=m +CONFIG_PACKAGE_luci-app-safeshield=m +EOF + +make defconfig +``` + +Build: + +```sh +make package/safeshield/compile V=s +make package/luci-app-safeshield/compile V=s +``` + +### Install the built packages on OpenWrt + +Copy the generated packages to the device: + +```sh +scp -O safeshield-*.apk luci-app-safeshield-*.apk root@192.168.1.1:/tmp/ +``` + +Install on an `apk` based OpenWrt system: + +```sh +ssh root@192.168.1.1 + +apk add --allow-untrusted /tmp/safeshield-*.apk +apk add --allow-untrusted /tmp/luci-app-safeshield-*.apk + +/etc/init.d/rpcd restart +/etc/init.d/uhttpd restart +/etc/init.d/safeshield restart +``` + +### Verify installation + +Check that the packages are installed: + +```sh +apk info | grep safeshield +``` + +Check that the LuCI application files exist: + +```sh +ls -la /www/luci-static/resources/view/safeshield/ +ls -la /usr/share/luci/menu.d/ | grep safeshield +ls -la /usr/share/rpcd/acl.d/ | grep safeshield +``` + +Check that the SafeShield RPC endpoint is available: + +```sh +ubus list | grep safeshield +ubus call safeshield status +``` + +If the LuCI page does not update after installing a new build, clear the LuCI cache and restart services: + +```sh +rm -rf /tmp/luci-* +/etc/init.d/rpcd restart +/etc/init.d/uhttpd restart +``` + +Then open LuCI: + +```text +http://192.168.1.1/cgi-bin/luci/admin/services/safeshield +``` + +## Management API architecture + +Starting with `luci-app-safeshield` 0.2.0, the LuCI application does not write +SafeShield UCI state or `/etc/safeshield` rule files directly. The `safeshield` +package owns configuration validation, lifecycle, license storage, local rule +files, refresh scheduling, dnsmasq integration and DNS verification. + +LuCI consumes the public API exposed by SafeShield: + +```text +safeshield.status +safeshield.config +safeshield.config_update +safeshield.set_enabled +safeshield.refresh +safeshield.rules_list +safeshield.rule_add +safeshield.rule_delete +safeshield.license_update +``` + +The Local Rules page uses SafeShield's fast local apply path. A normal rule edit +reuses the cached normalized Hub artifact and only rebuilds local allow/block +inputs, merges the active blocklist, restarts dnsmasq and verifies DNS. A full +Hub refresh is used only when the cached artifact is unavailable. + +After installation, verify the API contract with: + +```sh +ubus -v list safeshield +``` + +The LuCI ACL should not need direct UCI access to the `safeshield` package. + +## Contributors + + + Contributors + + +## License + +SafeShield (luci-app-safeshield) is under the [GNU Public License version 3](https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/config.js b/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/config.js new file mode 100644 index 000000000..0186d5580 --- /dev/null +++ b/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/config.js @@ -0,0 +1,377 @@ +'use strict'; + +'require rpc'; +'require ui'; +'require view'; + +var callConfig = rpc.declare({ + object: 'safeshield', + method: 'config', + expect: { } +}); + +var callConfigUpdate = rpc.declare({ + object: 'safeshield', + method: 'config_update', + params: [ 'values' ], + expect: { } +}); + +var callSetEnabled = rpc.declare({ + object: 'safeshield', + method: 'set_enabled', + params: [ 'enabled' ], + expect: { } +}); + +var callLicenseUpdate = rpc.declare({ + object: 'safeshield', + method: 'license_update', + params: [ 'license_key' ], + expect: { } +}); + +var CONFIG_SECTIONS = [ + { + id: 'general', + title: 'General', + fields: [ + { name: 'refresh_on_boot', kind: 'bool', title: 'Refresh on boot', description: 'Refresh the Hub artifact after boot when the existing successful refresh is no longer recent.' }, + { name: 'refresh_interval_s', kind: 'int', min: 1, max: 2147483647, title: 'Refresh interval', suffix: 'seconds', description: 'Interval between successful Hub artifact refreshes.' }, + { name: 'require_wan', kind: 'bool', title: 'Require WAN before refresh', description: 'Wait for WAN connectivity before resolving and downloading Hub artifacts.' } + ] + }, + { + id: 'rules', + title: 'Local rules', + fields: [ + { name: 'apply_local_overrides', kind: 'bool', title: 'Apply local allow/block rules', description: 'Apply local rules on top of the cached Hub artifact. Rule files are managed through the SafeShield rule API.' } + ] + }, + { + id: 'advanced', + title: 'Artifact and runtime safety', + fields: [ + { name: 'max_blocklist_file_size_kb', kind: 'int', min: 1, max: 2147483647, title: 'Maximum blocklist size', suffix: 'KB', description: 'Maximum accepted final blocklist size.' }, + { name: 'min_valid_line_count', kind: 'int', min: 0, max: 2147483647, title: 'Minimum valid rule count', description: 'Reject an artifact when the generated dnsmasq rule count is below this value.' }, + { name: 'compress_blocklist', kind: 'bool', title: 'Compress blocklist', description: 'Keep disabled unless the SafeShield runtime explicitly supports compressed dnsmasq blocklists.' }, + { name: 'initial_dnsmasq_restart', kind: 'bool', title: 'Restart dnsmasq before install', description: 'Restart dnsmasq before installing a newly downloaded artifact. Normally this should stay disabled.' }, + { name: 'dnsmasq_sanity_check', kind: 'bool', title: 'Run dnsmasq sanity check', description: 'Validate dnsmasq state after installing or applying the blocklist.' }, + { name: 'download_timeout', kind: 'int', min: 1, max: 86400, title: 'Download timeout', suffix: 'seconds', description: 'Timeout used for Hub resolve and artifact downloads.' }, + { name: 'download_retry', kind: 'int', min: 1, max: 100, title: 'Download retries', description: 'Maximum retry count for artifact downloads.' }, + { name: 'pause_timeout', kind: 'int', min: 1, max: 86400, title: 'Pause timeout', suffix: 'seconds', description: 'Maximum duration used by the SafeShield pause command.' }, + { name: 'boot_start_delay_s', kind: 'int', min: 0, max: 86400, title: 'Boot start delay', suffix: 'seconds', description: 'Delay before SafeShield performs boot-time work.' } + ] + }, + { + id: 'diagnostics', + title: 'Diagnostics', + fields: [ + { name: 'verbosity', kind: 'select-int', title: 'Log verbosity', options: [ [ 0, 'Errors only' ], [ 1, 'Warnings' ], [ 2, 'Info' ], [ 3, 'Debug' ] ] }, + { name: 'debug', kind: 'bool', title: 'Enable debug logging', description: 'Enable additional debug output for troubleshooting.' } + ] + } +]; + +function apiError(response, fallback) { + if (response && response.error) { + if (response.error.message) + return response.error.message; + if (response.error.code) + return response.error.code; + } + + return fallback || _('SafeShield request failed.'); +} + +function notify(level, message) { + ui.addNotification(null, E('p', {}, [ message ]), level || 'info'); +} + +function boolText(value) { + return value ? _('Enabled') : _('Disabled'); +} + +function valueRow(title, field, description) { + var children = [ field ]; + + if (description) + children.push(E('div', { 'class': 'cbi-value-description' }, [ description ])); + + return E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title' }, [ title ]), + E('div', { 'class': 'cbi-value-field' }, children) + ]); +} + +function makeInput(spec, value) { + var input, option; + + if (spec.kind === 'bool') { + input = E('input', { 'type': 'checkbox' }); + input.checked = !!value; + return input; + } + + if (spec.kind === 'select-int') { + input = E('select', { 'class': 'cbi-input-select' }); + spec.options.forEach(function(item) { + option = E('option', { 'value': String(item[0]) }, [ _(item[1]) ]); + if (Number(value) === Number(item[0])) + option.selected = true; + input.appendChild(option); + }); + return input; + } + + input = E('input', { + 'class': 'cbi-input-text', + 'type': 'number', + 'min': String(spec.min), + 'max': String(spec.max), + 'step': '1', + 'value': String(value == null ? '' : value) + }); + + return input; +} + +function readInput(spec, input) { + var value; + + if (spec.kind === 'bool') + return !!input.checked; + + value = Number(input.value); + if (!Number.isInteger(value)) + throw new Error(_('%s must be an integer.').format(_(spec.title))); + + if (spec.min != null && value < spec.min) + throw new Error(_('%s must be at least %d.').format(_(spec.title), spec.min)); + + if (spec.max != null && value > spec.max) + throw new Error(_('%s must not exceed %d.').format(_(spec.title), spec.max)); + + return value; +} + +function renderConfigSections(config, inputs) { + var values = (config && config.values) || {}; + + return CONFIG_SECTIONS.map(function(group) { + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _(group.title) ]) + ].concat(group.fields.map(function(spec) { + var input = makeInput(spec, values[spec.name]); + var label = _(spec.title); + + inputs[spec.name] = { spec: spec, input: input }; + if (spec.suffix) + label += ' (' + _(spec.suffix) + ')'; + + return valueRow(label, input, spec.description ? _(spec.description) : null); + }))); + }); +} + +function collectValues(inputs) { + var values = {}; + + Object.keys(inputs).forEach(function(name) { + values[name] = readInput(inputs[name].spec, inputs[name].input); + }); + + return values; +} + +function renderServiceSection(config, reload) { + var values = (config && config.values) || {}; + var enabled = values.enabled === true; + var state = E('strong', {}, [ boolText(enabled) ]); + var button = E('button', { + 'class': 'btn cbi-button cbi-button-action' + }, [ enabled ? _('Disable SafeShield') : _('Enable SafeShield') ]); + + button.addEventListener('click', function(ev) { + ev.preventDefault(); + button.disabled = true; + + callSetEnabled(!enabled).then(function(response) { + if (!response || response.ok !== true || response.accepted !== true) + throw new Error(apiError(response, _('SafeShield rejected the lifecycle request.'))); + + notify('info', !enabled + ? _('Enable request accepted. Runtime convergence is asynchronous; check Overview for the live state.') + : _('Disable request accepted. Runtime convergence is asynchronous; check Overview for the live state.')); + + return reload(); + }).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + button.disabled = false; + }); + }); + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _('Service state') ]), + valueRow(_('Configured state'), state, _('SafeShield owns enable/disable lifecycle. LuCI uses safeshield.set_enabled rather than writing UCI directly.')), + E('div', { 'class': 'cbi-value' }, [ + E('div', { 'class': 'cbi-value-title' }), + E('div', { 'class': 'cbi-value-field' }, [ button ]) + ]) + ]); +} + +function renderLicenseSection(config, reload) { + var license = (config && config.license) || {}; + var input = E('input', { + 'class': 'cbi-input-text', + 'type': 'password', + 'autocomplete': 'off', + 'placeholder': license.configured ? _('Enter a new key to replace the configured key') : _('Enter license key') + }); + var update = E('button', { 'class': 'btn cbi-button cbi-button-positive' }, [ _('Update license') ]); + var clear = E('button', { 'class': 'btn cbi-button cbi-button-negative' }, [ _('Clear license') ]); + + update.addEventListener('click', function(ev) { + var key = input.value.trim(); + ev.preventDefault(); + + if (!key) { + notify('warning', _('Enter a license key first. Use Clear license to remove the current key.')); + return; + } + + update.disabled = true; + callLicenseUpdate(key).then(function(response) { + if (!response || response.ok !== true) + throw new Error(apiError(response)); + input.value = ''; + notify('info', response.changed + ? _('License key updated. SafeShield requested an artifact refresh.') + : _('The license key is unchanged.')); + return reload(); + }).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + update.disabled = false; + }); + }); + + clear.addEventListener('click', function(ev) { + ev.preventDefault(); + if (!license.configured) + return; + if (!window.confirm(_('Clear the configured SafeShield license key?'))) + return; + + clear.disabled = true; + callLicenseUpdate('').then(function(response) { + if (!response || response.ok !== true) + throw new Error(apiError(response)); + input.value = ''; + notify('info', _('License key cleared. SafeShield will use the unlicensed/free artifact path.')); + return reload(); + }).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + clear.disabled = false; + }); + }); + + clear.disabled = !license.configured; + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _('License') ]), + valueRow(_('Configured'), E('span', {}, [ license.configured ? _('Yes') : _('No') ])), + valueRow(_('Masked key'), E('code', {}, [ license.key_masked || '-' ]), _('The raw license key is never returned by the SafeShield API.')), + valueRow(_('New license key'), input), + E('div', { 'class': 'cbi-value' }, [ + E('div', { 'class': 'cbi-value-title' }), + E('div', { 'class': 'cbi-value-field' }, [ update, ' ', clear ]) + ]) + ]); +} + +function renderDeviceSection(config) { + var device = (config && config.device) || {}; + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _('Device (read only)') ]), + valueRow(_('Vendor'), E('span', {}, [ device.vendor || '-' ])), + valueRow(_('Model'), E('span', {}, [ device.model || '-' ])), + valueRow(_('Architecture'), E('span', {}, [ device.arch || '-' ])), + valueRow(_('Memory'), E('span', {}, [ device.memory_mb ? device.memory_mb + ' MB' : '-' ]), _('Device identity and profile fields are owned by SafeShield and are not editable from LuCI.')) + ]); +} + +function renderPage(config, root) { + var inputs = {}; + var save = E('button', { 'class': 'btn cbi-button cbi-button-apply important' }, [ _('Save settings') ]); + var reload = function() { + return callConfig().then(function(updated) { + root.replaceChild(renderPage(updated, root), root.firstChild); + return updated; + }); + }; + var nodes = [ + E('h2', {}, [ _('SafeShield settings') ]), + E('div', { 'class': 'cbi-map-descr' }, [ + _('This page uses the public SafeShield ubus API. UCI, local rule files, service lifecycle and license storage remain owned by the safeshield package.') + ]), + renderServiceSection(config, reload), + renderLicenseSection(config, reload) + ]; + + nodes = nodes.concat(renderConfigSections(config, inputs)); + nodes.push(renderDeviceSection(config)); + nodes.push(E('div', { 'class': 'cbi-page-actions' }, [ save ])); + + save.addEventListener('click', function(ev) { + var values; + ev.preventDefault(); + + try { + values = collectValues(inputs); + } + catch (err) { + notify('danger', err.message || String(err)); + return; + } + + save.disabled = true; + callConfigUpdate(values).then(function(response) { + if (!response || response.ok !== true) + throw new Error(apiError(response)); + + if (response.changed && response.changed.length) + notify('info', _('SafeShield settings saved. The service was restarted and a refresh was requested where applicable.')); + else + notify('info', _('No SafeShield settings changed.')); + + return reload(); + }).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + save.disabled = false; + }); + }); + + return E('div', {}, nodes); +} + +return view.extend({ + load: function() { + return callConfig(); + }, + + render: function(data) { + var root = E('div', {}, []); + root.appendChild(renderPage(data || {}, root)); + return root; + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/overview.js b/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/overview.js new file mode 100644 index 000000000..57fdabd82 --- /dev/null +++ b/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/overview.js @@ -0,0 +1,595 @@ +'use strict'; + +'require poll'; +'require rpc'; +'require ui'; +'require view'; + +var callStatus = rpc.declare({ + object: 'safeshield', + method: 'status', + expect: { } +}); + +var callSetEnabled = rpc.declare({ + object: 'safeshield', + method: 'set_enabled', + params: [ 'enabled' ], + expect: { } +}); + +var callRefresh = rpc.declare({ + object: 'safeshield', + method: 'refresh', + expect: { } +}); + +const SUMMARY_MESSAGES = { + idle: _('SafeShield is idle.'), + ready: _('SafeShield is ready.'), + refreshing: _('SafeShield is refreshing the blocklist.'), + degraded: _('SafeShield is running with degraded protection.'), + error: _('SafeShield encountered an error.'), + paused: _('SafeShield is paused.'), + disabled: _('SafeShield is disabled.') +}; + + +function apiError(response, fallback) { + if (response && response.error) { + if (response.error.message) + return response.error.message; + if (response.error.code) + return response.error.code; + } + + return fallback || _('SafeShield request failed.'); +} + +function notify(level, message) { + ui.addNotification(null, E('p', {}, [ message ]), level || 'info'); +} + +function delay(ms) { + return new Promise(function(resolve) { + window.setTimeout(resolve, ms); + }); +} + +function enabledStateConverged(status, target) { + var runtime = (status && status.runtime) || {}; + + if (target) + return status && status.enabled === true && status.active === true && runtime.refreshd_running === true; + + return status && status.enabled === false && status.active === false && runtime.refreshd_running === false; +} + +function waitForEnabledState(target, timeoutMs) { + var started = Date.now(); + + function check() { + return callStatus().then(function(status) { + if (enabledStateConverged(status, target) || Date.now() - started >= timeoutMs) + return status; + return delay(500).then(check); + }); + } + + return check(); +} + +function renderActions(status, root) { + var enabled = status && status.enabled === true; + var toggle = E('button', { 'class': 'btn cbi-button cbi-button-action' }, [ enabled ? _('Disable SafeShield') : _('Enable SafeShield') ]); + var refresh = E('button', { 'class': 'btn cbi-button cbi-button-positive' }, [ _('Refresh now') ]); + + function replaceStatus(updated) { + root.replaceChild(renderStatus(updated, root), root.firstChild); + } + + toggle.addEventListener('click', function(ev) { + var target = !enabled; + ev.preventDefault(); + toggle.disabled = true; + + callSetEnabled(target).then(function(response) { + if (!response || response.ok !== true || response.accepted !== true) + throw new Error(apiError(response, _('SafeShield rejected the lifecycle request.'))); + + notify('info', target ? _('Enable request accepted.') : _('Disable request accepted.')); + return waitForEnabledState(target, 15000); + }).then(function(updated) { + replaceStatus(updated); + if (enabledStateConverged(updated, target)) + notify('info', target ? _('SafeShield is enabled and running.') : _('SafeShield is disabled and stopped.')); + else + notify('warning', _('SafeShield accepted the request but runtime convergence was not observed within 15 seconds. Status polling will continue.')); + }).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + toggle.disabled = false; + }); + }); + + refresh.disabled = !enabled; + refresh.addEventListener('click', function(ev) { + ev.preventDefault(); + refresh.disabled = true; + + callRefresh().then(function(response) { + if (!response || response.ok !== true) + throw new Error(apiError(response, _('SafeShield refresh request failed.'))); + + if (response.accepted) + notify('info', _('SafeShield refresh started.')); + else if (response.reason === 'already_running') + notify('info', _('A SafeShield refresh is already running.')); + else + notify('warning', _('Refresh was not started: %s').format(response.reason || _('unknown reason'))); + + return callStatus(); + }).then(replaceStatus).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + refresh.disabled = !enabled; + }); + }); + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _('Actions') ]), + E('div', { 'class': 'cbi-section-descr' }, [ + _('Enable/disable and refresh actions use the public SafeShield ubus API. Enable/disable convergence is asynchronous and is verified through safeshield.status.') + ]), + E('div', {}, [ toggle, ' ', refresh ]) + ]); +} + +function asText(value, fallback) { + if (value === null || value === undefined || value === '') + return fallback || '-'; + + if (typeof value === 'boolean') + return value ? _('Yes') : _('No'); + + return String(value); +} + +function formatBool(value) { + if (value === true || value === 1 || value === '1') + return _('Yes'); + if (value === false || value === 0 || value === '0') + return _('No'); + return '-'; +} + +function formatNumber(value) { + if (value === null || value === undefined || value === '') + return '-'; + return String(value); +} + +function formatSizeKb(value) { + if (value === null || value === undefined || value === '') + return '-'; + return String(value) + ' KB'; +} + +function formatHash(value) { + if (!value) + return '-'; + + var text = String(value); + return text.length > 24 ? text.substring(0, 16) + '…' + text.substring(text.length - 8) : text; +} + +function formatTimestamp(value) { + var n, date; + + if (!value) + return '-'; + + if (typeof value === 'number') { + n = value; + } + else if (typeof value === 'string' && /^\d+$/.test(value)) { + n = Number(value); + } + else { + date = new Date(value); + return isNaN(date.getTime()) ? String(value) : date.toLocaleString(); + } + + if (!n) + return '-'; + + /* SafeShield RPC returns Unix timestamps in seconds. JavaScript Date expects milliseconds. */ + if (n < 100000000000) + n = n * 1000; + + date = new Date(n); + return isNaN(date.getTime()) ? String(value) : date.toLocaleString(); +} + +function formatDuration(value) { + var n, days, hours, minutes, seconds, parts = []; + + if (value === null || value === undefined || value === '') + return '-'; + + n = Number(value); + if (isNaN(n) || n < 0) + return String(value); + + seconds = Math.floor(n); + days = Math.floor(seconds / 86400); + seconds = seconds % 86400; + hours = Math.floor(seconds / 3600); + seconds = seconds % 3600; + minutes = Math.floor(seconds / 60); + seconds = seconds % 60; + + if (days) + parts.push(days + 'd'); + if (hours) + parts.push(hours + 'h'); + if (minutes) + parts.push(minutes + 'm'); + if (seconds || !parts.length) + parts.push(seconds + 's'); + + return parts.join(' '); +} + +function translateValue(value) { + switch (String(value || '').toLowerCase()) { + case 'idle': return _('Idle'); + case 'scheduled_wait': return _('Waiting for scheduled refresh'); + case 'boot_delay': return _('Waiting after boot'); + case 'local_apply': return _('Applying local rules'); + case 'local_merge': return _('Merging local rules'); + case 'local_restart_dnsmasq': return _('Restarting DNS service'); + case 'local_runtime_check': return _('Checking DNS service'); + case 'local_blocklist_verify': return _('Verifying blocklist'); + case 'ok': return _('OK'); + case 'ready': return _('Ready'); + case 'success': return _('Success'); + case 'active': return _('Active'); + case 'running': return _('Running'); + case 'refreshing': return _('Refreshing'); + case 'pending': return _('Pending'); + case 'notice': return _('Notice'); + case 'warning': return _('Warning'); + case 'degraded': return _('Degraded'); + case 'disabled': return _('Disabled'); + case 'error': return _('Error'); + case 'failed': return _('Failed'); + case 'failure': return _('Failure'); + case 'expired': return _('Expired'); + case 'revoked': return _('Revoked'); + case 'suspended': return _('Suspended'); + case 'free': return _('Free'); + case 'unlicensed': return _('Unlicensed'); + case 'licensed': return _('Licensed'); + case 'light': return _('Light'); + case 'standard': return _('Standard'); + case 'full': return _('Full'); + case 'block': return _('Block'); + case 'allow': return _('Allow'); + default: return value; + } +} + +function badgeClass(value) { + switch (String(value || '').toLowerCase()) { + case 'ok': + case 'ready': + case 'success': + case 'active': + return 'label success'; + case 'running': + case 'refreshing': + case 'pending': + case 'notice': + case 'boot_delay': + case 'scheduled_wait': + case 'local_apply': + case 'local_merge': + case 'local_restart_dnsmasq': + case 'local_runtime_check': + case 'local_blocklist_verify': + return 'label notice'; + case 'warning': + case 'warn': + case 'degraded': + case 'disabled': + return 'label warning'; + case 'error': + case 'failed': + case 'failure': + case 'expired': + case 'revoked': + case 'suspended': + return 'label danger'; + default: + return 'label'; + } +} + +function badge(value, fallback) { + var text = asText(value, fallback || '-'); + return E('span', { 'class': badgeClass(text), 'style': 'padding: 0' }, [ translateValue(text) ]); +} + +function row(label, value) { + var children; + + if (Array.isArray(value)) + children = value; + else if (value && typeof value === 'object') + children = [ value ]; + else + children = [ asText(value) ]; + + return E('tr', {}, [ + E('th', { 'style': 'width: 32%' }, [ label ]), + E('td', {}, children) + ]); +} + +function table(rows) { + return E('table', { 'class': 'table' }, rows); +} + +function section(title, rows) { + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ title ]), + table(rows) + ]); +} + +function renderMessage(message) { + if (typeof message === 'string') + return message; + + if (message && typeof message === 'object') { + if (message.message) + return message.message; + if (message.code) + return message.code; + return JSON.stringify(message); + } + + return asText(message); +} + +function renderMessages(title, items, className) { + if (!items || !items.length) + return null; + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ title ]), + E('ul', { 'class': className || '' }, items.map(function(item) { + return E('li', {}, [ renderMessage(item) ]); + })) + ]); +} + +function summaryMessage(summary) { + var code = String((summary && summary.code) || '').toLowerCase(); + + return SUMMARY_MESSAGES[code] || asText(summary && summary.message, '-'); +} + +function renderSummary(summary) { + if (!summary) + return '-'; + + if (typeof summary === 'string') + return translateValue(summary); + + return [ + E('span', { 'class': badgeClass(summary.severity || summary.label), 'style': 'padding: 0' }, [ translateValue(asText(summary.label, '-')) ]), + ' ', + summaryMessage(summary) + ]; +} + +function renderSources(sources) { + var items = (sources && sources.items) || []; + var body; + + if (!items.length) { + body = [ E('tr', {}, [ E('td', { 'colspan': 8 }, [ _('No sources reported by SafeShield.') ]) ]) ]; + } + else { + var cstyle = { 'style': 'text-align:center' }; + body = items.map(function(item) { + return E('tr', {}, [ + E('td', cstyle, [ asText(item.name || item.id) ]), + E('td', cstyle, [ translateValue(asText(item.action || sources.mode)) ]), + E('td', cstyle, [ formatBool(item.enabled) ]), + E('td', cstyle, [ badge(item.last_result) ]), + E('td', cstyle, [ formatNumber(item.line_count) ]), + E('td', cstyle, [ formatSizeKb(item.size_kb) ]), + E('td', cstyle, [ translateValue(asText(item.artifact_tier)) ]), + E('td', cstyle, [ asText(item.artifact_version) ]) + ]); + }); + } + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _('Sources') ]), + E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', {}, [ _('Name') ]), + E('th', {}, [ _('Mode / action') ]), + E('th', {}, [ _('Enabled') ]), + E('th', {}, [ _('Last result') ]), + E('th', {}, [ _('Domains / lines') ]), + E('th', {}, [ _('Size') ]), + E('th', {}, [ _('Tier') ]), + E('th', {}, [ _('Version') ]) + ]) + ].concat(body)) + ]); +} + +function renderHealth(checks) { + var names = [ + [ 'api_resolve', _('Artifact metadata resolve') ], + [ 'artifact_download', _('Artifact download') ], + [ 'artifact_sha256', _('Artifact SHA-256') ], + [ 'dnsmasq_binary', _('dnsmasq binary') ], + [ 'dnsmasq_confdir', _('dnsmasq confdir') ], + [ 'dnsmasq_initial_restart', _('Initial dnsmasq restart') ], + [ 'dnsmasq_final_restart', _('Final dnsmasq restart') ], + [ 'dns_runtime', _('DNS runtime') ], + [ 'blocklist_verify', _('Blocklist verify') ], + [ 'min_valid_line_count', _('Minimum valid rule count') ], + [ 'max_file_size', _('Maximum file size') ] + ]; + + return section(_('Health checks'), names.map(function(item) { + var value = checks ? checks[item[0]] : null; + return row(item[1], badge(value)); + })); +} + +function renderStatus(data, root) { + var status = data || {}; + var runtime = status.runtime || {}; + var license = status.license || {}; + var device = status.device || {}; + var deviceConfigured = device.configured || {}; + var artifact = status.artifact || {}; + var localOverrides = status.local_overrides || {}; + var blocklist = status.blocklist || {}; + var sources = status.sources || {}; + var health = status.health || {}; + var timestamps = status.timestamps || {}; + var schema = status.schema || {}; + + var warnings = renderMessages(_('Warnings'), status.warnings, ''); + var errors = renderMessages(_('Errors'), status.errors, ''); + + var nodes = [ + E('h2', {}, [ _('SafeShield') ]), + renderActions(status, root), + + section(_('Current status'), [ + row(_('Status'), badge(status.status)), + row(_('Stage'), badge(status.stage)), + row(_('Summary'), renderSummary(status.summary)), + row(_('Version'), status.version), + row(_('Schema'), schema.name ? schema.name + ' v' + asText(schema.version) : '-'), + row(_('Enabled'), formatBool(status.enabled)), + row(_('Active'), formatBool(status.active)), + row(_('Health'), badge(health.overall)), + row(_('Generated at'), formatTimestamp(timestamps.generated_at)), + row(_('Last attempt'), formatTimestamp(timestamps.last_attempt)), + row(_('Last success'), formatTimestamp(timestamps.last_success)), + row(_('Last failure'), formatTimestamp(timestamps.last_failure)), + row(_('Last local apply'), formatTimestamp(timestamps.last_local_apply)), + row(_('Last local apply failure'), formatTimestamp(timestamps.last_local_apply_failure)) + ]), + + section(_('Runtime'), [ + row(_('Refresh daemon running'), formatBool(runtime.refreshd_running)), + row(_('dnsmasq running'), formatBool(runtime.dnsmasq_running)), + row(_('DNS runtime OK'), formatBool(runtime.dns_runtime_ok)), + row(_('Config loaded'), formatBool(runtime.config_loaded)), + row(_('Require WAN'), formatBool(runtime.require_wan)), + row(_('Refresh on boot'), formatBool(runtime.refresh_on_boot)), + row(_('Last result'), badge(runtime.last_result)), + row(_('Last error code'), runtime.last_error_code) + ]), + + + section(_('License'), [ + row(_('Configured'), formatBool(license.configured)), + row(_('Masked key'), license.key_masked), + row(_('Plan'), translateValue(asText(license.plan))), + row(_('Status'), badge(license.status)) + ]), + + section(_('Device'), [ + row(_('Physical fingerprint'), device.physical_fingerprint), + row(_('Runtime profile'), device.profile), + row(_('Configured physical fingerprint'), deviceConfigured.physical_fingerprint), + row(_('Vendor'), deviceConfigured.vendor), + row(_('Model'), deviceConfigured.model), + row(_('Architecture'), deviceConfigured.arch), + row(_('Memory'), deviceConfigured.memory_mb ? deviceConfigured.memory_mb + ' MB' : '-') + ]), + + section(_('Hub artifact'), [ + row(_('Resolved'), formatBool(artifact.resolved)), + row(_('Tier'), translateValue(asText(artifact.tier))), + row(_('Version'), artifact.version), + row(_('SHA-256'), formatHash(artifact.sha256)), + row(_('Unique domains'), formatNumber(artifact.unique_domains)), + row(_('Rules'), formatNumber(artifact.rules)), + row(_('Download URL present'), formatBool(artifact.download_url_present)) + ]), + + section(_('Local overrides'), [ + row(_('Enabled'), formatBool(localOverrides.enabled)), + row(_('Allowlist path'), localOverrides.allowlist_path), + row(_('Blocklist path'), localOverrides.blocklist_path) + ]), + + section(_('Blocklist'), [ + row(_('Installed'), formatBool(blocklist.installed)), + row(_('Path'), blocklist.path), + row(_('Valid rules'), formatNumber(blocklist.valid_line_count)), + row(_('File size'), formatSizeKb(blocklist.file_size_kb)), + row(_('Compressed'), formatBool(blocklist.compressed)), + row(_('Verification OK'), formatBool(blocklist.verification_ok)), + row(_('Test domain'), blocklist.test_domain), + row(_('Test domain success'), formatNumber(blocklist.test_domain_success_count) + ' / ' + formatNumber(blocklist.test_domain_sample_count)), + row(_('Previous backup available'), formatBool(blocklist.previous_backup_available)) + ]), + + section(_('Schedule'), [ + row(_('Refresh interval'), formatDuration(timestamps.refresh_interval_s)), + row(_('Next refresh'), formatTimestamp(timestamps.next_refresh_at)), + row(_('Next refresh in'), formatDuration(timestamps.next_refresh_in_s)), + row(_('Boot start delay'), formatDuration(timestamps.boot_start_delay_s)) + ]), + + renderHealth(health.checks), + renderSources(sources) + ]; + + if (warnings) + nodes.push(warnings); + if (errors) + nodes.push(errors); + + return E('div', {}, nodes); +} + +return view.extend({ + load: function() { + return callStatus(); + }, + + render: function(data) { + var root = E('div', {}, []); + + root.appendChild(renderStatus(data, root)); + + poll.add(function() { + return callStatus().then(function(updated) { + root.replaceChild(renderStatus(updated, root), root.firstChild); + }); + }, 5); + + return root; + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/rules.js b/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/rules.js new file mode 100644 index 000000000..d48d001bc --- /dev/null +++ b/luci-app-safeshield/htdocs/luci-static/resources/view/safeshield/rules.js @@ -0,0 +1,285 @@ +'use strict'; + +'require rpc'; +'require ui'; +'require view'; + +var callStatus = rpc.declare({ + object: 'safeshield', + method: 'status', + expect: { } +}); + +var callRulesList = rpc.declare({ + object: 'safeshield', + method: 'rules_list', + params: [ 'action' ], + expect: { } +}); + +var callRuleAdd = rpc.declare({ + object: 'safeshield', + method: 'rule_add', + params: [ 'action', 'domain', 'refresh' ], + expect: { } +}); + +var callRuleDelete = rpc.declare({ + object: 'safeshield', + method: 'rule_delete', + params: [ 'action', 'domain', 'refresh' ], + expect: { } +}); + +function apiError(response, fallback) { + if (response && response.error) { + if (response.error.message) + return response.error.message; + if (response.error.code) + return response.error.code; + } + + return fallback || _('SafeShield rule request failed.'); +} + +function notify(level, message) { + ui.addNotification(null, E('p', {}, [ message ]), level || 'info'); +} + +function formatTimestamp(value) { + var n = Number(value || 0); + var date; + + if (!n) + return '-'; + + date = new Date(n * 1000); + return isNaN(date.getTime()) ? String(value) : date.toLocaleString(); +} + +function delay(ms) { + return new Promise(function(resolve) { + window.setTimeout(resolve, ms); + }); +} + +function waitForLocalApply(beforeSuccess, beforeFailure, timeoutMs) { + var started = Date.now(); + + function check() { + return callStatus().then(function(status) { + var timestamps = (status && status.timestamps) || {}; + var success = Number(timestamps.last_local_apply || 0); + var failure = Number(timestamps.last_local_apply_failure || 0); + + if (success > beforeSuccess) + return { applied: true, status: status }; + + if (failure > beforeFailure) + return { applied: false, failed: true, status: status }; + + if (Date.now() - started >= timeoutMs) + return { applied: false, pending: true, status: status }; + + return delay(1000).then(check); + }); + } + + return check(); +} + +function applyMessage(action, mutation, result) { + var verb = action === 'block' ? _('block') : _('allow'); + var refresh = mutation.refresh || {}; + + if (!refresh.requested) { + if (refresh.reason === 'unchanged') + return _('The %s rule was already in the requested state.').format(verb); + if (refresh.reason === 'local_overrides_disabled') + return _('The rule was saved, but local overrides are disabled so it is not active.'); + return _('The rule was saved without requesting a DNS apply.'); + } + + if (!refresh.accepted) { + if (refresh.reason === 'disabled') + return _('The rule was saved, but SafeShield is disabled so it is not active yet.'); + if (refresh.reason === 'service_stopped') + return _('The rule was saved, but the SafeShield service is stopped.'); + return _('The rule was saved, but the local DNS apply request was not accepted: %s').format(refresh.reason || _('unknown reason')); + } + + if (result && result.applied) + return _('The %s rule was saved and applied to DNS.').format(verb); + if (result && result.failed) + return _('The rule was saved, but SafeShield reported a local apply failure. Check Overview and system logs.'); + return _('The rule was saved and local apply was accepted, but completion was not observed before the UI timeout. SafeShield may still be applying it.'); +} + +function mutationLevel(mutation, result) { + var refresh = mutation.refresh || {}; + + if (!refresh.requested && refresh.reason === 'unchanged') + return 'info'; + if (refresh.requested && refresh.accepted && result && result.applied) + return 'info'; + return 'warning'; +} + +function mutateRule(action, domain, add, status) { + var timestamps = (status && status.timestamps) || {}; + var beforeSuccess = Number(timestamps.last_local_apply || 0); + var beforeFailure = Number(timestamps.last_local_apply_failure || 0); + var request = add ? callRuleAdd(action, domain, true) : callRuleDelete(action, domain, true); + + return request.then(function(response) { + var changedField = add ? 'added' : 'deleted'; + var refresh; + + if (!response || response.ok !== true) + throw new Error(apiError(response)); + + if (!response[changedField]) + return { mutation: response, result: null }; + + refresh = response.refresh || {}; + if (!refresh.requested || !refresh.accepted) + return { mutation: response, result: null }; + + return waitForLocalApply(beforeSuccess, beforeFailure, 90000).then(function(result) { + return { mutation: response, result: result }; + }); + }); +} + +function renderApplyStatus(status) { + var timestamps = (status && status.timestamps) || {}; + var local = (status && status.local_overrides) || {}; + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ _('Local apply status') ]), + E('table', { 'class': 'table' }, [ + E('tr', {}, [ E('th', {}, [ _('Local overrides enabled') ]), E('td', {}, [ local.enabled ? _('Yes') : _('No') ]) ]), + E('tr', {}, [ E('th', {}, [ _('Last local apply') ]), E('td', {}, [ formatTimestamp(timestamps.last_local_apply) ]) ]), + E('tr', {}, [ E('th', {}, [ _('Last local apply failure') ]), E('td', {}, [ formatTimestamp(timestamps.last_local_apply_failure) ]) ]), + E('tr', {}, [ E('th', {}, [ _('Current stage') ]), E('td', {}, [ status.stage || '-' ]) ]) + ]), + E('div', { 'class': 'cbi-section-descr' }, [ + _('SafeShield applies rule edits using the cached Hub artifact, then atomically rebuilds the active dnsmasq blocklist and verifies DNS. A full artifact refresh is only used as a fallback when the cached Hub artifact is unavailable.') + ]) + ]); +} + +function renderRuleSection(action, entries, status, root, reload) { + var isBlock = action === 'block'; + var title = isBlock ? _('Block list') : _('Allow list'); + var description = isBlock + ? _('Domains in this list are always added to the final SafeShield blocklist.') + : _('Domains in this list are removed from the final SafeShield blocklist.'); + var input = E('input', { + 'class': 'cbi-input-text', + 'type': 'text', + 'placeholder': 'example.com', + 'autocomplete': 'off', + 'spellcheck': 'false' + }); + var add = E('button', { 'class': 'btn cbi-button cbi-button-positive' }, [ isBlock ? _('Add block rule') : _('Add allow rule') ]); + var rows = []; + + function runMutation(domain, adding, button) { + button.disabled = true; + mutateRule(action, domain, adding, status).then(function(outcome) { + notify(mutationLevel(outcome.mutation, outcome.result), applyMessage(action, outcome.mutation, outcome.result)); + return reload(); + }).catch(function(err) { + notify('danger', err.message || String(err)); + }).finally(function() { + button.disabled = false; + }); + } + + add.addEventListener('click', function(ev) { + var domain = input.value.trim(); + ev.preventDefault(); + + if (!domain) { + notify('warning', _('Enter a domain name first.')); + return; + } + + runMutation(domain, true, add); + }); + + input.addEventListener('keydown', function(ev) { + if (ev.key === 'Enter') { + ev.preventDefault(); + add.click(); + } + }); + + (entries || []).forEach(function(domain) { + var remove = E('button', { 'class': 'btn cbi-button cbi-button-negative' }, [ _('Delete') ]); + remove.addEventListener('click', function(ev) { + ev.preventDefault(); + if (!window.confirm(_('Delete %s from the %s list?').format(domain, isBlock ? _('block') : _('allow')))) + return; + runMutation(domain, false, remove); + }); + + rows.push(E('tr', {}, [ + E('td', {}, [ E('code', {}, [ domain ]) ]), + E('td', { 'style': 'width: 1%; white-space: nowrap' }, [ remove ]) + ])); + }); + + if (!rows.length) + rows.push(E('tr', {}, [ E('td', { 'colspan': 2 }, [ _('No local rules in this list.') ]) ])); + + return E('div', { 'class': 'cbi-section' }, [ + E('h3', {}, [ title ]), + E('div', { 'class': 'cbi-section-descr' }, [ description ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title' }, [ _('Domain') ]), + E('div', { 'class': 'cbi-value-field' }, [ input, ' ', add ]) + ]), + E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ E('th', {}, [ _('Domain') ]), E('th', {}, [ _('Action') ]) ]) + ].concat(rows)) + ]); +} + +function renderPage(data, root) { + var rules = data[0] || {}; + var status = data[1] || {}; + var reload = function() { + return Promise.all([ callRulesList(''), callStatus() ]).then(function(updated) { + root.replaceChild(renderPage(updated, root), root.firstChild); + return updated; + }); + }; + + return E('div', {}, [ + E('h2', {}, [ _('SafeShield local rules') ]), + E('div', { 'class': 'cbi-map-descr' }, [ + _('Local allow and block rules are managed through the public SafeShield rule API. LuCI never edits /etc/safeshield files directly.') + ]), + renderApplyStatus(status), + renderRuleSection('allow', rules.allow || [], status, root, reload), + renderRuleSection('block', rules.block || [], status, root, reload) + ]); +} + +return view.extend({ + load: function() { + return Promise.all([ callRulesList(''), callStatus() ]); + }, + + render: function(data) { + var root = E('div', {}, []); + root.appendChild(renderPage(data || [ {}, {} ], root)); + return root; + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/luci-app-safeshield/po/templates/safeshield.pot b/luci-app-safeshield/po/templates/safeshield.pot new file mode 100644 index 000000000..ba5bf2de6 --- /dev/null +++ b/luci-app-safeshield/po/templates/safeshield.pot @@ -0,0 +1,701 @@ +msgid "" +msgstr "" +"Project-Id-Version: luci-app-safeshield\n" +"PO-Revision-Date: 2026-01-01 00:00+0000\n" +"Last-Translator: SafeShield Translators\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Action" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Add allow rule" +msgstr "" + +msgid "Add block rule" +msgstr "" + +msgid "allow" +msgstr "" + +msgid "Allow list" +msgstr "" + +msgid "Allowlist path" +msgstr "" + +msgid "Apply local allow/block rules" +msgstr "" + +msgid "Apply local rules on top of the cached Hub artifact. Rule files are managed through the SafeShield rule API." +msgstr "" + +msgid "Architecture" +msgstr "" + +msgid "Artifact and runtime safety" +msgstr "" + +msgid "Artifact download" +msgstr "" + +msgid "Artifact metadata resolve" +msgstr "" + +msgid "Artifact SHA-256" +msgstr "" + +msgid "A SafeShield refresh is already running." +msgstr "" + +msgid "block" +msgstr "" + +msgid "Block list" +msgstr "" + +msgid "Blocklist" +msgstr "" + +msgid "Blocklist path" +msgstr "" + +msgid "Blocklist verify" +msgstr "" + +msgid "Boot start delay" +msgstr "" + +msgid "Clear license" +msgstr "" + +msgid "Clear the configured SafeShield license key?" +msgstr "" + +msgid "Compress blocklist" +msgstr "" + +msgid "Compressed" +msgstr "" + +msgid "Config loaded" +msgstr "" + +msgid "Configured" +msgstr "" + +msgid "Configured physical fingerprint" +msgstr "" + +msgid "Configured state" +msgstr "" + +msgid "Current stage" +msgstr "" + +msgid "Current status" +msgstr "" + +msgid "Debug" +msgstr "" + +msgid "Delay before SafeShield performs boot-time work." +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "Delete %s from the %s list?" +msgstr "" + +msgid "Device" +msgstr "" + +msgid "Device identity and profile fields are owned by SafeShield and are not editable from LuCI." +msgstr "" + +msgid "Device (read only)" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Disabled" +msgstr "" + +msgid "Disable request accepted." +msgstr "" + +msgid "Disable request accepted. Runtime convergence is asynchronous; check Overview for the live state." +msgstr "" + +msgid "Disable SafeShield" +msgstr "" + +msgid "dnsmasq binary" +msgstr "" + +msgid "dnsmasq confdir" +msgstr "" + +msgid "dnsmasq running" +msgstr "" + +msgid "DNS runtime" +msgstr "" + +msgid "DNS runtime OK" +msgstr "" + +msgid "Domain" +msgstr "" + +msgid "Domains in this list are always added to the final SafeShield blocklist." +msgstr "" + +msgid "Domains in this list are removed from the final SafeShield blocklist." +msgstr "" + +msgid "Domains / lines" +msgstr "" + +msgid "Download retries" +msgstr "" + +msgid "Download timeout" +msgstr "" + +msgid "Download URL present" +msgstr "" + +msgid "Enable additional debug output for troubleshooting." +msgstr "" + +msgid "Enabled" +msgstr "" + +msgid "Enable debug logging" +msgstr "" + +msgid "Enable/disable and refresh actions use the public SafeShield ubus API. Enable/disable convergence is asynchronous and is verified through safeshield.status." +msgstr "" + +msgid "Enable request accepted." +msgstr "" + +msgid "Enable request accepted. Runtime convergence is asynchronous; check Overview for the live state." +msgstr "" + +msgid "Enable SafeShield" +msgstr "" + +msgid "Enter a domain name first." +msgstr "" + +msgid "Enter a license key first. Use Clear license to remove the current key." +msgstr "" + +msgid "Enter a new key to replace the configured key" +msgstr "" + +msgid "Enter license key" +msgstr "" + +msgid "Errors" +msgstr "" + +msgid "Errors only" +msgstr "" + +msgid "File size" +msgstr "" + +msgid "Final dnsmasq restart" +msgstr "" + +msgid "General" +msgstr "" + +msgid "Generated at" +msgstr "" + +msgid "Health" +msgstr "" + +msgid "Health checks" +msgstr "" + +msgid "Hub artifact" +msgstr "" + +msgid "Info" +msgstr "" + +msgid "Initial dnsmasq restart" +msgstr "" + +msgid "Installed" +msgstr "" + +msgid "Interval between successful Hub artifact refreshes." +msgstr "" + +msgid "KB" +msgstr "" + +msgid "Keep disabled unless the SafeShield runtime explicitly supports compressed dnsmasq blocklists." +msgstr "" + +msgid "Last attempt" +msgstr "" + +msgid "Last error code" +msgstr "" + +msgid "Last failure" +msgstr "" + +msgid "Last local apply" +msgstr "" + +msgid "Last local apply failure" +msgstr "" + +msgid "Last result" +msgstr "" + +msgid "Last success" +msgstr "" + +msgid "License" +msgstr "" + +msgid "License key cleared. SafeShield will use the unlicensed/free artifact path." +msgstr "" + +msgid "License key updated. SafeShield requested an artifact refresh." +msgstr "" + +msgid "Local allow and block rules are managed through the public SafeShield rule API. LuCI never edits /etc/safeshield files directly." +msgstr "" + +msgid "Local apply status" +msgstr "" + +msgid "Local overrides" +msgstr "" + +msgid "Local overrides enabled" +msgstr "" + +msgid "Local rules" +msgstr "" + +msgid "Local Rules" +msgstr "" + +msgid "Log verbosity" +msgstr "" + +msgid "Masked key" +msgstr "" + +msgid "Maximum accepted final blocklist size." +msgstr "" + +msgid "Maximum blocklist size" +msgstr "" + +msgid "Maximum duration used by the SafeShield pause command." +msgstr "" + +msgid "Maximum file size" +msgstr "" + +msgid "Maximum retry count for artifact downloads." +msgstr "" + +msgid "Memory" +msgstr "" + +msgid "Minimum valid rule count" +msgstr "" + +msgid "Mode / action" +msgstr "" + +msgid "Model" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "New license key" +msgstr "" + +msgid "Next refresh" +msgstr "" + +msgid "Next refresh in" +msgstr "" + +msgid "No" +msgstr "" + +msgid "No local rules in this list." +msgstr "" + +msgid "No SafeShield settings changed." +msgstr "" + +msgid "No sources reported by SafeShield." +msgstr "" + +msgid "Path" +msgstr "" + +msgid "Pause timeout" +msgstr "" + +msgid "Physical fingerprint" +msgstr "" + +msgid "Plan" +msgstr "" + +msgid "Previous backup available" +msgstr "" + +msgid "Refresh daemon running" +msgstr "" + +msgid "Refresh interval" +msgstr "" + +msgid "Refresh now" +msgstr "" + +msgid "Refresh on boot" +msgstr "" + +msgid "Refresh the Hub artifact after boot when the existing successful refresh is no longer recent." +msgstr "" + +msgid "Refresh was not started: %s" +msgstr "" + +msgid "Reject an artifact when the generated dnsmasq rule count is below this value." +msgstr "" + +msgid "Require WAN" +msgstr "" + +msgid "Require WAN before refresh" +msgstr "" + +msgid "Resolved" +msgstr "" + +msgid "Restart dnsmasq before install" +msgstr "" + +msgid "Restart dnsmasq before installing a newly downloaded artifact. Normally this should stay disabled." +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Run dnsmasq sanity check" +msgstr "" + +msgid "Runtime" +msgstr "" + +msgid "Runtime profile" +msgstr "" + +msgid "SafeShield" +msgstr "" + +msgid "SafeShield accepted the request but runtime convergence was not observed within 15 seconds. Status polling will continue." +msgstr "" + +msgid "SafeShield applies rule edits using the cached Hub artifact, then atomically rebuilds the active dnsmasq blocklist and verifies DNS. A full artifact refresh is only used as a fallback when the cached Hub artifact is unavailable." +msgstr "" + +msgid "SafeShield is disabled and stopped." +msgstr "" + +msgid "SafeShield is enabled and running." +msgstr "" + +msgid "SafeShield is idle." +msgstr "" + +msgid "SafeShield is ready." +msgstr "" + +msgid "SafeShield is refreshing the blocklist." +msgstr "" + +msgid "SafeShield is running with degraded protection." +msgstr "" + +msgid "SafeShield encountered an error." +msgstr "" + +msgid "SafeShield is paused." +msgstr "" + +msgid "SafeShield is disabled." +msgstr "" + +msgid "SafeShield local rules" +msgstr "" + +msgid "SafeShield owns enable/disable lifecycle. LuCI uses safeshield.set_enabled rather than writing UCI directly." +msgstr "" + +msgid "SafeShield refresh request failed." +msgstr "" + +msgid "SafeShield refresh started." +msgstr "" + +msgid "SafeShield rejected the lifecycle request." +msgstr "" + +msgid "SafeShield request failed." +msgstr "" + +msgid "SafeShield rule request failed." +msgstr "" + +msgid "SafeShield settings" +msgstr "" + +msgid "SafeShield settings saved. The service was restarted and a refresh was requested where applicable." +msgstr "" + +msgid "Save settings" +msgstr "" + +msgid "Schedule" +msgstr "" + +msgid "Schema" +msgstr "" + +msgid "seconds" +msgstr "" + +msgid "Service state" +msgstr "" + +msgid "SHA-256" +msgstr "" + +msgid "Size" +msgstr "" + +msgid "%s must be an integer." +msgstr "" + +msgid "%s must be at least %d." +msgstr "" + +msgid "%s must not exceed %d." +msgstr "" + +msgid "Sources" +msgstr "" + +msgid "Stage" +msgstr "" + +msgid "Status" +msgstr "" + +msgid "Summary" +msgstr "" + +msgid "Test domain" +msgstr "" + +msgid "Test domain success" +msgstr "" + +msgid "The license key is unchanged." +msgstr "" + +msgid "The raw license key is never returned by the SafeShield API." +msgstr "" + +msgid "The rule was saved and local apply was accepted, but completion was not observed before the UI timeout. SafeShield may still be applying it." +msgstr "" + +msgid "The rule was saved, but local overrides are disabled so it is not active." +msgstr "" + +msgid "The rule was saved, but SafeShield is disabled so it is not active yet." +msgstr "" + +msgid "The rule was saved, but SafeShield reported a local apply failure. Check Overview and system logs." +msgstr "" + +msgid "The rule was saved, but the local DNS apply request was not accepted: %s" +msgstr "" + +msgid "The rule was saved, but the SafeShield service is stopped." +msgstr "" + +msgid "The rule was saved without requesting a DNS apply." +msgstr "" + +msgid "The %s rule was already in the requested state." +msgstr "" + +msgid "The %s rule was saved and applied to DNS." +msgstr "" + +msgid "This page uses the public SafeShield ubus API. UCI, local rule files, service lifecycle and license storage remain owned by the safeshield package." +msgstr "" + +msgid "Tier" +msgstr "" + +msgid "Timeout used for Hub resolve and artifact downloads." +msgstr "" + +msgid "Unique domains" +msgstr "" + +msgid "unknown reason" +msgstr "" + +msgid "Update license" +msgstr "" + +msgid "Validate dnsmasq state after installing or applying the blocklist." +msgstr "" + +msgid "Valid rules" +msgstr "" + +msgid "Vendor" +msgstr "" + +msgid "Verification OK" +msgstr "" + +msgid "Version" +msgstr "" + +msgid "Wait for WAN connectivity before resolving and downloading Hub artifacts." +msgstr "" + +msgid "Warnings" +msgstr "" + +msgid "Yes" +msgstr "" + +msgid "Idle" +msgstr "" + +msgid "Waiting for scheduled refresh" +msgstr "" + +msgid "Waiting after boot" +msgstr "" + +msgid "Applying local rules" +msgstr "" + +msgid "Merging local rules" +msgstr "" + +msgid "Restarting DNS service" +msgstr "" + +msgid "Checking DNS service" +msgstr "" + +msgid "Verifying blocklist" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "Ready" +msgstr "" + +msgid "Success" +msgstr "" + +msgid "Running" +msgstr "" + +msgid "Refreshing" +msgstr "" + +msgid "Pending" +msgstr "" + +msgid "Notice" +msgstr "" + +msgid "Warning" +msgstr "" + +msgid "Degraded" +msgstr "" + +msgid "Error" +msgstr "" + +msgid "Failed" +msgstr "" + +msgid "Failure" +msgstr "" + +msgid "Expired" +msgstr "" + +msgid "Revoked" +msgstr "" + +msgid "Suspended" +msgstr "" + +msgid "Free" +msgstr "" + +msgid "Unlicensed" +msgstr "" + +msgid "Licensed" +msgstr "" + +msgid "Light" +msgstr "" + +msgid "Standard" +msgstr "" + +msgid "Full" +msgstr "" + +msgid "Block" +msgstr "" + +msgid "Allow" +msgstr "" diff --git a/luci-app-safeshield/po/zh-cn b/luci-app-safeshield/po/zh-cn new file mode 120000 index 000000000..8d69574dd --- /dev/null +++ b/luci-app-safeshield/po/zh-cn @@ -0,0 +1 @@ +zh_Hans \ No newline at end of file diff --git a/luci-app-safeshield/po/zh_Hans/safeshield.po b/luci-app-safeshield/po/zh_Hans/safeshield.po new file mode 100644 index 000000000..4aeaa6dee --- /dev/null +++ b/luci-app-safeshield/po/zh_Hans/safeshield.po @@ -0,0 +1,702 @@ +msgid "" +msgstr "" +"Project-Id-Version: luci-app-safeshield\n" +"PO-Revision-Date: 2026-08-26 00:00+0000\n" +"Last-Translator: ZagWrt Translators\n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Action" +msgstr "操作" + +msgid "Actions" +msgstr "操作" + +msgid "Active" +msgstr "活跃" + +msgid "Add allow rule" +msgstr "添加放行规则" + +msgid "Add block rule" +msgstr "添加拦截规则" + +msgid "allow" +msgstr "放行" + +msgid "Allow list" +msgstr "放行列表" + +msgid "Allowlist path" +msgstr "放行列表路径" + +msgid "Apply local allow/block rules" +msgstr "应用本地放行/拦截规则" + +msgid "Apply local rules on top of the cached Hub artifact. Rule files are managed through the SafeShield rule API." +msgstr "在已缓存的 Hub 产物基础上应用本地规则。规则文件通过 SafeShield 规则 API 管理。" + +msgid "Architecture" +msgstr "架构" + +msgid "Artifact and runtime safety" +msgstr "产物和运行时安全" + +msgid "Artifact download" +msgstr "产物下载" + +msgid "Artifact metadata resolve" +msgstr "产物元数据解析" + +msgid "Artifact SHA-256" +msgstr "产物 SHA-256" + +msgid "A SafeShield refresh is already running." +msgstr "SafeShield 刷新已在运行中。" + +msgid "block" +msgstr "拦截" + +msgid "Block list" +msgstr "拦截列表" + +msgid "Blocklist" +msgstr "拦截列表" + +msgid "Blocklist path" +msgstr "拦截列表路径" + +msgid "Blocklist verify" +msgstr "拦截列表校验" + +msgid "Boot start delay" +msgstr "启动延迟" + +msgid "Clear license" +msgstr "清除许可证" + +msgid "Clear the configured SafeShield license key?" +msgstr "确定要清除已配置的 SafeShield 许可证密钥?" + +msgid "Compress blocklist" +msgstr "压缩拦截列表" + +msgid "Compressed" +msgstr "已压缩" + +msgid "Config loaded" +msgstr "配置已加载" + +msgid "Configured" +msgstr "已配置" + +msgid "Configured physical fingerprint" +msgstr "已配置的物理指纹" + +msgid "Configured state" +msgstr "配置状态" + +msgid "Current stage" +msgstr "当前阶段" + +msgid "Current status" +msgstr "当前状态" + +msgid "Debug" +msgstr "调试" + +msgid "Delay before SafeShield performs boot-time work." +msgstr "SafeShield 执行启动任务前的延迟。" + +msgid "Delete" +msgstr "删除" + +msgid "Delete %s from the %s list?" +msgstr "确定从 %s 列表中删除 %s?" + +msgid "Device" +msgstr "设备" + +msgid "Device identity and profile fields are owned by SafeShield and are not editable from LuCI." +msgstr "设备身份和配置文件字段由 SafeShield 管理,不能通过 LuCI 编辑。" + +msgid "Device (read only)" +msgstr "设备(只读)" + +msgid "Diagnostics" +msgstr "诊断" + +msgid "Disabled" +msgstr "已禁用" + +msgid "Disable request accepted." +msgstr "禁用请求已接受。" + +msgid "Disable request accepted. Runtime convergence is asynchronous; check Overview for the live state." +msgstr "禁用请求已接受。运行时状态收敛是异步的,请在概览页查看实时状态。" + +msgid "Disable SafeShield" +msgstr "禁用 SafeShield" + +msgid "dnsmasq binary" +msgstr "dnsmasq 可执行文件" + +msgid "dnsmasq confdir" +msgstr "dnsmasq 配置目录" + +msgid "dnsmasq running" +msgstr "dnsmasq 运行中" + +msgid "DNS runtime" +msgstr "DNS 运行时" + +msgid "DNS runtime OK" +msgstr "DNS 运行时正常" + +msgid "Domain" +msgstr "域名" + +msgid "Domains in this list are always added to the final SafeShield blocklist." +msgstr "此列表中的域名将始终添加到最终的 SafeShield 拦截列表中。" + +msgid "Domains in this list are removed from the final SafeShield blocklist." +msgstr "此列表中的域名将从最终的 SafeShield 拦截列表中移除。" + +msgid "Domains / lines" +msgstr "域名 / 行数" + +msgid "Download retries" +msgstr "下载重试次数" + +msgid "Download timeout" +msgstr "下载超时" + +msgid "Download URL present" +msgstr "下载 URL 存在" + +msgid "Enable additional debug output for troubleshooting." +msgstr "启用额外的调试输出用于故障排查。" + +msgid "Enabled" +msgstr "已启用" + +msgid "Enable debug logging" +msgstr "启用调试日志" + +msgid "Enable/disable and refresh actions use the public SafeShield ubus API. Enable/disable convergence is asynchronous and is verified through safeshield.status." +msgstr "启用/禁用和刷新操作使用公共 SafeShield ubus API。启用/禁用状态收敛是异步的,通过 safeshield.status 验证。" + +msgid "Enable request accepted." +msgstr "启用请求已接受。" + +msgid "Enable request accepted. Runtime convergence is asynchronous; check Overview for the live state." +msgstr "启用请求已接受。运行时状态收敛是异步的,请在概览页查看实时状态。" + +msgid "Enable SafeShield" +msgstr "启用 SafeShield" + +msgid "Enter a domain name first." +msgstr "请先输入域名。" + +msgid "Enter a license key first. Use Clear license to remove the current key." +msgstr "请先输入许可证密钥。使用“清除许可证”可移除当前密钥。" + +msgid "Enter a new key to replace the configured key" +msgstr "输入新密钥以替换已配置的密钥" + +msgid "Enter license key" +msgstr "输入许可证密钥" + +msgid "Errors" +msgstr "错误" + +msgid "Errors only" +msgstr "仅错误" + +msgid "File size" +msgstr "文件大小" + +msgid "Final dnsmasq restart" +msgstr "最终 dnsmasq 重启" + +msgid "General" +msgstr "常规" + +msgid "Generated at" +msgstr "生成时间" + +msgid "Health" +msgstr "健康状态" + +msgid "Health checks" +msgstr "健康检查" + +msgid "Hub artifact" +msgstr "Hub 产物" + +msgid "Info" +msgstr "信息" + +msgid "Initial dnsmasq restart" +msgstr "初始 dnsmasq 重启" + +msgid "Installed" +msgstr "已安装" + +msgid "Interval between successful Hub artifact refreshes." +msgstr "成功刷新 Hub 产物之间的间隔。" + +msgid "KB" +msgstr "KB" + +msgid "Keep disabled unless the SafeShield runtime explicitly supports compressed dnsmasq blocklists." +msgstr "除非 SafeShield 运行时明确支持压缩的 dnsmasq 拦截列表,否则请保持禁用。" + +msgid "Last attempt" +msgstr "上次尝试" + +msgid "Last error code" +msgstr "上次错误代码" + +msgid "Last failure" +msgstr "上次失败" + +msgid "Last local apply" +msgstr "上次本地应用" + +msgid "Last local apply failure" +msgstr "上次本地应用失败" + +msgid "Last result" +msgstr "上次结果" + +msgid "Last success" +msgstr "上次成功" + +msgid "License" +msgstr "许可证" + +msgid "License key cleared. SafeShield will use the unlicensed/free artifact path." +msgstr "许可证密钥已清除。SafeShield 将使用免费/无授权的产物路径。" + +msgid "License key updated. SafeShield requested an artifact refresh." +msgstr "许可证密钥已更新。SafeShield 已请求刷新产物。" + +msgid "Local allow and block rules are managed through the public SafeShield rule API. LuCI never edits /etc/safeshield files directly." +msgstr "本地放行和拦截规则通过公共 SafeShield 规则 API 管理。LuCI 不会直接编辑 /etc/safeshield 文件。" + +msgid "Local apply status" +msgstr "本地应用状态" + +msgid "Local overrides" +msgstr "本地覆盖" + +msgid "Local overrides enabled" +msgstr "本地覆盖已启用" + +msgid "Local rules" +msgstr "本地规则" + +msgid "Local Rules" +msgstr "本地规则" + +msgid "Log verbosity" +msgstr "日志详细程度" + +msgid "Masked key" +msgstr "掩码密钥" + +msgid "Maximum accepted final blocklist size." +msgstr "最终拦截列表允许的最大大小。" + +msgid "Maximum blocklist size" +msgstr "拦截列表最大大小" + +msgid "Maximum duration used by the SafeShield pause command." +msgstr "SafeShield 暂停命令使用的最大持续时间。" + +msgid "Maximum file size" +msgstr "最大文件大小" + +msgid "Maximum retry count for artifact downloads." +msgstr "产物下载的最大重试次数。" + +msgid "Memory" +msgstr "内存" + +msgid "Minimum valid rule count" +msgstr "最少有效规则数" + +msgid "Mode / action" +msgstr "模式 / 动作" + +msgid "Model" +msgstr "型号" + +msgid "Name" +msgstr "名称" + +msgid "New license key" +msgstr "新许可证密钥" + +msgid "Next refresh" +msgstr "下次刷新" + +msgid "Next refresh in" +msgstr "距下次刷新" + +msgid "No" +msgstr "否" + +msgid "No local rules in this list." +msgstr "此列表中没有本地规则。" + +msgid "No SafeShield settings changed." +msgstr "SafeShield 设置未更改。" + +msgid "No sources reported by SafeShield." +msgstr "SafeShield 未报告任何源。" + +msgid "Path" +msgstr "路径" + +msgid "Pause timeout" +msgstr "暂停超时" + +msgid "Physical fingerprint" +msgstr "物理指纹" + +msgid "Plan" +msgstr "方案" + +msgid "Previous backup available" +msgstr "上一备份可用" + +msgid "Refresh daemon running" +msgstr "刷新守护进程运行中" + +msgid "Refresh interval" +msgstr "刷新间隔" + +msgid "Refresh now" +msgstr "立即刷新" + +msgid "Refresh on boot" +msgstr "启动时刷新" + +msgid "Refresh the Hub artifact after boot when the existing successful refresh is no longer recent." +msgstr "当上次成功刷新不再是最新时,在启动后刷新 Hub 产物。" + +msgid "Refresh was not started: %s" +msgstr "刷新未启动:%s" + +msgid "Reject an artifact when the generated dnsmasq rule count is below this value." +msgstr "当生成的 dnsmasq 规则数低于此值时拒绝产物。" + +msgid "Require WAN" +msgstr "需要 WAN" + +msgid "Require WAN before refresh" +msgstr "刷新前需要 WAN" + +msgid "Resolved" +msgstr "已解析" + +msgid "Restart dnsmasq before install" +msgstr "安装前重启 dnsmasq" + +msgid "Restart dnsmasq before installing a newly downloaded artifact. Normally this should stay disabled." +msgstr "在安装新下载的产物前重启 dnsmasq。通常应保持禁用。" + +msgid "Rules" +msgstr "规则" + +msgid "Run dnsmasq sanity check" +msgstr "运行 dnsmasq 健全性检查" + +msgid "Runtime" +msgstr "运行时" + +msgid "Runtime profile" +msgstr "运行时配置文件" + +msgid "SafeShield" +msgstr "SafeShield" + +msgid "SafeShield accepted the request but runtime convergence was not observed within 15 seconds. Status polling will continue." +msgstr "SafeShield 已接受请求,但在 15 秒内未观察到运行时状态收敛。将继续轮询状态。" + +msgid "SafeShield applies rule edits using the cached Hub artifact, then atomically rebuilds the active dnsmasq blocklist and verifies DNS. A full artifact refresh is only used as a fallback when the cached Hub artifact is unavailable." +msgstr "SafeShield 使用缓存的 Hub 产物应用规则编辑,然后原子性地重建活跃的 dnsmasq 拦截列表并验证 DNS。仅当缓存的 Hub 产物不可用时,才会完整刷新产物作为备选。" + +msgid "SafeShield is disabled and stopped." +msgstr "SafeShield 已禁用并停止。" + +msgid "SafeShield is enabled and running." +msgstr "SafeShield 已启用并运行中。" + +msgid "SafeShield is idle." +msgstr "SafeShield 处于空闲状态。" + +msgid "SafeShield is ready." +msgstr "SafeShield 已就绪。" + +msgid "SafeShield is refreshing the blocklist." +msgstr "SafeShield 正在刷新拦截列表。" + +msgid "SafeShield is running with degraded protection." +msgstr "SafeShield 正在降级保护状态下运行。" + +msgid "SafeShield encountered an error." +msgstr "SafeShield 遇到错误。" + +msgid "SafeShield is paused." +msgstr "SafeShield 已暂停。" + +msgid "SafeShield is disabled." +msgstr "SafeShield 已禁用。" + +msgid "SafeShield local rules" +msgstr "SafeShield 本地规则" + +msgid "SafeShield owns enable/disable lifecycle. LuCI uses safeshield.set_enabled rather than writing UCI directly." +msgstr "SafeShield 拥有启用/禁用生命周期。LuCI 使用 safeshield.set_enabled 而非直接写入 UCI。" + +msgid "SafeShield refresh request failed." +msgstr "SafeShield 刷新请求失败。" + +msgid "SafeShield refresh started." +msgstr "SafeShield 刷新已启动。" + +msgid "SafeShield rejected the lifecycle request." +msgstr "SafeShield 拒绝了生命周期请求。" + +msgid "SafeShield request failed." +msgstr "SafeShield 请求失败。" + +msgid "SafeShield rule request failed." +msgstr "SafeShield 规则请求失败。" + +msgid "SafeShield settings" +msgstr "SafeShield 设置" + +msgid "SafeShield settings saved. The service was restarted and a refresh was requested where applicable." +msgstr "SafeShield 设置已保存。服务已重启,并在适用时请求了刷新。" + +msgid "Save settings" +msgstr "保存设置" + +msgid "Schedule" +msgstr "计划" + +msgid "Schema" +msgstr "模式" + +msgid "seconds" +msgstr "秒" + +msgid "Service state" +msgstr "服务状态" + +msgid "SHA-256" +msgstr "SHA-256" + +msgid "Size" +msgstr "大小" + +msgid "%s must be an integer." +msgstr "%s 必须为整数。" + +msgid "%s must be at least %d." +msgstr "%s 不能小于 %d。" + +msgid "%s must not exceed %d." +msgstr "%s 不能超过 %d。" + +msgid "Sources" +msgstr "源" + +msgid "Stage" +msgstr "阶段" + +msgid "Status" +msgstr "状态" + +msgid "Summary" +msgstr "摘要" + +msgid "Test domain" +msgstr "测试域名" + +msgid "Test domain success" +msgstr "测试域名成功" + +msgid "The license key is unchanged." +msgstr "许可证密钥未更改。" + +msgid "The raw license key is never returned by the SafeShield API." +msgstr "SafeShield API 不会返回原始许可证密钥。" + +msgid "The rule was saved and local apply was accepted, but completion was not observed before the UI timeout. SafeShield may still be applying it." +msgstr "规则已保存且本地应用已接受,但在界面超时前未观察到完成。SafeShield 可能仍在应用中。" + +msgid "The rule was saved, but local overrides are disabled so it is not active." +msgstr "规则已保存,但本地覆盖已禁用,因此规则未生效。" + +msgid "The rule was saved, but SafeShield is disabled so it is not active yet." +msgstr "规则已保存,但 SafeShield 已禁用,因此规则尚未生效。" + +msgid "The rule was saved, but SafeShield reported a local apply failure. Check Overview and system logs." +msgstr "规则已保存,但 SafeShield 报告本地应用失败。请检查概览和系统日志。" + +msgid "The rule was saved, but the local DNS apply request was not accepted: %s" +msgstr "规则已保存,但本地 DNS 应用请求未被接受:%s" + +msgid "The rule was saved, but the SafeShield service is stopped." +msgstr "规则已保存,但 SafeShield 服务已停止。" + +msgid "The rule was saved without requesting a DNS apply." +msgstr "规则已保存,但未请求 DNS 应用。" + +msgid "The %s rule was already in the requested state." +msgstr "%s 规则已处于请求的状态。" + +msgid "The %s rule was saved and applied to DNS." +msgstr "%s 规则已保存并应用到 DNS。" + +msgid "This page uses the public SafeShield ubus API. UCI, local rule files, service lifecycle and license storage remain owned by the safeshield package." +msgstr "此页面使用公共 SafeShield ubus API。UCI、本地规则文件、服务生命周期和许可证存储仍由 safeshield 软件包管理。" + +msgid "Tier" +msgstr "等级" + +msgid "Timeout used for Hub resolve and artifact downloads." +msgstr "用于 Hub 解析和产物下载的超时时间。" + +msgid "Unique domains" +msgstr "唯一域名数" + +msgid "unknown reason" +msgstr "未知原因" + +msgid "Update license" +msgstr "更新许可证" + +msgid "Validate dnsmasq state after installing or applying the blocklist." +msgstr "安装或应用拦截列表后验证 dnsmasq 状态。" + +msgid "Valid rules" +msgstr "有效规则" + +msgid "Vendor" +msgstr "厂商" + +msgid "Verification OK" +msgstr "验证通过" + +msgid "Version" +msgstr "版本" + +msgid "Wait for WAN connectivity before resolving and downloading Hub artifacts." +msgstr "在解析和下载 Hub 产物前等待 WAN 连接。" + +msgid "Warnings" +msgstr "警告" + +msgid "Yes" +msgstr "是" + +msgid "Idle" +msgstr "空闲" + +msgid "Waiting for scheduled refresh" +msgstr "等待计划刷新" + +msgid "Waiting after boot" +msgstr "启动后等待" + +msgid "Applying local rules" +msgstr "应用本地规则" + +msgid "Merging local rules" +msgstr "合并本地规则" + +msgid "Restarting DNS service" +msgstr "重启 DNS 服务" + +msgid "Checking DNS service" +msgstr "检查 DNS 服务" + +msgid "Verifying blocklist" +msgstr "校验拦截列表" + +msgid "OK" +msgstr "正常" + +msgid "Ready" +msgstr "就绪" + +msgid "Success" +msgstr "成功" + +msgid "Running" +msgstr "运行中" + +msgid "Refreshing" +msgstr "刷新中" + +msgid "Pending" +msgstr "等待中" + +msgid "Notice" +msgstr "通知" + +msgid "Warning" +msgstr "警告" + +msgid "Degraded" +msgstr "降级" + +msgid "Error" +msgstr "错误" + +msgid "Failed" +msgstr "失败" + +msgid "Failure" +msgstr "失败" + +msgid "Expired" +msgstr "已过期" + +msgid "Revoked" +msgstr "已撤销" + +msgid "Suspended" +msgstr "已暂停" + +msgid "Free" +msgstr "免费" + +msgid "Unlicensed" +msgstr "未授权" + +msgid "Licensed" +msgstr "已授权" + +msgid "Light" +msgstr "轻量版" + +msgid "Standard" +msgstr "标准版" + +msgid "Full" +msgstr "完整版" + +msgid "Block" +msgstr "拦截" + +msgid "Allow" +msgstr "放行" diff --git a/luci-app-safeshield/root/etc/uci-defaults/90_luci-app-safeshield b/luci-app-safeshield/root/etc/uci-defaults/90_luci-app-safeshield new file mode 100644 index 000000000..ab587c676 --- /dev/null +++ b/luci-app-safeshield/root/etc/uci-defaults/90_luci-app-safeshield @@ -0,0 +1,9 @@ +#!/bin/sh + +rm -rf /tmp/luci-modulecache +rm -f /tmp/luci-indexcache + +[ -x /etc/init.d/rpcd ] && /etc/init.d/rpcd reload +[ -x /etc/init.d/uhttpd ] && /etc/init.d/uhttpd reload + +exit 0 \ No newline at end of file diff --git a/luci-app-safeshield/root/usr/share/luci/menu.d/luci-app-safeshield.json b/luci-app-safeshield/root/usr/share/luci/menu.d/luci-app-safeshield.json new file mode 100644 index 000000000..bf76226fa --- /dev/null +++ b/luci-app-safeshield/root/usr/share/luci/menu.d/luci-app-safeshield.json @@ -0,0 +1,45 @@ +{ + "admin/services/safeshield": { + "title": "SafeShield", + "order": 60, + "action": { + "type": "firstchild" + }, + "depends": { + "acl": [ "luci-app-safeshield" ] + } + }, + "admin/services/safeshield/overview": { + "title": "Overview", + "order": 10, + "action": { + "type": "view", + "path": "safeshield/overview" + }, + "depends": { + "acl": [ "luci-app-safeshield" ] + } + }, + "admin/services/safeshield/rules": { + "title": "Local Rules", + "order": 20, + "action": { + "type": "view", + "path": "safeshield/rules" + }, + "depends": { + "acl": [ "luci-app-safeshield" ] + } + }, + "admin/services/safeshield/config": { + "title": "Settings", + "order": 30, + "action": { + "type": "view", + "path": "safeshield/config" + }, + "depends": { + "acl": [ "luci-app-safeshield" ] + } + } +} diff --git a/luci-app-safeshield/root/usr/share/rpcd/acl.d/luci-app-safeshield.json b/luci-app-safeshield/root/usr/share/rpcd/acl.d/luci-app-safeshield.json new file mode 100644 index 000000000..8c867f964 --- /dev/null +++ b/luci-app-safeshield/root/usr/share/rpcd/acl.d/luci-app-safeshield.json @@ -0,0 +1,26 @@ +{ + "luci-app-safeshield": { + "description": "Grant LuCI access to the public SafeShield management API", + "read": { + "ubus": { + "safeshield": [ + "status", + "config", + "rules_list" + ] + } + }, + "write": { + "ubus": { + "safeshield": [ + "config_update", + "set_enabled", + "refresh", + "rule_add", + "rule_delete", + "license_update" + ] + } + } + } +} diff --git a/luci-app-sunpanel/Makefile b/luci-app-sunpanel/Makefile index b587f3064..8543425da 100644 --- a/luci-app-sunpanel/Makefile +++ b/luci-app-sunpanel/Makefile @@ -9,9 +9,9 @@ LUCI_TITLE:=LuCI support for sunpanel LUCI_DEPENDS:=+sunpanel LUCI_PKGARCH:=all -PKG_VERSION:=1.3.1-r2 +PKG_VERSION:=1.8.1-r1 # PKG_RELEASE MUST be empty for luci.mk -PKG_RELEASE:=2 +PKG_RELEASE:=3 LUCI_MINIFY_CSS:=0 LUCI_MINIFY_JS:=0 @@ -19,4 +19,3 @@ LUCI_MINIFY_JS:=0 include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature - diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/404-b0d1a3d9.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/404-b0d1a3d9.svg deleted file mode 100644 index 38420463f..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/404-b0d1a3d9.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/Alert-018ca7af.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/Alert-018ca7af.js deleted file mode 100644 index d7d8adb97..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/Alert-018ca7af.js +++ /dev/null @@ -1,48 +0,0 @@ -import{m as d,p as t,K as v,aT as F,n as H,f as j,q as M,z as C,af as N,y as p,aN as O,A as i,B as V,r as W,g as o,P as D,aL as K,F as q,G,aS as J,cT as Q,S as U,aD as X,aE as Y,aF as Z,aC as ee}from"./index-7e19b821.js";const re=d("alert",` - line-height: var(--n-line-height); - border-radius: var(--n-border-radius); - position: relative; - transition: background-color .3s var(--n-bezier); - background-color: var(--n-color); - text-align: start; - word-break: break-word; -`,[t("border",` - border-radius: inherit; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - transition: border-color .3s var(--n-bezier); - border: var(--n-border); - pointer-events: none; - `),v("closable",[d("alert-body",[t("title",` - padding-right: 24px; - `)])]),t("icon",{color:"var(--n-icon-color)"}),d("alert-body",{padding:"var(--n-padding)"},[t("title",{color:"var(--n-title-text-color)"}),t("content",{color:"var(--n-content-text-color)"})]),F({originalTransition:"transform .3s var(--n-bezier)",enterToProps:{transform:"scale(1)"},leaveToProps:{transform:"scale(0.9)"}}),t("icon",` - position: absolute; - left: 0; - top: 0; - align-items: center; - justify-content: center; - display: flex; - width: var(--n-icon-size); - height: var(--n-icon-size); - font-size: var(--n-icon-size); - margin: var(--n-icon-margin); - `),t("close",` - transition: - color .3s var(--n-bezier), - background-color .3s var(--n-bezier); - position: absolute; - right: 0; - top: 0; - margin: var(--n-close-margin); - `),v("show-icon",[d("alert-body",{paddingLeft:"calc(var(--n-icon-margin-left) + var(--n-icon-size) + var(--n-icon-margin-right))"})]),v("right-adjust",[d("alert-body",{paddingRight:"calc(var(--n-close-size) + var(--n-padding) + 2px)"})]),d("alert-body",` - border-radius: var(--n-border-radius); - transition: border-color .3s var(--n-bezier); - `,[t("title",` - transition: color .3s var(--n-bezier); - font-size: 16px; - line-height: 19px; - font-weight: var(--n-title-font-weight); - `,[H("& +",[t("content",{marginTop:"9px"})])]),t("content",{transition:"color .3s var(--n-bezier)",fontSize:"var(--n-font-size)"})]),t("icon",{transition:"color .3s var(--n-bezier)"})]),oe=Object.assign(Object.assign({},C.props),{title:String,showIcon:{type:Boolean,default:!0},type:{type:String,default:"default"},bordered:{type:Boolean,default:!0},closable:Boolean,onClose:Function,onAfterLeave:Function,onAfterHide:Function}),ie=j({name:"Alert",inheritAttrs:!1,props:oe,setup(n){const{mergedClsPrefixRef:e,mergedBorderedRef:l,inlineThemeDisabled:g,mergedRtlRef:u}=M(n),h=C("Alert","-alert",re,Q,n,e),z=N("Alert",u,e),f=p(()=>{const{common:{cubicBezierEaseInOut:a},self:r}=h.value,{fontSize:x,borderRadius:R,titleFontWeight:I,lineHeight:A,iconSize:T,iconMargin:m,iconMarginRtl:$,closeIconSize:w,closeBorderRadius:P,closeSize:B,closeMargin:S,closeMarginRtl:_,padding:L}=r,{type:s}=n,{left:k,right:E}=O(m);return{"--n-bezier":a,"--n-color":r[i("color",s)],"--n-close-icon-size":w,"--n-close-border-radius":P,"--n-close-color-hover":r[i("closeColorHover",s)],"--n-close-color-pressed":r[i("closeColorPressed",s)],"--n-close-icon-color":r[i("closeIconColor",s)],"--n-close-icon-color-hover":r[i("closeIconColorHover",s)],"--n-close-icon-color-pressed":r[i("closeIconColorPressed",s)],"--n-icon-color":r[i("iconColor",s)],"--n-border":r[i("border",s)],"--n-title-text-color":r[i("titleTextColor",s)],"--n-content-text-color":r[i("contentTextColor",s)],"--n-line-height":A,"--n-border-radius":R,"--n-font-size":x,"--n-title-font-weight":I,"--n-icon-size":T,"--n-icon-margin":m,"--n-icon-margin-rtl":$,"--n-close-size":B,"--n-close-margin":S,"--n-close-margin-rtl":_,"--n-padding":L,"--n-icon-margin-left":k,"--n-icon-margin-right":E}}),c=g?V("alert",p(()=>n.type[0]),f,n):void 0,b=W(!0),y=()=>{const{onAfterLeave:a,onAfterHide:r}=n;a&&a(),r&&r()};return{rtlEnabled:z,mergedClsPrefix:e,mergedBordered:l,visible:b,handleCloseClick:()=>{var a;Promise.resolve((a=n.onClose)===null||a===void 0?void 0:a.call(n)).then(r=>{r!==!1&&(b.value=!1)})},handleAfterLeave:()=>{y()},mergedTheme:h,cssVars:g?void 0:f,themeClass:c==null?void 0:c.themeClass,onRender:c==null?void 0:c.onRender}},render(){var n;return(n=this.onRender)===null||n===void 0||n.call(this),o(J,{onAfterLeave:this.handleAfterLeave},{default:()=>{const{mergedClsPrefix:e,$slots:l}=this,g={class:[`${e}-alert`,this.themeClass,this.closable&&`${e}-alert--closable`,this.showIcon&&`${e}-alert--show-icon`,!this.title&&this.closable&&`${e}-alert--right-adjust`,this.rtlEnabled&&`${e}-alert--rtl`],style:this.cssVars,role:"alert"};return this.visible?o("div",Object.assign({},D(this.$attrs,g)),this.closable&&o(K,{clsPrefix:e,class:`${e}-alert__close`,onClick:this.handleCloseClick}),this.bordered&&o("div",{class:`${e}-alert__border`}),this.showIcon&&o("div",{class:`${e}-alert__icon`,"aria-hidden":"true"},q(l.icon,()=>[o(U,{clsPrefix:e},{default:()=>{switch(this.type){case"success":return o(ee,null);case"info":return o(Z,null);case"warning":return o(Y,null);case"error":return o(X,null);default:return null}}})])),o("div",{class:[`${e}-alert-body`,this.mergedBordered&&`${e}-alert-body--bordered`]},G(l.header,u=>{const h=u||this.title;return h?o("div",{class:`${e}-alert-body__title`},h):null}),l.default&&o("div",{class:`${e}-alert-body__content`},l))):null}})}});export{ie as N}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/Divider-a11d112a.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/Divider-a11d112a.js deleted file mode 100644 index 4e4d6e954..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/Divider-a11d112a.js +++ /dev/null @@ -1,42 +0,0 @@ -import{m as p,aj as c,p as n,K as t,f,q as u,z as v,cO as b,y as x,B as C,g as d,ao as $}from"./index-7e19b821.js";const w=p("divider",` - position: relative; - display: flex; - width: 100%; - box-sizing: border-box; - font-size: 16px; - color: var(--n-text-color); - transition: - color .3s var(--n-bezier), - background-color .3s var(--n-bezier); -`,[c("vertical",` - margin-top: 24px; - margin-bottom: 24px; - `,[c("no-title",` - display: flex; - align-items: center; - `)]),n("title",` - display: flex; - align-items: center; - margin-left: 12px; - margin-right: 12px; - white-space: nowrap; - font-weight: var(--n-font-weight); - `),t("title-position-left",[n("line",[t("left",{width:"28px"})])]),t("title-position-right",[n("line",[t("right",{width:"28px"})])]),t("dashed",[n("line",` - background-color: #0000; - height: 0px; - width: 100%; - border-style: dashed; - border-width: 1px 0 0; - `)]),t("vertical",` - display: inline-block; - height: 1em; - margin: 0 8px; - vertical-align: middle; - width: 1px; - `),n("line",` - border: none; - transition: background-color .3s var(--n-bezier), border-color .3s var(--n-bezier); - height: 1px; - width: 100%; - margin: 0; - `),c("dashed",[n("line",{backgroundColor:"var(--n-color)"})]),t("dashed",[n("line",{borderColor:"var(--n-color)"})]),t("vertical",{backgroundColor:"var(--n-color)"})]),_=Object.assign(Object.assign({},v.props),{titlePlacement:{type:String,default:"center"},dashed:Boolean,vertical:Boolean}),z=f({name:"Divider",props:_,setup(r){const{mergedClsPrefixRef:o,inlineThemeDisabled:l}=u(r),s=v("Divider","-divider",w,b,r,o),a=x(()=>{const{common:{cubicBezierEaseInOut:e},self:{color:h,textColor:g,fontWeight:m}}=s.value;return{"--n-bezier":e,"--n-color":h,"--n-text-color":g,"--n-font-weight":m}}),i=l?C("divider",void 0,a,r):void 0;return{mergedClsPrefix:o,cssVars:l?void 0:a,themeClass:i==null?void 0:i.themeClass,onRender:i==null?void 0:i.onRender}},render(){var r;const{$slots:o,titlePlacement:l,vertical:s,dashed:a,cssVars:i,mergedClsPrefix:e}=this;return(r=this.onRender)===null||r===void 0||r.call(this),d("div",{role:"separator",class:[`${e}-divider`,this.themeClass,{[`${e}-divider--vertical`]:s,[`${e}-divider--no-title`]:!o.default,[`${e}-divider--dashed`]:a,[`${e}-divider--title-position-${l}`]:o.default&&l}],style:i},s?null:d("div",{class:`${e}-divider__line ${e}-divider__line--left`}),!s&&o.default?d($,null,d("div",{class:`${e}-divider__title`},this.$slots),d("div",{class:`${e}-divider__line ${e}-divider__line--right`})):null)}});export{z as N}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/GradientText-44d798c5.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/GradientText-44d798c5.js deleted file mode 100644 index 565a8e33b..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/GradientText-44d798c5.js +++ /dev/null @@ -1,12 +0,0 @@ -import{m as p,f as x,q as v,y as o,z as f,A as g,B as z,g as S,cH as T}from"./index-7e19b821.js";import{u as C}from"./index-2b595d91.js";import{f as R}from"./index-c238f14b.js";const $=p("gradient-text",` - display: inline-block; - font-weight: var(--n-font-weight); - -webkit-background-clip: text; - background-clip: text; - color: #0000; - white-space: nowrap; - background-image: linear-gradient(var(--n-rotate), var(--n-color-start) 0%, var(--n-color-end) 100%); - transition: - --n-color-start .3s var(--n-bezier), - --n-color-end .3s var(--n-bezier); -`),k=Object.assign(Object.assign({},f.props),{size:[String,Number],fontSize:[String,Number],type:{type:String,default:"primary"},color:[Object,String],gradient:[Object,String]}),O=x({name:"GradientText",props:k,setup(t){C();const{mergedClsPrefixRef:n,inlineThemeDisabled:l}=v(t),i=o(()=>{const{type:e}=t;return e==="danger"?"error":e}),m=o(()=>{let e=t.size||t.fontSize;return e&&(e=R(e)),e||void 0}),u=o(()=>{const e=t.color||t.gradient;if(typeof e=="string")return e;if(e){const s=e.deg||0,a=e.from,c=e.to;return`linear-gradient(${s}deg, ${a} 0%, ${c} 100%)`}}),h=f("GradientText","-gradient-text",$,T,t,n),d=o(()=>{const{value:e}=i,{common:{cubicBezierEaseInOut:s},self:{rotate:a,[g("colorStart",e)]:c,[g("colorEnd",e)]:y,fontWeight:b}}=h.value;return{"--n-bezier":s,"--n-rotate":a,"--n-color-start":c,"--n-color-end":y,"--n-font-weight":b}}),r=l?z("gradient-text",o(()=>i.value[0]),d,t):void 0;return{mergedClsPrefix:n,compatibleType:i,styleFontSize:m,styleBgImage:u,cssVars:l?void 0:d,themeClass:r==null?void 0:r.themeClass,onRender:r==null?void 0:r.onRender}},render(){const{mergedClsPrefix:t,onRender:n}=this;return n==null||n(),S("span",{class:[`${t}-gradient-text`,`${t}-gradient-text--${this.compatibleType}-type`,this.themeClass],style:[{fontSize:this.styleFontSize,backgroundImage:this.styleBgImage},this.cssVars]},this.$slots)}});export{O as N}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-0cdd387c.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-0cdd387c.woff2 deleted file mode 100644 index 0acaaff03..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-0cdd387c.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-30da91e8.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-30da91e8.woff deleted file mode 100644 index b804d7b33..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-30da91e8.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-68534840.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-68534840.ttf deleted file mode 100644 index c6f9a5e7c..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_AMS-Regular-68534840.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-07d8e303.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-07d8e303.ttf deleted file mode 100644 index 9ff4a5e04..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-07d8e303.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-1ae6bd74.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-1ae6bd74.woff deleted file mode 100644 index 9759710d1..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-1ae6bd74.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-de7701e4.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-de7701e4.woff2 deleted file mode 100644 index f390922ec..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Bold-de7701e4.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-3398dd02.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-3398dd02.woff deleted file mode 100644 index 9bdd534fd..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-3398dd02.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-5d53e70a.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-5d53e70a.woff2 deleted file mode 100644 index 75344a1f9..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-5d53e70a.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-ed0b7437.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-ed0b7437.ttf deleted file mode 100644 index f522294ff..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Caligraphic-Regular-ed0b7437.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-74444efd.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-74444efd.woff2 deleted file mode 100644 index 395f28bea..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-74444efd.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-9163df9c.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-9163df9c.ttf deleted file mode 100644 index 4e98259c3..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-9163df9c.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-9be7ceb8.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-9be7ceb8.woff deleted file mode 100644 index e7730f662..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Bold-9be7ceb8.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-1e6f9579.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-1e6f9579.ttf deleted file mode 100644 index b8461b275..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-1e6f9579.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-51814d27.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-51814d27.woff2 deleted file mode 100644 index 735f6948d..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-51814d27.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-5e28753b.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-5e28753b.woff deleted file mode 100644 index acab069f9..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Fraktur-Regular-5e28753b.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-0f60d1b8.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-0f60d1b8.woff2 deleted file mode 100644 index ab2ad21da..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-0f60d1b8.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-138ac28d.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-138ac28d.ttf deleted file mode 100644 index 4060e627d..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-138ac28d.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-c76c5d69.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-c76c5d69.woff deleted file mode 100644 index f38136ac1..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Bold-c76c5d69.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-70ee1f64.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-70ee1f64.ttf deleted file mode 100644 index dc007977e..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-70ee1f64.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-99cd42a3.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-99cd42a3.woff2 deleted file mode 100644 index 5931794de..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-99cd42a3.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-a6f7ec0d.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-a6f7ec0d.woff deleted file mode 100644 index 67807b0bd..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-BoldItalic-a6f7ec0d.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-0d85ae7c.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-0d85ae7c.ttf deleted file mode 100644 index 0e9b0f354..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-0d85ae7c.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-97479ca6.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-97479ca6.woff2 deleted file mode 100644 index b50920e13..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-97479ca6.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-f1d6ef86.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-f1d6ef86.woff deleted file mode 100644 index 6f43b594b..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Italic-f1d6ef86.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-c2342cd8.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-c2342cd8.woff2 deleted file mode 100644 index eb24a7ba2..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-c2342cd8.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-c6368d87.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-c6368d87.woff deleted file mode 100644 index 21f581296..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-c6368d87.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-d0332f52.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-d0332f52.ttf deleted file mode 100644 index dd45e1ed2..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Main-Regular-d0332f52.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-850c0af5.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-850c0af5.woff deleted file mode 100644 index 0ae390d74..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-850c0af5.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-dc47344d.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-dc47344d.woff2 deleted file mode 100644 index 29657023a..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-dc47344d.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-f9377ab0.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-f9377ab0.ttf deleted file mode 100644 index 728ce7a1e..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-BoldItalic-f9377ab0.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-08ce98e5.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-08ce98e5.ttf deleted file mode 100644 index 70d559b4e..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-08ce98e5.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-7af58c5e.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-7af58c5e.woff2 deleted file mode 100644 index 215c143fd..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-7af58c5e.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-8a8d2445.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-8a8d2445.woff deleted file mode 100644 index eb5159d4c..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Math-Italic-8a8d2445.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-1ece03f7.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-1ece03f7.ttf deleted file mode 100644 index 2f65a8a3a..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-1ece03f7.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-e99ae511.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-e99ae511.woff2 deleted file mode 100644 index cfaa3bda5..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-e99ae511.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-ece03cfd.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-ece03cfd.woff deleted file mode 100644 index 8d47c02d9..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Bold-ece03cfd.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-00b26ac8.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-00b26ac8.woff2 deleted file mode 100644 index 349c06dc6..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-00b26ac8.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-3931dd81.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-3931dd81.ttf deleted file mode 100644 index d5850df98..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-3931dd81.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-91ee6750.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-91ee6750.woff deleted file mode 100644 index 7e02df963..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Italic-91ee6750.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-11e4dc8a.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-11e4dc8a.woff deleted file mode 100644 index 31b84829b..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-11e4dc8a.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-68e8c73e.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-68e8c73e.woff2 deleted file mode 100644 index a90eea85f..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-68e8c73e.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-f36ea897.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-f36ea897.ttf deleted file mode 100644 index 537279f6b..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_SansSerif-Regular-f36ea897.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-036d4e95.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-036d4e95.woff2 deleted file mode 100644 index b3048fc11..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-036d4e95.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-1c67f068.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-1c67f068.ttf deleted file mode 100644 index fd679bf37..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-1c67f068.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-d96cdf2b.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-d96cdf2b.woff deleted file mode 100644 index 0e7da821e..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Script-Regular-d96cdf2b.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-6b47c401.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-6b47c401.woff2 deleted file mode 100644 index c5a8462fb..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-6b47c401.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-95b6d2f1.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-95b6d2f1.ttf deleted file mode 100644 index 871fd7d19..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-95b6d2f1.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-c943cc98.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-c943cc98.woff deleted file mode 100644 index 7f292d911..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size1-Regular-c943cc98.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-2014c523.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-2014c523.woff deleted file mode 100644 index d241d9be2..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-2014c523.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-a6b2099f.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-a6b2099f.ttf deleted file mode 100644 index 7a212caf9..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-a6b2099f.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-d04c5421.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-d04c5421.woff2 deleted file mode 100644 index e1bccfe24..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size2-Regular-d04c5421.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size3-Regular-500e04d5.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size3-Regular-500e04d5.ttf deleted file mode 100644 index 00bff3495..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size3-Regular-500e04d5.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size3-Regular-6ab6b62e.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size3-Regular-6ab6b62e.woff deleted file mode 100644 index e6e9b658d..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size3-Regular-6ab6b62e.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-99f9c675.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-99f9c675.woff deleted file mode 100644 index e1ec54576..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-99f9c675.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-a4af7d41.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-a4af7d41.woff2 deleted file mode 100644 index 680c13085..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-a4af7d41.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-c647367d.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-c647367d.ttf deleted file mode 100644 index 74f08921f..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Size4-Regular-c647367d.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-71d517d6.woff2 b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-71d517d6.woff2 deleted file mode 100644 index 771f1af70..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-71d517d6.woff2 and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-e14fed02.woff b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-e14fed02.woff deleted file mode 100644 index 2432419f2..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-e14fed02.woff and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-f01f3e87.ttf b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-f01f3e87.ttf deleted file mode 100644 index c83252c57..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/KaTeX_Typewriter-Regular-f01f3e87.ttf and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/_plugin-vue_export-helper-c27b6911.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/_plugin-vue_export-helper-c27b6911.js deleted file mode 100644 index 718edd339..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/_plugin-vue_export-helper-c27b6911.js +++ /dev/null @@ -1 +0,0 @@ -const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/about-2688cabc.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/about-2688cabc.js deleted file mode 100644 index 86b499510..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/about-2688cabc.js +++ /dev/null @@ -1 +0,0 @@ -import{be as t}from"./index-7e19b821.js";function r(){return t({url:"/about"})}export{r as g}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/baidu-604a969a.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/baidu-604a969a.svg deleted file mode 100644 index fcc30a0a3..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/baidu-604a969a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/bing-4e21c40a.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/bing-4e21c40a.svg deleted file mode 100644 index 9af1c359f..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/bing-4e21c40a.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/defaultBackground-80f713c8.webp b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/defaultBackground-80f713c8.webp deleted file mode 100644 index 23bec1a61..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/defaultBackground-80f713c8.webp and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/gitee-9d895e3a.png b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/gitee-9d895e3a.png deleted file mode 100644 index fe2659a70..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/gitee-9d895e3a.png and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/google-c8534e94.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/google-c8534e94.svg deleted file mode 100644 index b22ca1828..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/google-c8534e94.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-2b251fda.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-2b251fda.css deleted file mode 100644 index 59adb7200..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-2b251fda.css +++ /dev/null @@ -1 +0,0 @@ -.card[data-v-157c4864]{display:flex;justify-content:center;align-items:center;height:100px}.transparent-grid[data-v-157c4864]{background-image:linear-gradient(45deg,#e6e4e4 25%,transparent 25%,transparent 75%,#e6e4e4 75%),linear-gradient(45deg,#e6e4e4 25%,transparent 25%,transparent 75%,#e6e4e4 75%);background-size:16px 16px;background-position:0 0,8px 8px} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-2b595d91.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-2b595d91.js deleted file mode 100644 index 502098d40..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-2b595d91.js +++ /dev/null @@ -1,772 +0,0 @@ -import{H as De,bg as Vn,w as Te,b as cn,au as jr,f as be,u as Dn,D as Xe,bD as qr,bE as Wr,y as I,r as B,ae as st,aw as Xt,aH as Ft,g as f,P as Kr,V as Jt,R as xt,aY as Hr,bF as gn,l as Ur,m as $,p as z,n as te,q as ut,z as Ce,bG as Gr,bH as Yr,A as ie,B as Je,S as ct,an as lt,T as un,K as G,aj as Oe,J as jn,L as ge,bI as Zr,aN as _t,a6 as Ze,G as Ve,bJ as qn,aB as Wn,F as dt,af as Kn,C as pn,aL as Xr,t as Et,bK as Jr,ab as de,ad as Qr,s as Hn,ah as eo,bL as to,E as Qt,bM as no,ao as Un,bN as ro,bO as oo,a5 as Gn,bP as io,e as bn,c as mn,N as ao,a8 as lo,aP as so,a9 as yn,bQ as co,a7 as uo,bR as fo,bS as Yn,bT as wn,bU as ho,ag as xn,bV as vo,a4 as Cn}from"./index-7e19b821.js";import{c as Zn,a as Tt,i as go,b as fn,j as hn,k as po,N as bo,u as en,h as mo,d as tn,V as yo,e as wo,g as xo,f as jt,l as Xn}from"./index-c238f14b.js";function Mt(e,t){let{target:n}=e;for(;n;){if(n.dataset&&n.dataset[t]!==void 0)return!0;n=n.parentElement}return!1}function Co(e){switch(typeof e){case"string":return e||void 0;case"number":return String(e);default:return}}function qt(e){const t=e.filter(n=>n!==void 0);if(t.length!==0)return t.length===1?t[0]:n=>{e.forEach(r=>{r&&r(n)})}}function ko(e,t,n){var r;const o=De(e,null);if(o===null)return;const l=(r=Vn())===null||r===void 0?void 0:r.proxy;Te(n,i),i(n.value),cn(()=>{i(void 0,n.value)});function i(u,s){if(!o)return;const h=o[t];s!==void 0&&a(h,s),u!==void 0&&c(h,u)}function a(u,s){u[s]||(u[s]=[]),u[s].splice(u[s].findIndex(h=>h===l),1)}function c(u,s){u[s]||(u[s]=[]),~u[s].findIndex(h=>h===l)||u[s].push(l)}}let kn=!1;function ya(){if(jr&&window.CSS&&!kn&&(kn=!0,"registerProperty"in(window==null?void 0:window.CSS)))try{CSS.registerProperty({name:"--n-color-start",syntax:"",inherits:!1,initialValue:"#0000"}),CSS.registerProperty({name:"--n-color-end",syntax:"",inherits:!1,initialValue:"#0000"})}catch{}}function Sn(e){return e&-e}class So{constructor(t,n){this.l=t,this.min=n;const r=new Array(t+1);for(let o=0;oo)throw new Error("[FinweckTree.sum]: `i` is larger than length.");let l=t*r;for(;t>0;)l+=n[t],t-=Sn(t);return l}getBound(t){let n=0,r=this.l;for(;r>n;){const o=Math.floor((n+r)/2),l=this.sum(o);if(l>t){r=o;continue}else if(l[]},itemSize:{type:Number,required:!0},itemResizable:Boolean,itemsStyle:[String,Object],visibleItemsTag:{type:[String,Object],default:"div"},visibleItemsProps:Object,ignoreItemResize:Boolean,onScroll:Function,onWheel:Function,onResize:Function,defaultScrollKey:[Number,String],defaultScrollIndex:Number,keyField:{type:String,default:"key"},paddingTop:{type:[Number,String],default:0},paddingBottom:{type:[Number,String],default:0}},setup(e){const t=Dn();Fo.mount({id:"vueuc/virtual-list",head:!0,anchorMetaName:Zn,ssr:t}),Xe(()=>{const{defaultScrollIndex:S,defaultScrollKey:P}=e;S!=null?g({index:S}):P!=null&&g({key:P})});let n=!1,r=!1;qr(()=>{if(n=!1,!r){r=!0;return}g({top:h.value,left:s})}),Wr(()=>{n=!0,r||(r=!0)});const o=I(()=>{const S=new Map,{keyField:P}=e;return e.items.forEach((_,Y)=>{S.set(_[P],Y)}),S}),l=B(null),i=B(void 0),a=new Map,c=I(()=>{const{items:S,itemSize:P,keyField:_}=e,Y=new So(S.length,P);return S.forEach((W,K)=>{const H=W[_],X=a.get(H);X!==void 0&&Y.add(K,X)}),Y}),u=B(0);let s=0;const h=B(0),w=st(()=>Math.max(c.value.getBound(h.value-Xt(e.paddingTop))-1,0)),p=I(()=>{const{value:S}=i;if(S===void 0)return[];const{items:P,itemSize:_}=e,Y=w.value,W=Math.min(Y+Math.ceil(S/_+1),P.length-1),K=[];for(let H=Y;H<=W;++H)K.push(P[H]);return K}),g=(S,P)=>{if(typeof S=="number"){M(S,P,"auto");return}const{left:_,top:Y,index:W,key:K,position:H,behavior:X,debounce:C=!0}=S;if(_!==void 0||Y!==void 0)M(_,Y,X);else if(W!==void 0)b(W,X,C);else if(K!==void 0){const O=o.value.get(K);O!==void 0&&b(O,X,C)}else H==="bottom"?M(0,Number.MAX_SAFE_INTEGER,X):H==="top"&&M(0,0,X)};let y,A=null;function b(S,P,_){const{value:Y}=c,W=Y.sum(S)+Xt(e.paddingTop);if(!_)l.value.scrollTo({left:0,top:W,behavior:P});else{y=S,A!==null&&window.clearTimeout(A),A=window.setTimeout(()=>{y=void 0,A=null},16);const{scrollTop:K,offsetHeight:H}=l.value;if(W>K){const X=Y.get(S);W+X<=K+H||l.value.scrollTo({left:0,top:W+X-H,behavior:P})}else l.value.scrollTo({left:0,top:W,behavior:P})}}function M(S,P,_){l.value.scrollTo({left:S,top:P,behavior:_})}function F(S,P){var _,Y,W;if(n||e.ignoreItemResize||j(P.target))return;const{value:K}=c,H=o.value.get(S),X=K.get(H),C=(W=(Y=(_=P.borderBoxSize)===null||_===void 0?void 0:_[0])===null||Y===void 0?void 0:Y.blockSize)!==null&&W!==void 0?W:P.contentRect.height;if(C===X)return;C-e.itemSize===0?a.delete(S):a.set(S,C-e.itemSize);const Z=C-X;if(Z===0)return;K.add(H,Z);const ae=l.value;if(ae!=null){if(y===void 0){const me=K.sum(H);ae.scrollTop>me&&ae.scrollBy(0,Z)}else if(Hae.scrollTop+ae.offsetHeight&&ae.scrollBy(0,Z)}q()}u.value++}const x=!Ro();let k=!1;function L(S){var P;(P=e.onScroll)===null||P===void 0||P.call(e,S),(!x||!k)&&q()}function N(S){var P;if((P=e.onWheel)===null||P===void 0||P.call(e,S),x){const _=l.value;if(_!=null){if(S.deltaX===0&&(_.scrollTop===0&&S.deltaY<=0||_.scrollTop+_.offsetHeight>=_.scrollHeight&&S.deltaY>=0))return;S.preventDefault(),_.scrollTop+=S.deltaY/Rn(),_.scrollLeft+=S.deltaX/Rn(),q(),k=!0,go(()=>{k=!1})}}}function D(S){if(n||j(S.target)||S.contentRect.height===i.value)return;i.value=S.contentRect.height;const{onResize:P}=e;P!==void 0&&P(S)}function q(){const{value:S}=l;S!=null&&(h.value=S.scrollTop,s=S.scrollLeft)}function j(S){let P=S;for(;P!==null;){if(P.style.display==="none")return!0;P=P.parentElement}return!1}return{listHeight:i,listStyle:{overflow:"auto"},keyToIndex:o,itemsStyle:I(()=>{const{itemResizable:S}=e,P=Ft(c.value.sum());return u.value,[e.itemsStyle,{boxSizing:"content-box",height:S?"":P,minHeight:S?P:"",paddingTop:Ft(e.paddingTop),paddingBottom:Ft(e.paddingBottom)}]}),visibleItemsStyle:I(()=>(u.value,{transform:`translateY(${Ft(c.value.sum(w.value))})`})),viewportItems:p,listElRef:l,itemsElRef:B(null),scrollTo:g,handleListResize:D,handleListScroll:L,handleListWheel:N,handleItemResize:F}},render(){const{itemResizable:e,keyField:t,keyToIndex:n,visibleItemsTag:r}=this;return f(Jt,{onResize:this.handleListResize},{default:()=>{var o,l;return f("div",Kr(this.$attrs,{class:["v-vl",this.showScrollbar&&"v-vl--show-scrollbar"],onScroll:this.handleListScroll,onWheel:this.handleListWheel,ref:"listElRef"}),[this.items.length!==0?f("div",{ref:"itemsElRef",class:"v-vl-items",style:this.itemsStyle},[f(r,Object.assign({class:"v-vl-visible-items",style:this.visibleItemsStyle},this.visibleItemsProps),{default:()=>this.viewportItems.map(i=>{const a=i[t],c=n.get(a),u=this.$slots.default({item:i,index:c})[0];return e?f(Jt,{key:a,onResize:s=>this.handleItemResize(a,s)},{default:()=>u}):(u.key=a,u)})})]):(l=(o=this.$slots).empty)===null||l===void 0?void 0:l.call(o)])}})}}),Ne="v-hidden",zo=Tt("[v-hidden]",{display:"none!important"}),Fn=be({name:"Overflow",props:{getCounter:Function,getTail:Function,updateCounter:Function,onUpdateCount:Function,onUpdateOverflow:Function},setup(e,{slots:t}){const n=B(null),r=B(null);function o(i){const{value:a}=n,{getCounter:c,getTail:u}=e;let s;if(c!==void 0?s=c():s=r.value,!a||!s)return;s.hasAttribute(Ne)&&s.removeAttribute(Ne);const{children:h}=a;if(i.showAllItemsBeforeCalculate)for(const F of h)F.hasAttribute(Ne)&&F.removeAttribute(Ne);const w=a.offsetWidth,p=[],g=t.tail?u==null?void 0:u():null;let y=g?g.offsetWidth:0,A=!1;const b=a.children.length-(t.tail?1:0);for(let F=0;Fw){const{updateCounter:L}=e;for(let N=F;N>=0;--N){const D=b-1-N;L!==void 0?L(D):s.textContent=`${D}`;const q=s.offsetWidth;if(y-=p[N],y+q<=w||N===0){A=!0,F=N-1,g&&(F===-1?(g.style.maxWidth=`${w-q}px`,g.style.boxSizing="border-box"):g.style.maxWidth="");const{onUpdateCount:j}=e;j&&j(D);break}}}}const{onUpdateOverflow:M}=e;A?M!==void 0&&M(!0):(M!==void 0&&M(!1),s.setAttribute(Ne,""))}const l=Dn();return zo.mount({id:"vueuc/overflow",head:!0,anchorMetaName:Zn,ssr:l}),Xe(()=>o({showAllItemsBeforeCalculate:!1})),{selfRef:n,counterRef:r,sync:o}},render(){const{$slots:e}=this;return xt(()=>this.sync({showAllItemsBeforeCalculate:!1})),f("div",{class:"v-overflow",ref:"selfRef"},[Hr(e,"default"),e.counter?e.counter():f("span",{style:{display:"inline-block"},ref:"counterRef"}),e.tail?e.tail():null])}});function Jn(e,t){t&&(Xe(()=>{const{value:n}=e;n&&gn.registerHandler(n,t)}),cn(()=>{const{value:n}=e;n&&gn.unregisterHandler(n)}))}const Oo=be({name:"Checkmark",render(){return f("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},f("g",{fill:"none"},f("path",{d:"M14.046 3.486a.75.75 0 0 1-.032 1.06l-7.93 7.474a.85.85 0 0 1-1.188-.022l-2.68-2.72a.75.75 0 1 1 1.068-1.053l2.234 2.267l7.468-7.038a.75.75 0 0 1 1.06.032z",fill:"currentColor"})))}}),_o=be({name:"Eye",render(){return f("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},f("path",{d:"M255.66 112c-77.94 0-157.89 45.11-220.83 135.33a16 16 0 0 0-.27 17.77C82.92 340.8 161.8 400 255.66 400c92.84 0 173.34-59.38 221.79-135.25a16.14 16.14 0 0 0 0-17.47C428.89 172.28 347.8 112 255.66 112z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"}),f("circle",{cx:"256",cy:"256",r:"80",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"}))}}),To=be({name:"EyeOff",render(){return f("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},f("path",{d:"M432 448a15.92 15.92 0 0 1-11.31-4.69l-352-352a16 16 0 0 1 22.62-22.62l352 352A16 16 0 0 1 432 448z",fill:"currentColor"}),f("path",{d:"M255.66 384c-41.49 0-81.5-12.28-118.92-36.5c-34.07-22-64.74-53.51-88.7-91v-.08c19.94-28.57 41.78-52.73 65.24-72.21a2 2 0 0 0 .14-2.94L93.5 161.38a2 2 0 0 0-2.71-.12c-24.92 21-48.05 46.76-69.08 76.92a31.92 31.92 0 0 0-.64 35.54c26.41 41.33 60.4 76.14 98.28 100.65C162 402 207.9 416 255.66 416a239.13 239.13 0 0 0 75.8-12.58a2 2 0 0 0 .77-3.31l-21.58-21.58a4 4 0 0 0-3.83-1a204.8 204.8 0 0 1-51.16 6.47z",fill:"currentColor"}),f("path",{d:"M490.84 238.6c-26.46-40.92-60.79-75.68-99.27-100.53C349 110.55 302 96 255.66 96a227.34 227.34 0 0 0-74.89 12.83a2 2 0 0 0-.75 3.31l21.55 21.55a4 4 0 0 0 3.88 1a192.82 192.82 0 0 1 50.21-6.69c40.69 0 80.58 12.43 118.55 37c34.71 22.4 65.74 53.88 89.76 91a.13.13 0 0 1 0 .16a310.72 310.72 0 0 1-64.12 72.73a2 2 0 0 0-.15 2.95l19.9 19.89a2 2 0 0 0 2.7.13a343.49 343.49 0 0 0 68.64-78.48a32.2 32.2 0 0 0-.1-34.78z",fill:"currentColor"}),f("path",{d:"M256 160a95.88 95.88 0 0 0-21.37 2.4a2 2 0 0 0-1 3.38l112.59 112.56a2 2 0 0 0 3.38-1A96 96 0 0 0 256 160z",fill:"currentColor"}),f("path",{d:"M165.78 233.66a2 2 0 0 0-3.38 1a96 96 0 0 0 115 115a2 2 0 0 0 1-3.38z",fill:"currentColor"}))}}),Ao=be({name:"Empty",render(){return f("svg",{viewBox:"0 0 28 28",fill:"none",xmlns:"http://www.w3.org/2000/svg"},f("path",{d:"M26 7.5C26 11.0899 23.0899 14 19.5 14C15.9101 14 13 11.0899 13 7.5C13 3.91015 15.9101 1 19.5 1C23.0899 1 26 3.91015 26 7.5ZM16.8536 4.14645C16.6583 3.95118 16.3417 3.95118 16.1464 4.14645C15.9512 4.34171 15.9512 4.65829 16.1464 4.85355L18.7929 7.5L16.1464 10.1464C15.9512 10.3417 15.9512 10.6583 16.1464 10.8536C16.3417 11.0488 16.6583 11.0488 16.8536 10.8536L19.5 8.20711L22.1464 10.8536C22.3417 11.0488 22.6583 11.0488 22.8536 10.8536C23.0488 10.6583 23.0488 10.3417 22.8536 10.1464L20.2071 7.5L22.8536 4.85355C23.0488 4.65829 23.0488 4.34171 22.8536 4.14645C22.6583 3.95118 22.3417 3.95118 22.1464 4.14645L19.5 6.79289L16.8536 4.14645Z",fill:"currentColor"}),f("path",{d:"M25 22.75V12.5991C24.5572 13.0765 24.053 13.4961 23.5 13.8454V16H17.5L17.3982 16.0068C17.0322 16.0565 16.75 16.3703 16.75 16.75C16.75 18.2688 15.5188 19.5 14 19.5C12.4812 19.5 11.25 18.2688 11.25 16.75L11.2432 16.6482C11.1935 16.2822 10.8797 16 10.5 16H4.5V7.25C4.5 6.2835 5.2835 5.5 6.25 5.5H12.2696C12.4146 4.97463 12.6153 4.47237 12.865 4H6.25C4.45507 4 3 5.45507 3 7.25V22.75C3 24.5449 4.45507 26 6.25 26H21.75C23.5449 26 25 24.5449 25 22.75ZM4.5 22.75V17.5H9.81597L9.85751 17.7041C10.2905 19.5919 11.9808 21 14 21L14.215 20.9947C16.2095 20.8953 17.842 19.4209 18.184 17.5H23.5V22.75C23.5 23.7165 22.7165 24.5 21.75 24.5H6.25C5.2835 24.5 4.5 23.7165 4.5 22.75Z",fill:"currentColor"}))}}),Mo=be({name:"ChevronDown",render(){return f("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},f("path",{d:"M3.14645 5.64645C3.34171 5.45118 3.65829 5.45118 3.85355 5.64645L8 9.79289L12.1464 5.64645C12.3417 5.45118 12.6583 5.45118 12.8536 5.64645C13.0488 5.84171 13.0488 6.15829 12.8536 6.35355L8.35355 10.8536C8.15829 11.0488 7.84171 11.0488 7.64645 10.8536L3.14645 6.35355C2.95118 6.15829 2.95118 5.84171 3.14645 5.64645Z",fill:"currentColor"}))}}),$o=Ur("clear",f("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},f("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},f("g",{fill:"currentColor","fill-rule":"nonzero"},f("path",{d:"M8,2 C11.3137085,2 14,4.6862915 14,8 C14,11.3137085 11.3137085,14 8,14 C4.6862915,14 2,11.3137085 2,8 C2,4.6862915 4.6862915,2 8,2 Z M6.5343055,5.83859116 C6.33943736,5.70359511 6.07001296,5.72288026 5.89644661,5.89644661 L5.89644661,5.89644661 L5.83859116,5.9656945 C5.70359511,6.16056264 5.72288026,6.42998704 5.89644661,6.60355339 L5.89644661,6.60355339 L7.293,8 L5.89644661,9.39644661 L5.83859116,9.4656945 C5.70359511,9.66056264 5.72288026,9.92998704 5.89644661,10.1035534 L5.89644661,10.1035534 L5.9656945,10.1614088 C6.16056264,10.2964049 6.42998704,10.2771197 6.60355339,10.1035534 L6.60355339,10.1035534 L8,8.707 L9.39644661,10.1035534 L9.4656945,10.1614088 C9.66056264,10.2964049 9.92998704,10.2771197 10.1035534,10.1035534 L10.1035534,10.1035534 L10.1614088,10.0343055 C10.2964049,9.83943736 10.2771197,9.57001296 10.1035534,9.39644661 L10.1035534,9.39644661 L8.707,8 L10.1035534,6.60355339 L10.1614088,6.5343055 C10.2964049,6.33943736 10.2771197,6.07001296 10.1035534,5.89644661 L10.1035534,5.89644661 L10.0343055,5.83859116 C9.83943736,5.70359511 9.57001296,5.72288026 9.39644661,5.89644661 L9.39644661,5.89644661 L8,7.293 L6.60355339,5.89644661 Z"}))))),Io=be({props:{onFocus:Function,onBlur:Function},setup(e){return()=>f("div",{style:"width: 0; height: 0",tabindex:0,onFocus:e.onFocus,onBlur:e.onBlur})}});function Pn(e){return Array.isArray(e)?e:[e]}const nn={STOP:"STOP"};function Qn(e,t){const n=t(e);e.children!==void 0&&n!==nn.STOP&&e.children.forEach(r=>Qn(r,t))}function Eo(e,t={}){const{preserveGroup:n=!1}=t,r=[],o=n?i=>{i.isLeaf||(r.push(i.key),l(i.children))}:i=>{i.isLeaf||(i.isGroup||r.push(i.key),l(i.children))};function l(i){i.forEach(o)}return l(e),r}function Bo(e,t){const{isLeaf:n}=e;return n!==void 0?n:!t(e)}function Lo(e){return e.children}function No(e){return e.key}function Vo(){return!1}function Do(e,t){const{isLeaf:n}=e;return!(n===!1&&!Array.isArray(t(e)))}function jo(e){return e.disabled===!0}function qo(e,t){return e.isLeaf===!1&&!Array.isArray(t(e))}function Kt(e){var t;return e==null?[]:Array.isArray(e)?e:(t=e.checkedKeys)!==null&&t!==void 0?t:[]}function Ht(e){var t;return e==null||Array.isArray(e)?[]:(t=e.indeterminateKeys)!==null&&t!==void 0?t:[]}function Wo(e,t){const n=new Set(e);return t.forEach(r=>{n.has(r)||n.add(r)}),Array.from(n)}function Ko(e,t){const n=new Set(e);return t.forEach(r=>{n.has(r)&&n.delete(r)}),Array.from(n)}function Ho(e){return(e==null?void 0:e.type)==="group"}function Uo(e){const t=new Map;return e.forEach((n,r)=>{t.set(n.key,r)}),n=>{var r;return(r=t.get(n))!==null&&r!==void 0?r:null}}class Go extends Error{constructor(){super(),this.message="SubtreeNotLoadedError: checking a subtree whose required nodes are not fully loaded."}}function Yo(e,t,n,r){return $t(t.concat(e),n,r,!1)}function Zo(e,t){const n=new Set;return e.forEach(r=>{const o=t.treeNodeMap.get(r);if(o!==void 0){let l=o.parent;for(;l!==null&&!(l.disabled||n.has(l.key));)n.add(l.key),l=l.parent}}),n}function Xo(e,t,n,r){const o=$t(t,n,r,!1),l=$t(e,n,r,!0),i=Zo(e,n),a=[];return o.forEach(c=>{(l.has(c)||i.has(c))&&a.push(c)}),a.forEach(c=>o.delete(c)),o}function Ut(e,t){const{checkedKeys:n,keysToCheck:r,keysToUncheck:o,indeterminateKeys:l,cascade:i,leafOnly:a,checkStrategy:c,allowNotLoaded:u}=e;if(!i)return r!==void 0?{checkedKeys:Wo(n,r),indeterminateKeys:Array.from(l)}:o!==void 0?{checkedKeys:Ko(n,o),indeterminateKeys:Array.from(l)}:{checkedKeys:Array.from(n),indeterminateKeys:Array.from(l)};const{levelTreeNodeMap:s}=t;let h;o!==void 0?h=Xo(o,n,t,u):r!==void 0?h=Yo(r,n,t,u):h=$t(n,t,u,!1);const w=c==="parent",p=c==="child"||a,g=h,y=new Set,A=Math.max.apply(null,Array.from(s.keys()));for(let b=A;b>=0;b-=1){const M=b===0,F=s.get(b);for(const x of F){if(x.isLeaf)continue;const{key:k,shallowLoaded:L}=x;if(p&&L&&x.children.forEach(j=>{!j.disabled&&!j.isLeaf&&j.shallowLoaded&&g.has(j.key)&&g.delete(j.key)}),x.disabled||!L)continue;let N=!0,D=!1,q=!0;for(const j of x.children){const S=j.key;if(!j.disabled){if(q&&(q=!1),g.has(S))D=!0;else if(y.has(S)){D=!0,N=!1;break}else if(N=!1,D)break}}N&&!q?(w&&x.children.forEach(j=>{!j.disabled&&g.has(j.key)&&g.delete(j.key)}),g.add(k)):D&&y.add(k),M&&p&&g.has(k)&&g.delete(k)}}return{checkedKeys:Array.from(g),indeterminateKeys:Array.from(y)}}function $t(e,t,n,r){const{treeNodeMap:o,getChildren:l}=t,i=new Set,a=new Set(e);return e.forEach(c=>{const u=o.get(c);u!==void 0&&Qn(u,s=>{if(s.disabled)return nn.STOP;const{key:h}=s;if(!i.has(h)&&(i.add(h),a.add(h),qo(s.rawNode,l))){if(r)return nn.STOP;if(!n)throw new Go}})}),a}function Jo(e,{includeGroup:t=!1,includeSelf:n=!0},r){var o;const l=r.treeNodeMap;let i=e==null?null:(o=l.get(e))!==null&&o!==void 0?o:null;const a={keyPath:[],treeNodePath:[],treeNode:i};if(i!=null&&i.ignored)return a.treeNode=null,a;for(;i;)!i.ignored&&(t||!i.isGroup)&&a.treeNodePath.push(i),i=i.parent;return a.treeNodePath.reverse(),n||a.treeNodePath.pop(),a.keyPath=a.treeNodePath.map(c=>c.key),a}function Qo(e){if(e.length===0)return null;const t=e[0];return t.isGroup||t.ignored||t.disabled?t.getNext():t}function ei(e,t){const n=e.siblings,r=n.length,{index:o}=e;return t?n[(o+1)%r]:o===n.length-1?null:n[o+1]}function zn(e,t,{loop:n=!1,includeDisabled:r=!1}={}){const o=t==="prev"?ti:ei,l={reverse:t==="prev"};let i=!1,a=null;function c(u){if(u!==null){if(u===e){if(!i)i=!0;else if(!e.disabled&&!e.isGroup){a=e;return}}else if((!u.disabled||r)&&!u.ignored&&!u.isGroup){a=u;return}if(u.isGroup){const s=vn(u,l);s!==null?a=s:c(o(u,n))}else{const s=o(u,!1);if(s!==null)c(s);else{const h=ni(u);h!=null&&h.isGroup?c(o(h,n)):n&&c(o(u,!0))}}}}return c(e),a}function ti(e,t){const n=e.siblings,r=n.length,{index:o}=e;return t?n[(o-1+r)%r]:o===0?null:n[o-1]}function ni(e){return e.parent}function vn(e,t={}){const{reverse:n=!1}=t,{children:r}=e;if(r){const{length:o}=r,l=n?o-1:0,i=n?-1:o,a=n?-1:1;for(let c=l;c!==i;c+=a){const u=r[c];if(!u.disabled&&!u.ignored)if(u.isGroup){const s=vn(u,t);if(s!==null)return s}else return u}}return null}const ri={getChild(){return this.ignored?null:vn(this)},getParent(){const{parent:e}=this;return e!=null&&e.isGroup?e.getParent():e},getNext(e={}){return zn(this,"next",e)},getPrev(e={}){return zn(this,"prev",e)}};function oi(e,t){const n=t?new Set(t):void 0,r=[];function o(l){l.forEach(i=>{r.push(i),!(i.isLeaf||!i.children||i.ignored)&&(i.isGroup||n===void 0||n.has(i.key))&&o(i.children)})}return o(e),r}function ii(e,t){const n=e.key;for(;t;){if(t.key===n)return!0;t=t.parent}return!1}function er(e,t,n,r,o,l=null,i=0){const a=[];return e.forEach((c,u)=>{var s;const h=Object.create(r);if(h.rawNode=c,h.siblings=a,h.level=i,h.index=u,h.isFirstChild=u===0,h.isLastChild=u+1===e.length,h.parent=l,!h.ignored){const w=o(c);Array.isArray(w)&&(h.children=er(w,t,n,r,o,h,i+1))}a.push(h),t.set(h.key,h),n.has(i)||n.set(i,[]),(s=n.get(i))===null||s===void 0||s.push(h)}),a}function ai(e,t={}){var n;const r=new Map,o=new Map,{getDisabled:l=jo,getIgnored:i=Vo,getIsGroup:a=Ho,getKey:c=No}=t,u=(n=t.getChildren)!==null&&n!==void 0?n:Lo,s=t.ignoreEmptyChildren?x=>{const k=u(x);return Array.isArray(k)?k.length?k:null:k}:u,h=Object.assign({get key(){return c(this.rawNode)},get disabled(){return l(this.rawNode)},get isGroup(){return a(this.rawNode)},get isLeaf(){return Bo(this.rawNode,s)},get shallowLoaded(){return Do(this.rawNode,s)},get ignored(){return i(this.rawNode)},contains(x){return ii(this,x)}},ri),w=er(e,r,o,h,s);function p(x){if(x==null)return null;const k=r.get(x);return k&&!k.isGroup&&!k.ignored?k:null}function g(x){if(x==null)return null;const k=r.get(x);return k&&!k.ignored?k:null}function y(x,k){const L=g(x);return L?L.getPrev(k):null}function A(x,k){const L=g(x);return L?L.getNext(k):null}function b(x){const k=g(x);return k?k.getParent():null}function M(x){const k=g(x);return k?k.getChild():null}const F={treeNodes:w,treeNodeMap:r,levelTreeNodeMap:o,maxLevel:Math.max(...o.keys()),getChildren:s,getFlattenedNodes(x){return oi(w,x)},getNode:p,getPrev:y,getNext:A,getParent:b,getChild:M,getFirstAvailableNode(){return Qo(w)},getPath(x,k={}){return Jo(x,k,F)},getCheckedKeys(x,k={}){const{cascade:L=!0,leafOnly:N=!1,checkStrategy:D="all",allowNotLoaded:q=!1}=k;return Ut({checkedKeys:Kt(x),indeterminateKeys:Ht(x),cascade:L,leafOnly:N,checkStrategy:D,allowNotLoaded:q},F)},check(x,k,L={}){const{cascade:N=!0,leafOnly:D=!1,checkStrategy:q="all",allowNotLoaded:j=!1}=L;return Ut({checkedKeys:Kt(k),indeterminateKeys:Ht(k),keysToCheck:x==null?[]:Pn(x),cascade:N,leafOnly:D,checkStrategy:q,allowNotLoaded:j},F)},uncheck(x,k,L={}){const{cascade:N=!0,leafOnly:D=!1,checkStrategy:q="all",allowNotLoaded:j=!1}=L;return Ut({checkedKeys:Kt(k),indeterminateKeys:Ht(k),keysToUncheck:x==null?[]:Pn(x),cascade:N,leafOnly:D,checkStrategy:q,allowNotLoaded:j},F)},getNonLeafKeys(x={}){return Eo(w,x)}};return F}const li=$("empty",` - display: flex; - flex-direction: column; - align-items: center; - font-size: var(--n-font-size); -`,[z("icon",` - width: var(--n-icon-size); - height: var(--n-icon-size); - font-size: var(--n-icon-size); - line-height: var(--n-icon-size); - color: var(--n-icon-color); - transition: - color .3s var(--n-bezier); - `,[te("+",[z("description",` - margin-top: 8px; - `)])]),z("description",` - transition: color .3s var(--n-bezier); - color: var(--n-text-color); - `),z("extra",` - text-align: center; - transition: color .3s var(--n-bezier); - margin-top: 12px; - color: var(--n-extra-text-color); - `)]),si=Object.assign(Object.assign({},Ce.props),{description:String,showDescription:{type:Boolean,default:!0},showIcon:{type:Boolean,default:!0},size:{type:String,default:"medium"},renderIcon:Function}),di=be({name:"Empty",props:si,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:n}=ut(e),r=Ce("Empty","-empty",li,Gr,e,t),{localeRef:o}=fn("Empty"),l=De(Yr,null),i=I(()=>{var s,h,w;return(s=e.description)!==null&&s!==void 0?s:(w=(h=l==null?void 0:l.mergedComponentPropsRef.value)===null||h===void 0?void 0:h.Empty)===null||w===void 0?void 0:w.description}),a=I(()=>{var s,h;return((h=(s=l==null?void 0:l.mergedComponentPropsRef.value)===null||s===void 0?void 0:s.Empty)===null||h===void 0?void 0:h.renderIcon)||(()=>f(Ao,null))}),c=I(()=>{const{size:s}=e,{common:{cubicBezierEaseInOut:h},self:{[ie("iconSize",s)]:w,[ie("fontSize",s)]:p,textColor:g,iconColor:y,extraTextColor:A}}=r.value;return{"--n-icon-size":w,"--n-font-size":p,"--n-bezier":h,"--n-text-color":g,"--n-icon-color":y,"--n-extra-text-color":A}}),u=n?Je("empty",I(()=>{let s="";const{size:h}=e;return s+=h[0],s}),c,e):void 0;return{mergedClsPrefix:t,mergedRenderIcon:a,localizedDescription:I(()=>i.value||o.value.description),cssVars:n?void 0:c,themeClass:u==null?void 0:u.themeClass,onRender:u==null?void 0:u.onRender}},render(){const{$slots:e,mergedClsPrefix:t,onRender:n}=this;return n==null||n(),f("div",{class:[`${t}-empty`,this.themeClass],style:this.cssVars},this.showIcon?f("div",{class:`${t}-empty__icon`},e.icon?e.icon():f(ct,{clsPrefix:t},{default:this.mergedRenderIcon})):null,this.showDescription?f("div",{class:`${t}-empty__description`},e.default?e.default():this.localizedDescription):null,e.extra?f("div",{class:`${t}-empty__extra`},e.extra()):null)}});function ci(e,t){return f(un,{name:"fade-in-scale-up-transition"},{default:()=>e?f(ct,{clsPrefix:t,class:`${t}-base-select-option__check`},{default:()=>f(Oo)}):null})}const On=be({name:"NBaseSelectOption",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0}},setup(e){const{valueRef:t,pendingTmNodeRef:n,multipleRef:r,valueSetRef:o,renderLabelRef:l,renderOptionRef:i,labelFieldRef:a,valueFieldRef:c,showCheckmarkRef:u,nodePropsRef:s,handleOptionClick:h,handleOptionMouseEnter:w}=De(hn),p=st(()=>{const{value:b}=n;return b?e.tmNode.key===b.key:!1});function g(b){const{tmNode:M}=e;M.disabled||h(b,M)}function y(b){const{tmNode:M}=e;M.disabled||w(b,M)}function A(b){const{tmNode:M}=e,{value:F}=p;M.disabled||F||w(b,M)}return{multiple:r,isGrouped:st(()=>{const{tmNode:b}=e,{parent:M}=b;return M&&M.rawNode.type==="group"}),showCheckmark:u,nodeProps:s,isPending:p,isSelected:st(()=>{const{value:b}=t,{value:M}=r;if(b===null)return!1;const F=e.tmNode.rawNode[c.value];if(M){const{value:x}=o;return x.has(F)}else return b===F}),labelField:a,renderLabel:l,renderOption:i,handleMouseMove:A,handleMouseEnter:y,handleClick:g}},render(){const{clsPrefix:e,tmNode:{rawNode:t},isSelected:n,isPending:r,isGrouped:o,showCheckmark:l,nodeProps:i,renderOption:a,renderLabel:c,handleClick:u,handleMouseEnter:s,handleMouseMove:h}=this,w=ci(n,e),p=c?[c(t,n),l&&w]:[lt(t[this.labelField],t,n),l&&w],g=i==null?void 0:i(t),y=f("div",Object.assign({},g,{class:[`${e}-base-select-option`,t.class,g==null?void 0:g.class,{[`${e}-base-select-option--disabled`]:t.disabled,[`${e}-base-select-option--selected`]:n,[`${e}-base-select-option--grouped`]:o,[`${e}-base-select-option--pending`]:r,[`${e}-base-select-option--show-checkmark`]:l}],style:[(g==null?void 0:g.style)||"",t.style||""],onClick:qt([u,g==null?void 0:g.onClick]),onMouseenter:qt([s,g==null?void 0:g.onMouseenter]),onMousemove:qt([h,g==null?void 0:g.onMousemove])}),f("div",{class:`${e}-base-select-option__content`},p));return t.render?t.render({node:y,option:t,selected:n}):a?a({node:y,option:t,selected:n}):y}}),_n=be({name:"NBaseSelectGroupHeader",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0}},setup(){const{renderLabelRef:e,renderOptionRef:t,labelFieldRef:n,nodePropsRef:r}=De(hn);return{labelField:n,nodeProps:r,renderLabel:e,renderOption:t}},render(){const{clsPrefix:e,renderLabel:t,renderOption:n,nodeProps:r,tmNode:{rawNode:o}}=this,l=r==null?void 0:r(o),i=t?t(o,!1):lt(o[this.labelField],o,!1),a=f("div",Object.assign({},l,{class:[`${e}-base-select-group-header`,l==null?void 0:l.class]}),i);return o.render?o.render({node:a,option:o}):n?n({node:a,option:o,selected:!1}):a}}),ui=$("base-select-menu",` - line-height: 1.5; - outline: none; - z-index: 0; - position: relative; - border-radius: var(--n-border-radius); - transition: - background-color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); - background-color: var(--n-color); -`,[$("scrollbar",` - max-height: var(--n-height); - `),$("virtual-list",` - max-height: var(--n-height); - `),$("base-select-option",` - min-height: var(--n-option-height); - font-size: var(--n-option-font-size); - display: flex; - align-items: center; - `,[z("content",` - z-index: 1; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - `)]),$("base-select-group-header",` - min-height: var(--n-option-height); - font-size: .93em; - display: flex; - align-items: center; - `),$("base-select-menu-option-wrapper",` - position: relative; - width: 100%; - `),z("loading, empty",` - display: flex; - padding: 12px 32px; - flex: 1; - justify-content: center; - `),z("loading",` - color: var(--n-loading-color); - font-size: var(--n-loading-size); - `),z("header",` - padding: 8px var(--n-option-padding-left); - font-size: var(--n-option-font-size); - transition: - color .3s var(--n-bezier), - border-color .3s var(--n-bezier); - border-bottom: 1px solid var(--n-action-divider-color); - color: var(--n-action-text-color); - `),z("action",` - padding: 8px var(--n-option-padding-left); - font-size: var(--n-option-font-size); - transition: - color .3s var(--n-bezier), - border-color .3s var(--n-bezier); - border-top: 1px solid var(--n-action-divider-color); - color: var(--n-action-text-color); - `),$("base-select-group-header",` - position: relative; - cursor: default; - padding: var(--n-option-padding); - color: var(--n-group-header-text-color); - `),$("base-select-option",` - cursor: pointer; - position: relative; - padding: var(--n-option-padding); - transition: - color .3s var(--n-bezier), - opacity .3s var(--n-bezier); - box-sizing: border-box; - color: var(--n-option-text-color); - opacity: 1; - `,[G("show-checkmark",` - padding-right: calc(var(--n-option-padding-right) + 20px); - `),te("&::before",` - content: ""; - position: absolute; - left: 4px; - right: 4px; - top: 0; - bottom: 0; - border-radius: var(--n-border-radius); - transition: background-color .3s var(--n-bezier); - `),te("&:active",` - color: var(--n-option-text-color-pressed); - `),G("grouped",` - padding-left: calc(var(--n-option-padding-left) * 1.5); - `),G("pending",[te("&::before",` - background-color: var(--n-option-color-pending); - `)]),G("selected",` - color: var(--n-option-text-color-active); - `,[te("&::before",` - background-color: var(--n-option-color-active); - `),G("pending",[te("&::before",` - background-color: var(--n-option-color-active-pending); - `)])]),G("disabled",` - cursor: not-allowed; - `,[Oe("selected",` - color: var(--n-option-text-color-disabled); - `),G("selected",` - opacity: var(--n-option-opacity-disabled); - `)]),z("check",` - font-size: 16px; - position: absolute; - right: calc(var(--n-option-padding-right) - 4px); - top: calc(50% - 7px); - color: var(--n-option-check-color); - transition: color .3s var(--n-bezier); - `,[jn({enterScale:"0.5"})])])]),fi=be({name:"InternalSelectMenu",props:Object.assign(Object.assign({},Ce.props),{clsPrefix:{type:String,required:!0},scrollable:{type:Boolean,default:!0},treeMate:{type:Object,required:!0},multiple:Boolean,size:{type:String,default:"medium"},value:{type:[String,Number,Array],default:null},autoPending:Boolean,virtualScroll:{type:Boolean,default:!0},show:{type:Boolean,default:!0},labelField:{type:String,default:"label"},valueField:{type:String,default:"value"},loading:Boolean,focusable:Boolean,renderLabel:Function,renderOption:Function,nodeProps:Function,showCheckmark:{type:Boolean,default:!0},onMousedown:Function,onScroll:Function,onFocus:Function,onBlur:Function,onKeyup:Function,onKeydown:Function,onTabOut:Function,onMouseenter:Function,onMouseleave:Function,onResize:Function,resetMenuOnOptionsChange:{type:Boolean,default:!0},inlineThemeDisabled:Boolean,onToggle:Function}),setup(e){const t=Ce("InternalSelectMenu","-internal-select-menu",ui,Zr,e,ge(e,"clsPrefix")),n=B(null),r=B(null),o=B(null),l=I(()=>e.treeMate.getFlattenedNodes()),i=I(()=>Uo(l.value)),a=B(null);function c(){const{treeMate:C}=e;let O=null;const{value:Z}=e;Z===null?O=C.getFirstAvailableNode():(e.multiple?O=C.getNode((Z||[])[(Z||[]).length-1]):O=C.getNode(Z),(!O||O.disabled)&&(O=C.getFirstAvailableNode())),S(O||null)}function u(){const{value:C}=a;C&&!e.treeMate.getNode(C.key)&&(a.value=null)}let s;Te(()=>e.show,C=>{C?s=Te(()=>e.treeMate,()=>{e.resetMenuOnOptionsChange?(e.autoPending?c():u(),xt(P)):u()},{immediate:!0}):s==null||s()},{immediate:!0}),cn(()=>{s==null||s()});const h=I(()=>Xt(t.value.self[ie("optionHeight",e.size)])),w=I(()=>_t(t.value.self[ie("padding",e.size)])),p=I(()=>e.multiple&&Array.isArray(e.value)?new Set(e.value):new Set),g=I(()=>{const C=l.value;return C&&C.length===0});function y(C){const{onToggle:O}=e;O&&O(C)}function A(C){const{onScroll:O}=e;O&&O(C)}function b(C){var O;(O=o.value)===null||O===void 0||O.sync(),A(C)}function M(){var C;(C=o.value)===null||C===void 0||C.sync()}function F(){const{value:C}=a;return C||null}function x(C,O){O.disabled||S(O,!1)}function k(C,O){O.disabled||y(O)}function L(C){var O;Mt(C,"action")||(O=e.onKeyup)===null||O===void 0||O.call(e,C)}function N(C){var O;Mt(C,"action")||(O=e.onKeydown)===null||O===void 0||O.call(e,C)}function D(C){var O;(O=e.onMousedown)===null||O===void 0||O.call(e,C),!e.focusable&&C.preventDefault()}function q(){const{value:C}=a;C&&S(C.getNext({loop:!0}),!0)}function j(){const{value:C}=a;C&&S(C.getPrev({loop:!0}),!0)}function S(C,O=!1){a.value=C,O&&P()}function P(){var C,O;const Z=a.value;if(!Z)return;const ae=i.value(Z.key);ae!==null&&(e.virtualScroll?(C=r.value)===null||C===void 0||C.scrollTo({index:ae}):(O=o.value)===null||O===void 0||O.scrollTo({index:ae,elSize:h.value}))}function _(C){var O,Z;!((O=n.value)===null||O===void 0)&&O.contains(C.target)&&((Z=e.onFocus)===null||Z===void 0||Z.call(e,C))}function Y(C){var O,Z;!((O=n.value)===null||O===void 0)&&O.contains(C.relatedTarget)||(Z=e.onBlur)===null||Z===void 0||Z.call(e,C)}Ze(hn,{handleOptionMouseEnter:x,handleOptionClick:k,valueSetRef:p,pendingTmNodeRef:a,nodePropsRef:ge(e,"nodeProps"),showCheckmarkRef:ge(e,"showCheckmark"),multipleRef:ge(e,"multiple"),valueRef:ge(e,"value"),renderLabelRef:ge(e,"renderLabel"),renderOptionRef:ge(e,"renderOption"),labelFieldRef:ge(e,"labelField"),valueFieldRef:ge(e,"valueField")}),Ze(po,n),Xe(()=>{const{value:C}=o;C&&C.sync()});const W=I(()=>{const{size:C}=e,{common:{cubicBezierEaseInOut:O},self:{height:Z,borderRadius:ae,color:me,groupHeaderTextColor:xe,actionDividerColor:fe,optionTextColorPressed:pe,optionTextColor:oe,optionTextColorDisabled:le,optionTextColorActive:ye,optionOpacityDisabled:Pe,optionCheckColor:ke,actionTextColor:$e,optionColorPending:Re,optionColorActive:Ae,loadingColor:We,loadingSize:Ke,optionColorActivePending:He,[ie("optionFontSize",C)]:_e,[ie("optionHeight",C)]:je,[ie("optionPadding",C)]:Se}}=t.value;return{"--n-height":Z,"--n-action-divider-color":fe,"--n-action-text-color":$e,"--n-bezier":O,"--n-border-radius":ae,"--n-color":me,"--n-option-font-size":_e,"--n-group-header-text-color":xe,"--n-option-check-color":ke,"--n-option-color-pending":Re,"--n-option-color-active":Ae,"--n-option-color-active-pending":He,"--n-option-height":je,"--n-option-opacity-disabled":Pe,"--n-option-text-color":oe,"--n-option-text-color-active":ye,"--n-option-text-color-disabled":le,"--n-option-text-color-pressed":pe,"--n-option-padding":Se,"--n-option-padding-left":_t(Se,"left"),"--n-option-padding-right":_t(Se,"right"),"--n-loading-color":We,"--n-loading-size":Ke}}),{inlineThemeDisabled:K}=e,H=K?Je("internal-select-menu",I(()=>e.size[0]),W,e):void 0,X={selfRef:n,next:q,prev:j,getPendingTmNode:F};return Jn(n,e.onResize),Object.assign({mergedTheme:t,virtualListRef:r,scrollbarRef:o,itemSize:h,padding:w,flattenedNodes:l,empty:g,virtualListContainer(){const{value:C}=r;return C==null?void 0:C.listElRef},virtualListContent(){const{value:C}=r;return C==null?void 0:C.itemsElRef},doScroll:A,handleFocusin:_,handleFocusout:Y,handleKeyUp:L,handleKeyDown:N,handleMouseDown:D,handleVirtualListResize:M,handleVirtualListScroll:b,cssVars:K?void 0:W,themeClass:H==null?void 0:H.themeClass,onRender:H==null?void 0:H.onRender},X)},render(){const{$slots:e,virtualScroll:t,clsPrefix:n,mergedTheme:r,themeClass:o,onRender:l}=this;return l==null||l(),f("div",{ref:"selfRef",tabindex:this.focusable?0:-1,class:[`${n}-base-select-menu`,o,this.multiple&&`${n}-base-select-menu--multiple`],style:this.cssVars,onFocusin:this.handleFocusin,onFocusout:this.handleFocusout,onKeyup:this.handleKeyUp,onKeydown:this.handleKeyDown,onMousedown:this.handleMouseDown,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave},Ve(e.header,i=>i&&f("div",{class:`${n}-base-select-menu__header`,"data-header":!0,key:"header"},i)),this.loading?f("div",{class:`${n}-base-select-menu__loading`},f(qn,{clsPrefix:n,strokeWidth:20})):this.empty?f("div",{class:`${n}-base-select-menu__empty`,"data-empty":!0,"data-action":!0},dt(e.empty,()=>[f(di,{theme:r.peers.Empty,themeOverrides:r.peerOverrides.Empty})])):f(Wn,{ref:"scrollbarRef",theme:r.peers.Scrollbar,themeOverrides:r.peerOverrides.Scrollbar,scrollable:this.scrollable,container:t?this.virtualListContainer:void 0,content:t?this.virtualListContent:void 0,onScroll:t?void 0:this.doScroll},{default:()=>t?f(Po,{ref:"virtualListRef",class:`${n}-virtual-list`,items:this.flattenedNodes,itemSize:this.itemSize,showScrollbar:!1,paddingTop:this.padding.top,paddingBottom:this.padding.bottom,onResize:this.handleVirtualListResize,onScroll:this.handleVirtualListScroll,itemResizable:!0},{default:({item:i})=>i.isGroup?f(_n,{key:i.key,clsPrefix:n,tmNode:i}):i.ignored?null:f(On,{clsPrefix:n,key:i.key,tmNode:i})}):f("div",{class:`${n}-base-select-menu-option-wrapper`,style:{paddingTop:this.padding.top,paddingBottom:this.padding.bottom}},this.flattenedNodes.map(i=>i.isGroup?f(_n,{key:i.key,clsPrefix:n,tmNode:i}):f(On,{clsPrefix:n,key:i.key,tmNode:i})))}),Ve(e.action,i=>i&&[f("div",{class:`${n}-base-select-menu__action`,"data-action":!0,key:"action"},i),f(Io,{onFocus:this.onTabOut,key:"focus-detector"})]))}}),hi={color:Object,type:{type:String,default:"default"},round:Boolean,size:{type:String,default:"medium"},closable:Boolean,disabled:{type:Boolean,default:void 0}},vi=$("tag",` - white-space: nowrap; - position: relative; - box-sizing: border-box; - cursor: default; - display: inline-flex; - align-items: center; - flex-wrap: nowrap; - padding: var(--n-padding); - border-radius: var(--n-border-radius); - color: var(--n-text-color); - background-color: var(--n-color); - transition: - border-color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - opacity .3s var(--n-bezier); - line-height: 1; - height: var(--n-height); - font-size: var(--n-font-size); -`,[G("strong",` - font-weight: var(--n-font-weight-strong); - `),z("border",` - pointer-events: none; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - border-radius: inherit; - border: var(--n-border); - transition: border-color .3s var(--n-bezier); - `),z("icon",` - display: flex; - margin: 0 4px 0 0; - color: var(--n-text-color); - transition: color .3s var(--n-bezier); - font-size: var(--n-avatar-size-override); - `),z("avatar",` - display: flex; - margin: 0 6px 0 0; - `),z("close",` - margin: var(--n-close-margin); - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - `),G("round",` - padding: 0 calc(var(--n-height) / 3); - border-radius: calc(var(--n-height) / 2); - `,[z("icon",` - margin: 0 4px 0 calc((var(--n-height) - 8px) / -2); - `),z("avatar",` - margin: 0 6px 0 calc((var(--n-height) - 8px) / -2); - `),G("closable",` - padding: 0 calc(var(--n-height) / 4) 0 calc(var(--n-height) / 3); - `)]),G("icon, avatar",[G("round",` - padding: 0 calc(var(--n-height) / 3) 0 calc(var(--n-height) / 2); - `)]),G("disabled",` - cursor: not-allowed !important; - opacity: var(--n-opacity-disabled); - `),G("checkable",` - cursor: pointer; - box-shadow: none; - color: var(--n-text-color-checkable); - background-color: var(--n-color-checkable); - `,[Oe("disabled",[te("&:hover","background-color: var(--n-color-hover-checkable);",[Oe("checked","color: var(--n-text-color-hover-checkable);")]),te("&:active","background-color: var(--n-color-pressed-checkable);",[Oe("checked","color: var(--n-text-color-pressed-checkable);")])]),G("checked",` - color: var(--n-text-color-checked); - background-color: var(--n-color-checked); - `,[Oe("disabled",[te("&:hover","background-color: var(--n-color-checked-hover);"),te("&:active","background-color: var(--n-color-checked-pressed);")])])])]),gi=Object.assign(Object.assign(Object.assign({},Ce.props),hi),{bordered:{type:Boolean,default:void 0},checked:Boolean,checkable:Boolean,strong:Boolean,triggerClickOnClose:Boolean,onClose:[Array,Function],onMouseenter:Function,onMouseleave:Function,"onUpdate:checked":Function,onUpdateChecked:Function,internalCloseFocusable:{type:Boolean,default:!0},internalCloseIsButtonTag:{type:Boolean,default:!0},onCheckedChange:Function}),pi=Et("n-tag"),Gt=be({name:"Tag",props:gi,setup(e){const t=B(null),{mergedBorderedRef:n,mergedClsPrefixRef:r,inlineThemeDisabled:o,mergedRtlRef:l}=ut(e),i=Ce("Tag","-tag",vi,Jr,e,r);Ze(pi,{roundRef:ge(e,"round")});function a(p){if(!e.disabled&&e.checkable){const{checked:g,onCheckedChange:y,onUpdateChecked:A,"onUpdate:checked":b}=e;A&&A(!g),b&&b(!g),y&&y(!g)}}function c(p){if(e.triggerClickOnClose||p.stopPropagation(),!e.disabled){const{onClose:g}=e;g&&de(g,p)}}const u={setTextContent(p){const{value:g}=t;g&&(g.textContent=p)}},s=Kn("Tag",l,r),h=I(()=>{const{type:p,size:g,color:{color:y,textColor:A}={}}=e,{common:{cubicBezierEaseInOut:b},self:{padding:M,closeMargin:F,closeMarginRtl:x,borderRadius:k,opacityDisabled:L,textColorCheckable:N,textColorHoverCheckable:D,textColorPressedCheckable:q,textColorChecked:j,colorCheckable:S,colorHoverCheckable:P,colorPressedCheckable:_,colorChecked:Y,colorCheckedHover:W,colorCheckedPressed:K,closeBorderRadius:H,fontWeightStrong:X,[ie("colorBordered",p)]:C,[ie("closeSize",g)]:O,[ie("closeIconSize",g)]:Z,[ie("fontSize",g)]:ae,[ie("height",g)]:me,[ie("color",p)]:xe,[ie("textColor",p)]:fe,[ie("border",p)]:pe,[ie("closeIconColor",p)]:oe,[ie("closeIconColorHover",p)]:le,[ie("closeIconColorPressed",p)]:ye,[ie("closeColorHover",p)]:Pe,[ie("closeColorPressed",p)]:ke}}=i.value;return{"--n-font-weight-strong":X,"--n-avatar-size-override":`calc(${me} - 8px)`,"--n-bezier":b,"--n-border-radius":k,"--n-border":pe,"--n-close-icon-size":Z,"--n-close-color-pressed":ke,"--n-close-color-hover":Pe,"--n-close-border-radius":H,"--n-close-icon-color":oe,"--n-close-icon-color-hover":le,"--n-close-icon-color-pressed":ye,"--n-close-icon-color-disabled":oe,"--n-close-margin":F,"--n-close-margin-rtl":x,"--n-close-size":O,"--n-color":y||(n.value?C:xe),"--n-color-checkable":S,"--n-color-checked":Y,"--n-color-checked-hover":W,"--n-color-checked-pressed":K,"--n-color-hover-checkable":P,"--n-color-pressed-checkable":_,"--n-font-size":ae,"--n-height":me,"--n-opacity-disabled":L,"--n-padding":M,"--n-text-color":A||fe,"--n-text-color-checkable":N,"--n-text-color-checked":j,"--n-text-color-hover-checkable":D,"--n-text-color-pressed-checkable":q}}),w=o?Je("tag",I(()=>{let p="";const{type:g,size:y,color:{color:A,textColor:b}={}}=e;return p+=g[0],p+=y[0],A&&(p+=`a${pn(A)}`),b&&(p+=`b${pn(b)}`),n.value&&(p+="c"),p}),h,e):void 0;return Object.assign(Object.assign({},u),{rtlEnabled:s,mergedClsPrefix:r,contentRef:t,mergedBordered:n,handleClick:a,handleCloseClick:c,cssVars:o?void 0:h,themeClass:w==null?void 0:w.themeClass,onRender:w==null?void 0:w.onRender})},render(){var e,t;const{mergedClsPrefix:n,rtlEnabled:r,closable:o,color:{borderColor:l}={},round:i,onRender:a,$slots:c}=this;a==null||a();const u=Ve(c.avatar,h=>h&&f("div",{class:`${n}-tag__avatar`},h)),s=Ve(c.icon,h=>h&&f("div",{class:`${n}-tag__icon`},h));return f("div",{class:[`${n}-tag`,this.themeClass,{[`${n}-tag--rtl`]:r,[`${n}-tag--strong`]:this.strong,[`${n}-tag--disabled`]:this.disabled,[`${n}-tag--checkable`]:this.checkable,[`${n}-tag--checked`]:this.checkable&&this.checked,[`${n}-tag--round`]:i,[`${n}-tag--avatar`]:u,[`${n}-tag--icon`]:s,[`${n}-tag--closable`]:o}],style:this.cssVars,onClick:this.handleClick,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave},s||u,f("span",{class:`${n}-tag__content`,ref:"contentRef"},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)),!this.checkable&&o?f(Xr,{clsPrefix:n,class:`${n}-tag__close`,disabled:this.disabled,onClick:this.handleCloseClick,focusable:this.internalCloseFocusable,round:i,isButtonTag:this.internalCloseIsButtonTag,absolute:!0}):null,!this.checkable&&this.mergedBordered?f("div",{class:`${n}-tag__border`,style:{borderColor:l}}):null)}}),bi=$("base-clear",` - flex-shrink: 0; - height: 1em; - width: 1em; - position: relative; -`,[te(">",[z("clear",` - font-size: var(--n-clear-size); - height: 1em; - width: 1em; - cursor: pointer; - color: var(--n-clear-color); - transition: color .3s var(--n-bezier); - display: flex; - `,[te("&:hover",` - color: var(--n-clear-color-hover)!important; - `),te("&:active",` - color: var(--n-clear-color-pressed)!important; - `)]),z("placeholder",` - display: flex; - `),z("clear, placeholder",` - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - `,[Qr({originalTransform:"translateX(-50%) translateY(-50%)",left:"50%",top:"50%"})])])]),rn=be({name:"BaseClear",props:{clsPrefix:{type:String,required:!0},show:Boolean,onClear:Function},setup(e){return Hn("-base-clear",bi,ge(e,"clsPrefix")),{handleMouseDown(t){var n;t.preventDefault(),(n=e.onClear)===null||n===void 0||n.call(e,t)}}},render(){const{clsPrefix:e}=this;return f("div",{class:`${e}-base-clear`},f(eo,null,{default:()=>{var t,n;return this.show?f("div",{key:"dismiss",class:`${e}-base-clear__clear`,onClick:this.onClear,onMousedown:this.handleMouseDown,"data-clear":!0},dt(this.$slots.icon,()=>[f(ct,{clsPrefix:e},{default:()=>f($o,null)})])):f("div",{key:"icon",class:`${e}-base-clear__placeholder`},(n=(t=this.$slots).placeholder)===null||n===void 0?void 0:n.call(t))}}))}}),tr=be({name:"InternalSelectionSuffix",props:{clsPrefix:{type:String,required:!0},showArrow:{type:Boolean,default:void 0},showClear:{type:Boolean,default:void 0},loading:{type:Boolean,default:!1},onClear:Function},setup(e,{slots:t}){return()=>{const{clsPrefix:n}=e;return f(qn,{clsPrefix:n,class:`${n}-base-suffix`,strokeWidth:24,scale:.85,show:e.loading},{default:()=>e.showArrow?f(rn,{clsPrefix:n,show:e.showClear,onClear:e.onClear},{placeholder:()=>f(ct,{clsPrefix:n,class:`${n}-base-suffix__arrow`},{default:()=>dt(t.default,()=>[f(Mo,null)])})}):null})}}}),mi=te([$("base-selection",` - position: relative; - z-index: auto; - box-shadow: none; - width: 100%; - max-width: 100%; - display: inline-block; - vertical-align: bottom; - border-radius: var(--n-border-radius); - min-height: var(--n-height); - line-height: 1.5; - font-size: var(--n-font-size); - `,[$("base-loading",` - color: var(--n-loading-color); - `),$("base-selection-tags","min-height: var(--n-height);"),z("border, state-border",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - pointer-events: none; - border: var(--n-border); - border-radius: inherit; - transition: - box-shadow .3s var(--n-bezier), - border-color .3s var(--n-bezier); - `),z("state-border",` - z-index: 1; - border-color: #0000; - `),$("base-suffix",` - cursor: pointer; - position: absolute; - top: 50%; - transform: translateY(-50%); - right: 10px; - `,[z("arrow",` - font-size: var(--n-arrow-size); - color: var(--n-arrow-color); - transition: color .3s var(--n-bezier); - `)]),$("base-selection-overlay",` - display: flex; - align-items: center; - white-space: nowrap; - pointer-events: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--n-padding-single); - transition: color .3s var(--n-bezier); - `,[z("wrapper",` - flex-basis: 0; - flex-grow: 1; - overflow: hidden; - text-overflow: ellipsis; - `)]),$("base-selection-placeholder",` - color: var(--n-placeholder-color); - `,[z("inner",` - max-width: 100%; - overflow: hidden; - `)]),$("base-selection-tags",` - cursor: pointer; - outline: none; - box-sizing: border-box; - position: relative; - z-index: auto; - display: flex; - padding: var(--n-padding-multiple); - flex-wrap: wrap; - align-items: center; - width: 100%; - vertical-align: bottom; - background-color: var(--n-color); - border-radius: inherit; - transition: - color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier); - `),$("base-selection-label",` - height: var(--n-height); - display: inline-flex; - width: 100%; - vertical-align: bottom; - cursor: pointer; - outline: none; - z-index: auto; - box-sizing: border-box; - position: relative; - transition: - color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier); - border-radius: inherit; - background-color: var(--n-color); - align-items: center; - `,[$("base-selection-input",` - font-size: inherit; - line-height: inherit; - outline: none; - cursor: pointer; - box-sizing: border-box; - border:none; - width: 100%; - padding: var(--n-padding-single); - background-color: #0000; - color: var(--n-text-color); - transition: color .3s var(--n-bezier); - caret-color: var(--n-caret-color); - `,[z("content",` - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - `)]),z("render-label",` - color: var(--n-text-color); - `)]),Oe("disabled",[te("&:hover",[z("state-border",` - box-shadow: var(--n-box-shadow-hover); - border: var(--n-border-hover); - `)]),G("focus",[z("state-border",` - box-shadow: var(--n-box-shadow-focus); - border: var(--n-border-focus); - `)]),G("active",[z("state-border",` - box-shadow: var(--n-box-shadow-active); - border: var(--n-border-active); - `),$("base-selection-label","background-color: var(--n-color-active);"),$("base-selection-tags","background-color: var(--n-color-active);")])]),G("disabled","cursor: not-allowed;",[z("arrow",` - color: var(--n-arrow-color-disabled); - `),$("base-selection-label",` - cursor: not-allowed; - background-color: var(--n-color-disabled); - `,[$("base-selection-input",` - cursor: not-allowed; - color: var(--n-text-color-disabled); - `),z("render-label",` - color: var(--n-text-color-disabled); - `)]),$("base-selection-tags",` - cursor: not-allowed; - background-color: var(--n-color-disabled); - `),$("base-selection-placeholder",` - cursor: not-allowed; - color: var(--n-placeholder-color-disabled); - `)]),$("base-selection-input-tag",` - height: calc(var(--n-height) - 6px); - line-height: calc(var(--n-height) - 6px); - outline: none; - display: none; - position: relative; - margin-bottom: 3px; - max-width: 100%; - vertical-align: bottom; - `,[z("input",` - font-size: inherit; - font-family: inherit; - min-width: 1px; - padding: 0; - background-color: #0000; - outline: none; - border: none; - max-width: 100%; - overflow: hidden; - width: 1em; - line-height: inherit; - cursor: pointer; - color: var(--n-text-color); - caret-color: var(--n-caret-color); - `),z("mirror",` - position: absolute; - left: 0; - top: 0; - white-space: pre; - visibility: hidden; - user-select: none; - -webkit-user-select: none; - opacity: 0; - `)]),["warning","error"].map(e=>G(`${e}-status`,[z("state-border",`border: var(--n-border-${e});`),Oe("disabled",[te("&:hover",[z("state-border",` - box-shadow: var(--n-box-shadow-hover-${e}); - border: var(--n-border-hover-${e}); - `)]),G("active",[z("state-border",` - box-shadow: var(--n-box-shadow-active-${e}); - border: var(--n-border-active-${e}); - `),$("base-selection-label",`background-color: var(--n-color-active-${e});`),$("base-selection-tags",`background-color: var(--n-color-active-${e});`)]),G("focus",[z("state-border",` - box-shadow: var(--n-box-shadow-focus-${e}); - border: var(--n-border-focus-${e}); - `)])])]))]),$("base-selection-popover",` - margin-bottom: -3px; - display: flex; - flex-wrap: wrap; - margin-right: -8px; - `),$("base-selection-tag-wrapper",` - max-width: 100%; - display: inline-flex; - padding: 0 7px 3px 0; - `,[te("&:last-child","padding-right: 0;"),$("tag",` - font-size: 14px; - max-width: 100%; - `,[z("content",` - line-height: 1.25; - text-overflow: ellipsis; - overflow: hidden; - `)])])]),yi=be({name:"InternalSelection",props:Object.assign(Object.assign({},Ce.props),{clsPrefix:{type:String,required:!0},bordered:{type:Boolean,default:void 0},active:Boolean,pattern:{type:String,default:""},placeholder:String,selectedOption:{type:Object,default:null},selectedOptions:{type:Array,default:null},labelField:{type:String,default:"label"},valueField:{type:String,default:"value"},multiple:Boolean,filterable:Boolean,clearable:Boolean,disabled:Boolean,size:{type:String,default:"medium"},loading:Boolean,autofocus:Boolean,showArrow:{type:Boolean,default:!0},inputProps:Object,focused:Boolean,renderTag:Function,onKeydown:Function,onClick:Function,onBlur:Function,onFocus:Function,onDeleteOption:Function,maxTagCount:[String,Number],onClear:Function,onPatternInput:Function,onPatternFocus:Function,onPatternBlur:Function,renderLabel:Function,status:String,inlineThemeDisabled:Boolean,ignoreComposition:{type:Boolean,default:!0},onResize:Function}),setup(e){const t=B(null),n=B(null),r=B(null),o=B(null),l=B(null),i=B(null),a=B(null),c=B(null),u=B(null),s=B(null),h=B(!1),w=B(!1),p=B(!1),g=Ce("InternalSelection","-internal-selection",mi,to,e,ge(e,"clsPrefix")),y=I(()=>e.clearable&&!e.disabled&&(p.value||e.active)),A=I(()=>e.selectedOption?e.renderTag?e.renderTag({option:e.selectedOption,handleClose:()=>{}}):e.renderLabel?e.renderLabel(e.selectedOption,!0):lt(e.selectedOption[e.labelField],e.selectedOption,!0):e.placeholder),b=I(()=>{const R=e.selectedOption;if(R)return R[e.labelField]}),M=I(()=>e.multiple?!!(Array.isArray(e.selectedOptions)&&e.selectedOptions.length):e.selectedOption!==null);function F(){var R;const{value:E}=t;if(E){const{value:ue}=n;ue&&(ue.style.width=`${E.offsetWidth}px`,e.maxTagCount!=="responsive"&&((R=u.value)===null||R===void 0||R.sync({showAllItemsBeforeCalculate:!1})))}}function x(){const{value:R}=s;R&&(R.style.display="none")}function k(){const{value:R}=s;R&&(R.style.display="inline-block")}Te(ge(e,"active"),R=>{R||x()}),Te(ge(e,"pattern"),()=>{e.multiple&&xt(F)});function L(R){const{onFocus:E}=e;E&&E(R)}function N(R){const{onBlur:E}=e;E&&E(R)}function D(R){const{onDeleteOption:E}=e;E&&E(R)}function q(R){const{onClear:E}=e;E&&E(R)}function j(R){const{onPatternInput:E}=e;E&&E(R)}function S(R){var E;(!R.relatedTarget||!(!((E=r.value)===null||E===void 0)&&E.contains(R.relatedTarget)))&&L(R)}function P(R){var E;!((E=r.value)===null||E===void 0)&&E.contains(R.relatedTarget)||N(R)}function _(R){q(R)}function Y(){p.value=!0}function W(){p.value=!1}function K(R){!e.active||!e.filterable||R.target!==n.value&&R.preventDefault()}function H(R){D(R)}function X(R){if(R.key==="Backspace"&&!C.value&&!e.pattern.length){const{selectedOptions:E}=e;E!=null&&E.length&&H(E[E.length-1])}}const C=B(!1);let O=null;function Z(R){const{value:E}=t;if(E){const ue=R.target.value;E.textContent=ue,F()}e.ignoreComposition&&C.value?O=R:j(R)}function ae(){C.value=!0}function me(){C.value=!1,e.ignoreComposition&&j(O),O=null}function xe(R){var E;w.value=!0,(E=e.onPatternFocus)===null||E===void 0||E.call(e,R)}function fe(R){var E;w.value=!1,(E=e.onPatternBlur)===null||E===void 0||E.call(e,R)}function pe(){var R,E;if(e.filterable)w.value=!1,(R=i.value)===null||R===void 0||R.blur(),(E=n.value)===null||E===void 0||E.blur();else if(e.multiple){const{value:ue}=o;ue==null||ue.blur()}else{const{value:ue}=l;ue==null||ue.blur()}}function oe(){var R,E,ue;e.filterable?(w.value=!1,(R=i.value)===null||R===void 0||R.focus()):e.multiple?(E=o.value)===null||E===void 0||E.focus():(ue=l.value)===null||ue===void 0||ue.focus()}function le(){const{value:R}=n;R&&(k(),R.focus())}function ye(){const{value:R}=n;R&&R.blur()}function Pe(R){const{value:E}=a;E&&E.setTextContent(`+${R}`)}function ke(){const{value:R}=c;return R}function $e(){return n.value}let Re=null;function Ae(){Re!==null&&window.clearTimeout(Re)}function We(){e.active||(Ae(),Re=window.setTimeout(()=>{M.value&&(h.value=!0)},100))}function Ke(){Ae()}function He(R){R||(Ae(),h.value=!1)}Te(M,R=>{R||(h.value=!1)}),Xe(()=>{Qt(()=>{const R=i.value;R&&(e.disabled?R.removeAttribute("tabindex"):R.tabIndex=w.value?-1:0)})}),Jn(r,e.onResize);const{inlineThemeDisabled:_e}=e,je=I(()=>{const{size:R}=e,{common:{cubicBezierEaseInOut:E},self:{borderRadius:ue,color:Ie,placeholderColor:ft,textColor:ht,paddingSingle:vt,paddingMultiple:gt,caretColor:Qe,colorDisabled:et,textColorDisabled:tt,placeholderColorDisabled:pt,colorActive:bt,boxShadowFocus:nt,boxShadowActive:Me,boxShadowHover:v,border:T,borderFocus:U,borderHover:re,borderActive:Q,arrowColor:J,arrowColorDisabled:ee,loadingColor:he,colorActiveWarning:ze,boxShadowFocusWarning:rt,boxShadowActiveWarning:Bt,boxShadowHoverWarning:ot,borderWarning:it,borderFocusWarning:Lt,borderHoverWarning:Nt,borderActiveWarning:Rt,colorActiveError:qe,boxShadowFocusError:d,boxShadowActiveError:m,boxShadowHoverError:V,borderError:ce,borderFocusError:ve,borderHoverError:se,borderActiveError:Ee,clearColor:Be,clearColorHover:Le,clearColorPressed:Ue,clearSize:Ge,arrowSize:mt,[ie("height",R)]:Vt,[ie("fontSize",R)]:Dt}}=g.value;return{"--n-bezier":E,"--n-border":T,"--n-border-active":Q,"--n-border-focus":U,"--n-border-hover":re,"--n-border-radius":ue,"--n-box-shadow-active":Me,"--n-box-shadow-focus":nt,"--n-box-shadow-hover":v,"--n-caret-color":Qe,"--n-color":Ie,"--n-color-active":bt,"--n-color-disabled":et,"--n-font-size":Dt,"--n-height":Vt,"--n-padding-single":vt,"--n-padding-multiple":gt,"--n-placeholder-color":ft,"--n-placeholder-color-disabled":pt,"--n-text-color":ht,"--n-text-color-disabled":tt,"--n-arrow-color":J,"--n-arrow-color-disabled":ee,"--n-loading-color":he,"--n-color-active-warning":ze,"--n-box-shadow-focus-warning":rt,"--n-box-shadow-active-warning":Bt,"--n-box-shadow-hover-warning":ot,"--n-border-warning":it,"--n-border-focus-warning":Lt,"--n-border-hover-warning":Nt,"--n-border-active-warning":Rt,"--n-color-active-error":qe,"--n-box-shadow-focus-error":d,"--n-box-shadow-active-error":m,"--n-box-shadow-hover-error":V,"--n-border-error":ce,"--n-border-focus-error":ve,"--n-border-hover-error":se,"--n-border-active-error":Ee,"--n-clear-size":Ge,"--n-clear-color":Be,"--n-clear-color-hover":Le,"--n-clear-color-pressed":Ue,"--n-arrow-size":mt}}),Se=_e?Je("internal-selection",I(()=>e.size[0]),je,e):void 0;return{mergedTheme:g,mergedClearable:y,patternInputFocused:w,filterablePlaceholder:A,label:b,selected:M,showTagsPanel:h,isComposing:C,counterRef:a,counterWrapperRef:c,patternInputMirrorRef:t,patternInputRef:n,selfRef:r,multipleElRef:o,singleElRef:l,patternInputWrapperRef:i,overflowRef:u,inputTagElRef:s,handleMouseDown:K,handleFocusin:S,handleClear:_,handleMouseEnter:Y,handleMouseLeave:W,handleDeleteOption:H,handlePatternKeyDown:X,handlePatternInputInput:Z,handlePatternInputBlur:fe,handlePatternInputFocus:xe,handleMouseEnterCounter:We,handleMouseLeaveCounter:Ke,handleFocusout:P,handleCompositionEnd:me,handleCompositionStart:ae,onPopoverUpdateShow:He,focus:oe,focusInput:le,blur:pe,blurInput:ye,updateCounter:Pe,getCounter:ke,getTail:$e,renderLabel:e.renderLabel,cssVars:_e?void 0:je,themeClass:Se==null?void 0:Se.themeClass,onRender:Se==null?void 0:Se.onRender}},render(){const{status:e,multiple:t,size:n,disabled:r,filterable:o,maxTagCount:l,bordered:i,clsPrefix:a,onRender:c,renderTag:u,renderLabel:s}=this;c==null||c();const h=l==="responsive",w=typeof l=="number",p=h||w,g=f(no,null,{default:()=>f(tr,{clsPrefix:a,loading:this.loading,showArrow:this.showArrow,showClear:this.mergedClearable&&this.selected,onClear:this.handleClear},{default:()=>{var A,b;return(b=(A=this.$slots).arrow)===null||b===void 0?void 0:b.call(A)}})});let y;if(t){const{labelField:A}=this,b=P=>f("div",{class:`${a}-base-selection-tag-wrapper`,key:P.value},u?u({option:P,handleClose:()=>{this.handleDeleteOption(P)}}):f(Gt,{size:n,closable:!P.disabled,disabled:r,onClose:()=>{this.handleDeleteOption(P)},internalCloseIsButtonTag:!1,internalCloseFocusable:!1},{default:()=>s?s(P,!0):lt(P[A],P,!0)})),M=()=>(w?this.selectedOptions.slice(0,l):this.selectedOptions).map(b),F=o?f("div",{class:`${a}-base-selection-input-tag`,ref:"inputTagElRef",key:"__input-tag__"},f("input",Object.assign({},this.inputProps,{ref:"patternInputRef",tabindex:-1,disabled:r,value:this.pattern,autofocus:this.autofocus,class:`${a}-base-selection-input-tag__input`,onBlur:this.handlePatternInputBlur,onFocus:this.handlePatternInputFocus,onKeydown:this.handlePatternKeyDown,onInput:this.handlePatternInputInput,onCompositionstart:this.handleCompositionStart,onCompositionend:this.handleCompositionEnd})),f("span",{ref:"patternInputMirrorRef",class:`${a}-base-selection-input-tag__mirror`},this.pattern)):null,x=h?()=>f("div",{class:`${a}-base-selection-tag-wrapper`,ref:"counterWrapperRef"},f(Gt,{size:n,ref:"counterRef",onMouseenter:this.handleMouseEnterCounter,onMouseleave:this.handleMouseLeaveCounter,disabled:r})):void 0;let k;if(w){const P=this.selectedOptions.length-l;P>0&&(k=f("div",{class:`${a}-base-selection-tag-wrapper`,key:"__counter__"},f(Gt,{size:n,ref:"counterRef",onMouseenter:this.handleMouseEnterCounter,disabled:r},{default:()=>`+${P}`})))}const L=h?o?f(Fn,{ref:"overflowRef",updateCounter:this.updateCounter,getCounter:this.getCounter,getTail:this.getTail,style:{width:"100%",display:"flex",overflow:"hidden"}},{default:M,counter:x,tail:()=>F}):f(Fn,{ref:"overflowRef",updateCounter:this.updateCounter,getCounter:this.getCounter,style:{width:"100%",display:"flex",overflow:"hidden"}},{default:M,counter:x}):w&&k?M().concat(k):M(),N=p?()=>f("div",{class:`${a}-base-selection-popover`},h?M():this.selectedOptions.map(b)):void 0,D=p?{show:this.showTagsPanel,trigger:"hover",overlap:!0,placement:"top",width:"trigger",onUpdateShow:this.onPopoverUpdateShow,theme:this.mergedTheme.peers.Popover,themeOverrides:this.mergedTheme.peerOverrides.Popover}:null,j=(this.selected?!1:this.active?!this.pattern&&!this.isComposing:!0)?f("div",{class:`${a}-base-selection-placeholder ${a}-base-selection-overlay`},f("div",{class:`${a}-base-selection-placeholder__inner`},this.placeholder)):null,S=o?f("div",{ref:"patternInputWrapperRef",class:`${a}-base-selection-tags`},L,h?null:F,g):f("div",{ref:"multipleElRef",class:`${a}-base-selection-tags`,tabindex:r?void 0:0},L,g);y=f(Un,null,p?f(bo,Object.assign({},D,{scrollable:!0,style:"max-height: calc(var(--v-target-height) * 6.6);"}),{trigger:()=>S,default:N}):S,j)}else if(o){const A=this.pattern||this.isComposing,b=this.active?!A:!this.selected,M=this.active?!1:this.selected;y=f("div",{ref:"patternInputWrapperRef",class:`${a}-base-selection-label`},f("input",Object.assign({},this.inputProps,{ref:"patternInputRef",class:`${a}-base-selection-input`,value:this.active?this.pattern:"",placeholder:"",readonly:r,disabled:r,tabindex:-1,autofocus:this.autofocus,onFocus:this.handlePatternInputFocus,onBlur:this.handlePatternInputBlur,onInput:this.handlePatternInputInput,onCompositionstart:this.handleCompositionStart,onCompositionend:this.handleCompositionEnd})),M?f("div",{class:`${a}-base-selection-label__render-label ${a}-base-selection-overlay`,key:"input"},f("div",{class:`${a}-base-selection-overlay__wrapper`},u?u({option:this.selectedOption,handleClose:()=>{}}):s?s(this.selectedOption,!0):lt(this.label,this.selectedOption,!0))):null,b?f("div",{class:`${a}-base-selection-placeholder ${a}-base-selection-overlay`,key:"placeholder"},f("div",{class:`${a}-base-selection-overlay__wrapper`},this.filterablePlaceholder)):null,g)}else y=f("div",{ref:"singleElRef",class:`${a}-base-selection-label`,tabindex:this.disabled?void 0:0},this.label!==void 0?f("div",{class:`${a}-base-selection-input`,title:Co(this.label),key:"input"},f("div",{class:`${a}-base-selection-input__content`},u?u({option:this.selectedOption,handleClose:()=>{}}):s?s(this.selectedOption,!0):lt(this.label,this.selectedOption,!0))):f("div",{class:`${a}-base-selection-placeholder ${a}-base-selection-overlay`,key:"placeholder"},f("div",{class:`${a}-base-selection-placeholder__inner`},this.placeholder)),g);return f("div",{ref:"selfRef",class:[`${a}-base-selection`,this.themeClass,e&&`${a}-base-selection--${e}-status`,{[`${a}-base-selection--active`]:this.active,[`${a}-base-selection--selected`]:this.selected||this.active&&this.pattern,[`${a}-base-selection--disabled`]:this.disabled,[`${a}-base-selection--multiple`]:this.multiple,[`${a}-base-selection--focus`]:this.focused}],style:this.cssVars,onClick:this.onClick,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onKeydown:this.onKeydown,onFocusin:this.handleFocusin,onFocusout:this.handleFocusout,onMousedown:this.handleMouseDown},y,i?f("div",{class:`${a}-base-selection__border`}):null,i?f("div",{class:`${a}-base-selection__state-border`}):null)}});function It(e){return e.type==="group"}function nr(e){return e.type==="ignored"}function Yt(e,t){try{return!!(1+t.toString().toLowerCase().indexOf(e.trim().toLowerCase()))}catch{return!1}}function wi(e,t){return{getIsGroup:It,getIgnored:nr,getKey(r){return It(r)?r.name||r.key||"key-required":r[e]},getChildren(r){return r[t]}}}function xi(e,t,n,r){if(!t)return e;function o(l){if(!Array.isArray(l))return[];const i=[];for(const a of l)if(It(a)){const c=o(a[r]);c.length&&i.push(Object.assign({},a,{[r]:c}))}else{if(nr(a))continue;t(n,a)&&i.push(a)}return i}return o(e)}function Ci(e,t,n){const r=new Map;return e.forEach(o=>{It(o)?o[n].forEach(l=>{r.set(l[t],l)}):r.set(o[t],o)}),r}const rr=Et("n-input");function ki(e){let t=0;for(const n of e)t++;return t}function zt(e){return e===""||e==null}function Si(e){const t=B(null);function n(){const{value:l}=e;if(!(l!=null&&l.focus)){o();return}const{selectionStart:i,selectionEnd:a,value:c}=l;if(i==null||a==null){o();return}t.value={start:i,end:a,beforeText:c.slice(0,i),afterText:c.slice(a)}}function r(){var l;const{value:i}=t,{value:a}=e;if(!i||!a)return;const{value:c}=a,{start:u,beforeText:s,afterText:h}=i;let w=c.length;if(c.endsWith(h))w=c.length-h.length;else if(c.startsWith(s))w=s.length;else{const p=s[u-1],g=c.indexOf(p,u-1);g!==-1&&(w=g+1)}(l=a.setSelectionRange)===null||l===void 0||l.call(a,w,w)}function o(){t.value=null}return Te(e,o),{recordCursor:n,restoreCursor:r}}const Tn=be({name:"InputWordCount",setup(e,{slots:t}){const{mergedValueRef:n,maxlengthRef:r,mergedClsPrefixRef:o,countGraphemesRef:l}=De(rr),i=I(()=>{const{value:a}=n;return a===null||Array.isArray(a)?0:(l.value||ki)(a)});return()=>{const{value:a}=r,{value:c}=n;return f("span",{class:`${o.value}-input-word-count`},ro(t.default,{value:c===null||Array.isArray(c)?"":c},()=>[a===void 0?i.value:`${i.value} / ${a}`]))}}}),Ri=$("input",` - max-width: 100%; - cursor: text; - line-height: 1.5; - z-index: auto; - outline: none; - box-sizing: border-box; - position: relative; - display: inline-flex; - border-radius: var(--n-border-radius); - background-color: var(--n-color); - transition: background-color .3s var(--n-bezier); - font-size: var(--n-font-size); - --n-padding-vertical: calc((var(--n-height) - 1.5 * var(--n-font-size)) / 2); -`,[z("input, textarea",` - overflow: hidden; - flex-grow: 1; - position: relative; - `),z("input-el, textarea-el, input-mirror, textarea-mirror, separator, placeholder",` - box-sizing: border-box; - font-size: inherit; - line-height: 1.5; - font-family: inherit; - border: none; - outline: none; - background-color: #0000; - text-align: inherit; - transition: - -webkit-text-fill-color .3s var(--n-bezier), - caret-color .3s var(--n-bezier), - color .3s var(--n-bezier), - text-decoration-color .3s var(--n-bezier); - `),z("input-el, textarea-el",` - -webkit-appearance: none; - scrollbar-width: none; - width: 100%; - min-width: 0; - text-decoration-color: var(--n-text-decoration-color); - color: var(--n-text-color); - caret-color: var(--n-caret-color); - background-color: transparent; - `,[te("&::-webkit-scrollbar, &::-webkit-scrollbar-track-piece, &::-webkit-scrollbar-thumb",` - width: 0; - height: 0; - display: none; - `),te("&::placeholder",` - color: #0000; - -webkit-text-fill-color: transparent !important; - `),te("&:-webkit-autofill ~",[z("placeholder","display: none;")])]),G("round",[Oe("textarea","border-radius: calc(var(--n-height) / 2);")]),z("placeholder",` - pointer-events: none; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: hidden; - color: var(--n-placeholder-color); - `,[te("span",` - width: 100%; - display: inline-block; - `)]),G("textarea",[z("placeholder","overflow: visible;")]),Oe("autosize","width: 100%;"),G("autosize",[z("textarea-el, input-el",` - position: absolute; - top: 0; - left: 0; - height: 100%; - `)]),$("input-wrapper",` - overflow: hidden; - display: inline-flex; - flex-grow: 1; - position: relative; - padding-left: var(--n-padding-left); - padding-right: var(--n-padding-right); - `),z("input-mirror",` - padding: 0; - height: var(--n-height); - line-height: var(--n-height); - overflow: hidden; - visibility: hidden; - position: static; - white-space: pre; - pointer-events: none; - `),z("input-el",` - padding: 0; - height: var(--n-height); - line-height: var(--n-height); - `,[te("&[type=password]::-ms-reveal","display: none;"),te("+",[z("placeholder",` - display: flex; - align-items: center; - `)])]),Oe("textarea",[z("placeholder","white-space: nowrap;")]),z("eye",` - display: flex; - align-items: center; - justify-content: center; - transition: color .3s var(--n-bezier); - `),G("textarea","width: 100%;",[$("input-word-count",` - position: absolute; - right: var(--n-padding-right); - bottom: var(--n-padding-vertical); - `),G("resizable",[$("input-wrapper",` - resize: vertical; - min-height: var(--n-height); - `)]),z("textarea-el, textarea-mirror, placeholder",` - height: 100%; - padding-left: 0; - padding-right: 0; - padding-top: var(--n-padding-vertical); - padding-bottom: var(--n-padding-vertical); - word-break: break-word; - display: inline-block; - vertical-align: bottom; - box-sizing: border-box; - line-height: var(--n-line-height-textarea); - margin: 0; - resize: none; - white-space: pre-wrap; - scroll-padding-block-end: var(--n-padding-vertical); - `),z("textarea-mirror",` - width: 100%; - pointer-events: none; - overflow: hidden; - visibility: hidden; - position: static; - white-space: pre-wrap; - overflow-wrap: break-word; - `)]),G("pair",[z("input-el, placeholder","text-align: center;"),z("separator",` - display: flex; - align-items: center; - transition: color .3s var(--n-bezier); - color: var(--n-text-color); - white-space: nowrap; - `,[$("icon",` - color: var(--n-icon-color); - `),$("base-icon",` - color: var(--n-icon-color); - `)])]),G("disabled",` - cursor: not-allowed; - background-color: var(--n-color-disabled); - `,[z("border","border: var(--n-border-disabled);"),z("input-el, textarea-el",` - cursor: not-allowed; - color: var(--n-text-color-disabled); - text-decoration-color: var(--n-text-color-disabled); - `),z("placeholder","color: var(--n-placeholder-color-disabled);"),z("separator","color: var(--n-text-color-disabled);",[$("icon",` - color: var(--n-icon-color-disabled); - `),$("base-icon",` - color: var(--n-icon-color-disabled); - `)]),$("input-word-count",` - color: var(--n-count-text-color-disabled); - `),z("suffix, prefix","color: var(--n-text-color-disabled);",[$("icon",` - color: var(--n-icon-color-disabled); - `),$("internal-icon",` - color: var(--n-icon-color-disabled); - `)])]),Oe("disabled",[z("eye",` - color: var(--n-icon-color); - cursor: pointer; - `,[te("&:hover",` - color: var(--n-icon-color-hover); - `),te("&:active",` - color: var(--n-icon-color-pressed); - `)]),te("&:hover",[z("state-border","border: var(--n-border-hover);")]),G("focus","background-color: var(--n-color-focus);",[z("state-border",` - border: var(--n-border-focus); - box-shadow: var(--n-box-shadow-focus); - `)])]),z("border, state-border",` - box-sizing: border-box; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - pointer-events: none; - border-radius: inherit; - border: var(--n-border); - transition: - box-shadow .3s var(--n-bezier), - border-color .3s var(--n-bezier); - `),z("state-border",` - border-color: #0000; - z-index: 1; - `),z("prefix","margin-right: 4px;"),z("suffix",` - margin-left: 4px; - `),z("suffix, prefix",` - transition: color .3s var(--n-bezier); - flex-wrap: nowrap; - flex-shrink: 0; - line-height: var(--n-height); - white-space: nowrap; - display: inline-flex; - align-items: center; - justify-content: center; - color: var(--n-suffix-text-color); - `,[$("base-loading",` - font-size: var(--n-icon-size); - margin: 0 2px; - color: var(--n-loading-color); - `),$("base-clear",` - font-size: var(--n-icon-size); - `,[z("placeholder",[$("base-icon",` - transition: color .3s var(--n-bezier); - color: var(--n-icon-color); - font-size: var(--n-icon-size); - `)])]),te(">",[$("icon",` - transition: color .3s var(--n-bezier); - color: var(--n-icon-color); - font-size: var(--n-icon-size); - `)]),$("base-icon",` - font-size: var(--n-icon-size); - `)]),$("input-word-count",` - pointer-events: none; - line-height: 1.5; - font-size: .85em; - color: var(--n-count-text-color); - transition: color .3s var(--n-bezier); - margin-left: 4px; - font-variant: tabular-nums; - `),["warning","error"].map(e=>G(`${e}-status`,[Oe("disabled",[$("base-loading",` - color: var(--n-loading-color-${e}) - `),z("input-el, textarea-el",` - caret-color: var(--n-caret-color-${e}); - `),z("state-border",` - border: var(--n-border-${e}); - `),te("&:hover",[z("state-border",` - border: var(--n-border-hover-${e}); - `)]),te("&:focus",` - background-color: var(--n-color-focus-${e}); - `,[z("state-border",` - box-shadow: var(--n-box-shadow-focus-${e}); - border: var(--n-border-focus-${e}); - `)]),G("focus",` - background-color: var(--n-color-focus-${e}); - `,[z("state-border",` - box-shadow: var(--n-box-shadow-focus-${e}); - border: var(--n-border-focus-${e}); - `)])])]))]),Fi=$("input",[G("disabled",[z("input-el, textarea-el",` - -webkit-text-fill-color: var(--n-text-color-disabled); - `)])]),Pi=Object.assign(Object.assign({},Ce.props),{bordered:{type:Boolean,default:void 0},type:{type:String,default:"text"},placeholder:[Array,String],defaultValue:{type:[String,Array],default:null},value:[String,Array],disabled:{type:Boolean,default:void 0},size:String,rows:{type:[Number,String],default:3},round:Boolean,minlength:[String,Number],maxlength:[String,Number],clearable:Boolean,autosize:{type:[Boolean,Object],default:!1},pair:Boolean,separator:String,readonly:{type:[String,Boolean],default:!1},passivelyActivated:Boolean,showPasswordOn:String,stateful:{type:Boolean,default:!0},autofocus:Boolean,inputProps:Object,resizable:{type:Boolean,default:!0},showCount:Boolean,loading:{type:Boolean,default:void 0},allowInput:Function,renderCount:Function,onMousedown:Function,onKeydown:Function,onKeyup:[Function,Array],onInput:[Function,Array],onFocus:[Function,Array],onBlur:[Function,Array],onClick:[Function,Array],onChange:[Function,Array],onClear:[Function,Array],countGraphemes:Function,status:String,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],textDecoration:[String,Array],attrSize:{type:Number,default:20},onInputBlur:[Function,Array],onInputFocus:[Function,Array],onDeactivate:[Function,Array],onActivate:[Function,Array],onWrapperFocus:[Function,Array],onWrapperBlur:[Function,Array],internalDeactivateOnEnter:Boolean,internalForceFocus:Boolean,internalLoadingBeforeSuffix:{type:Boolean,default:!0},showPasswordToggle:Boolean}),wa=be({name:"Input",props:Pi,setup(e){const{mergedClsPrefixRef:t,mergedBorderedRef:n,inlineThemeDisabled:r,mergedRtlRef:o}=ut(e),l=Ce("Input","-input",Ri,io,e,t);oo&&Hn("-input-safari",Fi,t);const i=B(null),a=B(null),c=B(null),u=B(null),s=B(null),h=B(null),w=B(null),p=Si(w),g=B(null),{localeRef:y}=fn("Input"),A=B(e.defaultValue),b=ge(e,"value"),M=en(b,A),F=Gn(e),{mergedSizeRef:x,mergedDisabledRef:k,mergedStatusRef:L}=F,N=B(!1),D=B(!1),q=B(!1),j=B(!1);let S=null;const P=I(()=>{const{placeholder:d,pair:m}=e;return m?Array.isArray(d)?d:d===void 0?["",""]:[d,d]:d===void 0?[y.value.placeholder]:[d]}),_=I(()=>{const{value:d}=q,{value:m}=M,{value:V}=P;return!d&&(zt(m)||Array.isArray(m)&&zt(m[0]))&&V[0]}),Y=I(()=>{const{value:d}=q,{value:m}=M,{value:V}=P;return!d&&V[1]&&(zt(m)||Array.isArray(m)&&zt(m[1]))}),W=st(()=>e.internalForceFocus||N.value),K=st(()=>{if(k.value||e.readonly||!e.clearable||!W.value&&!D.value)return!1;const{value:d}=M,{value:m}=W;return e.pair?!!(Array.isArray(d)&&(d[0]||d[1]))&&(D.value||m):!!d&&(D.value||m)}),H=I(()=>{const{showPasswordOn:d}=e;if(d)return d;if(e.showPasswordToggle)return"click"}),X=B(!1),C=I(()=>{const{textDecoration:d}=e;return d?Array.isArray(d)?d.map(m=>({textDecoration:m})):[{textDecoration:d}]:["",""]}),O=B(void 0),Z=()=>{var d,m;if(e.type==="textarea"){const{autosize:V}=e;if(V&&(O.value=(m=(d=g.value)===null||d===void 0?void 0:d.$el)===null||m===void 0?void 0:m.offsetWidth),!a.value||typeof V=="boolean")return;const{paddingTop:ce,paddingBottom:ve,lineHeight:se}=window.getComputedStyle(a.value),Ee=Number(ce.slice(0,-2)),Be=Number(ve.slice(0,-2)),Le=Number(se.slice(0,-2)),{value:Ue}=c;if(!Ue)return;if(V.minRows){const Ge=Math.max(V.minRows,1),mt=`${Ee+Be+Le*Ge}px`;Ue.style.minHeight=mt}if(V.maxRows){const Ge=`${Ee+Be+Le*V.maxRows}px`;Ue.style.maxHeight=Ge}}},ae=I(()=>{const{maxlength:d}=e;return d===void 0?void 0:Number(d)});Xe(()=>{const{value:d}=M;Array.isArray(d)||he(d)});const me=Vn().proxy;function xe(d){const{onUpdateValue:m,"onUpdate:value":V,onInput:ce}=e,{nTriggerFormInput:ve}=F;m&&de(m,d),V&&de(V,d),ce&&de(ce,d),A.value=d,ve()}function fe(d){const{onChange:m}=e,{nTriggerFormChange:V}=F;m&&de(m,d),A.value=d,V()}function pe(d){const{onBlur:m}=e,{nTriggerFormBlur:V}=F;m&&de(m,d),V()}function oe(d){const{onFocus:m}=e,{nTriggerFormFocus:V}=F;m&&de(m,d),V()}function le(d){const{onClear:m}=e;m&&de(m,d)}function ye(d){const{onInputBlur:m}=e;m&&de(m,d)}function Pe(d){const{onInputFocus:m}=e;m&&de(m,d)}function ke(){const{onDeactivate:d}=e;d&&de(d)}function $e(){const{onActivate:d}=e;d&&de(d)}function Re(d){const{onClick:m}=e;m&&de(m,d)}function Ae(d){const{onWrapperFocus:m}=e;m&&de(m,d)}function We(d){const{onWrapperBlur:m}=e;m&&de(m,d)}function Ke(){q.value=!0}function He(d){q.value=!1,d.target===h.value?_e(d,1):_e(d,0)}function _e(d,m=0,V="input"){const ce=d.target.value;if(he(ce),d instanceof InputEvent&&!d.isComposing&&(q.value=!1),e.type==="textarea"){const{value:se}=g;se&&se.syncUnifiedContainer()}if(S=ce,q.value)return;p.recordCursor();const ve=je(ce);if(ve)if(!e.pair)V==="input"?xe(ce):fe(ce);else{let{value:se}=M;Array.isArray(se)?se=[se[0],se[1]]:se=["",""],se[m]=ce,V==="input"?xe(se):fe(se)}me.$forceUpdate(),ve||xt(p.restoreCursor)}function je(d){const{countGraphemes:m,maxlength:V,minlength:ce}=e;if(m){let se;if(V!==void 0&&(se===void 0&&(se=m(d)),se>Number(V))||ce!==void 0&&(se===void 0&&(se=m(d)),se{ce.preventDefault(),mn("mouseup",document,m)};if(bn("mouseup",document,m),H.value!=="mousedown")return;X.value=!0;const V=()=>{X.value=!1,mn("mouseup",document,V)};bn("mouseup",document,V)}function bt(d){e.onKeyup&&de(e.onKeyup,d)}function nt(d){switch(e.onKeydown&&de(e.onKeydown,d),d.key){case"Escape":v();break;case"Enter":Me(d);break}}function Me(d){var m,V;if(e.passivelyActivated){const{value:ce}=j;if(ce){e.internalDeactivateOnEnter&&v();return}d.preventDefault(),e.type==="textarea"?(m=a.value)===null||m===void 0||m.focus():(V=s.value)===null||V===void 0||V.focus()}}function v(){e.passivelyActivated&&(j.value=!1,xt(()=>{var d;(d=i.value)===null||d===void 0||d.focus()}))}function T(){var d,m,V;k.value||(e.passivelyActivated?(d=i.value)===null||d===void 0||d.focus():((m=a.value)===null||m===void 0||m.focus(),(V=s.value)===null||V===void 0||V.focus()))}function U(){var d;!((d=i.value)===null||d===void 0)&&d.contains(document.activeElement)&&document.activeElement.blur()}function re(){var d,m;(d=a.value)===null||d===void 0||d.select(),(m=s.value)===null||m===void 0||m.select()}function Q(){k.value||(a.value?a.value.focus():s.value&&s.value.focus())}function J(){const{value:d}=i;d!=null&&d.contains(document.activeElement)&&d!==document.activeElement&&v()}function ee(d){if(e.type==="textarea"){const{value:m}=a;m==null||m.scrollTo(d)}else{const{value:m}=s;m==null||m.scrollTo(d)}}function he(d){const{type:m,pair:V,autosize:ce}=e;if(!V&&ce)if(m==="textarea"){const{value:ve}=c;ve&&(ve.textContent=(d??"")+`\r -`)}else{const{value:ve}=u;ve&&(d?ve.textContent=d:ve.innerHTML=" ")}}function ze(){Z()}const rt=B({top:"0"});function Bt(d){var m;const{scrollTop:V}=d.target;rt.value.top=`${-V}px`,(m=g.value)===null||m===void 0||m.syncUnifiedContainer()}let ot=null;Qt(()=>{const{autosize:d,type:m}=e;d&&m==="textarea"?ot=Te(M,V=>{!Array.isArray(V)&&V!==S&&he(V)}):ot==null||ot()});let it=null;Qt(()=>{e.type==="textarea"?it=Te(M,d=>{var m;!Array.isArray(d)&&d!==S&&((m=g.value)===null||m===void 0||m.syncUnifiedContainer())}):it==null||it()}),Ze(rr,{mergedValueRef:M,maxlengthRef:ae,mergedClsPrefixRef:t,countGraphemesRef:ge(e,"countGraphemes")});const Lt={wrapperElRef:i,inputElRef:s,textareaElRef:a,isCompositing:q,focus:T,blur:U,select:re,deactivate:J,activate:Q,scrollTo:ee},Nt=Kn("Input",o,t),Rt=I(()=>{const{value:d}=x,{common:{cubicBezierEaseInOut:m},self:{color:V,borderRadius:ce,textColor:ve,caretColor:se,caretColorError:Ee,caretColorWarning:Be,textDecorationColor:Le,border:Ue,borderDisabled:Ge,borderHover:mt,borderFocus:Vt,placeholderColor:Dt,placeholderColorDisabled:ar,lineHeightTextarea:lr,colorDisabled:sr,colorFocus:dr,textColorDisabled:cr,boxShadowFocus:ur,iconSize:fr,colorFocusWarning:hr,boxShadowFocusWarning:vr,borderWarning:gr,borderFocusWarning:pr,borderHoverWarning:br,colorFocusError:mr,boxShadowFocusError:yr,borderError:wr,borderFocusError:xr,borderHoverError:Cr,clearSize:kr,clearColor:Sr,clearColorHover:Rr,clearColorPressed:Fr,iconColor:Pr,iconColorDisabled:zr,suffixTextColor:Or,countTextColor:_r,countTextColorDisabled:Tr,iconColorHover:Ar,iconColorPressed:Mr,loadingColor:$r,loadingColorError:Ir,loadingColorWarning:Er,[ie("padding",d)]:Br,[ie("fontSize",d)]:Lr,[ie("height",d)]:Nr}}=l.value,{left:Vr,right:Dr}=_t(Br);return{"--n-bezier":m,"--n-count-text-color":_r,"--n-count-text-color-disabled":Tr,"--n-color":V,"--n-font-size":Lr,"--n-border-radius":ce,"--n-height":Nr,"--n-padding-left":Vr,"--n-padding-right":Dr,"--n-text-color":ve,"--n-caret-color":se,"--n-text-decoration-color":Le,"--n-border":Ue,"--n-border-disabled":Ge,"--n-border-hover":mt,"--n-border-focus":Vt,"--n-placeholder-color":Dt,"--n-placeholder-color-disabled":ar,"--n-icon-size":fr,"--n-line-height-textarea":lr,"--n-color-disabled":sr,"--n-color-focus":dr,"--n-text-color-disabled":cr,"--n-box-shadow-focus":ur,"--n-loading-color":$r,"--n-caret-color-warning":Be,"--n-color-focus-warning":hr,"--n-box-shadow-focus-warning":vr,"--n-border-warning":gr,"--n-border-focus-warning":pr,"--n-border-hover-warning":br,"--n-loading-color-warning":Er,"--n-caret-color-error":Ee,"--n-color-focus-error":mr,"--n-box-shadow-focus-error":yr,"--n-border-error":wr,"--n-border-focus-error":xr,"--n-border-hover-error":Cr,"--n-loading-color-error":Ir,"--n-clear-color":Sr,"--n-clear-size":kr,"--n-clear-color-hover":Rr,"--n-clear-color-pressed":Fr,"--n-icon-color":Pr,"--n-icon-color-hover":Ar,"--n-icon-color-pressed":Mr,"--n-icon-color-disabled":zr,"--n-suffix-text-color":Or}}),qe=r?Je("input",I(()=>{const{value:d}=x;return d[0]}),Rt,e):void 0;return Object.assign(Object.assign({},Lt),{wrapperElRef:i,inputElRef:s,inputMirrorElRef:u,inputEl2Ref:h,textareaElRef:a,textareaMirrorElRef:c,textareaScrollbarInstRef:g,rtlEnabled:Nt,uncontrolledValue:A,mergedValue:M,passwordVisible:X,mergedPlaceholder:P,showPlaceholder1:_,showPlaceholder2:Y,mergedFocus:W,isComposing:q,activated:j,showClearButton:K,mergedSize:x,mergedDisabled:k,textDecorationStyle:C,mergedClsPrefix:t,mergedBordered:n,mergedShowPasswordOn:H,placeholderStyle:rt,mergedStatus:L,textAreaScrollContainerWidth:O,handleTextAreaScroll:Bt,handleCompositionStart:Ke,handleCompositionEnd:He,handleInput:_e,handleInputBlur:Se,handleInputFocus:R,handleWrapperBlur:E,handleWrapperFocus:ue,handleMouseEnter:Qe,handleMouseLeave:et,handleMouseDown:gt,handleChange:ft,handleClick:ht,handleClear:vt,handlePasswordToggleClick:tt,handlePasswordToggleMousedown:pt,handleWrapperKeydown:nt,handleWrapperKeyup:bt,handleTextAreaMirrorResize:ze,getTextareaScrollContainer:()=>a.value,mergedTheme:l,cssVars:r?void 0:Rt,themeClass:qe==null?void 0:qe.themeClass,onRender:qe==null?void 0:qe.onRender})},render(){var e,t;const{mergedClsPrefix:n,mergedStatus:r,themeClass:o,type:l,countGraphemes:i,onRender:a}=this,c=this.$slots;return a==null||a(),f("div",{ref:"wrapperElRef",class:[`${n}-input`,o,r&&`${n}-input--${r}-status`,{[`${n}-input--rtl`]:this.rtlEnabled,[`${n}-input--disabled`]:this.mergedDisabled,[`${n}-input--textarea`]:l==="textarea",[`${n}-input--resizable`]:this.resizable&&!this.autosize,[`${n}-input--autosize`]:this.autosize,[`${n}-input--round`]:this.round&&l!=="textarea",[`${n}-input--pair`]:this.pair,[`${n}-input--focus`]:this.mergedFocus,[`${n}-input--stateful`]:this.stateful}],style:this.cssVars,tabindex:!this.mergedDisabled&&this.passivelyActivated&&!this.activated?0:void 0,onFocus:this.handleWrapperFocus,onBlur:this.handleWrapperBlur,onClick:this.handleClick,onMousedown:this.handleMouseDown,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onCompositionstart:this.handleCompositionStart,onCompositionend:this.handleCompositionEnd,onKeyup:this.handleWrapperKeyup,onKeydown:this.handleWrapperKeydown},f("div",{class:`${n}-input-wrapper`},Ve(c.prefix,u=>u&&f("div",{class:`${n}-input__prefix`},u)),l==="textarea"?f(Wn,{ref:"textareaScrollbarInstRef",class:`${n}-input__textarea`,container:this.getTextareaScrollContainer,triggerDisplayManually:!0,useUnifiedContainer:!0,internalHoistYRail:!0},{default:()=>{var u,s;const{textAreaScrollContainerWidth:h}=this,w={width:this.autosize&&h&&`${h}px`};return f(Un,null,f("textarea",Object.assign({},this.inputProps,{ref:"textareaElRef",class:[`${n}-input__textarea-el`,(u=this.inputProps)===null||u===void 0?void 0:u.class],autofocus:this.autofocus,rows:Number(this.rows),placeholder:this.placeholder,value:this.mergedValue,disabled:this.mergedDisabled,maxlength:i?void 0:this.maxlength,minlength:i?void 0:this.minlength,readonly:this.readonly,tabindex:this.passivelyActivated&&!this.activated?-1:void 0,style:[this.textDecorationStyle[0],(s=this.inputProps)===null||s===void 0?void 0:s.style,w],onBlur:this.handleInputBlur,onFocus:p=>{this.handleInputFocus(p,2)},onInput:this.handleInput,onChange:this.handleChange,onScroll:this.handleTextAreaScroll})),this.showPlaceholder1?f("div",{class:`${n}-input__placeholder`,style:[this.placeholderStyle,w],key:"placeholder"},this.mergedPlaceholder[0]):null,this.autosize?f(Jt,{onResize:this.handleTextAreaMirrorResize},{default:()=>f("div",{ref:"textareaMirrorElRef",class:`${n}-input__textarea-mirror`,key:"mirror"})}):null)}}):f("div",{class:`${n}-input__input`},f("input",Object.assign({type:l==="password"&&this.mergedShowPasswordOn&&this.passwordVisible?"text":l},this.inputProps,{ref:"inputElRef",class:[`${n}-input__input-el`,(e=this.inputProps)===null||e===void 0?void 0:e.class],style:[this.textDecorationStyle[0],(t=this.inputProps)===null||t===void 0?void 0:t.style],tabindex:this.passivelyActivated&&!this.activated?-1:void 0,placeholder:this.mergedPlaceholder[0],disabled:this.mergedDisabled,maxlength:i?void 0:this.maxlength,minlength:i?void 0:this.minlength,value:Array.isArray(this.mergedValue)?this.mergedValue[0]:this.mergedValue,readonly:this.readonly,autofocus:this.autofocus,size:this.attrSize,onBlur:this.handleInputBlur,onFocus:u=>{this.handleInputFocus(u,0)},onInput:u=>{this.handleInput(u,0)},onChange:u=>{this.handleChange(u,0)}})),this.showPlaceholder1?f("div",{class:`${n}-input__placeholder`},f("span",null,this.mergedPlaceholder[0])):null,this.autosize?f("div",{class:`${n}-input__input-mirror`,key:"mirror",ref:"inputMirrorElRef"}," "):null),!this.pair&&Ve(c.suffix,u=>u||this.clearable||this.showCount||this.mergedShowPasswordOn||this.loading!==void 0?f("div",{class:`${n}-input__suffix`},[Ve(c["clear-icon-placeholder"],s=>(this.clearable||s)&&f(rn,{clsPrefix:n,show:this.showClearButton,onClear:this.handleClear},{placeholder:()=>s,icon:()=>{var h,w;return(w=(h=this.$slots)["clear-icon"])===null||w===void 0?void 0:w.call(h)}})),this.internalLoadingBeforeSuffix?null:u,this.loading!==void 0?f(tr,{clsPrefix:n,loading:this.loading,showArrow:!1,showClear:!1,style:this.cssVars}):null,this.internalLoadingBeforeSuffix?u:null,this.showCount&&this.type!=="textarea"?f(Tn,null,{default:s=>{var h;return(h=c.count)===null||h===void 0?void 0:h.call(c,s)}}):null,this.mergedShowPasswordOn&&this.type==="password"?f("div",{class:`${n}-input__eye`,onMousedown:this.handlePasswordToggleMousedown,onClick:this.handlePasswordToggleClick},this.passwordVisible?dt(c["password-visible-icon"],()=>[f(ct,{clsPrefix:n},{default:()=>f(_o,null)})]):dt(c["password-invisible-icon"],()=>[f(ct,{clsPrefix:n},{default:()=>f(To,null)})])):null]):null)),this.pair?f("span",{class:`${n}-input__separator`},dt(c.separator,()=>[this.separator])):null,this.pair?f("div",{class:`${n}-input-wrapper`},f("div",{class:`${n}-input__input`},f("input",{ref:"inputEl2Ref",type:this.type,class:`${n}-input__input-el`,tabindex:this.passivelyActivated&&!this.activated?-1:void 0,placeholder:this.mergedPlaceholder[1],disabled:this.mergedDisabled,maxlength:i?void 0:this.maxlength,minlength:i?void 0:this.minlength,value:Array.isArray(this.mergedValue)?this.mergedValue[1]:void 0,readonly:this.readonly,style:this.textDecorationStyle[1],onBlur:this.handleInputBlur,onFocus:u=>{this.handleInputFocus(u,1)},onInput:u=>{this.handleInput(u,1)},onChange:u=>{this.handleChange(u,1)}}),this.showPlaceholder2?f("div",{class:`${n}-input__placeholder`},f("span",null,this.mergedPlaceholder[1])):null),Ve(c.suffix,u=>(this.clearable||u)&&f("div",{class:`${n}-input__suffix`},[this.clearable&&f(rn,{clsPrefix:n,show:this.showClearButton,onClear:this.handleClear},{icon:()=>{var s;return(s=c["clear-icon"])===null||s===void 0?void 0:s.call(c)},placeholder:()=>{var s;return(s=c["clear-icon-placeholder"])===null||s===void 0?void 0:s.call(c)}}),u]))):null,this.mergedBordered?f("div",{class:`${n}-input__border`}):null,this.mergedBordered?f("div",{class:`${n}-input__state-border`}):null,this.showCount&&l==="textarea"?f(Tn,null,{default:u=>{var s;const{renderCount:h}=this;return h?h(u):(s=c.count)===null||s===void 0?void 0:s.call(c,u)}}):null)}}),zi=te([$("select",` - z-index: auto; - outline: none; - width: 100%; - position: relative; - `),$("select-menu",` - margin: 4px 0; - box-shadow: var(--n-menu-box-shadow); - `,[jn({originalTransition:"background-color .3s var(--n-bezier), box-shadow .3s var(--n-bezier)"})])]),Oi=Object.assign(Object.assign({},Ce.props),{to:tn.propTo,bordered:{type:Boolean,default:void 0},clearable:Boolean,clearFilterAfterSelect:{type:Boolean,default:!0},options:{type:Array,default:()=>[]},defaultValue:{type:[String,Number,Array],default:null},keyboard:{type:Boolean,default:!0},value:[String,Number,Array],placeholder:String,menuProps:Object,multiple:Boolean,size:String,filterable:Boolean,disabled:{type:Boolean,default:void 0},remote:Boolean,loading:Boolean,filter:Function,placement:{type:String,default:"bottom-start"},widthMode:{type:String,default:"trigger"},tag:Boolean,onCreate:Function,fallbackOption:{type:[Function,Boolean],default:void 0},show:{type:Boolean,default:void 0},showArrow:{type:Boolean,default:!0},maxTagCount:[Number,String],consistentMenuWidth:{type:Boolean,default:!0},virtualScroll:{type:Boolean,default:!0},labelField:{type:String,default:"label"},valueField:{type:String,default:"value"},childrenField:{type:String,default:"children"},renderLabel:Function,renderOption:Function,renderTag:Function,"onUpdate:value":[Function,Array],inputProps:Object,nodeProps:Function,ignoreComposition:{type:Boolean,default:!0},showOnFocus:Boolean,onUpdateValue:[Function,Array],onBlur:[Function,Array],onClear:[Function,Array],onFocus:[Function,Array],onScroll:[Function,Array],onSearch:[Function,Array],onUpdateShow:[Function,Array],"onUpdate:show":[Function,Array],displayDirective:{type:String,default:"show"},resetMenuOnOptionsChange:{type:Boolean,default:!0},status:String,showCheckmark:{type:Boolean,default:!0},onChange:[Function,Array],items:Array}),xa=be({name:"Select",props:Oi,setup(e){const{mergedClsPrefixRef:t,mergedBorderedRef:n,namespaceRef:r,inlineThemeDisabled:o}=ut(e),l=Ce("Select","-select",zi,co,e,t),i=B(e.defaultValue),a=ge(e,"value"),c=en(a,i),u=B(!1),s=B(""),h=I(()=>{const{valueField:v,childrenField:T}=e,U=wi(v,T);return ai(P.value,U)}),w=I(()=>Ci(j.value,e.valueField,e.childrenField)),p=B(!1),g=en(ge(e,"show"),p),y=B(null),A=B(null),b=B(null),{localeRef:M}=fn("Select"),F=I(()=>{var v;return(v=e.placeholder)!==null&&v!==void 0?v:M.value.placeholder}),x=mo(e,["items","options"]),k=[],L=B([]),N=B([]),D=B(new Map),q=I(()=>{const{fallbackOption:v}=e;if(v===void 0){const{labelField:T,valueField:U}=e;return re=>({[T]:String(re),[U]:re})}return v===!1?!1:T=>Object.assign(v(T),{value:T})}),j=I(()=>N.value.concat(L.value).concat(x.value)),S=I(()=>{const{filter:v}=e;if(v)return v;const{labelField:T,valueField:U}=e;return(re,Q)=>{if(!Q)return!1;const J=Q[T];if(typeof J=="string")return Yt(re,J);const ee=Q[U];return typeof ee=="string"?Yt(re,ee):typeof ee=="number"?Yt(re,String(ee)):!1}}),P=I(()=>{if(e.remote)return x.value;{const{value:v}=j,{value:T}=s;return!T.length||!e.filterable?v:xi(v,S.value,T,e.childrenField)}});function _(v){const T=e.remote,{value:U}=D,{value:re}=w,{value:Q}=q,J=[];return v.forEach(ee=>{if(re.has(ee))J.push(re.get(ee));else if(T&&U.has(ee))J.push(U.get(ee));else if(Q){const he=Q(ee);he&&J.push(he)}}),J}const Y=I(()=>{if(e.multiple){const{value:v}=c;return Array.isArray(v)?_(v):[]}return null}),W=I(()=>{const{value:v}=c;return!e.multiple&&!Array.isArray(v)?v===null?null:_([v])[0]||null:null}),K=Gn(e),{mergedSizeRef:H,mergedDisabledRef:X,mergedStatusRef:C}=K;function O(v,T){const{onChange:U,"onUpdate:value":re,onUpdateValue:Q}=e,{nTriggerFormChange:J,nTriggerFormInput:ee}=K;U&&de(U,v,T),Q&&de(Q,v,T),re&&de(re,v,T),i.value=v,J(),ee()}function Z(v){const{onBlur:T}=e,{nTriggerFormBlur:U}=K;T&&de(T,v),U()}function ae(){const{onClear:v}=e;v&&de(v)}function me(v){const{onFocus:T,showOnFocus:U}=e,{nTriggerFormFocus:re}=K;T&&de(T,v),re(),U&&le()}function xe(v){const{onSearch:T}=e;T&&de(T,v)}function fe(v){const{onScroll:T}=e;T&&de(T,v)}function pe(){var v;const{remote:T,multiple:U}=e;if(T){const{value:re}=D;if(U){const{valueField:Q}=e;(v=Y.value)===null||v===void 0||v.forEach(J=>{re.set(J[Q],J)})}else{const Q=W.value;Q&&re.set(Q[e.valueField],Q)}}}function oe(v){const{onUpdateShow:T,"onUpdate:show":U}=e;T&&de(T,v),U&&de(U,v),p.value=v}function le(){X.value||(oe(!0),p.value=!0,e.filterable&&tt())}function ye(){oe(!1)}function Pe(){s.value="",N.value=k}const ke=B(!1);function $e(){e.filterable&&(ke.value=!0)}function Re(){e.filterable&&(ke.value=!1,g.value||Pe())}function Ae(){X.value||(g.value?e.filterable?tt():ye():le())}function We(v){var T,U;!((U=(T=b.value)===null||T===void 0?void 0:T.selfRef)===null||U===void 0)&&U.contains(v.relatedTarget)||(u.value=!1,Z(v),ye())}function Ke(v){me(v),u.value=!0}function He(v){u.value=!0}function _e(v){var T;!((T=y.value)===null||T===void 0)&&T.$el.contains(v.relatedTarget)||(u.value=!1,Z(v),ye())}function je(){var v;(v=y.value)===null||v===void 0||v.focus(),ye()}function Se(v){var T;g.value&&(!((T=y.value)===null||T===void 0)&&T.$el.contains(uo(v))||ye())}function R(v){if(!Array.isArray(v))return[];if(q.value)return Array.from(v);{const{remote:T}=e,{value:U}=w;if(T){const{value:re}=D;return v.filter(Q=>U.has(Q)||re.has(Q))}else return v.filter(re=>U.has(re))}}function E(v){ue(v.rawNode)}function ue(v){if(X.value)return;const{tag:T,remote:U,clearFilterAfterSelect:re,valueField:Q}=e;if(T&&!U){const{value:J}=N,ee=J[0]||null;if(ee){const he=L.value;he.length?he.push(ee):L.value=[ee],N.value=k}}if(U&&D.value.set(v[Q],v),e.multiple){const J=R(c.value),ee=J.findIndex(he=>he===v[Q]);if(~ee){if(J.splice(ee,1),T&&!U){const he=Ie(v[Q]);~he&&(L.value.splice(he,1),re&&(s.value=""))}}else J.push(v[Q]),re&&(s.value="");O(J,_(J))}else{if(T&&!U){const J=Ie(v[Q]);~J?L.value=[L.value[J]]:L.value=k}et(),ye(),O(v[Q],v)}}function Ie(v){return L.value.findIndex(U=>U[e.valueField]===v)}function ft(v){g.value||le();const{value:T}=v.target;s.value=T;const{tag:U,remote:re}=e;if(xe(T),U&&!re){if(!T){N.value=k;return}const{onCreate:Q}=e,J=Q?Q(T):{[e.labelField]:T,[e.valueField]:T},{valueField:ee,labelField:he}=e;x.value.some(ze=>ze[ee]===J[ee]||ze[he]===J[he])||L.value.some(ze=>ze[ee]===J[ee]||ze[he]===J[he])?N.value=k:N.value=[J]}}function ht(v){v.stopPropagation();const{multiple:T}=e;!T&&e.filterable&&ye(),ae(),T?O([],[]):O(null,null)}function vt(v){!Mt(v,"action")&&!Mt(v,"empty")&&v.preventDefault()}function gt(v){fe(v)}function Qe(v){var T,U,re,Q,J;if(!e.keyboard){v.preventDefault();return}switch(v.key){case" ":if(e.filterable)break;v.preventDefault();case"Enter":if(!(!((T=y.value)===null||T===void 0)&&T.isComposing)){if(g.value){const ee=(U=b.value)===null||U===void 0?void 0:U.getPendingTmNode();ee?E(ee):e.filterable||(ye(),et())}else if(le(),e.tag&&ke.value){const ee=N.value[0];if(ee){const he=ee[e.valueField],{value:ze}=c;e.multiple&&Array.isArray(ze)&&ze.some(rt=>rt===he)||ue(ee)}}}v.preventDefault();break;case"ArrowUp":if(v.preventDefault(),e.loading)return;g.value&&((re=b.value)===null||re===void 0||re.prev());break;case"ArrowDown":if(v.preventDefault(),e.loading)return;g.value?(Q=b.value)===null||Q===void 0||Q.next():le();break;case"Escape":g.value&&(fo(v),ye()),(J=y.value)===null||J===void 0||J.focus();break}}function et(){var v;(v=y.value)===null||v===void 0||v.focus()}function tt(){var v;(v=y.value)===null||v===void 0||v.focusInput()}function pt(){var v;g.value&&((v=A.value)===null||v===void 0||v.syncPosition())}pe(),Te(ge(e,"options"),pe);const bt={focus:()=>{var v;(v=y.value)===null||v===void 0||v.focus()},focusInput:()=>{var v;(v=y.value)===null||v===void 0||v.focusInput()},blur:()=>{var v;(v=y.value)===null||v===void 0||v.blur()},blurInput:()=>{var v;(v=y.value)===null||v===void 0||v.blurInput()}},nt=I(()=>{const{self:{menuBoxShadow:v}}=l.value;return{"--n-menu-box-shadow":v}}),Me=o?Je("select",void 0,nt,e):void 0;return Object.assign(Object.assign({},bt),{mergedStatus:C,mergedClsPrefix:t,mergedBordered:n,namespace:r,treeMate:h,isMounted:ao(),triggerRef:y,menuRef:b,pattern:s,uncontrolledShow:p,mergedShow:g,adjustedTo:tn(e),uncontrolledValue:i,mergedValue:c,followerRef:A,localizedPlaceholder:F,selectedOption:W,selectedOptions:Y,mergedSize:H,mergedDisabled:X,focused:u,activeWithoutMenuOpen:ke,inlineThemeDisabled:o,onTriggerInputFocus:$e,onTriggerInputBlur:Re,handleTriggerOrMenuResize:pt,handleMenuFocus:He,handleMenuBlur:_e,handleMenuTabOut:je,handleTriggerClick:Ae,handleToggle:E,handleDeleteOption:ue,handlePatternInput:ft,handleClear:ht,handleTriggerBlur:We,handleTriggerFocus:Ke,handleKeydown:Qe,handleMenuAfterLeave:Pe,handleMenuClickOutside:Se,handleMenuScroll:gt,handleMenuKeydown:Qe,handleMenuMousedown:vt,mergedTheme:l,cssVars:o?void 0:nt,themeClass:Me==null?void 0:Me.themeClass,onRender:Me==null?void 0:Me.onRender})},render(){return f("div",{class:`${this.mergedClsPrefix}-select`},f(yo,null,{default:()=>[f(wo,null,{default:()=>f(yi,{ref:"triggerRef",inlineThemeDisabled:this.inlineThemeDisabled,status:this.mergedStatus,inputProps:this.inputProps,clsPrefix:this.mergedClsPrefix,showArrow:this.showArrow,maxTagCount:this.maxTagCount,bordered:this.mergedBordered,active:this.activeWithoutMenuOpen||this.mergedShow,pattern:this.pattern,placeholder:this.localizedPlaceholder,selectedOption:this.selectedOption,selectedOptions:this.selectedOptions,multiple:this.multiple,renderTag:this.renderTag,renderLabel:this.renderLabel,filterable:this.filterable,clearable:this.clearable,disabled:this.mergedDisabled,size:this.mergedSize,theme:this.mergedTheme.peers.InternalSelection,labelField:this.labelField,valueField:this.valueField,themeOverrides:this.mergedTheme.peerOverrides.InternalSelection,loading:this.loading,focused:this.focused,onClick:this.handleTriggerClick,onDeleteOption:this.handleDeleteOption,onPatternInput:this.handlePatternInput,onClear:this.handleClear,onBlur:this.handleTriggerBlur,onFocus:this.handleTriggerFocus,onKeydown:this.handleKeydown,onPatternBlur:this.onTriggerInputBlur,onPatternFocus:this.onTriggerInputFocus,onResize:this.handleTriggerOrMenuResize,ignoreComposition:this.ignoreComposition},{arrow:()=>{var e,t;return[(t=(e=this.$slots).arrow)===null||t===void 0?void 0:t.call(e)]}})}),f(xo,{ref:"followerRef",show:this.mergedShow,to:this.adjustedTo,teleportDisabled:this.adjustedTo===tn.tdkey,containerClass:this.namespace,width:this.consistentMenuWidth?"target":void 0,minWidth:"target",placement:this.placement},{default:()=>f(un,{name:"fade-in-scale-up-transition",appear:this.isMounted,onAfterLeave:this.handleMenuAfterLeave},{default:()=>{var e,t,n;return this.mergedShow||this.displayDirective==="show"?((e=this.onRender)===null||e===void 0||e.call(this),lo(f(fi,Object.assign({},this.menuProps,{ref:"menuRef",onResize:this.handleTriggerOrMenuResize,inlineThemeDisabled:this.inlineThemeDisabled,virtualScroll:this.consistentMenuWidth&&this.virtualScroll,class:[`${this.mergedClsPrefix}-select-menu`,this.themeClass,(t=this.menuProps)===null||t===void 0?void 0:t.class],clsPrefix:this.mergedClsPrefix,focusable:!0,labelField:this.labelField,valueField:this.valueField,autoPending:!0,nodeProps:this.nodeProps,theme:this.mergedTheme.peers.InternalSelectMenu,themeOverrides:this.mergedTheme.peerOverrides.InternalSelectMenu,treeMate:this.treeMate,multiple:this.multiple,size:"medium",renderOption:this.renderOption,renderLabel:this.renderLabel,value:this.mergedValue,style:[(n=this.menuProps)===null||n===void 0?void 0:n.style,this.cssVars],onToggle:this.handleToggle,onScroll:this.handleMenuScroll,onFocus:this.handleMenuFocus,onBlur:this.handleMenuBlur,onKeydown:this.handleMenuKeydown,onTabOut:this.handleMenuTabOut,onMousedown:this.handleMenuMousedown,show:this.mergedShow,showCheckmark:this.showCheckmark,resetMenuOnOptionsChange:this.resetMenuOnOptionsChange}),{empty:()=>{var r,o;return[(o=(r=this.$slots).empty)===null||o===void 0?void 0:o.call(r)]},action:()=>{var r,o;return[(o=(r=this.$slots).action)===null||o===void 0?void 0:o.call(r)]}}),this.displayDirective==="show"?[[so,this.mergedShow],[yn,this.handleMenuClickOutside,void 0,{capture:!0}]]:[[yn,this.handleMenuClickOutside,void 0,{capture:!0}]])):null}})})]}))}}),_i=$("form",[G("inline",` - width: 100%; - display: inline-flex; - align-items: flex-start; - align-content: space-around; - `,[$("form-item",{width:"auto",marginRight:"18px"},[te("&:last-child",{marginRight:0})])])]),kt=Et("n-form"),or=Et("n-form-item-insts");var Ti=globalThis&&globalThis.__awaiter||function(e,t,n,r){function o(l){return l instanceof n?l:new n(function(i){i(l)})}return new(n||(n=Promise))(function(l,i){function a(s){try{u(r.next(s))}catch(h){i(h)}}function c(s){try{u(r.throw(s))}catch(h){i(h)}}function u(s){s.done?l(s.value):o(s.value).then(a,c)}u((r=r.apply(e,t||[])).next())})};const Ai=Object.assign(Object.assign({},Ce.props),{inline:Boolean,labelWidth:[Number,String],labelAlign:String,labelPlacement:{type:String,default:"top"},model:{type:Object,default:()=>{}},rules:Object,disabled:Boolean,size:String,showRequireMark:{type:Boolean,default:void 0},requireMarkPlacement:String,showFeedback:{type:Boolean,default:!0},onSubmit:{type:Function,default:e=>{e.preventDefault()}},showLabel:{type:Boolean,default:void 0},validateMessages:Object}),Ca=be({name:"Form",props:Ai,setup(e){const{mergedClsPrefixRef:t}=ut(e);Ce("Form","-form",_i,Yn,e,t);const n={},r=B(void 0),o=c=>{const u=r.value;(u===void 0||c>=u)&&(r.value=c)};function l(c,u=()=>!0){return Ti(this,void 0,void 0,function*(){yield new Promise((s,h)=>{const w=[];for(const p of wn(n)){const g=n[p];for(const y of g)y.path&&w.push(y.internalValidate(null,u))}Promise.all(w).then(p=>{if(p.some(g=>!g.valid)){const g=p.filter(y=>y.errors).map(y=>y.errors);c&&c(g),h(g)}else c&&c(),s()})})})}function i(){for(const c of wn(n)){const u=n[c];for(const s of u)s.restoreValidation()}}return Ze(kt,{props:e,maxChildLabelWidthRef:r,deriveMaxChildLabelWidth:o}),Ze(or,{formItems:n}),Object.assign({validate:l,restoreValidation:i},{mergedClsPrefix:t})},render(){const{mergedClsPrefix:e}=this;return f("form",{class:[`${e}-form`,this.inline&&`${e}-form--inline`],onSubmit:this.onSubmit},this.$slots)}});function Ye(){return Ye=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function At(e,t,n){return $i()?At=Reflect.construct.bind():At=function(o,l,i){var a=[null];a.push.apply(a,l);var c=Function.bind.apply(o,a),u=new c;return i&&Ct(u,i.prototype),u},At.apply(null,arguments)}function Ii(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function an(e){var t=typeof Map=="function"?new Map:void 0;return an=function(r){if(r===null||!Ii(r))return r;if(typeof r!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(r))return t.get(r);t.set(r,o)}function o(){return At(r,arguments,on(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),Ct(o,r)},an(e)}var Ei=/%[sdj%]/g,Bi=function(){};typeof process<"u"&&process.env;function ln(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var r=n.field;t[r]=t[r]||[],t[r].push(n)}),t}function Fe(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=l)return a;switch(a){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return a}});return i}return e}function Li(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function we(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||Li(t)&&typeof e=="string"&&!e)}function Ni(e,t,n){var r=[],o=0,l=e.length;function i(a){r.push.apply(r,a||[]),o++,o===l&&n(r)}e.forEach(function(a){t(a,i)})}function An(e,t,n){var r=0,o=e.length;function l(i){if(i&&i.length){n(i);return}var a=r;r=r+1,a()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},yt={integer:function(t){return yt.number(t)&&parseInt(t,10)===t},float:function(t){return yt.number(t)&&!yt.integer(t)},array:function(t){return Array.isArray(t)},regexp:function(t){if(t instanceof RegExp)return!0;try{return!!new RegExp(t)}catch{return!1}},date:function(t){return typeof t.getTime=="function"&&typeof t.getMonth=="function"&&typeof t.getYear=="function"&&!isNaN(t.getTime())},number:function(t){return isNaN(t)?!1:typeof t=="number"},object:function(t){return typeof t=="object"&&!yt.array(t)},method:function(t){return typeof t=="function"},email:function(t){return typeof t=="string"&&t.length<=320&&!!t.match(En.email)},url:function(t){return typeof t=="string"&&t.length<=2048&&!!t.match(Ki())},hex:function(t){return typeof t=="string"&&!!t.match(En.hex)}},Hi=function(t,n,r,o,l){if(t.required&&n===void 0){ir(t,n,r,o,l);return}var i=["integer","float","array","regexp","object","method","email","number","date","url","hex"],a=t.type;i.indexOf(a)>-1?yt[a](n)||o.push(Fe(l.messages.types[a],t.fullField,t.type)):a&&typeof n!==t.type&&o.push(Fe(l.messages.types[a],t.fullField,t.type))},Ui=function(t,n,r,o,l){var i=typeof t.len=="number",a=typeof t.min=="number",c=typeof t.max=="number",u=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,s=n,h=null,w=typeof n=="number",p=typeof n=="string",g=Array.isArray(n);if(w?h="number":p?h="string":g&&(h="array"),!h)return!1;g&&(s=n.length),p&&(s=n.replace(u,"_").length),i?s!==t.len&&o.push(Fe(l.messages[h].len,t.fullField,t.len)):a&&!c&&st.max?o.push(Fe(l.messages[h].max,t.fullField,t.max)):a&&c&&(st.max)&&o.push(Fe(l.messages[h].range,t.fullField,t.min,t.max))},at="enum",Gi=function(t,n,r,o,l){t[at]=Array.isArray(t[at])?t[at]:[],t[at].indexOf(n)===-1&&o.push(Fe(l.messages[at],t.fullField,t[at].join(", ")))},Yi=function(t,n,r,o,l){if(t.pattern){if(t.pattern instanceof RegExp)t.pattern.lastIndex=0,t.pattern.test(n)||o.push(Fe(l.messages.pattern.mismatch,t.fullField,n,t.pattern));else if(typeof t.pattern=="string"){var i=new RegExp(t.pattern);i.test(n)||o.push(Fe(l.messages.pattern.mismatch,t.fullField,n,t.pattern))}}},ne={required:ir,whitespace:Wi,type:Hi,range:Ui,enum:Gi,pattern:Yi},Zi=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n,"string")&&!t.required)return r();ne.required(t,n,o,i,l,"string"),we(n,"string")||(ne.type(t,n,o,i,l),ne.range(t,n,o,i,l),ne.pattern(t,n,o,i,l),t.whitespace===!0&&ne.whitespace(t,n,o,i,l))}r(i)},Xi=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&ne.type(t,n,o,i,l)}r(i)},Ji=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(n===""&&(n=void 0),we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&(ne.type(t,n,o,i,l),ne.range(t,n,o,i,l))}r(i)},Qi=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&ne.type(t,n,o,i,l)}r(i)},ea=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),we(n)||ne.type(t,n,o,i,l)}r(i)},ta=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&(ne.type(t,n,o,i,l),ne.range(t,n,o,i,l))}r(i)},na=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&(ne.type(t,n,o,i,l),ne.range(t,n,o,i,l))}r(i)},ra=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(n==null&&!t.required)return r();ne.required(t,n,o,i,l,"array"),n!=null&&(ne.type(t,n,o,i,l),ne.range(t,n,o,i,l))}r(i)},oa=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&ne.type(t,n,o,i,l)}r(i)},ia="enum",aa=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l),n!==void 0&&ne[ia](t,n,o,i,l)}r(i)},la=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n,"string")&&!t.required)return r();ne.required(t,n,o,i,l),we(n,"string")||ne.pattern(t,n,o,i,l)}r(i)},sa=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n,"date")&&!t.required)return r();if(ne.required(t,n,o,i,l),!we(n,"date")){var c;n instanceof Date?c=n:c=new Date(n),ne.type(t,c,o,i,l),c&&ne.range(t,c.getTime(),o,i,l)}}r(i)},da=function(t,n,r,o,l){var i=[],a=Array.isArray(n)?"array":typeof n;ne.required(t,n,o,i,l,a),r(i)},Zt=function(t,n,r,o,l){var i=t.type,a=[],c=t.required||!t.required&&o.hasOwnProperty(t.field);if(c){if(we(n,i)&&!t.required)return r();ne.required(t,n,o,a,l,i),we(n,i)||ne.type(t,n,o,a,l)}r(a)},ca=function(t,n,r,o,l){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(we(n)&&!t.required)return r();ne.required(t,n,o,i,l)}r(i)},wt={string:Zi,method:Xi,number:Ji,boolean:Qi,regexp:ea,integer:ta,float:na,array:ra,object:oa,enum:aa,pattern:la,date:sa,url:Zt,hex:Zt,email:Zt,required:da,any:ca};function sn(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var t=JSON.parse(JSON.stringify(this));return t.clone=this.clone,t}}}var dn=sn(),St=function(){function e(n){this.rules=null,this._messages=dn,this.define(n)}var t=e.prototype;return t.define=function(r){var o=this;if(!r)throw new Error("Cannot configure a schema with no rules");if(typeof r!="object"||Array.isArray(r))throw new Error("Rules must be an object");this.rules={},Object.keys(r).forEach(function(l){var i=r[l];o.rules[l]=Array.isArray(i)?i:[i]})},t.messages=function(r){return r&&(this._messages=In(sn(),r)),this._messages},t.validate=function(r,o,l){var i=this;o===void 0&&(o={}),l===void 0&&(l=function(){});var a=r,c=o,u=l;if(typeof c=="function"&&(u=c,c={}),!this.rules||Object.keys(this.rules).length===0)return u&&u(null,a),Promise.resolve(a);function s(y){var A=[],b={};function M(x){if(Array.isArray(x)){var k;A=(k=A).concat.apply(k,x)}else A.push(x)}for(var F=0;Fe.size!==void 0?e.size:(t==null?void 0:t.props.size)!==void 0?t.props.size:"medium")}}function fa(e){const t=De(kt,null),n=I(()=>{const{labelPlacement:p}=e;return p!==void 0?p:t!=null&&t.props.labelPlacement?t.props.labelPlacement:"top"}),r=I(()=>n.value==="left"&&(e.labelWidth==="auto"||(t==null?void 0:t.props.labelWidth)==="auto")),o=I(()=>{if(n.value==="top")return;const{labelWidth:p}=e;if(p!==void 0&&p!=="auto")return jt(p);if(r.value){const g=t==null?void 0:t.maxChildLabelWidthRef.value;return g!==void 0?jt(g):void 0}if((t==null?void 0:t.props.labelWidth)!==void 0)return jt(t.props.labelWidth)}),l=I(()=>{const{labelAlign:p}=e;if(p)return p;if(t!=null&&t.props.labelAlign)return t.props.labelAlign}),i=I(()=>{var p;return[(p=e.labelProps)===null||p===void 0?void 0:p.style,e.labelStyle,{width:o.value}]}),a=I(()=>{const{showRequireMark:p}=e;return p!==void 0?p:t==null?void 0:t.props.showRequireMark}),c=I(()=>{const{requireMarkPlacement:p}=e;return p!==void 0?p:(t==null?void 0:t.props.requireMarkPlacement)||"right"}),u=B(!1),s=I(()=>{const{validationStatus:p}=e;if(p!==void 0)return p;if(u.value)return"error"}),h=I(()=>{const{showFeedback:p}=e;return p!==void 0?p:(t==null?void 0:t.props.showFeedback)!==void 0?t.props.showFeedback:!0}),w=I(()=>{const{showLabel:p}=e;return p!==void 0?p:(t==null?void 0:t.props.showLabel)!==void 0?t.props.showLabel:!0});return{validationErrored:u,mergedLabelStyle:i,mergedLabelPlacement:n,mergedLabelAlign:l,mergedShowRequireMark:a,mergedRequireMarkPlacement:c,mergedValidationStatus:s,mergedShowFeedback:h,mergedShowLabel:w,isAutoLabelWidth:r}}function ha(e){const t=De(kt,null),n=I(()=>{const{rulePath:i}=e;if(i!==void 0)return i;const{path:a}=e;if(a!==void 0)return a}),r=I(()=>{const i=[],{rule:a}=e;if(a!==void 0&&(Array.isArray(a)?i.push(...a):i.push(a)),t){const{rules:c}=t.props,{value:u}=n;if(c!==void 0&&u!==void 0){const s=Xn(c,u);s!==void 0&&(Array.isArray(s)?i.push(...s):i.push(s))}}return i}),o=I(()=>r.value.some(i=>i.required)),l=I(()=>o.value||e.required);return{mergedRules:r,mergedRequired:l}}const{cubicBezierEaseInOut:Bn}=ho;function va({name:e="fade-down",fromOffset:t="-4px",enterDuration:n=".3s",leaveDuration:r=".3s",enterCubicBezier:o=Bn,leaveCubicBezier:l=Bn}={}){return[te(`&.${e}-transition-enter-from, &.${e}-transition-leave-to`,{opacity:0,transform:`translateY(${t})`}),te(`&.${e}-transition-enter-to, &.${e}-transition-leave-from`,{opacity:1,transform:"translateY(0)"}),te(`&.${e}-transition-leave-active`,{transition:`opacity ${r} ${l}, transform ${r} ${l}`}),te(`&.${e}-transition-enter-active`,{transition:`opacity ${n} ${o}, transform ${n} ${o}`})]}const ga=$("form-item",` - display: grid; - line-height: var(--n-line-height); -`,[$("form-item-label",` - grid-area: label; - align-items: center; - line-height: 1.25; - text-align: var(--n-label-text-align); - font-size: var(--n-label-font-size); - min-height: var(--n-label-height); - padding: var(--n-label-padding); - color: var(--n-label-text-color); - transition: color .3s var(--n-bezier); - box-sizing: border-box; - font-weight: var(--n-label-font-weight); - `,[z("asterisk",` - white-space: nowrap; - user-select: none; - -webkit-user-select: none; - color: var(--n-asterisk-color); - transition: color .3s var(--n-bezier); - `),z("asterisk-placeholder",` - grid-area: mark; - user-select: none; - -webkit-user-select: none; - visibility: hidden; - `)]),$("form-item-blank",` - grid-area: blank; - min-height: var(--n-blank-height); - `),G("auto-label-width",[$("form-item-label","white-space: nowrap;")]),G("left-labelled",` - grid-template-areas: - "label blank" - "label feedback"; - grid-template-columns: auto minmax(0, 1fr); - grid-template-rows: auto 1fr; - align-items: start; - `,[$("form-item-label",` - display: grid; - grid-template-columns: 1fr auto; - min-height: var(--n-blank-height); - height: auto; - box-sizing: border-box; - flex-shrink: 0; - flex-grow: 0; - `,[G("reverse-columns-space",` - grid-template-columns: auto 1fr; - `),G("left-mark",` - grid-template-areas: - "mark text" - ". text"; - `),G("right-mark",` - grid-template-areas: - "text mark" - "text ."; - `),G("right-hanging-mark",` - grid-template-areas: - "text mark" - "text ."; - `),z("text",` - grid-area: text; - `),z("asterisk",` - grid-area: mark; - align-self: end; - `)])]),G("top-labelled",` - grid-template-areas: - "label" - "blank" - "feedback"; - grid-template-rows: minmax(var(--n-label-height), auto) 1fr; - grid-template-columns: minmax(0, 100%); - `,[G("no-label",` - grid-template-areas: - "blank" - "feedback"; - grid-template-rows: 1fr; - `),$("form-item-label",` - display: flex; - align-items: flex-start; - justify-content: var(--n-label-text-align); - `)]),$("form-item-blank",` - box-sizing: border-box; - display: flex; - align-items: center; - position: relative; - `),$("form-item-feedback-wrapper",` - grid-area: feedback; - box-sizing: border-box; - min-height: var(--n-feedback-height); - font-size: var(--n-feedback-font-size); - line-height: 1.25; - transform-origin: top left; - `,[te("&:not(:empty)",` - padding: var(--n-feedback-padding); - `),$("form-item-feedback",{transition:"color .3s var(--n-bezier)",color:"var(--n-feedback-text-color)"},[G("warning",{color:"var(--n-feedback-text-color-warning)"}),G("error",{color:"var(--n-feedback-text-color-error)"}),va({fromOffset:"-3px",enterDuration:".3s",leaveDuration:".2s"})])])]);var Ln=globalThis&&globalThis.__awaiter||function(e,t,n,r){function o(l){return l instanceof n?l:new n(function(i){i(l)})}return new(n||(n=Promise))(function(l,i){function a(s){try{u(r.next(s))}catch(h){i(h)}}function c(s){try{u(r.throw(s))}catch(h){i(h)}}function u(s){s.done?l(s.value):o(s.value).then(a,c)}u((r=r.apply(e,t||[])).next())})};const pa=Object.assign(Object.assign({},Ce.props),{label:String,labelWidth:[Number,String],labelStyle:[String,Object],labelAlign:String,labelPlacement:String,path:String,first:Boolean,rulePath:String,required:Boolean,showRequireMark:{type:Boolean,default:void 0},requireMarkPlacement:String,showFeedback:{type:Boolean,default:void 0},rule:[Object,Array],size:String,ignorePathChange:Boolean,validationStatus:String,feedback:String,showLabel:{type:Boolean,default:void 0},labelProps:Object});function Nn(e,t){return(...n)=>{try{const r=e(...n);return!t&&(typeof r=="boolean"||r instanceof Error||Array.isArray(r))||r!=null&&r.then?r:(r===void 0||Cn("form-item/validate",`You return a ${typeof r} typed value in the validator method, which is not recommended. Please use `+(t?"`Promise`":"`boolean`, `Error` or `Promise`")+" typed value instead."),!0)}catch(r){Cn("form-item/validate","An error is catched in the validation, so the validation won't be done. Your callback in `validate` method of `n-form` or `n-form-item` won't be called in this validation."),console.error(r);return}}}const ka=be({name:"FormItem",props:pa,setup(e){ko(or,"formItems",ge(e,"path"));const{mergedClsPrefixRef:t,inlineThemeDisabled:n}=ut(e),r=De(kt,null),o=ua(e),l=fa(e),{validationErrored:i}=l,{mergedRequired:a,mergedRules:c}=ha(e),{mergedSize:u}=o,{mergedLabelPlacement:s,mergedLabelAlign:h,mergedRequireMarkPlacement:w}=l,p=B([]),g=B(xn()),y=r?ge(r.props,"disabled"):B(!1),A=Ce("Form","-form-item",ga,Yn,e,t);Te(ge(e,"path"),()=>{e.ignorePathChange||b()});function b(){p.value=[],i.value=!1,e.feedback&&(g.value=xn())}function M(){N("blur")}function F(){N("change")}function x(){N("focus")}function k(){N("input")}function L(_,Y){return Ln(this,void 0,void 0,function*(){let W,K,H,X;typeof _=="string"?(W=_,K=Y):_!==null&&typeof _=="object"&&(W=_.trigger,K=_.callback,H=_.shouldRuleBeApplied,X=_.options),yield new Promise((C,O)=>{N(W,H,X).then(({valid:Z,errors:ae})=>{Z?(K&&K(),C()):(K&&K(ae),O(ae))})})})}const N=(_=null,Y=()=>!0,W={suppressWarning:!0})=>Ln(this,void 0,void 0,function*(){const{path:K}=e;W?W.first||(W.first=e.first):W={};const{value:H}=c,X=r?Xn(r.props.model,K||""):void 0,C={},O={},Z=(_?H.filter(fe=>Array.isArray(fe.trigger)?fe.trigger.includes(_):fe.trigger===_):H).filter(Y).map((fe,pe)=>{const oe=Object.assign({},fe);if(oe.validator&&(oe.validator=Nn(oe.validator,!1)),oe.asyncValidator&&(oe.asyncValidator=Nn(oe.asyncValidator,!0)),oe.renderMessage){const le=`__renderMessage__${pe}`;O[le]=oe.message,oe.message=le,C[le]=oe.renderMessage}return oe});if(!Z.length)return{valid:!0};const ae=K??"__n_no_path__",me=new St({[ae]:Z}),{validateMessages:xe}=(r==null?void 0:r.props)||{};return xe&&me.messages(xe),yield new Promise(fe=>{me.validate({[ae]:X},W,pe=>{pe!=null&&pe.length?(p.value=pe.map(oe=>{const le=(oe==null?void 0:oe.message)||"";return{key:le,render:()=>le.startsWith("__renderMessage__")?C[le]():le}}),pe.forEach(oe=>{var le;!((le=oe.message)===null||le===void 0)&&le.startsWith("__renderMessage__")&&(oe.message=O[oe.message])}),i.value=!0,fe({valid:!1,errors:pe})):(b(),fe({valid:!0}))})})});Ze(vo,{path:ge(e,"path"),disabled:y,mergedSize:o.mergedSize,mergedValidationStatus:l.mergedValidationStatus,restoreValidation:b,handleContentBlur:M,handleContentChange:F,handleContentFocus:x,handleContentInput:k});const D={validate:L,restoreValidation:b,internalValidate:N},q=B(null);Xe(()=>{if(!l.isAutoLabelWidth.value)return;const _=q.value;if(_!==null){const Y=_.style.whiteSpace;_.style.whiteSpace="nowrap",_.style.width="",r==null||r.deriveMaxChildLabelWidth(Number(getComputedStyle(_).width.slice(0,-2))),_.style.whiteSpace=Y}});const j=I(()=>{var _;const{value:Y}=u,{value:W}=s,K=W==="top"?"vertical":"horizontal",{common:{cubicBezierEaseInOut:H},self:{labelTextColor:X,asteriskColor:C,lineHeight:O,feedbackTextColor:Z,feedbackTextColorWarning:ae,feedbackTextColorError:me,feedbackPadding:xe,labelFontWeight:fe,[ie("labelHeight",Y)]:pe,[ie("blankHeight",Y)]:oe,[ie("feedbackFontSize",Y)]:le,[ie("feedbackHeight",Y)]:ye,[ie("labelPadding",K)]:Pe,[ie("labelTextAlign",K)]:ke,[ie(ie("labelFontSize",W),Y)]:$e}}=A.value;let Re=(_=h.value)!==null&&_!==void 0?_:ke;return W==="top"&&(Re=Re==="right"?"flex-end":"flex-start"),{"--n-bezier":H,"--n-line-height":O,"--n-blank-height":oe,"--n-label-font-size":$e,"--n-label-text-align":Re,"--n-label-height":pe,"--n-label-padding":Pe,"--n-label-font-weight":fe,"--n-asterisk-color":C,"--n-label-text-color":X,"--n-feedback-padding":xe,"--n-feedback-font-size":le,"--n-feedback-height":ye,"--n-feedback-text-color":Z,"--n-feedback-text-color-warning":ae,"--n-feedback-text-color-error":me}}),S=n?Je("form-item",I(()=>{var _;return`${u.value[0]}${s.value[0]}${((_=h.value)===null||_===void 0?void 0:_[0])||""}`}),j,e):void 0,P=I(()=>s.value==="left"&&w.value==="left"&&h.value==="left");return Object.assign(Object.assign(Object.assign(Object.assign({labelElementRef:q,mergedClsPrefix:t,mergedRequired:a,feedbackId:g,renderExplains:p,reverseColSpace:P},l),o),D),{cssVars:n?void 0:j,themeClass:S==null?void 0:S.themeClass,onRender:S==null?void 0:S.onRender})},render(){const{$slots:e,mergedClsPrefix:t,mergedShowLabel:n,mergedShowRequireMark:r,mergedRequireMarkPlacement:o,onRender:l}=this,i=r!==void 0?r:this.mergedRequired;l==null||l();const a=()=>{const c=this.$slots.label?this.$slots.label():this.label;if(!c)return null;const u=f("span",{class:`${t}-form-item-label__text`},c),s=i?f("span",{class:`${t}-form-item-label__asterisk`},o!=="left"?" *":"* "):o==="right-hanging"&&f("span",{class:`${t}-form-item-label__asterisk-placeholder`}," *"),{labelProps:h}=this;return f("label",Object.assign({},h,{class:[h==null?void 0:h.class,`${t}-form-item-label`,`${t}-form-item-label--${o}-mark`,this.reverseColSpace&&`${t}-form-item-label--reverse-columns-space`],style:this.mergedLabelStyle,ref:"labelElementRef"}),o==="left"?[s,u]:[u,s])};return f("div",{class:[`${t}-form-item`,this.themeClass,`${t}-form-item--${this.mergedSize}-size`,`${t}-form-item--${this.mergedLabelPlacement}-labelled`,this.isAutoLabelWidth&&`${t}-form-item--auto-label-width`,!n&&`${t}-form-item--no-label`],style:this.cssVars},n&&a(),f("div",{class:[`${t}-form-item-blank`,this.mergedValidationStatus&&`${t}-form-item-blank--${this.mergedValidationStatus}`]},e),this.mergedShowFeedback?f("div",{key:this.feedbackId,class:`${t}-form-item-feedback-wrapper`},f(un,{name:"fade-down-transition",mode:"out-in"},{default:()=>{const{mergedValidationStatus:c}=this;return Ve(e.feedback,u=>{var s;const{feedback:h}=this,w=u||h?f("div",{key:"__feedback__",class:`${t}-form-item-feedback__line`},u||h):this.renderExplains.length?(s=this.renderExplains)===null||s===void 0?void 0:s.map(({key:p,render:g})=>f("div",{key:p,class:`${t}-form-item-feedback__line`},g())):null;return w?c==="warning"?f("div",{key:"controlled-warning",class:`${t}-form-item-feedback ${t}-form-item-feedback--warning`},w):c==="error"?f("div",{key:"controlled-error",class:`${t}-form-item-feedback ${t}-form-item-feedback--error`},w):c==="success"?f("div",{key:"controlled-success",class:`${t}-form-item-feedback ${t}-form-item-feedback--success`},w):f("div",{key:"controlled-default",class:`${t}-form-item-feedback`},w):null})}})):null)}}),Sa=["#00000000","#000000","#ffffff","#18A058","#2080F0","#F0A020","rgba(208, 48, 80, 1)","#C418D1FF"],Ra=[{label:"English",key:"en-US",value:"en-US"},{label:"简体中文",key:"zh-CN",value:"zh-CN"}];export{Mo as C,_o as E,wa as N,Po as V,ka as a,xa as b,ai as c,Ca as d,Sa as e,Gt as f,wi as g,Mt as h,fi as i,di as j,Ra as l,qt as m,pi as t,ya as u}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-36cf7848.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-36cf7848.css deleted file mode 100644 index c4e84d806..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-36cf7848.css +++ /dev/null @@ -1 +0,0 @@ -.link{color:#0059ff} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-7ae5884e.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-7ae5884e.css deleted file mode 100644 index e39c06019..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-7ae5884e.css +++ /dev/null @@ -1 +0,0 @@ -.login-container{padding:20px;display:flex;justify-content:center;align-items:center;height:100vh;background-color:#f2f6ff}.dark .login-container{background-color:#2b2b2b}@media (min-width: 600px){.login-card{width:auto;margin:0 10px}.login-button{width:100%}}.login-card{margin:20px;min-width:400px}.login-title{text-align:center;margin:20px} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-7e19b821.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-7e19b821.js deleted file mode 100644 index 57bfc417e..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-7e19b821.js +++ /dev/null @@ -1,913 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))o(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&o(a)}).observe(document,{childList:!0,subtree:!0});function r(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(n){if(n.ep)return;n.ep=!0;const i=r(n);fetch(n.href,i)}})();function Pc(e,t){const r=Object.create(null),o=e.split(",");for(let n=0;n!!r[n.toLowerCase()]:n=>!!r[n]}function kc(e){if(Pe(e)){const t={};for(let r=0;r{if(r){const o=r.split(Nv);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function Lc(e){let t="";if(nt(e))t=e;else if(Pe(e))for(let r=0;rnt(e)?e:e==null?"":Pe(e)||Ye(e)&&(e.toString===Uh||!$e(e.toString))?JSON.stringify(e,Nh,2):String(e),Nh=(e,t)=>t&&t.__v_isRef?Nh(e,t.value):Xo(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((r,[o,n])=>(r[`${o} =>`]=n,r),{})}:Wh(t)?{[`Set(${t.size})`]:[...t.values()]}:Ye(t)&&!Pe(t)&&!Vh(t)?String(t):t,Xe={},Zo=[],or=()=>{},qv=()=>!1,Gv=/^on[^a-z]/,ss=e=>Gv.test(e),$c=e=>e.startsWith("onUpdate:"),gt=Object.assign,Ic=(e,t)=>{const r=e.indexOf(t);r>-1&&e.splice(r,1)},Kv=Object.prototype.hasOwnProperty,ze=(e,t)=>Kv.call(e,t),Pe=Array.isArray,Xo=e=>ls(e)==="[object Map]",Wh=e=>ls(e)==="[object Set]",$e=e=>typeof e=="function",nt=e=>typeof e=="string",Rc=e=>typeof e=="symbol",Ye=e=>e!==null&&typeof e=="object",jh=e=>Ye(e)&&$e(e.then)&&$e(e.catch),Uh=Object.prototype.toString,ls=e=>Uh.call(e),Zv=e=>ls(e).slice(8,-1),Vh=e=>ls(e)==="[object Object]",Ac=e=>nt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Zi=Pc(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),cs=e=>{const t=Object.create(null);return r=>t[r]||(t[r]=e(r))},Xv=/-(\w)/g,vr=cs(e=>e.replace(Xv,(t,r)=>r?r.toUpperCase():"")),Yv=/\B([A-Z])/g,Ao=cs(e=>e.replace(Yv,"-$1").toLowerCase()),us=cs(e=>e.charAt(0).toUpperCase()+e.slice(1)),el=cs(e=>e?`on${us(e)}`:""),Gn=(e,t)=>!Object.is(e,t),Xi=(e,t)=>{for(let r=0;r{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})},El=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Qv=e=>{const t=nt(e)?Number(e):NaN;return isNaN(t)?e:t};let o0;const Jv=()=>o0||(o0=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let zt;class qh{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=zt,!t&&zt&&(this.index=(zt.scopes||(zt.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const r=zt;try{return zt=this,t()}finally{zt=r}}}on(){zt=this}off(){zt=this.parent}stop(t){if(this._active){let r,o;for(r=0,o=this.effects.length;r{const t=new Set(e);return t.w=0,t.n=0,t},Kh=e=>(e.w&eo)>0,Zh=e=>(e.n&eo)>0,rb=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let r=0;for(let o=0;o{(u==="length"||u>=l)&&s.push(c)})}else switch(r!==void 0&&s.push(a.get(r)),t){case"add":Pe(e)?Ac(r)&&s.push(a.get("length")):(s.push(a.get(Eo)),Xo(e)&&s.push(a.get(kl)));break;case"delete":Pe(e)||(s.push(a.get(Eo)),Xo(e)&&s.push(a.get(kl)));break;case"set":Xo(e)&&s.push(a.get(Eo));break}if(s.length===1)s[0]&&Ll(s[0]);else{const l=[];for(const c of s)c&&l.push(...c);Ll(Bc(l))}}function Ll(e,t){const r=Pe(e)?e:[...e];for(const o of r)o.computed&&i0(o);for(const o of r)o.computed||i0(o)}function i0(e,t){(e!==tr||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function nb(e,t){var r;return(r=da.get(e))===null||r===void 0?void 0:r.get(t)}const ib=Pc("__proto__,__v_isRef,__isVue"),Qh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Rc)),ab=Mc(),sb=Mc(!1,!0),lb=Mc(!0),a0=cb();function cb(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...r){const o=He(this);for(let i=0,a=this.length;i{e[t]=function(...r){cn();const o=He(this)[t].apply(this,r);return un(),o}}),e}function ub(e){const t=He(this);return Ht(t,"has",e),t.hasOwnProperty(e)}function Mc(e=!1,t=!1){return function(o,n,i){if(n==="__v_isReactive")return!e;if(n==="__v_isReadonly")return e;if(n==="__v_isShallow")return t;if(n==="__v_raw"&&i===(e?t?Eb:op:t?rp:tp).get(o))return o;const a=Pe(o);if(!e){if(a&&ze(a0,n))return Reflect.get(a0,n,i);if(n==="hasOwnProperty")return ub}const s=Reflect.get(o,n,i);return(Rc(n)?Qh.has(n):ib(n))||(e||Ht(o,"get",n),t)?s:ot(s)?a&&Ac(n)?s:s.value:Ye(s)?e?nr(s):Or(s):s}}const db=Jh(),fb=Jh(!0);function Jh(e=!1){return function(r,o,n,i){let a=r[o];if(Jo(a)&&ot(a)&&!ot(n))return!1;if(!e&&(!fa(n)&&!Jo(n)&&(a=He(a),n=He(n)),!Pe(r)&&ot(a)&&!ot(n)))return a.value=n,!0;const s=Pe(r)&&Ac(o)?Number(o)e,ds=e=>Reflect.getPrototypeOf(e);function ki(e,t,r=!1,o=!1){e=e.__v_raw;const n=He(e),i=He(t);r||(t!==i&&Ht(n,"get",t),Ht(n,"get",i));const{has:a}=ds(n),s=o?Dc:r?Nc:Kn;if(a.call(n,t))return s(e.get(t));if(a.call(n,i))return s(e.get(i));e!==n&&e.get(t)}function Li(e,t=!1){const r=this.__v_raw,o=He(r),n=He(e);return t||(e!==n&&Ht(o,"has",e),Ht(o,"has",n)),e===n?r.has(e):r.has(e)||r.has(n)}function $i(e,t=!1){return e=e.__v_raw,!t&&Ht(He(e),"iterate",Eo),Reflect.get(e,"size",e)}function s0(e){e=He(e);const t=He(this);return ds(t).has.call(t,e)||(t.add(e),Ir(t,"add",e,e)),this}function l0(e,t){t=He(t);const r=He(this),{has:o,get:n}=ds(r);let i=o.call(r,e);i||(e=He(e),i=o.call(r,e));const a=n.call(r,e);return r.set(e,t),i?Gn(t,a)&&Ir(r,"set",e,t):Ir(r,"add",e,t),this}function c0(e){const t=He(this),{has:r,get:o}=ds(t);let n=r.call(t,e);n||(e=He(e),n=r.call(t,e)),o&&o.call(t,e);const i=t.delete(e);return n&&Ir(t,"delete",e,void 0),i}function u0(){const e=He(this),t=e.size!==0,r=e.clear();return t&&Ir(e,"clear",void 0,void 0),r}function Ii(e,t){return function(o,n){const i=this,a=i.__v_raw,s=He(a),l=t?Dc:e?Nc:Kn;return!e&&Ht(s,"iterate",Eo),a.forEach((c,u)=>o.call(n,l(c),l(u),i))}}function Ri(e,t,r){return function(...o){const n=this.__v_raw,i=He(n),a=Xo(i),s=e==="entries"||e===Symbol.iterator&&a,l=e==="keys"&&a,c=n[e](...o),u=r?Dc:t?Nc:Kn;return!t&&Ht(i,"iterate",l?kl:Eo),{next(){const{value:d,done:f}=c.next();return f?{value:d,done:f}:{value:s?[u(d[0]),u(d[1])]:u(d),done:f}},[Symbol.iterator](){return this}}}}function Nr(e){return function(...t){return e==="delete"?!1:this}}function vb(){const e={get(i){return ki(this,i)},get size(){return $i(this)},has:Li,add:s0,set:l0,delete:c0,clear:u0,forEach:Ii(!1,!1)},t={get(i){return ki(this,i,!1,!0)},get size(){return $i(this)},has:Li,add:s0,set:l0,delete:c0,clear:u0,forEach:Ii(!1,!0)},r={get(i){return ki(this,i,!0)},get size(){return $i(this,!0)},has(i){return Li.call(this,i,!0)},add:Nr("add"),set:Nr("set"),delete:Nr("delete"),clear:Nr("clear"),forEach:Ii(!0,!1)},o={get(i){return ki(this,i,!0,!0)},get size(){return $i(this,!0)},has(i){return Li.call(this,i,!0)},add:Nr("add"),set:Nr("set"),delete:Nr("delete"),clear:Nr("clear"),forEach:Ii(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Ri(i,!1,!1),r[i]=Ri(i,!0,!1),t[i]=Ri(i,!1,!0),o[i]=Ri(i,!0,!0)}),[e,r,t,o]}const[bb,Cb,yb,Sb]=vb();function Fc(e,t){const r=t?e?Sb:yb:e?Cb:bb;return(o,n,i)=>n==="__v_isReactive"?!e:n==="__v_isReadonly"?e:n==="__v_raw"?o:Reflect.get(ze(r,n)&&n in o?r:o,n,i)}const wb={get:Fc(!1,!1)},_b={get:Fc(!1,!0)},Tb={get:Fc(!0,!1)},tp=new WeakMap,rp=new WeakMap,op=new WeakMap,Eb=new WeakMap;function Pb(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function kb(e){return e.__v_skip||!Object.isExtensible(e)?0:Pb(Zv(e))}function Or(e){return Jo(e)?e:zc(e,!1,ep,wb,tp)}function Lb(e){return zc(e,!1,xb,_b,rp)}function nr(e){return zc(e,!0,gb,Tb,op)}function zc(e,t,r,o,n){if(!Ye(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=n.get(e);if(i)return i;const a=kb(e);if(a===0)return e;const s=new Proxy(e,a===2?o:r);return n.set(e,s),s}function Qr(e){return Jo(e)?Qr(e.__v_raw):!!(e&&e.__v_isReactive)}function Jo(e){return!!(e&&e.__v_isReadonly)}function fa(e){return!!(e&&e.__v_isShallow)}function np(e){return Qr(e)||Jo(e)}function He(e){const t=e&&e.__v_raw;return t?He(t):e}function to(e){return ua(e,"__v_skip",!0),e}const Kn=e=>Ye(e)?Or(e):e,Nc=e=>Ye(e)?nr(e):e;function ip(e){Yr&&tr&&(e=He(e),Yh(e.dep||(e.dep=Bc())))}function ap(e,t){e=He(e);const r=e.dep;r&&Ll(r)}function ot(e){return!!(e&&e.__v_isRef===!0)}function de(e){return sp(e,!1)}function fs(e){return sp(e,!0)}function sp(e,t){return ot(e)?e:new $b(e,t)}class $b{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:He(t),this._value=r?t:Kn(t)}get value(){return ip(this),this._value}set value(t){const r=this.__v_isShallow||fa(t)||Jo(t);t=r?t:He(t),Gn(t,this._rawValue)&&(this._rawValue=t,this._value=r?t:Kn(t),ap(this))}}function pt(e){return ot(e)?e.value:e}const Ib={get:(e,t,r)=>pt(Reflect.get(e,t,r)),set:(e,t,r,o)=>{const n=e[t];return ot(n)&&!ot(r)?(n.value=r,!0):Reflect.set(e,t,r,o)}};function lp(e){return Qr(e)?e:new Proxy(e,Ib)}function Rb(e){const t=Pe(e)?new Array(e.length):{};for(const r in e)t[r]=Rr(e,r);return t}class Ab{constructor(t,r,o){this._object=t,this._key=r,this._defaultValue=o,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return nb(He(this._object),this._key)}}function Rr(e,t,r){const o=e[t];return ot(o)?o:new Ab(e,t,r)}var cp;class Ob{constructor(t,r,o,n){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this[cp]=!1,this._dirty=!0,this.effect=new Hc(t,()=>{this._dirty||(this._dirty=!0,ap(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!n,this.__v_isReadonly=o}get value(){const t=He(this);return ip(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}cp="__v_isReadonly";function Bb(e,t,r=!1){let o,n;const i=$e(e);return i?(o=e,n=or):(o=e.get,n=e.set),new Ob(o,n,i||!n,r)}function Jr(e,t,r,o){let n;try{n=o?e(...o):e()}catch(i){mi(i,t,r)}return n}function Kt(e,t,r,o){if($e(e)){const i=Jr(e,t,r,o);return i&&jh(i)&&i.catch(a=>{mi(a,t,r)}),i}const n=[];for(let i=0;i>>1;Xn(_t[o])gr&&_t.splice(t,1)}function Fb(e){Pe(e)?Yo.push(...e):(!kr||!kr.includes(e,e.allowRecurse?xo+1:xo))&&Yo.push(e),dp()}function d0(e,t=Zn?gr+1:0){for(;t<_t.length;t++){const r=_t[t];r&&r.pre&&(_t.splice(t,1),t--,r())}}function fp(e){if(Yo.length){const t=[...new Set(Yo)];if(Yo.length=0,kr){kr.push(...t);return}for(kr=t,kr.sort((r,o)=>Xn(r)-Xn(o)),xo=0;xoe.id==null?1/0:e.id,zb=(e,t)=>{const r=Xn(e)-Xn(t);if(r===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return r};function hp(e){$l=!1,Zn=!0,_t.sort(zb);const t=or;try{for(gr=0;gr<_t.length;gr++){const r=_t[gr];r&&r.active!==!1&&Jr(r,null,14)}}finally{gr=0,_t.length=0,fp(),Zn=!1,Wc=null,(_t.length||Yo.length)&&hp()}}function Nb(e,t,...r){if(e.isUnmounted)return;const o=e.vnode.props||Xe;let n=r;const i=t.startsWith("update:"),a=i&&t.slice(7);if(a&&a in o){const u=`${a==="modelValue"?"model":a}Modifiers`,{number:d,trim:f}=o[u]||Xe;f&&(n=r.map(p=>nt(p)?p.trim():p)),d&&(n=r.map(El))}let s,l=o[s=el(t)]||o[s=el(vr(t))];!l&&i&&(l=o[s=el(Ao(t))]),l&&Kt(l,e,6,n);const c=o[s+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,Kt(c,e,6,n)}}function pp(e,t,r=!1){const o=t.emitsCache,n=o.get(e);if(n!==void 0)return n;const i=e.emits;let a={},s=!1;if(!$e(e)){const l=c=>{const u=pp(c,t,!0);u&&(s=!0,gt(a,u))};!r&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!i&&!s?(Ye(e)&&o.set(e,null),null):(Pe(i)?i.forEach(l=>a[l]=null):gt(a,i),Ye(e)&&o.set(e,a),a)}function ps(e,t){return!e||!ss(t)?!1:(t=t.slice(2).replace(/Once$/,""),ze(e,t[0].toLowerCase()+t.slice(1))||ze(e,Ao(t))||ze(e,t))}let bt=null,ms=null;function ha(e){const t=bt;return bt=e,ms=e&&e.type.__scopeId||null,t}function wB(e){ms=e}function _B(){ms=null}function Co(e,t=bt,r){if(!t||e._n)return e;const o=(...n)=>{o._d&&S0(-1);const i=ha(t);let a;try{a=e(...n)}finally{ha(i),o._d&&S0(1)}return a};return o._n=!0,o._c=!0,o._d=!0,o}function tl(e){const{type:t,vnode:r,proxy:o,withProxy:n,props:i,propsOptions:[a],slots:s,attrs:l,emit:c,render:u,renderCache:d,data:f,setupState:p,ctx:h,inheritAttrs:m}=e;let v,g;const x=ha(e);try{if(r.shapeFlag&4){const b=n||o;v=pr(u.call(b,b,d,i,p,f,h)),g=l}else{const b=t;v=pr(b.length>1?b(i,{attrs:l,slots:s,emit:c}):b(i,null)),g=t.props?l:Wb(l)}}catch(b){Mn.length=0,mi(b,e,1),v=qe(Lt)}let C=v;if(g&&m!==!1){const b=Object.keys(g),{shapeFlag:w}=C;b.length&&w&7&&(a&&b.some($c)&&(g=jb(g,a)),C=Ar(C,g))}return r.dirs&&(C=Ar(C),C.dirs=C.dirs?C.dirs.concat(r.dirs):r.dirs),r.transition&&(C.transition=r.transition),v=C,ha(x),v}const Wb=e=>{let t;for(const r in e)(r==="class"||r==="style"||ss(r))&&((t||(t={}))[r]=e[r]);return t},jb=(e,t)=>{const r={};for(const o in e)(!$c(o)||!(o.slice(9)in t))&&(r[o]=e[o]);return r};function Ub(e,t,r){const{props:o,children:n,component:i}=e,{props:a,children:s,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(r&&l>=0){if(l&1024)return!0;if(l&16)return o?f0(o,a,c):!!a;if(l&8){const u=t.dynamicProps;for(let d=0;de.__isSuspense;function Gb(e,t){t&&t.pendingBranch?Pe(e)?t.effects.push(...e):t.effects.push(e):Fb(e)}function dt(e,t){if(rt){let r=rt.provides;const o=rt.parent&&rt.parent.provides;o===r&&(r=rt.provides=Object.create(o)),r[e]=t}}function Me(e,t,r=!1){const o=rt||bt;if(o){const n=o.parent==null?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides;if(n&&e in n)return n[e];if(arguments.length>1)return r&&$e(t)?t.call(o.proxy):t}}function gs(e,t){return jc(e,null,t)}const Ai={};function kt(e,t,r){return jc(e,t,r)}function jc(e,t,{immediate:r,deep:o,flush:n,onTrack:i,onTrigger:a}=Xe){const s=Gh()===(rt==null?void 0:rt.scope)?rt:null;let l,c=!1,u=!1;if(ot(e)?(l=()=>e.value,c=fa(e)):Qr(e)?(l=()=>e,o=!0):Pe(e)?(u=!0,c=e.some(C=>Qr(C)||fa(C)),l=()=>e.map(C=>{if(ot(C))return C.value;if(Qr(C))return yo(C);if($e(C))return Jr(C,s,2)})):$e(e)?t?l=()=>Jr(e,s,2):l=()=>{if(!(s&&s.isUnmounted))return d&&d(),Kt(e,s,3,[f])}:l=or,t&&o){const C=l;l=()=>yo(C())}let d,f=C=>{d=g.onStop=()=>{Jr(C,s,4)}},p;if(tn)if(f=or,t?r&&Kt(t,s,3,[l(),u?[]:void 0,f]):l(),n==="sync"){const C=B2();p=C.__watcherHandles||(C.__watcherHandles=[])}else return or;let h=u?new Array(e.length).fill(Ai):Ai;const m=()=>{if(g.active)if(t){const C=g.run();(o||c||(u?C.some((b,w)=>Gn(b,h[w])):Gn(C,h)))&&(d&&d(),Kt(t,s,3,[C,h===Ai?void 0:u&&h[0]===Ai?[]:h,f]),h=C)}else g.run()};m.allowRecurse=!!t;let v;n==="sync"?v=m:n==="post"?v=()=>Bt(m,s&&s.suspense):(m.pre=!0,s&&(m.id=s.uid),v=()=>hs(m));const g=new Hc(l,v);t?r?m():h=g.run():n==="post"?Bt(g.run.bind(g),s&&s.suspense):g.run();const x=()=>{g.stop(),s&&s.scope&&Ic(s.scope.effects,g)};return p&&p.push(x),x}function Kb(e,t,r){const o=this.proxy,n=nt(e)?e.includes(".")?mp(o,e):()=>o[e]:e.bind(o,o);let i;$e(t)?i=t:(i=t.handler,r=t);const a=rt;en(this);const s=jc(n,i.bind(o),r);return a?en(a):Po(),s}function mp(e,t){const r=t.split(".");return()=>{let o=e;for(let n=0;n{yo(r,t)});else if(Vh(e))for(const r in e)yo(e[r],t);return e}function gp(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Sr(()=>{e.isMounted=!0}),Zt(()=>{e.isUnmounting=!0}),e}const qt=[Function,Array],Zb={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:qt,onEnter:qt,onAfterEnter:qt,onEnterCancelled:qt,onBeforeLeave:qt,onLeave:qt,onAfterLeave:qt,onLeaveCancelled:qt,onBeforeAppear:qt,onAppear:qt,onAfterAppear:qt,onAppearCancelled:qt},setup(e,{slots:t}){const r=ir(),o=gp();let n;return()=>{const i=t.default&&Uc(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){for(const m of i)if(m.type!==Lt){a=m;break}}const s=He(e),{mode:l}=s;if(o.isLeaving)return rl(a);const c=h0(a);if(!c)return rl(a);const u=Yn(c,s,o,r);Qn(c,u);const d=r.subTree,f=d&&h0(d);let p=!1;const{getTransitionKey:h}=c.type;if(h){const m=h();n===void 0?n=m:m!==n&&(n=m,p=!0)}if(f&&f.type!==Lt&&(!vo(c,f)||p)){const m=Yn(f,s,o,r);if(Qn(f,m),l==="out-in")return o.isLeaving=!0,m.afterLeave=()=>{o.isLeaving=!1,r.update.active!==!1&&r.update()},rl(a);l==="in-out"&&c.type!==Lt&&(m.delayLeave=(v,g,x)=>{const C=vp(o,f);C[String(f.key)]=f,v._leaveCb=()=>{g(),v._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=x})}return a}}},xp=Zb;function vp(e,t){const{leavingVNodes:r}=e;let o=r.get(t.type);return o||(o=Object.create(null),r.set(t.type,o)),o}function Yn(e,t,r,o){const{appear:n,mode:i,persisted:a=!1,onBeforeEnter:s,onEnter:l,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:d,onLeave:f,onAfterLeave:p,onLeaveCancelled:h,onBeforeAppear:m,onAppear:v,onAfterAppear:g,onAppearCancelled:x}=t,C=String(e.key),b=vp(r,e),w=(E,I)=>{E&&Kt(E,o,9,I)},T=(E,I)=>{const P=I[1];w(E,I),Pe(E)?E.every($=>$.length<=1)&&P():E.length<=1&&P()},S={mode:i,persisted:a,beforeEnter(E){let I=s;if(!r.isMounted)if(n)I=m||s;else return;E._leaveCb&&E._leaveCb(!0);const P=b[C];P&&vo(e,P)&&P.el._leaveCb&&P.el._leaveCb(),w(I,[E])},enter(E){let I=l,P=c,$=u;if(!r.isMounted)if(n)I=v||l,P=g||c,$=x||u;else return;let R=!1;const B=E._enterCb=j=>{R||(R=!0,j?w($,[E]):w(P,[E]),S.delayedLeave&&S.delayedLeave(),E._enterCb=void 0)};I?T(I,[E,B]):B()},leave(E,I){const P=String(e.key);if(E._enterCb&&E._enterCb(!0),r.isUnmounting)return I();w(d,[E]);let $=!1;const R=E._leaveCb=B=>{$||($=!0,I(),B?w(h,[E]):w(p,[E]),E._leaveCb=void 0,b[P]===e&&delete b[P])};b[P]=e,f?T(f,[E,R]):R()},clone(E){return Yn(E,t,r,o)}};return S}function rl(e){if(gi(e))return e=Ar(e),e.children=null,e}function h0(e){return gi(e)?e.children?e.children[0]:void 0:e}function Qn(e,t){e.shapeFlag&6&&e.component?Qn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Uc(e,t=!1,r){let o=[],n=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader;function TB(e){$e(e)&&(e={loader:e});const{loader:t,loadingComponent:r,errorComponent:o,delay:n=200,timeout:i,suspensible:a=!0,onError:s}=e;let l=null,c,u=0;const d=()=>(u++,l=null,f()),f=()=>{let p;return l||(p=l=t().catch(h=>{if(h=h instanceof Error?h:new Error(String(h)),s)return new Promise((m,v)=>{s(h,()=>m(d()),()=>v(h),u+1)});throw h}).then(h=>p!==l&&l?l:(h&&(h.__esModule||h[Symbol.toStringTag]==="Module")&&(h=h.default),c=h,h)))};return Oe({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return c},setup(){const p=rt;if(c)return()=>ol(c,p);const h=x=>{l=null,mi(x,p,13,!o)};if(a&&p.suspense||tn)return f().then(x=>()=>ol(x,p)).catch(x=>(h(x),()=>o?qe(o,{error:x}):null));const m=de(!1),v=de(),g=de(!!n);return n&&setTimeout(()=>{g.value=!1},n),i!=null&&setTimeout(()=>{if(!m.value&&!v.value){const x=new Error(`Async component timed out after ${i}ms.`);h(x),v.value=x}},i),f().then(()=>{m.value=!0,p.parent&&gi(p.parent.vnode)&&hs(p.parent.update)}).catch(x=>{h(x),v.value=x}),()=>{if(m.value&&c)return ol(c,p);if(v.value&&o)return qe(o,{error:v.value});if(r&&!g.value)return qe(r)}}})}function ol(e,t){const{ref:r,props:o,children:n,ce:i}=t.vnode,a=qe(e,o,n);return a.ref=r,a.ce=i,delete t.vnode.ce,a}const gi=e=>e.type.__isKeepAlive;function bp(e,t){yp(e,"a",t)}function Cp(e,t){yp(e,"da",t)}function yp(e,t,r=rt){const o=e.__wdc||(e.__wdc=()=>{let n=r;for(;n;){if(n.isDeactivated)return;n=n.parent}return e()});if(xs(t,o,r),r){let n=r.parent;for(;n&&n.parent;)gi(n.parent.vnode)&&Xb(o,t,r,n),n=n.parent}}function Xb(e,t,r,o){const n=xs(t,e,o,!0);Vc(()=>{Ic(o[t],n)},r)}function xs(e,t,r=rt,o=!1){if(r){const n=r[e]||(r[e]=[]),i=t.__weh||(t.__weh=(...a)=>{if(r.isUnmounted)return;cn(),en(r);const s=Kt(t,r,e,a);return Po(),un(),s});return o?n.unshift(i):n.push(i),i}}const Br=e=>(t,r=rt)=>(!tn||e==="sp")&&xs(e,(...o)=>t(...o),r),Hr=Br("bm"),Sr=Br("m"),Yb=Br("bu"),Sp=Br("u"),Zt=Br("bum"),Vc=Br("um"),Qb=Br("sp"),Jb=Br("rtg"),e2=Br("rtc");function t2(e,t=rt){xs("ec",e,t)}function pa(e,t){const r=bt;if(r===null)return e;const o=Ss(r)||r.proxy,n=e.dirs||(e.dirs=[]);for(let i=0;it(a,s,void 0,i&&i[s]));else{const a=Object.keys(e);n=new Array(a.length);for(let s=0,l=a.length;sei(t)?!(t.type===Lt||t.type===Je&&!Ep(t.children)):!0)?e:null}const Il=e=>e?Dp(e)?Ss(e)||e.proxy:Il(e.parent):null,Bn=gt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Il(e.parent),$root:e=>Il(e.root),$emit:e=>e.emit,$options:e=>Gc(e),$forceUpdate:e=>e.f||(e.f=()=>hs(e.update)),$nextTick:e=>e.n||(e.n=jt.bind(e.proxy)),$watch:e=>Kb.bind(e)}),nl=(e,t)=>e!==Xe&&!e.__isScriptSetup&&ze(e,t),o2={get({_:e},t){const{ctx:r,setupState:o,data:n,props:i,accessCache:a,type:s,appContext:l}=e;let c;if(t[0]!=="$"){const p=a[t];if(p!==void 0)switch(p){case 1:return o[t];case 2:return n[t];case 4:return r[t];case 3:return i[t]}else{if(nl(o,t))return a[t]=1,o[t];if(n!==Xe&&ze(n,t))return a[t]=2,n[t];if((c=e.propsOptions[0])&&ze(c,t))return a[t]=3,i[t];if(r!==Xe&&ze(r,t))return a[t]=4,r[t];Rl&&(a[t]=0)}}const u=Bn[t];let d,f;if(u)return t==="$attrs"&&Ht(e,"get",t),u(e);if((d=s.__cssModules)&&(d=d[t]))return d;if(r!==Xe&&ze(r,t))return a[t]=4,r[t];if(f=l.config.globalProperties,ze(f,t))return f[t]},set({_:e},t,r){const{data:o,setupState:n,ctx:i}=e;return nl(n,t)?(n[t]=r,!0):o!==Xe&&ze(o,t)?(o[t]=r,!0):ze(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=r,!0)},has({_:{data:e,setupState:t,accessCache:r,ctx:o,appContext:n,propsOptions:i}},a){let s;return!!r[a]||e!==Xe&&ze(e,a)||nl(t,a)||(s=i[0])&&ze(s,a)||ze(o,a)||ze(Bn,a)||ze(n.config.globalProperties,a)},defineProperty(e,t,r){return r.get!=null?e._.accessCache[t]=0:ze(r,"value")&&this.set(e,t,r.value,null),Reflect.defineProperty(e,t,r)}};let Rl=!0;function n2(e){const t=Gc(e),r=e.proxy,o=e.ctx;Rl=!1,t.beforeCreate&&m0(t.beforeCreate,e,"bc");const{data:n,computed:i,methods:a,watch:s,provide:l,inject:c,created:u,beforeMount:d,mounted:f,beforeUpdate:p,updated:h,activated:m,deactivated:v,beforeDestroy:g,beforeUnmount:x,destroyed:C,unmounted:b,render:w,renderTracked:T,renderTriggered:S,errorCaptured:E,serverPrefetch:I,expose:P,inheritAttrs:$,components:R,directives:B,filters:j}=t;if(c&&i2(c,o,null,e.appContext.config.unwrapInjectedRef),a)for(const Q in a){const ie=a[Q];$e(ie)&&(o[Q]=ie.bind(r))}if(n){const Q=n.call(r,r);Ye(Q)&&(e.data=Or(Q))}if(Rl=!0,i)for(const Q in i){const ie=i[Q],ge=$e(ie)?ie.bind(r,r):$e(ie.get)?ie.get.bind(r,r):or,ve=!$e(ie)&&$e(ie.set)?ie.set.bind(r):or,z=ae({get:ge,set:ve});Object.defineProperty(o,Q,{enumerable:!0,configurable:!0,get:()=>z.value,set:W=>z.value=W})}if(s)for(const Q in s)Pp(s[Q],o,r,Q);if(l){const Q=$e(l)?l.call(r):l;Reflect.ownKeys(Q).forEach(ie=>{dt(ie,Q[ie])})}u&&m0(u,e,"c");function J(Q,ie){Pe(ie)?ie.forEach(ge=>Q(ge.bind(r))):ie&&Q(ie.bind(r))}if(J(Hr,d),J(Sr,f),J(Yb,p),J(Sp,h),J(bp,m),J(Cp,v),J(t2,E),J(e2,T),J(Jb,S),J(Zt,x),J(Vc,b),J(Qb,I),Pe(P))if(P.length){const Q=e.exposed||(e.exposed={});P.forEach(ie=>{Object.defineProperty(Q,ie,{get:()=>r[ie],set:ge=>r[ie]=ge})})}else e.exposed||(e.exposed={});w&&e.render===or&&(e.render=w),$!=null&&(e.inheritAttrs=$),R&&(e.components=R),B&&(e.directives=B)}function i2(e,t,r=or,o=!1){Pe(e)&&(e=Al(e));for(const n in e){const i=e[n];let a;Ye(i)?"default"in i?a=Me(i.from||n,i.default,!0):a=Me(i.from||n):a=Me(i),ot(a)&&o?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:s=>a.value=s}):t[n]=a}}function m0(e,t,r){Kt(Pe(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,r)}function Pp(e,t,r,o){const n=o.includes(".")?mp(r,o):()=>r[o];if(nt(e)){const i=t[e];$e(i)&&kt(n,i)}else if($e(e))kt(n,e.bind(r));else if(Ye(e))if(Pe(e))e.forEach(i=>Pp(i,t,r,o));else{const i=$e(e.handler)?e.handler.bind(r):t[e.handler];$e(i)&&kt(n,i,e)}}function Gc(e){const t=e.type,{mixins:r,extends:o}=t,{mixins:n,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,s=i.get(t);let l;return s?l=s:!n.length&&!r&&!o?l=t:(l={},n.length&&n.forEach(c=>ma(l,c,a,!0)),ma(l,t,a)),Ye(t)&&i.set(t,l),l}function ma(e,t,r,o=!1){const{mixins:n,extends:i}=t;i&&ma(e,i,r,!0),n&&n.forEach(a=>ma(e,a,r,!0));for(const a in t)if(!(o&&a==="expose")){const s=a2[a]||r&&r[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const a2={data:g0,props:go,emits:go,methods:go,computed:go,beforeCreate:Tt,created:Tt,beforeMount:Tt,mounted:Tt,beforeUpdate:Tt,updated:Tt,beforeDestroy:Tt,beforeUnmount:Tt,destroyed:Tt,unmounted:Tt,activated:Tt,deactivated:Tt,errorCaptured:Tt,serverPrefetch:Tt,components:go,directives:go,watch:l2,provide:g0,inject:s2};function g0(e,t){return t?e?function(){return gt($e(e)?e.call(this,this):e,$e(t)?t.call(this,this):t)}:t:e}function s2(e,t){return go(Al(e),Al(t))}function Al(e){if(Pe(e)){const t={};for(let r=0;r0)&&!(a&16)){if(a&8){const u=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,p]=Lp(d,t,!0);gt(a,f),p&&s.push(...p)};!r&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!i&&!l)return Ye(e)&&o.set(e,Zo),Zo;if(Pe(i))for(let u=0;u-1,p[1]=m<0||h-1||ze(p,"default"))&&s.push(d)}}}const c=[a,s];return Ye(e)&&o.set(e,c),c}function x0(e){return e[0]!=="$"}function v0(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function b0(e,t){return v0(e)===v0(t)}function C0(e,t){return Pe(t)?t.findIndex(r=>b0(r,e)):$e(t)&&b0(t,e)?0:-1}const $p=e=>e[0]==="_"||e==="$stable",Kc=e=>Pe(e)?e.map(pr):[pr(e)],d2=(e,t,r)=>{if(t._n)return t;const o=Co((...n)=>Kc(t(...n)),r);return o._c=!1,o},Ip=(e,t,r)=>{const o=e._ctx;for(const n in e){if($p(n))continue;const i=e[n];if($e(i))t[n]=d2(n,i,o);else if(i!=null){const a=Kc(i);t[n]=()=>a}}},Rp=(e,t)=>{const r=Kc(t);e.slots.default=()=>r},f2=(e,t)=>{if(e.vnode.shapeFlag&32){const r=t._;r?(e.slots=He(t),ua(t,"_",r)):Ip(t,e.slots={})}else e.slots={},t&&Rp(e,t);ua(e.slots,ys,1)},h2=(e,t,r)=>{const{vnode:o,slots:n}=e;let i=!0,a=Xe;if(o.shapeFlag&32){const s=t._;s?r&&s===1?i=!1:(gt(n,t),!r&&s===1&&delete n._):(i=!t.$stable,Ip(t,n)),a=t}else t&&(Rp(e,t),a={default:1});if(i)for(const s in n)!$p(s)&&!(s in a)&&delete n[s]};function Ap(){return{app:null,config:{isNativeTag:qv,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let p2=0;function m2(e,t){return function(o,n=null){$e(o)||(o=Object.assign({},o)),n!=null&&!Ye(n)&&(n=null);const i=Ap(),a=new Set;let s=!1;const l=i.app={_uid:p2++,_component:o,_props:n,_container:null,_context:i,_instance:null,version:H2,get config(){return i.config},set config(c){},use(c,...u){return a.has(c)||(c&&$e(c.install)?(a.add(c),c.install(l,...u)):$e(c)&&(a.add(c),c(l,...u))),l},mixin(c){return i.mixins.includes(c)||i.mixins.push(c),l},component(c,u){return u?(i.components[c]=u,l):i.components[c]},directive(c,u){return u?(i.directives[c]=u,l):i.directives[c]},mount(c,u,d){if(!s){const f=qe(o,n);return f.appContext=i,u&&t?t(f,c):e(f,c,d),s=!0,l._container=c,c.__vue_app__=l,Ss(f.component)||f.component.proxy}},unmount(){s&&(e(null,l._container),delete l._container.__vue_app__)},provide(c,u){return i.provides[c]=u,l}};return l}}function Bl(e,t,r,o,n=!1){if(Pe(e)){e.forEach((f,p)=>Bl(f,t&&(Pe(t)?t[p]:t),r,o,n));return}if(On(o)&&!n)return;const i=o.shapeFlag&4?Ss(o.component)||o.component.proxy:o.el,a=n?null:i,{i:s,r:l}=e,c=t&&t.r,u=s.refs===Xe?s.refs={}:s.refs,d=s.setupState;if(c!=null&&c!==l&&(nt(c)?(u[c]=null,ze(d,c)&&(d[c]=null)):ot(c)&&(c.value=null)),$e(l))Jr(l,s,12,[a,u]);else{const f=nt(l),p=ot(l);if(f||p){const h=()=>{if(e.f){const m=f?ze(d,l)?d[l]:u[l]:l.value;n?Pe(m)&&Ic(m,i):Pe(m)?m.includes(i)||m.push(i):f?(u[l]=[i],ze(d,l)&&(d[l]=u[l])):(l.value=[i],e.k&&(u[e.k]=l.value))}else f?(u[l]=a,ze(d,l)&&(d[l]=a)):p&&(l.value=a,e.k&&(u[e.k]=a))};a?(h.id=-1,Bt(h,r)):h()}}}const Bt=Gb;function g2(e){return x2(e)}function x2(e,t){const r=Jv();r.__VUE__=!0;const{insert:o,remove:n,patchProp:i,createElement:a,createText:s,createComment:l,setText:c,setElementText:u,parentNode:d,nextSibling:f,setScopeId:p=or,insertStaticContent:h}=e,m=(k,y,_,L=null,O=null,N=null,X=!1,te=null,q=!!y.dynamicChildren)=>{if(k===y)return;k&&!vo(k,y)&&(L=re(k),W(k,O,N,!0),k=null),y.patchFlag===-2&&(q=!1,y.dynamicChildren=null);const{type:F,ref:A,shapeFlag:M}=y;switch(F){case xi:v(k,y,_,L);break;case Lt:g(k,y,_,L);break;case Yi:k==null&&x(y,_,L,X);break;case Je:R(k,y,_,L,O,N,X,te,q);break;default:M&1?w(k,y,_,L,O,N,X,te,q):M&6?B(k,y,_,L,O,N,X,te,q):(M&64||M&128)&&F.process(k,y,_,L,O,N,X,te,q,ce)}A!=null&&O&&Bl(A,k&&k.ref,N,y||k,!y)},v=(k,y,_,L)=>{if(k==null)o(y.el=s(y.children),_,L);else{const O=y.el=k.el;y.children!==k.children&&c(O,y.children)}},g=(k,y,_,L)=>{k==null?o(y.el=l(y.children||""),_,L):y.el=k.el},x=(k,y,_,L)=>{[k.el,k.anchor]=h(k.children,y,_,L,k.el,k.anchor)},C=({el:k,anchor:y},_,L)=>{let O;for(;k&&k!==y;)O=f(k),o(k,_,L),k=O;o(y,_,L)},b=({el:k,anchor:y})=>{let _;for(;k&&k!==y;)_=f(k),n(k),k=_;n(y)},w=(k,y,_,L,O,N,X,te,q)=>{X=X||y.type==="svg",k==null?T(y,_,L,O,N,X,te,q):I(k,y,O,N,X,te,q)},T=(k,y,_,L,O,N,X,te)=>{let q,F;const{type:A,props:M,shapeFlag:ue,transition:xe,dirs:Te}=k;if(q=k.el=a(k.type,N,M&&M.is,M),ue&8?u(q,k.children):ue&16&&E(k.children,q,null,L,O,N&&A!=="foreignObject",X,te),Te&&fo(k,null,L,"created"),S(q,k,k.scopeId,X,L),M){for(const Re in M)Re!=="value"&&!Zi(Re)&&i(q,Re,null,M[Re],N,k.children,L,O,U);"value"in M&&i(q,"value",null,M.value),(F=M.onVnodeBeforeMount)&&ur(F,L,k)}Te&&fo(k,null,L,"beforeMount");const Ie=(!O||O&&!O.pendingBranch)&&xe&&!xe.persisted;Ie&&xe.beforeEnter(q),o(q,y,_),((F=M&&M.onVnodeMounted)||Ie||Te)&&Bt(()=>{F&&ur(F,L,k),Ie&&xe.enter(q),Te&&fo(k,null,L,"mounted")},O)},S=(k,y,_,L,O)=>{if(_&&p(k,_),L)for(let N=0;N{for(let F=q;F{const te=y.el=k.el;let{patchFlag:q,dynamicChildren:F,dirs:A}=y;q|=k.patchFlag&16;const M=k.props||Xe,ue=y.props||Xe;let xe;_&&ho(_,!1),(xe=ue.onVnodeBeforeUpdate)&&ur(xe,_,y,k),A&&fo(y,k,_,"beforeUpdate"),_&&ho(_,!0);const Te=O&&y.type!=="foreignObject";if(F?P(k.dynamicChildren,F,te,_,L,Te,N):X||ie(k,y,te,null,_,L,Te,N,!1),q>0){if(q&16)$(te,y,M,ue,_,L,O);else if(q&2&&M.class!==ue.class&&i(te,"class",null,ue.class,O),q&4&&i(te,"style",M.style,ue.style,O),q&8){const Ie=y.dynamicProps;for(let Re=0;Re{xe&&ur(xe,_,y,k),A&&fo(y,k,_,"updated")},L)},P=(k,y,_,L,O,N,X)=>{for(let te=0;te{if(_!==L){if(_!==Xe)for(const te in _)!Zi(te)&&!(te in L)&&i(k,te,_[te],null,X,y.children,O,N,U);for(const te in L){if(Zi(te))continue;const q=L[te],F=_[te];q!==F&&te!=="value"&&i(k,te,F,q,X,y.children,O,N,U)}"value"in L&&i(k,"value",_.value,L.value)}},R=(k,y,_,L,O,N,X,te,q)=>{const F=y.el=k?k.el:s(""),A=y.anchor=k?k.anchor:s("");let{patchFlag:M,dynamicChildren:ue,slotScopeIds:xe}=y;xe&&(te=te?te.concat(xe):xe),k==null?(o(F,_,L),o(A,_,L),E(y.children,_,A,O,N,X,te,q)):M>0&&M&64&&ue&&k.dynamicChildren?(P(k.dynamicChildren,ue,_,O,N,X,te),(y.key!=null||O&&y===O.subTree)&&Zc(k,y,!0)):ie(k,y,_,A,O,N,X,te,q)},B=(k,y,_,L,O,N,X,te,q)=>{y.slotScopeIds=te,k==null?y.shapeFlag&512?O.ctx.activate(y,_,L,X,q):j(y,_,L,O,N,X,q):Y(k,y,q)},j=(k,y,_,L,O,N,X)=>{const te=k.component=P2(k,L,O);if(gi(k)&&(te.ctx.renderer=ce),k2(te),te.asyncDep){if(O&&O.registerDep(te,J),!k.el){const q=te.subTree=qe(Lt);g(null,q,y,_)}return}J(te,k,y,_,O,N,X)},Y=(k,y,_)=>{const L=y.component=k.component;if(Ub(k,y,_))if(L.asyncDep&&!L.asyncResolved){Q(L,y,_);return}else L.next=y,Db(L.update),L.update();else y.el=k.el,L.vnode=y},J=(k,y,_,L,O,N,X)=>{const te=()=>{if(k.isMounted){let{next:A,bu:M,u:ue,parent:xe,vnode:Te}=k,Ie=A,Re;ho(k,!1),A?(A.el=Te.el,Q(k,A,X)):A=Te,M&&Xi(M),(Re=A.props&&A.props.onVnodeBeforeUpdate)&&ur(Re,xe,A,Te),ho(k,!0);const Ue=tl(k),ct=k.subTree;k.subTree=Ue,m(ct,Ue,d(ct.el),re(ct),k,O,N),A.el=Ue.el,Ie===null&&Vb(k,Ue.el),ue&&Bt(ue,O),(Re=A.props&&A.props.onVnodeUpdated)&&Bt(()=>ur(Re,xe,A,Te),O)}else{let A;const{el:M,props:ue}=y,{bm:xe,m:Te,parent:Ie}=k,Re=On(y);if(ho(k,!1),xe&&Xi(xe),!Re&&(A=ue&&ue.onVnodeBeforeMount)&&ur(A,Ie,y),ho(k,!0),M&&ye){const Ue=()=>{k.subTree=tl(k),ye(M,k.subTree,k,O,null)};Re?y.type.__asyncLoader().then(()=>!k.isUnmounted&&Ue()):Ue()}else{const Ue=k.subTree=tl(k);m(null,Ue,_,L,k,O,N),y.el=Ue.el}if(Te&&Bt(Te,O),!Re&&(A=ue&&ue.onVnodeMounted)){const Ue=y;Bt(()=>ur(A,Ie,Ue),O)}(y.shapeFlag&256||Ie&&On(Ie.vnode)&&Ie.vnode.shapeFlag&256)&&k.a&&Bt(k.a,O),k.isMounted=!0,y=_=L=null}},q=k.effect=new Hc(te,()=>hs(F),k.scope),F=k.update=()=>q.run();F.id=k.uid,ho(k,!0),F()},Q=(k,y,_)=>{y.component=k;const L=k.vnode.props;k.vnode=y,k.next=null,u2(k,y.props,L,_),h2(k,y.children,_),cn(),d0(),un()},ie=(k,y,_,L,O,N,X,te,q=!1)=>{const F=k&&k.children,A=k?k.shapeFlag:0,M=y.children,{patchFlag:ue,shapeFlag:xe}=y;if(ue>0){if(ue&128){ve(F,M,_,L,O,N,X,te,q);return}else if(ue&256){ge(F,M,_,L,O,N,X,te,q);return}}xe&8?(A&16&&U(F,O,N),M!==F&&u(_,M)):A&16?xe&16?ve(F,M,_,L,O,N,X,te,q):U(F,O,N,!0):(A&8&&u(_,""),xe&16&&E(M,_,L,O,N,X,te,q))},ge=(k,y,_,L,O,N,X,te,q)=>{k=k||Zo,y=y||Zo;const F=k.length,A=y.length,M=Math.min(F,A);let ue;for(ue=0;ueA?U(k,O,N,!0,!1,M):E(y,_,L,O,N,X,te,q,M)},ve=(k,y,_,L,O,N,X,te,q)=>{let F=0;const A=y.length;let M=k.length-1,ue=A-1;for(;F<=M&&F<=ue;){const xe=k[F],Te=y[F]=q?Zr(y[F]):pr(y[F]);if(vo(xe,Te))m(xe,Te,_,null,O,N,X,te,q);else break;F++}for(;F<=M&&F<=ue;){const xe=k[M],Te=y[ue]=q?Zr(y[ue]):pr(y[ue]);if(vo(xe,Te))m(xe,Te,_,null,O,N,X,te,q);else break;M--,ue--}if(F>M){if(F<=ue){const xe=ue+1,Te=xeue)for(;F<=M;)W(k[F],O,N,!0),F++;else{const xe=F,Te=F,Ie=new Map;for(F=Te;F<=ue;F++){const vt=y[F]=q?Zr(y[F]):pr(y[F]);vt.key!=null&&Ie.set(vt.key,F)}let Re,Ue=0;const ct=ue-Te+1;let xt=!1,lr=0;const cr=new Array(ct);for(F=0;F=ct){W(vt,O,N,!0);continue}let oe;if(vt.key!=null)oe=Ie.get(vt.key);else for(Re=Te;Re<=ue;Re++)if(cr[Re-Te]===0&&vo(vt,y[Re])){oe=Re;break}oe===void 0?W(vt,O,N,!0):(cr[oe-Te]=F+1,oe>=lr?lr=oe:xt=!0,m(vt,y[oe],_,null,O,N,X,te,q),Ue++)}const Ut=xt?v2(cr):Zo;for(Re=Ut.length-1,F=ct-1;F>=0;F--){const vt=Te+F,oe=y[vt],be=vt+1{const{el:N,type:X,transition:te,children:q,shapeFlag:F}=k;if(F&6){z(k.component.subTree,y,_,L);return}if(F&128){k.suspense.move(y,_,L);return}if(F&64){X.move(k,y,_,ce);return}if(X===Je){o(N,y,_);for(let M=0;Mte.enter(N),O);else{const{leave:M,delayLeave:ue,afterLeave:xe}=te,Te=()=>o(N,y,_),Ie=()=>{M(N,()=>{Te(),xe&&xe()})};ue?ue(N,Te,Ie):Ie()}else o(N,y,_)},W=(k,y,_,L=!1,O=!1)=>{const{type:N,props:X,ref:te,children:q,dynamicChildren:F,shapeFlag:A,patchFlag:M,dirs:ue}=k;if(te!=null&&Bl(te,null,_,k,!0),A&256){y.ctx.deactivate(k);return}const xe=A&1&&ue,Te=!On(k);let Ie;if(Te&&(Ie=X&&X.onVnodeBeforeUnmount)&&ur(Ie,y,k),A&6)D(k.component,_,L);else{if(A&128){k.suspense.unmount(_,L);return}xe&&fo(k,null,y,"beforeUnmount"),A&64?k.type.remove(k,y,_,O,ce,L):F&&(N!==Je||M>0&&M&64)?U(F,y,_,!1,!0):(N===Je&&M&384||!O&&A&16)&&U(q,y,_),L&&Z(k)}(Te&&(Ie=X&&X.onVnodeUnmounted)||xe)&&Bt(()=>{Ie&&ur(Ie,y,k),xe&&fo(k,null,y,"unmounted")},_)},Z=k=>{const{type:y,el:_,anchor:L,transition:O}=k;if(y===Je){V(_,L);return}if(y===Yi){b(k);return}const N=()=>{n(_),O&&!O.persisted&&O.afterLeave&&O.afterLeave()};if(k.shapeFlag&1&&O&&!O.persisted){const{leave:X,delayLeave:te}=O,q=()=>X(_,N);te?te(k.el,N,q):q()}else N()},V=(k,y)=>{let _;for(;k!==y;)_=f(k),n(k),k=_;n(y)},D=(k,y,_)=>{const{bum:L,scope:O,update:N,subTree:X,um:te}=k;L&&Xi(L),O.stop(),N&&(N.active=!1,W(X,k,y,_)),te&&Bt(te,y),Bt(()=>{k.isUnmounted=!0},y),y&&y.pendingBranch&&!y.isUnmounted&&k.asyncDep&&!k.asyncResolved&&k.suspenseId===y.pendingId&&(y.deps--,y.deps===0&&y.resolve())},U=(k,y,_,L=!1,O=!1,N=0)=>{for(let X=N;Xk.shapeFlag&6?re(k.component.subTree):k.shapeFlag&128?k.suspense.next():f(k.anchor||k.el),ee=(k,y,_)=>{k==null?y._vnode&&W(y._vnode,null,null,!0):m(y._vnode||null,k,y,null,null,null,_),d0(),fp(),y._vnode=k},ce={p:m,um:W,m:z,r:Z,mt:j,mc:E,pc:ie,pbc:P,n:re,o:e};let ke,ye;return t&&([ke,ye]=t(ce)),{render:ee,hydrate:ke,createApp:m2(ee,ke)}}function ho({effect:e,update:t},r){e.allowRecurse=t.allowRecurse=r}function Zc(e,t,r=!1){const o=e.children,n=t.children;if(Pe(o)&&Pe(n))for(let i=0;i>1,e[r[s]]0&&(t[o]=r[i-1]),r[i]=o)}}for(i=r.length,a=r[i-1];i-- >0;)r[i]=a,a=t[a];return r}const b2=e=>e.__isTeleport,Hn=e=>e&&(e.disabled||e.disabled===""),y0=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Hl=(e,t)=>{const r=e&&e.to;return nt(r)?t?t(r):null:r},C2={__isTeleport:!0,process(e,t,r,o,n,i,a,s,l,c){const{mc:u,pc:d,pbc:f,o:{insert:p,querySelector:h,createText:m,createComment:v}}=c,g=Hn(t.props);let{shapeFlag:x,children:C,dynamicChildren:b}=t;if(e==null){const w=t.el=m(""),T=t.anchor=m("");p(w,r,o),p(T,r,o);const S=t.target=Hl(t.props,h),E=t.targetAnchor=m("");S&&(p(E,S),a=a||y0(S));const I=(P,$)=>{x&16&&u(C,P,$,n,i,a,s,l)};g?I(r,T):S&&I(S,E)}else{t.el=e.el;const w=t.anchor=e.anchor,T=t.target=e.target,S=t.targetAnchor=e.targetAnchor,E=Hn(e.props),I=E?r:T,P=E?w:S;if(a=a||y0(T),b?(f(e.dynamicChildren,b,I,n,i,a,s),Zc(e,t,!0)):l||d(e,t,I,P,n,i,a,s,!1),g)E||Oi(t,r,w,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const $=t.target=Hl(t.props,h);$&&Oi(t,$,null,c,0)}else E&&Oi(t,T,S,c,1)}Op(t)},remove(e,t,r,o,{um:n,o:{remove:i}},a){const{shapeFlag:s,children:l,anchor:c,targetAnchor:u,target:d,props:f}=e;if(d&&i(u),(a||!Hn(f))&&(i(c),s&16))for(let p=0;p0?rr||Zo:null,S2(),Jn>0&&rr&&rr.push(e),e}function kB(e,t,r,o,n,i){return Bp(Mp(e,t,r,o,n,i,!0))}function Cs(e,t,r,o,n){return Bp(qe(e,t,r,o,n,!0))}function ei(e){return e?e.__v_isVNode===!0:!1}function vo(e,t){return e.type===t.type&&e.key===t.key}const ys="__vInternal",Hp=({key:e})=>e??null,Qi=({ref:e,ref_key:t,ref_for:r})=>e!=null?nt(e)||ot(e)||$e(e)?{i:bt,r:e,k:t,f:!!r}:e:null;function Mp(e,t=null,r=null,o=0,n=null,i=e===Je?0:1,a=!1,s=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Hp(t),ref:t&&Qi(t),scopeId:ms,slotScopeIds:null,children:r,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:o,dynamicProps:n,dynamicChildren:null,appContext:null,ctx:bt};return s?(Xc(l,r),i&128&&e.normalize(l)):r&&(l.shapeFlag|=nt(r)?8:16),Jn>0&&!a&&rr&&(l.patchFlag>0||i&6)&&l.patchFlag!==32&&rr.push(l),l}const qe=w2;function w2(e,t=null,r=null,o=0,n=null,i=!1){if((!e||e===wp)&&(e=Lt),ei(e)){const s=Ar(e,t,!0);return r&&Xc(s,r),Jn>0&&!i&&rr&&(s.shapeFlag&6?rr[rr.indexOf(e)]=s:rr.push(s)),s.patchFlag|=-2,s}if(R2(e)&&(e=e.__vccOpts),t){t=_2(t);let{class:s,style:l}=t;s&&!nt(s)&&(t.class=Lc(s)),Ye(l)&&(np(l)&&!Pe(l)&&(l=gt({},l)),t.style=kc(l))}const a=nt(e)?1:qb(e)?128:b2(e)?64:Ye(e)?4:$e(e)?2:0;return Mp(e,t,r,o,n,a,i,!0)}function _2(e){return e?np(e)||ys in e?gt({},e):e:null}function Ar(e,t,r=!1){const{props:o,ref:n,patchFlag:i,children:a}=e,s=t?Yc(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&Hp(s),ref:t&&t.ref?r&&n?Pe(n)?n.concat(Qi(t)):[n,Qi(t)]:Qi(t):n,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Je?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ar(e.ssContent),ssFallback:e.ssFallback&&Ar(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function ti(e=" ",t=0){return qe(xi,null,e,t)}function LB(e,t){const r=qe(Yi,null,e);return r.staticCount=t,r}function $B(e="",t=!1){return t?(bs(),Cs(Lt,null,e)):qe(Lt,null,e)}function pr(e){return e==null||typeof e=="boolean"?qe(Lt):Pe(e)?qe(Je,null,e.slice()):typeof e=="object"?Zr(e):qe(xi,null,String(e))}function Zr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ar(e)}function Xc(e,t){let r=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(Pe(t))r=16;else if(typeof t=="object")if(o&65){const n=t.default;n&&(n._c&&(n._d=!1),Xc(e,n()),n._c&&(n._d=!0));return}else{r=32;const n=t._;!n&&!(ys in t)?t._ctx=bt:n===3&&bt&&(bt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else $e(t)?(t={default:t,_ctx:bt},r=32):(t=String(t),o&64?(r=16,t=[ti(t)]):r=8);e.children=t,e.shapeFlag|=r}function Yc(...e){const t={};for(let r=0;rrt||bt,en=e=>{rt=e,e.scope.on()},Po=()=>{rt&&rt.scope.off(),rt=null};function Dp(e){return e.vnode.shapeFlag&4}let tn=!1;function k2(e,t=!1){tn=t;const{props:r,children:o}=e.vnode,n=Dp(e);c2(e,r,n,t),f2(e,o);const i=n?L2(e,t):void 0;return tn=!1,i}function L2(e,t){const r=e.type;e.accessCache=Object.create(null),e.proxy=to(new Proxy(e.ctx,o2));const{setup:o}=r;if(o){const n=e.setupContext=o.length>1?zp(e):null;en(e),cn();const i=Jr(o,e,0,[e.props,n]);if(un(),Po(),jh(i)){if(i.then(Po,Po),t)return i.then(a=>{w0(e,a,t)}).catch(a=>{mi(a,e,0)});e.asyncDep=i}else w0(e,i,t)}else Fp(e,t)}function w0(e,t,r){$e(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ye(t)&&(e.setupState=lp(t)),Fp(e,r)}let _0;function Fp(e,t,r){const o=e.type;if(!e.render){if(!t&&_0&&!o.render){const n=o.template||Gc(e).template;if(n){const{isCustomElement:i,compilerOptions:a}=e.appContext.config,{delimiters:s,compilerOptions:l}=o,c=gt(gt({isCustomElement:i,delimiters:s},a),l);o.render=_0(n,c)}}e.render=o.render||or}en(e),cn(),n2(e),un(),Po()}function $2(e){return new Proxy(e.attrs,{get(t,r){return Ht(e,"get","$attrs"),t[r]}})}function zp(e){const t=o=>{e.exposed=o||{}};let r;return{get attrs(){return r||(r=$2(e))},slots:e.slots,emit:e.emit,expose:t}}function Ss(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(lp(to(e.exposed)),{get(t,r){if(r in t)return t[r];if(r in Bn)return Bn[r](e)},has(t,r){return r in t||r in Bn}}))}function I2(e,t=!0){return $e(e)?e.displayName||e.name:e.name||t&&e.__name}function R2(e){return $e(e)&&"__vccOpts"in e}const ae=(e,t)=>Bb(e,t,tn);function IB(){return A2().attrs}function A2(){const e=ir();return e.setupContext||(e.setupContext=zp(e))}function H(e,t,r){const o=arguments.length;return o===2?Ye(t)&&!Pe(t)?ei(t)?qe(e,null,[t]):qe(e,t):qe(e,null,t):(o>3?r=Array.prototype.slice.call(arguments,2):o===3&&ei(r)&&(r=[r]),qe(e,t,r))}const O2=Symbol(""),B2=()=>Me(O2),H2="3.2.47",M2="http://www.w3.org/2000/svg",bo=typeof document<"u"?document:null,T0=bo&&bo.createElement("template"),D2={insert:(e,t,r)=>{t.insertBefore(e,r||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,r,o)=>{const n=t?bo.createElementNS(M2,e):bo.createElement(e,r?{is:r}:void 0);return e==="select"&&o&&o.multiple!=null&&n.setAttribute("multiple",o.multiple),n},createText:e=>bo.createTextNode(e),createComment:e=>bo.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>bo.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,r,o,n,i){const a=r?r.previousSibling:t.lastChild;if(n&&(n===i||n.nextSibling))for(;t.insertBefore(n.cloneNode(!0),r),!(n===i||!(n=n.nextSibling)););else{T0.innerHTML=o?`${e}`:e;const s=T0.content;if(o){const l=s.firstChild;for(;l.firstChild;)s.appendChild(l.firstChild);s.removeChild(l)}t.insertBefore(s,r)}return[a?a.nextSibling:t.firstChild,r?r.previousSibling:t.lastChild]}};function F2(e,t,r){const o=e._vtc;o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):r?e.setAttribute("class",t):e.className=t}function z2(e,t,r){const o=e.style,n=nt(r);if(r&&!n){if(t&&!nt(t))for(const i in t)r[i]==null&&Ml(o,i,"");for(const i in r)Ml(o,i,r[i])}else{const i=o.display;n?t!==r&&(o.cssText=r):t&&e.removeAttribute("style"),"_vod"in e&&(o.display=i)}}const E0=/\s*!important$/;function Ml(e,t,r){if(Pe(r))r.forEach(o=>Ml(e,t,o));else if(r==null&&(r=""),t.startsWith("--"))e.setProperty(t,r);else{const o=N2(e,t);E0.test(r)?e.setProperty(Ao(o),r.replace(E0,""),"important"):e[o]=r}}const P0=["Webkit","Moz","ms"],il={};function N2(e,t){const r=il[t];if(r)return r;let o=vr(t);if(o!=="filter"&&o in e)return il[t]=o;o=us(o);for(let n=0;nal||(G2.then(()=>al=0),al=Date.now());function Z2(e,t){const r=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=r.attached)return;Kt(X2(o,r.value),t,5,[o])};return r.value=e,r.attached=K2(),r}function X2(e,t){if(Pe(t)){const r=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{r.call(e),e._stopped=!0},t.map(o=>n=>!n._stopped&&o&&o(n))}else return t}const $0=/^on[a-z]/,Y2=(e,t,r,o,n=!1,i,a,s,l)=>{t==="class"?F2(e,o,n):t==="style"?z2(e,r,o):ss(t)?$c(t)||V2(e,t,r,o,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Q2(e,t,o,n))?j2(e,t,o,i,a,s,l):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),W2(e,t,o,n))};function Q2(e,t,r,o){return o?!!(t==="innerHTML"||t==="textContent"||t in e&&$0.test(t)&&$e(r)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||$0.test(t)&&nt(r)?!1:t in e}const Wr="transition",yn="animation",br=(e,{slots:t})=>H(xp,Wp(e),t);br.displayName="Transition";const Np={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},J2=br.props=gt({},xp.props,Np),po=(e,t=[])=>{Pe(e)?e.forEach(r=>r(...t)):e&&e(...t)},I0=e=>e?Pe(e)?e.some(t=>t.length>1):e.length>1:!1;function Wp(e){const t={};for(const R in e)R in Np||(t[R]=e[R]);if(e.css===!1)return t;const{name:r="v",type:o,duration:n,enterFromClass:i=`${r}-enter-from`,enterActiveClass:a=`${r}-enter-active`,enterToClass:s=`${r}-enter-to`,appearFromClass:l=i,appearActiveClass:c=a,appearToClass:u=s,leaveFromClass:d=`${r}-leave-from`,leaveActiveClass:f=`${r}-leave-active`,leaveToClass:p=`${r}-leave-to`}=e,h=eC(n),m=h&&h[0],v=h&&h[1],{onBeforeEnter:g,onEnter:x,onEnterCancelled:C,onLeave:b,onLeaveCancelled:w,onBeforeAppear:T=g,onAppear:S=x,onAppearCancelled:E=C}=t,I=(R,B,j)=>{Gr(R,B?u:s),Gr(R,B?c:a),j&&j()},P=(R,B)=>{R._isLeaving=!1,Gr(R,d),Gr(R,p),Gr(R,f),B&&B()},$=R=>(B,j)=>{const Y=R?S:x,J=()=>I(B,R,j);po(Y,[B,J]),R0(()=>{Gr(B,R?l:i),Pr(B,R?u:s),I0(Y)||A0(B,o,m,J)})};return gt(t,{onBeforeEnter(R){po(g,[R]),Pr(R,i),Pr(R,a)},onBeforeAppear(R){po(T,[R]),Pr(R,l),Pr(R,c)},onEnter:$(!1),onAppear:$(!0),onLeave(R,B){R._isLeaving=!0;const j=()=>P(R,B);Pr(R,d),Up(),Pr(R,f),R0(()=>{R._isLeaving&&(Gr(R,d),Pr(R,p),I0(b)||A0(R,o,v,j))}),po(b,[R,j])},onEnterCancelled(R){I(R,!1),po(C,[R])},onAppearCancelled(R){I(R,!0),po(E,[R])},onLeaveCancelled(R){P(R),po(w,[R])}})}function eC(e){if(e==null)return null;if(Ye(e))return[sl(e.enter),sl(e.leave)];{const t=sl(e);return[t,t]}}function sl(e){return Qv(e)}function Pr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.add(r)),(e._vtc||(e._vtc=new Set)).add(t)}function Gr(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const{_vtc:r}=e;r&&(r.delete(t),r.size||(e._vtc=void 0))}function R0(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let tC=0;function A0(e,t,r,o){const n=e._endId=++tC,i=()=>{n===e._endId&&o()};if(r)return setTimeout(i,r);const{type:a,timeout:s,propCount:l}=jp(e,t);if(!a)return o();const c=a+"end";let u=0;const d=()=>{e.removeEventListener(c,f),i()},f=p=>{p.target===e&&++u>=l&&d()};setTimeout(()=>{u(r[h]||"").split(", "),n=o(`${Wr}Delay`),i=o(`${Wr}Duration`),a=O0(n,i),s=o(`${yn}Delay`),l=o(`${yn}Duration`),c=O0(s,l);let u=null,d=0,f=0;t===Wr?a>0&&(u=Wr,d=a,f=i.length):t===yn?c>0&&(u=yn,d=c,f=l.length):(d=Math.max(a,c),u=d>0?a>c?Wr:yn:null,f=u?u===Wr?i.length:l.length:0);const p=u===Wr&&/\b(transform|all)(,|$)/.test(o(`${Wr}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function O0(e,t){for(;e.lengthB0(r)+B0(e[o])))}function B0(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Up(){return document.body.offsetHeight}const Vp=new WeakMap,qp=new WeakMap,Gp={name:"TransitionGroup",props:gt({},J2,{tag:String,moveClass:String}),setup(e,{slots:t}){const r=ir(),o=gp();let n,i;return Sp(()=>{if(!n.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!sC(n[0].el,r.vnode.el,a))return;n.forEach(nC),n.forEach(iC);const s=n.filter(aC);Up(),s.forEach(l=>{const c=l.el,u=c.style;Pr(c,a),u.transform=u.webkitTransform=u.transitionDuration="";const d=c._moveCb=f=>{f&&f.target!==c||(!f||/transform$/.test(f.propertyName))&&(c.removeEventListener("transitionend",d),c._moveCb=null,Gr(c,a))};c.addEventListener("transitionend",d)})}),()=>{const a=He(e),s=Wp(a);let l=a.tag||Je;n=i,i=t.default?Uc(t.default()):[];for(let c=0;cdelete e.mode;Gp.props;const oC=Gp;function nC(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function iC(e){qp.set(e,e.el.getBoundingClientRect())}function aC(e){const t=Vp.get(e),r=qp.get(e),o=t.left-r.left,n=t.top-r.top;if(o||n){const i=e.el.style;return i.transform=i.webkitTransform=`translate(${o}px,${n}px)`,i.transitionDuration="0s",e}}function sC(e,t,r){const o=e.cloneNode();e._vtc&&e._vtc.forEach(a=>{a.split(/\s+/).forEach(s=>s&&o.classList.remove(s))}),r.split(/\s+/).forEach(a=>a&&o.classList.add(a)),o.style.display="none";const n=t.nodeType===1?t:t.parentNode;n.appendChild(o);const{hasTransform:i}=jp(o);return n.removeChild(o),i}const H0=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Pe(t)?r=>Xi(t,r):t};function lC(e){e.target.composing=!0}function M0(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const RB={created(e,{modifiers:{lazy:t,trim:r,number:o}},n){e._assign=H0(n);const i=o||n.props&&n.props.type==="number";Vo(e,t?"change":"input",a=>{if(a.target.composing)return;let s=e.value;r&&(s=s.trim()),i&&(s=El(s)),e._assign(s)}),r&&Vo(e,"change",()=>{e.value=e.value.trim()}),t||(Vo(e,"compositionstart",lC),Vo(e,"compositionend",M0),Vo(e,"change",M0))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:r,trim:o,number:n}},i){if(e._assign=H0(i),e.composing||document.activeElement===e&&e.type!=="range"&&(r||o&&e.value.trim()===t||(n||e.type==="number")&&El(e.value)===t))return;const a=t??"";e.value!==a&&(e.value=a)}},cC={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},AB=(e,t)=>r=>{if(!("key"in r))return;const o=Ao(r.key);if(t.some(n=>n===o||cC[n]===o))return e(r)},Dl={beforeMount(e,{value:t},{transition:r}){e._vod=e.style.display==="none"?"":e.style.display,r&&t?r.beforeEnter(e):Sn(e,t)},mounted(e,{value:t},{transition:r}){r&&t&&r.enter(e)},updated(e,{value:t,oldValue:r},{transition:o}){!t!=!r&&(o?t?(o.beforeEnter(e),Sn(e,!0),o.enter(e)):o.leave(e,()=>{Sn(e,!1)}):Sn(e,t))},beforeUnmount(e,{value:t}){Sn(e,t)}};function Sn(e,t){e.style.display=t?e._vod:"none"}const uC=gt({patchProp:Y2},D2);let D0;function dC(){return D0||(D0=g2(uC))}const Kp=(...e)=>{const t=dC().createApp(...e),{mount:r}=t;return t.mount=o=>{const n=fC(o);if(!n)return;const i=t._component;!$e(i)&&!i.render&&!i.template&&(i.template=n.innerHTML),n.innerHTML="";const a=r(n,!1,n instanceof SVGElement);return n instanceof Element&&(n.removeAttribute("v-cloak"),n.setAttribute("data-v-app","")),a},t};function fC(e){return nt(e)?document.querySelector(e):e}function Qc(e){return e.composedPath()[0]||null}function OB(e){return typeof e=="string"?e.endsWith("px")?Number(e.slice(0,e.length-2)):Number(e):e}function BB(e){if(e!=null)return typeof e=="number"?`${e}px`:e.endsWith("px")?e:`${e}px`}function Zp(e,t){const r=e.trim().split(/\s+/g),o={top:r[0]};switch(r.length){case 1:o.right=r[0],o.bottom=r[0],o.left=r[0];break;case 2:o.right=r[1],o.left=r[1],o.bottom=r[0];break;case 3:o.right=r[1],o.bottom=r[2],o.left=r[1];break;case 4:o.right=r[1],o.bottom=r[2],o.left=r[3];break;default:throw new Error("[seemly/getMargin]:"+e+" is not a valid value.")}return t===void 0?o:o[t]}function HB(e,t){const[r,o]=e.split(" ");return t?t==="row"?r:o:{row:r,col:o||r}}const F0={black:"#000",silver:"#C0C0C0",gray:"#808080",white:"#FFF",maroon:"#800000",red:"#F00",purple:"#800080",fuchsia:"#F0F",green:"#008000",lime:"#0F0",olive:"#808000",yellow:"#FF0",navy:"#000080",blue:"#00F",teal:"#008080",aqua:"#0FF",transparent:"#0000"},wr="^\\s*",_r="\\s*$",ro="\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))%\\s*",Wt="\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))\\s*",So="([0-9A-Fa-f])",wo="([0-9A-Fa-f]{2})",hC=new RegExp(`${wr}hsl\\s*\\(${Wt},${ro},${ro}\\)${_r}`),pC=new RegExp(`${wr}hsv\\s*\\(${Wt},${ro},${ro}\\)${_r}`),mC=new RegExp(`${wr}hsla\\s*\\(${Wt},${ro},${ro},${Wt}\\)${_r}`),gC=new RegExp(`${wr}hsva\\s*\\(${Wt},${ro},${ro},${Wt}\\)${_r}`),xC=new RegExp(`${wr}rgb\\s*\\(${Wt},${Wt},${Wt}\\)${_r}`),vC=new RegExp(`${wr}rgba\\s*\\(${Wt},${Wt},${Wt},${Wt}\\)${_r}`),Jc=new RegExp(`${wr}#${So}${So}${So}${_r}`),eu=new RegExp(`${wr}#${wo}${wo}${wo}${_r}`),tu=new RegExp(`${wr}#${So}${So}${So}${So}${_r}`),ru=new RegExp(`${wr}#${wo}${wo}${wo}${wo}${_r}`);function At(e){return parseInt(e,16)}function MB(e){try{let t;if(t=mC.exec(e))return[yr(t[1]),st(t[5]),st(t[9]),Lr(t[13])];if(t=hC.exec(e))return[yr(t[1]),st(t[5]),st(t[9]),1];throw new Error(`[seemly/hsla]: Invalid color value ${e}.`)}catch(t){throw t}}function DB(e){try{let t;if(t=gC.exec(e))return[yr(t[1]),st(t[5]),st(t[9]),Lr(t[13])];if(t=pC.exec(e))return[yr(t[1]),st(t[5]),st(t[9]),1];throw new Error(`[seemly/hsva]: Invalid color value ${e}.`)}catch(t){throw t}}function Cr(e){try{let t;if(t=eu.exec(e))return[At(t[1]),At(t[2]),At(t[3]),1];if(t=xC.exec(e))return[tt(t[1]),tt(t[5]),tt(t[9]),1];if(t=vC.exec(e))return[tt(t[1]),tt(t[5]),tt(t[9]),Lr(t[13])];if(t=Jc.exec(e))return[At(t[1]+t[1]),At(t[2]+t[2]),At(t[3]+t[3]),1];if(t=ru.exec(e))return[At(t[1]),At(t[2]),At(t[3]),Lr(At(t[4])/255)];if(t=tu.exec(e))return[At(t[1]+t[1]),At(t[2]+t[2]),At(t[3]+t[3]),Lr(At(t[4]+t[4])/255)];if(e in F0)return Cr(F0[e]);throw new Error(`[seemly/rgba]: Invalid color value ${e}.`)}catch(t){throw t}}function bC(e){return e>1?1:e<0?0:e}function CC(e,t,r){return`rgb(${tt(e)}, ${tt(t)}, ${tt(r)})`}function Fl(e,t,r,o){return`rgba(${tt(e)}, ${tt(t)}, ${tt(r)}, ${bC(o)})`}function ll(e,t,r,o,n){return tt((e*t*(1-o)+r*o)/n)}function me(e,t){Array.isArray(e)||(e=Cr(e)),Array.isArray(t)||(t=Cr(t));const r=e[3],o=t[3],n=Lr(r+o-r*o);return Fl(ll(e[0],r,t[0],o,n),ll(e[1],r,t[1],o,n),ll(e[2],r,t[2],o,n),n)}function G(e,t){const[r,o,n,i=1]=Array.isArray(e)?e:Cr(e);return t.alpha?Fl(r,o,n,t.alpha):Fl(r,o,n,i)}function it(e,t){const[r,o,n,i=1]=Array.isArray(e)?e:Cr(e),{lightness:a=1,alpha:s=1}=t;return yC([r*a,o*a,n*a,i*s])}function Lr(e){const t=Math.round(Number(e)*100)/100;return t>1?1:t<0?0:t}function yr(e){const t=Math.round(Number(e));return t>=360||t<0?0:t}function tt(e){const t=Math.round(Number(e));return t>255?255:t<0?0:t}function st(e){const t=Math.round(Number(e));return t>100?100:t<0?0:t}function FB(e){const[t,r,o]=Array.isArray(e)?e:Cr(e);return CC(t,r,o)}function yC(e){const[t,r,o]=e;return 3 in e?`rgba(${tt(t)}, ${tt(r)}, ${tt(o)}, ${Lr(e[3])})`:`rgba(${tt(t)}, ${tt(r)}, ${tt(o)}, 1)`}function zB(e){return`hsv(${yr(e[0])}, ${st(e[1])}%, ${st(e[2])}%)`}function NB(e){const[t,r,o]=e;return 3 in e?`hsva(${yr(t)}, ${st(r)}%, ${st(o)}%, ${Lr(e[3])})`:`hsva(${yr(t)}, ${st(r)}%, ${st(o)}%, 1)`}function WB(e){return`hsl(${yr(e[0])}, ${st(e[1])}%, ${st(e[2])}%)`}function jB(e){const[t,r,o]=e;return 3 in e?`hsla(${yr(t)}, ${st(r)}%, ${st(o)}%, ${Lr(e[3])})`:`hsla(${yr(t)}, ${st(r)}%, ${st(o)}%, 1)`}function UB(e){if(typeof e=="string"){let o;if(o=eu.exec(e))return`${o[0]}FF`;if(o=ru.exec(e))return o[0];if(o=Jc.exec(e))return`#${o[1]}${o[1]}${o[2]}${o[2]}${o[3]}${o[3]}FF`;if(o=tu.exec(e))return`#${o[1]}${o[1]}${o[2]}${o[2]}${o[3]}${o[3]}${o[4]}${o[4]}`;throw new Error(`[seemly/toHexString]: Invalid hex value ${e}.`)}const t=`#${e.slice(0,3).map(o=>tt(o).toString(16).toUpperCase().padStart(2,"0")).join("")}`,r=e.length===3?"FF":tt(e[3]*255).toString(16).padStart(2,"0").toUpperCase();return t+r}function VB(e){if(typeof e=="string"){let t;if(t=eu.exec(e))return t[0];if(t=ru.exec(e))return t[0].slice(0,7);if(t=Jc.exec(e)||tu.exec(e))return`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`;throw new Error(`[seemly/toHexString]: Invalid hex value ${e}.`)}return`#${e.slice(0,3).map(t=>tt(t).toString(16).toUpperCase().padStart(2,"0")).join("")}`}function ws(e=8){return Math.random().toString(16).slice(2,2+e)}function qB(e,t){const r=[];for(let o=0;o{o[n]=e[n]}),Object.assign(o,r)}function ou(e,t=[],r){const o={};return Object.getOwnPropertyNames(e).forEach(i=>{t.includes(i)||(o[i]=e[i])}),Object.assign(o,r)}function zl(e,t=!0,r=[]){return e.forEach(o=>{if(o!==null){if(typeof o!="object"){(typeof o=="string"||typeof o=="number")&&r.push(ti(String(o)));return}if(Array.isArray(o)){zl(o,t,r);return}if(o.type===Je){if(o.children===null)return;Array.isArray(o.children)&&zl(o.children,t,r)}else o.type!==Lt&&r.push(o)}}),r}function _o(e,...t){if(Array.isArray(e))e.forEach(r=>_o(r,...t));else return e(...t)}function _s(e){return Object.keys(e)}const Nt=(e,...t)=>typeof e=="function"?e(...t):typeof e=="string"?ti(e):typeof e=="number"?ti(String(e)):null;function oi(e,t){console.error(`[naive/${e}]: ${t}`)}function vi(e,t){throw new Error(`[naive/${e}]: ${t}`)}function SC(e,t="default",r=void 0){const o=e[t];if(!o)return oi("getFirstSlotVNode",`slot[${t}] is empty`),null;const n=zl(o(r));return n.length===1?n[0]:(oi("getFirstSlotVNode",`slot[${t}] should have exactly one child`),null)}function GB(e){return e}function bi(e){return e.some(t=>ei(t)?!(t.type===Lt||t.type===Je&&!bi(t.children)):!0)?e:null}function z0(e,t){return e&&bi(e())||t()}function KB(e,t,r){return e&&bi(e(t))||r(t)}function Jt(e,t){const r=e&&bi(e());return t(r||null)}function wC(e){return!(e&&bi(e()))}const N0=Oe({render(){var e,t;return(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)}});function W0(e){return e.replace(/#|\(|\)|,|\s|\./g,"_")}function _C(e){let t=0;for(let r=0;r{let n=_C(o);if(n){if(n===1){e.forEach(a=>{r.push(o.replace("&",a))});return}}else{e.forEach(a=>{r.push((a&&a+" ")+o)});return}let i=[o];for(;n--;){const a=[];i.forEach(s=>{e.forEach(l=>{a.push(s.replace("&",l))})}),i=a}i.forEach(a=>r.push(a))}),r}function PC(e,t){const r=[];return t.split(Xp).forEach(o=>{e.forEach(n=>{r.push((n&&n+" ")+o)})}),r}function kC(e){let t=[""];return e.forEach(r=>{r=r&&r.trim(),r&&(r.includes("&")?t=EC(t,r):t=PC(t,r))}),t.join(", ").replace(TC," ")}function j0(e){if(!e)return;const t=e.parentElement;t&&t.removeChild(e)}function Ts(e){return document.querySelector(`style[cssr-id="${e}"]`)}function LC(e){const t=document.createElement("style");return t.setAttribute("cssr-id",e),t}function Bi(e){return e?/^\s*@(s|m)/.test(e):!1}const $C=/[A-Z]/g;function Yp(e){return e.replace($C,t=>"-"+t.toLowerCase())}function IC(e,t=" "){return typeof e=="object"&&e!==null?` { -`+Object.entries(e).map(r=>t+` ${Yp(r[0])}: ${r[1]};`).join(` -`)+` -`+t+"}":`: ${e};`}function RC(e,t,r){return typeof e=="function"?e({context:t.context,props:r}):e}function U0(e,t,r,o){if(!t)return"";const n=RC(t,r,o);if(!n)return"";if(typeof n=="string")return`${e} { -${n} -}`;const i=Object.keys(n);if(i.length===0)return r.config.keepEmptyBlock?e+` { -}`:"";const a=e?[e+" {"]:[];return i.forEach(s=>{const l=n[s];if(s==="raw"){a.push(` -`+l+` -`);return}s=Yp(s),l!=null&&a.push(` ${s}${IC(l)}`)}),e&&a.push("}"),a.join(` -`)}function Nl(e,t,r){e&&e.forEach(o=>{if(Array.isArray(o))Nl(o,t,r);else if(typeof o=="function"){const n=o(t);Array.isArray(n)?Nl(n,t,r):n&&r(n)}else o&&r(o)})}function Qp(e,t,r,o,n,i){const a=e.$;let s="";if(!a||typeof a=="string")Bi(a)?s=a:t.push(a);else if(typeof a=="function"){const u=a({context:o.context,props:n});Bi(u)?s=u:t.push(u)}else if(a.before&&a.before(o.context),!a.$||typeof a.$=="string")Bi(a.$)?s=a.$:t.push(a.$);else if(a.$){const u=a.$({context:o.context,props:n});Bi(u)?s=u:t.push(u)}const l=kC(t),c=U0(l,e.props,o,n);s?(r.push(`${s} {`),i&&c&&i.insertRule(`${s} { -${c} -} -`)):(i&&c&&i.insertRule(c),!i&&c.length&&r.push(c)),e.children&&Nl(e.children,{context:o.context,props:n},u=>{if(typeof u=="string"){const d=U0(l,{raw:u},o,n);i?i.insertRule(d):r.push(d)}else Qp(u,t,r,o,n,i)}),t.pop(),s&&r.push("}"),a&&a.after&&a.after(o.context)}function Jp(e,t,r,o=!1){const n=[];return Qp(e,[],n,t,r,o?e.instance.__styleSheet:void 0),o?"":n.join(` - -`)}function ni(e){for(var t=0,r,o=0,n=e.length;n>=4;++o,n-=4)r=e.charCodeAt(o)&255|(e.charCodeAt(++o)&255)<<8|(e.charCodeAt(++o)&255)<<16|(e.charCodeAt(++o)&255)<<24,r=(r&65535)*1540483477+((r>>>16)*59797<<16),r^=r>>>24,t=(r&65535)*1540483477+((r>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(n){case 3:t^=(e.charCodeAt(o+2)&255)<<16;case 2:t^=(e.charCodeAt(o+1)&255)<<8;case 1:t^=e.charCodeAt(o)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}typeof window<"u"&&(window.__cssrContext={});function AC(e,t,r){const{els:o}=t;if(r===void 0)o.forEach(j0),t.els=[];else{const n=Ts(r);n&&o.includes(n)&&(j0(n),t.els=o.filter(i=>i!==n))}}function V0(e,t){e.push(t)}function OC(e,t,r,o,n,i,a,s,l){if(i&&!l){if(r===void 0){console.error("[css-render/mount]: `id` is required in `silent` mode.");return}const f=window.__cssrContext;f[r]||(f[r]=!0,Jp(t,e,o,i));return}let c;if(r===void 0&&(c=t.render(o),r=ni(c)),l){l.adapter(r,c??t.render(o));return}const u=Ts(r);if(u!==null&&!a)return u;const d=u??LC(r);if(c===void 0&&(c=t.render(o)),d.textContent=c,u!==null)return u;if(s){const f=document.head.querySelector(`meta[name="${s}"]`);if(f)return document.head.insertBefore(d,f),V0(t.els,d),d}return n?document.head.insertBefore(d,document.head.querySelector("style, link")):document.head.appendChild(d),V0(t.els,d),d}function BC(e){return Jp(this,this.instance,e)}function HC(e={}){const{id:t,ssr:r,props:o,head:n=!1,silent:i=!1,force:a=!1,anchorMetaName:s}=e;return OC(this.instance,this,t,o,n,i,a,s,r)}function MC(e={}){const{id:t}=e;AC(this.instance,this,t)}const Hi=function(e,t,r,o){return{instance:e,$:t,props:r,children:o,els:[],render:BC,mount:HC,unmount:MC}},DC=function(e,t,r,o){return Array.isArray(t)?Hi(e,{$:null},null,t):Array.isArray(r)?Hi(e,t,null,r):Array.isArray(o)?Hi(e,t,r,o):Hi(e,t,r,null)};function FC(e={}){let t=null;const r={c:(...o)=>DC(r,...o),use:(o,...n)=>o.install(r,...n),find:Ts,context:{},config:e,get __styleSheet(){if(!t){const o=document.createElement("style");return document.head.appendChild(o),t=document.styleSheets[document.styleSheets.length-1],t}return t}};return r}function zC(e,t){if(e===void 0)return!1;if(t){const{context:{ids:r}}=t;return r.has(e)}return Ts(e)!==null}function NC(e){let t=".",r="__",o="--",n;if(e){let h=e.blockPrefix;h&&(t=h),h=e.elementPrefix,h&&(r=h),h=e.modifierPrefix,h&&(o=h)}const i={install(h){n=h.c;const m=h.context;m.bem={},m.bem.b=null,m.bem.els=null}};function a(h){let m,v;return{before(g){m=g.bem.b,v=g.bem.els,g.bem.els=null},after(g){g.bem.b=m,g.bem.els=v},$({context:g,props:x}){return h=typeof h=="string"?h:h({context:g,props:x}),g.bem.b=h,`${(x==null?void 0:x.bPrefix)||t}${g.bem.b}`}}}function s(h){let m;return{before(v){m=v.bem.els},after(v){v.bem.els=m},$({context:v,props:g}){return h=typeof h=="string"?h:h({context:v,props:g}),v.bem.els=h.split(",").map(x=>x.trim()),v.bem.els.map(x=>`${(g==null?void 0:g.bPrefix)||t}${v.bem.b}${r}${x}`).join(", ")}}}function l(h){return{$({context:m,props:v}){h=typeof h=="string"?h:h({context:m,props:v});const g=h.split(",").map(b=>b.trim());function x(b){return g.map(w=>`&${(v==null?void 0:v.bPrefix)||t}${m.bem.b}${b!==void 0?`${r}${b}`:""}${o}${w}`).join(", ")}const C=m.bem.els;return C!==null?x(C[0]):x()}}}function c(h){return{$({context:m,props:v}){h=typeof h=="string"?h:h({context:m,props:v});const g=m.bem.els;return`&:not(${(v==null?void 0:v.bPrefix)||t}${m.bem.b}${g!==null&&g.length>0?`${r}${g[0]}`:""}${o}${h})`}}}return Object.assign(i,{cB:(...h)=>n(a(h[0]),h[1],h[2]),cE:(...h)=>n(s(h[0]),h[1],h[2]),cM:(...h)=>n(l(h[0]),h[1],h[2]),cNotM:(...h)=>n(c(h[0]),h[1],h[2])}),i}function _e(e,t){return e+(t==="default"?"":t.replace(/^[a-z]/,r=>r.toUpperCase()))}_e("abc","def");const WC="n",ii=`.${WC}-`,jC="__",UC="--",em=FC(),tm=NC({blockPrefix:ii,elementPrefix:jC,modifierPrefix:UC});em.use(tm);const{c:ne,find:ZB}=em,{cB:Se,cE:he,cM:Ce,cNotM:Wl}=tm;function rm(e){return ne(({props:{bPrefix:t}})=>`${t||ii}modal, ${t||ii}drawer`,[e])}function VC(e){return ne(({props:{bPrefix:t}})=>`${t||ii}popover`,[e])}function om(e){return ne(({props:{bPrefix:t}})=>`&${t||ii}modal`,e)}const XB=(...e)=>ne(">",[Se(...e)]),dn=typeof document<"u"&&typeof window<"u",nm=new WeakSet;function YB(e){nm.add(e)}function qC(e){return!nm.has(e)}function GC(e){const t=de(!!e.value);if(t.value)return nr(t);const r=kt(e,o=>{o&&(t.value=!0,r())});return nr(t)}function jl(e){const t=ae(e),r=de(t.value);return kt(t,o=>{r.value=o}),typeof e=="function"?r:{__v_isRef:!0,get value(){return r.value},set value(o){e.set(o)}}}function nu(){return ir()!==null}const im=typeof window<"u";function Ji(e){return e.composedPath()[0]}const KC={mousemoveoutside:new WeakMap,clickoutside:new WeakMap};function ZC(e,t,r){if(e==="mousemoveoutside"){const o=n=>{t.contains(Ji(n))||r(n)};return{mousemove:o,touchstart:o}}else if(e==="clickoutside"){let o=!1;const n=a=>{o=!t.contains(Ji(a))},i=a=>{o&&(t.contains(Ji(a))||r(a))};return{mousedown:n,mouseup:i,touchstart:n,touchend:i}}return console.error(`[evtd/create-trap-handler]: name \`${e}\` is invalid. This could be a bug of evtd.`),{}}function am(e,t,r){const o=KC[e];let n=o.get(t);n===void 0&&o.set(t,n=new WeakMap);let i=n.get(r);return i===void 0&&n.set(r,i=ZC(e,t,r)),i}function XC(e,t,r,o){if(e==="mousemoveoutside"||e==="clickoutside"){const n=am(e,t,r);return Object.keys(n).forEach(i=>{Gt(i,document,n[i],o)}),!0}return!1}function YC(e,t,r,o){if(e==="mousemoveoutside"||e==="clickoutside"){const n=am(e,t,r);return Object.keys(n).forEach(i=>{Pt(i,document,n[i],o)}),!0}return!1}function QC(){if(typeof window>"u")return{on:()=>{},off:()=>{}};const e=new WeakMap,t=new WeakMap;function r(){e.set(this,!0)}function o(){e.set(this,!0),t.set(this,!0)}function n(S,E,I){const P=S[E];return S[E]=function(){return I.apply(S,arguments),P.apply(S,arguments)},S}function i(S,E){S[E]=Event.prototype[E]}const a=new WeakMap,s=Object.getOwnPropertyDescriptor(Event.prototype,"currentTarget");function l(){var S;return(S=a.get(this))!==null&&S!==void 0?S:null}function c(S,E){s!==void 0&&Object.defineProperty(S,"currentTarget",{configurable:!0,enumerable:!0,get:E??s.get})}const u={bubble:{},capture:{}},d={};function f(){const S=function(E){const{type:I,eventPhase:P,bubbles:$}=E,R=Ji(E);if(P===2)return;const B=P===1?"capture":"bubble";let j=R;const Y=[];for(;j===null&&(j=window),Y.push(j),j!==window;)j=j.parentNode||null;const J=u.capture[I],Q=u.bubble[I];if(n(E,"stopPropagation",r),n(E,"stopImmediatePropagation",o),c(E,l),B==="capture"){if(J===void 0)return;for(let ie=Y.length-1;ie>=0&&!e.has(E);--ie){const ge=Y[ie],ve=J.get(ge);if(ve!==void 0){a.set(E,ge);for(const z of ve){if(t.has(E))break;z(E)}}if(ie===0&&!$&&Q!==void 0){const z=Q.get(ge);if(z!==void 0)for(const W of z){if(t.has(E))break;W(E)}}}}else if(B==="bubble"){if(Q===void 0)return;for(let ie=0;ieR(E))};return S.displayName="evtdUnifiedWindowEventHandler",S}const h=f(),m=p();function v(S,E){const I=u[S];return I[E]===void 0&&(I[E]=new Map,window.addEventListener(E,h,S==="capture")),I[E]}function g(S){return d[S]===void 0&&(d[S]=new Set,window.addEventListener(S,m)),d[S]}function x(S,E){let I=S.get(E);return I===void 0&&S.set(E,I=new Set),I}function C(S,E,I,P){const $=u[E][I];if($!==void 0){const R=$.get(S);if(R!==void 0&&R.has(P))return!0}return!1}function b(S,E){const I=d[S];return!!(I!==void 0&&I.has(E))}function w(S,E,I,P){let $;if(typeof P=="object"&&P.once===!0?$=J=>{T(S,E,$,P),I(J)}:$=I,XC(S,E,$,P))return;const B=P===!0||typeof P=="object"&&P.capture===!0?"capture":"bubble",j=v(B,S),Y=x(j,E);if(Y.has($)||Y.add($),E===window){const J=g(S);J.has($)||J.add($)}}function T(S,E,I,P){if(YC(S,E,I,P))return;const R=P===!0||typeof P=="object"&&P.capture===!0,B=R?"capture":"bubble",j=v(B,S),Y=x(j,E);if(E===window&&!C(E,R?"bubble":"capture",S,I)&&b(S,I)){const Q=d[S];Q.delete(I),Q.size===0&&(window.removeEventListener(S,m),d[S]=void 0)}Y.has(I)&&Y.delete(I),Y.size===0&&j.delete(E),j.size===0&&(window.removeEventListener(S,h,B==="capture"),u[B][S]=void 0)}return{on:w,off:T}}const{on:Gt,off:Pt}=QC(),Rn=de(null);function q0(e){if(e.clientX>0||e.clientY>0)Rn.value={x:e.clientX,y:e.clientY};else{const{target:t}=e;if(t instanceof Element){const{left:r,top:o,width:n,height:i}=t.getBoundingClientRect();r>0||o>0?Rn.value={x:r+n/2,y:o+i/2}:Rn.value={x:0,y:0}}else Rn.value=null}}let Mi=0,G0=!0;function sm(){if(!im)return nr(de(null));Mi===0&&Gt("click",document,q0,!0);const e=()=>{Mi+=1};return G0&&(G0=nu())?(Hr(e),Zt(()=>{Mi-=1,Mi===0&&Pt("click",document,q0,!0)})):e(),nr(Rn)}const JC=de(void 0);let Di=0;function K0(){JC.value=Date.now()}let Z0=!0;function lm(e){if(!im)return nr(de(!1));const t=de(!1);let r=null;function o(){r!==null&&window.clearTimeout(r)}function n(){o(),t.value=!0,r=window.setTimeout(()=>{t.value=!1},e)}Di===0&&Gt("click",window,K0,!0);const i=()=>{Di+=1,Gt("click",window,n,!0)};return Z0&&(Z0=nu())?(Hr(i),Zt(()=>{Di-=1,Di===0&&Pt("click",window,K0,!0),Pt("click",window,n,!0),o()})):i(),nr(t)}let Fi=0;const ey=typeof window<"u"&&window.matchMedia!==void 0,ko=de(null);let er,To;function ga(e){e.matches&&(ko.value="dark")}function xa(e){e.matches&&(ko.value="light")}function ty(){er=window.matchMedia("(prefers-color-scheme: dark)"),To=window.matchMedia("(prefers-color-scheme: light)"),er.matches?ko.value="dark":To.matches?ko.value="light":ko.value=null,er.addEventListener?(er.addEventListener("change",ga),To.addEventListener("change",xa)):er.addListener&&(er.addListener(ga),To.addListener(xa))}function ry(){"removeEventListener"in er?(er.removeEventListener("change",ga),To.removeEventListener("change",xa)):"removeListener"in er&&(er.removeListener(ga),To.removeListener(xa)),er=void 0,To=void 0}let X0=!0;function cm(){return ey&&(Fi===0&&ty(),X0&&(X0=nu())&&(Hr(()=>{Fi+=1}),Zt(()=>{Fi-=1,Fi===0&&ry()}))),nr(ko)}function iu(){const e=de(!1);return Sr(()=>{e.value=!0}),nr(e)}const oy=(typeof window>"u"?!1:/iPad|iPhone|iPod/.test(navigator.platform)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)&&!window.MSStream;function ny(){return oy}const iy="n-modal-body",um="n-modal",ay="n-drawer-body",sy="n-popover-body";function Y0(e,t,r="default"){const o=t[r];if(o===void 0)throw new Error(`[vueuc/${e}]: slot[${r}] is empty.`);return o()}function Ul(e,t=!0,r=[]){return e.forEach(o=>{if(o!==null){if(typeof o!="object"){(typeof o=="string"||typeof o=="number")&&r.push(ti(String(o)));return}if(Array.isArray(o)){Ul(o,t,r);return}if(o.type===Je){if(o.children===null)return;Array.isArray(o.children)&&Ul(o.children,t,r)}else o.type!==Lt&&r.push(o)}}),r}function QB(e,t,r="default"){const o=t[r];if(o===void 0)throw new Error(`[vueuc/${e}]: slot[${r}] is empty.`);const n=Ul(o());if(n.length===1)return n[0];throw new Error(`[vueuc/${e}]: slot[${r}] should have exactly one child.`)}const zo="@@coContext",ly={mounted(e,{value:t,modifiers:r}){e[zo]={handler:void 0},typeof t=="function"&&(e[zo].handler=t,Gt("clickoutside",e,t,{capture:r.capture}))},updated(e,{value:t,modifiers:r}){const o=e[zo];typeof t=="function"?o.handler?o.handler!==t&&(Pt("clickoutside",e,o.handler,{capture:r.capture}),o.handler=t,Gt("clickoutside",e,t,{capture:r.capture})):(e[zo].handler=t,Gt("clickoutside",e,t,{capture:r.capture})):o.handler&&(Pt("clickoutside",e,o.handler,{capture:r.capture}),o.handler=void 0)},unmounted(e,{modifiers:t}){const{handler:r}=e[zo];r&&Pt("clickoutside",e,r,{capture:t.capture}),e[zo].handler=void 0}},cy=ly;function uy(e,t){console.error(`[vdirs/${e}]: ${t}`)}class dy{constructor(){this.elementZIndex=new Map,this.nextZIndex=2e3}get elementCount(){return this.elementZIndex.size}ensureZIndex(t,r){const{elementZIndex:o}=this;if(r!==void 0){t.style.zIndex=`${r}`,o.delete(t);return}const{nextZIndex:n}=this;o.has(t)&&o.get(t)+1===this.nextZIndex||(t.style.zIndex=`${n}`,o.set(t,n),this.nextZIndex=n+1,this.squashState())}unregister(t,r){const{elementZIndex:o}=this;o.has(t)?o.delete(t):r===void 0&&uy("z-index-manager/unregister-element","Element not found when unregistering."),this.squashState()}squashState(){const{elementCount:t}=this;t||(this.nextZIndex=2e3),this.nextZIndex-t>2500&&this.rearrange()}rearrange(){const t=Array.from(this.elementZIndex.entries());t.sort((r,o)=>r[1]-o[1]),this.nextZIndex=2e3,t.forEach(r=>{const o=r[0],n=this.nextZIndex++;`${n}`!==o.style.zIndex&&(o.style.zIndex=`${n}`)})}}const cl=new dy,No="@@ziContext",fy={mounted(e,t){const{value:r={}}=t,{zIndex:o,enabled:n}=r;e[No]={enabled:!!n,initialized:!1},n&&(cl.ensureZIndex(e,o),e[No].initialized=!0)},updated(e,t){const{value:r={}}=t,{zIndex:o,enabled:n}=r,i=e[No].enabled;n&&!i&&(cl.ensureZIndex(e,o),e[No].initialized=!0),e[No].enabled=!!n},unmounted(e,t){if(!e[No].initialized)return;const{value:r={}}=t,{zIndex:o}=r;cl.unregister(e,o)}},hy=fy,dm=Symbol("@css-render/vue3-ssr");function py(e,t){return``}function my(e,t){const r=Me(dm,null);if(r===null){console.error("[css-render/vue3-ssr]: no ssr context found.");return}const{styles:o,ids:n}=r;n.has(e)||o!==null&&(n.add(e),o.push(py(e,t)))}const gy=typeof document<"u";function Es(){if(gy)return;const e=Me(dm,null);if(e!==null)return{adapter:my,context:e}}function Q0(e,t){console.error(`[vueuc/${e}]: ${t}`)}function J0(e){return typeof e=="string"?document.querySelector(e):e()}const xy=Oe({name:"LazyTeleport",props:{to:{type:[String,Object],default:void 0},disabled:Boolean,show:{type:Boolean,required:!0}},setup(e){return{showTeleport:GC(Rr(e,"show")),mergedTo:ae(()=>{const{to:t}=e;return t??"body"})}},render(){return this.showTeleport?this.disabled?Y0("lazy-teleport",this.$slots):H(vs,{disabled:this.disabled,to:this.mergedTo},Y0("lazy-teleport",this.$slots)):null}});var Lo=[],vy=function(){return Lo.some(function(e){return e.activeTargets.length>0})},by=function(){return Lo.some(function(e){return e.skippedTargets.length>0})},ed="ResizeObserver loop completed with undelivered notifications.",Cy=function(){var e;typeof ErrorEvent=="function"?e=new ErrorEvent("error",{message:ed}):(e=document.createEvent("Event"),e.initEvent("error",!1,!1),e.message=ed),window.dispatchEvent(e)},ai;(function(e){e.BORDER_BOX="border-box",e.CONTENT_BOX="content-box",e.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"})(ai||(ai={}));var $o=function(e){return Object.freeze(e)},yy=function(){function e(t,r){this.inlineSize=t,this.blockSize=r,$o(this)}return e}(),fm=function(){function e(t,r,o,n){return this.x=t,this.y=r,this.width=o,this.height=n,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,$o(this)}return e.prototype.toJSON=function(){var t=this,r=t.x,o=t.y,n=t.top,i=t.right,a=t.bottom,s=t.left,l=t.width,c=t.height;return{x:r,y:o,top:n,right:i,bottom:a,left:s,width:l,height:c}},e.fromRect=function(t){return new e(t.x,t.y,t.width,t.height)},e}(),au=function(e){return e instanceof SVGElement&&"getBBox"in e},hm=function(e){if(au(e)){var t=e.getBBox(),r=t.width,o=t.height;return!r&&!o}var n=e,i=n.offsetWidth,a=n.offsetHeight;return!(i||a||e.getClientRects().length)},td=function(e){var t;if(e instanceof Element)return!0;var r=(t=e==null?void 0:e.ownerDocument)===null||t===void 0?void 0:t.defaultView;return!!(r&&e instanceof r.Element)},Sy=function(e){switch(e.tagName){case"INPUT":if(e.type!=="image")break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1},Dn=typeof window<"u"?window:{},zi=new WeakMap,rd=/auto|scroll/,wy=/^tb|vertical/,_y=/msie|trident/i.test(Dn.navigator&&Dn.navigator.userAgent),dr=function(e){return parseFloat(e||"0")},Qo=function(e,t,r){return e===void 0&&(e=0),t===void 0&&(t=0),r===void 0&&(r=!1),new yy((r?t:e)||0,(r?e:t)||0)},od=$o({devicePixelContentBoxSize:Qo(),borderBoxSize:Qo(),contentBoxSize:Qo(),contentRect:new fm(0,0,0,0)}),pm=function(e,t){if(t===void 0&&(t=!1),zi.has(e)&&!t)return zi.get(e);if(hm(e))return zi.set(e,od),od;var r=getComputedStyle(e),o=au(e)&&e.ownerSVGElement&&e.getBBox(),n=!_y&&r.boxSizing==="border-box",i=wy.test(r.writingMode||""),a=!o&&rd.test(r.overflowY||""),s=!o&&rd.test(r.overflowX||""),l=o?0:dr(r.paddingTop),c=o?0:dr(r.paddingRight),u=o?0:dr(r.paddingBottom),d=o?0:dr(r.paddingLeft),f=o?0:dr(r.borderTopWidth),p=o?0:dr(r.borderRightWidth),h=o?0:dr(r.borderBottomWidth),m=o?0:dr(r.borderLeftWidth),v=d+c,g=l+u,x=m+p,C=f+h,b=s?e.offsetHeight-C-e.clientHeight:0,w=a?e.offsetWidth-x-e.clientWidth:0,T=n?v+x:0,S=n?g+C:0,E=o?o.width:dr(r.width)-T-w,I=o?o.height:dr(r.height)-S-b,P=E+v+w+x,$=I+g+b+C,R=$o({devicePixelContentBoxSize:Qo(Math.round(E*devicePixelRatio),Math.round(I*devicePixelRatio),i),borderBoxSize:Qo(P,$,i),contentBoxSize:Qo(E,I,i),contentRect:new fm(d,l,E,I)});return zi.set(e,R),R},mm=function(e,t,r){var o=pm(e,r),n=o.borderBoxSize,i=o.contentBoxSize,a=o.devicePixelContentBoxSize;switch(t){case ai.DEVICE_PIXEL_CONTENT_BOX:return a;case ai.BORDER_BOX:return n;default:return i}},Ty=function(){function e(t){var r=pm(t);this.target=t,this.contentRect=r.contentRect,this.borderBoxSize=$o([r.borderBoxSize]),this.contentBoxSize=$o([r.contentBoxSize]),this.devicePixelContentBoxSize=$o([r.devicePixelContentBoxSize])}return e}(),gm=function(e){if(hm(e))return 1/0;for(var t=0,r=e.parentNode;r;)t+=1,r=r.parentNode;return t},Ey=function(){var e=1/0,t=[];Lo.forEach(function(a){if(a.activeTargets.length!==0){var s=[];a.activeTargets.forEach(function(c){var u=new Ty(c.target),d=gm(c.target);s.push(u),c.lastReportedSize=mm(c.target,c.observedBox),de?r.activeTargets.push(n):r.skippedTargets.push(n))})})},Py=function(){var e=0;for(nd(e);vy();)e=Ey(),nd(e);return by()&&Cy(),e>0},ul,xm=[],ky=function(){return xm.splice(0).forEach(function(e){return e()})},Ly=function(e){if(!ul){var t=0,r=document.createTextNode(""),o={characterData:!0};new MutationObserver(function(){return ky()}).observe(r,o),ul=function(){r.textContent="".concat(t?t--:t++)}}xm.push(e),ul()},$y=function(e){Ly(function(){requestAnimationFrame(e)})},ea=0,Iy=function(){return!!ea},Ry=250,Ay={attributes:!0,characterData:!0,childList:!0,subtree:!0},id=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],ad=function(e){return e===void 0&&(e=0),Date.now()+e},dl=!1,Oy=function(){function e(){var t=this;this.stopped=!0,this.listener=function(){return t.schedule()}}return e.prototype.run=function(t){var r=this;if(t===void 0&&(t=Ry),!dl){dl=!0;var o=ad(t);$y(function(){var n=!1;try{n=Py()}finally{if(dl=!1,t=o-ad(),!Iy())return;n?r.run(1e3):t>0?r.run(t):r.start()}})}},e.prototype.schedule=function(){this.stop(),this.run()},e.prototype.observe=function(){var t=this,r=function(){return t.observer&&t.observer.observe(document.body,Ay)};document.body?r():Dn.addEventListener("DOMContentLoaded",r)},e.prototype.start=function(){var t=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),id.forEach(function(r){return Dn.addEventListener(r,t.listener,!0)}))},e.prototype.stop=function(){var t=this;this.stopped||(this.observer&&this.observer.disconnect(),id.forEach(function(r){return Dn.removeEventListener(r,t.listener,!0)}),this.stopped=!0)},e}(),Vl=new Oy,sd=function(e){!ea&&e>0&&Vl.start(),ea+=e,!ea&&Vl.stop()},By=function(e){return!au(e)&&!Sy(e)&&getComputedStyle(e).display==="inline"},Hy=function(){function e(t,r){this.target=t,this.observedBox=r||ai.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return e.prototype.isActive=function(){var t=mm(this.target,this.observedBox,!0);return By(this.target)&&(this.lastReportedSize=t),this.lastReportedSize.inlineSize!==t.inlineSize||this.lastReportedSize.blockSize!==t.blockSize},e}(),My=function(){function e(t,r){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=t,this.callback=r}return e}(),Ni=new WeakMap,ld=function(e,t){for(var r=0;r=0&&(i&&Lo.splice(Lo.indexOf(o),1),o.observationTargets.splice(n,1),sd(-1))},e.disconnect=function(t){var r=this,o=Ni.get(t);o.observationTargets.slice().forEach(function(n){return r.unobserve(t,n.target)}),o.activeTargets.splice(0,o.activeTargets.length)},e}(),Dy=function(){function e(t){if(arguments.length===0)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if(typeof t!="function")throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Wi.connect(this,t)}return e.prototype.observe=function(t,r){if(arguments.length===0)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!td(t))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Wi.observe(this,t,r)},e.prototype.unobserve=function(t){if(arguments.length===0)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!td(t))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Wi.unobserve(this,t)},e.prototype.disconnect=function(){Wi.disconnect(this)},e.toString=function(){return"function ResizeObserver () { [polyfill code] }"},e}();class Fy{constructor(){this.handleResize=this.handleResize.bind(this),this.observer=new(typeof window<"u"&&window.ResizeObserver||Dy)(this.handleResize),this.elHandlersMap=new Map}handleResize(t){for(const r of t){const o=this.elHandlersMap.get(r.target);o!==void 0&&o(r)}}registerHandler(t,r){this.elHandlersMap.set(t,r),this.observer.observe(t)}unregisterHandler(t){this.elHandlersMap.has(t)&&(this.elHandlersMap.delete(t),this.observer.unobserve(t))}}const cd=new Fy,ud=Oe({name:"ResizeObserver",props:{onResize:Function},setup(e){let t=!1;const r=ir().proxy;function o(n){const{onResize:i}=e;i!==void 0&&i(n)}Sr(()=>{const n=r.$el;if(n===void 0){Q0("resize-observer","$el does not exist.");return}if(n.nextElementSibling!==n.nextSibling&&n.nodeType===3&&n.nodeValue!==""){Q0("resize-observer","$el can not be observed (it may be a text node).");return}n.nextElementSibling!==null&&(cd.registerHandler(n.nextElementSibling,o),t=!0)}),Zt(()=>{t&&cd.unregisterHandler(r.$el.nextElementSibling)})},render(){return Tp(this.$slots,"default")}});function vm(e){return e instanceof HTMLElement}function bm(e){for(let t=0;t=0;t--){const r=e.childNodes[t];if(vm(r)&&(ym(r)||Cm(r)))return!0}return!1}function ym(e){if(!zy(e))return!1;try{e.focus({preventScroll:!0})}catch{}return document.activeElement===e}function zy(e){if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute("tabIndex")!==null)return!0;if(e.getAttribute("disabled"))return!1;switch(e.nodeName){case"A":return!!e.href&&e.rel!=="ignore";case"INPUT":return e.type!=="hidden"&&e.type!=="file";case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}}let wn=[];const Ny=Oe({name:"FocusTrap",props:{disabled:Boolean,active:Boolean,autoFocus:{type:Boolean,default:!0},onEsc:Function,initialFocusTo:String,finalFocusTo:String,returnFocusOnDeactivated:{type:Boolean,default:!0}},setup(e){const t=ws(),r=de(null),o=de(null);let n=!1,i=!1;const a=typeof document>"u"?null:document.activeElement;function s(){return wn[wn.length-1]===t}function l(v){var g;v.code==="Escape"&&s()&&((g=e.onEsc)===null||g===void 0||g.call(e,v))}Sr(()=>{kt(()=>e.active,v=>{v?(d(),Gt("keydown",document,l)):(Pt("keydown",document,l),n&&f())},{immediate:!0})}),Zt(()=>{Pt("keydown",document,l),n&&f()});function c(v){if(!i&&s()){const g=u();if(g===null||g.contains(Qc(v)))return;p("first")}}function u(){const v=r.value;if(v===null)return null;let g=v;for(;g=g.nextSibling,!(g===null||g instanceof Element&&g.tagName==="DIV"););return g}function d(){var v;if(!e.disabled){if(wn.push(t),e.autoFocus){const{initialFocusTo:g}=e;g===void 0?p("first"):(v=J0(g))===null||v===void 0||v.focus({preventScroll:!0})}n=!0,document.addEventListener("focus",c,!0)}}function f(){var v;if(e.disabled||(document.removeEventListener("focus",c,!0),wn=wn.filter(x=>x!==t),s()))return;const{finalFocusTo:g}=e;g!==void 0?(v=J0(g))===null||v===void 0||v.focus({preventScroll:!0}):e.returnFocusOnDeactivated&&a instanceof HTMLElement&&(i=!0,a.focus({preventScroll:!0}),i=!1)}function p(v){if(s()&&e.active){const g=r.value,x=o.value;if(g!==null&&x!==null){const C=u();if(C==null||C===x){i=!0,g.focus({preventScroll:!0}),i=!1;return}i=!0;const b=v==="first"?bm(C):Cm(C);i=!1,b||(i=!0,g.focus({preventScroll:!0}),i=!1)}}}function h(v){if(i)return;const g=u();g!==null&&(v.relatedTarget!==null&&g.contains(v.relatedTarget)?p("last"):p("first"))}function m(v){i||(v.relatedTarget!==null&&v.relatedTarget===r.value?p("last"):p("first"))}return{focusableStartRef:r,focusableEndRef:o,focusableStyle:"position: absolute; height: 0; width: 0;",handleStartFocus:h,handleEndFocus:m}},render(){const{default:e}=this.$slots;if(e===void 0)return null;if(this.disabled)return e();const{active:t,focusableStyle:r}=this;return H(Je,null,[H("div",{"aria-hidden":"true",tabindex:t?"0":"-1",ref:"focusableStartRef",style:r,onFocus:this.handleStartFocus}),e(),H("div",{"aria-hidden":"true",style:r,ref:"focusableEndRef",tabindex:t?"0":"-1",onFocus:this.handleEndFocus})])}});let Wo=0,dd="",fd="",hd="",pd="";const md=de("0px");function Wy(e){if(typeof document>"u")return;const t=document.documentElement;let r,o=!1;const n=()=>{t.style.marginRight=dd,t.style.overflow=fd,t.style.overflowX=hd,t.style.overflowY=pd,md.value="0px"};Sr(()=>{r=kt(e,i=>{if(i){if(!Wo){const a=window.innerWidth-t.offsetWidth;a>0&&(dd=t.style.marginRight,t.style.marginRight=`${a}px`,md.value=`${a}px`),fd=t.style.overflow,hd=t.style.overflowX,pd=t.style.overflowY,t.style.overflow="hidden",t.style.overflowX="hidden",t.style.overflowY="hidden"}o=!0,Wo++}else Wo--,Wo||n(),o=!1},{immediate:!0})}),Zt(()=>{r==null||r(),o&&(Wo--,Wo||n(),o=!1)})}const su=de(!1),gd=()=>{su.value=!0},xd=()=>{su.value=!1};let _n=0;const jy=()=>(dn&&(Hr(()=>{_n||(window.addEventListener("compositionstart",gd),window.addEventListener("compositionend",xd)),_n++}),Zt(()=>{_n<=1?(window.removeEventListener("compositionstart",gd),window.removeEventListener("compositionend",xd),_n=0):_n--})),su);function Uy(e){const t={isDeactivated:!1};let r=!1;return bp(()=>{if(t.isDeactivated=!1,!r){r=!0;return}e()}),Cp(()=>{t.isDeactivated=!0,r||(r=!0)}),t}const vd="n-form-item";function Vy(e,{defaultSize:t="medium",mergedSize:r,mergedDisabled:o}={}){const n=Me(vd,null);dt(vd,null);const i=ae(r?()=>r(n):()=>{const{size:l}=e;if(l)return l;if(n){const{mergedSize:c}=n;if(c.value!==void 0)return c.value}return t}),a=ae(o?()=>o(n):()=>{const{disabled:l}=e;return l!==void 0?l:n?n.disabled.value:!1}),s=ae(()=>{const{status:l}=e;return l||(n==null?void 0:n.mergedValidationStatus.value)});return Zt(()=>{n&&n.restoreValidation()}),{mergedSizeRef:i,mergedDisabledRef:a,mergedStatusRef:s,nTriggerFormBlur(){n&&n.handleContentBlur()},nTriggerFormChange(){n&&n.handleContentChange()},nTriggerFormFocus(){n&&n.handleContentFocus()},nTriggerFormInput(){n&&n.handleContentInput()}}}var qy=typeof global=="object"&&global&&global.Object===Object&&global;const Sm=qy;var Gy=typeof self=="object"&&self&&self.Object===Object&&self,Ky=Sm||Gy||Function("return this")();const fn=Ky;var Zy=fn.Symbol;const rn=Zy;var wm=Object.prototype,Xy=wm.hasOwnProperty,Yy=wm.toString,Tn=rn?rn.toStringTag:void 0;function Qy(e){var t=Xy.call(e,Tn),r=e[Tn];try{e[Tn]=void 0;var o=!0}catch{}var n=Yy.call(e);return o&&(t?e[Tn]=r:delete e[Tn]),n}var Jy=Object.prototype,e4=Jy.toString;function t4(e){return e4.call(e)}var r4="[object Null]",o4="[object Undefined]",bd=rn?rn.toStringTag:void 0;function Ci(e){return e==null?e===void 0?o4:r4:bd&&bd in Object(e)?Qy(e):t4(e)}function hn(e){return e!=null&&typeof e=="object"}var n4="[object Symbol]";function i4(e){return typeof e=="symbol"||hn(e)&&Ci(e)==n4}function a4(e,t){for(var r=-1,o=e==null?0:e.length,n=Array(o);++r0){if(++t>=I4)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function B4(e){return function(){return e}}var H4=function(){try{var e=cu(Object,"defineProperty");return e({},"",{}),e}catch{}}();const ba=H4;var M4=ba?function(e,t){return ba(e,"toString",{configurable:!0,enumerable:!1,value:B4(t),writable:!0})}:Tm;const D4=M4;var F4=O4(D4);const z4=F4;var N4=9007199254740991,W4=/^(?:0|[1-9]\d*)$/;function Em(e,t){var r=typeof e;return t=t??N4,!!t&&(r=="number"||r!="symbol"&&W4.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=Z4}function du(e){return e!=null&&Pm(e.length)&&!lu(e)}function X4(e,t,r){if(!Oo(r))return!1;var o=typeof t;return(o=="number"?du(r)&&Em(t,r.length):o=="string"&&t in r)?Ps(r[t],e):!1}function Y4(e){return K4(function(t,r){var o=-1,n=r.length,i=n>1?r[n-1]:void 0,a=n>2?r[2]:void 0;for(i=e.length>3&&typeof i=="function"?(n--,i):void 0,a&&X4(r[0],r[1],a)&&(i=n<3?void 0:i,n=1),t=Object(t);++o-1}function c8(e,t){var r=this.__data__,o=ks(r,e);return o<0?(++this.size,r.push([e,t])):r[o][1]=t,this}function Mr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++tn?0:n+t),r=r>n?n:r,r<0&&(r+=n),n=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(n);++o=o?e:T8(e,t,r)}var P8="\\ud800-\\udfff",k8="\\u0300-\\u036f",L8="\\ufe20-\\ufe2f",$8="\\u20d0-\\u20ff",I8=k8+L8+$8,R8="\\ufe0e\\ufe0f",A8="\\u200d",O8=RegExp("["+A8+P8+I8+R8+"]");function Dm(e){return O8.test(e)}function B8(e){return e.split("")}var Fm="\\ud800-\\udfff",H8="\\u0300-\\u036f",M8="\\ufe20-\\ufe2f",D8="\\u20d0-\\u20ff",F8=H8+M8+D8,z8="\\ufe0e\\ufe0f",N8="["+Fm+"]",Gl="["+F8+"]",Kl="\\ud83c[\\udffb-\\udfff]",W8="(?:"+Gl+"|"+Kl+")",zm="[^"+Fm+"]",Nm="(?:\\ud83c[\\udde6-\\uddff]){2}",Wm="[\\ud800-\\udbff][\\udc00-\\udfff]",j8="\\u200d",jm=W8+"?",Um="["+z8+"]?",U8="(?:"+j8+"(?:"+[zm,Nm,Wm].join("|")+")"+Um+jm+")*",V8=Um+jm+U8,q8="(?:"+[zm+Gl+"?",Gl,Nm,Wm,N8].join("|")+")",G8=RegExp(Kl+"(?="+Kl+")|"+q8+V8,"g");function K8(e){return e.match(G8)||[]}function Z8(e){return Dm(e)?K8(e):B8(e)}function X8(e){return function(t){t=x8(t);var r=Dm(t)?Z8(t):void 0,o=r?r[0]:t.charAt(0),n=r?E8(r,1).join(""):t.slice(1);return o[e]()+n}}var Y8=X8("toUpperCase");const Q8=Y8;function J8(){this.__data__=new Mr,this.size=0}function e3(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}function t3(e){return this.__data__.get(e)}function r3(e){return this.__data__.has(e)}var o3=200;function n3(e,t){var r=this.__data__;if(r instanceof Mr){var o=r.__data__;if(!Bm||o.length{const u=i==null?void 0:i.value;r.mount({id:u===void 0?t:u+t,head:!0,props:{bPrefix:u?`.${u}-`:void 0},anchorMetaName:li,ssr:a}),s!=null&&s.preflightStyleDisabled||Gm.mount({id:"n-global",head:!0,anchorMetaName:li,ssr:a})};a?c():Hr(c)}return ae(()=>{var c;const{theme:{common:u,self:d,peers:f={}}={},themeOverrides:p={},builtinThemeOverrides:h={}}=n,{common:m,peers:v}=p,{common:g=void 0,[e]:{common:x=void 0,self:C=void 0,peers:b={}}={}}=(s==null?void 0:s.mergedThemeRef.value)||{},{common:w=void 0,[e]:T={}}=(s==null?void 0:s.mergedThemeOverridesRef.value)||{},{common:S,peers:E={}}=T,I=An({},u||x||g||o.common,w,S,m),P=An((c=d||C||o.self)===null||c===void 0?void 0:c(I),h,T,p);return{common:I,self:P,peers:An({},o.peers,b,f),peerOverrides:An({},h.peers,E,v)}})}Ct.props={theme:Object,themeOverrides:Object,builtinThemeOverrides:Object};const ci="n";function sr(e={},t={defaultBordered:!0}){const r=Me(oo,null);return{inlineThemeDisabled:r==null?void 0:r.inlineThemeDisabled,mergedRtlRef:r==null?void 0:r.mergedRtlRef,mergedComponentPropsRef:r==null?void 0:r.mergedComponentPropsRef,mergedBreakpointsRef:r==null?void 0:r.mergedBreakpointsRef,mergedBorderedRef:ae(()=>{var o,n;const{bordered:i}=e;return i!==void 0?i:(n=(o=r==null?void 0:r.mergedBorderedRef.value)!==null&&o!==void 0?o:t.defaultBordered)!==null&&n!==void 0?n:!0}),mergedClsPrefixRef:r?r.mergedClsPrefixRef:fs(ci),namespaceRef:ae(()=>r==null?void 0:r.mergedNamespaceRef.value)}}function JB(){const e=Me(oo,null);return e?e.mergedClsPrefixRef:fs(ci)}const y3={name:"zh-CN",global:{undo:"撤销",redo:"重做",confirm:"确认",clear:"清除"},Popconfirm:{positiveText:"确认",negativeText:"取消"},Cascader:{placeholder:"请选择",loading:"加载中",loadingRequiredMessage:e=>`加载全部 ${e} 的子节点后才可选中`},Time:{dateFormat:"yyyy-MM-dd",dateTimeFormat:"yyyy-MM-dd HH:mm:ss"},DatePicker:{yearFormat:"yyyy年",monthFormat:"MMM",dayFormat:"eeeeee",yearTypeFormat:"yyyy",monthTypeFormat:"yyyy-MM",dateFormat:"yyyy-MM-dd",dateTimeFormat:"yyyy-MM-dd HH:mm:ss",quarterFormat:"yyyy-qqq",clear:"清除",now:"此刻",confirm:"确认",selectTime:"选择时间",selectDate:"选择日期",datePlaceholder:"选择日期",datetimePlaceholder:"选择日期时间",monthPlaceholder:"选择月份",yearPlaceholder:"选择年份",quarterPlaceholder:"选择季度",startDatePlaceholder:"开始日期",endDatePlaceholder:"结束日期",startDatetimePlaceholder:"开始日期时间",endDatetimePlaceholder:"结束日期时间",startMonthPlaceholder:"开始月份",endMonthPlaceholder:"结束月份",monthBeforeYear:!1,firstDayOfWeek:0,today:"今天"},DataTable:{checkTableAll:"选择全部表格数据",uncheckTableAll:"取消选择全部表格数据",confirm:"确认",clear:"重置"},LegacyTransfer:{sourceTitle:"源项",targetTitle:"目标项"},Transfer:{selectAll:"全选",clearAll:"清除",unselectAll:"取消全选",total:e=>`共 ${e} 项`,selected:e=>`已选 ${e} 项`},Empty:{description:"无数据"},Select:{placeholder:"请选择"},TimePicker:{placeholder:"请选择时间",positiveText:"确认",negativeText:"取消",now:"此刻"},Pagination:{goto:"跳至",selectionSuffix:"页"},DynamicTags:{add:"添加"},Log:{loading:"加载中"},Input:{placeholder:"请输入"},InputNumber:{placeholder:"请输入"},DynamicInput:{create:"添加"},ThemeEditor:{title:"主题编辑器",clearAllVars:"清除全部变量",clearSearch:"清除搜索",filterCompName:"过滤组件名",filterVarName:"过滤变量名",import:"导入",export:"导出",restore:"恢复默认"},Image:{tipPrevious:"上一张(←)",tipNext:"下一张(→)",tipCounterclockwise:"向左旋转",tipClockwise:"向右旋转",tipZoomOut:"缩小",tipZoomIn:"放大",tipDownload:"下载",tipClose:"关闭(Esc)",tipOriginalSize:"缩放到原始尺寸"}},Od=y3,S3={name:"en-US",global:{undo:"Undo",redo:"Redo",confirm:"Confirm",clear:"Clear"},Popconfirm:{positiveText:"Confirm",negativeText:"Cancel"},Cascader:{placeholder:"Please Select",loading:"Loading",loadingRequiredMessage:e=>`Please load all ${e}'s descendants before checking it.`},Time:{dateFormat:"yyyy-MM-dd",dateTimeFormat:"yyyy-MM-dd HH:mm:ss"},DatePicker:{yearFormat:"yyyy",monthFormat:"MMM",dayFormat:"eeeeee",yearTypeFormat:"yyyy",monthTypeFormat:"yyyy-MM",dateFormat:"yyyy-MM-dd",dateTimeFormat:"yyyy-MM-dd HH:mm:ss",quarterFormat:"yyyy-qqq",clear:"Clear",now:"Now",confirm:"Confirm",selectTime:"Select Time",selectDate:"Select Date",datePlaceholder:"Select Date",datetimePlaceholder:"Select Date and Time",monthPlaceholder:"Select Month",yearPlaceholder:"Select Year",quarterPlaceholder:"Select Quarter",startDatePlaceholder:"Start Date",endDatePlaceholder:"End Date",startDatetimePlaceholder:"Start Date and Time",endDatetimePlaceholder:"End Date and Time",startMonthPlaceholder:"Start Month",endMonthPlaceholder:"End Month",monthBeforeYear:!0,firstDayOfWeek:6,today:"Today"},DataTable:{checkTableAll:"Select all in the table",uncheckTableAll:"Unselect all in the table",confirm:"Confirm",clear:"Clear"},LegacyTransfer:{sourceTitle:"Source",targetTitle:"Target"},Transfer:{selectAll:"Select all",unselectAll:"Unselect all",clearAll:"Clear",total:e=>`Total ${e} items`,selected:e=>`${e} items selected`},Empty:{description:"No Data"},Select:{placeholder:"Please Select"},TimePicker:{placeholder:"Select Time",positiveText:"OK",negativeText:"Cancel",now:"Now"},Pagination:{goto:"Goto",selectionSuffix:"page"},DynamicTags:{add:"Add"},Log:{loading:"Loading"},Input:{placeholder:"Please Input"},InputNumber:{placeholder:"Please Input"},DynamicInput:{create:"Create"},ThemeEditor:{title:"Theme Editor",clearAllVars:"Clear All Variables",clearSearch:"Clear Search",filterCompName:"Filter Component Name",filterVarName:"Filter Variable Name",import:"Import",export:"Export",restore:"Reset to Default"},Image:{tipPrevious:"Previous picture (←)",tipNext:"Next picture (→)",tipCounterclockwise:"Counterclockwise",tipClockwise:"Clockwise",tipZoomOut:"Zoom out",tipZoomIn:"Zoom in",tipDownload:"Download",tipClose:"Close (Esc)",tipOriginalSize:"Zoom to original size"}},w3=S3;function $s(e,t,r){if(!t)return;const o=Es(),n=Me(oo,null),i=()=>{const a=r.value;t.mount({id:a===void 0?e:a+e,head:!0,anchorMetaName:li,props:{bPrefix:a?`.${a}-`:void 0},ssr:o}),n!=null&&n.preflightStyleDisabled||Gm.mount({id:"n-global",head:!0,anchorMetaName:li,ssr:o})};o?i():Hr(i)}function so(e,t,r,o){var n;r||vi("useThemeClass","cssVarsRef is not passed");const i=(n=Me(oo,null))===null||n===void 0?void 0:n.mergedThemeHashRef,a=de(""),s=Es();let l;const c=`__${e}`,u=()=>{let d=c;const f=t?t.value:void 0,p=i==null?void 0:i.value;p&&(d+="-"+p),f&&(d+="-"+f);const{themeOverrides:h,builtinThemeOverrides:m}=o;h&&(d+="-"+ni(JSON.stringify(h))),m&&(d+="-"+ni(JSON.stringify(m))),a.value=d,l=()=>{const v=r.value;let g="";for(const x in v)g+=`${x}: ${v[x]};`;ne(`.${d}`,g).mount({id:d,ssr:s}),l=void 0}};return gs(()=>{u()}),{themeClass:a,onRender:()=>{l==null||l()}}}function yi(e,t,r){if(!t)return;const o=Es(),n=ae(()=>{const{value:a}=t;if(!a)return;const s=a[e];if(s)return s}),i=()=>{gs(()=>{const{value:a}=r,s=`${a}${e}Rtl`;if(zC(s,o))return;const{value:l}=n;l&&l.style.mount({id:s,head:!0,anchorMetaName:li,props:{bPrefix:a?`.${a}-`:void 0},ssr:o})})};return o?i():Hr(i),n}function Si(e,t){return Oe({name:Q8(e),setup(){var r;const o=(r=Me(oo,null))===null||r===void 0?void 0:r.mergedIconsRef;return()=>{var n;const i=(n=o==null?void 0:o.value)===null||n===void 0?void 0:n[e];return i?i():t}}})}const _3=Si("close",H("svg",{viewBox:"0 0 12 12",version:"1.1",xmlns:"http://www.w3.org/2000/svg","aria-hidden":!0},H("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},H("g",{fill:"currentColor","fill-rule":"nonzero"},H("path",{d:"M2.08859116,2.2156945 L2.14644661,2.14644661 C2.32001296,1.97288026 2.58943736,1.95359511 2.7843055,2.08859116 L2.85355339,2.14644661 L6,5.293 L9.14644661,2.14644661 C9.34170876,1.95118446 9.65829124,1.95118446 9.85355339,2.14644661 C10.0488155,2.34170876 10.0488155,2.65829124 9.85355339,2.85355339 L6.707,6 L9.85355339,9.14644661 C10.0271197,9.32001296 10.0464049,9.58943736 9.91140884,9.7843055 L9.85355339,9.85355339 C9.67998704,10.0271197 9.41056264,10.0464049 9.2156945,9.91140884 L9.14644661,9.85355339 L6,6.707 L2.85355339,9.85355339 C2.65829124,10.0488155 2.34170876,10.0488155 2.14644661,9.85355339 C1.95118446,9.65829124 1.95118446,9.34170876 2.14644661,9.14644661 L5.293,6 L2.14644661,2.85355339 C1.97288026,2.67998704 1.95359511,2.41056264 2.08859116,2.2156945 L2.14644661,2.14644661 L2.08859116,2.2156945 Z"}))))),fu=Si("error",H("svg",{viewBox:"0 0 48 48",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},H("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},H("g",{"fill-rule":"nonzero"},H("path",{d:"M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M17.8838835,16.1161165 L17.7823881,16.0249942 C17.3266086,15.6583353 16.6733914,15.6583353 16.2176119,16.0249942 L16.1161165,16.1161165 L16.0249942,16.2176119 C15.6583353,16.6733914 15.6583353,17.3266086 16.0249942,17.7823881 L16.1161165,17.8838835 L22.233,24 L16.1161165,30.1161165 L16.0249942,30.2176119 C15.6583353,30.6733914 15.6583353,31.3266086 16.0249942,31.7823881 L16.1161165,31.8838835 L16.2176119,31.9750058 C16.6733914,32.3416647 17.3266086,32.3416647 17.7823881,31.9750058 L17.8838835,31.8838835 L24,25.767 L30.1161165,31.8838835 L30.2176119,31.9750058 C30.6733914,32.3416647 31.3266086,32.3416647 31.7823881,31.9750058 L31.8838835,31.8838835 L31.9750058,31.7823881 C32.3416647,31.3266086 32.3416647,30.6733914 31.9750058,30.2176119 L31.8838835,30.1161165 L25.767,24 L31.8838835,17.8838835 L31.9750058,17.7823881 C32.3416647,17.3266086 32.3416647,16.6733914 31.9750058,16.2176119 L31.8838835,16.1161165 L31.7823881,16.0249942 C31.3266086,15.6583353 30.6733914,15.6583353 30.2176119,16.0249942 L30.1161165,16.1161165 L24,22.233 L17.8838835,16.1161165 L17.7823881,16.0249942 L17.8838835,16.1161165 Z"}))))),Ca=Si("info",H("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},H("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},H("g",{"fill-rule":"nonzero"},H("path",{d:"M14,2 C20.6274,2 26,7.37258 26,14 C26,20.6274 20.6274,26 14,26 C7.37258,26 2,20.6274 2,14 C2,7.37258 7.37258,2 14,2 Z M14,11 C13.4477,11 13,11.4477 13,12 L13,12 L13,20 C13,20.5523 13.4477,21 14,21 C14.5523,21 15,20.5523 15,20 L15,20 L15,12 C15,11.4477 14.5523,11 14,11 Z M14,6.75 C13.3096,6.75 12.75,7.30964 12.75,8 C12.75,8.69036 13.3096,9.25 14,9.25 C14.6904,9.25 15.25,8.69036 15.25,8 C15.25,7.30964 14.6904,6.75 14,6.75 Z"}))))),hu=Si("success",H("svg",{viewBox:"0 0 48 48",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},H("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},H("g",{"fill-rule":"nonzero"},H("path",{d:"M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M32.6338835,17.6161165 C32.1782718,17.1605048 31.4584514,17.1301307 30.9676119,17.5249942 L30.8661165,17.6161165 L20.75,27.732233 L17.1338835,24.1161165 C16.6457281,23.6279612 15.8542719,23.6279612 15.3661165,24.1161165 C14.9105048,24.5717282 14.8801307,25.2915486 15.2749942,25.7823881 L15.3661165,25.8838835 L19.8661165,30.3838835 C20.3217282,30.8394952 21.0415486,30.8698693 21.5323881,30.4750058 L21.6338835,30.3838835 L32.6338835,19.3838835 C33.1220388,18.8957281 33.1220388,18.1042719 32.6338835,17.6161165 Z"}))))),pu=Si("warning",H("svg",{viewBox:"0 0 24 24",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},H("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},H("g",{"fill-rule":"nonzero"},H("path",{d:"M12,2 C17.523,2 22,6.478 22,12 C22,17.522 17.523,22 12,22 C6.477,22 2,17.522 2,12 C2,6.478 6.477,2 12,2 Z M12.0018002,15.0037242 C11.450254,15.0037242 11.0031376,15.4508407 11.0031376,16.0023869 C11.0031376,16.553933 11.450254,17.0010495 12.0018002,17.0010495 C12.5533463,17.0010495 13.0004628,16.553933 13.0004628,16.0023869 C13.0004628,15.4508407 12.5533463,15.0037242 12.0018002,15.0037242 Z M11.99964,7 C11.4868042,7.00018474 11.0642719,7.38637706 11.0066858,7.8837365 L11,8.00036004 L11.0018003,13.0012393 L11.00857,13.117858 C11.0665141,13.6151758 11.4893244,14.0010638 12.0021602,14.0008793 C12.514996,14.0006946 12.9375283,13.6145023 12.9951144,13.1171428 L13.0018002,13.0005193 L13,7.99964009 L12.9932303,7.8830214 C12.9352861,7.38570354 12.5124758,6.99981552 11.99964,7 Z"}))))),mu=Oe({name:"BaseIconSwitchTransition",setup(e,{slots:t}){const r=iu();return()=>H(br,{name:"icon-switch-transition",appear:r.value},t)}}),Km=Oe({name:"FadeInExpandTransition",props:{appear:Boolean,group:Boolean,mode:String,onLeave:Function,onAfterLeave:Function,onAfterEnter:Function,width:Boolean,reverse:Boolean},setup(e,{slots:t}){function r(s){e.width?s.style.maxWidth=`${s.offsetWidth}px`:s.style.maxHeight=`${s.offsetHeight}px`,s.offsetWidth}function o(s){e.width?s.style.maxWidth="0":s.style.maxHeight="0",s.offsetWidth;const{onLeave:l}=e;l&&l()}function n(s){e.width?s.style.maxWidth="":s.style.maxHeight="";const{onAfterLeave:l}=e;l&&l()}function i(s){if(s.style.transition="none",e.width){const l=s.offsetWidth;s.style.maxWidth="0",s.offsetWidth,s.style.transition="",s.style.maxWidth=`${l}px`}else if(e.reverse)s.style.maxHeight=`${s.offsetHeight}px`,s.offsetHeight,s.style.transition="",s.style.maxHeight="0";else{const l=s.offsetHeight;s.style.maxHeight="0",s.offsetWidth,s.style.transition="",s.style.maxHeight=`${l}px`}s.offsetWidth}function a(s){var l;e.width?s.style.maxWidth="":e.reverse||(s.style.maxHeight=""),(l=e.onAfterEnter)===null||l===void 0||l.call(e)}return()=>{const{group:s,width:l,appear:c,mode:u}=e,d=s?oC:br,f={name:l?"fade-in-width-expand-transition":"fade-in-height-expand-transition",appear:c,onEnter:i,onAfterEnter:a,onBeforeLeave:r,onLeave:o,onAfterLeave:n};return s||(f.mode=u),H(d,f,t)}}}),T3=Se("base-icon",` - height: 1em; - width: 1em; - line-height: 1em; - text-align: center; - display: inline-block; - position: relative; - fill: currentColor; - transform: translateZ(0); -`,[ne("svg",` - height: 1em; - width: 1em; - `)]),Is=Oe({name:"BaseIcon",props:{role:String,ariaLabel:String,ariaDisabled:{type:Boolean,default:void 0},ariaHidden:{type:Boolean,default:void 0},clsPrefix:{type:String,required:!0},onClick:Function,onMousedown:Function,onMouseup:Function},setup(e){$s("-base-icon",T3,Rr(e,"clsPrefix"))},render(){return H("i",{class:`${this.clsPrefix}-base-icon`,onClick:this.onClick,onMousedown:this.onMousedown,onMouseup:this.onMouseup,role:this.role,"aria-label":this.ariaLabel,"aria-hidden":this.ariaHidden,"aria-disabled":this.ariaDisabled},this.$slots)}}),E3=Se("base-close",` - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - background-color: transparent; - color: var(--n-close-icon-color); - border-radius: var(--n-close-border-radius); - height: var(--n-close-size); - width: var(--n-close-size); - font-size: var(--n-close-icon-size); - outline: none; - border: none; - position: relative; - padding: 0; -`,[Ce("absolute",` - height: var(--n-close-icon-size); - width: var(--n-close-icon-size); - `),ne("&::before",` - content: ""; - position: absolute; - width: var(--n-close-size); - height: var(--n-close-size); - left: 50%; - top: 50%; - transform: translateY(-50%) translateX(-50%); - transition: inherit; - border-radius: inherit; - `),Wl("disabled",[ne("&:hover",` - color: var(--n-close-icon-color-hover); - `),ne("&:hover::before",` - background-color: var(--n-close-color-hover); - `),ne("&:focus::before",` - background-color: var(--n-close-color-hover); - `),ne("&:active",` - color: var(--n-close-icon-color-pressed); - `),ne("&:active::before",` - background-color: var(--n-close-color-pressed); - `)]),Ce("disabled",` - cursor: not-allowed; - color: var(--n-close-icon-color-disabled); - background-color: transparent; - `),Ce("round",[ne("&::before",` - border-radius: 50%; - `)])]),Rs=Oe({name:"BaseClose",props:{isButtonTag:{type:Boolean,default:!0},clsPrefix:{type:String,required:!0},disabled:{type:Boolean,default:void 0},focusable:{type:Boolean,default:!0},round:Boolean,onClick:Function,absolute:Boolean},setup(e){return $s("-base-close",E3,Rr(e,"clsPrefix")),()=>{const{clsPrefix:t,disabled:r,absolute:o,round:n,isButtonTag:i}=e;return H(i?"button":"div",{type:i?"button":void 0,tabindex:r||!e.focusable?-1:0,"aria-disabled":r,"aria-label":"close",role:i?void 0:"button",disabled:r,class:[`${t}-base-close`,o&&`${t}-base-close--absolute`,r&&`${t}-base-close--disabled`,n&&`${t}-base-close--round`],onMousedown:s=>{e.focusable||s.preventDefault()},onClick:e.onClick},H(Is,{clsPrefix:t},{default:()=>H(_3,null)}))}}}),{cubicBezierEaseInOut:P3}=ao;function ya({originalTransform:e="",left:t=0,top:r=0,transition:o=`all .3s ${P3} !important`}={}){return[ne("&.icon-switch-transition-enter-from, &.icon-switch-transition-leave-to",{transform:e+" scale(0.75)",left:t,top:r,opacity:0}),ne("&.icon-switch-transition-enter-to, &.icon-switch-transition-leave-from",{transform:`scale(1) ${e}`,left:t,top:r,opacity:1}),ne("&.icon-switch-transition-enter-active, &.icon-switch-transition-leave-active",{transformOrigin:"center",position:"absolute",left:t,top:r,transition:o})]}const k3=ne([ne("@keyframes loading-container-rotate",` - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - `),ne("@keyframes loading-layer-rotate",` - 12.5% { - -webkit-transform: rotate(135deg); - transform: rotate(135deg); - } - 25% { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - 37.5% { - -webkit-transform: rotate(405deg); - transform: rotate(405deg); - } - 50% { - -webkit-transform: rotate(540deg); - transform: rotate(540deg); - } - 62.5% { - -webkit-transform: rotate(675deg); - transform: rotate(675deg); - } - 75% { - -webkit-transform: rotate(810deg); - transform: rotate(810deg); - } - 87.5% { - -webkit-transform: rotate(945deg); - transform: rotate(945deg); - } - 100% { - -webkit-transform: rotate(1080deg); - transform: rotate(1080deg); - } - `),ne("@keyframes loading-left-spin",` - from { - -webkit-transform: rotate(265deg); - transform: rotate(265deg); - } - 50% { - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } - to { - -webkit-transform: rotate(265deg); - transform: rotate(265deg); - } - `),ne("@keyframes loading-right-spin",` - from { - -webkit-transform: rotate(-265deg); - transform: rotate(-265deg); - } - 50% { - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } - to { - -webkit-transform: rotate(-265deg); - transform: rotate(-265deg); - } - `),Se("base-loading",` - position: relative; - line-height: 0; - width: 1em; - height: 1em; - `,[he("transition-wrapper",` - position: absolute; - width: 100%; - height: 100%; - `,[ya()]),he("container",` - display: inline-flex; - position: relative; - direction: ltr; - line-height: 0; - animation: loading-container-rotate 1568.2352941176ms linear infinite; - font-size: 0; - letter-spacing: 0; - white-space: nowrap; - opacity: 1; - width: 100%; - height: 100%; - `,[he("svg",` - stroke: var(--n-text-color); - fill: transparent; - position: absolute; - height: 100%; - overflow: hidden; - `),he("container-layer",` - position: absolute; - width: 100%; - height: 100%; - animation: loading-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - `,[he("container-layer-left",` - display: inline-flex; - position: relative; - width: 50%; - height: 100%; - overflow: hidden; - `,[he("svg",` - animation: loading-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - width: 200%; - `)]),he("container-layer-patch",` - position: absolute; - top: 0; - left: 47.5%; - box-sizing: border-box; - width: 5%; - height: 100%; - overflow: hidden; - `,[he("svg",` - left: -900%; - width: 2000%; - transform: rotate(180deg); - `)]),he("container-layer-right",` - display: inline-flex; - position: relative; - width: 50%; - height: 100%; - overflow: hidden; - `,[he("svg",` - animation: loading-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - left: -100%; - width: 200%; - `)])])]),he("placeholder",` - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - `,[ya({left:"50%",top:"50%",originalTransform:"translateX(-50%) translateY(-50%)"})])])]),L3={strokeWidth:{type:Number,default:28},stroke:{type:String,default:void 0}},Zm=Oe({name:"BaseLoading",props:Object.assign({clsPrefix:{type:String,required:!0},show:{type:Boolean,default:!0},scale:{type:Number,default:1},radius:{type:Number,default:100}},L3),setup(e){$s("-base-loading",k3,Rr(e,"clsPrefix"))},render(){const{clsPrefix:e,radius:t,strokeWidth:r,stroke:o,scale:n}=this,i=t/n;return H("div",{class:`${e}-base-loading`,role:"img","aria-label":"loading"},H(mu,null,{default:()=>this.show?H("div",{key:"icon",class:`${e}-base-loading__transition-wrapper`},H("div",{class:`${e}-base-loading__container`},H("div",{class:`${e}-base-loading__container-layer`},H("div",{class:`${e}-base-loading__container-layer-left`},H("svg",{class:`${e}-base-loading__svg`,viewBox:`0 0 ${2*i} ${2*i}`,xmlns:"http://www.w3.org/2000/svg",style:{color:o}},H("circle",{fill:"none",stroke:"currentColor","stroke-width":r,"stroke-linecap":"round",cx:i,cy:i,r:t-r/2,"stroke-dasharray":4.91*t,"stroke-dashoffset":2.46*t}))),H("div",{class:`${e}-base-loading__container-layer-patch`},H("svg",{class:`${e}-base-loading__svg`,viewBox:`0 0 ${2*i} ${2*i}`,xmlns:"http://www.w3.org/2000/svg",style:{color:o}},H("circle",{fill:"none",stroke:"currentColor","stroke-width":r,"stroke-linecap":"round",cx:i,cy:i,r:t-r/2,"stroke-dasharray":4.91*t,"stroke-dashoffset":2.46*t}))),H("div",{class:`${e}-base-loading__container-layer-right`},H("svg",{class:`${e}-base-loading__svg`,viewBox:`0 0 ${2*i} ${2*i}`,xmlns:"http://www.w3.org/2000/svg",style:{color:o}},H("circle",{fill:"none",stroke:"currentColor","stroke-width":r,"stroke-linecap":"round",cx:i,cy:i,r:t-r/2,"stroke-dasharray":4.91*t,"stroke-dashoffset":2.46*t})))))):H("div",{key:"placeholder",class:`${e}-base-loading__placeholder`},this.$slots)}))}}),pe={neutralBase:"#000",neutralInvertBase:"#fff",neutralTextBase:"#fff",neutralPopover:"rgb(72, 72, 78)",neutralCard:"rgb(24, 24, 28)",neutralModal:"rgb(44, 44, 50)",neutralBody:"rgb(16, 16, 20)",alpha1:"0.9",alpha2:"0.82",alpha3:"0.52",alpha4:"0.38",alpha5:"0.28",alphaClose:"0.52",alphaDisabled:"0.38",alphaDisabledInput:"0.06",alphaPending:"0.09",alphaTablePending:"0.06",alphaTableStriped:"0.05",alphaPressed:"0.05",alphaAvatar:"0.18",alphaRail:"0.2",alphaProgressRail:"0.12",alphaBorder:"0.24",alphaDivider:"0.09",alphaInput:"0.1",alphaAction:"0.06",alphaTab:"0.04",alphaScrollbar:"0.2",alphaScrollbarHover:"0.3",alphaCode:"0.12",alphaTag:"0.2",primaryHover:"#7fe7c4",primaryDefault:"#63e2b7",primaryActive:"#5acea7",primarySuppl:"rgb(42, 148, 125)",infoHover:"#8acbec",infoDefault:"#70c0e8",infoActive:"#66afd3",infoSuppl:"rgb(56, 137, 197)",errorHover:"#e98b8b",errorDefault:"#e88080",errorActive:"#e57272",errorSuppl:"rgb(208, 58, 82)",warningHover:"#f5d599",warningDefault:"#f2c97d",warningActive:"#e6c260",warningSuppl:"rgb(240, 138, 0)",successHover:"#7fe7c4",successDefault:"#63e2b7",successActive:"#5acea7",successSuppl:"rgb(42, 148, 125)"},$3=Cr(pe.neutralBase),Xm=Cr(pe.neutralInvertBase),I3="rgba("+Xm.slice(0,3).join(", ")+", ";function Fe(e){return I3+String(e)+")"}function R3(e){const t=Array.from(Xm);return t[3]=Number(e),me($3,t)}const A3=Object.assign(Object.assign({name:"common"},ao),{baseColor:pe.neutralBase,primaryColor:pe.primaryDefault,primaryColorHover:pe.primaryHover,primaryColorPressed:pe.primaryActive,primaryColorSuppl:pe.primarySuppl,infoColor:pe.infoDefault,infoColorHover:pe.infoHover,infoColorPressed:pe.infoActive,infoColorSuppl:pe.infoSuppl,successColor:pe.successDefault,successColorHover:pe.successHover,successColorPressed:pe.successActive,successColorSuppl:pe.successSuppl,warningColor:pe.warningDefault,warningColorHover:pe.warningHover,warningColorPressed:pe.warningActive,warningColorSuppl:pe.warningSuppl,errorColor:pe.errorDefault,errorColorHover:pe.errorHover,errorColorPressed:pe.errorActive,errorColorSuppl:pe.errorSuppl,textColorBase:pe.neutralTextBase,textColor1:Fe(pe.alpha1),textColor2:Fe(pe.alpha2),textColor3:Fe(pe.alpha3),textColorDisabled:Fe(pe.alpha4),placeholderColor:Fe(pe.alpha4),placeholderColorDisabled:Fe(pe.alpha5),iconColor:Fe(pe.alpha4),iconColorDisabled:Fe(pe.alpha5),iconColorHover:Fe(Number(pe.alpha4)*1.25),iconColorPressed:Fe(Number(pe.alpha4)*.8),opacity1:pe.alpha1,opacity2:pe.alpha2,opacity3:pe.alpha3,opacity4:pe.alpha4,opacity5:pe.alpha5,dividerColor:Fe(pe.alphaDivider),borderColor:Fe(pe.alphaBorder),closeIconColorHover:Fe(Number(pe.alphaClose)),closeIconColor:Fe(Number(pe.alphaClose)),closeIconColorPressed:Fe(Number(pe.alphaClose)),closeColorHover:"rgba(255, 255, 255, .12)",closeColorPressed:"rgba(255, 255, 255, .08)",clearColor:Fe(pe.alpha4),clearColorHover:it(Fe(pe.alpha4),{alpha:1.25}),clearColorPressed:it(Fe(pe.alpha4),{alpha:.8}),scrollbarColor:Fe(pe.alphaScrollbar),scrollbarColorHover:Fe(pe.alphaScrollbarHover),scrollbarWidth:"5px",scrollbarHeight:"5px",scrollbarBorderRadius:"5px",progressRailColor:Fe(pe.alphaProgressRail),railColor:Fe(pe.alphaRail),popoverColor:pe.neutralPopover,tableColor:pe.neutralCard,cardColor:pe.neutralCard,modalColor:pe.neutralModal,bodyColor:pe.neutralBody,tagColor:R3(pe.alphaTag),avatarColor:Fe(pe.alphaAvatar),invertedColor:pe.neutralBase,inputColor:Fe(pe.alphaInput),codeColor:Fe(pe.alphaCode),tabColor:Fe(pe.alphaTab),actionColor:Fe(pe.alphaAction),tableHeaderColor:Fe(pe.alphaAction),hoverColor:Fe(pe.alphaPending),tableColorHover:Fe(pe.alphaTablePending),tableColorStriped:Fe(pe.alphaTableStriped),pressedColor:Fe(pe.alphaPressed),opacityDisabled:pe.alphaDisabled,inputColorDisabled:Fe(pe.alphaDisabledInput),buttonColor2:"rgba(255, 255, 255, .08)",buttonColor2Hover:"rgba(255, 255, 255, .12)",buttonColor2Pressed:"rgba(255, 255, 255, .08)",boxShadow1:"0 1px 2px -2px rgba(0, 0, 0, .24), 0 3px 6px 0 rgba(0, 0, 0, .18), 0 5px 12px 4px rgba(0, 0, 0, .12)",boxShadow2:"0 3px 6px -4px rgba(0, 0, 0, .24), 0 6px 12px 0 rgba(0, 0, 0, .16), 0 9px 18px 8px rgba(0, 0, 0, .10)",boxShadow3:"0 6px 16px -9px rgba(0, 0, 0, .08), 0 9px 28px 0 rgba(0, 0, 0, .05), 0 12px 48px 16px rgba(0, 0, 0, .03)"}),se=A3,we={neutralBase:"#FFF",neutralInvertBase:"#000",neutralTextBase:"#000",neutralPopover:"#fff",neutralCard:"#fff",neutralModal:"#fff",neutralBody:"#fff",alpha1:"0.82",alpha2:"0.72",alpha3:"0.38",alpha4:"0.24",alpha5:"0.18",alphaClose:"0.6",alphaDisabled:"0.5",alphaDisabledInput:"0.02",alphaPending:"0.05",alphaTablePending:"0.02",alphaPressed:"0.07",alphaAvatar:"0.2",alphaRail:"0.14",alphaProgressRail:".08",alphaBorder:"0.12",alphaDivider:"0.06",alphaInput:"0",alphaAction:"0.02",alphaTab:"0.04",alphaScrollbar:"0.25",alphaScrollbarHover:"0.4",alphaCode:"0.05",alphaTag:"0.02",primaryHover:"#36ad6a",primaryDefault:"#18a058",primaryActive:"#0c7a43",primarySuppl:"#36ad6a",infoHover:"#4098fc",infoDefault:"#2080f0",infoActive:"#1060c9",infoSuppl:"#4098fc",errorHover:"#de576d",errorDefault:"#d03050",errorActive:"#ab1f3f",errorSuppl:"#de576d",warningHover:"#fcb040",warningDefault:"#f0a020",warningActive:"#c97c10",warningSuppl:"#fcb040",successHover:"#36ad6a",successDefault:"#18a058",successActive:"#0c7a43",successSuppl:"#36ad6a"},O3=Cr(we.neutralBase),Ym=Cr(we.neutralInvertBase),B3="rgba("+Ym.slice(0,3).join(", ")+", ";function Bd(e){return B3+String(e)+")"}function wt(e){const t=Array.from(Ym);return t[3]=Number(e),me(O3,t)}const H3=Object.assign(Object.assign({name:"common"},ao),{baseColor:we.neutralBase,primaryColor:we.primaryDefault,primaryColorHover:we.primaryHover,primaryColorPressed:we.primaryActive,primaryColorSuppl:we.primarySuppl,infoColor:we.infoDefault,infoColorHover:we.infoHover,infoColorPressed:we.infoActive,infoColorSuppl:we.infoSuppl,successColor:we.successDefault,successColorHover:we.successHover,successColorPressed:we.successActive,successColorSuppl:we.successSuppl,warningColor:we.warningDefault,warningColorHover:we.warningHover,warningColorPressed:we.warningActive,warningColorSuppl:we.warningSuppl,errorColor:we.errorDefault,errorColorHover:we.errorHover,errorColorPressed:we.errorActive,errorColorSuppl:we.errorSuppl,textColorBase:we.neutralTextBase,textColor1:"rgb(31, 34, 37)",textColor2:"rgb(51, 54, 57)",textColor3:"rgb(118, 124, 130)",textColorDisabled:wt(we.alpha4),placeholderColor:wt(we.alpha4),placeholderColorDisabled:wt(we.alpha5),iconColor:wt(we.alpha4),iconColorHover:it(wt(we.alpha4),{lightness:.75}),iconColorPressed:it(wt(we.alpha4),{lightness:.9}),iconColorDisabled:wt(we.alpha5),opacity1:we.alpha1,opacity2:we.alpha2,opacity3:we.alpha3,opacity4:we.alpha4,opacity5:we.alpha5,dividerColor:"rgb(239, 239, 245)",borderColor:"rgb(224, 224, 230)",closeIconColor:wt(Number(we.alphaClose)),closeIconColorHover:wt(Number(we.alphaClose)),closeIconColorPressed:wt(Number(we.alphaClose)),closeColorHover:"rgba(0, 0, 0, .09)",closeColorPressed:"rgba(0, 0, 0, .13)",clearColor:wt(we.alpha4),clearColorHover:it(wt(we.alpha4),{lightness:.75}),clearColorPressed:it(wt(we.alpha4),{lightness:.9}),scrollbarColor:Bd(we.alphaScrollbar),scrollbarColorHover:Bd(we.alphaScrollbarHover),scrollbarWidth:"5px",scrollbarHeight:"5px",scrollbarBorderRadius:"5px",progressRailColor:wt(we.alphaProgressRail),railColor:"rgb(219, 219, 223)",popoverColor:we.neutralPopover,tableColor:we.neutralCard,cardColor:we.neutralCard,modalColor:we.neutralModal,bodyColor:we.neutralBody,tagColor:"#eee",avatarColor:wt(we.alphaAvatar),invertedColor:"rgb(0, 20, 40)",inputColor:wt(we.alphaInput),codeColor:"rgb(244, 244, 248)",tabColor:"rgb(247, 247, 250)",actionColor:"rgb(250, 250, 252)",tableHeaderColor:"rgb(250, 250, 252)",hoverColor:"rgb(243, 243, 245)",tableColorHover:"rgba(0, 0, 100, 0.03)",tableColorStriped:"rgba(0, 0, 100, 0.02)",pressedColor:"rgb(237, 237, 239)",opacityDisabled:we.alphaDisabled,inputColorDisabled:"rgb(250, 250, 252)",buttonColor2:"rgba(46, 51, 56, .05)",buttonColor2Hover:"rgba(46, 51, 56, .09)",buttonColor2Pressed:"rgba(46, 51, 56, .13)",boxShadow1:"0 1px 2px -2px rgba(0, 0, 0, .08), 0 3px 6px 0 rgba(0, 0, 0, .06), 0 5px 12px 4px rgba(0, 0, 0, .04)",boxShadow2:"0 3px 6px -4px rgba(0, 0, 0, .12), 0 6px 16px 0 rgba(0, 0, 0, .08), 0 9px 28px 8px rgba(0, 0, 0, .05)",boxShadow3:"0 6px 16px -9px rgba(0, 0, 0, .08), 0 9px 28px 0 rgba(0, 0, 0, .05), 0 12px 48px 16px rgba(0, 0, 0, .03)"}),le=H3,M3={iconSizeSmall:"34px",iconSizeMedium:"40px",iconSizeLarge:"46px",iconSizeHuge:"52px"},Qm=e=>{const{textColorDisabled:t,iconColor:r,textColor2:o,fontSizeSmall:n,fontSizeMedium:i,fontSizeLarge:a,fontSizeHuge:s}=e;return Object.assign(Object.assign({},M3),{fontSizeSmall:n,fontSizeMedium:i,fontSizeLarge:a,fontSizeHuge:s,textColor:t,iconColor:r,extraTextColor:o})},D3={name:"Empty",common:le,self:Qm},Dr=D3,F3={name:"Empty",common:se,self:Qm},Bo=F3,Jm=e=>{const{scrollbarColor:t,scrollbarColorHover:r}=e;return{color:t,colorHover:r}},z3={name:"Scrollbar",common:le,self:Jm},$t=z3,N3={name:"Scrollbar",common:se,self:Jm},Mt=N3,{cubicBezierEaseInOut:Hd}=ao;function gu({name:e="fade-in",enterDuration:t="0.2s",leaveDuration:r="0.2s",enterCubicBezier:o=Hd,leaveCubicBezier:n=Hd}={}){return[ne(`&.${e}-transition-enter-active`,{transition:`all ${t} ${o}!important`}),ne(`&.${e}-transition-leave-active`,{transition:`all ${r} ${n}!important`}),ne(`&.${e}-transition-enter-from, &.${e}-transition-leave-to`,{opacity:0}),ne(`&.${e}-transition-leave-from, &.${e}-transition-enter-to`,{opacity:1})]}const W3=Se("scrollbar",` - overflow: hidden; - position: relative; - z-index: auto; - height: 100%; - width: 100%; -`,[ne(">",[Se("scrollbar-container",` - width: 100%; - overflow: scroll; - height: 100%; - min-height: inherit; - max-height: inherit; - scrollbar-width: none; - `,[ne("&::-webkit-scrollbar, &::-webkit-scrollbar-track-piece, &::-webkit-scrollbar-thumb",` - width: 0; - height: 0; - display: none; - `),ne(">",[Se("scrollbar-content",` - box-sizing: border-box; - min-width: 100%; - `)])])]),ne(">, +",[Se("scrollbar-rail",` - position: absolute; - pointer-events: none; - user-select: none; - -webkit-user-select: none; - `,[Ce("horizontal",` - left: 2px; - right: 2px; - bottom: 4px; - height: var(--n-scrollbar-height); - `,[ne(">",[he("scrollbar",` - height: var(--n-scrollbar-height); - border-radius: var(--n-scrollbar-border-radius); - right: 0; - `)])]),Ce("vertical",` - right: 4px; - top: 2px; - bottom: 2px; - width: var(--n-scrollbar-width); - `,[ne(">",[he("scrollbar",` - width: var(--n-scrollbar-width); - border-radius: var(--n-scrollbar-border-radius); - bottom: 0; - `)])]),Ce("disabled",[ne(">",[he("scrollbar",{pointerEvents:"none"})])]),ne(">",[he("scrollbar",` - position: absolute; - cursor: pointer; - pointer-events: all; - background-color: var(--n-scrollbar-color); - transition: background-color .2s var(--n-scrollbar-bezier); - `,[gu(),ne("&:hover",{backgroundColor:"var(--n-scrollbar-color-hover)"})])])])])]),j3=Object.assign(Object.assign({},Ct.props),{size:{type:Number,default:5},duration:{type:Number,default:0},scrollable:{type:Boolean,default:!0},xScrollable:Boolean,trigger:{type:String,default:"hover"},useUnifiedContainer:Boolean,triggerDisplayManually:Boolean,container:Function,content:Function,containerClass:String,containerStyle:[String,Object],contentClass:String,contentStyle:[String,Object],horizontalRailStyle:[String,Object],verticalRailStyle:[String,Object],onScroll:Function,onWheel:Function,onResize:Function,internalOnUpdateScrollLeft:Function,internalHoistYRail:Boolean}),eg=Oe({name:"Scrollbar",props:j3,inheritAttrs:!1,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:r,mergedRtlRef:o}=sr(e),n=yi("Scrollbar",o,t),i=de(null),a=de(null),s=de(null),l=de(null),c=de(null),u=de(null),d=de(null),f=de(null),p=de(null),h=de(null),m=de(null),v=de(0),g=de(0),x=de(!1),C=de(!1);let b=!1,w=!1,T,S,E=0,I=0,P=0,$=0;const R=ny(),B=ae(()=>{const{value:oe}=f,{value:be}=u,{value:Ee}=h;return oe===null||be===null||Ee===null?0:Math.min(oe,Ee*oe/be+e.size*1.5)}),j=ae(()=>`${B.value}px`),Y=ae(()=>{const{value:oe}=p,{value:be}=d,{value:Ee}=m;return oe===null||be===null||Ee===null?0:Ee*oe/be+e.size*1.5}),J=ae(()=>`${Y.value}px`),Q=ae(()=>{const{value:oe}=f,{value:be}=v,{value:Ee}=u,{value:Ve}=h;if(oe===null||Ee===null||Ve===null)return 0;{const et=Ee-oe;return et?be/et*(Ve-B.value):0}}),ie=ae(()=>`${Q.value}px`),ge=ae(()=>{const{value:oe}=p,{value:be}=g,{value:Ee}=d,{value:Ve}=m;if(oe===null||Ee===null||Ve===null)return 0;{const et=Ee-oe;return et?be/et*(Ve-Y.value):0}}),ve=ae(()=>`${ge.value}px`),z=ae(()=>{const{value:oe}=f,{value:be}=u;return oe!==null&&be!==null&&be>oe}),W=ae(()=>{const{value:oe}=p,{value:be}=d;return oe!==null&&be!==null&&be>oe}),Z=ae(()=>{const{trigger:oe}=e;return oe==="none"||x.value}),V=ae(()=>{const{trigger:oe}=e;return oe==="none"||C.value}),D=ae(()=>{const{container:oe}=e;return oe?oe():a.value}),U=ae(()=>{const{content:oe}=e;return oe?oe():s.value}),re=Uy(()=>{e.container||ke({top:v.value,left:g.value})}),ee=()=>{re.isDeactivated||ue()},ce=oe=>{if(re.isDeactivated)return;const{onResize:be}=e;be&&be(oe),ue()},ke=(oe,be)=>{if(!e.scrollable)return;if(typeof oe=="number"){k(be??0,oe,0,!1,"auto");return}const{left:Ee,top:Ve,index:et,elSize:St,position:Vt,behavior:Qe,el:Qt,debounce:uo=!0}=oe;(Ee!==void 0||Ve!==void 0)&&k(Ee??0,Ve??0,0,!1,Qe),Qt!==void 0?k(0,Qt.offsetTop,Qt.offsetHeight,uo,Qe):et!==void 0&&St!==void 0?k(0,et*St,St,uo,Qe):Vt==="bottom"?k(0,Number.MAX_SAFE_INTEGER,0,!1,Qe):Vt==="top"&&k(0,0,0,!1,Qe)},ye=(oe,be)=>{if(!e.scrollable)return;const{value:Ee}=D;Ee&&(typeof oe=="object"?Ee.scrollBy(oe):Ee.scrollBy(oe,be||0))};function k(oe,be,Ee,Ve,et){const{value:St}=D;if(St){if(Ve){const{scrollTop:Vt,offsetHeight:Qe}=St;if(be>Vt){be+Ee<=Vt+Qe||St.scrollTo({left:oe,top:be+Ee-Qe,behavior:et});return}}St.scrollTo({left:oe,top:be,behavior:et})}}function y(){X(),te(),ue()}function _(){L()}function L(){O(),N()}function O(){S!==void 0&&window.clearTimeout(S),S=window.setTimeout(()=>{C.value=!1},e.duration)}function N(){T!==void 0&&window.clearTimeout(T),T=window.setTimeout(()=>{x.value=!1},e.duration)}function X(){T!==void 0&&window.clearTimeout(T),x.value=!0}function te(){S!==void 0&&window.clearTimeout(S),C.value=!0}function q(oe){const{onScroll:be}=e;be&&be(oe),F()}function F(){const{value:oe}=D;oe&&(v.value=oe.scrollTop,g.value=oe.scrollLeft*(n!=null&&n.value?-1:1))}function A(){const{value:oe}=U;oe&&(u.value=oe.offsetHeight,d.value=oe.offsetWidth);const{value:be}=D;be&&(f.value=be.offsetHeight,p.value=be.offsetWidth);const{value:Ee}=c,{value:Ve}=l;Ee&&(m.value=Ee.offsetWidth),Ve&&(h.value=Ve.offsetHeight)}function M(){const{value:oe}=D;oe&&(v.value=oe.scrollTop,g.value=oe.scrollLeft*(n!=null&&n.value?-1:1),f.value=oe.offsetHeight,p.value=oe.offsetWidth,u.value=oe.scrollHeight,d.value=oe.scrollWidth);const{value:be}=c,{value:Ee}=l;be&&(m.value=be.offsetWidth),Ee&&(h.value=Ee.offsetHeight)}function ue(){e.scrollable&&(e.useUnifiedContainer?M():(A(),F()))}function xe(oe){var be;return!(!((be=i.value)===null||be===void 0)&&be.contains(Qc(oe)))}function Te(oe){oe.preventDefault(),oe.stopPropagation(),w=!0,Gt("mousemove",window,Ie,!0),Gt("mouseup",window,Re,!0),I=g.value,P=n!=null&&n.value?window.innerWidth-oe.clientX:oe.clientX}function Ie(oe){if(!w)return;T!==void 0&&window.clearTimeout(T),S!==void 0&&window.clearTimeout(S);const{value:be}=p,{value:Ee}=d,{value:Ve}=Y;if(be===null||Ee===null)return;const St=(n!=null&&n.value?window.innerWidth-oe.clientX-P:oe.clientX-P)*(Ee-be)/(be-Ve),Vt=Ee-be;let Qe=I+St;Qe=Math.min(Vt,Qe),Qe=Math.max(Qe,0);const{value:Qt}=D;if(Qt){Qt.scrollLeft=Qe*(n!=null&&n.value?-1:1);const{internalOnUpdateScrollLeft:uo}=e;uo&&uo(Qe)}}function Re(oe){oe.preventDefault(),oe.stopPropagation(),Pt("mousemove",window,Ie,!0),Pt("mouseup",window,Re,!0),w=!1,ue(),xe(oe)&&L()}function Ue(oe){oe.preventDefault(),oe.stopPropagation(),b=!0,Gt("mousemove",window,ct,!0),Gt("mouseup",window,xt,!0),E=v.value,$=oe.clientY}function ct(oe){if(!b)return;T!==void 0&&window.clearTimeout(T),S!==void 0&&window.clearTimeout(S);const{value:be}=f,{value:Ee}=u,{value:Ve}=B;if(be===null||Ee===null)return;const St=(oe.clientY-$)*(Ee-be)/(be-Ve),Vt=Ee-be;let Qe=E+St;Qe=Math.min(Vt,Qe),Qe=Math.max(Qe,0);const{value:Qt}=D;Qt&&(Qt.scrollTop=Qe)}function xt(oe){oe.preventDefault(),oe.stopPropagation(),Pt("mousemove",window,ct,!0),Pt("mouseup",window,xt,!0),b=!1,ue(),xe(oe)&&L()}gs(()=>{const{value:oe}=W,{value:be}=z,{value:Ee}=t,{value:Ve}=c,{value:et}=l;Ve&&(oe?Ve.classList.remove(`${Ee}-scrollbar-rail--disabled`):Ve.classList.add(`${Ee}-scrollbar-rail--disabled`)),et&&(be?et.classList.remove(`${Ee}-scrollbar-rail--disabled`):et.classList.add(`${Ee}-scrollbar-rail--disabled`))}),Sr(()=>{e.container||ue()}),Zt(()=>{T!==void 0&&window.clearTimeout(T),S!==void 0&&window.clearTimeout(S),Pt("mousemove",window,ct,!0),Pt("mouseup",window,xt,!0)});const lr=Ct("Scrollbar","-scrollbar",W3,$t,e,t),cr=ae(()=>{const{common:{cubicBezierEaseInOut:oe,scrollbarBorderRadius:be,scrollbarHeight:Ee,scrollbarWidth:Ve},self:{color:et,colorHover:St}}=lr.value;return{"--n-scrollbar-bezier":oe,"--n-scrollbar-color":et,"--n-scrollbar-color-hover":St,"--n-scrollbar-border-radius":be,"--n-scrollbar-width":Ve,"--n-scrollbar-height":Ee}}),Ut=r?so("scrollbar",void 0,cr,e):void 0;return Object.assign(Object.assign({},{scrollTo:ke,scrollBy:ye,sync:ue,syncUnifiedContainer:M,handleMouseEnterWrapper:y,handleMouseLeaveWrapper:_}),{mergedClsPrefix:t,rtlEnabled:n,containerScrollTop:v,wrapperRef:i,containerRef:a,contentRef:s,yRailRef:l,xRailRef:c,needYBar:z,needXBar:W,yBarSizePx:j,xBarSizePx:J,yBarTopPx:ie,xBarLeftPx:ve,isShowXBar:Z,isShowYBar:V,isIos:R,handleScroll:q,handleContentResize:ee,handleContainerResize:ce,handleYScrollMouseDown:Ue,handleXScrollMouseDown:Te,cssVars:r?void 0:cr,themeClass:Ut==null?void 0:Ut.themeClass,onRender:Ut==null?void 0:Ut.onRender})},render(){var e;const{$slots:t,mergedClsPrefix:r,triggerDisplayManually:o,rtlEnabled:n,internalHoistYRail:i}=this;if(!this.scrollable)return(e=t.default)===null||e===void 0?void 0:e.call(t);const a=this.trigger==="none",s=(u,d)=>H("div",{ref:"yRailRef",class:[`${r}-scrollbar-rail`,`${r}-scrollbar-rail--vertical`,u],"data-scrollbar-rail":!0,style:[d||"",this.verticalRailStyle],"aria-hiddens":!0},H(a?N0:br,a?null:{name:"fade-in-transition"},{default:()=>this.needYBar&&this.isShowYBar&&!this.isIos?H("div",{class:`${r}-scrollbar-rail__scrollbar`,style:{height:this.yBarSizePx,top:this.yBarTopPx},onMousedown:this.handleYScrollMouseDown}):null})),l=()=>{var u,d;return(u=this.onRender)===null||u===void 0||u.call(this),H("div",Yc(this.$attrs,{role:"none",ref:"wrapperRef",class:[`${r}-scrollbar`,this.themeClass,n&&`${r}-scrollbar--rtl`],style:this.cssVars,onMouseenter:o?void 0:this.handleMouseEnterWrapper,onMouseleave:o?void 0:this.handleMouseLeaveWrapper}),[this.container?(d=t.default)===null||d===void 0?void 0:d.call(t):H("div",{role:"none",ref:"containerRef",class:[`${r}-scrollbar-container`,this.containerClass],style:this.containerStyle,onScroll:this.handleScroll,onWheel:this.onWheel},H(ud,{onResize:this.handleContentResize},{default:()=>H("div",{ref:"contentRef",role:"none",style:[{width:this.xScrollable?"fit-content":null},this.contentStyle],class:[`${r}-scrollbar-content`,this.contentClass]},t)})),i?null:s(void 0,void 0),this.xScrollable&&H("div",{ref:"xRailRef",class:[`${r}-scrollbar-rail`,`${r}-scrollbar-rail--horizontal`],style:this.horizontalRailStyle,"data-scrollbar-rail":!0,"aria-hidden":!0},H(a?N0:br,a?null:{name:"fade-in-transition"},{default:()=>this.needXBar&&this.isShowXBar&&!this.isIos?H("div",{class:`${r}-scrollbar-rail__scrollbar`,style:{width:this.xBarSizePx,right:n?this.xBarLeftPx:void 0,left:n?void 0:this.xBarLeftPx},onMousedown:this.handleXScrollMouseDown}):null}))])},c=this.container?l():H(ud,{onResize:this.handleContainerResize},{default:l});return i?H(Je,null,c,s(this.themeClass,this.cssVars)):c}}),tg=eg,eH=eg,U3={height:"calc(var(--n-option-height) * 7.6)",paddingSmall:"4px 0",paddingMedium:"4px 0",paddingLarge:"4px 0",paddingHuge:"4px 0",optionPaddingSmall:"0 12px",optionPaddingMedium:"0 12px",optionPaddingLarge:"0 12px",optionPaddingHuge:"0 12px",loadingSize:"18px"},rg=e=>{const{borderRadius:t,popoverColor:r,textColor3:o,dividerColor:n,textColor2:i,primaryColorPressed:a,textColorDisabled:s,primaryColor:l,opacityDisabled:c,hoverColor:u,fontSizeSmall:d,fontSizeMedium:f,fontSizeLarge:p,fontSizeHuge:h,heightSmall:m,heightMedium:v,heightLarge:g,heightHuge:x}=e;return Object.assign(Object.assign({},U3),{optionFontSizeSmall:d,optionFontSizeMedium:f,optionFontSizeLarge:p,optionFontSizeHuge:h,optionHeightSmall:m,optionHeightMedium:v,optionHeightLarge:g,optionHeightHuge:x,borderRadius:t,color:r,groupHeaderTextColor:o,actionDividerColor:n,optionTextColor:i,optionTextColorPressed:a,optionTextColorDisabled:s,optionTextColorActive:l,optionOpacityDisabled:c,optionCheckColor:l,optionColorPending:u,optionColorActive:"rgba(0, 0, 0, 0)",optionColorActivePending:u,actionTextColor:i,loadingColor:l})},V3={name:"InternalSelectMenu",common:le,peers:{Scrollbar:$t,Empty:Dr},self:rg},wi=V3,q3={name:"InternalSelectMenu",common:se,peers:{Scrollbar:Mt,Empty:Bo},self:rg},_i=q3,{cubicBezierEaseIn:Md,cubicBezierEaseOut:Dd}=ao;function G3({transformOrigin:e="inherit",duration:t=".2s",enterScale:r=".9",originalTransform:o="",originalTransition:n=""}={}){return[ne("&.fade-in-scale-up-transition-leave-active",{transformOrigin:e,transition:`opacity ${t} ${Md}, transform ${t} ${Md} ${n&&","+n}`}),ne("&.fade-in-scale-up-transition-enter-active",{transformOrigin:e,transition:`opacity ${t} ${Dd}, transform ${t} ${Dd} ${n&&","+n}`}),ne("&.fade-in-scale-up-transition-enter-from, &.fade-in-scale-up-transition-leave-to",{opacity:0,transform:`${o} scale(${r})`}),ne("&.fade-in-scale-up-transition-leave-from, &.fade-in-scale-up-transition-enter-to",{opacity:1,transform:`${o} scale(1)`})]}const K3=Se("base-wave",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - border-radius: inherit; -`),Z3=Oe({name:"BaseWave",props:{clsPrefix:{type:String,required:!0}},setup(e){$s("-base-wave",K3,Rr(e,"clsPrefix"));const t=de(null),r=de(!1);let o=null;return Zt(()=>{o!==null&&window.clearTimeout(o)}),{active:r,selfRef:t,play(){o!==null&&(window.clearTimeout(o),r.value=!1,o=null),jt(()=>{var n;(n=t.value)===null||n===void 0||n.offsetHeight,r.value=!0,o=window.setTimeout(()=>{r.value=!1,o=null},1e3)})}}},render(){const{clsPrefix:e}=this;return H("div",{ref:"selfRef","aria-hidden":!0,class:[`${e}-base-wave`,this.active&&`${e}-base-wave--active`]})}}),X3={space:"6px",spaceArrow:"10px",arrowOffset:"10px",arrowOffsetVertical:"10px",arrowHeight:"6px",padding:"8px 14px"},og=e=>{const{boxShadow2:t,popoverColor:r,textColor2:o,borderRadius:n,fontSize:i,dividerColor:a}=e;return Object.assign(Object.assign({},X3),{fontSize:i,borderRadius:n,color:r,dividerColor:a,textColor:o,boxShadow:t})},Y3={name:"Popover",common:le,self:og},Ho=Y3,Q3={name:"Popover",common:se,self:og},Mo=Q3,ng={closeIconSizeTiny:"12px",closeIconSizeSmall:"12px",closeIconSizeMedium:"14px",closeIconSizeLarge:"14px",closeSizeTiny:"16px",closeSizeSmall:"16px",closeSizeMedium:"18px",closeSizeLarge:"18px",padding:"0 7px",closeMargin:"0 0 0 4px",closeMarginRtl:"0 4px 0 0"},J3={name:"Tag",common:se,self(e){const{textColor2:t,primaryColorHover:r,primaryColorPressed:o,primaryColor:n,infoColor:i,successColor:a,warningColor:s,errorColor:l,baseColor:c,borderColor:u,tagColor:d,opacityDisabled:f,closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:m,closeColorHover:v,closeColorPressed:g,borderRadiusSmall:x,fontSizeMini:C,fontSizeTiny:b,fontSizeSmall:w,fontSizeMedium:T,heightMini:S,heightTiny:E,heightSmall:I,heightMedium:P,buttonColor2Hover:$,buttonColor2Pressed:R,fontWeightStrong:B}=e;return Object.assign(Object.assign({},ng),{closeBorderRadius:x,heightTiny:S,heightSmall:E,heightMedium:I,heightLarge:P,borderRadius:x,opacityDisabled:f,fontSizeTiny:C,fontSizeSmall:b,fontSizeMedium:w,fontSizeLarge:T,fontWeightStrong:B,textColorCheckable:t,textColorHoverCheckable:t,textColorPressedCheckable:t,textColorChecked:c,colorCheckable:"#0000",colorHoverCheckable:$,colorPressedCheckable:R,colorChecked:n,colorCheckedHover:r,colorCheckedPressed:o,border:`1px solid ${u}`,textColor:t,color:d,colorBordered:"#0000",closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:m,closeColorHover:v,closeColorPressed:g,borderPrimary:`1px solid ${G(n,{alpha:.3})}`,textColorPrimary:n,colorPrimary:G(n,{alpha:.16}),colorBorderedPrimary:"#0000",closeIconColorPrimary:it(n,{lightness:.7}),closeIconColorHoverPrimary:it(n,{lightness:.7}),closeIconColorPressedPrimary:it(n,{lightness:.7}),closeColorHoverPrimary:G(n,{alpha:.16}),closeColorPressedPrimary:G(n,{alpha:.12}),borderInfo:`1px solid ${G(i,{alpha:.3})}`,textColorInfo:i,colorInfo:G(i,{alpha:.16}),colorBorderedInfo:"#0000",closeIconColorInfo:it(i,{alpha:.7}),closeIconColorHoverInfo:it(i,{alpha:.7}),closeIconColorPressedInfo:it(i,{alpha:.7}),closeColorHoverInfo:G(i,{alpha:.16}),closeColorPressedInfo:G(i,{alpha:.12}),borderSuccess:`1px solid ${G(a,{alpha:.3})}`,textColorSuccess:a,colorSuccess:G(a,{alpha:.16}),colorBorderedSuccess:"#0000",closeIconColorSuccess:it(a,{alpha:.7}),closeIconColorHoverSuccess:it(a,{alpha:.7}),closeIconColorPressedSuccess:it(a,{alpha:.7}),closeColorHoverSuccess:G(a,{alpha:.16}),closeColorPressedSuccess:G(a,{alpha:.12}),borderWarning:`1px solid ${G(s,{alpha:.3})}`,textColorWarning:s,colorWarning:G(s,{alpha:.16}),colorBorderedWarning:"#0000",closeIconColorWarning:it(s,{alpha:.7}),closeIconColorHoverWarning:it(s,{alpha:.7}),closeIconColorPressedWarning:it(s,{alpha:.7}),closeColorHoverWarning:G(s,{alpha:.16}),closeColorPressedWarning:G(s,{alpha:.11}),borderError:`1px solid ${G(l,{alpha:.3})}`,textColorError:l,colorError:G(l,{alpha:.16}),colorBorderedError:"#0000",closeIconColorError:it(l,{alpha:.7}),closeIconColorHoverError:it(l,{alpha:.7}),closeIconColorPressedError:it(l,{alpha:.7}),closeColorHoverError:G(l,{alpha:.16}),closeColorPressedError:G(l,{alpha:.12})})}},ig=J3,ew=e=>{const{textColor2:t,primaryColorHover:r,primaryColorPressed:o,primaryColor:n,infoColor:i,successColor:a,warningColor:s,errorColor:l,baseColor:c,borderColor:u,opacityDisabled:d,tagColor:f,closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:m,borderRadiusSmall:v,fontSizeMini:g,fontSizeTiny:x,fontSizeSmall:C,fontSizeMedium:b,heightMini:w,heightTiny:T,heightSmall:S,heightMedium:E,closeColorHover:I,closeColorPressed:P,buttonColor2Hover:$,buttonColor2Pressed:R,fontWeightStrong:B}=e;return Object.assign(Object.assign({},ng),{closeBorderRadius:v,heightTiny:w,heightSmall:T,heightMedium:S,heightLarge:E,borderRadius:v,opacityDisabled:d,fontSizeTiny:g,fontSizeSmall:x,fontSizeMedium:C,fontSizeLarge:b,fontWeightStrong:B,textColorCheckable:t,textColorHoverCheckable:t,textColorPressedCheckable:t,textColorChecked:c,colorCheckable:"#0000",colorHoverCheckable:$,colorPressedCheckable:R,colorChecked:n,colorCheckedHover:r,colorCheckedPressed:o,border:`1px solid ${u}`,textColor:t,color:f,colorBordered:"rgb(250, 250, 252)",closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:m,closeColorHover:I,closeColorPressed:P,borderPrimary:`1px solid ${G(n,{alpha:.3})}`,textColorPrimary:n,colorPrimary:G(n,{alpha:.12}),colorBorderedPrimary:G(n,{alpha:.1}),closeIconColorPrimary:n,closeIconColorHoverPrimary:n,closeIconColorPressedPrimary:n,closeColorHoverPrimary:G(n,{alpha:.12}),closeColorPressedPrimary:G(n,{alpha:.18}),borderInfo:`1px solid ${G(i,{alpha:.3})}`,textColorInfo:i,colorInfo:G(i,{alpha:.12}),colorBorderedInfo:G(i,{alpha:.1}),closeIconColorInfo:i,closeIconColorHoverInfo:i,closeIconColorPressedInfo:i,closeColorHoverInfo:G(i,{alpha:.12}),closeColorPressedInfo:G(i,{alpha:.18}),borderSuccess:`1px solid ${G(a,{alpha:.3})}`,textColorSuccess:a,colorSuccess:G(a,{alpha:.12}),colorBorderedSuccess:G(a,{alpha:.1}),closeIconColorSuccess:a,closeIconColorHoverSuccess:a,closeIconColorPressedSuccess:a,closeColorHoverSuccess:G(a,{alpha:.12}),closeColorPressedSuccess:G(a,{alpha:.18}),borderWarning:`1px solid ${G(s,{alpha:.35})}`,textColorWarning:s,colorWarning:G(s,{alpha:.15}),colorBorderedWarning:G(s,{alpha:.12}),closeIconColorWarning:s,closeIconColorHoverWarning:s,closeIconColorPressedWarning:s,closeColorHoverWarning:G(s,{alpha:.12}),closeColorPressedWarning:G(s,{alpha:.18}),borderError:`1px solid ${G(l,{alpha:.23})}`,textColorError:l,colorError:G(l,{alpha:.1}),colorBorderedError:G(l,{alpha:.08}),closeIconColorError:l,closeIconColorHoverError:l,closeIconColorPressedError:l,closeColorHoverError:G(l,{alpha:.12}),closeColorPressedError:G(l,{alpha:.18})})},tw={name:"Tag",common:le,self:ew},ag=tw,sg={paddingSingle:"0 26px 0 12px",paddingMultiple:"3px 26px 0 12px",clearSize:"16px",arrowSize:"16px"},rw=e=>{const{borderRadius:t,textColor2:r,textColorDisabled:o,inputColor:n,inputColorDisabled:i,primaryColor:a,primaryColorHover:s,warningColor:l,warningColorHover:c,errorColor:u,errorColorHover:d,borderColor:f,iconColor:p,iconColorDisabled:h,clearColor:m,clearColorHover:v,clearColorPressed:g,placeholderColor:x,placeholderColorDisabled:C,fontSizeTiny:b,fontSizeSmall:w,fontSizeMedium:T,fontSizeLarge:S,heightTiny:E,heightSmall:I,heightMedium:P,heightLarge:$}=e;return Object.assign(Object.assign({},sg),{fontSizeTiny:b,fontSizeSmall:w,fontSizeMedium:T,fontSizeLarge:S,heightTiny:E,heightSmall:I,heightMedium:P,heightLarge:$,borderRadius:t,textColor:r,textColorDisabled:o,placeholderColor:x,placeholderColorDisabled:C,color:n,colorDisabled:i,colorActive:n,border:`1px solid ${f}`,borderHover:`1px solid ${s}`,borderActive:`1px solid ${a}`,borderFocus:`1px solid ${s}`,boxShadowHover:"none",boxShadowActive:`0 0 0 2px ${G(a,{alpha:.2})}`,boxShadowFocus:`0 0 0 2px ${G(a,{alpha:.2})}`,caretColor:a,arrowColor:p,arrowColorDisabled:h,loadingColor:a,borderWarning:`1px solid ${l}`,borderHoverWarning:`1px solid ${c}`,borderActiveWarning:`1px solid ${l}`,borderFocusWarning:`1px solid ${c}`,boxShadowHoverWarning:"none",boxShadowActiveWarning:`0 0 0 2px ${G(l,{alpha:.2})}`,boxShadowFocusWarning:`0 0 0 2px ${G(l,{alpha:.2})}`,colorActiveWarning:n,caretColorWarning:l,borderError:`1px solid ${u}`,borderHoverError:`1px solid ${d}`,borderActiveError:`1px solid ${u}`,borderFocusError:`1px solid ${d}`,boxShadowHoverError:"none",boxShadowActiveError:`0 0 0 2px ${G(u,{alpha:.2})}`,boxShadowFocusError:`0 0 0 2px ${G(u,{alpha:.2})}`,colorActiveError:n,caretColorError:u,clearColor:m,clearColorHover:v,clearColorPressed:g})},ow={name:"InternalSelection",common:le,peers:{Popover:Ho},self:rw},xu=ow,nw={name:"InternalSelection",common:se,peers:{Popover:Mo},self(e){const{borderRadius:t,textColor2:r,textColorDisabled:o,inputColor:n,inputColorDisabled:i,primaryColor:a,primaryColorHover:s,warningColor:l,warningColorHover:c,errorColor:u,errorColorHover:d,iconColor:f,iconColorDisabled:p,clearColor:h,clearColorHover:m,clearColorPressed:v,placeholderColor:g,placeholderColorDisabled:x,fontSizeTiny:C,fontSizeSmall:b,fontSizeMedium:w,fontSizeLarge:T,heightTiny:S,heightSmall:E,heightMedium:I,heightLarge:P}=e;return Object.assign(Object.assign({},sg),{fontSizeTiny:C,fontSizeSmall:b,fontSizeMedium:w,fontSizeLarge:T,heightTiny:S,heightSmall:E,heightMedium:I,heightLarge:P,borderRadius:t,textColor:r,textColorDisabled:o,placeholderColor:g,placeholderColorDisabled:x,color:n,colorDisabled:i,colorActive:G(a,{alpha:.1}),border:"1px solid #0000",borderHover:`1px solid ${s}`,borderActive:`1px solid ${a}`,borderFocus:`1px solid ${s}`,boxShadowHover:"none",boxShadowActive:`0 0 8px 0 ${G(a,{alpha:.4})}`,boxShadowFocus:`0 0 8px 0 ${G(a,{alpha:.4})}`,caretColor:a,arrowColor:f,arrowColorDisabled:p,loadingColor:a,borderWarning:`1px solid ${l}`,borderHoverWarning:`1px solid ${c}`,borderActiveWarning:`1px solid ${l}`,borderFocusWarning:`1px solid ${c}`,boxShadowHoverWarning:"none",boxShadowActiveWarning:`0 0 8px 0 ${G(l,{alpha:.4})}`,boxShadowFocusWarning:`0 0 8px 0 ${G(l,{alpha:.4})}`,colorActiveWarning:G(l,{alpha:.1}),caretColorWarning:l,borderError:`1px solid ${u}`,borderHoverError:`1px solid ${d}`,borderActiveError:`1px solid ${u}`,borderFocusError:`1px solid ${d}`,boxShadowHoverError:"none",boxShadowActiveError:`0 0 8px 0 ${G(u,{alpha:.4})}`,boxShadowFocusError:`0 0 8px 0 ${G(u,{alpha:.4})}`,colorActiveError:G(u,{alpha:.1}),caretColorError:u,clearColor:h,clearColorHover:m,clearColorPressed:v})}},vu=nw,{cubicBezierEaseInOut:jr}=ao;function iw({duration:e=".2s",delay:t=".1s"}={}){return[ne("&.fade-in-width-expand-transition-leave-from, &.fade-in-width-expand-transition-enter-to",{opacity:1}),ne("&.fade-in-width-expand-transition-leave-to, &.fade-in-width-expand-transition-enter-from",` - opacity: 0!important; - margin-left: 0!important; - margin-right: 0!important; - `),ne("&.fade-in-width-expand-transition-leave-active",` - overflow: hidden; - transition: - opacity ${e} ${jr}, - max-width ${e} ${jr} ${t}, - margin-left ${e} ${jr} ${t}, - margin-right ${e} ${jr} ${t}; - `),ne("&.fade-in-width-expand-transition-enter-active",` - overflow: hidden; - transition: - opacity ${e} ${jr} ${t}, - max-width ${e} ${jr}, - margin-left ${e} ${jr}, - margin-right ${e} ${jr}; - `)]}const lg={iconMargin:"11px 8px 0 12px",iconMarginRtl:"11px 12px 0 8px",iconSize:"24px",closeIconSize:"16px",closeSize:"20px",closeMargin:"13px 14px 0 0",closeMarginRtl:"13px 0 0 14px",padding:"13px"},aw={name:"Alert",common:se,self(e){const{lineHeight:t,borderRadius:r,fontWeightStrong:o,dividerColor:n,inputColor:i,textColor1:a,textColor2:s,closeColorHover:l,closeColorPressed:c,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:f,infoColorSuppl:p,successColorSuppl:h,warningColorSuppl:m,errorColorSuppl:v,fontSize:g}=e;return Object.assign(Object.assign({},lg),{fontSize:g,lineHeight:t,titleFontWeight:o,borderRadius:r,border:`1px solid ${n}`,color:i,titleTextColor:a,iconColor:s,contentTextColor:s,closeBorderRadius:r,closeColorHover:l,closeColorPressed:c,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:f,borderInfo:`1px solid ${G(p,{alpha:.35})}`,colorInfo:G(p,{alpha:.25}),titleTextColorInfo:a,iconColorInfo:p,contentTextColorInfo:s,closeColorHoverInfo:l,closeColorPressedInfo:c,closeIconColorInfo:u,closeIconColorHoverInfo:d,closeIconColorPressedInfo:f,borderSuccess:`1px solid ${G(h,{alpha:.35})}`,colorSuccess:G(h,{alpha:.25}),titleTextColorSuccess:a,iconColorSuccess:h,contentTextColorSuccess:s,closeColorHoverSuccess:l,closeColorPressedSuccess:c,closeIconColorSuccess:u,closeIconColorHoverSuccess:d,closeIconColorPressedSuccess:f,borderWarning:`1px solid ${G(m,{alpha:.35})}`,colorWarning:G(m,{alpha:.25}),titleTextColorWarning:a,iconColorWarning:m,contentTextColorWarning:s,closeColorHoverWarning:l,closeColorPressedWarning:c,closeIconColorWarning:u,closeIconColorHoverWarning:d,closeIconColorPressedWarning:f,borderError:`1px solid ${G(v,{alpha:.35})}`,colorError:G(v,{alpha:.25}),titleTextColorError:a,iconColorError:v,contentTextColorError:s,closeColorHoverError:l,closeColorPressedError:c,closeIconColorError:u,closeIconColorHoverError:d,closeIconColorPressedError:f})}},sw=aw,lw=e=>{const{lineHeight:t,borderRadius:r,fontWeightStrong:o,baseColor:n,dividerColor:i,actionColor:a,textColor1:s,textColor2:l,closeColorHover:c,closeColorPressed:u,closeIconColor:d,closeIconColorHover:f,closeIconColorPressed:p,infoColor:h,successColor:m,warningColor:v,errorColor:g,fontSize:x}=e;return Object.assign(Object.assign({},lg),{fontSize:x,lineHeight:t,titleFontWeight:o,borderRadius:r,border:`1px solid ${i}`,color:a,titleTextColor:s,iconColor:l,contentTextColor:l,closeBorderRadius:r,closeColorHover:c,closeColorPressed:u,closeIconColor:d,closeIconColorHover:f,closeIconColorPressed:p,borderInfo:`1px solid ${me(n,G(h,{alpha:.25}))}`,colorInfo:me(n,G(h,{alpha:.08})),titleTextColorInfo:s,iconColorInfo:h,contentTextColorInfo:l,closeColorHoverInfo:c,closeColorPressedInfo:u,closeIconColorInfo:d,closeIconColorHoverInfo:f,closeIconColorPressedInfo:p,borderSuccess:`1px solid ${me(n,G(m,{alpha:.25}))}`,colorSuccess:me(n,G(m,{alpha:.08})),titleTextColorSuccess:s,iconColorSuccess:m,contentTextColorSuccess:l,closeColorHoverSuccess:c,closeColorPressedSuccess:u,closeIconColorSuccess:d,closeIconColorHoverSuccess:f,closeIconColorPressedSuccess:p,borderWarning:`1px solid ${me(n,G(v,{alpha:.33}))}`,colorWarning:me(n,G(v,{alpha:.08})),titleTextColorWarning:s,iconColorWarning:v,contentTextColorWarning:l,closeColorHoverWarning:c,closeColorPressedWarning:u,closeIconColorWarning:d,closeIconColorHoverWarning:f,closeIconColorPressedWarning:p,borderError:`1px solid ${me(n,G(g,{alpha:.25}))}`,colorError:me(n,G(g,{alpha:.08})),titleTextColorError:s,iconColorError:g,contentTextColorError:l,closeColorHoverError:c,closeColorPressedError:u,closeIconColorError:d,closeIconColorHoverError:f,closeIconColorPressedError:p})},cw={name:"Alert",common:le,self:lw},uw=cw,{cubicBezierEaseInOut:fr,cubicBezierEaseOut:dw,cubicBezierEaseIn:fw}=ao;function hw({overflow:e="hidden",duration:t=".3s",originalTransition:r="",leavingDelay:o="0s",foldPadding:n=!1,enterToProps:i=void 0,leaveToProps:a=void 0,reverse:s=!1}={}){const l=s?"leave":"enter",c=s?"enter":"leave";return[ne(`&.fade-in-height-expand-transition-${c}-from, - &.fade-in-height-expand-transition-${l}-to`,Object.assign(Object.assign({},i),{opacity:1})),ne(`&.fade-in-height-expand-transition-${c}-to, - &.fade-in-height-expand-transition-${l}-from`,Object.assign(Object.assign({},a),{opacity:0,marginTop:"0 !important",marginBottom:"0 !important",paddingTop:n?"0 !important":void 0,paddingBottom:n?"0 !important":void 0})),ne(`&.fade-in-height-expand-transition-${c}-active`,` - overflow: ${e}; - transition: - max-height ${t} ${fr} ${o}, - opacity ${t} ${dw} ${o}, - margin-top ${t} ${fr} ${o}, - margin-bottom ${t} ${fr} ${o}, - padding-top ${t} ${fr} ${o}, - padding-bottom ${t} ${fr} ${o} - ${r?","+r:""} - `),ne(`&.fade-in-height-expand-transition-${l}-active`,` - overflow: ${e}; - transition: - max-height ${t} ${fr}, - opacity ${t} ${fw}, - margin-top ${t} ${fr}, - margin-bottom ${t} ${fr}, - padding-top ${t} ${fr}, - padding-bottom ${t} ${fr} - ${r?","+r:""} - `)]}const pw={linkFontSize:"13px",linkPadding:"0 0 0 16px",railWidth:"4px"},cg=e=>{const{borderRadius:t,railColor:r,primaryColor:o,primaryColorHover:n,primaryColorPressed:i,textColor2:a}=e;return Object.assign(Object.assign({},pw),{borderRadius:t,railColor:r,railColorActive:o,linkColor:G(o,{alpha:.15}),linkTextColor:a,linkTextColorHover:n,linkTextColorPressed:i,linkTextColorActive:o})},mw={name:"Anchor",common:le,self:cg},gw=mw,xw={name:"Anchor",common:se,self:cg},vw=xw,bw=dn&&"chrome"in window;dn&&navigator.userAgent.includes("Firefox");const Cw=dn&&navigator.userAgent.includes("Safari")&&!bw,ug={paddingTiny:"0 8px",paddingSmall:"0 10px",paddingMedium:"0 12px",paddingLarge:"0 14px",clearSize:"16px"},yw={name:"Input",common:se,self(e){const{textColor2:t,textColor3:r,textColorDisabled:o,primaryColor:n,primaryColorHover:i,inputColor:a,inputColorDisabled:s,warningColor:l,warningColorHover:c,errorColor:u,errorColorHover:d,borderRadius:f,lineHeight:p,fontSizeTiny:h,fontSizeSmall:m,fontSizeMedium:v,fontSizeLarge:g,heightTiny:x,heightSmall:C,heightMedium:b,heightLarge:w,clearColor:T,clearColorHover:S,clearColorPressed:E,placeholderColor:I,placeholderColorDisabled:P,iconColor:$,iconColorDisabled:R,iconColorHover:B,iconColorPressed:j}=e;return Object.assign(Object.assign({},ug),{countTextColorDisabled:o,countTextColor:r,heightTiny:x,heightSmall:C,heightMedium:b,heightLarge:w,fontSizeTiny:h,fontSizeSmall:m,fontSizeMedium:v,fontSizeLarge:g,lineHeight:p,lineHeightTextarea:p,borderRadius:f,iconSize:"16px",groupLabelColor:a,textColor:t,textColorDisabled:o,textDecorationColor:t,groupLabelTextColor:t,caretColor:n,placeholderColor:I,placeholderColorDisabled:P,color:a,colorDisabled:s,colorFocus:G(n,{alpha:.1}),groupLabelBorder:"1px solid #0000",border:"1px solid #0000",borderHover:`1px solid ${i}`,borderDisabled:"1px solid #0000",borderFocus:`1px solid ${i}`,boxShadowFocus:`0 0 8px 0 ${G(n,{alpha:.3})}`,loadingColor:n,loadingColorWarning:l,borderWarning:`1px solid ${l}`,borderHoverWarning:`1px solid ${c}`,colorFocusWarning:G(l,{alpha:.1}),borderFocusWarning:`1px solid ${c}`,boxShadowFocusWarning:`0 0 8px 0 ${G(l,{alpha:.3})}`,caretColorWarning:l,loadingColorError:u,borderError:`1px solid ${u}`,borderHoverError:`1px solid ${d}`,colorFocusError:G(u,{alpha:.1}),borderFocusError:`1px solid ${d}`,boxShadowFocusError:`0 0 8px 0 ${G(u,{alpha:.3})}`,caretColorError:u,clearColor:T,clearColorHover:S,clearColorPressed:E,iconColor:$,iconColorDisabled:R,iconColorHover:B,iconColorPressed:j,suffixTextColor:t})}},Xt=yw,Sw=e=>{const{textColor2:t,textColor3:r,textColorDisabled:o,primaryColor:n,primaryColorHover:i,inputColor:a,inputColorDisabled:s,borderColor:l,warningColor:c,warningColorHover:u,errorColor:d,errorColorHover:f,borderRadius:p,lineHeight:h,fontSizeTiny:m,fontSizeSmall:v,fontSizeMedium:g,fontSizeLarge:x,heightTiny:C,heightSmall:b,heightMedium:w,heightLarge:T,actionColor:S,clearColor:E,clearColorHover:I,clearColorPressed:P,placeholderColor:$,placeholderColorDisabled:R,iconColor:B,iconColorDisabled:j,iconColorHover:Y,iconColorPressed:J}=e;return Object.assign(Object.assign({},ug),{countTextColorDisabled:o,countTextColor:r,heightTiny:C,heightSmall:b,heightMedium:w,heightLarge:T,fontSizeTiny:m,fontSizeSmall:v,fontSizeMedium:g,fontSizeLarge:x,lineHeight:h,lineHeightTextarea:h,borderRadius:p,iconSize:"16px",groupLabelColor:S,groupLabelTextColor:t,textColor:t,textColorDisabled:o,textDecorationColor:t,caretColor:n,placeholderColor:$,placeholderColorDisabled:R,color:a,colorDisabled:s,colorFocus:a,groupLabelBorder:`1px solid ${l}`,border:`1px solid ${l}`,borderHover:`1px solid ${i}`,borderDisabled:`1px solid ${l}`,borderFocus:`1px solid ${i}`,boxShadowFocus:`0 0 0 2px ${G(n,{alpha:.2})}`,loadingColor:n,loadingColorWarning:c,borderWarning:`1px solid ${c}`,borderHoverWarning:`1px solid ${u}`,colorFocusWarning:a,borderFocusWarning:`1px solid ${u}`,boxShadowFocusWarning:`0 0 0 2px ${G(c,{alpha:.2})}`,caretColorWarning:c,loadingColorError:d,borderError:`1px solid ${d}`,borderHoverError:`1px solid ${f}`,colorFocusError:a,borderFocusError:`1px solid ${f}`,boxShadowFocusError:`0 0 0 2px ${G(d,{alpha:.2})}`,caretColorError:d,clearColor:E,clearColorHover:I,clearColorPressed:P,iconColor:B,iconColorDisabled:j,iconColorHover:Y,iconColorPressed:J,suffixTextColor:t})},ww={name:"Input",common:le,self:Sw},Yt=ww;function dg(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}const _w={name:"AutoComplete",common:le,peers:{InternalSelectMenu:wi,Input:Yt},self:dg},Tw=_w,Ew={name:"AutoComplete",common:se,peers:{InternalSelectMenu:_i,Input:Xt},self:dg},Pw=Ew,fg=e=>{const{borderRadius:t,avatarColor:r,cardColor:o,fontSize:n,heightTiny:i,heightSmall:a,heightMedium:s,heightLarge:l,heightHuge:c,modalColor:u,popoverColor:d}=e;return{borderRadius:t,fontSize:n,border:`2px solid ${o}`,heightTiny:i,heightSmall:a,heightMedium:s,heightLarge:l,heightHuge:c,color:me(o,r),colorModal:me(u,r),colorPopover:me(d,r)}},kw={name:"Avatar",common:le,self:fg},hg=kw,Lw={name:"Avatar",common:se,self:fg},pg=Lw,mg=()=>({gap:"-12px"}),$w={name:"AvatarGroup",common:le,peers:{Avatar:hg},self:mg},Iw=$w,Rw={name:"AvatarGroup",common:se,peers:{Avatar:pg},self:mg},Aw=Rw,gg={width:"44px",height:"44px",borderRadius:"22px",iconSize:"26px"},Ow={name:"BackTop",common:se,self(e){const{popoverColor:t,textColor2:r,primaryColorHover:o,primaryColorPressed:n}=e;return Object.assign(Object.assign({},gg),{color:t,textColor:r,iconColor:r,iconColorHover:o,iconColorPressed:n,boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",boxShadowHover:"0 2px 12px 0px rgba(0, 0, 0, .18)",boxShadowPressed:"0 2px 12px 0px rgba(0, 0, 0, .18)"})}},Bw=Ow,Hw=e=>{const{popoverColor:t,textColor2:r,primaryColorHover:o,primaryColorPressed:n}=e;return Object.assign(Object.assign({},gg),{color:t,textColor:r,iconColor:r,iconColorHover:o,iconColorPressed:n,boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",boxShadowHover:"0 2px 12px 0px rgba(0, 0, 0, .18)",boxShadowPressed:"0 2px 12px 0px rgba(0, 0, 0, .18)"})},Mw={name:"BackTop",common:le,self:Hw},Dw=Mw,Fw={name:"Badge",common:se,self(e){const{errorColorSuppl:t,infoColorSuppl:r,successColorSuppl:o,warningColorSuppl:n,fontFamily:i}=e;return{color:t,colorInfo:r,colorSuccess:o,colorError:t,colorWarning:n,fontSize:"12px",fontFamily:i}}},zw=Fw,Nw=e=>{const{errorColor:t,infoColor:r,successColor:o,warningColor:n,fontFamily:i}=e;return{color:t,colorInfo:r,colorSuccess:o,colorError:t,colorWarning:n,fontSize:"12px",fontFamily:i}},Ww={name:"Badge",common:le,self:Nw},jw=Ww,Uw={fontWeightActive:"400"},xg=e=>{const{fontSize:t,textColor3:r,textColor2:o,borderRadius:n,buttonColor2Hover:i,buttonColor2Pressed:a}=e;return Object.assign(Object.assign({},Uw),{fontSize:t,itemLineHeight:"1.25",itemTextColor:r,itemTextColorHover:o,itemTextColorPressed:o,itemTextColorActive:o,itemBorderRadius:n,itemColorHover:i,itemColorPressed:a,separatorColor:r})},Vw={name:"Breadcrumb",common:le,self:xg},qw=Vw,Gw={name:"Breadcrumb",common:se,self:xg},Kw=Gw;function mo(e){return me(e,[255,255,255,.16])}function ji(e){return me(e,[0,0,0,.12])}const Zw="n-button-group",Xw={paddingTiny:"0 6px",paddingSmall:"0 10px",paddingMedium:"0 14px",paddingLarge:"0 18px",paddingRoundTiny:"0 10px",paddingRoundSmall:"0 14px",paddingRoundMedium:"0 18px",paddingRoundLarge:"0 22px",iconMarginTiny:"6px",iconMarginSmall:"6px",iconMarginMedium:"6px",iconMarginLarge:"6px",iconSizeTiny:"14px",iconSizeSmall:"18px",iconSizeMedium:"18px",iconSizeLarge:"20px",rippleDuration:".6s"},vg=e=>{const{heightTiny:t,heightSmall:r,heightMedium:o,heightLarge:n,borderRadius:i,fontSizeTiny:a,fontSizeSmall:s,fontSizeMedium:l,fontSizeLarge:c,opacityDisabled:u,textColor2:d,textColor3:f,primaryColorHover:p,primaryColorPressed:h,borderColor:m,primaryColor:v,baseColor:g,infoColor:x,infoColorHover:C,infoColorPressed:b,successColor:w,successColorHover:T,successColorPressed:S,warningColor:E,warningColorHover:I,warningColorPressed:P,errorColor:$,errorColorHover:R,errorColorPressed:B,fontWeight:j,buttonColor2:Y,buttonColor2Hover:J,buttonColor2Pressed:Q,fontWeightStrong:ie}=e;return Object.assign(Object.assign({},Xw),{heightTiny:t,heightSmall:r,heightMedium:o,heightLarge:n,borderRadiusTiny:i,borderRadiusSmall:i,borderRadiusMedium:i,borderRadiusLarge:i,fontSizeTiny:a,fontSizeSmall:s,fontSizeMedium:l,fontSizeLarge:c,opacityDisabled:u,colorOpacitySecondary:"0.16",colorOpacitySecondaryHover:"0.22",colorOpacitySecondaryPressed:"0.28",colorSecondary:Y,colorSecondaryHover:J,colorSecondaryPressed:Q,colorTertiary:Y,colorTertiaryHover:J,colorTertiaryPressed:Q,colorQuaternary:"#0000",colorQuaternaryHover:J,colorQuaternaryPressed:Q,color:"#0000",colorHover:"#0000",colorPressed:"#0000",colorFocus:"#0000",colorDisabled:"#0000",textColor:d,textColorTertiary:f,textColorHover:p,textColorPressed:h,textColorFocus:p,textColorDisabled:d,textColorText:d,textColorTextHover:p,textColorTextPressed:h,textColorTextFocus:p,textColorTextDisabled:d,textColorGhost:d,textColorGhostHover:p,textColorGhostPressed:h,textColorGhostFocus:p,textColorGhostDisabled:d,border:`1px solid ${m}`,borderHover:`1px solid ${p}`,borderPressed:`1px solid ${h}`,borderFocus:`1px solid ${p}`,borderDisabled:`1px solid ${m}`,rippleColor:v,colorPrimary:v,colorHoverPrimary:p,colorPressedPrimary:h,colorFocusPrimary:p,colorDisabledPrimary:v,textColorPrimary:g,textColorHoverPrimary:g,textColorPressedPrimary:g,textColorFocusPrimary:g,textColorDisabledPrimary:g,textColorTextPrimary:v,textColorTextHoverPrimary:p,textColorTextPressedPrimary:h,textColorTextFocusPrimary:p,textColorTextDisabledPrimary:d,textColorGhostPrimary:v,textColorGhostHoverPrimary:p,textColorGhostPressedPrimary:h,textColorGhostFocusPrimary:p,textColorGhostDisabledPrimary:v,borderPrimary:`1px solid ${v}`,borderHoverPrimary:`1px solid ${p}`,borderPressedPrimary:`1px solid ${h}`,borderFocusPrimary:`1px solid ${p}`,borderDisabledPrimary:`1px solid ${v}`,rippleColorPrimary:v,colorInfo:x,colorHoverInfo:C,colorPressedInfo:b,colorFocusInfo:C,colorDisabledInfo:x,textColorInfo:g,textColorHoverInfo:g,textColorPressedInfo:g,textColorFocusInfo:g,textColorDisabledInfo:g,textColorTextInfo:x,textColorTextHoverInfo:C,textColorTextPressedInfo:b,textColorTextFocusInfo:C,textColorTextDisabledInfo:d,textColorGhostInfo:x,textColorGhostHoverInfo:C,textColorGhostPressedInfo:b,textColorGhostFocusInfo:C,textColorGhostDisabledInfo:x,borderInfo:`1px solid ${x}`,borderHoverInfo:`1px solid ${C}`,borderPressedInfo:`1px solid ${b}`,borderFocusInfo:`1px solid ${C}`,borderDisabledInfo:`1px solid ${x}`,rippleColorInfo:x,colorSuccess:w,colorHoverSuccess:T,colorPressedSuccess:S,colorFocusSuccess:T,colorDisabledSuccess:w,textColorSuccess:g,textColorHoverSuccess:g,textColorPressedSuccess:g,textColorFocusSuccess:g,textColorDisabledSuccess:g,textColorTextSuccess:w,textColorTextHoverSuccess:T,textColorTextPressedSuccess:S,textColorTextFocusSuccess:T,textColorTextDisabledSuccess:d,textColorGhostSuccess:w,textColorGhostHoverSuccess:T,textColorGhostPressedSuccess:S,textColorGhostFocusSuccess:T,textColorGhostDisabledSuccess:w,borderSuccess:`1px solid ${w}`,borderHoverSuccess:`1px solid ${T}`,borderPressedSuccess:`1px solid ${S}`,borderFocusSuccess:`1px solid ${T}`,borderDisabledSuccess:`1px solid ${w}`,rippleColorSuccess:w,colorWarning:E,colorHoverWarning:I,colorPressedWarning:P,colorFocusWarning:I,colorDisabledWarning:E,textColorWarning:g,textColorHoverWarning:g,textColorPressedWarning:g,textColorFocusWarning:g,textColorDisabledWarning:g,textColorTextWarning:E,textColorTextHoverWarning:I,textColorTextPressedWarning:P,textColorTextFocusWarning:I,textColorTextDisabledWarning:d,textColorGhostWarning:E,textColorGhostHoverWarning:I,textColorGhostPressedWarning:P,textColorGhostFocusWarning:I,textColorGhostDisabledWarning:E,borderWarning:`1px solid ${E}`,borderHoverWarning:`1px solid ${I}`,borderPressedWarning:`1px solid ${P}`,borderFocusWarning:`1px solid ${I}`,borderDisabledWarning:`1px solid ${E}`,rippleColorWarning:E,colorError:$,colorHoverError:R,colorPressedError:B,colorFocusError:R,colorDisabledError:$,textColorError:g,textColorHoverError:g,textColorPressedError:g,textColorFocusError:g,textColorDisabledError:g,textColorTextError:$,textColorTextHoverError:R,textColorTextPressedError:B,textColorTextFocusError:R,textColorTextDisabledError:d,textColorGhostError:$,textColorGhostHoverError:R,textColorGhostPressedError:B,textColorGhostFocusError:R,textColorGhostDisabledError:$,borderError:`1px solid ${$}`,borderHoverError:`1px solid ${R}`,borderPressedError:`1px solid ${B}`,borderFocusError:`1px solid ${R}`,borderDisabledError:`1px solid ${$}`,rippleColorError:$,waveOpacity:"0.6",fontWeight:j,fontWeightStrong:ie})},Yw={name:"Button",common:le,self:vg},It=Yw,Qw={name:"Button",common:se,self(e){const t=vg(e);return t.waveOpacity="0.8",t.colorOpacitySecondary="0.16",t.colorOpacitySecondaryHover="0.2",t.colorOpacitySecondaryPressed="0.12",t}},Dt=Qw,Jw=ne([Se("button",` - margin: 0; - font-weight: var(--n-font-weight); - line-height: 1; - font-family: inherit; - padding: var(--n-padding); - height: var(--n-height); - font-size: var(--n-font-size); - border-radius: var(--n-border-radius); - color: var(--n-text-color); - background-color: var(--n-color); - width: var(--n-width); - white-space: nowrap; - outline: none; - position: relative; - z-index: auto; - border: none; - display: inline-flex; - flex-wrap: nowrap; - flex-shrink: 0; - align-items: center; - justify-content: center; - user-select: none; - -webkit-user-select: none; - text-align: center; - cursor: pointer; - text-decoration: none; - transition: - color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - opacity .3s var(--n-bezier), - border-color .3s var(--n-bezier); - `,[Ce("color",[he("border",{borderColor:"var(--n-border-color)"}),Ce("disabled",[he("border",{borderColor:"var(--n-border-color-disabled)"})]),Wl("disabled",[ne("&:focus",[he("state-border",{borderColor:"var(--n-border-color-focus)"})]),ne("&:hover",[he("state-border",{borderColor:"var(--n-border-color-hover)"})]),ne("&:active",[he("state-border",{borderColor:"var(--n-border-color-pressed)"})]),Ce("pressed",[he("state-border",{borderColor:"var(--n-border-color-pressed)"})])])]),Ce("disabled",{backgroundColor:"var(--n-color-disabled)",color:"var(--n-text-color-disabled)"},[he("border",{border:"var(--n-border-disabled)"})]),Wl("disabled",[ne("&:focus",{backgroundColor:"var(--n-color-focus)",color:"var(--n-text-color-focus)"},[he("state-border",{border:"var(--n-border-focus)"})]),ne("&:hover",{backgroundColor:"var(--n-color-hover)",color:"var(--n-text-color-hover)"},[he("state-border",{border:"var(--n-border-hover)"})]),ne("&:active",{backgroundColor:"var(--n-color-pressed)",color:"var(--n-text-color-pressed)"},[he("state-border",{border:"var(--n-border-pressed)"})]),Ce("pressed",{backgroundColor:"var(--n-color-pressed)",color:"var(--n-text-color-pressed)"},[he("state-border",{border:"var(--n-border-pressed)"})])]),Ce("loading","cursor: wait;"),Se("base-wave",` - pointer-events: none; - top: 0; - right: 0; - bottom: 0; - left: 0; - animation-iteration-count: 1; - animation-duration: var(--n-ripple-duration); - animation-timing-function: var(--n-bezier-ease-out), var(--n-bezier-ease-out); - `,[Ce("active",{zIndex:1,animationName:"button-wave-spread, button-wave-opacity"})]),dn&&"MozBoxSizing"in document.createElement("div").style?ne("&::moz-focus-inner",{border:0}):null,he("border, state-border",` - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - border-radius: inherit; - transition: border-color .3s var(--n-bezier); - pointer-events: none; - `),he("border",{border:"var(--n-border)"}),he("state-border",{border:"var(--n-border)",borderColor:"#0000",zIndex:1}),he("icon",` - margin: var(--n-icon-margin); - margin-left: 0; - height: var(--n-icon-size); - width: var(--n-icon-size); - max-width: var(--n-icon-size); - font-size: var(--n-icon-size); - position: relative; - flex-shrink: 0; - `,[Se("icon-slot",` - height: var(--n-icon-size); - width: var(--n-icon-size); - position: absolute; - left: 0; - top: 50%; - transform: translateY(-50%); - display: flex; - align-items: center; - justify-content: center; - `,[ya({top:"50%",originalTransform:"translateY(-50%)"})]),iw()]),he("content",` - display: flex; - align-items: center; - flex-wrap: nowrap; - min-width: 0; - `,[ne("~",[he("icon",{margin:"var(--n-icon-margin)",marginRight:0})])]),Ce("block",` - display: flex; - width: 100%; - `),Ce("dashed",[he("border, state-border",{borderStyle:"dashed !important"})]),Ce("disabled",{cursor:"not-allowed",opacity:"var(--n-opacity-disabled)"})]),ne("@keyframes button-wave-spread",{from:{boxShadow:"0 0 0.5px 0 var(--n-ripple-color)"},to:{boxShadow:"0 0 0.5px 4.5px var(--n-ripple-color)"}}),ne("@keyframes button-wave-opacity",{from:{opacity:"var(--n-wave-opacity)"},to:{opacity:0}})]),e_=Object.assign(Object.assign({},Ct.props),{color:String,textColor:String,text:Boolean,block:Boolean,loading:Boolean,disabled:Boolean,circle:Boolean,size:String,ghost:Boolean,round:Boolean,secondary:Boolean,tertiary:Boolean,quaternary:Boolean,strong:Boolean,focusable:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},tag:{type:String,default:"button"},type:{type:String,default:"default"},dashed:Boolean,renderIcon:Function,iconPlacement:{type:String,default:"left"},attrType:{type:String,default:"button"},bordered:{type:Boolean,default:!0},onClick:[Function,Array],nativeFocusBehavior:{type:Boolean,default:!Cw}}),t_=Oe({name:"Button",props:e_,setup(e){const t=de(null),r=de(null),o=de(!1),n=jl(()=>!e.quaternary&&!e.tertiary&&!e.secondary&&!e.text&&(!e.color||e.ghost||e.dashed)&&e.bordered),i=Me(Zw,{}),{mergedSizeRef:a}=Vy({},{defaultSize:"medium",mergedSize:b=>{const{size:w}=e;if(w)return w;const{size:T}=i;if(T)return T;const{mergedSize:S}=b||{};return S?S.value:"medium"}}),s=ae(()=>e.focusable&&!e.disabled),l=b=>{var w;s.value||b.preventDefault(),!e.nativeFocusBehavior&&(b.preventDefault(),!e.disabled&&s.value&&((w=t.value)===null||w===void 0||w.focus({preventScroll:!0})))},c=b=>{var w;if(!e.disabled&&!e.loading){const{onClick:T}=e;T&&_o(T,b),e.text||(w=r.value)===null||w===void 0||w.play()}},u=b=>{switch(b.key){case"Enter":if(!e.keyboard)return;o.value=!1}},d=b=>{switch(b.key){case"Enter":if(!e.keyboard||e.loading){b.preventDefault();return}o.value=!0}},f=()=>{o.value=!1},{inlineThemeDisabled:p,mergedClsPrefixRef:h,mergedRtlRef:m}=sr(e),v=Ct("Button","-button",Jw,It,e,h),g=yi("Button",m,h),x=ae(()=>{const b=v.value,{common:{cubicBezierEaseInOut:w,cubicBezierEaseOut:T},self:S}=b,{rippleDuration:E,opacityDisabled:I,fontWeight:P,fontWeightStrong:$}=S,R=a.value,{dashed:B,type:j,ghost:Y,text:J,color:Q,round:ie,circle:ge,textColor:ve,secondary:z,tertiary:W,quaternary:Z,strong:V}=e,D={"font-weight":V?$:P};let U={"--n-color":"initial","--n-color-hover":"initial","--n-color-pressed":"initial","--n-color-focus":"initial","--n-color-disabled":"initial","--n-ripple-color":"initial","--n-text-color":"initial","--n-text-color-hover":"initial","--n-text-color-pressed":"initial","--n-text-color-focus":"initial","--n-text-color-disabled":"initial"};const re=j==="tertiary",ee=j==="default",ce=re?"default":j;if(J){const q=ve||Q;U={"--n-color":"#0000","--n-color-hover":"#0000","--n-color-pressed":"#0000","--n-color-focus":"#0000","--n-color-disabled":"#0000","--n-ripple-color":"#0000","--n-text-color":q||S[_e("textColorText",ce)],"--n-text-color-hover":q?mo(q):S[_e("textColorTextHover",ce)],"--n-text-color-pressed":q?ji(q):S[_e("textColorTextPressed",ce)],"--n-text-color-focus":q?mo(q):S[_e("textColorTextHover",ce)],"--n-text-color-disabled":q||S[_e("textColorTextDisabled",ce)]}}else if(Y||B){const q=ve||Q;U={"--n-color":"#0000","--n-color-hover":"#0000","--n-color-pressed":"#0000","--n-color-focus":"#0000","--n-color-disabled":"#0000","--n-ripple-color":Q||S[_e("rippleColor",ce)],"--n-text-color":q||S[_e("textColorGhost",ce)],"--n-text-color-hover":q?mo(q):S[_e("textColorGhostHover",ce)],"--n-text-color-pressed":q?ji(q):S[_e("textColorGhostPressed",ce)],"--n-text-color-focus":q?mo(q):S[_e("textColorGhostHover",ce)],"--n-text-color-disabled":q||S[_e("textColorGhostDisabled",ce)]}}else if(z){const q=ee?S.textColor:re?S.textColorTertiary:S[_e("color",ce)],F=Q||q,A=j!=="default"&&j!=="tertiary";U={"--n-color":A?G(F,{alpha:Number(S.colorOpacitySecondary)}):S.colorSecondary,"--n-color-hover":A?G(F,{alpha:Number(S.colorOpacitySecondaryHover)}):S.colorSecondaryHover,"--n-color-pressed":A?G(F,{alpha:Number(S.colorOpacitySecondaryPressed)}):S.colorSecondaryPressed,"--n-color-focus":A?G(F,{alpha:Number(S.colorOpacitySecondaryHover)}):S.colorSecondaryHover,"--n-color-disabled":S.colorSecondary,"--n-ripple-color":"#0000","--n-text-color":F,"--n-text-color-hover":F,"--n-text-color-pressed":F,"--n-text-color-focus":F,"--n-text-color-disabled":F}}else if(W||Z){const q=ee?S.textColor:re?S.textColorTertiary:S[_e("color",ce)],F=Q||q;W?(U["--n-color"]=S.colorTertiary,U["--n-color-hover"]=S.colorTertiaryHover,U["--n-color-pressed"]=S.colorTertiaryPressed,U["--n-color-focus"]=S.colorSecondaryHover,U["--n-color-disabled"]=S.colorTertiary):(U["--n-color"]=S.colorQuaternary,U["--n-color-hover"]=S.colorQuaternaryHover,U["--n-color-pressed"]=S.colorQuaternaryPressed,U["--n-color-focus"]=S.colorQuaternaryHover,U["--n-color-disabled"]=S.colorQuaternary),U["--n-ripple-color"]="#0000",U["--n-text-color"]=F,U["--n-text-color-hover"]=F,U["--n-text-color-pressed"]=F,U["--n-text-color-focus"]=F,U["--n-text-color-disabled"]=F}else U={"--n-color":Q||S[_e("color",ce)],"--n-color-hover":Q?mo(Q):S[_e("colorHover",ce)],"--n-color-pressed":Q?ji(Q):S[_e("colorPressed",ce)],"--n-color-focus":Q?mo(Q):S[_e("colorFocus",ce)],"--n-color-disabled":Q||S[_e("colorDisabled",ce)],"--n-ripple-color":Q||S[_e("rippleColor",ce)],"--n-text-color":ve||(Q?S.textColorPrimary:re?S.textColorTertiary:S[_e("textColor",ce)]),"--n-text-color-hover":ve||(Q?S.textColorHoverPrimary:S[_e("textColorHover",ce)]),"--n-text-color-pressed":ve||(Q?S.textColorPressedPrimary:S[_e("textColorPressed",ce)]),"--n-text-color-focus":ve||(Q?S.textColorFocusPrimary:S[_e("textColorFocus",ce)]),"--n-text-color-disabled":ve||(Q?S.textColorDisabledPrimary:S[_e("textColorDisabled",ce)])};let ke={"--n-border":"initial","--n-border-hover":"initial","--n-border-pressed":"initial","--n-border-focus":"initial","--n-border-disabled":"initial"};J?ke={"--n-border":"none","--n-border-hover":"none","--n-border-pressed":"none","--n-border-focus":"none","--n-border-disabled":"none"}:ke={"--n-border":S[_e("border",ce)],"--n-border-hover":S[_e("borderHover",ce)],"--n-border-pressed":S[_e("borderPressed",ce)],"--n-border-focus":S[_e("borderFocus",ce)],"--n-border-disabled":S[_e("borderDisabled",ce)]};const{[_e("height",R)]:ye,[_e("fontSize",R)]:k,[_e("padding",R)]:y,[_e("paddingRound",R)]:_,[_e("iconSize",R)]:L,[_e("borderRadius",R)]:O,[_e("iconMargin",R)]:N,waveOpacity:X}=S,te={"--n-width":ge&&!J?ye:"initial","--n-height":J?"initial":ye,"--n-font-size":k,"--n-padding":ge||J?"initial":ie?_:y,"--n-icon-size":L,"--n-icon-margin":N,"--n-border-radius":J?"initial":ge||ie?ye:O};return Object.assign(Object.assign(Object.assign(Object.assign({"--n-bezier":w,"--n-bezier-ease-out":T,"--n-ripple-duration":E,"--n-opacity-disabled":I,"--n-wave-opacity":X},D),U),ke),te)}),C=p?so("button",ae(()=>{let b="";const{dashed:w,type:T,ghost:S,text:E,color:I,round:P,circle:$,textColor:R,secondary:B,tertiary:j,quaternary:Y,strong:J}=e;w&&(b+="a"),S&&(b+="b"),E&&(b+="c"),P&&(b+="d"),$&&(b+="e"),B&&(b+="f"),j&&(b+="g"),Y&&(b+="h"),J&&(b+="i"),I&&(b+="j"+W0(I)),R&&(b+="k"+W0(R));const{value:Q}=a;return b+="l"+Q[0],b+="m"+T[0],b}),x,e):void 0;return{selfElRef:t,waveElRef:r,mergedClsPrefix:h,mergedFocusable:s,mergedSize:a,showBorder:n,enterPressed:o,rtlEnabled:g,handleMousedown:l,handleKeydown:d,handleBlur:f,handleKeyup:u,handleClick:c,customColorCssVars:ae(()=>{const{color:b}=e;if(!b)return null;const w=mo(b);return{"--n-border-color":b,"--n-border-color-hover":w,"--n-border-color-pressed":ji(b),"--n-border-color-focus":w,"--n-border-color-disabled":b}}),cssVars:p?void 0:x,themeClass:C==null?void 0:C.themeClass,onRender:C==null?void 0:C.onRender}},render(){const{mergedClsPrefix:e,tag:t,onRender:r}=this;r==null||r();const o=Jt(this.$slots.default,n=>n&&H("span",{class:`${e}-button__content`},n));return H(t,{ref:"selfElRef",class:[this.themeClass,`${e}-button`,`${e}-button--${this.type}-type`,`${e}-button--${this.mergedSize}-type`,this.rtlEnabled&&`${e}-button--rtl`,this.disabled&&`${e}-button--disabled`,this.block&&`${e}-button--block`,this.enterPressed&&`${e}-button--pressed`,!this.text&&this.dashed&&`${e}-button--dashed`,this.color&&`${e}-button--color`,this.secondary&&`${e}-button--secondary`,this.loading&&`${e}-button--loading`,this.ghost&&`${e}-button--ghost`],tabindex:this.mergedFocusable?0:-1,type:this.attrType,style:this.cssVars,disabled:this.disabled,onClick:this.handleClick,onBlur:this.handleBlur,onMousedown:this.handleMousedown,onKeyup:this.handleKeyup,onKeydown:this.handleKeydown},this.iconPlacement==="right"&&o,H(Km,{width:!0},{default:()=>Jt(this.$slots.icon,n=>(this.loading||this.renderIcon||n)&&H("span",{class:`${e}-button__icon`,style:{margin:wC(this.$slots.default)?"0":""}},H(mu,null,{default:()=>this.loading?H(Zm,{clsPrefix:e,key:"loading",class:`${e}-icon-slot`,strokeWidth:20}):H("div",{key:"icon",class:`${e}-icon-slot`,role:"none"},this.renderIcon?this.renderIcon():n)})))}),this.iconPlacement==="left"&&o,this.text?null:H(Z3,{ref:"waveElRef",clsPrefix:e}),this.showBorder?H("div",{"aria-hidden":!0,class:`${e}-button__border`,style:this.customColorCssVars}):null,this.showBorder?H("div",{"aria-hidden":!0,class:`${e}-button__state-border`,style:this.customColorCssVars}):null)}}),Fd=t_,r_={titleFontSize:"22px"},bg=e=>{const{borderRadius:t,fontSize:r,lineHeight:o,textColor2:n,textColor1:i,textColorDisabled:a,dividerColor:s,fontWeightStrong:l,primaryColor:c,baseColor:u,hoverColor:d,cardColor:f,modalColor:p,popoverColor:h}=e;return Object.assign(Object.assign({},r_),{borderRadius:t,borderColor:me(f,s),borderColorModal:me(p,s),borderColorPopover:me(h,s),textColor:n,titleFontWeight:l,titleTextColor:i,dayTextColor:a,fontSize:r,lineHeight:o,dateColorCurrent:c,dateTextColorCurrent:u,cellColorHover:me(f,d),cellColorHoverModal:me(p,d),cellColorHoverPopover:me(h,d),cellColor:f,cellColorModal:p,cellColorPopover:h,barColor:c})},o_={name:"Calendar",common:le,peers:{Button:It},self:bg},n_=o_,i_={name:"Calendar",common:se,peers:{Button:Dt},self:bg},a_=i_,Cg=e=>{const{fontSize:t,boxShadow2:r,popoverColor:o,textColor2:n,borderRadius:i,borderColor:a,heightSmall:s,heightMedium:l,heightLarge:c,fontSizeSmall:u,fontSizeMedium:d,fontSizeLarge:f,dividerColor:p}=e;return{panelFontSize:t,boxShadow:r,color:o,textColor:n,borderRadius:i,border:`1px solid ${a}`,heightSmall:s,heightMedium:l,heightLarge:c,fontSizeSmall:u,fontSizeMedium:d,fontSizeLarge:f,dividerColor:p}},s_={name:"ColorPicker",common:le,peers:{Input:Yt,Button:It},self:Cg},l_=s_,c_={name:"ColorPicker",common:se,peers:{Input:Xt,Button:Dt},self:Cg},u_=c_,d_={paddingSmall:"12px 16px 12px",paddingMedium:"19px 24px 20px",paddingLarge:"23px 32px 24px",paddingHuge:"27px 40px 28px",titleFontSizeSmall:"16px",titleFontSizeMedium:"18px",titleFontSizeLarge:"18px",titleFontSizeHuge:"18px",closeIconSize:"18px",closeSize:"22px"},yg=e=>{const{primaryColor:t,borderRadius:r,lineHeight:o,fontSize:n,cardColor:i,textColor2:a,textColor1:s,dividerColor:l,fontWeightStrong:c,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:f,closeColorHover:p,closeColorPressed:h,modalColor:m,boxShadow1:v,popoverColor:g,actionColor:x}=e;return Object.assign(Object.assign({},d_),{lineHeight:o,color:i,colorModal:m,colorPopover:g,colorTarget:t,colorEmbedded:x,colorEmbeddedModal:x,colorEmbeddedPopover:x,textColor:a,titleTextColor:s,borderColor:l,actionColor:x,titleFontWeight:c,closeColorHover:p,closeColorPressed:h,closeBorderRadius:r,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:f,fontSizeSmall:n,fontSizeMedium:n,fontSizeLarge:n,fontSizeHuge:n,boxShadow:v,borderRadius:r})},f_={name:"Card",common:le,self:yg},bu=f_,h_={name:"Card",common:se,self(e){const t=yg(e),{cardColor:r,modalColor:o,popoverColor:n}=e;return t.colorEmbedded=r,t.colorEmbeddedModal=o,t.colorEmbeddedPopover=n,t}},Sg=h_,p_=ne([Se("card",` - font-size: var(--n-font-size); - line-height: var(--n-line-height); - display: flex; - flex-direction: column; - width: 100%; - box-sizing: border-box; - position: relative; - border-radius: var(--n-border-radius); - background-color: var(--n-color); - color: var(--n-text-color); - word-break: break-word; - transition: - color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - border-color .3s var(--n-bezier); - `,[om({background:"var(--n-color-modal)"}),Ce("hoverable",[ne("&:hover","box-shadow: var(--n-box-shadow);")]),Ce("content-segmented",[ne(">",[he("content",{paddingTop:"var(--n-padding-bottom)"})])]),Ce("content-soft-segmented",[ne(">",[he("content",` - margin: 0 var(--n-padding-left); - padding: var(--n-padding-bottom) 0; - `)])]),Ce("footer-segmented",[ne(">",[he("footer",{paddingTop:"var(--n-padding-bottom)"})])]),Ce("footer-soft-segmented",[ne(">",[he("footer",` - padding: var(--n-padding-bottom) 0; - margin: 0 var(--n-padding-left); - `)])]),ne(">",[Se("card-header",` - box-sizing: border-box; - display: flex; - align-items: center; - font-size: var(--n-title-font-size); - padding: - var(--n-padding-top) - var(--n-padding-left) - var(--n-padding-bottom) - var(--n-padding-left); - `,[he("main",` - font-weight: var(--n-title-font-weight); - transition: color .3s var(--n-bezier); - flex: 1; - min-width: 0; - color: var(--n-title-text-color); - `),he("extra",` - display: flex; - align-items: center; - font-size: var(--n-font-size); - font-weight: 400; - transition: color .3s var(--n-bezier); - color: var(--n-text-color); - `),he("close",` - margin: 0 0 0 8px; - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - `)]),he("action",` - box-sizing: border-box; - transition: - background-color .3s var(--n-bezier), - border-color .3s var(--n-bezier); - background-clip: padding-box; - background-color: var(--n-action-color); - `),he("content","flex: 1; min-width: 0;"),he("content, footer",` - box-sizing: border-box; - padding: 0 var(--n-padding-left) var(--n-padding-bottom) var(--n-padding-left); - font-size: var(--n-font-size); - `,[ne("&:first-child",{paddingTop:"var(--n-padding-bottom)"})]),he("action",` - background-color: var(--n-action-color); - padding: var(--n-padding-bottom) var(--n-padding-left); - border-bottom-left-radius: var(--n-border-radius); - border-bottom-right-radius: var(--n-border-radius); - `)]),Se("card-cover",` - overflow: hidden; - width: 100%; - border-radius: var(--n-border-radius) var(--n-border-radius) 0 0; - `,[ne("img",` - display: block; - width: 100%; - `)]),Ce("bordered",` - border: 1px solid var(--n-border-color); - `,[ne("&:target","border-color: var(--n-color-target);")]),Ce("action-segmented",[ne(">",[he("action",[ne("&:not(:first-child)",{borderTop:"1px solid var(--n-border-color)"})])])]),Ce("content-segmented, content-soft-segmented",[ne(">",[he("content",{transition:"border-color 0.3s var(--n-bezier)"},[ne("&:not(:first-child)",{borderTop:"1px solid var(--n-border-color)"})])])]),Ce("footer-segmented, footer-soft-segmented",[ne(">",[he("footer",{transition:"border-color 0.3s var(--n-bezier)"},[ne("&:not(:first-child)",{borderTop:"1px solid var(--n-border-color)"})])])]),Ce("embedded",` - background-color: var(--n-color-embedded); - `)]),rm(Se("card",` - background: var(--n-color-modal); - `,[Ce("embedded",` - background-color: var(--n-color-embedded-modal); - `)])),VC(Se("card",` - background: var(--n-color-popover); - `,[Ce("embedded",` - background-color: var(--n-color-embedded-popover); - `)]))]),Cu={title:String,contentClass:String,contentStyle:[Object,String],headerClass:String,headerStyle:[Object,String],headerExtraClass:String,headerExtraStyle:[Object,String],footerClass:String,footerStyle:[Object,String],embedded:Boolean,segmented:{type:[Boolean,Object],default:!1},size:{type:String,default:"medium"},bordered:{type:Boolean,default:!0},closable:Boolean,hoverable:Boolean,role:String,onClose:[Function,Array],tag:{type:String,default:"div"}},m_=_s(Cu),g_=Object.assign(Object.assign({},Ct.props),Cu),x_=Oe({name:"Card",props:g_,setup(e){const t=()=>{const{onClose:c}=e;c&&_o(c)},{inlineThemeDisabled:r,mergedClsPrefixRef:o,mergedRtlRef:n}=sr(e),i=Ct("Card","-card",p_,bu,e,o),a=yi("Card",n,o),s=ae(()=>{const{size:c}=e,{self:{color:u,colorModal:d,colorTarget:f,textColor:p,titleTextColor:h,titleFontWeight:m,borderColor:v,actionColor:g,borderRadius:x,lineHeight:C,closeIconColor:b,closeIconColorHover:w,closeIconColorPressed:T,closeColorHover:S,closeColorPressed:E,closeBorderRadius:I,closeIconSize:P,closeSize:$,boxShadow:R,colorPopover:B,colorEmbedded:j,colorEmbeddedModal:Y,colorEmbeddedPopover:J,[_e("padding",c)]:Q,[_e("fontSize",c)]:ie,[_e("titleFontSize",c)]:ge},common:{cubicBezierEaseInOut:ve}}=i.value,{top:z,left:W,bottom:Z}=Zp(Q);return{"--n-bezier":ve,"--n-border-radius":x,"--n-color":u,"--n-color-modal":d,"--n-color-popover":B,"--n-color-embedded":j,"--n-color-embedded-modal":Y,"--n-color-embedded-popover":J,"--n-color-target":f,"--n-text-color":p,"--n-line-height":C,"--n-action-color":g,"--n-title-text-color":h,"--n-title-font-weight":m,"--n-close-icon-color":b,"--n-close-icon-color-hover":w,"--n-close-icon-color-pressed":T,"--n-close-color-hover":S,"--n-close-color-pressed":E,"--n-border-color":v,"--n-box-shadow":R,"--n-padding-top":z,"--n-padding-bottom":Z,"--n-padding-left":W,"--n-font-size":ie,"--n-title-font-size":ge,"--n-close-size":$,"--n-close-icon-size":P,"--n-close-border-radius":I}}),l=r?so("card",ae(()=>e.size[0]),s,e):void 0;return{rtlEnabled:a,mergedClsPrefix:o,mergedTheme:i,handleCloseClick:t,cssVars:r?void 0:s,themeClass:l==null?void 0:l.themeClass,onRender:l==null?void 0:l.onRender}},render(){const{footerStyle:e,headerExtraClass:t,headerClass:r,contentClass:o,segmented:n,bordered:i,hoverable:a,mergedClsPrefix:s,rtlEnabled:l,onRender:c,embedded:u,tag:d,$slots:f}=this;return c==null||c(),H(d,{class:[`${s}-card`,this.themeClass,u&&`${s}-card--embedded`,{[`${s}-card--rtl`]:l,[`${s}-card--content${typeof n!="boolean"&&n.content==="soft"?"-soft":""}-segmented`]:n===!0||n!==!1&&n.content,[`${s}-card--footer${typeof n!="boolean"&&n.footer==="soft"?"-soft":""}-segmented`]:n===!0||n!==!1&&n.footer,[`${s}-card--action-segmented`]:n===!0||n!==!1&&n.action,[`${s}-card--bordered`]:i,[`${s}-card--hoverable`]:a}],style:this.cssVars,role:this.role},Jt(f.cover,p=>p&&H("div",{class:`${s}-card-cover`,role:"none"},p)),Jt(f.header,p=>p||this.title||this.closable?H("div",{class:[`${s}-card-header`,r],style:this.headerStyle},H("div",{class:`${s}-card-header__main`,role:"heading"},p||this.title),Jt(f["header-extra"],h=>h&&H("div",{class:[`${s}-card-header__extra`,t],style:this.headerExtraStyle},h)),this.closable?H(Rs,{clsPrefix:s,class:`${s}-card-header__close`,onClick:this.handleCloseClick,absolute:!0}):null):null),Jt(f.default,p=>p&&H("div",{class:[`${s}-card__content`,o],style:this.contentStyle,role:"none"},p)),Jt(f.footer,p=>p&&[H("div",{class:[`${s}-card__footer`,e],style:this.footerStyle,role:"none"},p)]),Jt(f.action,p=>p&&H("div",{class:`${s}-card__action`,role:"none"},p)))}}),wg=e=>({dotSize:"8px",dotColor:"rgba(255, 255, 255, .3)",dotColorActive:"rgba(255, 255, 255, 1)",dotColorFocus:"rgba(255, 255, 255, .5)",dotLineWidth:"16px",dotLineWidthActive:"24px",arrowColor:"#eee"}),v_={name:"Carousel",common:le,self:wg},b_=v_,C_={name:"Carousel",common:se,self:wg},y_=C_,S_={sizeSmall:"14px",sizeMedium:"16px",sizeLarge:"18px",labelPadding:"0 8px",labelFontWeight:"400"},_g=e=>{const{baseColor:t,inputColorDisabled:r,cardColor:o,modalColor:n,popoverColor:i,textColorDisabled:a,borderColor:s,primaryColor:l,textColor2:c,fontSizeSmall:u,fontSizeMedium:d,fontSizeLarge:f,borderRadiusSmall:p,lineHeight:h}=e;return Object.assign(Object.assign({},S_),{labelLineHeight:h,fontSizeSmall:u,fontSizeMedium:d,fontSizeLarge:f,borderRadius:p,color:t,colorChecked:l,colorDisabled:r,colorDisabledChecked:r,colorTableHeader:o,colorTableHeaderModal:n,colorTableHeaderPopover:i,checkMarkColor:t,checkMarkColorDisabled:a,checkMarkColorDisabledChecked:a,border:`1px solid ${s}`,borderDisabled:`1px solid ${s}`,borderDisabledChecked:`1px solid ${s}`,borderChecked:`1px solid ${l}`,borderFocus:`1px solid ${l}`,boxShadowFocus:`0 0 0 2px ${G(l,{alpha:.3})}`,textColor:c,textColorDisabled:a})},w_={name:"Checkbox",common:le,self:_g},gn=w_,__={name:"Checkbox",common:se,self(e){const{cardColor:t}=e,r=_g(e);return r.color="#0000",r.checkMarkColor=t,r}},xn=__,Tg=e=>{const{borderRadius:t,boxShadow2:r,popoverColor:o,textColor2:n,textColor3:i,primaryColor:a,textColorDisabled:s,dividerColor:l,hoverColor:c,fontSizeMedium:u,heightMedium:d}=e;return{menuBorderRadius:t,menuColor:o,menuBoxShadow:r,menuDividerColor:l,menuHeight:"calc(var(--n-option-height) * 6.6)",optionArrowColor:i,optionHeight:d,optionFontSize:u,optionColorHover:c,optionTextColor:n,optionTextColorActive:a,optionTextColorDisabled:s,optionCheckMarkColor:a,loadingColor:a,columnWidth:"180px"}},T_={name:"Cascader",common:le,peers:{InternalSelectMenu:wi,InternalSelection:xu,Scrollbar:$t,Checkbox:gn,Empty:Dr},self:Tg},E_=T_,P_={name:"Cascader",common:se,peers:{InternalSelectMenu:_i,InternalSelection:vu,Scrollbar:Mt,Checkbox:xn,Empty:Dr},self:Tg},k_=P_,L_={name:"Code",common:se,self(e){const{textColor2:t,fontSize:r,fontWeightStrong:o,textColor3:n}=e;return{textColor:t,fontSize:r,fontWeightStrong:o,"mono-3":"#5c6370","hue-1":"#56b6c2","hue-2":"#61aeee","hue-3":"#c678dd","hue-4":"#98c379","hue-5":"#e06c75","hue-5-2":"#be5046","hue-6":"#d19a66","hue-6-2":"#e6c07b",lineNumberTextColor:n}}},Eg=L_,$_=e=>{const{textColor2:t,fontSize:r,fontWeightStrong:o,textColor3:n}=e;return{textColor:t,fontSize:r,fontWeightStrong:o,"mono-3":"#a0a1a7","hue-1":"#0184bb","hue-2":"#4078f2","hue-3":"#a626a4","hue-4":"#50a14f","hue-5":"#e45649","hue-5-2":"#c91243","hue-6":"#986801","hue-6-2":"#c18401",lineNumberTextColor:n}},I_={name:"Code",common:le,self:$_},Pg=I_,kg=e=>{const{fontWeight:t,textColor1:r,textColor2:o,textColorDisabled:n,dividerColor:i,fontSize:a}=e;return{titleFontSize:a,titleFontWeight:t,dividerColor:i,titleTextColor:r,titleTextColorDisabled:n,fontSize:a,textColor:o,arrowColor:o,arrowColorDisabled:n,itemMargin:"16px 0 0 0",titlePadding:"16px 0 0 0"}},R_={name:"Collapse",common:le,self:kg},A_=R_,O_={name:"Collapse",common:se,self:kg},B_=O_,Lg=e=>{const{cubicBezierEaseInOut:t}=e;return{bezier:t}},H_={name:"CollapseTransition",common:le,self:Lg},M_=H_,D_={name:"CollapseTransition",common:se,self:Lg},F_=D_,z_={abstract:Boolean,bordered:{type:Boolean,default:void 0},clsPrefix:{type:String,default:ci},locale:Object,dateLocale:Object,namespace:String,rtl:Array,tag:{type:String,default:"div"},hljs:Object,katex:Object,theme:Object,themeOverrides:Object,componentOptions:Object,icons:Object,breakpoints:Object,preflightStyleDisabled:Boolean,inlineThemeDisabled:{type:Boolean,default:void 0},as:{type:String,validator:()=>(oi("config-provider","`as` is deprecated, please use `tag` instead."),!0),default:void 0}},$g=Oe({name:"ConfigProvider",alias:["App"],props:z_,setup(e){const t=Me(oo,null),r=ae(()=>{const{theme:h}=e;if(h===null)return;const m=t==null?void 0:t.mergedThemeRef.value;return h===void 0?m:m===void 0?h:Object.assign({},m,h)}),o=ae(()=>{const{themeOverrides:h}=e;if(h!==null){if(h===void 0)return t==null?void 0:t.mergedThemeOverridesRef.value;{const m=t==null?void 0:t.mergedThemeOverridesRef.value;return m===void 0?h:An({},m,h)}}}),n=jl(()=>{const{namespace:h}=e;return h===void 0?t==null?void 0:t.mergedNamespaceRef.value:h}),i=jl(()=>{const{bordered:h}=e;return h===void 0?t==null?void 0:t.mergedBorderedRef.value:h}),a=ae(()=>{const{icons:h}=e;return h===void 0?t==null?void 0:t.mergedIconsRef.value:h}),s=ae(()=>{const{componentOptions:h}=e;return h!==void 0?h:t==null?void 0:t.mergedComponentPropsRef.value}),l=ae(()=>{const{clsPrefix:h}=e;return h!==void 0?h:t?t.mergedClsPrefixRef.value:ci}),c=ae(()=>{var h;const{rtl:m}=e;if(m===void 0)return t==null?void 0:t.mergedRtlRef.value;const v={};for(const g of m)v[g.name]=to(g),(h=g.peers)===null||h===void 0||h.forEach(x=>{x.name in v||(v[x.name]=to(x))});return v}),u=ae(()=>e.breakpoints||(t==null?void 0:t.mergedBreakpointsRef.value)),d=e.inlineThemeDisabled||(t==null?void 0:t.inlineThemeDisabled),f=e.preflightStyleDisabled||(t==null?void 0:t.preflightStyleDisabled),p=ae(()=>{const{value:h}=r,{value:m}=o,v=m&&Object.keys(m).length!==0,g=h==null?void 0:h.name;return g?v?`${g}-${ni(JSON.stringify(o.value))}`:g:v?ni(JSON.stringify(o.value)):""});return dt(oo,{mergedThemeHashRef:p,mergedBreakpointsRef:u,mergedRtlRef:c,mergedIconsRef:a,mergedComponentPropsRef:s,mergedBorderedRef:i,mergedNamespaceRef:n,mergedClsPrefixRef:l,mergedLocaleRef:ae(()=>{const{locale:h}=e;if(h!==null)return h===void 0?t==null?void 0:t.mergedLocaleRef.value:h}),mergedDateLocaleRef:ae(()=>{const{dateLocale:h}=e;if(h!==null)return h===void 0?t==null?void 0:t.mergedDateLocaleRef.value:h}),mergedHljsRef:ae(()=>{const{hljs:h}=e;return h===void 0?t==null?void 0:t.mergedHljsRef.value:h}),mergedKatexRef:ae(()=>{const{katex:h}=e;return h===void 0?t==null?void 0:t.mergedKatexRef.value:h}),mergedThemeRef:r,mergedThemeOverridesRef:o,inlineThemeDisabled:d||!1,preflightStyleDisabled:f||!1}),{mergedClsPrefix:l,mergedBordered:i,mergedNamespace:n,mergedTheme:r,mergedThemeOverrides:o}},render(){var e,t,r,o;return this.abstract?(o=(r=this.$slots).default)===null||o===void 0?void 0:o.call(r):H(this.as||this.tag,{class:`${this.mergedClsPrefix||ci}-config-provider`},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e))}}),N_={name:"Popselect",common:se,peers:{Popover:Mo,InternalSelectMenu:_i}},Ig=N_;function W_(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}const j_={name:"Popselect",common:le,peers:{Popover:Ho,InternalSelectMenu:wi},self:W_},Rg=j_;function Ag(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}const U_={name:"Select",common:le,peers:{InternalSelection:xu,InternalSelectMenu:wi},self:Ag},Og=U_,V_={name:"Select",common:se,peers:{InternalSelection:vu,InternalSelectMenu:_i},self:Ag},Bg=V_,q_={itemPaddingSmall:"0 4px",itemMarginSmall:"0 0 0 8px",itemMarginSmallRtl:"0 8px 0 0",itemPaddingMedium:"0 4px",itemMarginMedium:"0 0 0 8px",itemMarginMediumRtl:"0 8px 0 0",itemPaddingLarge:"0 4px",itemMarginLarge:"0 0 0 8px",itemMarginLargeRtl:"0 8px 0 0",buttonIconSizeSmall:"14px",buttonIconSizeMedium:"16px",buttonIconSizeLarge:"18px",inputWidthSmall:"60px",selectWidthSmall:"unset",inputMarginSmall:"0 0 0 8px",inputMarginSmallRtl:"0 8px 0 0",selectMarginSmall:"0 0 0 8px",prefixMarginSmall:"0 8px 0 0",suffixMarginSmall:"0 0 0 8px",inputWidthMedium:"60px",selectWidthMedium:"unset",inputMarginMedium:"0 0 0 8px",inputMarginMediumRtl:"0 8px 0 0",selectMarginMedium:"0 0 0 8px",prefixMarginMedium:"0 8px 0 0",suffixMarginMedium:"0 0 0 8px",inputWidthLarge:"60px",selectWidthLarge:"unset",inputMarginLarge:"0 0 0 8px",inputMarginLargeRtl:"0 8px 0 0",selectMarginLarge:"0 0 0 8px",prefixMarginLarge:"0 8px 0 0",suffixMarginLarge:"0 0 0 8px"},Hg=e=>{const{textColor2:t,primaryColor:r,primaryColorHover:o,primaryColorPressed:n,inputColorDisabled:i,textColorDisabled:a,borderColor:s,borderRadius:l,fontSizeTiny:c,fontSizeSmall:u,fontSizeMedium:d,heightTiny:f,heightSmall:p,heightMedium:h}=e;return Object.assign(Object.assign({},q_),{buttonColor:"#0000",buttonColorHover:"#0000",buttonColorPressed:"#0000",buttonBorder:`1px solid ${s}`,buttonBorderHover:`1px solid ${s}`,buttonBorderPressed:`1px solid ${s}`,buttonIconColor:t,buttonIconColorHover:t,buttonIconColorPressed:t,itemTextColor:t,itemTextColorHover:o,itemTextColorPressed:n,itemTextColorActive:r,itemTextColorDisabled:a,itemColor:"#0000",itemColorHover:"#0000",itemColorPressed:"#0000",itemColorActive:"#0000",itemColorActiveHover:"#0000",itemColorDisabled:i,itemBorder:"1px solid #0000",itemBorderHover:"1px solid #0000",itemBorderPressed:"1px solid #0000",itemBorderActive:`1px solid ${r}`,itemBorderDisabled:`1px solid ${s}`,itemBorderRadius:l,itemSizeSmall:f,itemSizeMedium:p,itemSizeLarge:h,itemFontSizeSmall:c,itemFontSizeMedium:u,itemFontSizeLarge:d,jumperFontSizeSmall:c,jumperFontSizeMedium:u,jumperFontSizeLarge:d,jumperTextColor:t,jumperTextColorDisabled:a})},G_={name:"Pagination",common:le,peers:{Select:Og,Input:Yt,Popselect:Rg},self:Hg},Mg=G_,K_={name:"Pagination",common:se,peers:{Select:Bg,Input:Xt,Popselect:Ig},self(e){const{primaryColor:t,opacity3:r}=e,o=G(t,{alpha:Number(r)}),n=Hg(e);return n.itemBorderActive=`1px solid ${o}`,n.itemBorderDisabled="1px solid #0000",n}},Dg=K_,Fg={padding:"8px 14px"},Z_={name:"Tooltip",common:se,peers:{Popover:Mo},self(e){const{borderRadius:t,boxShadow2:r,popoverColor:o,textColor2:n}=e;return Object.assign(Object.assign({},Fg),{borderRadius:t,boxShadow:r,color:o,textColor:n})}},As=Z_,X_=e=>{const{borderRadius:t,boxShadow2:r,baseColor:o}=e;return Object.assign(Object.assign({},Fg),{borderRadius:t,boxShadow:r,color:me(o,"rgba(0, 0, 0, .85)"),textColor:o})},Y_={name:"Tooltip",common:le,peers:{Popover:Ho},self:X_},Os=Y_,Q_={name:"Ellipsis",common:se,peers:{Tooltip:As}},zg=Q_,J_={name:"Ellipsis",common:le,peers:{Tooltip:Os}},Ng=J_,Wg={radioSizeSmall:"14px",radioSizeMedium:"16px",radioSizeLarge:"18px",labelPadding:"0 8px",labelFontWeight:"400"},e5={name:"Radio",common:se,self(e){const{borderColor:t,primaryColor:r,baseColor:o,textColorDisabled:n,inputColorDisabled:i,textColor2:a,opacityDisabled:s,borderRadius:l,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:d,heightSmall:f,heightMedium:p,heightLarge:h,lineHeight:m}=e;return Object.assign(Object.assign({},Wg),{labelLineHeight:m,buttonHeightSmall:f,buttonHeightMedium:p,buttonHeightLarge:h,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:d,boxShadow:`inset 0 0 0 1px ${t}`,boxShadowActive:`inset 0 0 0 1px ${r}`,boxShadowFocus:`inset 0 0 0 1px ${r}, 0 0 0 2px ${G(r,{alpha:.3})}`,boxShadowHover:`inset 0 0 0 1px ${r}`,boxShadowDisabled:`inset 0 0 0 1px ${t}`,color:"#0000",colorDisabled:i,colorActive:"#0000",textColor:a,textColorDisabled:n,dotColorActive:r,dotColorDisabled:t,buttonBorderColor:t,buttonBorderColorActive:r,buttonBorderColorHover:r,buttonColor:"#0000",buttonColorActive:r,buttonTextColor:a,buttonTextColorActive:o,buttonTextColorHover:r,opacityDisabled:s,buttonBoxShadowFocus:`inset 0 0 0 1px ${r}, 0 0 0 2px ${G(r,{alpha:.3})}`,buttonBoxShadowHover:`inset 0 0 0 1px ${r}`,buttonBoxShadow:"inset 0 0 0 1px #0000",buttonBorderRadius:l})}},jg=e5,t5=e=>{const{borderColor:t,primaryColor:r,baseColor:o,textColorDisabled:n,inputColorDisabled:i,textColor2:a,opacityDisabled:s,borderRadius:l,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:d,heightSmall:f,heightMedium:p,heightLarge:h,lineHeight:m}=e;return Object.assign(Object.assign({},Wg),{labelLineHeight:m,buttonHeightSmall:f,buttonHeightMedium:p,buttonHeightLarge:h,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:d,boxShadow:`inset 0 0 0 1px ${t}`,boxShadowActive:`inset 0 0 0 1px ${r}`,boxShadowFocus:`inset 0 0 0 1px ${r}, 0 0 0 2px ${G(r,{alpha:.2})}`,boxShadowHover:`inset 0 0 0 1px ${r}`,boxShadowDisabled:`inset 0 0 0 1px ${t}`,color:o,colorDisabled:i,colorActive:"#0000",textColor:a,textColorDisabled:n,dotColorActive:r,dotColorDisabled:t,buttonBorderColor:t,buttonBorderColorActive:r,buttonBorderColorHover:t,buttonColor:o,buttonColorActive:o,buttonTextColor:a,buttonTextColorActive:r,buttonTextColorHover:r,opacityDisabled:s,buttonBoxShadowFocus:`inset 0 0 0 1px ${r}, 0 0 0 2px ${G(r,{alpha:.3})}`,buttonBoxShadowHover:"inset 0 0 0 1px #0000",buttonBoxShadow:"inset 0 0 0 1px #0000",buttonBorderRadius:l})},r5={name:"Radio",common:le,self:t5},Ug=r5,o5={padding:"4px 0",optionIconSizeSmall:"14px",optionIconSizeMedium:"16px",optionIconSizeLarge:"16px",optionIconSizeHuge:"18px",optionSuffixWidthSmall:"14px",optionSuffixWidthMedium:"14px",optionSuffixWidthLarge:"16px",optionSuffixWidthHuge:"16px",optionIconSuffixWidthSmall:"32px",optionIconSuffixWidthMedium:"32px",optionIconSuffixWidthLarge:"36px",optionIconSuffixWidthHuge:"36px",optionPrefixWidthSmall:"14px",optionPrefixWidthMedium:"14px",optionPrefixWidthLarge:"16px",optionPrefixWidthHuge:"16px",optionIconPrefixWidthSmall:"36px",optionIconPrefixWidthMedium:"36px",optionIconPrefixWidthLarge:"40px",optionIconPrefixWidthHuge:"40px"},Vg=e=>{const{primaryColor:t,textColor2:r,dividerColor:o,hoverColor:n,popoverColor:i,invertedColor:a,borderRadius:s,fontSizeSmall:l,fontSizeMedium:c,fontSizeLarge:u,fontSizeHuge:d,heightSmall:f,heightMedium:p,heightLarge:h,heightHuge:m,textColor3:v,opacityDisabled:g}=e;return Object.assign(Object.assign({},o5),{optionHeightSmall:f,optionHeightMedium:p,optionHeightLarge:h,optionHeightHuge:m,borderRadius:s,fontSizeSmall:l,fontSizeMedium:c,fontSizeLarge:u,fontSizeHuge:d,optionTextColor:r,optionTextColorHover:r,optionTextColorActive:t,optionTextColorChildActive:t,color:i,dividerColor:o,suffixColor:r,prefixColor:r,optionColorHover:n,optionColorActive:G(t,{alpha:.1}),groupHeaderTextColor:v,optionTextColorInverted:"#BBB",optionTextColorHoverInverted:"#FFF",optionTextColorActiveInverted:"#FFF",optionTextColorChildActiveInverted:"#FFF",colorInverted:a,dividerColorInverted:"#BBB",suffixColorInverted:"#BBB",prefixColorInverted:"#BBB",optionColorHoverInverted:t,optionColorActiveInverted:t,groupHeaderTextColorInverted:"#AAA",optionOpacityDisabled:g})},n5={name:"Dropdown",common:le,peers:{Popover:Ho},self:Vg},yu=n5,i5={name:"Dropdown",common:se,peers:{Popover:Mo},self(e){const{primaryColorSuppl:t,primaryColor:r,popoverColor:o}=e,n=Vg(e);return n.colorInverted=o,n.optionColorActive=G(r,{alpha:.15}),n.optionColorActiveInverted=t,n.optionColorHoverInverted=t,n}},Su=i5,a5={thPaddingSmall:"8px",thPaddingMedium:"12px",thPaddingLarge:"12px",tdPaddingSmall:"8px",tdPaddingMedium:"12px",tdPaddingLarge:"12px",sorterSize:"15px",resizableContainerSize:"8px",resizableSize:"2px",filterSize:"15px",paginationMargin:"12px 0 0 0",emptyPadding:"48px 0",actionPadding:"8px 12px",actionButtonMargin:"0 8px 0 0"},qg=e=>{const{cardColor:t,modalColor:r,popoverColor:o,textColor2:n,textColor1:i,tableHeaderColor:a,tableColorHover:s,iconColor:l,primaryColor:c,fontWeightStrong:u,borderRadius:d,lineHeight:f,fontSizeSmall:p,fontSizeMedium:h,fontSizeLarge:m,dividerColor:v,heightSmall:g,opacityDisabled:x,tableColorStriped:C}=e;return Object.assign(Object.assign({},a5),{actionDividerColor:v,lineHeight:f,borderRadius:d,fontSizeSmall:p,fontSizeMedium:h,fontSizeLarge:m,borderColor:me(t,v),tdColorHover:me(t,s),tdColorStriped:me(t,C),thColor:me(t,a),thColorHover:me(me(t,a),s),tdColor:t,tdTextColor:n,thTextColor:i,thFontWeight:u,thButtonColorHover:s,thIconColor:l,thIconColorActive:c,borderColorModal:me(r,v),tdColorHoverModal:me(r,s),tdColorStripedModal:me(r,C),thColorModal:me(r,a),thColorHoverModal:me(me(r,a),s),tdColorModal:r,borderColorPopover:me(o,v),tdColorHoverPopover:me(o,s),tdColorStripedPopover:me(o,C),thColorPopover:me(o,a),thColorHoverPopover:me(me(o,a),s),tdColorPopover:o,boxShadowBefore:"inset -12px 0 8px -12px rgba(0, 0, 0, .18)",boxShadowAfter:"inset 12px 0 8px -12px rgba(0, 0, 0, .18)",loadingColor:c,loadingSize:g,opacityLoading:x})},s5={name:"DataTable",common:le,peers:{Button:It,Checkbox:gn,Radio:Ug,Pagination:Mg,Scrollbar:$t,Empty:Dr,Popover:Ho,Ellipsis:Ng,Dropdown:yu},self:qg},l5=s5,c5={name:"DataTable",common:se,peers:{Button:Dt,Checkbox:xn,Radio:jg,Pagination:Dg,Scrollbar:Mt,Empty:Bo,Popover:Mo,Ellipsis:zg,Dropdown:Su},self(e){const t=qg(e);return t.boxShadowAfter="inset 12px 0 8px -12px rgba(0, 0, 0, .36)",t.boxShadowBefore="inset -12px 0 8px -12px rgba(0, 0, 0, .36)",t}},u5=c5,Gg=e=>{const{textColorBase:t,opacity1:r,opacity2:o,opacity3:n,opacity4:i,opacity5:a}=e;return{color:t,opacity1Depth:r,opacity2Depth:o,opacity3Depth:n,opacity4Depth:i,opacity5Depth:a}},d5={name:"Icon",common:le,self:Gg},f5=d5,h5={name:"Icon",common:se,self:Gg},p5=h5,m5={itemFontSize:"12px",itemHeight:"36px",itemWidth:"52px",panelActionPadding:"8px 0"},Kg=e=>{const{popoverColor:t,textColor2:r,primaryColor:o,hoverColor:n,dividerColor:i,opacityDisabled:a,boxShadow2:s,borderRadius:l,iconColor:c,iconColorDisabled:u}=e;return Object.assign(Object.assign({},m5),{panelColor:t,panelBoxShadow:s,panelDividerColor:i,itemTextColor:r,itemTextColorActive:o,itemColorHover:n,itemOpacityDisabled:a,itemBorderRadius:l,borderRadius:l,iconColor:c,iconColorDisabled:u})},g5={name:"TimePicker",common:le,peers:{Scrollbar:$t,Button:It,Input:Yt},self:Kg},Zg=g5,x5={name:"TimePicker",common:se,peers:{Scrollbar:Mt,Button:Dt,Input:Xt},self:Kg},Xg=x5,v5={itemSize:"24px",itemCellWidth:"38px",itemCellHeight:"32px",scrollItemWidth:"80px",scrollItemHeight:"40px",panelExtraFooterPadding:"8px 12px",panelActionPadding:"8px 12px",calendarTitlePadding:"0",calendarTitleHeight:"28px",arrowSize:"14px",panelHeaderPadding:"8px 12px",calendarDaysHeight:"32px",calendarTitleGridTempateColumns:"28px 28px 1fr 28px 28px",calendarLeftPaddingDate:"6px 12px 4px 12px",calendarLeftPaddingDatetime:"4px 12px",calendarLeftPaddingDaterange:"6px 12px 4px 12px",calendarLeftPaddingDatetimerange:"4px 12px",calendarLeftPaddingMonth:"0",calendarLeftPaddingYear:"0",calendarLeftPaddingQuarter:"0",calendarLeftPaddingMonthrange:"0",calendarLeftPaddingQuarterrange:"0",calendarLeftPaddingYearrange:"0",calendarRightPaddingDate:"6px 12px 4px 12px",calendarRightPaddingDatetime:"4px 12px",calendarRightPaddingDaterange:"6px 12px 4px 12px",calendarRightPaddingDatetimerange:"4px 12px",calendarRightPaddingMonth:"0",calendarRightPaddingYear:"0",calendarRightPaddingQuarter:"0",calendarRightPaddingMonthrange:"0",calendarRightPaddingQuarterrange:"0",calendarRightPaddingYearrange:"0"},Yg=e=>{const{hoverColor:t,fontSize:r,textColor2:o,textColorDisabled:n,popoverColor:i,primaryColor:a,borderRadiusSmall:s,iconColor:l,iconColorDisabled:c,textColor1:u,dividerColor:d,boxShadow2:f,borderRadius:p,fontWeightStrong:h}=e;return Object.assign(Object.assign({},v5),{itemFontSize:r,calendarDaysFontSize:r,calendarTitleFontSize:r,itemTextColor:o,itemTextColorDisabled:n,itemTextColorActive:i,itemTextColorCurrent:a,itemColorIncluded:G(a,{alpha:.1}),itemColorHover:t,itemColorDisabled:t,itemColorActive:a,itemBorderRadius:s,panelColor:i,panelTextColor:o,arrowColor:l,calendarTitleTextColor:u,calendarTitleColorHover:t,calendarDaysTextColor:o,panelHeaderDividerColor:d,calendarDaysDividerColor:d,calendarDividerColor:d,panelActionDividerColor:d,panelBoxShadow:f,panelBorderRadius:p,calendarTitleFontWeight:h,scrollItemBorderRadius:p,iconColor:l,iconColorDisabled:c})},b5={name:"DatePicker",common:le,peers:{Input:Yt,Button:It,TimePicker:Zg,Scrollbar:$t},self:Yg},C5=b5,y5={name:"DatePicker",common:se,peers:{Input:Xt,Button:Dt,TimePicker:Xg,Scrollbar:Mt},self(e){const{popoverColor:t,hoverColor:r,primaryColor:o}=e,n=Yg(e);return n.itemColorDisabled=me(t,r),n.itemColorIncluded=G(o,{alpha:.15}),n.itemColorHover=me(t,r),n}},S5=y5;var Ae=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function w5(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function o(){if(this instanceof o){var n=[null];n.push.apply(n,arguments);var i=Function.bind.apply(t,n);return new i}return t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(r,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),r}const _5={thPaddingBorderedSmall:"8px 12px",thPaddingBorderedMedium:"12px 16px",thPaddingBorderedLarge:"16px 24px",thPaddingSmall:"0",thPaddingMedium:"0",thPaddingLarge:"0",tdPaddingBorderedSmall:"8px 12px",tdPaddingBorderedMedium:"12px 16px",tdPaddingBorderedLarge:"16px 24px",tdPaddingSmall:"0 0 8px 0",tdPaddingMedium:"0 0 12px 0",tdPaddingLarge:"0 0 16px 0"},Qg=e=>{const{tableHeaderColor:t,textColor2:r,textColor1:o,cardColor:n,modalColor:i,popoverColor:a,dividerColor:s,borderRadius:l,fontWeightStrong:c,lineHeight:u,fontSizeSmall:d,fontSizeMedium:f,fontSizeLarge:p}=e;return Object.assign(Object.assign({},_5),{lineHeight:u,fontSizeSmall:d,fontSizeMedium:f,fontSizeLarge:p,titleTextColor:o,thColor:me(n,t),thColorModal:me(i,t),thColorPopover:me(a,t),thTextColor:o,thFontWeight:c,tdTextColor:r,tdColor:n,tdColorModal:i,tdColorPopover:a,borderColor:me(n,s),borderColorModal:me(i,s),borderColorPopover:me(a,s),borderRadius:l})},T5={name:"Descriptions",common:le,self:Qg},E5=T5,P5={name:"Descriptions",common:se,self:Qg},k5=P5,L5={titleFontSize:"18px",padding:"16px 28px 20px 28px",iconSize:"28px",actionSpace:"12px",contentMargin:"8px 0 16px 0",iconMargin:"0 4px 0 0",iconMarginIconTop:"4px 0 8px 0",closeSize:"22px",closeIconSize:"18px",closeMargin:"20px 26px 0 0",closeMarginIconTop:"10px 16px 0 0"},Jg=e=>{const{textColor1:t,textColor2:r,modalColor:o,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeColorHover:s,closeColorPressed:l,infoColor:c,successColor:u,warningColor:d,errorColor:f,primaryColor:p,dividerColor:h,borderRadius:m,fontWeightStrong:v,lineHeight:g,fontSize:x}=e;return Object.assign(Object.assign({},L5),{fontSize:x,lineHeight:g,border:`1px solid ${h}`,titleTextColor:t,textColor:r,color:o,closeColorHover:s,closeColorPressed:l,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeBorderRadius:m,iconColor:p,iconColorInfo:c,iconColorSuccess:u,iconColorWarning:d,iconColorError:f,borderRadius:m,titleFontWeight:v})},$5={name:"Dialog",common:le,peers:{Button:It},self:Jg},wu=$5,I5={name:"Dialog",common:se,peers:{Button:Dt},self:Jg},e1=I5,Bs={icon:Function,type:{type:String,default:"default"},title:[String,Function],closable:{type:Boolean,default:!0},negativeText:String,positiveText:String,positiveButtonProps:Object,negativeButtonProps:Object,content:[String,Function],action:Function,showIcon:{type:Boolean,default:!0},loading:Boolean,bordered:Boolean,iconPlacement:String,onPositiveClick:Function,onNegativeClick:Function,onClose:Function},t1=_s(Bs),R5=ne([Se("dialog",` - word-break: break-word; - line-height: var(--n-line-height); - position: relative; - background: var(--n-color); - color: var(--n-text-color); - box-sizing: border-box; - margin: auto; - border-radius: var(--n-border-radius); - padding: var(--n-padding); - transition: - border-color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - `,[he("icon",{color:"var(--n-icon-color)"}),Ce("bordered",{border:"var(--n-border)"}),Ce("icon-top",[he("close",{margin:"var(--n-close-margin)"}),he("icon",{margin:"var(--n-icon-margin)"}),he("content",{textAlign:"center"}),he("title",{justifyContent:"center"}),he("action",{justifyContent:"center"})]),Ce("icon-left",[he("icon",{margin:"var(--n-icon-margin)"}),Ce("closable",[he("title",` - padding-right: calc(var(--n-close-size) + 6px); - `)])]),he("close",` - position: absolute; - right: 0; - top: 0; - margin: var(--n-close-margin); - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - z-index: 1; - `),he("content",` - font-size: var(--n-font-size); - margin: var(--n-content-margin); - position: relative; - word-break: break-word; - `,[Ce("last","margin-bottom: 0;")]),he("action",` - display: flex; - justify-content: flex-end; - `,[ne("> *:not(:last-child)",{marginRight:"var(--n-action-space)"})]),he("icon",{fontSize:"var(--n-icon-size)",transition:"color .3s var(--n-bezier)"}),he("title",` - transition: color .3s var(--n-bezier); - display: flex; - align-items: center; - font-size: var(--n-title-font-size); - font-weight: var(--n-title-font-weight); - color: var(--n-title-text-color); - `),Se("dialog-icon-container",{display:"flex",justifyContent:"center"})]),rm(Se("dialog",` - width: 446px; - max-width: calc(100vw - 32px); - `)),Se("dialog",[om(` - width: 446px; - max-width: calc(100vw - 32px); - `)])]),A5={default:()=>H(Ca,null),info:()=>H(Ca,null),success:()=>H(hu,null),warning:()=>H(pu,null),error:()=>H(fu,null)},r1=Oe({name:"Dialog",alias:["NimbusConfirmCard","Confirm"],props:Object.assign(Object.assign({},Ct.props),Bs),setup(e){const{mergedComponentPropsRef:t,mergedClsPrefixRef:r,inlineThemeDisabled:o}=sr(e),n=ae(()=>{var d,f;const{iconPlacement:p}=e;return p||((f=(d=t==null?void 0:t.value)===null||d===void 0?void 0:d.Dialog)===null||f===void 0?void 0:f.iconPlacement)||"left"});function i(d){const{onPositiveClick:f}=e;f&&f(d)}function a(d){const{onNegativeClick:f}=e;f&&f(d)}function s(){const{onClose:d}=e;d&&d()}const l=Ct("Dialog","-dialog",R5,wu,e,r),c=ae(()=>{const{type:d}=e,f=n.value,{common:{cubicBezierEaseInOut:p},self:{fontSize:h,lineHeight:m,border:v,titleTextColor:g,textColor:x,color:C,closeBorderRadius:b,closeColorHover:w,closeColorPressed:T,closeIconColor:S,closeIconColorHover:E,closeIconColorPressed:I,closeIconSize:P,borderRadius:$,titleFontWeight:R,titleFontSize:B,padding:j,iconSize:Y,actionSpace:J,contentMargin:Q,closeSize:ie,[f==="top"?"iconMarginIconTop":"iconMargin"]:ge,[f==="top"?"closeMarginIconTop":"closeMargin"]:ve,[_e("iconColor",d)]:z}}=l.value;return{"--n-font-size":h,"--n-icon-color":z,"--n-bezier":p,"--n-close-margin":ve,"--n-icon-margin":ge,"--n-icon-size":Y,"--n-close-size":ie,"--n-close-icon-size":P,"--n-close-border-radius":b,"--n-close-color-hover":w,"--n-close-color-pressed":T,"--n-close-icon-color":S,"--n-close-icon-color-hover":E,"--n-close-icon-color-pressed":I,"--n-color":C,"--n-text-color":x,"--n-border-radius":$,"--n-padding":j,"--n-line-height":m,"--n-border":v,"--n-content-margin":Q,"--n-title-font-size":B,"--n-title-font-weight":R,"--n-title-text-color":g,"--n-action-space":J}}),u=o?so("dialog",ae(()=>`${e.type[0]}${n.value[0]}`),c,e):void 0;return{mergedClsPrefix:r,mergedIconPlacement:n,mergedTheme:l,handlePositiveClick:i,handleNegativeClick:a,handleCloseClick:s,cssVars:o?void 0:c,themeClass:u==null?void 0:u.themeClass,onRender:u==null?void 0:u.onRender}},render(){var e;const{bordered:t,mergedIconPlacement:r,cssVars:o,closable:n,showIcon:i,title:a,content:s,action:l,negativeText:c,positiveText:u,positiveButtonProps:d,negativeButtonProps:f,handlePositiveClick:p,handleNegativeClick:h,mergedTheme:m,loading:v,type:g,mergedClsPrefix:x}=this;(e=this.onRender)===null||e===void 0||e.call(this);const C=i?H(Is,{clsPrefix:x,class:`${x}-dialog__icon`},{default:()=>Jt(this.$slots.icon,w=>w||(this.icon?Nt(this.icon):A5[this.type]()))}):null,b=Jt(this.$slots.action,w=>w||u||c||l?H("div",{class:`${x}-dialog__action`},w||(l?[Nt(l)]:[this.negativeText&&H(Fd,Object.assign({theme:m.peers.Button,themeOverrides:m.peerOverrides.Button,ghost:!0,size:"small",onClick:h},f),{default:()=>Nt(this.negativeText)}),this.positiveText&&H(Fd,Object.assign({theme:m.peers.Button,themeOverrides:m.peerOverrides.Button,size:"small",type:g==="default"?"primary":g,disabled:v,loading:v,onClick:p},d),{default:()=>Nt(this.positiveText)})])):null);return H("div",{class:[`${x}-dialog`,this.themeClass,this.closable&&`${x}-dialog--closable`,`${x}-dialog--icon-${r}`,t&&`${x}-dialog--bordered`],style:o,role:"dialog"},n?Jt(this.$slots.close,w=>w?H("div",{class:`${x}-dialog__close`},w):H(Rs,{clsPrefix:x,class:`${x}-dialog__close`,onClick:this.handleCloseClick})):null,i&&r==="top"?H("div",{class:`${x}-dialog-icon-container`},C):null,H("div",{class:`${x}-dialog__title`},i&&r==="left"?C:null,z0(this.$slots.header,()=>[Nt(a)])),H("div",{class:[`${x}-dialog__content`,b?"":`${x}-dialog__content--last`]},z0(this.$slots.default,()=>[Nt(s)])),b)}}),o1="n-dialog-provider",n1="n-dialog-api",O5="n-dialog-reactive-list",i1=e=>{const{modalColor:t,textColor2:r,boxShadow3:o}=e;return{color:t,textColor:r,boxShadow:o}},B5={name:"Modal",common:le,peers:{Scrollbar:$t,Dialog:wu,Card:bu},self:i1},a1=B5,H5={name:"Modal",common:se,peers:{Scrollbar:Mt,Dialog:e1,Card:Sg},self:i1},M5=H5,_u=Object.assign(Object.assign({},Cu),Bs),D5=_s(_u),F5=Oe({name:"ModalBody",inheritAttrs:!1,props:Object.assign(Object.assign({show:{type:Boolean,required:!0},preset:String,displayDirective:{type:String,required:!0},trapFocus:{type:Boolean,default:!0},autoFocus:{type:Boolean,default:!0},blockScroll:Boolean},_u),{renderMask:Function,onClickoutside:Function,onBeforeLeave:{type:Function,required:!0},onAfterLeave:{type:Function,required:!0},onPositiveClick:{type:Function,required:!0},onNegativeClick:{type:Function,required:!0},onClose:{type:Function,required:!0},onAfterEnter:Function,onEsc:Function}),setup(e){const t=de(null),r=de(null),o=de(e.show),n=de(null),i=de(null);kt(Rr(e,"show"),v=>{v&&(o.value=!0)}),Wy(ae(()=>e.blockScroll&&o.value));const a=Me(um);function s(){if(a.transformOriginRef.value==="center")return"";const{value:v}=n,{value:g}=i;if(v===null||g===null)return"";if(r.value){const x=r.value.containerScrollTop;return`${v}px ${g+x}px`}return""}function l(v){if(a.transformOriginRef.value==="center")return;const g=a.getMousePosition();if(!g||!r.value)return;const x=r.value.containerScrollTop,{offsetLeft:C,offsetTop:b}=v;if(g){const w=g.y,T=g.x;n.value=-(C-T),i.value=-(b-w-x)}v.style.transformOrigin=s()}function c(v){jt(()=>{l(v)})}function u(v){v.style.transformOrigin=s(),e.onBeforeLeave()}function d(){o.value=!1,n.value=null,i.value=null,e.onAfterLeave()}function f(){const{onClose:v}=e;v&&v()}function p(){e.onNegativeClick()}function h(){e.onPositiveClick()}const m=de(null);return kt(m,v=>{v&&jt(()=>{const g=v.el;g&&t.value!==g&&(t.value=g)})}),dt(iy,t),dt(ay,null),dt(sy,null),{mergedTheme:a.mergedThemeRef,appear:a.appearRef,isMounted:a.isMountedRef,mergedClsPrefix:a.mergedClsPrefixRef,bodyRef:t,scrollbarRef:r,displayed:o,childNodeRef:m,handlePositiveClick:h,handleNegativeClick:p,handleCloseClick:f,handleAfterLeave:d,handleBeforeLeave:u,handleEnter:c}},render(){const{$slots:e,$attrs:t,handleEnter:r,handleAfterLeave:o,handleBeforeLeave:n,preset:i,mergedClsPrefix:a}=this;let s=null;if(!i){if(s=SC(e),!s){oi("modal","default slot is empty");return}s=Ar(s),s.props=Yc({class:`${a}-modal`},t,s.props||{})}return this.displayDirective==="show"||this.displayed||this.show?pa(H("div",{role:"none",class:`${a}-modal-body-wrapper`},H(tg,{ref:"scrollbarRef",theme:this.mergedTheme.peers.Scrollbar,themeOverrides:this.mergedTheme.peerOverrides.Scrollbar,contentClass:`${a}-modal-scroll-content`},{default:()=>{var l;return[(l=this.renderMask)===null||l===void 0?void 0:l.call(this),H(Ny,{disabled:!this.trapFocus,active:this.show,onEsc:this.onEsc,autoFocus:this.autoFocus},{default:()=>{var c;return H(br,{name:"fade-in-scale-up-transition",appear:(c=this.appear)!==null&&c!==void 0?c:this.isMounted,onEnter:r,onAfterEnter:this.onAfterEnter,onAfterLeave:o,onBeforeLeave:n},{default:()=>{const u=[[Dl,this.show]],{onClickoutside:d}=this;return d&&u.push([cy,this.onClickoutside,void 0,{capture:!0}]),pa(this.preset==="confirm"||this.preset==="dialog"?H(r1,Object.assign({},this.$attrs,{class:[`${a}-modal`,this.$attrs.class],ref:"bodyRef",theme:this.mergedTheme.peers.Dialog,themeOverrides:this.mergedTheme.peerOverrides.Dialog},ri(this.$props,t1),{"aria-modal":"true"}),e):this.preset==="card"?H(x_,Object.assign({},this.$attrs,{ref:"bodyRef",class:[`${a}-modal`,this.$attrs.class],theme:this.mergedTheme.peers.Card,themeOverrides:this.mergedTheme.peerOverrides.Card},ri(this.$props,m_),{"aria-modal":"true",role:"dialog"}),e):this.childNodeRef=s,u)}})}})]}})),[[Dl,this.displayDirective==="if"||this.displayed||this.show]]):null}}),z5=ne([Se("modal-container",` - position: fixed; - left: 0; - top: 0; - height: 0; - width: 0; - display: flex; - `),Se("modal-mask",` - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - background-color: rgba(0, 0, 0, .4); - `,[gu({enterDuration:".25s",leaveDuration:".25s",enterCubicBezier:"var(--n-bezier-ease-out)",leaveCubicBezier:"var(--n-bezier-ease-out)"})]),Se("modal-body-wrapper",` - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: visible; - `,[Se("modal-scroll-content",` - min-height: 100%; - display: flex; - position: relative; - `)]),Se("modal",` - position: relative; - align-self: center; - color: var(--n-text-color); - margin: auto; - box-shadow: var(--n-box-shadow); - `,[G3({duration:".25s",enterScale:".5"})])]),N5=Object.assign(Object.assign(Object.assign(Object.assign({},Ct.props),{show:Boolean,unstableShowMask:{type:Boolean,default:!0},maskClosable:{type:Boolean,default:!0},preset:String,to:[String,Object],displayDirective:{type:String,default:"if"},transformOrigin:{type:String,default:"mouse"},zIndex:Number,autoFocus:{type:Boolean,default:!0},trapFocus:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},blockScroll:{type:Boolean,default:!0}}),_u),{onEsc:Function,"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],onAfterEnter:Function,onBeforeLeave:Function,onAfterLeave:Function,onClose:Function,onPositiveClick:Function,onNegativeClick:Function,onMaskClick:Function,internalDialog:Boolean,internalAppear:{type:Boolean,default:void 0},overlayStyle:[String,Object],onBeforeHide:Function,onAfterHide:Function,onHide:Function}),W5=Oe({name:"Modal",inheritAttrs:!1,props:N5,setup(e){const t=de(null),{mergedClsPrefixRef:r,namespaceRef:o,inlineThemeDisabled:n}=sr(e),i=Ct("Modal","-modal",z5,a1,e,r),a=lm(64),s=sm(),l=iu(),c=e.internalDialog?Me(o1,null):null,u=jy();function d(w){const{onUpdateShow:T,"onUpdate:show":S,onHide:E}=e;T&&_o(T,w),S&&_o(S,w),E&&!w&&E(w)}function f(){const{onClose:w}=e;w?Promise.resolve(w()).then(T=>{T!==!1&&d(!1)}):d(!1)}function p(){const{onPositiveClick:w}=e;w?Promise.resolve(w()).then(T=>{T!==!1&&d(!1)}):d(!1)}function h(){const{onNegativeClick:w}=e;w?Promise.resolve(w()).then(T=>{T!==!1&&d(!1)}):d(!1)}function m(){const{onBeforeLeave:w,onBeforeHide:T}=e;w&&_o(w),T&&T()}function v(){const{onAfterLeave:w,onAfterHide:T}=e;w&&_o(w),T&&T()}function g(w){var T;const{onMaskClick:S}=e;S&&S(w),e.maskClosable&&!((T=t.value)===null||T===void 0)&&T.contains(Qc(w))&&d(!1)}function x(w){var T;(T=e.onEsc)===null||T===void 0||T.call(e),e.show&&e.closeOnEsc&&qC(w)&&!u.value&&d(!1)}dt(um,{getMousePosition:()=>{if(c){const{clickedRef:w,clickPositionRef:T}=c;if(w.value&&T.value)return T.value}return a.value?s.value:null},mergedClsPrefixRef:r,mergedThemeRef:i,isMountedRef:l,appearRef:Rr(e,"internalAppear"),transformOriginRef:Rr(e,"transformOrigin")});const C=ae(()=>{const{common:{cubicBezierEaseOut:w},self:{boxShadow:T,color:S,textColor:E}}=i.value;return{"--n-bezier-ease-out":w,"--n-box-shadow":T,"--n-color":S,"--n-text-color":E}}),b=n?so("theme-class",void 0,C,e):void 0;return{mergedClsPrefix:r,namespace:o,isMounted:l,containerRef:t,presetProps:ae(()=>ri(e,D5)),handleEsc:x,handleAfterLeave:v,handleClickoutside:g,handleBeforeLeave:m,doUpdateShow:d,handleNegativeClick:h,handlePositiveClick:p,handleCloseClick:f,cssVars:n?void 0:C,themeClass:b==null?void 0:b.themeClass,onRender:b==null?void 0:b.onRender}},render(){const{mergedClsPrefix:e}=this;return H(xy,{to:this.to,show:this.show},{default:()=>{var t;(t=this.onRender)===null||t===void 0||t.call(this);const{unstableShowMask:r}=this;return pa(H("div",{role:"none",ref:"containerRef",class:[`${e}-modal-container`,this.themeClass,this.namespace],style:this.cssVars},H(F5,Object.assign({style:this.overlayStyle},this.$attrs,{ref:"bodyWrapper",displayDirective:this.displayDirective,show:this.show,preset:this.preset,autoFocus:this.autoFocus,trapFocus:this.trapFocus,blockScroll:this.blockScroll},this.presetProps,{onEsc:this.handleEsc,onClose:this.handleCloseClick,onNegativeClick:this.handleNegativeClick,onPositiveClick:this.handlePositiveClick,onBeforeLeave:this.handleBeforeLeave,onAfterEnter:this.onAfterEnter,onAfterLeave:this.handleAfterLeave,onClickoutside:r?void 0:this.handleClickoutside,renderMask:r?()=>{var o;return H(br,{name:"fade-in-transition",key:"mask",appear:(o=this.internalAppear)!==null&&o!==void 0?o:this.isMounted},{default:()=>this.show?H("div",{"aria-hidden":!0,ref:"containerRef",class:`${e}-modal-mask`,onClick:this.handleClickoutside}):null})}:void 0}),this.$slots)),[[hy,{zIndex:this.zIndex,enabled:this.show}]])}})}}),j5=Object.assign(Object.assign({},Bs),{onAfterEnter:Function,onAfterLeave:Function,transformOrigin:String,blockScroll:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},onEsc:Function,autoFocus:{type:Boolean,default:!0},internalStyle:[String,Object],maskClosable:{type:Boolean,default:!0},onPositiveClick:Function,onNegativeClick:Function,onClose:Function,onMaskClick:Function}),U5=Oe({name:"DialogEnvironment",props:Object.assign(Object.assign({},j5),{internalKey:{type:String,required:!0},to:[String,Object],onInternalAfterLeave:{type:Function,required:!0}}),setup(e){const t=de(!0);function r(){const{onInternalAfterLeave:u,internalKey:d,onAfterLeave:f}=e;u&&u(d),f&&f()}function o(u){const{onPositiveClick:d}=e;d?Promise.resolve(d(u)).then(f=>{f!==!1&&l()}):l()}function n(u){const{onNegativeClick:d}=e;d?Promise.resolve(d(u)).then(f=>{f!==!1&&l()}):l()}function i(){const{onClose:u}=e;u?Promise.resolve(u()).then(d=>{d!==!1&&l()}):l()}function a(u){const{onMaskClick:d,maskClosable:f}=e;d&&(d(u),f&&l())}function s(){const{onEsc:u}=e;u&&u()}function l(){t.value=!1}function c(u){t.value=u}return{show:t,hide:l,handleUpdateShow:c,handleAfterLeave:r,handleCloseClick:i,handleNegativeClick:n,handlePositiveClick:o,handleMaskClick:a,handleEsc:s}},render(){const{handlePositiveClick:e,handleUpdateShow:t,handleNegativeClick:r,handleCloseClick:o,handleAfterLeave:n,handleMaskClick:i,handleEsc:a,to:s,maskClosable:l,show:c}=this;return H(W5,{show:c,onUpdateShow:t,onMaskClick:i,onEsc:a,to:s,maskClosable:l,onAfterEnter:this.onAfterEnter,onAfterLeave:n,closeOnEsc:this.closeOnEsc,blockScroll:this.blockScroll,autoFocus:this.autoFocus,transformOrigin:this.transformOrigin,internalAppear:!0,internalDialog:!0},{default:()=>H(r1,Object.assign({},ri(this.$props,t1),{style:this.internalStyle,onClose:o,onNegativeClick:r,onPositiveClick:e}))})}}),V5={injectionKey:String,to:[String,Object]},s1=Oe({name:"DialogProvider",props:V5,setup(){const e=de([]),t={};function r(s={}){const l=ws(),c=Or(Object.assign(Object.assign({},s),{key:l,destroy:()=>{t[`n-dialog-${l}`].hide()}}));return e.value.push(c),c}const o=["info","success","warning","error"].map(s=>l=>r(Object.assign(Object.assign({},l),{type:s})));function n(s){const{value:l}=e;l.splice(l.findIndex(c=>c.key===s),1)}function i(){Object.values(t).forEach(s=>{s.hide()})}const a={create:r,destroyAll:i,info:o[0],success:o[1],warning:o[2],error:o[3]};return dt(n1,a),dt(o1,{clickedRef:lm(64),clickPositionRef:sm()}),dt(O5,e),Object.assign(Object.assign({},a),{dialogList:e,dialogInstRefs:t,handleAfterLeave:n})},render(){var e,t;return H(Je,null,[this.dialogList.map(r=>H(U5,ou(r,["destroy","style"],{internalStyle:r.style,to:this.to,ref:o=>{o===null?delete this.dialogInstRefs[`n-dialog-${r.key}`]:this.dialogInstRefs[`n-dialog-${r.key}`]=o},internalKey:r.key,onInternalAfterLeave:this.handleAfterLeave}))),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)])}});function l1(){const e=Me(n1,null);return e===null&&vi("use-dialog","No outer founded."),e}const c1=e=>{const{textColor1:t,dividerColor:r,fontWeightStrong:o}=e;return{textColor:t,color:r,fontWeight:o}},q5={name:"Divider",common:le,self:c1},G5=q5,K5={name:"Divider",common:se,self:c1},Z5=K5,u1=e=>{const{modalColor:t,textColor1:r,textColor2:o,boxShadow3:n,lineHeight:i,fontWeightStrong:a,dividerColor:s,closeColorHover:l,closeColorPressed:c,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:f,borderRadius:p,primaryColorHover:h}=e;return{bodyPadding:"16px 24px",headerPadding:"16px 24px",footerPadding:"16px 24px",color:t,textColor:o,titleTextColor:r,titleFontSize:"18px",titleFontWeight:a,boxShadow:n,lineHeight:i,headerBorderBottom:`1px solid ${s}`,footerBorderTop:`1px solid ${s}`,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:f,closeSize:"22px",closeIconSize:"18px",closeColorHover:l,closeColorPressed:c,closeBorderRadius:p,resizableTriggerColorHover:h}},X5={name:"Drawer",common:le,peers:{Scrollbar:$t},self:u1},Y5=X5,Q5={name:"Drawer",common:se,peers:{Scrollbar:Mt},self:u1},J5=Q5,d1={actionMargin:"0 0 0 20px",actionMarginRtl:"0 20px 0 0"},e6={name:"DynamicInput",common:se,peers:{Input:Xt,Button:Dt},self(){return d1}},t6=e6,r6=()=>d1,o6={name:"DynamicInput",common:le,peers:{Input:Yt,Button:It},self:r6},n6=o6,f1={gapSmall:"4px 8px",gapMedium:"8px 12px",gapLarge:"12px 16px"},i6={name:"Space",self(){return f1}},h1=i6,a6=()=>f1,s6={name:"Space",self:a6},p1=s6,l6={name:"DynamicTags",common:se,peers:{Input:Xt,Button:Dt,Tag:ig,Space:h1},self(){return{inputWidth:"64px"}}},c6=l6,u6={name:"DynamicTags",common:le,peers:{Input:Yt,Button:It,Tag:ag,Space:p1},self(){return{inputWidth:"64px"}}},d6=u6,f6={name:"Element",common:se},h6=f6,p6={name:"Element",common:le},m6=p6,g6={feedbackPadding:"4px 0 0 2px",feedbackHeightSmall:"24px",feedbackHeightMedium:"24px",feedbackHeightLarge:"26px",feedbackFontSizeSmall:"13px",feedbackFontSizeMedium:"14px",feedbackFontSizeLarge:"14px",labelFontSizeLeftSmall:"14px",labelFontSizeLeftMedium:"14px",labelFontSizeLeftLarge:"15px",labelFontSizeTopSmall:"13px",labelFontSizeTopMedium:"14px",labelFontSizeTopLarge:"14px",labelHeightSmall:"24px",labelHeightMedium:"26px",labelHeightLarge:"28px",labelPaddingVertical:"0 0 6px 2px",labelPaddingHorizontal:"0 12px 0 0",labelTextAlignVertical:"left",labelTextAlignHorizontal:"right",labelFontWeight:"400"},m1=e=>{const{heightSmall:t,heightMedium:r,heightLarge:o,textColor1:n,errorColor:i,warningColor:a,lineHeight:s,textColor3:l}=e;return Object.assign(Object.assign({},g6),{blankHeightSmall:t,blankHeightMedium:r,blankHeightLarge:o,lineHeight:s,labelTextColor:n,asteriskColor:i,feedbackTextColorError:i,feedbackTextColorWarning:a,feedbackTextColor:l})},x6={name:"Form",common:le,self:m1},v6=x6,b6={name:"Form",common:se,self:m1},C6=b6,y6={name:"GradientText",common:se,self(e){const{primaryColor:t,successColor:r,warningColor:o,errorColor:n,infoColor:i,primaryColorSuppl:a,successColorSuppl:s,warningColorSuppl:l,errorColorSuppl:c,infoColorSuppl:u,fontWeightStrong:d}=e;return{fontWeight:d,rotate:"252deg",colorStartPrimary:t,colorEndPrimary:a,colorStartInfo:i,colorEndInfo:u,colorStartWarning:o,colorEndWarning:l,colorStartError:n,colorEndError:c,colorStartSuccess:r,colorEndSuccess:s}}},S6=y6,w6=e=>{const{primaryColor:t,successColor:r,warningColor:o,errorColor:n,infoColor:i,fontWeightStrong:a}=e;return{fontWeight:a,rotate:"252deg",colorStartPrimary:G(t,{alpha:.6}),colorEndPrimary:t,colorStartInfo:G(i,{alpha:.6}),colorEndInfo:i,colorStartWarning:G(o,{alpha:.6}),colorEndWarning:o,colorStartError:G(n,{alpha:.6}),colorEndError:n,colorStartSuccess:G(r,{alpha:.6}),colorEndSuccess:r}},_6={name:"GradientText",common:le,self:w6},T6=_6,g1=e=>{const{primaryColor:t,baseColor:r}=e;return{color:t,iconColor:r}},E6={name:"IconWrapper",common:le,self:g1},P6=E6,k6={name:"IconWrapper",common:se,self:g1},L6=k6;function $6(){return{toolbarIconColor:"rgba(255, 255, 255, .9)",toolbarColor:"rgba(0, 0, 0, .35)",toolbarBoxShadow:"none",toolbarBorderRadius:"24px"}}const I6={name:"Image",common:le,peers:{Tooltip:Os},self:$6},R6={closeMargin:"16px 12px",closeSize:"20px",closeIconSize:"16px",width:"365px",padding:"16px",titleFontSize:"16px",metaFontSize:"12px",descriptionFontSize:"12px"},x1=e=>{const{textColor2:t,successColor:r,infoColor:o,warningColor:n,errorColor:i,popoverColor:a,closeIconColor:s,closeIconColorHover:l,closeIconColorPressed:c,closeColorHover:u,closeColorPressed:d,textColor1:f,textColor3:p,borderRadius:h,fontWeightStrong:m,boxShadow2:v,lineHeight:g,fontSize:x}=e;return Object.assign(Object.assign({},R6),{borderRadius:h,lineHeight:g,fontSize:x,headerFontWeight:m,iconColor:t,iconColorSuccess:r,iconColorInfo:o,iconColorWarning:n,iconColorError:i,color:a,textColor:t,closeIconColor:s,closeIconColorHover:l,closeIconColorPressed:c,closeBorderRadius:h,closeColorHover:u,closeColorPressed:d,headerTextColor:f,descriptionTextColor:p,actionTextColor:t,boxShadow:v})},A6={name:"Notification",common:le,peers:{Scrollbar:$t},self:x1},v1=A6,O6={name:"Notification",common:se,peers:{Scrollbar:Mt},self:x1},B6=O6,H6={margin:"0 0 8px 0",padding:"10px 20px",maxWidth:"720px",minWidth:"420px",iconMargin:"0 10px 0 0",closeMargin:"0 0 0 10px",closeSize:"20px",closeIconSize:"16px",iconSize:"20px",fontSize:"14px"},b1=e=>{const{textColor2:t,closeIconColor:r,closeIconColorHover:o,closeIconColorPressed:n,infoColor:i,successColor:a,errorColor:s,warningColor:l,popoverColor:c,boxShadow2:u,primaryColor:d,lineHeight:f,borderRadius:p,closeColorHover:h,closeColorPressed:m}=e;return Object.assign(Object.assign({},H6),{closeBorderRadius:p,textColor:t,textColorInfo:t,textColorSuccess:t,textColorError:t,textColorWarning:t,textColorLoading:t,color:c,colorInfo:c,colorSuccess:c,colorError:c,colorWarning:c,colorLoading:c,boxShadow:u,boxShadowInfo:u,boxShadowSuccess:u,boxShadowError:u,boxShadowWarning:u,boxShadowLoading:u,iconColor:t,iconColorInfo:i,iconColorSuccess:a,iconColorWarning:l,iconColorError:s,iconColorLoading:d,closeColorHover:h,closeColorPressed:m,closeIconColor:r,closeIconColorHover:o,closeIconColorPressed:n,closeColorHoverInfo:h,closeColorPressedInfo:m,closeIconColorInfo:r,closeIconColorHoverInfo:o,closeIconColorPressedInfo:n,closeColorHoverSuccess:h,closeColorPressedSuccess:m,closeIconColorSuccess:r,closeIconColorHoverSuccess:o,closeIconColorPressedSuccess:n,closeColorHoverError:h,closeColorPressedError:m,closeIconColorError:r,closeIconColorHoverError:o,closeIconColorPressedError:n,closeColorHoverWarning:h,closeColorPressedWarning:m,closeIconColorWarning:r,closeIconColorHoverWarning:o,closeIconColorPressedWarning:n,closeColorHoverLoading:h,closeColorPressedLoading:m,closeIconColorLoading:r,closeIconColorHoverLoading:o,closeIconColorPressedLoading:n,loadingColor:d,lineHeight:f,borderRadius:p})},M6={name:"Message",common:le,self:b1},C1=M6,D6={name:"Message",common:se,self:b1},F6=D6,z6={name:"ButtonGroup",common:se},N6=z6,W6={name:"ButtonGroup",common:le},j6=W6,U6={name:"InputNumber",common:se,peers:{Button:Dt,Input:Xt},self(e){const{textColorDisabled:t}=e;return{iconColorDisabled:t}}},V6=U6,q6=e=>{const{textColorDisabled:t}=e;return{iconColorDisabled:t}},G6={name:"InputNumber",common:le,peers:{Button:It,Input:Yt},self:q6},K6=G6,Z6={name:"Layout",common:se,peers:{Scrollbar:Mt},self(e){const{textColor2:t,bodyColor:r,popoverColor:o,cardColor:n,dividerColor:i,scrollbarColor:a,scrollbarColorHover:s}=e;return{textColor:t,textColorInverted:t,color:r,colorEmbedded:r,headerColor:n,headerColorInverted:n,footerColor:n,footerColorInverted:n,headerBorderColor:i,headerBorderColorInverted:i,footerBorderColor:i,footerBorderColorInverted:i,siderBorderColor:i,siderBorderColorInverted:i,siderColor:n,siderColorInverted:n,siderToggleButtonBorder:"1px solid transparent",siderToggleButtonColor:o,siderToggleButtonIconColor:t,siderToggleButtonIconColorInverted:t,siderToggleBarColor:me(r,a),siderToggleBarColorHover:me(r,s),__invertScrollbar:"false"}}},X6=Z6,Y6=e=>{const{baseColor:t,textColor2:r,bodyColor:o,cardColor:n,dividerColor:i,actionColor:a,scrollbarColor:s,scrollbarColorHover:l,invertedColor:c}=e;return{textColor:r,textColorInverted:"#FFF",color:o,colorEmbedded:a,headerColor:n,headerColorInverted:c,footerColor:a,footerColorInverted:c,headerBorderColor:i,headerBorderColorInverted:c,footerBorderColor:i,footerBorderColorInverted:c,siderBorderColor:i,siderBorderColorInverted:c,siderColor:n,siderColorInverted:c,siderToggleButtonBorder:`1px solid ${i}`,siderToggleButtonColor:t,siderToggleButtonIconColor:r,siderToggleButtonIconColorInverted:r,siderToggleBarColor:me(o,s),siderToggleBarColorHover:me(o,l),__invertScrollbar:"true"}},Q6={name:"Layout",common:le,peers:{Scrollbar:$t},self:Y6},J6=Q6,y1=e=>{const{textColor2:t,cardColor:r,modalColor:o,popoverColor:n,dividerColor:i,borderRadius:a,fontSize:s,hoverColor:l}=e;return{textColor:t,color:r,colorHover:l,colorModal:o,colorHoverModal:me(o,l),colorPopover:n,colorHoverPopover:me(n,l),borderColor:i,borderColorModal:me(o,i),borderColorPopover:me(n,i),borderRadius:a,fontSize:s}},eT={name:"List",common:le,self:y1},tT=eT,rT={name:"List",common:se,self:y1},oT=rT,nT={name:"LoadingBar",common:se,self(e){const{primaryColor:t}=e;return{colorError:"red",colorLoading:t,height:"2px"}}},iT=nT,aT=e=>{const{primaryColor:t,errorColor:r}=e;return{colorError:r,colorLoading:t,height:"2px"}},sT={name:"LoadingBar",common:le,self:aT},S1=sT,lT={name:"Log",common:se,peers:{Scrollbar:Mt,Code:Eg},self(e){const{textColor2:t,inputColor:r,fontSize:o,primaryColor:n}=e;return{loaderFontSize:o,loaderTextColor:t,loaderColor:r,loaderBorder:"1px solid #0000",loadingColor:n}}},cT=lT,uT=e=>{const{textColor2:t,modalColor:r,borderColor:o,fontSize:n,primaryColor:i}=e;return{loaderFontSize:n,loaderTextColor:t,loaderColor:r,loaderBorder:`1px solid ${o}`,loadingColor:i}},dT={name:"Log",common:le,peers:{Scrollbar:$t,Code:Pg},self:uT},fT=dT,hT={name:"Mention",common:se,peers:{InternalSelectMenu:_i,Input:Xt},self(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}},pT=hT,mT=e=>{const{boxShadow2:t}=e;return{menuBoxShadow:t}},gT={name:"Mention",common:le,peers:{InternalSelectMenu:wi,Input:Yt},self:mT},xT=gT;function vT(e,t,r,o){return{itemColorHoverInverted:"#0000",itemColorActiveInverted:t,itemColorActiveHoverInverted:t,itemColorActiveCollapsedInverted:t,itemTextColorInverted:e,itemTextColorHoverInverted:r,itemTextColorChildActiveInverted:r,itemTextColorChildActiveHoverInverted:r,itemTextColorActiveInverted:r,itemTextColorActiveHoverInverted:r,itemTextColorHorizontalInverted:e,itemTextColorHoverHorizontalInverted:r,itemTextColorChildActiveHorizontalInverted:r,itemTextColorChildActiveHoverHorizontalInverted:r,itemTextColorActiveHorizontalInverted:r,itemTextColorActiveHoverHorizontalInverted:r,itemIconColorInverted:e,itemIconColorHoverInverted:r,itemIconColorActiveInverted:r,itemIconColorActiveHoverInverted:r,itemIconColorChildActiveInverted:r,itemIconColorChildActiveHoverInverted:r,itemIconColorCollapsedInverted:e,itemIconColorHorizontalInverted:e,itemIconColorHoverHorizontalInverted:r,itemIconColorActiveHorizontalInverted:r,itemIconColorActiveHoverHorizontalInverted:r,itemIconColorChildActiveHorizontalInverted:r,itemIconColorChildActiveHoverHorizontalInverted:r,arrowColorInverted:e,arrowColorHoverInverted:r,arrowColorActiveInverted:r,arrowColorActiveHoverInverted:r,arrowColorChildActiveInverted:r,arrowColorChildActiveHoverInverted:r,groupTextColorInverted:o}}const w1=e=>{const{borderRadius:t,textColor3:r,primaryColor:o,textColor2:n,textColor1:i,fontSize:a,dividerColor:s,hoverColor:l,primaryColorHover:c}=e;return Object.assign({borderRadius:t,color:"#0000",groupTextColor:r,itemColorHover:l,itemColorActive:G(o,{alpha:.1}),itemColorActiveHover:G(o,{alpha:.1}),itemColorActiveCollapsed:G(o,{alpha:.1}),itemTextColor:n,itemTextColorHover:n,itemTextColorActive:o,itemTextColorActiveHover:o,itemTextColorChildActive:o,itemTextColorChildActiveHover:o,itemTextColorHorizontal:n,itemTextColorHoverHorizontal:c,itemTextColorActiveHorizontal:o,itemTextColorActiveHoverHorizontal:o,itemTextColorChildActiveHorizontal:o,itemTextColorChildActiveHoverHorizontal:o,itemIconColor:i,itemIconColorHover:i,itemIconColorActive:o,itemIconColorActiveHover:o,itemIconColorChildActive:o,itemIconColorChildActiveHover:o,itemIconColorCollapsed:i,itemIconColorHorizontal:i,itemIconColorHoverHorizontal:c,itemIconColorActiveHorizontal:o,itemIconColorActiveHoverHorizontal:o,itemIconColorChildActiveHorizontal:o,itemIconColorChildActiveHoverHorizontal:o,itemHeight:"42px",arrowColor:n,arrowColorHover:n,arrowColorActive:o,arrowColorActiveHover:o,arrowColorChildActive:o,arrowColorChildActiveHover:o,colorInverted:"#0000",borderColorHorizontal:"#0000",fontSize:a,dividerColor:s},vT("#BBB",o,"#FFF","#AAA"))},bT={name:"Menu",common:le,peers:{Tooltip:Os,Dropdown:yu},self:w1},CT=bT,yT={name:"Menu",common:se,peers:{Tooltip:As,Dropdown:Su},self(e){const{primaryColor:t,primaryColorSuppl:r}=e,o=w1(e);return o.itemColorActive=G(t,{alpha:.15}),o.itemColorActiveHover=G(t,{alpha:.15}),o.itemColorActiveCollapsed=G(t,{alpha:.15}),o.itemColorActiveInverted=r,o.itemColorActiveHoverInverted=r,o.itemColorActiveCollapsedInverted=r,o}},ST=yT,wT={titleFontSize:"18px",backSize:"22px"};function _1(e){const{textColor1:t,textColor2:r,textColor3:o,fontSize:n,fontWeightStrong:i,primaryColorHover:a,primaryColorPressed:s}=e;return Object.assign(Object.assign({},wT),{titleFontWeight:i,fontSize:n,titleTextColor:t,backColor:r,backColorHover:a,backColorPressed:s,subtitleTextColor:o})}const _T={name:"PageHeader",common:le,self:_1},TT={name:"PageHeader",common:se,self:_1},ET={iconSize:"22px"},T1=e=>{const{fontSize:t,warningColor:r}=e;return Object.assign(Object.assign({},ET),{fontSize:t,iconColor:r})},PT={name:"Popconfirm",common:le,peers:{Button:It,Popover:Ho},self:T1},kT=PT,LT={name:"Popconfirm",common:se,peers:{Button:Dt,Popover:Mo},self:T1},$T=LT,E1=e=>{const{infoColor:t,successColor:r,warningColor:o,errorColor:n,textColor2:i,progressRailColor:a,fontSize:s,fontWeight:l}=e;return{fontSize:s,fontSizeCircle:"28px",fontWeightCircle:l,railColor:a,railHeight:"8px",iconSizeCircle:"36px",iconSizeLine:"18px",iconColor:t,iconColorInfo:t,iconColorSuccess:r,iconColorWarning:o,iconColorError:n,textColorCircle:i,textColorLineInner:"rgb(255, 255, 255)",textColorLineOuter:i,fillColor:t,fillColorInfo:t,fillColorSuccess:r,fillColorWarning:o,fillColorError:n,lineBgProcessing:"linear-gradient(90deg, rgba(255, 255, 255, .3) 0%, rgba(255, 255, 255, .5) 100%)"}},IT={name:"Progress",common:le,self:E1},P1=IT,RT={name:"Progress",common:se,self(e){const t=E1(e);return t.textColorLineInner="rgb(0, 0, 0)",t.lineBgProcessing="linear-gradient(90deg, rgba(255, 255, 255, .3) 0%, rgba(255, 255, 255, .5) 100%)",t}},k1=RT,AT={name:"Rate",common:se,self(e){const{railColor:t}=e;return{itemColor:t,itemColorActive:"#CCAA33",itemSize:"20px",sizeSmall:"16px",sizeMedium:"20px",sizeLarge:"24px"}}},OT=AT,BT=e=>{const{railColor:t}=e;return{itemColor:t,itemColorActive:"#FFCC33",sizeSmall:"16px",sizeMedium:"20px",sizeLarge:"24px"}},HT={name:"Rate",common:le,self:BT},MT=HT,DT={titleFontSizeSmall:"26px",titleFontSizeMedium:"32px",titleFontSizeLarge:"40px",titleFontSizeHuge:"48px",fontSizeSmall:"14px",fontSizeMedium:"14px",fontSizeLarge:"15px",fontSizeHuge:"16px",iconSizeSmall:"64px",iconSizeMedium:"80px",iconSizeLarge:"100px",iconSizeHuge:"125px",iconColor418:void 0,iconColor404:void 0,iconColor403:void 0,iconColor500:void 0},L1=e=>{const{textColor2:t,textColor1:r,errorColor:o,successColor:n,infoColor:i,warningColor:a,lineHeight:s,fontWeightStrong:l}=e;return Object.assign(Object.assign({},DT),{lineHeight:s,titleFontWeight:l,titleTextColor:r,textColor:t,iconColorError:o,iconColorSuccess:n,iconColorInfo:i,iconColorWarning:a})},FT={name:"Result",common:le,self:L1},zT=FT,NT={name:"Result",common:se,self:L1},WT=NT,$1={railHeight:"4px",railWidthVertical:"4px",handleSize:"18px",dotHeight:"8px",dotWidth:"8px",dotBorderRadius:"4px"},jT={name:"Slider",common:se,self(e){const t="0 2px 8px 0 rgba(0, 0, 0, 0.12)",{railColor:r,modalColor:o,primaryColorSuppl:n,popoverColor:i,textColor2:a,cardColor:s,borderRadius:l,fontSize:c,opacityDisabled:u}=e;return Object.assign(Object.assign({},$1),{fontSize:c,markFontSize:c,railColor:r,railColorHover:r,fillColor:n,fillColorHover:n,opacityDisabled:u,handleColor:"#FFF",dotColor:s,dotColorModal:o,dotColorPopover:i,handleBoxShadow:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",handleBoxShadowHover:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",handleBoxShadowActive:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",handleBoxShadowFocus:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",indicatorColor:i,indicatorBoxShadow:t,indicatorTextColor:a,indicatorBorderRadius:l,dotBorder:`2px solid ${r}`,dotBorderActive:`2px solid ${n}`,dotBoxShadow:""})}},UT=jT,VT=e=>{const t="rgba(0, 0, 0, .85)",r="0 2px 8px 0 rgba(0, 0, 0, 0.12)",{railColor:o,primaryColor:n,baseColor:i,cardColor:a,modalColor:s,popoverColor:l,borderRadius:c,fontSize:u,opacityDisabled:d}=e;return Object.assign(Object.assign({},$1),{fontSize:u,markFontSize:u,railColor:o,railColorHover:o,fillColor:n,fillColorHover:n,opacityDisabled:d,handleColor:"#FFF",dotColor:a,dotColorModal:s,dotColorPopover:l,handleBoxShadow:"0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)",handleBoxShadowHover:"0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)",handleBoxShadowActive:"0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)",handleBoxShadowFocus:"0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)",indicatorColor:t,indicatorBoxShadow:r,indicatorTextColor:i,indicatorBorderRadius:c,dotBorder:`2px solid ${o}`,dotBorderActive:`2px solid ${n}`,dotBoxShadow:""})},qT={name:"Slider",common:le,self:VT},GT=qT,I1=e=>{const{opacityDisabled:t,heightTiny:r,heightSmall:o,heightMedium:n,heightLarge:i,heightHuge:a,primaryColor:s,fontSize:l}=e;return{fontSize:l,textColor:s,sizeTiny:r,sizeSmall:o,sizeMedium:n,sizeLarge:i,sizeHuge:a,color:s,opacitySpinning:t}},KT={name:"Spin",common:le,self:I1},ZT=KT,XT={name:"Spin",common:se,self:I1},YT=XT,R1=e=>{const{textColor2:t,textColor3:r,fontSize:o,fontWeight:n}=e;return{labelFontSize:o,labelFontWeight:n,valueFontWeight:n,valueFontSize:"24px",labelTextColor:r,valuePrefixTextColor:t,valueSuffixTextColor:t,valueTextColor:t}},QT={name:"Statistic",common:le,self:R1},JT=QT,eE={name:"Statistic",common:se,self:R1},tE=eE,rE={stepHeaderFontSizeSmall:"14px",stepHeaderFontSizeMedium:"16px",indicatorIndexFontSizeSmall:"14px",indicatorIndexFontSizeMedium:"16px",indicatorSizeSmall:"22px",indicatorSizeMedium:"28px",indicatorIconSizeSmall:"14px",indicatorIconSizeMedium:"18px"},A1=e=>{const{fontWeightStrong:t,baseColor:r,textColorDisabled:o,primaryColor:n,errorColor:i,textColor1:a,textColor2:s}=e;return Object.assign(Object.assign({},rE),{stepHeaderFontWeight:t,indicatorTextColorProcess:r,indicatorTextColorWait:o,indicatorTextColorFinish:n,indicatorTextColorError:i,indicatorBorderColorProcess:n,indicatorBorderColorWait:o,indicatorBorderColorFinish:n,indicatorBorderColorError:i,indicatorColorProcess:n,indicatorColorWait:"#0000",indicatorColorFinish:"#0000",indicatorColorError:"#0000",splitorColorProcess:o,splitorColorWait:o,splitorColorFinish:n,splitorColorError:o,headerTextColorProcess:a,headerTextColorWait:o,headerTextColorFinish:o,headerTextColorError:i,descriptionTextColorProcess:s,descriptionTextColorWait:o,descriptionTextColorFinish:o,descriptionTextColorError:i})},oE={name:"Steps",common:le,self:A1},nE=oE,iE={name:"Steps",common:se,self:A1},aE=iE,O1={buttonHeightSmall:"14px",buttonHeightMedium:"18px",buttonHeightLarge:"22px",buttonWidthSmall:"14px",buttonWidthMedium:"18px",buttonWidthLarge:"22px",buttonWidthPressedSmall:"20px",buttonWidthPressedMedium:"24px",buttonWidthPressedLarge:"28px",railHeightSmall:"18px",railHeightMedium:"22px",railHeightLarge:"26px",railWidthSmall:"32px",railWidthMedium:"40px",railWidthLarge:"48px"},sE={name:"Switch",common:se,self(e){const{primaryColorSuppl:t,opacityDisabled:r,borderRadius:o,primaryColor:n,textColor2:i,baseColor:a}=e,s="rgba(255, 255, 255, .20)";return Object.assign(Object.assign({},O1),{iconColor:a,textColor:i,loadingColor:t,opacityDisabled:r,railColor:s,railColorActive:t,buttonBoxShadow:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",buttonColor:"#FFF",railBorderRadiusSmall:o,railBorderRadiusMedium:o,railBorderRadiusLarge:o,buttonBorderRadiusSmall:o,buttonBorderRadiusMedium:o,buttonBorderRadiusLarge:o,boxShadowFocus:`0 0 8px 0 ${G(n,{alpha:.3})}`})}},lE=sE,cE=e=>{const{primaryColor:t,opacityDisabled:r,borderRadius:o,textColor3:n}=e,i="rgba(0, 0, 0, .14)";return Object.assign(Object.assign({},O1),{iconColor:n,textColor:"white",loadingColor:t,opacityDisabled:r,railColor:i,railColorActive:t,buttonBoxShadow:"0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)",buttonColor:"#FFF",railBorderRadiusSmall:o,railBorderRadiusMedium:o,railBorderRadiusLarge:o,buttonBorderRadiusSmall:o,buttonBorderRadiusMedium:o,buttonBorderRadiusLarge:o,boxShadowFocus:`0 0 0 2px ${G(t,{alpha:.2})}`})},uE={name:"Switch",common:le,self:cE},dE=uE,fE={thPaddingSmall:"6px",thPaddingMedium:"12px",thPaddingLarge:"12px",tdPaddingSmall:"6px",tdPaddingMedium:"12px",tdPaddingLarge:"12px"},B1=e=>{const{dividerColor:t,cardColor:r,modalColor:o,popoverColor:n,tableHeaderColor:i,tableColorStriped:a,textColor1:s,textColor2:l,borderRadius:c,fontWeightStrong:u,lineHeight:d,fontSizeSmall:f,fontSizeMedium:p,fontSizeLarge:h}=e;return Object.assign(Object.assign({},fE),{fontSizeSmall:f,fontSizeMedium:p,fontSizeLarge:h,lineHeight:d,borderRadius:c,borderColor:me(r,t),borderColorModal:me(o,t),borderColorPopover:me(n,t),tdColor:r,tdColorModal:o,tdColorPopover:n,tdColorStriped:me(r,a),tdColorStripedModal:me(o,a),tdColorStripedPopover:me(n,a),thColor:me(r,i),thColorModal:me(o,i),thColorPopover:me(n,i),thTextColor:s,tdTextColor:l,thFontWeight:u})},hE={name:"Table",common:le,self:B1},pE=hE,mE={name:"Table",common:se,self:B1},gE=mE,xE={tabFontSizeSmall:"14px",tabFontSizeMedium:"14px",tabFontSizeLarge:"16px",tabGapSmallLine:"36px",tabGapMediumLine:"36px",tabGapLargeLine:"36px",tabGapSmallLineVertical:"8px",tabGapMediumLineVertical:"8px",tabGapLargeLineVertical:"8px",tabPaddingSmallLine:"6px 0",tabPaddingMediumLine:"10px 0",tabPaddingLargeLine:"14px 0",tabPaddingVerticalSmallLine:"6px 12px",tabPaddingVerticalMediumLine:"8px 16px",tabPaddingVerticalLargeLine:"10px 20px",tabGapSmallBar:"36px",tabGapMediumBar:"36px",tabGapLargeBar:"36px",tabGapSmallBarVertical:"8px",tabGapMediumBarVertical:"8px",tabGapLargeBarVertical:"8px",tabPaddingSmallBar:"4px 0",tabPaddingMediumBar:"6px 0",tabPaddingLargeBar:"10px 0",tabPaddingVerticalSmallBar:"6px 12px",tabPaddingVerticalMediumBar:"8px 16px",tabPaddingVerticalLargeBar:"10px 20px",tabGapSmallCard:"4px",tabGapMediumCard:"4px",tabGapLargeCard:"4px",tabGapSmallCardVertical:"4px",tabGapMediumCardVertical:"4px",tabGapLargeCardVertical:"4px",tabPaddingSmallCard:"8px 16px",tabPaddingMediumCard:"10px 20px",tabPaddingLargeCard:"12px 24px",tabPaddingSmallSegment:"4px 0",tabPaddingMediumSegment:"6px 0",tabPaddingLargeSegment:"8px 0",tabPaddingVerticalLargeSegment:"0 8px",tabPaddingVerticalSmallCard:"8px 12px",tabPaddingVerticalMediumCard:"10px 16px",tabPaddingVerticalLargeCard:"12px 20px",tabPaddingVerticalSmallSegment:"0 4px",tabPaddingVerticalMediumSegment:"0 6px",tabGapSmallSegment:"0",tabGapMediumSegment:"0",tabGapLargeSegment:"0",tabGapSmallSegmentVertical:"0",tabGapMediumSegmentVertical:"0",tabGapLargeSegmentVertical:"0",panePaddingSmall:"8px 0 0 0",panePaddingMedium:"12px 0 0 0",panePaddingLarge:"16px 0 0 0",closeSize:"18px",closeIconSize:"14px"},H1=e=>{const{textColor2:t,primaryColor:r,textColorDisabled:o,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeColorHover:s,closeColorPressed:l,tabColor:c,baseColor:u,dividerColor:d,fontWeight:f,textColor1:p,borderRadius:h,fontSize:m,fontWeightStrong:v}=e;return Object.assign(Object.assign({},xE),{colorSegment:c,tabFontSizeCard:m,tabTextColorLine:p,tabTextColorActiveLine:r,tabTextColorHoverLine:r,tabTextColorDisabledLine:o,tabTextColorSegment:p,tabTextColorActiveSegment:t,tabTextColorHoverSegment:t,tabTextColorDisabledSegment:o,tabTextColorBar:p,tabTextColorActiveBar:r,tabTextColorHoverBar:r,tabTextColorDisabledBar:o,tabTextColorCard:p,tabTextColorHoverCard:p,tabTextColorActiveCard:r,tabTextColorDisabledCard:o,barColor:r,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeColorHover:s,closeColorPressed:l,closeBorderRadius:h,tabColor:c,tabColorSegment:u,tabBorderColor:d,tabFontWeightActive:f,tabFontWeight:f,tabBorderRadius:h,paneTextColor:t,fontWeightStrong:v})},vE={name:"Tabs",common:le,self:H1},bE=vE,CE={name:"Tabs",common:se,self(e){const t=H1(e),{inputColor:r}=e;return t.colorSegment=r,t.tabColorSegment=r,t}},yE=CE,M1=e=>{const{textColor1:t,textColor2:r,fontWeightStrong:o,fontSize:n}=e;return{fontSize:n,titleTextColor:t,textColor:r,titleFontWeight:o}},SE={name:"Thing",common:le,self:M1},wE=SE,_E={name:"Thing",common:se,self:M1},TE=_E,D1={titleMarginMedium:"0 0 6px 0",titleMarginLarge:"-2px 0 6px 0",titleFontSizeMedium:"14px",titleFontSizeLarge:"16px",iconSizeMedium:"14px",iconSizeLarge:"14px"},EE={name:"Timeline",common:se,self(e){const{textColor3:t,infoColorSuppl:r,errorColorSuppl:o,successColorSuppl:n,warningColorSuppl:i,textColor1:a,textColor2:s,railColor:l,fontWeightStrong:c,fontSize:u}=e;return Object.assign(Object.assign({},D1),{contentFontSize:u,titleFontWeight:c,circleBorder:`2px solid ${t}`,circleBorderInfo:`2px solid ${r}`,circleBorderError:`2px solid ${o}`,circleBorderSuccess:`2px solid ${n}`,circleBorderWarning:`2px solid ${i}`,iconColor:t,iconColorInfo:r,iconColorError:o,iconColorSuccess:n,iconColorWarning:i,titleTextColor:a,contentTextColor:s,metaTextColor:t,lineColor:l})}},PE=EE,kE=e=>{const{textColor3:t,infoColor:r,errorColor:o,successColor:n,warningColor:i,textColor1:a,textColor2:s,railColor:l,fontWeightStrong:c,fontSize:u}=e;return Object.assign(Object.assign({},D1),{contentFontSize:u,titleFontWeight:c,circleBorder:`2px solid ${t}`,circleBorderInfo:`2px solid ${r}`,circleBorderError:`2px solid ${o}`,circleBorderSuccess:`2px solid ${n}`,circleBorderWarning:`2px solid ${i}`,iconColor:t,iconColorInfo:r,iconColorError:o,iconColorSuccess:n,iconColorWarning:i,titleTextColor:a,contentTextColor:s,metaTextColor:t,lineColor:l})},LE={name:"Timeline",common:le,self:kE},$E=LE,F1={extraFontSizeSmall:"12px",extraFontSizeMedium:"12px",extraFontSizeLarge:"14px",titleFontSizeSmall:"14px",titleFontSizeMedium:"16px",titleFontSizeLarge:"16px",closeSize:"20px",closeIconSize:"16px",headerHeightSmall:"44px",headerHeightMedium:"44px",headerHeightLarge:"50px"},IE={name:"Transfer",common:se,peers:{Checkbox:xn,Scrollbar:Mt,Input:Xt,Empty:Bo,Button:Dt},self(e){const{fontWeight:t,fontSizeLarge:r,fontSizeMedium:o,fontSizeSmall:n,heightLarge:i,heightMedium:a,borderRadius:s,inputColor:l,tableHeaderColor:c,textColor1:u,textColorDisabled:d,textColor2:f,textColor3:p,hoverColor:h,closeColorHover:m,closeColorPressed:v,closeIconColor:g,closeIconColorHover:x,closeIconColorPressed:C,dividerColor:b}=e;return Object.assign(Object.assign({},F1),{itemHeightSmall:a,itemHeightMedium:a,itemHeightLarge:i,fontSizeSmall:n,fontSizeMedium:o,fontSizeLarge:r,borderRadius:s,dividerColor:b,borderColor:"#0000",listColor:l,headerColor:c,titleTextColor:u,titleTextColorDisabled:d,extraTextColor:p,extraTextColorDisabled:d,itemTextColor:f,itemTextColorDisabled:d,itemColorPending:h,titleFontWeight:t,closeColorHover:m,closeColorPressed:v,closeIconColor:g,closeIconColorHover:x,closeIconColorPressed:C})}},RE=IE,AE=e=>{const{fontWeight:t,fontSizeLarge:r,fontSizeMedium:o,fontSizeSmall:n,heightLarge:i,heightMedium:a,borderRadius:s,cardColor:l,tableHeaderColor:c,textColor1:u,textColorDisabled:d,textColor2:f,textColor3:p,borderColor:h,hoverColor:m,closeColorHover:v,closeColorPressed:g,closeIconColor:x,closeIconColorHover:C,closeIconColorPressed:b}=e;return Object.assign(Object.assign({},F1),{itemHeightSmall:a,itemHeightMedium:a,itemHeightLarge:i,fontSizeSmall:n,fontSizeMedium:o,fontSizeLarge:r,borderRadius:s,dividerColor:h,borderColor:h,listColor:l,headerColor:me(l,c),titleTextColor:u,titleTextColorDisabled:d,extraTextColor:p,extraTextColorDisabled:d,itemTextColor:f,itemTextColorDisabled:d,itemColorPending:m,titleFontWeight:t,closeColorHover:v,closeColorPressed:g,closeIconColor:x,closeIconColorHover:C,closeIconColorPressed:b})},OE={name:"Transfer",common:le,peers:{Checkbox:gn,Scrollbar:$t,Input:Yt,Empty:Dr,Button:It},self:AE},BE=OE,z1=e=>{const{borderRadiusSmall:t,dividerColor:r,hoverColor:o,pressedColor:n,primaryColor:i,textColor3:a,textColor2:s,textColorDisabled:l,fontSize:c}=e;return{fontSize:c,lineHeight:"1.5",nodeHeight:"30px",nodeWrapperPadding:"3px 0",nodeBorderRadius:t,nodeColorHover:o,nodeColorPressed:n,nodeColorActive:G(i,{alpha:.1}),arrowColor:a,nodeTextColor:s,nodeTextColorDisabled:l,loadingColor:i,dropMarkColor:i,lineColor:r}},HE={name:"Tree",common:le,peers:{Checkbox:gn,Scrollbar:$t,Empty:Dr},self:z1},N1=HE,ME={name:"Tree",common:se,peers:{Checkbox:xn,Scrollbar:Mt,Empty:Bo},self(e){const{primaryColor:t}=e,r=z1(e);return r.nodeColorActive=G(t,{alpha:.15}),r}},W1=ME,DE={name:"TreeSelect",common:se,peers:{Tree:W1,Empty:Bo,InternalSelection:vu}},FE=DE,zE=e=>{const{popoverColor:t,boxShadow2:r,borderRadius:o,heightMedium:n,dividerColor:i,textColor2:a}=e;return{menuPadding:"4px",menuColor:t,menuBoxShadow:r,menuBorderRadius:o,menuHeight:`calc(${n} * 7.6)`,actionDividerColor:i,actionTextColor:a,actionPadding:"8px 12px"}},NE={name:"TreeSelect",common:le,peers:{Tree:N1,Empty:Dr,InternalSelection:xu},self:zE},WE=NE,jE={headerFontSize1:"30px",headerFontSize2:"22px",headerFontSize3:"18px",headerFontSize4:"16px",headerFontSize5:"16px",headerFontSize6:"16px",headerMargin1:"28px 0 20px 0",headerMargin2:"28px 0 20px 0",headerMargin3:"28px 0 20px 0",headerMargin4:"28px 0 18px 0",headerMargin5:"28px 0 18px 0",headerMargin6:"28px 0 18px 0",headerPrefixWidth1:"16px",headerPrefixWidth2:"16px",headerPrefixWidth3:"12px",headerPrefixWidth4:"12px",headerPrefixWidth5:"12px",headerPrefixWidth6:"12px",headerBarWidth1:"4px",headerBarWidth2:"4px",headerBarWidth3:"3px",headerBarWidth4:"3px",headerBarWidth5:"3px",headerBarWidth6:"3px",pMargin:"16px 0 16px 0",liMargin:".25em 0 0 0",olPadding:"0 0 0 2em",ulPadding:"0 0 0 2em"},j1=e=>{const{primaryColor:t,textColor2:r,borderColor:o,lineHeight:n,fontSize:i,borderRadiusSmall:a,dividerColor:s,fontWeightStrong:l,textColor1:c,textColor3:u,infoColor:d,warningColor:f,errorColor:p,successColor:h,codeColor:m}=e;return Object.assign(Object.assign({},jE),{aTextColor:t,blockquoteTextColor:r,blockquotePrefixColor:o,blockquoteLineHeight:n,blockquoteFontSize:i,codeBorderRadius:a,liTextColor:r,liLineHeight:n,liFontSize:i,hrColor:s,headerFontWeight:l,headerTextColor:c,pTextColor:r,pTextColor1Depth:c,pTextColor2Depth:r,pTextColor3Depth:u,pLineHeight:n,pFontSize:i,headerBarColor:t,headerBarColorPrimary:t,headerBarColorInfo:d,headerBarColorError:p,headerBarColorWarning:f,headerBarColorSuccess:h,textColor:r,textColor1Depth:c,textColor2Depth:r,textColor3Depth:u,textColorPrimary:t,textColorInfo:d,textColorSuccess:h,textColorWarning:f,textColorError:p,codeTextColor:r,codeColor:m,codeBorder:"1px solid #0000"})},UE={name:"Typography",common:le,self:j1},VE=UE,qE={name:"Typography",common:se,self:j1},GE=qE,U1=e=>{const{iconColor:t,primaryColor:r,errorColor:o,textColor2:n,successColor:i,opacityDisabled:a,actionColor:s,borderColor:l,hoverColor:c,lineHeight:u,borderRadius:d,fontSize:f}=e;return{fontSize:f,lineHeight:u,borderRadius:d,draggerColor:s,draggerBorder:`1px dashed ${l}`,draggerBorderHover:`1px dashed ${r}`,itemColorHover:c,itemColorHoverError:G(o,{alpha:.06}),itemTextColor:n,itemTextColorError:o,itemTextColorSuccess:i,itemIconColor:t,itemDisabledOpacity:a,itemBorderImageCardError:`1px solid ${o}`,itemBorderImageCard:`1px solid ${l}`}},KE={name:"Upload",common:le,peers:{Button:It,Progress:P1},self:U1},ZE=KE,XE={name:"Upload",common:se,peers:{Button:Dt,Progress:k1},self(e){const{errorColor:t}=e,r=U1(e);return r.itemColorHoverError=G(t,{alpha:.09}),r}},YE=XE,QE={name:"Watermark",common:se,self(e){const{fontFamily:t}=e;return{fontFamily:t}}},JE=QE,eP={name:"Watermark",common:le,self(e){const{fontFamily:t}=e;return{fontFamily:t}}},tP=eP,rP={name:"Row",common:le},oP=rP,nP={name:"Row",common:se},iP=nP,aP={name:"Image",common:se,peers:{Tooltip:As},self:e=>{const{textColor2:t}=e;return{toolbarIconColor:t,toolbarColor:"rgba(0, 0, 0, .35)",toolbarBoxShadow:"none",toolbarBorderRadius:"24px"}}},V1={extraFontSize:"12px",width:"440px"},sP={name:"Transfer",common:se,peers:{Checkbox:xn,Scrollbar:Mt,Input:Xt,Empty:Bo,Button:Dt},self(e){const{iconColorDisabled:t,iconColor:r,fontWeight:o,fontSizeLarge:n,fontSizeMedium:i,fontSizeSmall:a,heightLarge:s,heightMedium:l,heightSmall:c,borderRadius:u,inputColor:d,tableHeaderColor:f,textColor1:p,textColorDisabled:h,textColor2:m,hoverColor:v}=e;return Object.assign(Object.assign({},V1),{itemHeightSmall:c,itemHeightMedium:l,itemHeightLarge:s,fontSizeSmall:a,fontSizeMedium:i,fontSizeLarge:n,borderRadius:u,borderColor:"#0000",listColor:d,headerColor:f,titleTextColor:p,titleTextColorDisabled:h,extraTextColor:m,filterDividerColor:"#0000",itemTextColor:m,itemTextColorDisabled:h,itemColorPending:v,titleFontWeight:o,iconColor:r,iconColorDisabled:t})}},lP=sP,cP=e=>{const{fontWeight:t,iconColorDisabled:r,iconColor:o,fontSizeLarge:n,fontSizeMedium:i,fontSizeSmall:a,heightLarge:s,heightMedium:l,heightSmall:c,borderRadius:u,cardColor:d,tableHeaderColor:f,textColor1:p,textColorDisabled:h,textColor2:m,borderColor:v,hoverColor:g}=e;return Object.assign(Object.assign({},V1),{itemHeightSmall:c,itemHeightMedium:l,itemHeightLarge:s,fontSizeSmall:a,fontSizeMedium:i,fontSizeLarge:n,borderRadius:u,borderColor:v,listColor:d,headerColor:me(d,f),titleTextColor:p,titleTextColorDisabled:h,extraTextColor:m,filterDividerColor:v,itemTextColor:m,itemTextColorDisabled:h,itemColorPending:g,titleFontWeight:t,iconColor:o,iconColorDisabled:r})},uP={name:"Transfer",common:le,peers:{Checkbox:gn,Scrollbar:$t,Input:Yt,Empty:Dr,Button:It},self:cP},dP=uP,q1="n-loading-bar",G1="n-loading-bar-api",fP=Se("loading-bar-container",` - z-index: 5999; - position: fixed; - top: 0; - left: 0; - right: 0; - height: 2px; -`,[gu({enterDuration:"0.3s",leaveDuration:"0.8s"}),Se("loading-bar",` - width: 100%; - transition: - max-width 4s linear, - background .2s linear; - height: var(--n-height); - `,[Ce("starting",` - background: var(--n-color-loading); - `),Ce("finishing",` - background: var(--n-color-loading); - transition: - max-width .2s linear, - background .2s linear; - `),Ce("error",` - background: var(--n-color-error); - transition: - max-width .2s linear, - background .2s linear; - `)])]);var Ui=globalThis&&globalThis.__awaiter||function(e,t,r,o){function n(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{c(o.next(u))}catch(d){a(d)}}function l(u){try{c(o.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):n(u.value).then(s,l)}c((o=o.apply(e,t||[])).next())})};function Vi(e,t){return`${t}-loading-bar ${t}-loading-bar--${e}`}const hP=Oe({name:"LoadingBar",props:{containerClass:String,containerStyle:[String,Object]},setup(){const{inlineThemeDisabled:e}=sr(),{props:t,mergedClsPrefixRef:r}=Me(q1),o=de(null),n=de(!1),i=de(!1),a=de(!1),s=de(!1);let l=!1;const c=de(!1),u=ae(()=>{const{loadingBarStyle:w}=t;return w?w[c.value?"error":"loading"]:""});function d(){return Ui(this,void 0,void 0,function*(){n.value=!1,a.value=!1,l=!1,c.value=!1,s.value=!0,yield jt(),s.value=!1})}function f(w=0,T=80,S="starting"){return Ui(this,void 0,void 0,function*(){if(i.value=!0,yield d(),l)return;a.value=!0,yield jt();const E=o.value;E&&(E.style.maxWidth=`${w}%`,E.style.transition="none",E.offsetWidth,E.className=Vi(S,r.value),E.style.transition="",E.style.maxWidth=`${T}%`)})}function p(){return Ui(this,void 0,void 0,function*(){if(l||c.value)return;i.value&&(yield jt()),l=!0;const w=o.value;w&&(w.className=Vi("finishing",r.value),w.style.maxWidth="100%",w.offsetWidth,a.value=!1)})}function h(){if(!(l||c.value))if(!a.value)f(100,100,"error").then(()=>{c.value=!0;const w=o.value;w&&(w.className=Vi("error",r.value),w.offsetWidth,a.value=!1)});else{c.value=!0;const w=o.value;if(!w)return;w.className=Vi("error",r.value),w.style.maxWidth="100%",w.offsetWidth,a.value=!1}}function m(){n.value=!0}function v(){n.value=!1}function g(){return Ui(this,void 0,void 0,function*(){yield d()})}const x=Ct("LoadingBar","-loading-bar",fP,S1,t,r),C=ae(()=>{const{self:{height:w,colorError:T,colorLoading:S}}=x.value;return{"--n-height":w,"--n-color-loading":S,"--n-color-error":T}}),b=e?so("loading-bar",void 0,C,t):void 0;return{mergedClsPrefix:r,loadingBarRef:o,started:i,loading:a,entering:n,transitionDisabled:s,start:f,error:h,finish:p,handleEnter:m,handleAfterEnter:v,handleAfterLeave:g,mergedLoadingBarStyle:u,cssVars:e?void 0:C,themeClass:b==null?void 0:b.themeClass,onRender:b==null?void 0:b.onRender}},render(){if(!this.started)return null;const{mergedClsPrefix:e}=this;return H(br,{name:"fade-in-transition",appear:!0,onEnter:this.handleEnter,onAfterEnter:this.handleAfterEnter,onAfterLeave:this.handleAfterLeave,css:!this.transitionDisabled},{default:()=>{var t;return(t=this.onRender)===null||t===void 0||t.call(this),pa(H("div",{class:[`${e}-loading-bar-container`,this.themeClass,this.containerClass],style:this.containerStyle},H("div",{ref:"loadingBarRef",class:[`${e}-loading-bar`],style:[this.cssVars,this.mergedLoadingBarStyle]})),[[Dl,this.loading||!this.loading&&this.entering]])}})}}),pP=Object.assign(Object.assign({},Ct.props),{to:{type:[String,Object,Boolean],default:void 0},containerClass:String,containerStyle:[String,Object],loadingBarStyle:{type:Object}}),K1=Oe({name:"LoadingBarProvider",props:pP,setup(e){const t=iu(),r=de(null),o={start(){var i;t.value?(i=r.value)===null||i===void 0||i.start():jt(()=>{var a;(a=r.value)===null||a===void 0||a.start()})},error(){var i;t.value?(i=r.value)===null||i===void 0||i.error():jt(()=>{var a;(a=r.value)===null||a===void 0||a.error()})},finish(){var i;t.value?(i=r.value)===null||i===void 0||i.finish():jt(()=>{var a;(a=r.value)===null||a===void 0||a.finish()})}},{mergedClsPrefixRef:n}=sr(e);return dt(G1,o),dt(q1,{props:e,mergedClsPrefixRef:n}),Object.assign(o,{loadingBarRef:r})},render(){var e,t;return H(Je,null,H(vs,{disabled:this.to===!1,to:this.to||"body"},H(hP,{ref:"loadingBarRef",containerStyle:this.containerStyle,containerClass:this.containerClass})),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e))}});function Z1(){const e=Me(G1,null);return e===null&&vi("use-loading-bar","No outer founded."),e}const X1={icon:Function,type:{type:String,default:"info"},content:[String,Number,Function],showIcon:{type:Boolean,default:!0},closable:Boolean,keepAliveOnHover:Boolean,onClose:Function,onMouseenter:Function,onMouseleave:Function},Y1="n-message-api",Q1="n-message-provider",mP=ne([Se("message-wrapper",` - margin: var(--n-margin); - z-index: 0; - transform-origin: top center; - display: flex; - `,[hw({overflow:"visible",originalTransition:"transform .3s var(--n-bezier)",enterToProps:{transform:"scale(1)"},leaveToProps:{transform:"scale(0.85)"}})]),Se("message",` - box-sizing: border-box; - display: flex; - align-items: center; - transition: - color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier), - opacity .3s var(--n-bezier), - transform .3s var(--n-bezier), - margin-bottom .3s var(--n-bezier); - padding: var(--n-padding); - border-radius: var(--n-border-radius); - flex-wrap: nowrap; - overflow: hidden; - max-width: var(--n-max-width); - color: var(--n-text-color); - background-color: var(--n-color); - box-shadow: var(--n-box-shadow); - `,[he("content",` - display: inline-block; - line-height: var(--n-line-height); - font-size: var(--n-font-size); - `),he("icon",` - position: relative; - margin: var(--n-icon-margin); - height: var(--n-icon-size); - width: var(--n-icon-size); - font-size: var(--n-icon-size); - flex-shrink: 0; - `,[["default","info","success","warning","error","loading"].map(e=>Ce(`${e}-type`,[ne("> *",` - color: var(--n-icon-color-${e}); - transition: color .3s var(--n-bezier); - `)])),ne("> *",` - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - `,[ya()])]),he("close",` - margin: var(--n-close-margin); - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - flex-shrink: 0; - `,[ne("&:hover",` - color: var(--n-close-icon-color-hover); - `),ne("&:active",` - color: var(--n-close-icon-color-pressed); - `)])]),Se("message-container",` - z-index: 6000; - position: fixed; - height: 0; - overflow: visible; - display: flex; - flex-direction: column; - align-items: center; - `,[Ce("top",` - top: 12px; - left: 0; - right: 0; - `),Ce("top-left",` - top: 12px; - left: 12px; - right: 0; - align-items: flex-start; - `),Ce("top-right",` - top: 12px; - left: 0; - right: 12px; - align-items: flex-end; - `),Ce("bottom",` - bottom: 4px; - left: 0; - right: 0; - justify-content: flex-end; - `),Ce("bottom-left",` - bottom: 4px; - left: 12px; - right: 0; - justify-content: flex-end; - align-items: flex-start; - `),Ce("bottom-right",` - bottom: 4px; - left: 0; - right: 12px; - justify-content: flex-end; - align-items: flex-end; - `)])]),gP={info:()=>H(Ca,null),success:()=>H(hu,null),warning:()=>H(pu,null),error:()=>H(fu,null),default:()=>null},xP=Oe({name:"Message",props:Object.assign(Object.assign({},X1),{render:Function}),setup(e){const{inlineThemeDisabled:t,mergedRtlRef:r}=sr(e),{props:o,mergedClsPrefixRef:n}=Me(Q1),i=yi("Message",r,n),a=Ct("Message","-message",mP,C1,o,n),s=ae(()=>{const{type:c}=e,{common:{cubicBezierEaseInOut:u},self:{padding:d,margin:f,maxWidth:p,iconMargin:h,closeMargin:m,closeSize:v,iconSize:g,fontSize:x,lineHeight:C,borderRadius:b,iconColorInfo:w,iconColorSuccess:T,iconColorWarning:S,iconColorError:E,iconColorLoading:I,closeIconSize:P,closeBorderRadius:$,[_e("textColor",c)]:R,[_e("boxShadow",c)]:B,[_e("color",c)]:j,[_e("closeColorHover",c)]:Y,[_e("closeColorPressed",c)]:J,[_e("closeIconColor",c)]:Q,[_e("closeIconColorPressed",c)]:ie,[_e("closeIconColorHover",c)]:ge}}=a.value;return{"--n-bezier":u,"--n-margin":f,"--n-padding":d,"--n-max-width":p,"--n-font-size":x,"--n-icon-margin":h,"--n-icon-size":g,"--n-close-icon-size":P,"--n-close-border-radius":$,"--n-close-size":v,"--n-close-margin":m,"--n-text-color":R,"--n-color":j,"--n-box-shadow":B,"--n-icon-color-info":w,"--n-icon-color-success":T,"--n-icon-color-warning":S,"--n-icon-color-error":E,"--n-icon-color-loading":I,"--n-close-color-hover":Y,"--n-close-color-pressed":J,"--n-close-icon-color":Q,"--n-close-icon-color-pressed":ie,"--n-close-icon-color-hover":ge,"--n-line-height":C,"--n-border-radius":b}}),l=t?so("message",ae(()=>e.type[0]),s,{}):void 0;return{mergedClsPrefix:n,rtlEnabled:i,messageProviderProps:o,handleClose(){var c;(c=e.onClose)===null||c===void 0||c.call(e)},cssVars:t?void 0:s,themeClass:l==null?void 0:l.themeClass,onRender:l==null?void 0:l.onRender,placement:o.placement}},render(){const{render:e,type:t,closable:r,content:o,mergedClsPrefix:n,cssVars:i,themeClass:a,onRender:s,icon:l,handleClose:c,showIcon:u}=this;s==null||s();let d;return H("div",{class:[`${n}-message-wrapper`,a],onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave,style:[{alignItems:this.placement.startsWith("top")?"flex-start":"flex-end"},i]},e?e(this.$props):H("div",{class:[`${n}-message ${n}-message--${t}-type`,this.rtlEnabled&&`${n}-message--rtl`]},(d=vP(l,t,n))&&u?H("div",{class:`${n}-message__icon ${n}-message__icon--${t}-type`},H(mu,null,{default:()=>d})):null,H("div",{class:`${n}-message__content`},Nt(o)),r?H(Rs,{clsPrefix:n,class:`${n}-message__close`,onClick:c,absolute:!0}):null))}});function vP(e,t,r){if(typeof e=="function")return e();{const o=t==="loading"?H(Zm,{clsPrefix:r,strokeWidth:24,scale:.85}):gP[t]();return o?H(Is,{clsPrefix:r,key:t},{default:()=>o}):null}}const bP=Oe({name:"MessageEnvironment",props:Object.assign(Object.assign({},X1),{duration:{type:Number,default:3e3},onAfterLeave:Function,onLeave:Function,internalKey:{type:String,required:!0},onInternalAfterLeave:Function,onHide:Function,onAfterHide:Function}),setup(e){let t=null;const r=de(!0);Sr(()=>{o()});function o(){const{duration:u}=e;u&&(t=window.setTimeout(a,u))}function n(u){u.currentTarget===u.target&&t!==null&&(window.clearTimeout(t),t=null)}function i(u){u.currentTarget===u.target&&o()}function a(){const{onHide:u}=e;r.value=!1,t&&(window.clearTimeout(t),t=null),u&&u()}function s(){const{onClose:u}=e;u&&u(),a()}function l(){const{onAfterLeave:u,onInternalAfterLeave:d,onAfterHide:f,internalKey:p}=e;u&&u(),d&&d(p),f&&f()}function c(){a()}return{show:r,hide:a,handleClose:s,handleAfterLeave:l,handleMouseleave:i,handleMouseenter:n,deactivate:c}},render(){return H(Km,{appear:!0,onAfterLeave:this.handleAfterLeave,onLeave:this.onLeave},{default:()=>[this.show?H(xP,{content:this.content,type:this.type,icon:this.icon,showIcon:this.showIcon,closable:this.closable,onClose:this.handleClose,onMouseenter:this.keepAliveOnHover?this.handleMouseenter:void 0,onMouseleave:this.keepAliveOnHover?this.handleMouseleave:void 0}):null]})}}),CP=Object.assign(Object.assign({},Ct.props),{to:[String,Object],duration:{type:Number,default:3e3},keepAliveOnHover:Boolean,max:Number,placement:{type:String,default:"top"},closable:Boolean,containerClass:String,containerStyle:[String,Object]}),J1=Oe({name:"MessageProvider",props:CP,setup(e){const{mergedClsPrefixRef:t}=sr(e),r=de([]),o=de({}),n={create(l,c){return i(l,Object.assign({type:"default"},c))},info(l,c){return i(l,Object.assign(Object.assign({},c),{type:"info"}))},success(l,c){return i(l,Object.assign(Object.assign({},c),{type:"success"}))},warning(l,c){return i(l,Object.assign(Object.assign({},c),{type:"warning"}))},error(l,c){return i(l,Object.assign(Object.assign({},c),{type:"error"}))},loading(l,c){return i(l,Object.assign(Object.assign({},c),{type:"loading"}))},destroyAll:s};dt(Q1,{props:e,mergedClsPrefixRef:t}),dt(Y1,n);function i(l,c){const u=ws(),d=Or(Object.assign(Object.assign({},c),{content:l,key:u,destroy:()=>{var p;(p=o.value[u])===null||p===void 0||p.hide()}})),{max:f}=e;return f&&r.value.length>=f&&r.value.shift(),r.value.push(d),d}function a(l){r.value.splice(r.value.findIndex(c=>c.key===l),1),delete o.value[l]}function s(){Object.values(o.value).forEach(l=>{l.hide()})}return Object.assign({mergedClsPrefix:t,messageRefs:o,messageList:r,handleAfterLeave:a},n)},render(){var e,t,r;return H(Je,null,(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e),this.messageList.length?H(vs,{to:(r=this.to)!==null&&r!==void 0?r:"body"},H("div",{class:[`${this.mergedClsPrefix}-message-container`,`${this.mergedClsPrefix}-message-container--${this.placement}`,this.containerClass],key:"message-container",style:this.containerStyle},this.messageList.map(o=>H(bP,Object.assign({ref:n=>{n&&(this.messageRefs[o.key]=n)},internalKey:o.key,onInternalAfterLeave:this.handleAfterLeave},ou(o,["destroy"],void 0),{duration:o.duration===void 0?this.duration:o.duration,keepAliveOnHover:o.keepAliveOnHover===void 0?this.keepAliveOnHover:o.keepAliveOnHover,closable:o.closable===void 0?this.closable:o.closable}))))):null)}});function ex(){const e=Me(Y1,null);return e===null&&vi("use-message","No outer founded. See prerequisite in https://www.naiveui.com/en-US/os-theme/components/message for more details. If you want to use `useMessage` outside setup, please check https://www.naiveui.com/zh-CN/os-theme/components/message#Q-&-A."),e}const Hs="n-notification-provider",yP=Oe({name:"NotificationContainer",props:{scrollable:{type:Boolean,required:!0},placement:{type:String,required:!0}},setup(){const{mergedThemeRef:e,mergedClsPrefixRef:t,wipTransitionCountRef:r}=Me(Hs),o=de(null);return gs(()=>{var n,i;r.value>0?(n=o==null?void 0:o.value)===null||n===void 0||n.classList.add("transitioning"):(i=o==null?void 0:o.value)===null||i===void 0||i.classList.remove("transitioning")}),{selfRef:o,mergedTheme:e,mergedClsPrefix:t,transitioning:r}},render(){const{$slots:e,scrollable:t,mergedClsPrefix:r,mergedTheme:o,placement:n}=this;return H("div",{ref:"selfRef",class:[`${r}-notification-container`,t&&`${r}-notification-container--scrollable`,`${r}-notification-container--${n}`]},t?H(tg,{theme:o.peers.Scrollbar,themeOverrides:o.peerOverrides.Scrollbar,contentStyle:{overflow:"hidden"}},e):e)}}),SP={info:()=>H(Ca,null),success:()=>H(hu,null),warning:()=>H(pu,null),error:()=>H(fu,null),default:()=>null},Tu={closable:{type:Boolean,default:!0},type:{type:String,default:"default"},avatar:Function,title:[String,Function],description:[String,Function],content:[String,Function],meta:[String,Function],action:[String,Function],onClose:{type:Function,required:!0},keepAliveOnHover:Boolean,onMouseenter:Function,onMouseleave:Function},wP=_s(Tu),_P=Oe({name:"Notification",props:Tu,setup(e){const{mergedClsPrefixRef:t,mergedThemeRef:r,props:o}=Me(Hs),{inlineThemeDisabled:n,mergedRtlRef:i}=sr(),a=yi("Notification",i,t),s=ae(()=>{const{type:c}=e,{self:{color:u,textColor:d,closeIconColor:f,closeIconColorHover:p,closeIconColorPressed:h,headerTextColor:m,descriptionTextColor:v,actionTextColor:g,borderRadius:x,headerFontWeight:C,boxShadow:b,lineHeight:w,fontSize:T,closeMargin:S,closeSize:E,width:I,padding:P,closeIconSize:$,closeBorderRadius:R,closeColorHover:B,closeColorPressed:j,titleFontSize:Y,metaFontSize:J,descriptionFontSize:Q,[_e("iconColor",c)]:ie},common:{cubicBezierEaseOut:ge,cubicBezierEaseIn:ve,cubicBezierEaseInOut:z}}=r.value,{left:W,right:Z,top:V,bottom:D}=Zp(P);return{"--n-color":u,"--n-font-size":T,"--n-text-color":d,"--n-description-text-color":v,"--n-action-text-color":g,"--n-title-text-color":m,"--n-title-font-weight":C,"--n-bezier":z,"--n-bezier-ease-out":ge,"--n-bezier-ease-in":ve,"--n-border-radius":x,"--n-box-shadow":b,"--n-close-border-radius":R,"--n-close-color-hover":B,"--n-close-color-pressed":j,"--n-close-icon-color":f,"--n-close-icon-color-hover":p,"--n-close-icon-color-pressed":h,"--n-line-height":w,"--n-icon-color":ie,"--n-close-margin":S,"--n-close-size":E,"--n-close-icon-size":$,"--n-width":I,"--n-padding-left":W,"--n-padding-right":Z,"--n-padding-top":V,"--n-padding-bottom":D,"--n-title-font-size":Y,"--n-meta-font-size":J,"--n-description-font-size":Q}}),l=n?so("notification",ae(()=>e.type[0]),s,o):void 0;return{mergedClsPrefix:t,showAvatar:ae(()=>e.avatar||e.type!=="default"),handleCloseClick(){e.onClose()},rtlEnabled:a,cssVars:n?void 0:s,themeClass:l==null?void 0:l.themeClass,onRender:l==null?void 0:l.onRender}},render(){var e;const{mergedClsPrefix:t}=this;return(e=this.onRender)===null||e===void 0||e.call(this),H("div",{class:[`${t}-notification-wrapper`,this.themeClass],onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave,style:this.cssVars},H("div",{class:[`${t}-notification`,this.rtlEnabled&&`${t}-notification--rtl`,this.themeClass,{[`${t}-notification--closable`]:this.closable,[`${t}-notification--show-avatar`]:this.showAvatar}],style:this.cssVars},this.showAvatar?H("div",{class:`${t}-notification__avatar`},this.avatar?Nt(this.avatar):this.type!=="default"?H(Is,{clsPrefix:t},{default:()=>SP[this.type]()}):null):null,this.closable?H(Rs,{clsPrefix:t,class:`${t}-notification__close`,onClick:this.handleCloseClick}):null,H("div",{ref:"bodyRef",class:`${t}-notification-main`},this.title?H("div",{class:`${t}-notification-main__header`},Nt(this.title)):null,this.description?H("div",{class:`${t}-notification-main__description`},Nt(this.description)):null,this.content?H("pre",{class:`${t}-notification-main__content`},Nt(this.content)):null,this.meta||this.action?H("div",{class:`${t}-notification-main-footer`},this.meta?H("div",{class:`${t}-notification-main-footer__meta`},Nt(this.meta)):null,this.action?H("div",{class:`${t}-notification-main-footer__action`},Nt(this.action)):null):null)))}}),TP=Object.assign(Object.assign({},Tu),{duration:Number,onClose:Function,onLeave:Function,onAfterEnter:Function,onAfterLeave:Function,onHide:Function,onAfterShow:Function,onAfterHide:Function}),EP=Oe({name:"NotificationEnvironment",props:Object.assign(Object.assign({},TP),{internalKey:{type:String,required:!0},onInternalAfterLeave:{type:Function,required:!0}}),setup(e){const{wipTransitionCountRef:t}=Me(Hs),r=de(!0);let o=null;function n(){r.value=!1,o&&window.clearTimeout(o)}function i(h){t.value++,jt(()=>{h.style.height=`${h.offsetHeight}px`,h.style.maxHeight="0",h.style.transition="none",h.offsetHeight,h.style.transition="",h.style.maxHeight=h.style.height})}function a(h){t.value--,h.style.height="",h.style.maxHeight="";const{onAfterEnter:m,onAfterShow:v}=e;m&&m(),v&&v()}function s(h){t.value++,h.style.maxHeight=`${h.offsetHeight}px`,h.style.height=`${h.offsetHeight}px`,h.offsetHeight}function l(h){const{onHide:m}=e;m&&m(),h.style.maxHeight="0",h.offsetHeight}function c(){t.value--;const{onAfterLeave:h,onInternalAfterLeave:m,onAfterHide:v,internalKey:g}=e;h&&h(),m(g),v&&v()}function u(){const{duration:h}=e;h&&(o=window.setTimeout(n,h))}function d(h){h.currentTarget===h.target&&o!==null&&(window.clearTimeout(o),o=null)}function f(h){h.currentTarget===h.target&&u()}function p(){const{onClose:h}=e;h?Promise.resolve(h()).then(m=>{m!==!1&&n()}):n()}return Sr(()=>{e.duration&&(o=window.setTimeout(n,e.duration))}),{show:r,hide:n,handleClose:p,handleAfterLeave:c,handleLeave:l,handleBeforeLeave:s,handleAfterEnter:a,handleBeforeEnter:i,handleMouseenter:d,handleMouseleave:f}},render(){return H(br,{name:"notification-transition",appear:!0,onBeforeEnter:this.handleBeforeEnter,onAfterEnter:this.handleAfterEnter,onBeforeLeave:this.handleBeforeLeave,onLeave:this.handleLeave,onAfterLeave:this.handleAfterLeave},{default:()=>this.show?H(_P,Object.assign({},ri(this.$props,wP),{onClose:this.handleClose,onMouseenter:this.duration&&this.keepAliveOnHover?this.handleMouseenter:void 0,onMouseleave:this.duration&&this.keepAliveOnHover?this.handleMouseleave:void 0})):null})}}),PP=ne([Se("notification-container",` - z-index: 4000; - position: fixed; - overflow: visible; - display: flex; - flex-direction: column; - align-items: flex-end; - `,[ne(">",[Se("scrollbar",` - width: initial; - overflow: visible; - height: -moz-fit-content !important; - height: fit-content !important; - max-height: 100vh !important; - `,[ne(">",[Se("scrollbar-container",` - height: -moz-fit-content !important; - height: fit-content !important; - max-height: 100vh !important; - `,[Se("scrollbar-content",` - padding-top: 12px; - padding-bottom: 33px; - `)])])])]),Ce("top, top-right, top-left",` - top: 12px; - `,[ne("&.transitioning >",[Se("scrollbar",[ne(">",[Se("scrollbar-container",` - min-height: 100vh !important; - `)])])])]),Ce("bottom, bottom-right, bottom-left",` - bottom: 12px; - `,[ne(">",[Se("scrollbar",[ne(">",[Se("scrollbar-container",[Se("scrollbar-content",` - padding-bottom: 12px; - `)])])])]),Se("notification-wrapper",` - display: flex; - align-items: flex-end; - margin-bottom: 0; - margin-top: 12px; - `)]),Ce("top, bottom",` - left: 50%; - transform: translateX(-50%); - `,[Se("notification-wrapper",[ne("&.notification-transition-enter-from, &.notification-transition-leave-to",` - transform: scale(0.85); - `),ne("&.notification-transition-leave-from, &.notification-transition-enter-to",` - transform: scale(1); - `)])]),Ce("top",[Se("notification-wrapper",` - transform-origin: top center; - `)]),Ce("bottom",[Se("notification-wrapper",` - transform-origin: bottom center; - `)]),Ce("top-right, bottom-right",[Se("notification",` - margin-left: 28px; - margin-right: 16px; - `)]),Ce("top-left, bottom-left",[Se("notification",` - margin-left: 16px; - margin-right: 28px; - `)]),Ce("top-right",` - right: 0; - `,[qi("top-right")]),Ce("top-left",` - left: 0; - `,[qi("top-left")]),Ce("bottom-right",` - right: 0; - `,[qi("bottom-right")]),Ce("bottom-left",` - left: 0; - `,[qi("bottom-left")]),Ce("scrollable",[Ce("top-right",` - top: 0; - `),Ce("top-left",` - top: 0; - `),Ce("bottom-right",` - bottom: 0; - `),Ce("bottom-left",` - bottom: 0; - `)]),Se("notification-wrapper",` - margin-bottom: 12px; - `,[ne("&.notification-transition-enter-from, &.notification-transition-leave-to",` - opacity: 0; - margin-top: 0 !important; - margin-bottom: 0 !important; - `),ne("&.notification-transition-leave-from, &.notification-transition-enter-to",` - opacity: 1; - `),ne("&.notification-transition-leave-active",` - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier), - opacity .3s var(--n-bezier), - transform .3s var(--n-bezier-ease-in), - max-height .3s var(--n-bezier), - margin-top .3s linear, - margin-bottom .3s linear, - box-shadow .3s var(--n-bezier); - `),ne("&.notification-transition-enter-active",` - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier), - opacity .3s var(--n-bezier), - transform .3s var(--n-bezier-ease-out), - max-height .3s var(--n-bezier), - margin-top .3s linear, - margin-bottom .3s linear, - box-shadow .3s var(--n-bezier); - `)]),Se("notification",` - background-color: var(--n-color); - color: var(--n-text-color); - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier), - opacity .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); - font-family: inherit; - font-size: var(--n-font-size); - font-weight: 400; - position: relative; - display: flex; - overflow: hidden; - flex-shrink: 0; - padding-left: var(--n-padding-left); - padding-right: var(--n-padding-right); - width: var(--n-width); - border-radius: var(--n-border-radius); - box-shadow: var(--n-box-shadow); - box-sizing: border-box; - opacity: 1; - `,[he("avatar",[Se("icon",{color:"var(--n-icon-color)"}),Se("base-icon",{color:"var(--n-icon-color)"})]),Ce("show-avatar",[Se("notification-main",` - margin-left: 40px; - width: calc(100% - 40px); - `)]),Ce("closable",[Se("notification-main",[ne("> *:first-child",{paddingRight:"20px"})]),he("close",` - position: absolute; - top: 0; - right: 0; - margin: var(--n-close-margin); - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - `)]),he("avatar",` - position: absolute; - top: var(--n-padding-top); - left: var(--n-padding-left); - width: 28px; - height: 28px; - font-size: 28px; - display: flex; - align-items: center; - justify-content: center; - `,[Se("icon","transition: color .3s var(--n-bezier);")]),Se("notification-main",` - padding-top: var(--n-padding-top); - padding-bottom: var(--n-padding-bottom); - box-sizing: border-box; - display: flex; - flex-direction: column; - margin-left: 8px; - width: calc(100% - 8px); - `,[Se("notification-main-footer",` - display: flex; - align-items: center; - justify-content: space-between; - margin-top: 12px; - `,[he("meta",` - font-size: var(--n-meta-font-size); - transition: color .3s var(--n-bezier-ease-out); - color: var(--n-description-text-color); - `),he("action",` - cursor: pointer; - transition: color .3s var(--n-bezier-ease-out); - color: var(--n-action-text-color); - `)]),he("header",` - font-weight: var(--n-title-font-weight); - font-size: var(--n-title-font-size); - transition: color .3s var(--n-bezier-ease-out); - color: var(--n-title-text-color); - `),he("description",` - margin-top: 8px; - font-size: var(--n-description-font-size); - white-space: pre-wrap; - word-wrap: break-word; - transition: color .3s var(--n-bezier-ease-out); - color: var(--n-description-text-color); - `),he("content",` - line-height: var(--n-line-height); - margin: 12px 0 0 0; - font-family: inherit; - white-space: pre-wrap; - word-wrap: break-word; - transition: color .3s var(--n-bezier-ease-out); - color: var(--n-text-color); - `,[ne("&:first-child",{margin:0})])])])])]);function qi(e){const r=e.split("-")[1]==="left"?"calc(-100%)":"calc(100%)",o="0";return Se("notification-wrapper",[ne("&.notification-transition-enter-from, &.notification-transition-leave-to",` - transform: translate(${r}, 0); - `),ne("&.notification-transition-leave-from, &.notification-transition-enter-to",` - transform: translate(${o}, 0); - `)])}const tx="n-notification-api",kP=Object.assign(Object.assign({},Ct.props),{containerClass:String,containerStyle:[String,Object],to:[String,Object],scrollable:{type:Boolean,default:!0},max:Number,placement:{type:String,default:"top-right"},keepAliveOnHover:Boolean}),rx=Oe({name:"NotificationProvider",props:kP,setup(e){const{mergedClsPrefixRef:t}=sr(e),r=de([]),o={},n=new Set;function i(p){const h=ws(),m=()=>{n.add(h),o[h]&&o[h].hide()},v=Or(Object.assign(Object.assign({},p),{key:h,destroy:m,hide:m,deactivate:m})),{max:g}=e;if(g&&r.value.length-n.size>=g){let x=!1,C=0;for(const b of r.value){if(!n.has(b.key)){o[b.key]&&(b.destroy(),x=!0);break}C++}x||r.value.splice(C,1)}return r.value.push(v),v}const a=["info","success","warning","error"].map(p=>h=>i(Object.assign(Object.assign({},h),{type:p})));function s(p){n.delete(p),r.value.splice(r.value.findIndex(h=>h.key===p),1)}const l=Ct("Notification","-notification",PP,v1,e,t),c={create:i,info:a[0],success:a[1],warning:a[2],error:a[3],open:d,destroyAll:f},u=de(0);dt(tx,c),dt(Hs,{props:e,mergedClsPrefixRef:t,mergedThemeRef:l,wipTransitionCountRef:u});function d(p){return i(p)}function f(){Object.values(r.value).forEach(p=>{p.hide()})}return Object.assign({mergedClsPrefix:t,notificationList:r,notificationRefs:o,handleAfterLeave:s},c)},render(){var e,t,r;const{placement:o}=this;return H(Je,null,(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e),this.notificationList.length?H(vs,{to:(r=this.to)!==null&&r!==void 0?r:"body"},H(yP,{class:this.containerClass,style:this.containerStyle,scrollable:this.scrollable&&o!=="top"&&o!=="bottom",placement:o},{default:()=>this.notificationList.map(n=>H(EP,Object.assign({ref:i=>{const a=n.key;i===null?delete this.notificationRefs[a]:this.notificationRefs[a]=i}},ou(n,["destroy","hide","deactivate"]),{internalKey:n.key,onInternalAfterLeave:this.handleAfterLeave,keepAliveOnHover:n.keepAliveOnHover===void 0?this.keepAliveOnHover:n.keepAliveOnHover})))})):null)}});function ox(){const e=Me(tx,null);return e===null&&vi("use-notification","No outer `n-notification-provider` found."),e}const LP={name:"QrCode",common:se,self:e=>({borderRadius:e.borderRadius})},$P=LP,IP=e=>({borderRadius:e.borderRadius}),RP={name:"QrCode",common:le,self:IP},AP=RP,OP={name:"Skeleton",common:se,self(e){const{heightSmall:t,heightMedium:r,heightLarge:o,borderRadius:n}=e;return{color:"rgba(255, 255, 255, 0.12)",colorEnd:"rgba(255, 255, 255, 0.18)",borderRadius:n,heightSmall:t,heightMedium:r,heightLarge:o}}},BP=e=>{const{heightSmall:t,heightMedium:r,heightLarge:o,borderRadius:n}=e;return{color:"#eee",colorEnd:"#ddd",borderRadius:n,heightSmall:t,heightMedium:r,heightLarge:o}},HP={name:"Skeleton",common:le,self:BP},MP={name:"Split",common:se},DP=MP,FP=e=>{const{primaryColorHover:t}=e;return{resizableTriggerColorHover:t}},zP={name:"Split",common:le,self:FP},NP=zP,WP=Oe({name:"InjectionExtractor",props:{onSetup:Function},setup(e,{slots:t}){var r;return(r=e.onSetup)===null||r===void 0||r.call(e),()=>{var o;return(o=t.default)===null||o===void 0?void 0:o.call(t)}}}),jP={message:ex,notification:ox,loadingBar:Z1,dialog:l1};function UP({providersAndProps:e,configProviderProps:t}){let o=Kp(()=>H($g,pt(t),{default:()=>e.map(({type:s,Provider:l,props:c})=>H(l,pt(c),{default:()=>H(WP,{onSetup:()=>n[s]=jP[s]()})}))}));const n={app:o};let i;return dn&&(i=document.createElement("div"),document.body.appendChild(i),o.mount(i)),Object.assign({unmount:()=>{var s;if(o===null||i===null){oi("discrete","unmount call no need because discrete app has been unmounted");return}o.unmount(),(s=i.parentNode)===null||s===void 0||s.removeChild(i),i=null,o=null}},n)}function VP(e,{configProviderProps:t,messageProviderProps:r,dialogProviderProps:o,notificationProviderProps:n,loadingBarProviderProps:i}={}){const a=[];return e.forEach(l=>{switch(l){case"message":a.push({type:l,Provider:J1,props:r});break;case"notification":a.push({type:l,Provider:rx,props:n});break;case"dialog":a.push({type:l,Provider:s1,props:o});break;case"loadingBar":a.push({type:l,Provider:K1,props:i});break}}),UP({providersAndProps:a,configProviderProps:t})}const nx=()=>({}),qP={name:"Equation",common:le,self:nx},GP=qP,KP={name:"Equation",common:se,self:nx},ZP=KP,zn={name:"dark",common:se,Alert:sw,Anchor:vw,AutoComplete:Pw,Avatar:pg,AvatarGroup:Aw,BackTop:Bw,Badge:zw,Breadcrumb:Kw,Button:Dt,ButtonGroup:N6,Calendar:a_,Card:Sg,Carousel:y_,Cascader:k_,Checkbox:xn,Code:Eg,Collapse:B_,CollapseTransition:F_,ColorPicker:u_,DataTable:u5,DatePicker:S5,Descriptions:k5,Dialog:e1,Divider:Z5,Drawer:J5,Dropdown:Su,DynamicInput:t6,DynamicTags:c6,Element:h6,Empty:Bo,Ellipsis:zg,Equation:ZP,Form:C6,GradientText:S6,Icon:p5,IconWrapper:L6,Image:aP,Input:Xt,InputNumber:V6,LegacyTransfer:lP,Layout:X6,List:oT,LoadingBar:iT,Log:cT,Menu:ST,Mention:pT,Message:F6,Modal:M5,Notification:B6,PageHeader:TT,Pagination:Dg,Popconfirm:$T,Popover:Mo,Popselect:Ig,Progress:k1,QrCode:$P,Radio:jg,Rate:OT,Result:WT,Row:iP,Scrollbar:Mt,Select:Bg,Skeleton:OP,Slider:UT,Space:h1,Spin:YT,Statistic:tE,Steps:aE,Switch:lE,Table:gE,Tabs:yE,Tag:ig,Thing:TE,TimePicker:Xg,Timeline:PE,Tooltip:As,Transfer:RE,Tree:W1,TreeSelect:FE,Typography:GE,Upload:YE,Watermark:JE,Split:DP},ta={name:"light",common:le,Alert:uw,Anchor:gw,AutoComplete:Tw,Avatar:hg,AvatarGroup:Iw,BackTop:Dw,Badge:jw,Breadcrumb:qw,Button:It,ButtonGroup:j6,Calendar:n_,Card:bu,Carousel:b_,Cascader:E_,Checkbox:gn,Code:Pg,Collapse:A_,CollapseTransition:M_,ColorPicker:l_,DataTable:l5,DatePicker:C5,Descriptions:E5,Dialog:wu,Divider:G5,Drawer:Y5,Dropdown:yu,DynamicInput:n6,DynamicTags:d6,Element:m6,Empty:Dr,Equation:GP,Ellipsis:Ng,Form:v6,GradientText:T6,Icon:f5,IconWrapper:P6,Image:I6,Input:Yt,InputNumber:K6,Layout:J6,LegacyTransfer:dP,List:tT,LoadingBar:S1,Log:fT,Menu:CT,Mention:xT,Message:C1,Modal:a1,Notification:v1,PageHeader:_T,Pagination:Mg,Popconfirm:kT,Popover:Ho,Popselect:Rg,Progress:P1,QrCode:AP,Radio:Ug,Rate:MT,Row:oP,Result:zT,Scrollbar:$t,Skeleton:HP,Select:Og,Slider:GT,Space:p1,Spin:ZT,Statistic:JT,Steps:nE,Switch:dE,Table:pE,Tabs:bE,Tag:ag,Thing:wE,TimePicker:Zg,Timeline:$E,Tooltip:Os,Transfer:BE,Tree:N1,TreeSelect:WE,Typography:VE,Upload:ZE,Watermark:tP,Split:NP};function XP(e){return e.replace(/:/g,"-")}const tH=Oe({name:"SvgIcon",props:{icon:{type:String,required:!0},className:{type:String,default:""}},setup(e){const t=ae(()=>`#${XP(e.icon)}`),r=ae(()=>e.className?`svg-icon ${e.className}`:"svg-icon");return{symbolId:t,svgClass:r}}});const YP=Oe({__name:"index",setup(e){function t(){window.$loadingBar=Z1(),window.$dialog=l1(),window.$message=ex(),window.$notification=ox()}const r=Oe({name:"NaiveProviderContent",setup(){t()},render(){return H("div")}});return(o,n)=>(bs(),Cs(pt(K1),null,{default:Co(()=>[qe(pt(s1),null,{default:Co(()=>[qe(pt(rx),null,{default:Co(()=>[qe(pt(J1),null,{default:Co(()=>[Tp(o.$slots,"default"),qe(pt(r))]),_:3})]),_:3})]),_:3})]),_:3}))}}),Nn=/^[a-z0-9]+(-[a-z0-9]+)*$/,Ms=(e,t,r,o="")=>{const n=e.split(":");if(e.slice(0,1)==="@"){if(n.length<2||n.length>3)return null;o=n.shift().slice(1)}if(n.length>3||!n.length)return null;if(n.length>1){const s=n.pop(),l=n.pop(),c={provider:n.length>0?n[0]:o,prefix:l,name:s};return t&&!ra(c)?null:c}const i=n[0],a=i.split("-");if(a.length>1){const s={provider:o,prefix:a.shift(),name:a.join("-")};return t&&!ra(s)?null:s}if(r&&o===""){const s={provider:o,prefix:"",name:i};return t&&!ra(s,r)?null:s}return null},ra=(e,t)=>e?!!((e.provider===""||e.provider.match(Nn))&&(t&&e.prefix===""||e.prefix.match(Nn))&&e.name.match(Nn)):!1,ix=Object.freeze({left:0,top:0,width:16,height:16}),Sa=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),Ds=Object.freeze({...ix,...Sa}),Yl=Object.freeze({...Ds,body:"",hidden:!1});function QP(e,t){const r={};!e.hFlip!=!t.hFlip&&(r.hFlip=!0),!e.vFlip!=!t.vFlip&&(r.vFlip=!0);const o=((e.rotate||0)+(t.rotate||0))%4;return o&&(r.rotate=o),r}function zd(e,t){const r=QP(e,t);for(const o in Yl)o in Sa?o in e&&!(o in r)&&(r[o]=Sa[o]):o in t?r[o]=t[o]:o in e&&(r[o]=e[o]);return r}function JP(e,t){const r=e.icons,o=e.aliases||Object.create(null),n=Object.create(null);function i(a){if(r[a])return n[a]=[];if(!(a in n)){n[a]=null;const s=o[a]&&o[a].parent,l=s&&i(s);l&&(n[a]=[s].concat(l))}return n[a]}return(t||Object.keys(r).concat(Object.keys(o))).forEach(i),n}function ek(e,t,r){const o=e.icons,n=e.aliases||Object.create(null);let i={};function a(s){i=zd(o[s]||n[s],i)}return a(t),r.forEach(a),zd(e,i)}function ax(e,t){const r=[];if(typeof e!="object"||typeof e.icons!="object")return r;e.not_found instanceof Array&&e.not_found.forEach(n=>{t(n,null),r.push(n)});const o=JP(e);for(const n in o){const i=o[n];i&&(t(n,ek(e,n,i)),r.push(n))}return r}const tk={provider:"",aliases:{},not_found:{},...ix};function pl(e,t){for(const r in t)if(r in e&&typeof e[r]!=typeof t[r])return!1;return!0}function sx(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!pl(e,tk))return null;const r=t.icons;for(const n in r){const i=r[n];if(!n.match(Nn)||typeof i.body!="string"||!pl(i,Yl))return null}const o=t.aliases||Object.create(null);for(const n in o){const i=o[n],a=i.parent;if(!n.match(Nn)||typeof a!="string"||!r[a]&&!o[a]||!pl(i,Yl))return null}return t}const Nd=Object.create(null);function rk(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Ro(e,t){const r=Nd[e]||(Nd[e]=Object.create(null));return r[t]||(r[t]=rk(e,t))}function Eu(e,t){return sx(t)?ax(t,(r,o)=>{o?e.icons[r]=o:e.missing.add(r)}):[]}function ok(e,t,r){try{if(typeof r.body=="string")return e.icons[t]={...r},!0}catch{}return!1}let ui=!1;function lx(e){return typeof e=="boolean"&&(ui=e),ui}function nk(e){const t=typeof e=="string"?Ms(e,!0,ui):e;if(t){const r=Ro(t.provider,t.prefix),o=t.name;return r.icons[o]||(r.missing.has(o)?null:void 0)}}function ik(e,t){const r=Ms(e,!0,ui);if(!r)return!1;const o=Ro(r.provider,r.prefix);return ok(o,r.name,t)}function ak(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ui&&!t&&!e.prefix){let n=!1;return sx(e)&&(e.prefix="",ax(e,(i,a)=>{a&&ik(i,a)&&(n=!0)})),n}const r=e.prefix;if(!ra({provider:t,prefix:r,name:"a"}))return!1;const o=Ro(t,r);return!!Eu(o,e)}const cx=Object.freeze({width:null,height:null}),ux=Object.freeze({...cx,...Sa}),sk=/(-?[0-9.]*[0-9]+[0-9.]*)/g,lk=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function Wd(e,t,r){if(t===1)return e;if(r=r||100,typeof e=="number")return Math.ceil(e*t*r)/r;if(typeof e!="string")return e;const o=e.split(sk);if(o===null||!o.length)return e;const n=[];let i=o.shift(),a=lk.test(i);for(;;){if(a){const s=parseFloat(i);isNaN(s)?n.push(i):n.push(Math.ceil(s*t*r)/r)}else n.push(i);if(i=o.shift(),i===void 0)return n.join("");a=!a}}const ck=e=>e==="unset"||e==="undefined"||e==="none";function uk(e,t){const r={...Ds,...e},o={...ux,...t},n={left:r.left,top:r.top,width:r.width,height:r.height};let i=r.body;[r,o].forEach(h=>{const m=[],v=h.hFlip,g=h.vFlip;let x=h.rotate;v?g?x+=2:(m.push("translate("+(n.width+n.left).toString()+" "+(0-n.top).toString()+")"),m.push("scale(-1 1)"),n.top=n.left=0):g&&(m.push("translate("+(0-n.left).toString()+" "+(n.height+n.top).toString()+")"),m.push("scale(1 -1)"),n.top=n.left=0);let C;switch(x<0&&(x-=Math.floor(x/4)*4),x=x%4,x){case 1:C=n.height/2+n.top,m.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:m.unshift("rotate(180 "+(n.width/2+n.left).toString()+" "+(n.height/2+n.top).toString()+")");break;case 3:C=n.width/2+n.left,m.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}x%2===1&&(n.left!==n.top&&(C=n.left,n.left=n.top,n.top=C),n.width!==n.height&&(C=n.width,n.width=n.height,n.height=C)),m.length&&(i=''+i+"")});const a=o.width,s=o.height,l=n.width,c=n.height;let u,d;a===null?(d=s===null?"1em":s==="auto"?c:s,u=Wd(d,l/c)):(u=a==="auto"?l:a,d=s===null?Wd(u,c/l):s==="auto"?c:s);const f={},p=(h,m)=>{ck(m)||(f[h]=m.toString())};return p("width",u),p("height",d),f.viewBox=n.left.toString()+" "+n.top.toString()+" "+l.toString()+" "+c.toString(),{attributes:f,body:i}}const dk=/\sid="(\S+)"/g,fk="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let hk=0;function pk(e,t=fk){const r=[];let o;for(;o=dk.exec(e);)r.push(o[1]);if(!r.length)return e;const n="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(i=>{const a=typeof t=="function"?t(i):t+(hk++).toString(),s=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+s+')([")]|\\.[a-z])',"g"),"$1"+a+n+"$3")}),e=e.replace(new RegExp(n,"g"),""),e}const Ql=Object.create(null);function mk(e,t){Ql[e]=t}function Jl(e){return Ql[e]||Ql[""]}function Pu(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ku=Object.create(null),En=["https://api.simplesvg.com","https://api.unisvg.com"],oa=[];for(;En.length>0;)En.length===1||Math.random()>.5?oa.push(En.shift()):oa.push(En.pop());ku[""]=Pu({resources:["https://api.iconify.design"].concat(oa)});function gk(e,t){const r=Pu(t);return r===null?!1:(ku[e]=r,!0)}function Lu(e){return ku[e]}const xk=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let jd=xk();function vk(e,t){const r=Lu(e);if(!r)return 0;let o;if(!r.maxURL)o=0;else{let n=0;r.resources.forEach(a=>{n=Math.max(n,a.length)});const i=t+".json?icons=";o=r.maxURL-n-r.path.length-i.length}return o}function bk(e){return e===404}const Ck=(e,t,r)=>{const o=[],n=vk(e,t),i="icons";let a={type:i,provider:e,prefix:t,icons:[]},s=0;return r.forEach((l,c)=>{s+=l.length+1,s>=n&&c>0&&(o.push(a),a={type:i,provider:e,prefix:t,icons:[]},s=l.length),a.icons.push(l)}),o.push(a),o};function yk(e){if(typeof e=="string"){const t=Lu(e);if(t)return t.path}return"/"}const Sk=(e,t,r)=>{if(!jd){r("abort",424);return}let o=yk(t.provider);switch(t.type){case"icons":{const i=t.prefix,s=t.icons.join(","),l=new URLSearchParams({icons:s});o+=i+".json?"+l.toString();break}case"custom":{const i=t.uri;o+=i.slice(0,1)==="/"?i.slice(1):i;break}default:r("abort",400);return}let n=503;jd(e+o).then(i=>{const a=i.status;if(a!==200){setTimeout(()=>{r(bk(a)?"abort":"next",a)});return}return n=501,i.json()}).then(i=>{if(typeof i!="object"||i===null){setTimeout(()=>{i===404?r("abort",i):r("next",n)});return}setTimeout(()=>{r("success",i)})}).catch(()=>{r("next",n)})},wk={prepare:Ck,send:Sk};function _k(e){const t={loaded:[],missing:[],pending:[]},r=Object.create(null);e.sort((n,i)=>n.provider!==i.provider?n.provider.localeCompare(i.provider):n.prefix!==i.prefix?n.prefix.localeCompare(i.prefix):n.name.localeCompare(i.name));let o={provider:"",prefix:"",name:""};return e.forEach(n=>{if(o.name===n.name&&o.prefix===n.prefix&&o.provider===n.provider)return;o=n;const i=n.provider,a=n.prefix,s=n.name,l=r[i]||(r[i]=Object.create(null)),c=l[a]||(l[a]=Ro(i,a));let u;s in c.icons?u=t.loaded:a===""||c.missing.has(s)?u=t.missing:u=t.pending;const d={provider:i,prefix:a,name:s};u.push(d)}),t}function dx(e,t){e.forEach(r=>{const o=r.loaderCallbacks;o&&(r.loaderCallbacks=o.filter(n=>n.id!==t))})}function Tk(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let r=!1;const o=e.provider,n=e.prefix;t.forEach(i=>{const a=i.icons,s=a.pending.length;a.pending=a.pending.filter(l=>{if(l.prefix!==n)return!0;const c=l.name;if(e.icons[c])a.loaded.push({provider:o,prefix:n,name:c});else if(e.missing.has(c))a.missing.push({provider:o,prefix:n,name:c});else return r=!0,!0;return!1}),a.pending.length!==s&&(r||dx([e],i.id),i.callback(a.loaded.slice(0),a.missing.slice(0),a.pending.slice(0),i.abort))})}))}let Ek=0;function Pk(e,t,r){const o=Ek++,n=dx.bind(null,r,o);if(!t.pending.length)return n;const i={id:o,icons:t,callback:e,abort:n};return r.forEach(a=>{(a.loaderCallbacks||(a.loaderCallbacks=[])).push(i)}),n}function kk(e,t=!0,r=!1){const o=[];return e.forEach(n=>{const i=typeof n=="string"?Ms(n,t,r):n;i&&o.push(i)}),o}var Lk={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function $k(e,t,r,o){const n=e.resources.length,i=e.random?Math.floor(Math.random()*n):e.index;let a;if(e.random){let T=e.resources.slice(0);for(a=[];T.length>1;){const S=Math.floor(Math.random()*T.length);a.push(T[S]),T=T.slice(0,S).concat(T.slice(S+1))}a=a.concat(T)}else a=e.resources.slice(i).concat(e.resources.slice(0,i));const s=Date.now();let l="pending",c=0,u,d=null,f=[],p=[];typeof o=="function"&&p.push(o);function h(){d&&(clearTimeout(d),d=null)}function m(){l==="pending"&&(l="aborted"),h(),f.forEach(T=>{T.status==="pending"&&(T.status="aborted")}),f=[]}function v(T,S){S&&(p=[]),typeof T=="function"&&p.push(T)}function g(){return{startTime:s,payload:t,status:l,queriesSent:c,queriesPending:f.length,subscribe:v,abort:m}}function x(){l="failed",p.forEach(T=>{T(void 0,u)})}function C(){f.forEach(T=>{T.status==="pending"&&(T.status="aborted")}),f=[]}function b(T,S,E){const I=S!=="success";switch(f=f.filter(P=>P!==T),l){case"pending":break;case"failed":if(I||!e.dataAfterTimeout)return;break;default:return}if(S==="abort"){u=E,x();return}if(I){u=E,f.length||(a.length?w():x());return}if(h(),C(),!e.random){const P=e.resources.indexOf(T.resource);P!==-1&&P!==e.index&&(e.index=P)}l="completed",p.forEach(P=>{P(E)})}function w(){if(l!=="pending")return;h();const T=a.shift();if(T===void 0){if(f.length){d=setTimeout(()=>{h(),l==="pending"&&(C(),x())},e.timeout);return}x();return}const S={status:"pending",resource:T,callback:(E,I)=>{b(S,E,I)}};f.push(S),c++,d=setTimeout(w,e.rotate),r(T,t,S.callback)}return setTimeout(w),g}function fx(e){const t={...Lk,...e};let r=[];function o(){r=r.filter(s=>s().status==="pending")}function n(s,l,c){const u=$k(t,s,l,(d,f)=>{o(),c&&c(d,f)});return r.push(u),u}function i(s){return r.find(l=>s(l))||null}return{query:n,find:i,setIndex:s=>{t.index=s},getIndex:()=>t.index,cleanup:o}}function Ud(){}const ml=Object.create(null);function Ik(e){if(!ml[e]){const t=Lu(e);if(!t)return;const r=fx(t),o={config:t,redundancy:r};ml[e]=o}return ml[e]}function Rk(e,t,r){let o,n;if(typeof e=="string"){const i=Jl(e);if(!i)return r(void 0,424),Ud;n=i.send;const a=Ik(e);a&&(o=a.redundancy)}else{const i=Pu(e);if(i){o=fx(i);const a=e.resources?e.resources[0]:"",s=Jl(a);s&&(n=s.send)}}return!o||!n?(r(void 0,424),Ud):o.query(t,n,r)().abort}const Vd="iconify2",di="iconify",hx=di+"-count",qd=di+"-version",px=36e5,Ak=168;function ec(e,t){try{return e.getItem(t)}catch{}}function $u(e,t,r){try{return e.setItem(t,r),!0}catch{}}function Gd(e,t){try{e.removeItem(t)}catch{}}function tc(e,t){return $u(e,hx,t.toString())}function rc(e){return parseInt(ec(e,hx))||0}const Fs={local:!0,session:!0},mx={local:new Set,session:new Set};let Iu=!1;function Ok(e){Iu=e}let Gi=typeof window>"u"?{}:window;function gx(e){const t=e+"Storage";try{if(Gi&&Gi[t]&&typeof Gi[t].length=="number")return Gi[t]}catch{}Fs[e]=!1}function xx(e,t){const r=gx(e);if(!r)return;const o=ec(r,qd);if(o!==Vd){if(o){const s=rc(r);for(let l=0;l{const l=di+s.toString(),c=ec(r,l);if(typeof c=="string"){try{const u=JSON.parse(c);if(typeof u=="object"&&typeof u.cached=="number"&&u.cached>n&&typeof u.provider=="string"&&typeof u.data=="object"&&typeof u.data.prefix=="string"&&t(u,s))return!0}catch{}Gd(r,l)}};let a=rc(r);for(let s=a-1;s>=0;s--)i(s)||(s===a-1?(a--,tc(r,a)):mx[e].add(s))}function vx(){if(!Iu){Ok(!0);for(const e in Fs)xx(e,t=>{const r=t.data,o=t.provider,n=r.prefix,i=Ro(o,n);if(!Eu(i,r).length)return!1;const a=r.lastModified||-1;return i.lastModifiedCached=i.lastModifiedCached?Math.min(i.lastModifiedCached,a):a,!0})}}function Bk(e,t){const r=e.lastModifiedCached;if(r&&r>=t)return r===t;if(e.lastModifiedCached=t,r)for(const o in Fs)xx(o,n=>{const i=n.data;return n.provider!==e.provider||i.prefix!==e.prefix||i.lastModified===t});return!0}function Hk(e,t){Iu||vx();function r(o){let n;if(!Fs[o]||!(n=gx(o)))return;const i=mx[o];let a;if(i.size)i.delete(a=Array.from(i).shift());else if(a=rc(n),!tc(n,a+1))return;const s={cached:Math.floor(Date.now()/px),provider:e.provider,data:t};return $u(n,di+a.toString(),JSON.stringify(s))}t.lastModified&&!Bk(e,t.lastModified)||Object.keys(t.icons).length&&(t.not_found&&(t=Object.assign({},t),delete t.not_found),r("local")||r("session"))}function Kd(){}function Mk(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,Tk(e)}))}function Dk(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:r,prefix:o}=e,n=e.iconsToLoad;delete e.iconsToLoad;let i;if(!n||!(i=Jl(r)))return;i.prepare(r,o,n).forEach(s=>{Rk(r,s,l=>{if(typeof l!="object")s.icons.forEach(c=>{e.missing.add(c)});else try{const c=Eu(e,l);if(!c.length)return;const u=e.pendingIcons;u&&c.forEach(d=>{u.delete(d)}),Hk(e,l)}catch(c){console.error(c)}Mk(e)})})}))}const Fk=(e,t)=>{const r=kk(e,!0,lx()),o=_k(r);if(!o.pending.length){let l=!0;return t&&setTimeout(()=>{l&&t(o.loaded,o.missing,o.pending,Kd)}),()=>{l=!1}}const n=Object.create(null),i=[];let a,s;return o.pending.forEach(l=>{const{provider:c,prefix:u}=l;if(u===s&&c===a)return;a=c,s=u,i.push(Ro(c,u));const d=n[c]||(n[c]=Object.create(null));d[u]||(d[u]=[])}),o.pending.forEach(l=>{const{provider:c,prefix:u,name:d}=l,f=Ro(c,u),p=f.pendingIcons||(f.pendingIcons=new Set);p.has(d)||(p.add(d),n[c][u].push(d))}),i.forEach(l=>{const{provider:c,prefix:u}=l;n[c][u].length&&Dk(l,n[c][u])}),t?Pk(t,o,i):Kd};function zk(e,t){const r={...e};for(const o in t){const n=t[o],i=typeof n;o in cx?(n===null||n&&(i==="string"||i==="number"))&&(r[o]=n):i===typeof r[o]&&(r[o]=o==="rotate"?n%4:n)}return r}const Nk=/[\s,]+/;function Wk(e,t){t.split(Nk).forEach(r=>{switch(r.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function jk(e,t=0){const r=e.replace(/^-?[0-9.]*/,"");function o(n){for(;n<0;)n+=4;return n%4}if(r===""){const n=parseInt(e);return isNaN(n)?0:o(n)}else if(r!==e){let n=0;switch(r){case"%":n=25;break;case"deg":n=90}if(n){let i=parseFloat(e.slice(0,e.length-r.length));return isNaN(i)?0:(i=i/n,i%1===0?o(i):0)}}return t}function Uk(e,t){let r=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const o in t)r+=" "+o+'="'+t[o]+'"';return'"+e+""}function Vk(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function qk(e){return'url("data:image/svg+xml,'+Vk(e)+'")'}const Zd={...ux,inline:!1},Gk={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},Kk={display:"inline-block"},oc={backgroundColor:"currentColor"},bx={backgroundColor:"transparent"},Xd={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Yd={webkitMask:oc,mask:oc,background:bx};for(const e in Yd){const t=Yd[e];for(const r in Xd)t[e+r]=Xd[r]}const na={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";na[e+"-flip"]=t,na[e.slice(0,1)+"-flip"]=t,na[e+"Flip"]=t});function Qd(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Jd=(e,t)=>{const r=zk(Zd,t),o={...Gk},n=t.mode||"svg",i={},a=t.style,s=typeof a=="object"&&!(a instanceof Array)?a:{};for(let m in t){const v=t[m];if(v!==void 0)switch(m){case"icon":case"style":case"onLoad":case"mode":break;case"inline":case"hFlip":case"vFlip":r[m]=v===!0||v==="true"||v===1;break;case"flip":typeof v=="string"&&Wk(r,v);break;case"color":i.color=v;break;case"rotate":typeof v=="string"?r[m]=jk(v):typeof v=="number"&&(r[m]=v);break;case"ariaHidden":case"aria-hidden":v!==!0&&v!=="true"&&delete o["aria-hidden"];break;default:{const g=na[m];g?(v===!0||v==="true"||v===1)&&(r[g]=!0):Zd[m]===void 0&&(o[m]=v)}}}const l=uk(e,r),c=l.attributes;if(r.inline&&(i.verticalAlign="-0.125em"),n==="svg"){o.style={...i,...s},Object.assign(o,c);let m=0,v=t.id;return typeof v=="string"&&(v=v.replace(/-/g,"_")),o.innerHTML=pk(l.body,v?()=>v+"ID"+m++:"iconifyVue"),H("svg",o)}const{body:u,width:d,height:f}=e,p=n==="mask"||(n==="bg"?!1:u.indexOf("currentColor")!==-1),h=Uk(u,{...c,width:d+"",height:f+""});return o.style={...i,"--svg":qk(h),width:Qd(c.width),height:Qd(c.height),...Kk,...p?oc:bx,...s},H("span",o)};lx(!0);mk("",wk);if(typeof document<"u"&&typeof window<"u"){vx();const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,r="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(o=>{try{(typeof o!="object"||o===null||o instanceof Array||typeof o.icons!="object"||typeof o.prefix!="string"||!ak(o))&&console.error(r)}catch{console.error(r)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let r in t){const o="IconifyProviders["+r+"] is invalid.";try{const n=t[r];if(typeof n!="object"||!n||n.resources===void 0)continue;gk(r,n)||console.error(o)}catch{console.error(o)}}}}const Zk={...Ds,body:""},rH=Oe({inheritAttrs:!1,data(){return{iconMounted:!1,counter:0}},mounted(){this._name="",this._loadingIcon=null,this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let r;if(typeof e!="string"||(r=Ms(e,!1,!0))===null)return this.abortLoading(),null;const o=nk(r);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:Fk([r],()=>{this.counter++})})),null;this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e));const n=["iconify"];return r.prefix!==""&&n.push("iconify--"+r.prefix),r.provider!==""&&n.push("iconify--"+r.provider),{data:o,classes:n}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted?this.getIcon(e.icon,e.onLoad):null;if(!t)return Jd(Zk,e);let r=e;return t.classes&&(r={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Jd({...Ds,...t.data},r)}}),Xk="modulepreload",Yk=function(e){return"/"+e},ef={},Pn=function(t,r,o){if(!r||r.length===0)return t();const n=document.getElementsByTagName("link");return Promise.all(r.map(i=>{if(i=Yk(i),i in ef)return;ef[i]=!0;const a=i.endsWith(".css"),s=a?'[rel="stylesheet"]':"";if(!!o)for(let u=n.length-1;u>=0;u--){const d=n[u];if(d.href===i&&(!a||d.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;const c=document.createElement("link");if(c.rel=a?"stylesheet":Xk,a||(c.as="script",c.crossOrigin=""),c.href=i,document.head.appendChild(c),a)return new Promise((u,d)=>{c.addEventListener("load",u),c.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())};var Cx=(e=>(e[e.lan=0]="lan",e[e.wan=1]="wan",e))(Cx||{}),yx=(e=>(e[e.icon=1]="icon",e[e.info=0]="info",e[e.small=1]="small",e))(yx||{}),Qk=!1;/*! - * pinia v2.0.33 - * (c) 2023 Eduardo San Martin Morote - * @license MIT - */let Sx;const zs=e=>Sx=e,wx=Symbol();function nc(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Wn;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Wn||(Wn={}));function Jk(){const e=Oc(!0),t=e.run(()=>de({}));let r=[],o=[];const n=to({install(i){zs(n),n._a=i,i.provide(wx,n),i.config.globalProperties.$pinia=n,o.forEach(a=>r.push(a)),o=[]},use(i){return!this._a&&!Qk?o.push(i):r.push(i),this},_p:r,_a:null,_e:e,_s:new Map,state:t});return n}const _x=()=>{};function tf(e,t,r,o=_x){e.push(t);const n=()=>{const i=e.indexOf(t);i>-1&&(e.splice(i,1),o())};return!r&&Gh()&&tb(n),n}function jo(e,...t){e.slice().forEach(r=>{r(...t)})}function ic(e,t){e instanceof Map&&t instanceof Map&&t.forEach((r,o)=>e.set(o,r)),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const r in t){if(!t.hasOwnProperty(r))continue;const o=t[r],n=e[r];nc(n)&&nc(o)&&e.hasOwnProperty(r)&&!ot(o)&&!Qr(o)?e[r]=ic(n,o):e[r]=o}return e}const eL=Symbol();function tL(e){return!nc(e)||!e.hasOwnProperty(eL)}const{assign:Kr}=Object;function rL(e){return!!(ot(e)&&e.effect)}function oL(e,t,r,o){const{state:n,actions:i,getters:a}=t,s=r.state.value[e];let l;function c(){s||(r.state.value[e]=n?n():{});const u=Rb(r.state.value[e]);return Kr(u,i,Object.keys(a||{}).reduce((d,f)=>(d[f]=to(ae(()=>{zs(r);const p=r._s.get(e);return a[f].call(p,p)})),d),{}))}return l=Tx(e,c,t,r,o,!0),l}function Tx(e,t,r={},o,n,i){let a;const s=Kr({actions:{}},r),l={deep:!0};let c,u,d=to([]),f=to([]),p;const h=o.state.value[e];!i&&!h&&(o.state.value[e]={}),de({});let m;function v(S){let E;c=u=!1,typeof S=="function"?(S(o.state.value[e]),E={type:Wn.patchFunction,storeId:e,events:p}):(ic(o.state.value[e],S),E={type:Wn.patchObject,payload:S,storeId:e,events:p});const I=m=Symbol();jt().then(()=>{m===I&&(c=!0)}),u=!0,jo(d,E,o.state.value[e])}const g=i?function(){const{state:E}=r,I=E?E():{};this.$patch(P=>{Kr(P,I)})}:_x;function x(){a.stop(),d=[],f=[],o._s.delete(e)}function C(S,E){return function(){zs(o);const I=Array.from(arguments),P=[],$=[];function R(Y){P.push(Y)}function B(Y){$.push(Y)}jo(f,{args:I,name:S,store:w,after:R,onError:B});let j;try{j=E.apply(this&&this.$id===e?this:w,I)}catch(Y){throw jo($,Y),Y}return j instanceof Promise?j.then(Y=>(jo(P,Y),Y)).catch(Y=>(jo($,Y),Promise.reject(Y))):(jo(P,j),j)}}const b={_p:o,$id:e,$onAction:tf.bind(null,f),$patch:v,$reset:g,$subscribe(S,E={}){const I=tf(d,S,E.detached,()=>P()),P=a.run(()=>kt(()=>o.state.value[e],$=>{(E.flush==="sync"?u:c)&&S({storeId:e,type:Wn.direct,events:p},$)},Kr({},l,E)));return I},$dispose:x},w=Or(b);o._s.set(e,w);const T=o._e.run(()=>(a=Oc(),a.run(()=>t())));for(const S in T){const E=T[S];if(ot(E)&&!rL(E)||Qr(E))i||(h&&tL(E)&&(ot(E)?E.value=h[S]:ic(E,h[S])),o.state.value[e][S]=E);else if(typeof E=="function"){const I=C(S,E);T[S]=I,s.actions[S]=E}}return Kr(w,T),Kr(He(w),T),Object.defineProperty(w,"$state",{get:()=>o.state.value[e],set:S=>{v(E=>{Kr(E,S)})}}),o._p.forEach(S=>{Kr(w,a.run(()=>S({store:w,app:o._a,pinia:o,options:s})))}),h&&i&&r.hydrate&&r.hydrate(w.$state,h),c=!0,u=!0,w}function Do(e,t,r){let o,n;const i=typeof t=="function";typeof e=="string"?(o=e,n=i?r:t):(n=e,o=e.id);function a(s,l){const c=ir();return s=s||c&&Me(wx,null),s&&zs(s),s=Sx,s._s.has(o)||(i?Tx(o,t,n,s):oL(o,n,s)),s._s.get(o)}return a.$id=o,a}var ac={},nL={get exports(){return ac},set exports(e){ac=e}};function iL(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var wa={},aL={get exports(){return wa},set exports(e){wa=e}};const sL={},lL=Object.freeze(Object.defineProperty({__proto__:null,default:sL},Symbol.toStringTag,{value:"Module"})),cL=w5(lL);var rf;function De(){return rf||(rf=1,function(e,t){(function(r,o){e.exports=o()})(Ae,function(){var r=r||function(o,n){var i;if(typeof window<"u"&&window.crypto&&(i=window.crypto),typeof self<"u"&&self.crypto&&(i=self.crypto),typeof globalThis<"u"&&globalThis.crypto&&(i=globalThis.crypto),!i&&typeof window<"u"&&window.msCrypto&&(i=window.msCrypto),!i&&typeof Ae<"u"&&Ae.crypto&&(i=Ae.crypto),!i&&typeof iL=="function")try{i=cL}catch{}var a=function(){if(i){if(typeof i.getRandomValues=="function")try{return i.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof i.randomBytes=="function")try{return i.randomBytes(4).readInt32LE()}catch{}}throw new Error("Native crypto module could not be used to get secure random number.")},s=Object.create||function(){function x(){}return function(C){var b;return x.prototype=C,b=new x,x.prototype=null,b}}(),l={},c=l.lib={},u=c.Base=function(){return{extend:function(x){var C=s(this);return x&&C.mixIn(x),(!C.hasOwnProperty("init")||this.init===C.init)&&(C.init=function(){C.$super.init.apply(this,arguments)}),C.init.prototype=C,C.$super=this,C},create:function(){var x=this.extend();return x.init.apply(x,arguments),x},init:function(){},mixIn:function(x){for(var C in x)x.hasOwnProperty(C)&&(this[C]=x[C]);x.hasOwnProperty("toString")&&(this.toString=x.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),d=c.WordArray=u.extend({init:function(x,C){x=this.words=x||[],C!=n?this.sigBytes=C:this.sigBytes=x.length*4},toString:function(x){return(x||p).stringify(this)},concat:function(x){var C=this.words,b=x.words,w=this.sigBytes,T=x.sigBytes;if(this.clamp(),w%4)for(var S=0;S>>2]>>>24-S%4*8&255;C[w+S>>>2]|=E<<24-(w+S)%4*8}else for(var I=0;I>>2]=b[I>>>2];return this.sigBytes+=T,this},clamp:function(){var x=this.words,C=this.sigBytes;x[C>>>2]&=4294967295<<32-C%4*8,x.length=o.ceil(C/4)},clone:function(){var x=u.clone.call(this);return x.words=this.words.slice(0),x},random:function(x){for(var C=[],b=0;b>>2]>>>24-T%4*8&255;w.push((S>>>4).toString(16)),w.push((S&15).toString(16))}return w.join("")},parse:function(x){for(var C=x.length,b=[],w=0;w>>3]|=parseInt(x.substr(w,2),16)<<24-w%8*4;return new d.init(b,C/2)}},h=f.Latin1={stringify:function(x){for(var C=x.words,b=x.sigBytes,w=[],T=0;T>>2]>>>24-T%4*8&255;w.push(String.fromCharCode(S))}return w.join("")},parse:function(x){for(var C=x.length,b=[],w=0;w>>2]|=(x.charCodeAt(w)&255)<<24-w%4*8;return new d.init(b,C)}},m=f.Utf8={stringify:function(x){try{return decodeURIComponent(escape(h.stringify(x)))}catch{throw new Error("Malformed UTF-8 data")}},parse:function(x){return h.parse(unescape(encodeURIComponent(x)))}},v=c.BufferedBlockAlgorithm=u.extend({reset:function(){this._data=new d.init,this._nDataBytes=0},_append:function(x){typeof x=="string"&&(x=m.parse(x)),this._data.concat(x),this._nDataBytes+=x.sigBytes},_process:function(x){var C,b=this._data,w=b.words,T=b.sigBytes,S=this.blockSize,E=S*4,I=T/E;x?I=o.ceil(I):I=o.max((I|0)-this._minBufferSize,0);var P=I*S,$=o.min(P*4,T);if(P){for(var R=0;R>>2]|=l[d]<<24-d%4*8;a.call(this,u,c)}else a.apply(this,arguments)};s.prototype=i}}(),r.lib.WordArray})}(dL)),Ta}var Ea={},hL={get exports(){return Ea},set exports(e){Ea=e}},af;function pL(){return af||(af=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.WordArray,a=o.enc;a.Utf16=a.Utf16BE={stringify:function(l){for(var c=l.words,u=l.sigBytes,d=[],f=0;f>>2]>>>16-f%4*8&65535;d.push(String.fromCharCode(p))}return d.join("")},parse:function(l){for(var c=l.length,u=[],d=0;d>>1]|=l.charCodeAt(d)<<16-d%2*16;return i.create(u,c*2)}},a.Utf16LE={stringify:function(l){for(var c=l.words,u=l.sigBytes,d=[],f=0;f>>2]>>>16-f%4*8&65535);d.push(String.fromCharCode(p))}return d.join("")},parse:function(l){for(var c=l.length,u=[],d=0;d>>1]|=s(l.charCodeAt(d)<<16-d%2*16);return i.create(u,c*2)}};function s(l){return l<<8&4278255360|l>>>8&16711935}}(),r.enc.Utf16})}(hL)),Ea}var Pa={},mL={get exports(){return Pa},set exports(e){Pa=e}},sf;function vn(){return sf||(sf=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.WordArray,a=o.enc;a.Base64={stringify:function(l){var c=l.words,u=l.sigBytes,d=this._map;l.clamp();for(var f=[],p=0;p>>2]>>>24-p%4*8&255,m=c[p+1>>>2]>>>24-(p+1)%4*8&255,v=c[p+2>>>2]>>>24-(p+2)%4*8&255,g=h<<16|m<<8|v,x=0;x<4&&p+x*.75>>6*(3-x)&63));var C=d.charAt(64);if(C)for(;f.length%4;)f.push(C);return f.join("")},parse:function(l){var c=l.length,u=this._map,d=this._reverseMap;if(!d){d=this._reverseMap=[];for(var f=0;f>>6-p%4*2,v=h|m;d[f>>>2]|=v<<24-f%4*8,f++}return i.create(d,f)}}(),r.enc.Base64})}(mL)),Pa}var ka={},gL={get exports(){return ka},set exports(e){ka=e}},lf;function xL(){return lf||(lf=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.WordArray,a=o.enc;a.Base64url={stringify:function(l,c=!0){var u=l.words,d=l.sigBytes,f=c?this._safe_map:this._map;l.clamp();for(var p=[],h=0;h>>2]>>>24-h%4*8&255,v=u[h+1>>>2]>>>24-(h+1)%4*8&255,g=u[h+2>>>2]>>>24-(h+2)%4*8&255,x=m<<16|v<<8|g,C=0;C<4&&h+C*.75>>6*(3-C)&63));var b=f.charAt(64);if(b)for(;p.length%4;)p.push(b);return p.join("")},parse:function(l,c=!0){var u=l.length,d=c?this._safe_map:this._map,f=this._reverseMap;if(!f){f=this._reverseMap=[];for(var p=0;p>>6-p%4*2,v=h|m;d[f>>>2]|=v<<24-f%4*8,f++}return i.create(d,f)}}(),r.enc.Base64url})}(gL)),ka}var La={},vL={get exports(){return La},set exports(e){La=e}},cf;function bn(){return cf||(cf=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){return function(o){var n=r,i=n.lib,a=i.WordArray,s=i.Hasher,l=n.algo,c=[];(function(){for(var m=0;m<64;m++)c[m]=o.abs(o.sin(m+1))*4294967296|0})();var u=l.MD5=s.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(m,v){for(var g=0;g<16;g++){var x=v+g,C=m[x];m[x]=(C<<8|C>>>24)&16711935|(C<<24|C>>>8)&4278255360}var b=this._hash.words,w=m[v+0],T=m[v+1],S=m[v+2],E=m[v+3],I=m[v+4],P=m[v+5],$=m[v+6],R=m[v+7],B=m[v+8],j=m[v+9],Y=m[v+10],J=m[v+11],Q=m[v+12],ie=m[v+13],ge=m[v+14],ve=m[v+15],z=b[0],W=b[1],Z=b[2],V=b[3];z=d(z,W,Z,V,w,7,c[0]),V=d(V,z,W,Z,T,12,c[1]),Z=d(Z,V,z,W,S,17,c[2]),W=d(W,Z,V,z,E,22,c[3]),z=d(z,W,Z,V,I,7,c[4]),V=d(V,z,W,Z,P,12,c[5]),Z=d(Z,V,z,W,$,17,c[6]),W=d(W,Z,V,z,R,22,c[7]),z=d(z,W,Z,V,B,7,c[8]),V=d(V,z,W,Z,j,12,c[9]),Z=d(Z,V,z,W,Y,17,c[10]),W=d(W,Z,V,z,J,22,c[11]),z=d(z,W,Z,V,Q,7,c[12]),V=d(V,z,W,Z,ie,12,c[13]),Z=d(Z,V,z,W,ge,17,c[14]),W=d(W,Z,V,z,ve,22,c[15]),z=f(z,W,Z,V,T,5,c[16]),V=f(V,z,W,Z,$,9,c[17]),Z=f(Z,V,z,W,J,14,c[18]),W=f(W,Z,V,z,w,20,c[19]),z=f(z,W,Z,V,P,5,c[20]),V=f(V,z,W,Z,Y,9,c[21]),Z=f(Z,V,z,W,ve,14,c[22]),W=f(W,Z,V,z,I,20,c[23]),z=f(z,W,Z,V,j,5,c[24]),V=f(V,z,W,Z,ge,9,c[25]),Z=f(Z,V,z,W,E,14,c[26]),W=f(W,Z,V,z,B,20,c[27]),z=f(z,W,Z,V,ie,5,c[28]),V=f(V,z,W,Z,S,9,c[29]),Z=f(Z,V,z,W,R,14,c[30]),W=f(W,Z,V,z,Q,20,c[31]),z=p(z,W,Z,V,P,4,c[32]),V=p(V,z,W,Z,B,11,c[33]),Z=p(Z,V,z,W,J,16,c[34]),W=p(W,Z,V,z,ge,23,c[35]),z=p(z,W,Z,V,T,4,c[36]),V=p(V,z,W,Z,I,11,c[37]),Z=p(Z,V,z,W,R,16,c[38]),W=p(W,Z,V,z,Y,23,c[39]),z=p(z,W,Z,V,ie,4,c[40]),V=p(V,z,W,Z,w,11,c[41]),Z=p(Z,V,z,W,E,16,c[42]),W=p(W,Z,V,z,$,23,c[43]),z=p(z,W,Z,V,j,4,c[44]),V=p(V,z,W,Z,Q,11,c[45]),Z=p(Z,V,z,W,ve,16,c[46]),W=p(W,Z,V,z,S,23,c[47]),z=h(z,W,Z,V,w,6,c[48]),V=h(V,z,W,Z,R,10,c[49]),Z=h(Z,V,z,W,ge,15,c[50]),W=h(W,Z,V,z,P,21,c[51]),z=h(z,W,Z,V,Q,6,c[52]),V=h(V,z,W,Z,E,10,c[53]),Z=h(Z,V,z,W,Y,15,c[54]),W=h(W,Z,V,z,T,21,c[55]),z=h(z,W,Z,V,B,6,c[56]),V=h(V,z,W,Z,ve,10,c[57]),Z=h(Z,V,z,W,$,15,c[58]),W=h(W,Z,V,z,ie,21,c[59]),z=h(z,W,Z,V,I,6,c[60]),V=h(V,z,W,Z,J,10,c[61]),Z=h(Z,V,z,W,S,15,c[62]),W=h(W,Z,V,z,j,21,c[63]),b[0]=b[0]+z|0,b[1]=b[1]+W|0,b[2]=b[2]+Z|0,b[3]=b[3]+V|0},_doFinalize:function(){var m=this._data,v=m.words,g=this._nDataBytes*8,x=m.sigBytes*8;v[x>>>5]|=128<<24-x%32;var C=o.floor(g/4294967296),b=g;v[(x+64>>>9<<4)+15]=(C<<8|C>>>24)&16711935|(C<<24|C>>>8)&4278255360,v[(x+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360,m.sigBytes=(v.length+1)*4,this._process();for(var w=this._hash,T=w.words,S=0;S<4;S++){var E=T[S];T[S]=(E<<8|E>>>24)&16711935|(E<<24|E>>>8)&4278255360}return w},clone:function(){var m=s.clone.call(this);return m._hash=this._hash.clone(),m}});function d(m,v,g,x,C,b,w){var T=m+(v&g|~v&x)+C+w;return(T<>>32-b)+v}function f(m,v,g,x,C,b,w){var T=m+(v&x|g&~x)+C+w;return(T<>>32-b)+v}function p(m,v,g,x,C,b,w){var T=m+(v^g^x)+C+w;return(T<>>32-b)+v}function h(m,v,g,x,C,b,w){var T=m+(g^(v|~x))+C+w;return(T<>>32-b)+v}n.MD5=s._createHelper(u),n.HmacMD5=s._createHmacHelper(u)}(Math),r.MD5})}(vL)),La}var $a={},bL={get exports(){return $a},set exports(e){$a=e}},uf;function Ru(){return uf||(uf=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.WordArray,a=n.Hasher,s=o.algo,l=[],c=s.SHA1=a.extend({_doReset:function(){this._hash=new i.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(u,d){for(var f=this._hash.words,p=f[0],h=f[1],m=f[2],v=f[3],g=f[4],x=0;x<80;x++){if(x<16)l[x]=u[d+x]|0;else{var C=l[x-3]^l[x-8]^l[x-14]^l[x-16];l[x]=C<<1|C>>>31}var b=(p<<5|p>>>27)+g+l[x];x<20?b+=(h&m|~h&v)+1518500249:x<40?b+=(h^m^v)+1859775393:x<60?b+=(h&m|h&v|m&v)-1894007588:b+=(h^m^v)-899497514,g=v,v=m,m=h<<30|h>>>2,h=p,p=b}f[0]=f[0]+p|0,f[1]=f[1]+h|0,f[2]=f[2]+m|0,f[3]=f[3]+v|0,f[4]=f[4]+g|0},_doFinalize:function(){var u=this._data,d=u.words,f=this._nDataBytes*8,p=u.sigBytes*8;return d[p>>>5]|=128<<24-p%32,d[(p+64>>>9<<4)+14]=Math.floor(f/4294967296),d[(p+64>>>9<<4)+15]=f,u.sigBytes=d.length*4,this._process(),this._hash},clone:function(){var u=a.clone.call(this);return u._hash=this._hash.clone(),u}});o.SHA1=a._createHelper(c),o.HmacSHA1=a._createHmacHelper(c)}(),r.SHA1})}(bL)),$a}var Ia={},CL={get exports(){return Ia},set exports(e){Ia=e}},df;function Ex(){return df||(df=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){return function(o){var n=r,i=n.lib,a=i.WordArray,s=i.Hasher,l=n.algo,c=[],u=[];(function(){function p(g){for(var x=o.sqrt(g),C=2;C<=x;C++)if(!(g%C))return!1;return!0}function h(g){return(g-(g|0))*4294967296|0}for(var m=2,v=0;v<64;)p(m)&&(v<8&&(c[v]=h(o.pow(m,1/2))),u[v]=h(o.pow(m,1/3)),v++),m++})();var d=[],f=l.SHA256=s.extend({_doReset:function(){this._hash=new a.init(c.slice(0))},_doProcessBlock:function(p,h){for(var m=this._hash.words,v=m[0],g=m[1],x=m[2],C=m[3],b=m[4],w=m[5],T=m[6],S=m[7],E=0;E<64;E++){if(E<16)d[E]=p[h+E]|0;else{var I=d[E-15],P=(I<<25|I>>>7)^(I<<14|I>>>18)^I>>>3,$=d[E-2],R=($<<15|$>>>17)^($<<13|$>>>19)^$>>>10;d[E]=P+d[E-7]+R+d[E-16]}var B=b&w^~b&T,j=v&g^v&x^g&x,Y=(v<<30|v>>>2)^(v<<19|v>>>13)^(v<<10|v>>>22),J=(b<<26|b>>>6)^(b<<21|b>>>11)^(b<<7|b>>>25),Q=S+J+B+u[E]+d[E],ie=Y+j;S=T,T=w,w=b,b=C+Q|0,C=x,x=g,g=v,v=Q+ie|0}m[0]=m[0]+v|0,m[1]=m[1]+g|0,m[2]=m[2]+x|0,m[3]=m[3]+C|0,m[4]=m[4]+b|0,m[5]=m[5]+w|0,m[6]=m[6]+T|0,m[7]=m[7]+S|0},_doFinalize:function(){var p=this._data,h=p.words,m=this._nDataBytes*8,v=p.sigBytes*8;return h[v>>>5]|=128<<24-v%32,h[(v+64>>>9<<4)+14]=o.floor(m/4294967296),h[(v+64>>>9<<4)+15]=m,p.sigBytes=h.length*4,this._process(),this._hash},clone:function(){var p=s.clone.call(this);return p._hash=this._hash.clone(),p}});n.SHA256=s._createHelper(f),n.HmacSHA256=s._createHmacHelper(f)}(Math),r.SHA256})}(CL)),Ia}var Ra={},yL={get exports(){return Ra},set exports(e){Ra=e}},ff;function SL(){return ff||(ff=1,function(e,t){(function(r,o,n){e.exports=o(De(),Ex())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.WordArray,a=o.algo,s=a.SHA256,l=a.SHA224=s.extend({_doReset:function(){this._hash=new i.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var c=s._doFinalize.call(this);return c.sigBytes-=4,c}});o.SHA224=s._createHelper(l),o.HmacSHA224=s._createHmacHelper(l)}(),r.SHA224})}(yL)),Ra}var Aa={},wL={get exports(){return Aa},set exports(e){Aa=e}},hf;function Px(){return hf||(hf=1,function(e,t){(function(r,o,n){e.exports=o(De(),Ns())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.Hasher,a=o.x64,s=a.Word,l=a.WordArray,c=o.algo;function u(){return s.create.apply(s,arguments)}var d=[u(1116352408,3609767458),u(1899447441,602891725),u(3049323471,3964484399),u(3921009573,2173295548),u(961987163,4081628472),u(1508970993,3053834265),u(2453635748,2937671579),u(2870763221,3664609560),u(3624381080,2734883394),u(310598401,1164996542),u(607225278,1323610764),u(1426881987,3590304994),u(1925078388,4068182383),u(2162078206,991336113),u(2614888103,633803317),u(3248222580,3479774868),u(3835390401,2666613458),u(4022224774,944711139),u(264347078,2341262773),u(604807628,2007800933),u(770255983,1495990901),u(1249150122,1856431235),u(1555081692,3175218132),u(1996064986,2198950837),u(2554220882,3999719339),u(2821834349,766784016),u(2952996808,2566594879),u(3210313671,3203337956),u(3336571891,1034457026),u(3584528711,2466948901),u(113926993,3758326383),u(338241895,168717936),u(666307205,1188179964),u(773529912,1546045734),u(1294757372,1522805485),u(1396182291,2643833823),u(1695183700,2343527390),u(1986661051,1014477480),u(2177026350,1206759142),u(2456956037,344077627),u(2730485921,1290863460),u(2820302411,3158454273),u(3259730800,3505952657),u(3345764771,106217008),u(3516065817,3606008344),u(3600352804,1432725776),u(4094571909,1467031594),u(275423344,851169720),u(430227734,3100823752),u(506948616,1363258195),u(659060556,3750685593),u(883997877,3785050280),u(958139571,3318307427),u(1322822218,3812723403),u(1537002063,2003034995),u(1747873779,3602036899),u(1955562222,1575990012),u(2024104815,1125592928),u(2227730452,2716904306),u(2361852424,442776044),u(2428436474,593698344),u(2756734187,3733110249),u(3204031479,2999351573),u(3329325298,3815920427),u(3391569614,3928383900),u(3515267271,566280711),u(3940187606,3454069534),u(4118630271,4000239992),u(116418474,1914138554),u(174292421,2731055270),u(289380356,3203993006),u(460393269,320620315),u(685471733,587496836),u(852142971,1086792851),u(1017036298,365543100),u(1126000580,2618297676),u(1288033470,3409855158),u(1501505948,4234509866),u(1607167915,987167468),u(1816402316,1246189591)],f=[];(function(){for(var h=0;h<80;h++)f[h]=u()})();var p=c.SHA512=i.extend({_doReset:function(){this._hash=new l.init([new s.init(1779033703,4089235720),new s.init(3144134277,2227873595),new s.init(1013904242,4271175723),new s.init(2773480762,1595750129),new s.init(1359893119,2917565137),new s.init(2600822924,725511199),new s.init(528734635,4215389547),new s.init(1541459225,327033209)])},_doProcessBlock:function(h,m){for(var v=this._hash.words,g=v[0],x=v[1],C=v[2],b=v[3],w=v[4],T=v[5],S=v[6],E=v[7],I=g.high,P=g.low,$=x.high,R=x.low,B=C.high,j=C.low,Y=b.high,J=b.low,Q=w.high,ie=w.low,ge=T.high,ve=T.low,z=S.high,W=S.low,Z=E.high,V=E.low,D=I,U=P,re=$,ee=R,ce=B,ke=j,ye=Y,k=J,y=Q,_=ie,L=ge,O=ve,N=z,X=W,te=Z,q=V,F=0;F<80;F++){var A,M,ue=f[F];if(F<16)M=ue.high=h[m+F*2]|0,A=ue.low=h[m+F*2+1]|0;else{var xe=f[F-15],Te=xe.high,Ie=xe.low,Re=(Te>>>1|Ie<<31)^(Te>>>8|Ie<<24)^Te>>>7,Ue=(Ie>>>1|Te<<31)^(Ie>>>8|Te<<24)^(Ie>>>7|Te<<25),ct=f[F-2],xt=ct.high,lr=ct.low,cr=(xt>>>19|lr<<13)^(xt<<3|lr>>>29)^xt>>>6,Ut=(lr>>>19|xt<<13)^(lr<<3|xt>>>29)^(lr>>>6|xt<<26),vt=f[F-7],oe=vt.high,be=vt.low,Ee=f[F-16],Ve=Ee.high,et=Ee.low;A=Ue+be,M=Re+oe+(A>>>0>>0?1:0),A=A+Ut,M=M+cr+(A>>>0>>0?1:0),A=A+et,M=M+Ve+(A>>>0>>0?1:0),ue.high=M,ue.low=A}var St=y&L^~y&N,Vt=_&O^~_&X,Qe=D&re^D&ce^re&ce,Qt=U&ee^U&ke^ee&ke,uo=(D>>>28|U<<4)^(D<<30|U>>>2)^(D<<25|U>>>7),Ju=(U>>>28|D<<4)^(U<<30|D>>>2)^(U<<25|D>>>7),Hv=(y>>>14|_<<18)^(y>>>18|_<<14)^(y<<23|_>>>9),Mv=(_>>>14|y<<18)^(_>>>18|y<<14)^(_<<23|y>>>9),e0=d[F],Dv=e0.high,t0=e0.low,Ft=q+Mv,zr=te+Hv+(Ft>>>0>>0?1:0),Ft=Ft+Vt,zr=zr+St+(Ft>>>0>>0?1:0),Ft=Ft+t0,zr=zr+Dv+(Ft>>>0>>0?1:0),Ft=Ft+A,zr=zr+M+(Ft>>>0>>0?1:0),r0=Ju+Qt,Fv=uo+Qe+(r0>>>0>>0?1:0);te=N,q=X,N=L,X=O,L=y,O=_,_=k+Ft|0,y=ye+zr+(_>>>0>>0?1:0)|0,ye=ce,k=ke,ce=re,ke=ee,re=D,ee=U,U=Ft+r0|0,D=zr+Fv+(U>>>0>>0?1:0)|0}P=g.low=P+U,g.high=I+D+(P>>>0>>0?1:0),R=x.low=R+ee,x.high=$+re+(R>>>0>>0?1:0),j=C.low=j+ke,C.high=B+ce+(j>>>0>>0?1:0),J=b.low=J+k,b.high=Y+ye+(J>>>0>>0?1:0),ie=w.low=ie+_,w.high=Q+y+(ie>>>0<_>>>0?1:0),ve=T.low=ve+O,T.high=ge+L+(ve>>>0>>0?1:0),W=S.low=W+X,S.high=z+N+(W>>>0>>0?1:0),V=E.low=V+q,E.high=Z+te+(V>>>0>>0?1:0)},_doFinalize:function(){var h=this._data,m=h.words,v=this._nDataBytes*8,g=h.sigBytes*8;m[g>>>5]|=128<<24-g%32,m[(g+128>>>10<<5)+30]=Math.floor(v/4294967296),m[(g+128>>>10<<5)+31]=v,h.sigBytes=m.length*4,this._process();var x=this._hash.toX32();return x},clone:function(){var h=i.clone.call(this);return h._hash=this._hash.clone(),h},blockSize:1024/32});o.SHA512=i._createHelper(p),o.HmacSHA512=i._createHmacHelper(p)}(),r.SHA512})}(wL)),Aa}var Oa={},_L={get exports(){return Oa},set exports(e){Oa=e}},pf;function TL(){return pf||(pf=1,function(e,t){(function(r,o,n){e.exports=o(De(),Ns(),Px())})(Ae,function(r){return function(){var o=r,n=o.x64,i=n.Word,a=n.WordArray,s=o.algo,l=s.SHA512,c=s.SHA384=l.extend({_doReset:function(){this._hash=new a.init([new i.init(3418070365,3238371032),new i.init(1654270250,914150663),new i.init(2438529370,812702999),new i.init(355462360,4144912697),new i.init(1731405415,4290775857),new i.init(2394180231,1750603025),new i.init(3675008525,1694076839),new i.init(1203062813,3204075428)])},_doFinalize:function(){var u=l._doFinalize.call(this);return u.sigBytes-=16,u}});o.SHA384=l._createHelper(c),o.HmacSHA384=l._createHmacHelper(c)}(),r.SHA384})}(_L)),Oa}var Ba={},EL={get exports(){return Ba},set exports(e){Ba=e}},mf;function PL(){return mf||(mf=1,function(e,t){(function(r,o,n){e.exports=o(De(),Ns())})(Ae,function(r){return function(o){var n=r,i=n.lib,a=i.WordArray,s=i.Hasher,l=n.x64,c=l.Word,u=n.algo,d=[],f=[],p=[];(function(){for(var v=1,g=0,x=0;x<24;x++){d[v+5*g]=(x+1)*(x+2)/2%64;var C=g%5,b=(2*v+3*g)%5;v=C,g=b}for(var v=0;v<5;v++)for(var g=0;g<5;g++)f[v+5*g]=g+(2*v+3*g)%5*5;for(var w=1,T=0;T<24;T++){for(var S=0,E=0,I=0;I<7;I++){if(w&1){var P=(1<>>24)&16711935|(w<<24|w>>>8)&4278255360,T=(T<<8|T>>>24)&16711935|(T<<24|T>>>8)&4278255360;var S=x[b];S.high^=T,S.low^=w}for(var E=0;E<24;E++){for(var I=0;I<5;I++){for(var P=0,$=0,R=0;R<5;R++){var S=x[I+5*R];P^=S.high,$^=S.low}var B=h[I];B.high=P,B.low=$}for(var I=0;I<5;I++)for(var j=h[(I+4)%5],Y=h[(I+1)%5],J=Y.high,Q=Y.low,P=j.high^(J<<1|Q>>>31),$=j.low^(Q<<1|J>>>31),R=0;R<5;R++){var S=x[I+5*R];S.high^=P,S.low^=$}for(var ie=1;ie<25;ie++){var P,$,S=x[ie],ge=S.high,ve=S.low,z=d[ie];z<32?(P=ge<>>32-z,$=ve<>>32-z):(P=ve<>>64-z,$=ge<>>64-z);var W=h[f[ie]];W.high=P,W.low=$}var Z=h[0],V=x[0];Z.high=V.high,Z.low=V.low;for(var I=0;I<5;I++)for(var R=0;R<5;R++){var ie=I+5*R,S=x[ie],D=h[ie],U=h[(I+1)%5+5*R],re=h[(I+2)%5+5*R];S.high=D.high^~U.high&re.high,S.low=D.low^~U.low&re.low}var S=x[0],ee=p[E];S.high^=ee.high,S.low^=ee.low}},_doFinalize:function(){var v=this._data,g=v.words;this._nDataBytes*8;var x=v.sigBytes*8,C=this.blockSize*32;g[x>>>5]|=1<<24-x%32,g[(o.ceil((x+1)/C)*C>>>5)-1]|=128,v.sigBytes=g.length*4,this._process();for(var b=this._state,w=this.cfg.outputLength/8,T=w/8,S=[],E=0;E>>24)&16711935|(P<<24|P>>>8)&4278255360,$=($<<8|$>>>24)&16711935|($<<24|$>>>8)&4278255360,S.push($),S.push(P)}return new a.init(S,w)},clone:function(){for(var v=s.clone.call(this),g=v._state=this._state.slice(0),x=0;x<25;x++)g[x]=g[x].clone();return v}});n.SHA3=s._createHelper(m),n.HmacSHA3=s._createHmacHelper(m)}(Math),r.SHA3})}(EL)),Ba}var Ha={},kL={get exports(){return Ha},set exports(e){Ha=e}},gf;function LL(){return gf||(gf=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){/** @preserve - (c) 2012 by Cédric Mesnil. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */return function(o){var n=r,i=n.lib,a=i.WordArray,s=i.Hasher,l=n.algo,c=a.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),u=a.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),d=a.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),f=a.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),p=a.create([0,1518500249,1859775393,2400959708,2840853838]),h=a.create([1352829926,1548603684,1836072691,2053994217,0]),m=l.RIPEMD160=s.extend({_doReset:function(){this._hash=a.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(T,S){for(var E=0;E<16;E++){var I=S+E,P=T[I];T[I]=(P<<8|P>>>24)&16711935|(P<<24|P>>>8)&4278255360}var $=this._hash.words,R=p.words,B=h.words,j=c.words,Y=u.words,J=d.words,Q=f.words,ie,ge,ve,z,W,Z,V,D,U,re;Z=ie=$[0],V=ge=$[1],D=ve=$[2],U=z=$[3],re=W=$[4];for(var ee,E=0;E<80;E+=1)ee=ie+T[S+j[E]]|0,E<16?ee+=v(ge,ve,z)+R[0]:E<32?ee+=g(ge,ve,z)+R[1]:E<48?ee+=x(ge,ve,z)+R[2]:E<64?ee+=C(ge,ve,z)+R[3]:ee+=b(ge,ve,z)+R[4],ee=ee|0,ee=w(ee,J[E]),ee=ee+W|0,ie=W,W=z,z=w(ve,10),ve=ge,ge=ee,ee=Z+T[S+Y[E]]|0,E<16?ee+=b(V,D,U)+B[0]:E<32?ee+=C(V,D,U)+B[1]:E<48?ee+=x(V,D,U)+B[2]:E<64?ee+=g(V,D,U)+B[3]:ee+=v(V,D,U)+B[4],ee=ee|0,ee=w(ee,Q[E]),ee=ee+re|0,Z=re,re=U,U=w(D,10),D=V,V=ee;ee=$[1]+ve+U|0,$[1]=$[2]+z+re|0,$[2]=$[3]+W+Z|0,$[3]=$[4]+ie+V|0,$[4]=$[0]+ge+D|0,$[0]=ee},_doFinalize:function(){var T=this._data,S=T.words,E=this._nDataBytes*8,I=T.sigBytes*8;S[I>>>5]|=128<<24-I%32,S[(I+64>>>9<<4)+14]=(E<<8|E>>>24)&16711935|(E<<24|E>>>8)&4278255360,T.sigBytes=(S.length+1)*4,this._process();for(var P=this._hash,$=P.words,R=0;R<5;R++){var B=$[R];$[R]=(B<<8|B>>>24)&16711935|(B<<24|B>>>8)&4278255360}return P},clone:function(){var T=s.clone.call(this);return T._hash=this._hash.clone(),T}});function v(T,S,E){return T^S^E}function g(T,S,E){return T&S|~T&E}function x(T,S,E){return(T|~S)^E}function C(T,S,E){return T&E|S&~E}function b(T,S,E){return T^(S|~E)}function w(T,S){return T<>>32-S}n.RIPEMD160=s._createHelper(m),n.HmacRIPEMD160=s._createHmacHelper(m)}(),r.RIPEMD160})}(kL)),Ha}var Ma={},$L={get exports(){return Ma},set exports(e){Ma=e}},xf;function Au(){return xf||(xf=1,function(e,t){(function(r,o){e.exports=o(De())})(Ae,function(r){(function(){var o=r,n=o.lib,i=n.Base,a=o.enc,s=a.Utf8,l=o.algo;l.HMAC=i.extend({init:function(c,u){c=this._hasher=new c.init,typeof u=="string"&&(u=s.parse(u));var d=c.blockSize,f=d*4;u.sigBytes>f&&(u=c.finalize(u)),u.clamp();for(var p=this._oKey=u.clone(),h=this._iKey=u.clone(),m=p.words,v=h.words,g=0;g>>2]&255;P.sigBytes-=$}};i.BlockCipher=p.extend({cfg:p.cfg.extend({mode:v,padding:x}),reset:function(){var P;p.reset.call(this);var $=this.cfg,R=$.iv,B=$.mode;this._xformMode==this._ENC_XFORM_MODE?P=B.createEncryptor:(P=B.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==P?this._mode.init(this,R&&R.words):(this._mode=P.call(B,this,R&&R.words),this._mode.__creator=P)},_doProcessBlock:function(P,$){this._mode.processBlock(P,$)},_doFinalize:function(){var P,$=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?($.pad(this._data,this.blockSize),P=this._process(!0)):(P=this._process(!0),$.unpad(P)),P},blockSize:128/32});var C=i.CipherParams=a.extend({init:function(P){this.mixIn(P)},toString:function(P){return(P||this.formatter).stringify(this)}}),b=n.format={},w=b.OpenSSL={stringify:function(P){var $,R=P.ciphertext,B=P.salt;return B?$=s.create([1398893684,1701076831]).concat(B).concat(R):$=R,$.toString(u)},parse:function(P){var $,R=u.parse(P),B=R.words;return B[0]==1398893684&&B[1]==1701076831&&($=s.create(B.slice(2,4)),B.splice(0,4),R.sigBytes-=16),C.create({ciphertext:R,salt:$})}},T=i.SerializableCipher=a.extend({cfg:a.extend({format:w}),encrypt:function(P,$,R,B){B=this.cfg.extend(B);var j=P.createEncryptor(R,B),Y=j.finalize($),J=j.cfg;return C.create({ciphertext:Y,key:R,iv:J.iv,algorithm:P,mode:J.mode,padding:J.padding,blockSize:P.blockSize,formatter:B.format})},decrypt:function(P,$,R,B){B=this.cfg.extend(B),$=this._parse($,B.format);var j=P.createDecryptor(R,B).finalize($.ciphertext);return j},_parse:function(P,$){return typeof P=="string"?$.parse(P,this):P}}),S=n.kdf={},E=S.OpenSSL={execute:function(P,$,R,B){B||(B=s.random(64/8));var j=f.create({keySize:$+R}).compute(P,B),Y=s.create(j.words.slice($),R*4);return j.sigBytes=$*4,C.create({key:j,iv:Y,salt:B})}},I=i.PasswordBasedCipher=T.extend({cfg:T.cfg.extend({kdf:E}),encrypt:function(P,$,R,B){B=this.cfg.extend(B);var j=B.kdf.execute(R,P.keySize,P.ivSize);B.iv=j.iv;var Y=T.encrypt.call(this,P,$,j.key,B);return Y.mixIn(j),Y},decrypt:function(P,$,R,B){B=this.cfg.extend(B),$=this._parse($,B.format);var j=B.kdf.execute(R,P.keySize,P.ivSize,$.salt);B.iv=j.iv;var Y=T.decrypt.call(this,P,$,j.key,B);return Y}})}()})}(OL)),za}var Na={},BL={get exports(){return Na},set exports(e){Na=e}},yf;function HL(){return yf||(yf=1,function(e,t){(function(r,o,n){e.exports=o(De(),yt())})(Ae,function(r){return r.mode.CFB=function(){var o=r.lib.BlockCipherMode.extend();o.Encryptor=o.extend({processBlock:function(i,a){var s=this._cipher,l=s.blockSize;n.call(this,i,a,l,s),this._prevBlock=i.slice(a,a+l)}}),o.Decryptor=o.extend({processBlock:function(i,a){var s=this._cipher,l=s.blockSize,c=i.slice(a,a+l);n.call(this,i,a,l,s),this._prevBlock=c}});function n(i,a,s,l){var c,u=this._iv;u?(c=u.slice(0),this._iv=void 0):c=this._prevBlock,l.encryptBlock(c,0);for(var d=0;d>24&255)===255){var l=s>>16&255,c=s>>8&255,u=s&255;l===255?(l=0,c===255?(c=0,u===255?u=0:++u):++c):++l,s=0,s+=l<<16,s+=c<<8,s+=u}else s+=1<<24;return s}function i(s){return(s[0]=n(s[0]))===0&&(s[1]=n(s[1])),s}var a=o.Encryptor=o.extend({processBlock:function(s,l){var c=this._cipher,u=c.blockSize,d=this._iv,f=this._counter;d&&(f=this._counter=d.slice(0),this._iv=void 0),i(f);var p=f.slice(0);c.encryptBlock(p,0);for(var h=0;h>>2]|=s<<24-l%4*8,o.sigBytes+=s},unpad:function(o){var n=o.words[o.sigBytes-1>>>2]&255;o.sigBytes-=n}},r.pad.Ansix923})}(VL)),qa}var Ga={},GL={get exports(){return Ga},set exports(e){Ga=e}},Pf;function KL(){return Pf||(Pf=1,function(e,t){(function(r,o,n){e.exports=o(De(),yt())})(Ae,function(r){return r.pad.Iso10126={pad:function(o,n){var i=n*4,a=i-o.sigBytes%i;o.concat(r.lib.WordArray.random(a-1)).concat(r.lib.WordArray.create([a<<24],1))},unpad:function(o){var n=o.words[o.sigBytes-1>>>2]&255;o.sigBytes-=n}},r.pad.Iso10126})}(GL)),Ga}var Ka={},ZL={get exports(){return Ka},set exports(e){Ka=e}},kf;function XL(){return kf||(kf=1,function(e,t){(function(r,o,n){e.exports=o(De(),yt())})(Ae,function(r){return r.pad.Iso97971={pad:function(o,n){o.concat(r.lib.WordArray.create([2147483648],1)),r.pad.ZeroPadding.pad(o,n)},unpad:function(o){r.pad.ZeroPadding.unpad(o),o.sigBytes--}},r.pad.Iso97971})}(ZL)),Ka}var Za={},YL={get exports(){return Za},set exports(e){Za=e}},Lf;function QL(){return Lf||(Lf=1,function(e,t){(function(r,o,n){e.exports=o(De(),yt())})(Ae,function(r){return r.pad.ZeroPadding={pad:function(o,n){var i=n*4;o.clamp(),o.sigBytes+=i-(o.sigBytes%i||i)},unpad:function(o){for(var n=o.words,i=o.sigBytes-1,i=o.sigBytes-1;i>=0;i--)if(n[i>>>2]>>>24-i%4*8&255){o.sigBytes=i+1;break}}},r.pad.ZeroPadding})}(YL)),Za}var Xa={},JL={get exports(){return Xa},set exports(e){Xa=e}},$f;function e$(){return $f||($f=1,function(e,t){(function(r,o,n){e.exports=o(De(),yt())})(Ae,function(r){return r.pad.NoPadding={pad:function(){},unpad:function(){}},r.pad.NoPadding})}(JL)),Xa}var Ya={},t$={get exports(){return Ya},set exports(e){Ya=e}},If;function r$(){return If||(If=1,function(e,t){(function(r,o,n){e.exports=o(De(),yt())})(Ae,function(r){return function(o){var n=r,i=n.lib,a=i.CipherParams,s=n.enc,l=s.Hex,c=n.format;c.Hex={stringify:function(u){return u.ciphertext.toString(l)},parse:function(u){var d=l.parse(u);return a.create({ciphertext:d})}}}(),r.format.Hex})}(t$)),Ya}var Qa={},o$={get exports(){return Qa},set exports(e){Qa=e}},Rf;function n$(){return Rf||(Rf=1,function(e,t){(function(r,o,n){e.exports=o(De(),vn(),bn(),Fo(),yt())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.BlockCipher,a=o.algo,s=[],l=[],c=[],u=[],d=[],f=[],p=[],h=[],m=[],v=[];(function(){for(var C=[],b=0;b<256;b++)b<128?C[b]=b<<1:C[b]=b<<1^283;for(var w=0,T=0,b=0;b<256;b++){var S=T^T<<1^T<<2^T<<3^T<<4;S=S>>>8^S&255^99,s[w]=S,l[S]=w;var E=C[w],I=C[E],P=C[I],$=C[S]*257^S*16843008;c[w]=$<<24|$>>>8,u[w]=$<<16|$>>>16,d[w]=$<<8|$>>>24,f[w]=$;var $=P*16843009^I*65537^E*257^w*16843008;p[S]=$<<24|$>>>8,h[S]=$<<16|$>>>16,m[S]=$<<8|$>>>24,v[S]=$,w?(w=E^C[C[C[P^E]]],T^=C[C[T]]):w=T=1}})();var g=[0,1,2,4,8,16,32,64,128,27,54],x=a.AES=i.extend({_doReset:function(){var C;if(!(this._nRounds&&this._keyPriorReset===this._key)){for(var b=this._keyPriorReset=this._key,w=b.words,T=b.sigBytes/4,S=this._nRounds=T+6,E=(S+1)*4,I=this._keySchedule=[],P=0;P6&&P%T==4&&(C=s[C>>>24]<<24|s[C>>>16&255]<<16|s[C>>>8&255]<<8|s[C&255]):(C=C<<8|C>>>24,C=s[C>>>24]<<24|s[C>>>16&255]<<16|s[C>>>8&255]<<8|s[C&255],C^=g[P/T|0]<<24),I[P]=I[P-T]^C);for(var $=this._invKeySchedule=[],R=0;R>>24]]^h[s[C>>>16&255]]^m[s[C>>>8&255]]^v[s[C&255]]}}},encryptBlock:function(C,b){this._doCryptBlock(C,b,this._keySchedule,c,u,d,f,s)},decryptBlock:function(C,b){var w=C[b+1];C[b+1]=C[b+3],C[b+3]=w,this._doCryptBlock(C,b,this._invKeySchedule,p,h,m,v,l);var w=C[b+1];C[b+1]=C[b+3],C[b+3]=w},_doCryptBlock:function(C,b,w,T,S,E,I,P){for(var $=this._nRounds,R=C[b]^w[0],B=C[b+1]^w[1],j=C[b+2]^w[2],Y=C[b+3]^w[3],J=4,Q=1;Q<$;Q++){var ie=T[R>>>24]^S[B>>>16&255]^E[j>>>8&255]^I[Y&255]^w[J++],ge=T[B>>>24]^S[j>>>16&255]^E[Y>>>8&255]^I[R&255]^w[J++],ve=T[j>>>24]^S[Y>>>16&255]^E[R>>>8&255]^I[B&255]^w[J++],z=T[Y>>>24]^S[R>>>16&255]^E[B>>>8&255]^I[j&255]^w[J++];R=ie,B=ge,j=ve,Y=z}var ie=(P[R>>>24]<<24|P[B>>>16&255]<<16|P[j>>>8&255]<<8|P[Y&255])^w[J++],ge=(P[B>>>24]<<24|P[j>>>16&255]<<16|P[Y>>>8&255]<<8|P[R&255])^w[J++],ve=(P[j>>>24]<<24|P[Y>>>16&255]<<16|P[R>>>8&255]<<8|P[B&255])^w[J++],z=(P[Y>>>24]<<24|P[R>>>16&255]<<16|P[B>>>8&255]<<8|P[j&255])^w[J++];C[b]=ie,C[b+1]=ge,C[b+2]=ve,C[b+3]=z},keySize:256/32});o.AES=i._createHelper(x)}(),r.AES})}(o$)),Qa}var Ja={},i$={get exports(){return Ja},set exports(e){Ja=e}},Af;function a$(){return Af||(Af=1,function(e,t){(function(r,o,n){e.exports=o(De(),vn(),bn(),Fo(),yt())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.WordArray,a=n.BlockCipher,s=o.algo,l=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],c=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],u=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],f=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],p=s.DES=a.extend({_doReset:function(){for(var g=this._key,x=g.words,C=[],b=0;b<56;b++){var w=l[b]-1;C[b]=x[w>>>5]>>>31-w%32&1}for(var T=this._subKeys=[],S=0;S<16;S++){for(var E=T[S]=[],I=u[S],b=0;b<24;b++)E[b/6|0]|=C[(c[b]-1+I)%28]<<31-b%6,E[4+(b/6|0)]|=C[28+(c[b+24]-1+I)%28]<<31-b%6;E[0]=E[0]<<1|E[0]>>>31;for(var b=1;b<7;b++)E[b]=E[b]>>>(b-1)*4+3;E[7]=E[7]<<5|E[7]>>>27}for(var P=this._invSubKeys=[],b=0;b<16;b++)P[b]=T[15-b]},encryptBlock:function(g,x){this._doCryptBlock(g,x,this._subKeys)},decryptBlock:function(g,x){this._doCryptBlock(g,x,this._invSubKeys)},_doCryptBlock:function(g,x,C){this._lBlock=g[x],this._rBlock=g[x+1],h.call(this,4,252645135),h.call(this,16,65535),m.call(this,2,858993459),m.call(this,8,16711935),h.call(this,1,1431655765);for(var b=0;b<16;b++){for(var w=C[b],T=this._lBlock,S=this._rBlock,E=0,I=0;I<8;I++)E|=d[I][((S^w[I])&f[I])>>>0];this._lBlock=S,this._rBlock=T^E}var P=this._lBlock;this._lBlock=this._rBlock,this._rBlock=P,h.call(this,1,1431655765),m.call(this,8,16711935),m.call(this,2,858993459),h.call(this,16,65535),h.call(this,4,252645135),g[x]=this._lBlock,g[x+1]=this._rBlock},keySize:64/32,ivSize:64/32,blockSize:64/32});function h(g,x){var C=(this._lBlock>>>g^this._rBlock)&x;this._rBlock^=C,this._lBlock^=C<>>g^this._lBlock)&x;this._lBlock^=C,this._rBlock^=C<192.");var C=x.slice(0,2),b=x.length<4?x.slice(0,2):x.slice(2,4),w=x.length<6?x.slice(0,2):x.slice(4,6);this._des1=p.createEncryptor(i.create(C)),this._des2=p.createEncryptor(i.create(b)),this._des3=p.createEncryptor(i.create(w))},encryptBlock:function(g,x){this._des1.encryptBlock(g,x),this._des2.decryptBlock(g,x),this._des3.encryptBlock(g,x)},decryptBlock:function(g,x){this._des3.decryptBlock(g,x),this._des2.encryptBlock(g,x),this._des1.decryptBlock(g,x)},keySize:192/32,ivSize:64/32,blockSize:64/32});o.TripleDES=a._createHelper(v)}(),r.TripleDES})}(i$)),Ja}var es={},s$={get exports(){return es},set exports(e){es=e}},Of;function l$(){return Of||(Of=1,function(e,t){(function(r,o,n){e.exports=o(De(),vn(),bn(),Fo(),yt())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.StreamCipher,a=o.algo,s=a.RC4=i.extend({_doReset:function(){for(var u=this._key,d=u.words,f=u.sigBytes,p=this._S=[],h=0;h<256;h++)p[h]=h;for(var h=0,m=0;h<256;h++){var v=h%f,g=d[v>>>2]>>>24-v%4*8&255;m=(m+p[h]+g)%256;var x=p[h];p[h]=p[m],p[m]=x}this._i=this._j=0},_doProcessBlock:function(u,d){u[d]^=l.call(this)},keySize:256/32,ivSize:0});function l(){for(var u=this._S,d=this._i,f=this._j,p=0,h=0;h<4;h++){d=(d+1)%256,f=(f+u[d])%256;var m=u[d];u[d]=u[f],u[f]=m,p|=u[(u[d]+u[f])%256]<<24-h*8}return this._i=d,this._j=f,p}o.RC4=i._createHelper(s);var c=a.RC4Drop=s.extend({cfg:s.cfg.extend({drop:192}),_doReset:function(){s._doReset.call(this);for(var u=this.cfg.drop;u>0;u--)l.call(this)}});o.RC4Drop=i._createHelper(c)}(),r.RC4})}(s$)),es}var ts={},c$={get exports(){return ts},set exports(e){ts=e}},Bf;function u$(){return Bf||(Bf=1,function(e,t){(function(r,o,n){e.exports=o(De(),vn(),bn(),Fo(),yt())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.StreamCipher,a=o.algo,s=[],l=[],c=[],u=a.Rabbit=i.extend({_doReset:function(){for(var f=this._key.words,p=this.cfg.iv,h=0;h<4;h++)f[h]=(f[h]<<8|f[h]>>>24)&16711935|(f[h]<<24|f[h]>>>8)&4278255360;var m=this._X=[f[0],f[3]<<16|f[2]>>>16,f[1],f[0]<<16|f[3]>>>16,f[2],f[1]<<16|f[0]>>>16,f[3],f[2]<<16|f[1]>>>16],v=this._C=[f[2]<<16|f[2]>>>16,f[0]&4294901760|f[1]&65535,f[3]<<16|f[3]>>>16,f[1]&4294901760|f[2]&65535,f[0]<<16|f[0]>>>16,f[2]&4294901760|f[3]&65535,f[1]<<16|f[1]>>>16,f[3]&4294901760|f[0]&65535];this._b=0;for(var h=0;h<4;h++)d.call(this);for(var h=0;h<8;h++)v[h]^=m[h+4&7];if(p){var g=p.words,x=g[0],C=g[1],b=(x<<8|x>>>24)&16711935|(x<<24|x>>>8)&4278255360,w=(C<<8|C>>>24)&16711935|(C<<24|C>>>8)&4278255360,T=b>>>16|w&4294901760,S=w<<16|b&65535;v[0]^=b,v[1]^=T,v[2]^=w,v[3]^=S,v[4]^=b,v[5]^=T,v[6]^=w,v[7]^=S;for(var h=0;h<4;h++)d.call(this)}},_doProcessBlock:function(f,p){var h=this._X;d.call(this),s[0]=h[0]^h[5]>>>16^h[3]<<16,s[1]=h[2]^h[7]>>>16^h[5]<<16,s[2]=h[4]^h[1]>>>16^h[7]<<16,s[3]=h[6]^h[3]>>>16^h[1]<<16;for(var m=0;m<4;m++)s[m]=(s[m]<<8|s[m]>>>24)&16711935|(s[m]<<24|s[m]>>>8)&4278255360,f[p+m]^=s[m]},blockSize:128/32,ivSize:64/32});function d(){for(var f=this._X,p=this._C,h=0;h<8;h++)l[h]=p[h];p[0]=p[0]+1295307597+this._b|0,p[1]=p[1]+3545052371+(p[0]>>>0>>0?1:0)|0,p[2]=p[2]+886263092+(p[1]>>>0>>0?1:0)|0,p[3]=p[3]+1295307597+(p[2]>>>0>>0?1:0)|0,p[4]=p[4]+3545052371+(p[3]>>>0>>0?1:0)|0,p[5]=p[5]+886263092+(p[4]>>>0>>0?1:0)|0,p[6]=p[6]+1295307597+(p[5]>>>0>>0?1:0)|0,p[7]=p[7]+3545052371+(p[6]>>>0>>0?1:0)|0,this._b=p[7]>>>0>>0?1:0;for(var h=0;h<8;h++){var m=f[h]+p[h],v=m&65535,g=m>>>16,x=((v*v>>>17)+v*g>>>15)+g*g,C=((m&4294901760)*m|0)+((m&65535)*m|0);c[h]=x^C}f[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0,f[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0,f[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0,f[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0,f[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0,f[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0,f[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0,f[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}o.Rabbit=i._createHelper(u)}(),r.Rabbit})}(c$)),ts}var rs={},d$={get exports(){return rs},set exports(e){rs=e}},Hf;function f$(){return Hf||(Hf=1,function(e,t){(function(r,o,n){e.exports=o(De(),vn(),bn(),Fo(),yt())})(Ae,function(r){return function(){var o=r,n=o.lib,i=n.StreamCipher,a=o.algo,s=[],l=[],c=[],u=a.RabbitLegacy=i.extend({_doReset:function(){var f=this._key.words,p=this.cfg.iv,h=this._X=[f[0],f[3]<<16|f[2]>>>16,f[1],f[0]<<16|f[3]>>>16,f[2],f[1]<<16|f[0]>>>16,f[3],f[2]<<16|f[1]>>>16],m=this._C=[f[2]<<16|f[2]>>>16,f[0]&4294901760|f[1]&65535,f[3]<<16|f[3]>>>16,f[1]&4294901760|f[2]&65535,f[0]<<16|f[0]>>>16,f[2]&4294901760|f[3]&65535,f[1]<<16|f[1]>>>16,f[3]&4294901760|f[0]&65535];this._b=0;for(var v=0;v<4;v++)d.call(this);for(var v=0;v<8;v++)m[v]^=h[v+4&7];if(p){var g=p.words,x=g[0],C=g[1],b=(x<<8|x>>>24)&16711935|(x<<24|x>>>8)&4278255360,w=(C<<8|C>>>24)&16711935|(C<<24|C>>>8)&4278255360,T=b>>>16|w&4294901760,S=w<<16|b&65535;m[0]^=b,m[1]^=T,m[2]^=w,m[3]^=S,m[4]^=b,m[5]^=T,m[6]^=w,m[7]^=S;for(var v=0;v<4;v++)d.call(this)}},_doProcessBlock:function(f,p){var h=this._X;d.call(this),s[0]=h[0]^h[5]>>>16^h[3]<<16,s[1]=h[2]^h[7]>>>16^h[5]<<16,s[2]=h[4]^h[1]>>>16^h[7]<<16,s[3]=h[6]^h[3]>>>16^h[1]<<16;for(var m=0;m<4;m++)s[m]=(s[m]<<8|s[m]>>>24)&16711935|(s[m]<<24|s[m]>>>8)&4278255360,f[p+m]^=s[m]},blockSize:128/32,ivSize:64/32});function d(){for(var f=this._X,p=this._C,h=0;h<8;h++)l[h]=p[h];p[0]=p[0]+1295307597+this._b|0,p[1]=p[1]+3545052371+(p[0]>>>0>>0?1:0)|0,p[2]=p[2]+886263092+(p[1]>>>0>>0?1:0)|0,p[3]=p[3]+1295307597+(p[2]>>>0>>0?1:0)|0,p[4]=p[4]+3545052371+(p[3]>>>0>>0?1:0)|0,p[5]=p[5]+886263092+(p[4]>>>0>>0?1:0)|0,p[6]=p[6]+1295307597+(p[5]>>>0>>0?1:0)|0,p[7]=p[7]+3545052371+(p[6]>>>0>>0?1:0)|0,this._b=p[7]>>>0>>0?1:0;for(var h=0;h<8;h++){var m=f[h]+p[h],v=m&65535,g=m>>>16,x=((v*v>>>17)+v*g>>>15)+g*g,C=((m&4294901760)*m|0)+((m&65535)*m|0);c[h]=x^C}f[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0,f[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0,f[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0,f[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0,f[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0,f[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0,f[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0,f[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}o.RabbitLegacy=i._createHelper(u)}(),r.RabbitLegacy})}(d$)),rs}(function(e,t){(function(r,o,n){e.exports=o(De(),Ns(),fL(),pL(),vn(),xL(),bn(),Ru(),Ex(),SL(),Px(),TL(),PL(),LL(),Au(),RL(),Fo(),yt(),HL(),DL(),zL(),WL(),UL(),qL(),KL(),XL(),QL(),e$(),r$(),n$(),a$(),l$(),u$(),f$())})(Ae,function(r){return r})})(nL);const sc=ac,kx="__CRYPTO_SECRET__";function h$(e){const t=JSON.stringify(e);return sc.AES.encrypt(t,kx).toString()}function p$(e){const r=sc.AES.decrypt(e,kx).toString(sc.enc.Utf8);return r?JSON.parse(r):null}function Lx(e){const{expire:r,crypto:o}=Object.assign({expire:604800,crypto:!0},e);function n(l,c){const u={data:c,expire:r!==null?new Date().getTime()+r*1e3:null},d=o?h$(u):JSON.stringify(u);window.localStorage.setItem(l,d)}function i(l){const c=window.localStorage.getItem(l);if(c){let u=null;try{u=o?p$(c):JSON.parse(c)}catch{}if(u){const{data:d,expire:f}=u;if(f===null||f>=Date.now())return d}return a(l),null}}function a(l){window.localStorage.removeItem(l)}function s(){window.localStorage.clear()}return{set:n,get:i,remove:a,clear:s}}Lx();const Rt=Lx({expire:null,crypto:!1}),Ou="appSetting";function $x(){const e=navigator.language.toLowerCase();let t="en-US";return e.includes("zh")&&(t="zh-CN"),{siderCollapsed:!1,theme:"auto",language:t}}function m$(){const e=Rt.get(Ou);return{...$x(),...e}}function g$(e){Rt.set(Ou,e)}function x$(){Rt.remove(Ou)}const Ws=Do("app-store",{state:()=>m$(),actions:{setSiderCollapsed(e){this.siderCollapsed=e,this.recordState()},setTheme(e){this.theme=e,this.recordState()},setLanguage(e){this.language!==e&&(this.language=e,this.recordState())},getTheme(){const{theme:e}=Bv();return e},recordState(){g$(this.$state)},removeToken(){this.$state=$x(),x$()}}}),Ix="userStorage";function Rx(){return{userInfo:{name:"-- --"}}}function v$(){const e=Rt.get(Ix);return{...Rx(),...e}}function b$(e){Rt.set(Ix,e)}const C$=Do("user-store",{state:()=>v$(),actions:{updateUserInfo(e){this.userInfo={...this.userInfo,...e},this.recordState()},resetUserInfo(){this.userInfo={...Rx().userInfo},this.recordState()},recordState(){b$(this.$state)}}}),Bu="AUTH_TOKEN";function y$(e){return Rt.set(Bu,e)}function S$(){return Rt.get(Bu)}function w$(){return Rt.remove(Bu)}var Ax=(e=>(e[e.VISIT_MODE_LOGIN=0]="VISIT_MODE_LOGIN",e[e.VISIT_MODE_PUBLIC=1]="VISIT_MODE_PUBLIC",e))(Ax||{});const Mf={token:null,userInfo:null,visitMode:Ax.VISIT_MODE_LOGIN},Ox=Do("auth-store",{state:()=>S$()||Mf,actions:{setToken(e){this.token=e,this.saveStorage()},setUserInfo(e){this.userInfo=e,this.saveStorage()},setVisitMode(e){this.visitMode=e,this.saveStorage()},saveStorage(){y$(this.$state)},removeToken(){this.$state=Mf,w$()}}});function _$(){return{siderCollapsed:!1,theme:"light",language:"zh-CN"}}Do("admin-store",{state:()=>_$(),actions:{setSiderCollapsed(e){this.siderCollapsed=e},setTheme(e){this.theme=e},setLanguage(e){this.language!==e&&(this.language=e)}}});const Bx="noticeStore";function T$(){return{global:[],username:{}}}function E$(){const e=Rt.get(Bx);return{...T$(),...e}}function P$(e){Rt.set(Bx,e)}const oH=Do("notice-store",{state:()=>E$(),actions:{setReadByGlobal(e){console.log("设置全局已读",e),this.global.push(e),this.recordState()},setReadByUsername(e,t){this.username[e]||(this.username[e]=[]),this.username[e].push(t),this.recordState()},getReadByNoticeId(e,t){return!(!this.global.includes(e)&&(!t||!this.username[t]||!this.username[t].includes(e)))},recordState(){P$(this.$state)}}}),k$="/assets/defaultBackground-80f713c8.webp",Hu="panelStorage",L$='';function lc(){return{backgroundImageSrc:k$,backgroundBlur:0,backgroundMaskNumber:0,iconStyle:yx.icon,iconTextColor:"#ffffff",iconTextInfoHideDescription:!1,iconTextIconHideTitle:!1,logoText:"Sun-Panel",logoImageSrc:"",clockShowSecond:!1,searchBoxShow:!1,searchBoxSearchIcon:!1,marginBottom:10,marginTop:10,maxWidth:1200,maxWidthUnit:"px",marginX:5,footerHtml:L$,systemMonitorShow:!1,systemMonitorShowTitle:!0,systemMonitorPublicVisitModeShow:!1,netModeChangeButtonShow:!0}}function Hx(){return{rightSiderCollapsed:!1,leftSiderCollapsed:!1,networkMode:Cx.wan,panelConfig:{...lc()}}}function $$(){const e=Rt.get(Hu);return{...Hx(),...e}}function I$(e){Rt.set(Hu,e)}function R$(){Rt.remove(Hu)}/*! - * vue-router v4.1.6 - * (c) 2022 Eduardo San Martin Morote - * @license MIT - */const qo=typeof window<"u";function A$(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const je=Object.assign;function gl(e,t){const r={};for(const o in t){const n=t[o];r[o]=ar(n)?n.map(e):e(n)}return r}const jn=()=>{},ar=Array.isArray,O$=/\/$/,B$=e=>e.replace(O$,"");function xl(e,t,r="/"){let o,n={},i="",a="";const s=t.indexOf("#");let l=t.indexOf("?");return s=0&&(l=-1),l>-1&&(o=t.slice(0,l),i=t.slice(l+1,s>-1?s:t.length),n=e(i)),s>-1&&(o=o||t.slice(0,s),a=t.slice(s,t.length)),o=F$(o??t,r),{fullPath:o+(i&&"?")+i+a,path:o,query:n,hash:a}}function H$(e,t){const r=t.query?e(t.query):"";return t.path+(r&&"?")+r+(t.hash||"")}function Df(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function M$(e,t,r){const o=t.matched.length-1,n=r.matched.length-1;return o>-1&&o===n&&on(t.matched[o],r.matched[n])&&Mx(t.params,r.params)&&e(t.query)===e(r.query)&&t.hash===r.hash}function on(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Mx(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const r in e)if(!D$(e[r],t[r]))return!1;return!0}function D$(e,t){return ar(e)?Ff(e,t):ar(t)?Ff(t,e):e===t}function Ff(e,t){return ar(t)?e.length===t.length&&e.every((r,o)=>r===t[o]):e.length===1&&e[0]===t}function F$(e,t){if(e.startsWith("/"))return e;if(!e)return t;const r=t.split("/"),o=e.split("/");let n=r.length-1,i,a;for(i=0;i1&&n--;else break;return r.slice(0,n).join("/")+"/"+o.slice(i-(i===o.length?1:0)).join("/")}var fi;(function(e){e.pop="pop",e.push="push"})(fi||(fi={}));var Un;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Un||(Un={}));function z$(e){if(!e)if(qo){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),B$(e)}const N$=/^[^#]+#/;function W$(e,t){return e.replace(N$,"#")+t}function j$(e,t){const r=document.documentElement.getBoundingClientRect(),o=e.getBoundingClientRect();return{behavior:t.behavior,left:o.left-r.left-(t.left||0),top:o.top-r.top-(t.top||0)}}const js=()=>({left:window.pageXOffset,top:window.pageYOffset});function U$(e){let t;if("el"in e){const r=e.el,o=typeof r=="string"&&r.startsWith("#"),n=typeof r=="string"?o?document.getElementById(r.slice(1)):document.querySelector(r):r;if(!n)return;t=j$(n,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function zf(e,t){return(history.state?history.state.position-t:-1)+e}const cc=new Map;function V$(e,t){cc.set(e,t)}function q$(e){const t=cc.get(e);return cc.delete(e),t}let G$=()=>location.protocol+"//"+location.host;function Dx(e,t){const{pathname:r,search:o,hash:n}=t,i=e.indexOf("#");if(i>-1){let s=n.includes(e.slice(i))?e.slice(i).length:1,l=n.slice(s);return l[0]!=="/"&&(l="/"+l),Df(l,"")}return Df(r,e)+o+n}function K$(e,t,r,o){let n=[],i=[],a=null;const s=({state:f})=>{const p=Dx(e,location),h=r.value,m=t.value;let v=0;if(f){if(r.value=p,t.value=f,a&&a===h){a=null;return}v=m?f.position-m.position:0}else o(p);n.forEach(g=>{g(r.value,h,{delta:v,type:fi.pop,direction:v?v>0?Un.forward:Un.back:Un.unknown})})};function l(){a=r.value}function c(f){n.push(f);const p=()=>{const h=n.indexOf(f);h>-1&&n.splice(h,1)};return i.push(p),p}function u(){const{history:f}=window;f.state&&f.replaceState(je({},f.state,{scroll:js()}),"")}function d(){for(const f of i)f();i=[],window.removeEventListener("popstate",s),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",s),window.addEventListener("beforeunload",u),{pauseListeners:l,listen:c,destroy:d}}function Nf(e,t,r,o=!1,n=!1){return{back:e,current:t,forward:r,replaced:o,position:window.history.length,scroll:n?js():null}}function Z$(e){const{history:t,location:r}=window,o={value:Dx(e,r)},n={value:t.state};n.value||i(o.value,{back:null,current:o.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(l,c,u){const d=e.indexOf("#"),f=d>-1?(r.host&&document.querySelector("base")?e:e.slice(d))+l:G$()+e+l;try{t[u?"replaceState":"pushState"](c,"",f),n.value=c}catch(p){console.error(p),r[u?"replace":"assign"](f)}}function a(l,c){const u=je({},t.state,Nf(n.value.back,l,n.value.forward,!0),c,{position:n.value.position});i(l,u,!0),o.value=l}function s(l,c){const u=je({},n.value,t.state,{forward:l,scroll:js()});i(u.current,u,!0);const d=je({},Nf(o.value,l,null),{position:u.position+1},c);i(l,d,!1),o.value=l}return{location:o,state:n,push:s,replace:a}}function X$(e){e=z$(e);const t=Z$(e),r=K$(e,t.state,t.location,t.replace);function o(i,a=!0){a||r.pauseListeners(),history.go(i)}const n=je({location:"",base:e,go:o,createHref:W$.bind(null,e)},t,r);return Object.defineProperty(n,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(n,"state",{enumerable:!0,get:()=>t.state.value}),n}function Y$(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),X$(e)}function Q$(e){return typeof e=="string"||e&&typeof e=="object"}function Fx(e){return typeof e=="string"||typeof e=="symbol"}const Ur={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},zx=Symbol("");var Wf;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Wf||(Wf={}));function nn(e,t){return je(new Error,{type:e,[zx]:!0},t)}function Tr(e,t){return e instanceof Error&&zx in e&&(t==null||!!(e.type&t))}const jf="[^/]+?",J$={sensitive:!1,strict:!1,start:!0,end:!0},eI=/[.+*?^${}()[\]/\\]/g;function tI(e,t){const r=je({},J$,t),o=[];let n=r.start?"^":"";const i=[];for(const c of e){const u=c.length?[]:[90];r.strict&&!c.length&&(n+="/");for(let d=0;dt.length?t.length===1&&t[0]===40+40?1:-1:0}function oI(e,t){let r=0;const o=e.score,n=t.score;for(;r0&&t[t.length-1]<0}const nI={type:0,value:""},iI=/[a-zA-Z0-9_]/;function aI(e){if(!e)return[[]];if(e==="/")return[[nI]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${r})/"${c}": ${p}`)}let r=0,o=r;const n=[];let i;function a(){i&&n.push(i),i=[]}let s=0,l,c="",u="";function d(){c&&(r===0?i.push({type:0,value:c}):r===1||r===2||r===3?(i.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:c,regexp:u,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),c="")}function f(){c+=l}for(;s{a(x)}:jn}function a(u){if(Fx(u)){const d=o.get(u);d&&(o.delete(u),r.splice(r.indexOf(d),1),d.children.forEach(a),d.alias.forEach(a))}else{const d=r.indexOf(u);d>-1&&(r.splice(d,1),u.record.name&&o.delete(u.record.name),u.children.forEach(a),u.alias.forEach(a))}}function s(){return r}function l(u){let d=0;for(;d=0&&(u.record.path!==r[d].record.path||!Nx(u,r[d]));)d++;r.splice(d,0,u),u.record.name&&!qf(u)&&o.set(u.record.name,u)}function c(u,d){let f,p={},h,m;if("name"in u&&u.name){if(f=o.get(u.name),!f)throw nn(1,{location:u});m=f.record.name,p=je(Vf(d.params,f.keys.filter(x=>!x.optional).map(x=>x.name)),u.params&&Vf(u.params,f.keys.map(x=>x.name))),h=f.stringify(p)}else if("path"in u)h=u.path,f=r.find(x=>x.re.test(h)),f&&(p=f.parse(h),m=f.record.name);else{if(f=d.name?o.get(d.name):r.find(x=>x.re.test(d.path)),!f)throw nn(1,{location:u,currentLocation:d});m=f.record.name,p=je({},d.params,u.params),h=f.stringify(p)}const v=[];let g=f;for(;g;)v.unshift(g.record),g=g.parent;return{name:m,path:h,params:p,matched:v,meta:dI(v)}}return e.forEach(u=>i(u)),{addRoute:i,resolve:c,removeRoute:a,getRoutes:s,getRecordMatcher:n}}function Vf(e,t){const r={};for(const o of t)o in e&&(r[o]=e[o]);return r}function cI(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:uI(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function uI(e){const t={},r=e.props||!1;if("component"in e)t.default=r;else for(const o in e.components)t[o]=typeof r=="boolean"?r:r[o];return t}function qf(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function dI(e){return e.reduce((t,r)=>je(t,r.meta),{})}function Gf(e,t){const r={};for(const o in e)r[o]=o in t?t[o]:e[o];return r}function Nx(e,t){return t.children.some(r=>r===e||Nx(e,r))}const Wx=/#/g,fI=/&/g,hI=/\//g,pI=/=/g,mI=/\?/g,jx=/\+/g,gI=/%5B/g,xI=/%5D/g,Ux=/%5E/g,vI=/%60/g,Vx=/%7B/g,bI=/%7C/g,qx=/%7D/g,CI=/%20/g;function Mu(e){return encodeURI(""+e).replace(bI,"|").replace(gI,"[").replace(xI,"]")}function yI(e){return Mu(e).replace(Vx,"{").replace(qx,"}").replace(Ux,"^")}function uc(e){return Mu(e).replace(jx,"%2B").replace(CI,"+").replace(Wx,"%23").replace(fI,"%26").replace(vI,"`").replace(Vx,"{").replace(qx,"}").replace(Ux,"^")}function SI(e){return uc(e).replace(pI,"%3D")}function wI(e){return Mu(e).replace(Wx,"%23").replace(mI,"%3F")}function _I(e){return e==null?"":wI(e).replace(hI,"%2F")}function os(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function TI(e){const t={};if(e===""||e==="?")return t;const o=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;ni&&uc(i)):[o&&uc(o)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+r,i!=null&&(t+="="+i))})}return t}function EI(e){const t={};for(const r in e){const o=e[r];o!==void 0&&(t[r]=ar(o)?o.map(n=>n==null?null:""+n):o==null?o:""+o)}return t}const PI=Symbol(""),Zf=Symbol(""),Us=Symbol(""),Gx=Symbol(""),dc=Symbol("");function kn(){let e=[];function t(o){return e.push(o),()=>{const n=e.indexOf(o);n>-1&&e.splice(n,1)}}function r(){e=[]}return{add:t,list:()=>e,reset:r}}function Xr(e,t,r,o,n){const i=o&&(o.enterCallbacks[n]=o.enterCallbacks[n]||[]);return()=>new Promise((a,s)=>{const l=d=>{d===!1?s(nn(4,{from:r,to:t})):d instanceof Error?s(d):Q$(d)?s(nn(2,{from:t,to:d})):(i&&o.enterCallbacks[n]===i&&typeof d=="function"&&i.push(d),a())},c=e.call(o&&o.instances[n],t,r,l);let u=Promise.resolve(c);e.length<3&&(u=u.then(l)),u.catch(d=>s(d))})}function vl(e,t,r,o){const n=[];for(const i of e)for(const a in i.components){let s=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(kI(s)){const c=(s.__vccOpts||s)[t];c&&n.push(Xr(c,r,o,i,a))}else{let l=s();n.push(()=>l.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${a}" at "${i.path}"`));const u=A$(c)?c.default:c;i.components[a]=u;const f=(u.__vccOpts||u)[t];return f&&Xr(f,r,o,i,a)()}))}}return n}function kI(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Xf(e){const t=Me(Us),r=Me(Gx),o=ae(()=>t.resolve(pt(e.to))),n=ae(()=>{const{matched:l}=o.value,{length:c}=l,u=l[c-1],d=r.matched;if(!u||!d.length)return-1;const f=d.findIndex(on.bind(null,u));if(f>-1)return f;const p=Yf(l[c-2]);return c>1&&Yf(u)===p&&d[d.length-1].path!==p?d.findIndex(on.bind(null,l[c-2])):f}),i=ae(()=>n.value>-1&&RI(r.params,o.value.params)),a=ae(()=>n.value>-1&&n.value===r.matched.length-1&&Mx(r.params,o.value.params));function s(l={}){return II(l)?t[pt(e.replace)?"replace":"push"](pt(e.to)).catch(jn):Promise.resolve()}return{route:o,href:ae(()=>o.value.href),isActive:i,isExactActive:a,navigate:s}}const LI=Oe({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Xf,setup(e,{slots:t}){const r=Or(Xf(e)),{options:o}=Me(Us),n=ae(()=>({[Qf(e.activeClass,o.linkActiveClass,"router-link-active")]:r.isActive,[Qf(e.exactActiveClass,o.linkExactActiveClass,"router-link-exact-active")]:r.isExactActive}));return()=>{const i=t.default&&t.default(r);return e.custom?i:H("a",{"aria-current":r.isExactActive?e.ariaCurrentValue:null,href:r.href,onClick:r.navigate,class:n.value},i)}}}),$I=LI;function II(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function RI(e,t){for(const r in t){const o=t[r],n=e[r];if(typeof o=="string"){if(o!==n)return!1}else if(!ar(n)||n.length!==o.length||o.some((i,a)=>i!==n[a]))return!1}return!0}function Yf(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Qf=(e,t,r)=>e??t??r,AI=Oe({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:r}){const o=Me(dc),n=ae(()=>e.route||o.value),i=Me(Zf,0),a=ae(()=>{let c=pt(i);const{matched:u}=n.value;let d;for(;(d=u[c])&&!d.components;)c++;return c}),s=ae(()=>n.value.matched[a.value]);dt(Zf,ae(()=>a.value+1)),dt(PI,s),dt(dc,n);const l=de();return kt(()=>[l.value,s.value,e.name],([c,u,d],[f,p,h])=>{u&&(u.instances[d]=c,p&&p!==u&&c&&c===f&&(u.leaveGuards.size||(u.leaveGuards=p.leaveGuards),u.updateGuards.size||(u.updateGuards=p.updateGuards))),c&&u&&(!p||!on(u,p)||!f)&&(u.enterCallbacks[d]||[]).forEach(m=>m(c))},{flush:"post"}),()=>{const c=n.value,u=e.name,d=s.value,f=d&&d.components[u];if(!f)return Jf(r.default,{Component:f,route:c});const p=d.props[u],h=p?p===!0?c.params:typeof p=="function"?p(c):p:null,v=H(f,je({},h,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(d.instances[u]=null)},ref:l}));return Jf(r.default,{Component:v,route:c})||v}}});function Jf(e,t){if(!e)return null;const r=e(t);return r.length===1?r[0]:r}const OI=AI;function BI(e){const t=lI(e.routes,e),r=e.parseQuery||TI,o=e.stringifyQuery||Kf,n=e.history,i=kn(),a=kn(),s=kn(),l=fs(Ur);let c=Ur;qo&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=gl.bind(null,D=>""+D),d=gl.bind(null,_I),f=gl.bind(null,os);function p(D,U){let re,ee;return Fx(D)?(re=t.getRecordMatcher(D),ee=U):ee=D,t.addRoute(ee,re)}function h(D){const U=t.getRecordMatcher(D);U&&t.removeRoute(U)}function m(){return t.getRoutes().map(D=>D.record)}function v(D){return!!t.getRecordMatcher(D)}function g(D,U){if(U=je({},U||l.value),typeof D=="string"){const k=xl(r,D,U.path),y=t.resolve({path:k.path},U),_=n.createHref(k.fullPath);return je(k,y,{params:f(y.params),hash:os(k.hash),redirectedFrom:void 0,href:_})}let re;if("path"in D)re=je({},D,{path:xl(r,D.path,U.path).path});else{const k=je({},D.params);for(const y in k)k[y]==null&&delete k[y];re=je({},D,{params:d(D.params)}),U.params=d(U.params)}const ee=t.resolve(re,U),ce=D.hash||"";ee.params=u(f(ee.params));const ke=H$(o,je({},D,{hash:yI(ce),path:ee.path})),ye=n.createHref(ke);return je({fullPath:ke,hash:ce,query:o===Kf?EI(D.query):D.query||{}},ee,{redirectedFrom:void 0,href:ye})}function x(D){return typeof D=="string"?xl(r,D,l.value.path):je({},D)}function C(D,U){if(c!==D)return nn(8,{from:U,to:D})}function b(D){return S(D)}function w(D){return b(je(x(D),{replace:!0}))}function T(D){const U=D.matched[D.matched.length-1];if(U&&U.redirect){const{redirect:re}=U;let ee=typeof re=="function"?re(D):re;return typeof ee=="string"&&(ee=ee.includes("?")||ee.includes("#")?ee=x(ee):{path:ee},ee.params={}),je({query:D.query,hash:D.hash,params:"path"in ee?{}:D.params},ee)}}function S(D,U){const re=c=g(D),ee=l.value,ce=D.state,ke=D.force,ye=D.replace===!0,k=T(re);if(k)return S(je(x(k),{state:typeof k=="object"?je({},ce,k.state):ce,force:ke,replace:ye}),U||re);const y=re;y.redirectedFrom=U;let _;return!ke&&M$(o,ee,re)&&(_=nn(16,{to:y,from:ee}),ve(ee,ee,!0,!1)),(_?Promise.resolve(_):I(y,ee)).catch(L=>Tr(L)?Tr(L,2)?L:ge(L):Q(L,y,ee)).then(L=>{if(L){if(Tr(L,2))return S(je({replace:ye},x(L.to),{state:typeof L.to=="object"?je({},ce,L.to.state):ce,force:ke}),U||y)}else L=$(y,ee,!0,ye,ce);return P(y,ee,L),L})}function E(D,U){const re=C(D,U);return re?Promise.reject(re):Promise.resolve()}function I(D,U){let re;const[ee,ce,ke]=HI(D,U);re=vl(ee.reverse(),"beforeRouteLeave",D,U);for(const k of ee)k.leaveGuards.forEach(y=>{re.push(Xr(y,D,U))});const ye=E.bind(null,D,U);return re.push(ye),Uo(re).then(()=>{re=[];for(const k of i.list())re.push(Xr(k,D,U));return re.push(ye),Uo(re)}).then(()=>{re=vl(ce,"beforeRouteUpdate",D,U);for(const k of ce)k.updateGuards.forEach(y=>{re.push(Xr(y,D,U))});return re.push(ye),Uo(re)}).then(()=>{re=[];for(const k of D.matched)if(k.beforeEnter&&!U.matched.includes(k))if(ar(k.beforeEnter))for(const y of k.beforeEnter)re.push(Xr(y,D,U));else re.push(Xr(k.beforeEnter,D,U));return re.push(ye),Uo(re)}).then(()=>(D.matched.forEach(k=>k.enterCallbacks={}),re=vl(ke,"beforeRouteEnter",D,U),re.push(ye),Uo(re))).then(()=>{re=[];for(const k of a.list())re.push(Xr(k,D,U));return re.push(ye),Uo(re)}).catch(k=>Tr(k,8)?k:Promise.reject(k))}function P(D,U,re){for(const ee of s.list())ee(D,U,re)}function $(D,U,re,ee,ce){const ke=C(D,U);if(ke)return ke;const ye=U===Ur,k=qo?history.state:{};re&&(ee||ye?n.replace(D.fullPath,je({scroll:ye&&k&&k.scroll},ce)):n.push(D.fullPath,ce)),l.value=D,ve(D,U,re,ye),ge()}let R;function B(){R||(R=n.listen((D,U,re)=>{if(!V.listening)return;const ee=g(D),ce=T(ee);if(ce){S(je(ce,{replace:!0}),ee).catch(jn);return}c=ee;const ke=l.value;qo&&V$(zf(ke.fullPath,re.delta),js()),I(ee,ke).catch(ye=>Tr(ye,12)?ye:Tr(ye,2)?(S(ye.to,ee).then(k=>{Tr(k,20)&&!re.delta&&re.type===fi.pop&&n.go(-1,!1)}).catch(jn),Promise.reject()):(re.delta&&n.go(-re.delta,!1),Q(ye,ee,ke))).then(ye=>{ye=ye||$(ee,ke,!1),ye&&(re.delta&&!Tr(ye,8)?n.go(-re.delta,!1):re.type===fi.pop&&Tr(ye,20)&&n.go(-1,!1)),P(ee,ke,ye)}).catch(jn)}))}let j=kn(),Y=kn(),J;function Q(D,U,re){ge(D);const ee=Y.list();return ee.length?ee.forEach(ce=>ce(D,U,re)):console.error(D),Promise.reject(D)}function ie(){return J&&l.value!==Ur?Promise.resolve():new Promise((D,U)=>{j.add([D,U])})}function ge(D){return J||(J=!D,B(),j.list().forEach(([U,re])=>D?re(D):U()),j.reset()),D}function ve(D,U,re,ee){const{scrollBehavior:ce}=e;if(!qo||!ce)return Promise.resolve();const ke=!re&&q$(zf(D.fullPath,0))||(ee||!re)&&history.state&&history.state.scroll||null;return jt().then(()=>ce(D,U,ke)).then(ye=>ye&&U$(ye)).catch(ye=>Q(ye,D,U))}const z=D=>n.go(D);let W;const Z=new Set,V={currentRoute:l,listening:!0,addRoute:p,removeRoute:h,hasRoute:v,getRoutes:m,resolve:g,options:e,push:b,replace:w,go:z,back:()=>z(-1),forward:()=>z(1),beforeEach:i.add,beforeResolve:a.add,afterEach:s.add,onError:Y.add,isReady:ie,install(D){const U=this;D.component("RouterLink",$I),D.component("RouterView",OI),D.config.globalProperties.$router=U,Object.defineProperty(D.config.globalProperties,"$route",{enumerable:!0,get:()=>pt(l)}),qo&&!W&&l.value===Ur&&(W=!0,b(n.location).catch(ce=>{}));const re={};for(const ce in Ur)re[ce]=ae(()=>l.value[ce]);D.provide(Us,U),D.provide(Gx,Or(re)),D.provide(dc,l);const ee=D.unmount;Z.add(D),D.unmount=function(){Z.delete(D),Z.size<1&&(c=Ur,R&&R(),R=null,l.value=Ur,W=!1,J=!1),ee()}}};return V}function Uo(e){return e.reduce((t,r)=>t.then(()=>r()),Promise.resolve())}function HI(e,t){const r=[],o=[],n=[],i=Math.max(t.matched.length,e.matched.length);for(let a=0;aon(c,s))?o.push(s):r.push(s));const l=e.matched[a];l&&(t.matched.find(c=>on(c,l))||n.push(l))}return[r,o,n]}function nH(){return Me(Us)}function MI(e){e.beforeEach(async(t,r,o)=>{C$().userInfo.role!==1&&t.path.includes("admin")?o({name:"404"}):o()})}const DI=[{path:"/",name:"Home",component:()=>Pn(()=>import("./index-bc9666b7.js").then(e=>e.p),["assets/index-bc9666b7.js","assets/index-b1d3d9b0.js","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-2b595d91.js","assets/index-c4f1fb1a.css"])},{path:"/login",name:"login",component:()=>Pn(()=>import("./index-fd895f10.js"),["assets/index-fd895f10.js","assets/index-8f0537f1.js","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-2b595d91.js","assets/GradientText-44d798c5.js","assets/index-7ae5884e.css"])},{path:"/404",name:"404",component:()=>Pn(()=>import("./index-8f8851de.js"),[])},{path:"/500",name:"500",component:()=>Pn(()=>import("./index-ed75c22d.js"),["assets/index-ed75c22d.js","assets/_plugin-vue_export-helper-c27b6911.js"])},{path:"/:pathMatch(.*)*",name:"notFound",redirect:"/404"},{path:"/test",name:"test",component:()=>Pn(()=>import("./index-e0b65a22.js"),["assets/index-e0b65a22.js","assets/index-d074e84b.js","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-b1d3d9b0.js","assets/Alert-018ca7af.js","assets/index-d715da4a.css","assets/index-2b251fda.css"])}],an=BI({history:Y$(),routes:DI,scrollBehavior:()=>({left:0,top:0})});MI(an);async function FI(e){e.use(an),await an.isReady()}function Kx(e,t){return function(){return e.apply(t,arguments)}}const{toString:Zx}=Object.prototype,{getPrototypeOf:Du}=Object,Fu=(e=>t=>{const r=Zx.call(t);return e[r]||(e[r]=r.slice(8,-1).toLowerCase())})(Object.create(null)),Fr=e=>(e=e.toLowerCase(),t=>Fu(t)===e),Vs=e=>t=>typeof t===e,{isArray:Cn}=Array,hi=Vs("undefined");function zI(e){return e!==null&&!hi(e)&&e.constructor!==null&&!hi(e.constructor)&&no(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Xx=Fr("ArrayBuffer");function NI(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Xx(e.buffer),t}const WI=Vs("string"),no=Vs("function"),Yx=Vs("number"),zu=e=>e!==null&&typeof e=="object",jI=e=>e===!0||e===!1,ia=e=>{if(Fu(e)!=="object")return!1;const t=Du(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},UI=Fr("Date"),VI=Fr("File"),qI=Fr("Blob"),GI=Fr("FileList"),KI=e=>zu(e)&&no(e.pipe),ZI=e=>{const t="[object FormData]";return e&&(typeof FormData=="function"&&e instanceof FormData||Zx.call(e)===t||no(e.toString)&&e.toString()===t)},XI=Fr("URLSearchParams"),YI=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ti(e,t,{allOwnKeys:r=!1}={}){if(e===null||typeof e>"u")return;let o,n;if(typeof e!="object"&&(e=[e]),Cn(e))for(o=0,n=e.length;o0;)if(n=r[o],t===n.toLowerCase())return n;return null}const Jx=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),ev=e=>!hi(e)&&e!==Jx;function fc(){const{caseless:e}=ev(this)&&this||{},t={},r=(o,n)=>{const i=e&&Qx(t,n)||n;ia(t[i])&&ia(o)?t[i]=fc(t[i],o):ia(o)?t[i]=fc({},o):Cn(o)?t[i]=o.slice():t[i]=o};for(let o=0,n=arguments.length;o(Ti(t,(n,i)=>{r&&no(n)?e[i]=Kx(n,r):e[i]=n},{allOwnKeys:o}),e),JI=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),eR=(e,t,r,o)=>{e.prototype=Object.create(t.prototype,o),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},tR=(e,t,r,o)=>{let n,i,a;const s={};if(t=t||{},e==null)return t;do{for(n=Object.getOwnPropertyNames(e),i=n.length;i-- >0;)a=n[i],(!o||o(a,e,t))&&!s[a]&&(t[a]=e[a],s[a]=!0);e=r!==!1&&Du(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},rR=(e,t,r)=>{e=String(e),(r===void 0||r>e.length)&&(r=e.length),r-=t.length;const o=e.indexOf(t,r);return o!==-1&&o===r},oR=e=>{if(!e)return null;if(Cn(e))return e;let t=e.length;if(!Yx(t))return null;const r=new Array(t);for(;t-- >0;)r[t]=e[t];return r},nR=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Du(Uint8Array)),iR=(e,t)=>{const o=(e&&e[Symbol.iterator]).call(e);let n;for(;(n=o.next())&&!n.done;){const i=n.value;t.call(e,i[0],i[1])}},aR=(e,t)=>{let r;const o=[];for(;(r=e.exec(t))!==null;)o.push(r);return o},sR=Fr("HTMLFormElement"),lR=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(r,o,n){return o.toUpperCase()+n}),eh=(({hasOwnProperty:e})=>(t,r)=>e.call(t,r))(Object.prototype),cR=Fr("RegExp"),tv=(e,t)=>{const r=Object.getOwnPropertyDescriptors(e),o={};Ti(r,(n,i)=>{t(n,i,e)!==!1&&(o[i]=n)}),Object.defineProperties(e,o)},uR=e=>{tv(e,(t,r)=>{if(no(e)&&["arguments","caller","callee"].indexOf(r)!==-1)return!1;const o=e[r];if(no(o)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")})}})},dR=(e,t)=>{const r={},o=n=>{n.forEach(i=>{r[i]=!0})};return Cn(e)?o(e):o(String(e).split(t)),r},fR=()=>{},hR=(e,t)=>(e=+e,Number.isFinite(e)?e:t),bl="abcdefghijklmnopqrstuvwxyz",th="0123456789",rv={DIGIT:th,ALPHA:bl,ALPHA_DIGIT:bl+bl.toUpperCase()+th},pR=(e=16,t=rv.ALPHA_DIGIT)=>{let r="";const{length:o}=t;for(;e--;)r+=t[Math.random()*o|0];return r};function mR(e){return!!(e&&no(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const gR=e=>{const t=new Array(10),r=(o,n)=>{if(zu(o)){if(t.indexOf(o)>=0)return;if(!("toJSON"in o)){t[n]=o;const i=Cn(o)?[]:{};return Ti(o,(a,s)=>{const l=r(a,n+1);!hi(l)&&(i[s]=l)}),t[n]=void 0,i}}return o};return r(e,0)},K={isArray:Cn,isArrayBuffer:Xx,isBuffer:zI,isFormData:ZI,isArrayBufferView:NI,isString:WI,isNumber:Yx,isBoolean:jI,isObject:zu,isPlainObject:ia,isUndefined:hi,isDate:UI,isFile:VI,isBlob:qI,isRegExp:cR,isFunction:no,isStream:KI,isURLSearchParams:XI,isTypedArray:nR,isFileList:GI,forEach:Ti,merge:fc,extend:QI,trim:YI,stripBOM:JI,inherits:eR,toFlatObject:tR,kindOf:Fu,kindOfTest:Fr,endsWith:rR,toArray:oR,forEachEntry:iR,matchAll:aR,isHTMLForm:sR,hasOwnProperty:eh,hasOwnProp:eh,reduceDescriptors:tv,freezeMethods:uR,toObjectSet:dR,toCamelCase:lR,noop:fR,toFiniteNumber:hR,findKey:Qx,global:Jx,isContextDefined:ev,ALPHABET:rv,generateString:pR,isSpecCompliantForm:mR,toJSONObject:gR};function Ne(e,t,r,o,n){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),o&&(this.request=o),n&&(this.response=n)}K.inherits(Ne,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:K.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const ov=Ne.prototype,nv={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{nv[e]={value:e}});Object.defineProperties(Ne,nv);Object.defineProperty(ov,"isAxiosError",{value:!0});Ne.from=(e,t,r,o,n,i)=>{const a=Object.create(ov);return K.toFlatObject(e,a,function(l){return l!==Error.prototype},s=>s!=="isAxiosError"),Ne.call(a,e.message,t,r,o,n),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};const xR=null;function hc(e){return K.isPlainObject(e)||K.isArray(e)}function iv(e){return K.endsWith(e,"[]")?e.slice(0,-2):e}function rh(e,t,r){return e?e.concat(t).map(function(n,i){return n=iv(n),!r&&i?"["+n+"]":n}).join(r?".":""):t}function vR(e){return K.isArray(e)&&!e.some(hc)}const bR=K.toFlatObject(K,{},null,function(t){return/^is[A-Z]/.test(t)});function qs(e,t,r){if(!K.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,r=K.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,function(m,v){return!K.isUndefined(v[m])});const o=r.metaTokens,n=r.visitor||u,i=r.dots,a=r.indexes,l=(r.Blob||typeof Blob<"u"&&Blob)&&K.isSpecCompliantForm(t);if(!K.isFunction(n))throw new TypeError("visitor must be a function");function c(h){if(h===null)return"";if(K.isDate(h))return h.toISOString();if(!l&&K.isBlob(h))throw new Ne("Blob is not supported. Use a Buffer instead.");return K.isArrayBuffer(h)||K.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function u(h,m,v){let g=h;if(h&&!v&&typeof h=="object"){if(K.endsWith(m,"{}"))m=o?m:m.slice(0,-2),h=JSON.stringify(h);else if(K.isArray(h)&&vR(h)||(K.isFileList(h)||K.endsWith(m,"[]"))&&(g=K.toArray(h)))return m=iv(m),g.forEach(function(C,b){!(K.isUndefined(C)||C===null)&&t.append(a===!0?rh([m],b,i):a===null?m:m+"[]",c(C))}),!1}return hc(h)?!0:(t.append(rh(v,m,i),c(h)),!1)}const d=[],f=Object.assign(bR,{defaultVisitor:u,convertValue:c,isVisitable:hc});function p(h,m){if(!K.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+m.join("."));d.push(h),K.forEach(h,function(g,x){(!(K.isUndefined(g)||g===null)&&n.call(t,g,K.isString(x)?x.trim():x,m,f))===!0&&p(g,m?m.concat(x):[x])}),d.pop()}}if(!K.isObject(e))throw new TypeError("data must be an object");return p(e),t}function oh(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(o){return t[o]})}function Nu(e,t){this._pairs=[],e&&qs(e,this,t)}const av=Nu.prototype;av.append=function(t,r){this._pairs.push([t,r])};av.toString=function(t){const r=t?function(o){return t.call(this,o,oh)}:oh;return this._pairs.map(function(n){return r(n[0])+"="+r(n[1])},"").join("&")};function CR(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function sv(e,t,r){if(!t)return e;const o=r&&r.encode||CR,n=r&&r.serialize;let i;if(n?i=n(t,r):i=K.isURLSearchParams(t)?t.toString():new Nu(t,r).toString(o),i){const a=e.indexOf("#");a!==-1&&(e=e.slice(0,a)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class yR{constructor(){this.handlers=[]}use(t,r,o){return this.handlers.push({fulfilled:t,rejected:r,synchronous:o?o.synchronous:!1,runWhen:o?o.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){K.forEach(this.handlers,function(o){o!==null&&t(o)})}}const nh=yR,lv={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},SR=typeof URLSearchParams<"u"?URLSearchParams:Nu,wR=typeof FormData<"u"?FormData:null,_R=typeof Blob<"u"?Blob:null,TR=(()=>{let e;return typeof navigator<"u"&&((e=navigator.product)==="ReactNative"||e==="NativeScript"||e==="NS")?!1:typeof window<"u"&&typeof document<"u"})(),ER=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),xr={isBrowser:!0,classes:{URLSearchParams:SR,FormData:wR,Blob:_R},isStandardBrowserEnv:TR,isStandardBrowserWebWorkerEnv:ER,protocols:["http","https","file","blob","url","data"]};function PR(e,t){return qs(e,new xr.classes.URLSearchParams,Object.assign({visitor:function(r,o,n,i){return xr.isNode&&K.isBuffer(r)?(this.append(o,r.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)}},t))}function kR(e){return K.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function LR(e){const t={},r=Object.keys(e);let o;const n=r.length;let i;for(o=0;o=r.length;return a=!a&&K.isArray(n)?n.length:a,l?(K.hasOwnProp(n,a)?n[a]=[n[a],o]:n[a]=o,!s):((!n[a]||!K.isObject(n[a]))&&(n[a]=[]),t(r,o,n[a],i)&&K.isArray(n[a])&&(n[a]=LR(n[a])),!s)}if(K.isFormData(e)&&K.isFunction(e.entries)){const r={};return K.forEachEntry(e,(o,n)=>{t(kR(o),n,r,0)}),r}return null}const $R={"Content-Type":void 0};function IR(e,t,r){if(K.isString(e))try{return(t||JSON.parse)(e),K.trim(e)}catch(o){if(o.name!=="SyntaxError")throw o}return(r||JSON.stringify)(e)}const Gs={transitional:lv,adapter:["xhr","http"],transformRequest:[function(t,r){const o=r.getContentType()||"",n=o.indexOf("application/json")>-1,i=K.isObject(t);if(i&&K.isHTMLForm(t)&&(t=new FormData(t)),K.isFormData(t))return n&&n?JSON.stringify(cv(t)):t;if(K.isArrayBuffer(t)||K.isBuffer(t)||K.isStream(t)||K.isFile(t)||K.isBlob(t))return t;if(K.isArrayBufferView(t))return t.buffer;if(K.isURLSearchParams(t))return r.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let s;if(i){if(o.indexOf("application/x-www-form-urlencoded")>-1)return PR(t,this.formSerializer).toString();if((s=K.isFileList(t))||o.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return qs(s?{"files[]":t}:t,l&&new l,this.formSerializer)}}return i||n?(r.setContentType("application/json",!1),IR(t)):t}],transformResponse:[function(t){const r=this.transitional||Gs.transitional,o=r&&r.forcedJSONParsing,n=this.responseType==="json";if(t&&K.isString(t)&&(o&&!this.responseType||n)){const a=!(r&&r.silentJSONParsing)&&n;try{return JSON.parse(t)}catch(s){if(a)throw s.name==="SyntaxError"?Ne.from(s,Ne.ERR_BAD_RESPONSE,this,null,this.response):s}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:xr.classes.FormData,Blob:xr.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};K.forEach(["delete","get","head"],function(t){Gs.headers[t]={}});K.forEach(["post","put","patch"],function(t){Gs.headers[t]=K.merge($R)});const Wu=Gs,RR=K.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),AR=e=>{const t={};let r,o,n;return e&&e.split(` -`).forEach(function(a){n=a.indexOf(":"),r=a.substring(0,n).trim().toLowerCase(),o=a.substring(n+1).trim(),!(!r||t[r]&&RR[r])&&(r==="set-cookie"?t[r]?t[r].push(o):t[r]=[o]:t[r]=t[r]?t[r]+", "+o:o)}),t},ih=Symbol("internals");function Ln(e){return e&&String(e).trim().toLowerCase()}function aa(e){return e===!1||e==null?e:K.isArray(e)?e.map(aa):String(e)}function OR(e){const t=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let o;for(;o=r.exec(e);)t[o[1]]=o[2];return t}function BR(e){return/^[-_a-zA-Z]+$/.test(e.trim())}function Cl(e,t,r,o,n){if(K.isFunction(o))return o.call(this,t,r);if(n&&(t=r),!!K.isString(t)){if(K.isString(o))return t.indexOf(o)!==-1;if(K.isRegExp(o))return o.test(t)}}function HR(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,r,o)=>r.toUpperCase()+o)}function MR(e,t){const r=K.toCamelCase(" "+t);["get","set","has"].forEach(o=>{Object.defineProperty(e,o+r,{value:function(n,i,a){return this[o].call(this,t,n,i,a)},configurable:!0})})}class Ks{constructor(t){t&&this.set(t)}set(t,r,o){const n=this;function i(s,l,c){const u=Ln(l);if(!u)throw new Error("header name must be a non-empty string");const d=K.findKey(n,u);(!d||n[d]===void 0||c===!0||c===void 0&&n[d]!==!1)&&(n[d||l]=aa(s))}const a=(s,l)=>K.forEach(s,(c,u)=>i(c,u,l));return K.isPlainObject(t)||t instanceof this.constructor?a(t,r):K.isString(t)&&(t=t.trim())&&!BR(t)?a(AR(t),r):t!=null&&i(r,t,o),this}get(t,r){if(t=Ln(t),t){const o=K.findKey(this,t);if(o){const n=this[o];if(!r)return n;if(r===!0)return OR(n);if(K.isFunction(r))return r.call(this,n,o);if(K.isRegExp(r))return r.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,r){if(t=Ln(t),t){const o=K.findKey(this,t);return!!(o&&this[o]!==void 0&&(!r||Cl(this,this[o],o,r)))}return!1}delete(t,r){const o=this;let n=!1;function i(a){if(a=Ln(a),a){const s=K.findKey(o,a);s&&(!r||Cl(o,o[s],s,r))&&(delete o[s],n=!0)}}return K.isArray(t)?t.forEach(i):i(t),n}clear(t){const r=Object.keys(this);let o=r.length,n=!1;for(;o--;){const i=r[o];(!t||Cl(this,this[i],i,t,!0))&&(delete this[i],n=!0)}return n}normalize(t){const r=this,o={};return K.forEach(this,(n,i)=>{const a=K.findKey(o,i);if(a){r[a]=aa(n),delete r[i];return}const s=t?HR(i):String(i).trim();s!==i&&delete r[i],r[s]=aa(n),o[s]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const r=Object.create(null);return K.forEach(this,(o,n)=>{o!=null&&o!==!1&&(r[n]=t&&K.isArray(o)?o.join(", "):o)}),r}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,r])=>t+": "+r).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...r){const o=new this(t);return r.forEach(n=>o.set(n)),o}static accessor(t){const o=(this[ih]=this[ih]={accessors:{}}).accessors,n=this.prototype;function i(a){const s=Ln(a);o[s]||(MR(n,a),o[s]=!0)}return K.isArray(t)?t.forEach(i):i(t),this}}Ks.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);K.freezeMethods(Ks.prototype);K.freezeMethods(Ks);const $r=Ks;function yl(e,t){const r=this||Wu,o=t||r,n=$r.from(o.headers);let i=o.data;return K.forEach(e,function(s){i=s.call(r,i,n.normalize(),t?t.status:void 0)}),n.normalize(),i}function uv(e){return!!(e&&e.__CANCEL__)}function Ei(e,t,r){Ne.call(this,e??"canceled",Ne.ERR_CANCELED,t,r),this.name="CanceledError"}K.inherits(Ei,Ne,{__CANCEL__:!0});function DR(e,t,r){const o=r.config.validateStatus;!r.status||!o||o(r.status)?e(r):t(new Ne("Request failed with status code "+r.status,[Ne.ERR_BAD_REQUEST,Ne.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}const FR=xr.isStandardBrowserEnv?function(){return{write:function(r,o,n,i,a,s){const l=[];l.push(r+"="+encodeURIComponent(o)),K.isNumber(n)&&l.push("expires="+new Date(n).toGMTString()),K.isString(i)&&l.push("path="+i),K.isString(a)&&l.push("domain="+a),s===!0&&l.push("secure"),document.cookie=l.join("; ")},read:function(r){const o=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return o?decodeURIComponent(o[3]):null},remove:function(r){this.write(r,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}();function zR(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function NR(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}function dv(e,t){return e&&!zR(t)?NR(e,t):t}const WR=xr.isStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement("a");let o;function n(i){let a=i;return t&&(r.setAttribute("href",a),a=r.href),r.setAttribute("href",a),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,""):"",host:r.host,search:r.search?r.search.replace(/^\?/,""):"",hash:r.hash?r.hash.replace(/^#/,""):"",hostname:r.hostname,port:r.port,pathname:r.pathname.charAt(0)==="/"?r.pathname:"/"+r.pathname}}return o=n(window.location.href),function(a){const s=K.isString(a)?n(a):a;return s.protocol===o.protocol&&s.host===o.host}}():function(){return function(){return!0}}();function jR(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function UR(e,t){e=e||10;const r=new Array(e),o=new Array(e);let n=0,i=0,a;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),u=o[i];a||(a=c),r[n]=l,o[n]=c;let d=i,f=0;for(;d!==n;)f+=r[d++],d=d%e;if(n=(n+1)%e,n===i&&(i=(i+1)%e),c-a{const i=n.loaded,a=n.lengthComputable?n.total:void 0,s=i-r,l=o(s),c=i<=a;r=i;const u={loaded:i,total:a,progress:a?i/a:void 0,bytes:s,rate:l||void 0,estimated:l&&a&&c?(a-i)/l:void 0,event:n};u[t?"download":"upload"]=!0,e(u)}}const VR=typeof XMLHttpRequest<"u",qR=VR&&function(e){return new Promise(function(r,o){let n=e.data;const i=$r.from(e.headers).normalize(),a=e.responseType;let s;function l(){e.cancelToken&&e.cancelToken.unsubscribe(s),e.signal&&e.signal.removeEventListener("abort",s)}K.isFormData(n)&&(xr.isStandardBrowserEnv||xr.isStandardBrowserWebWorkerEnv)&&i.setContentType(!1);let c=new XMLHttpRequest;if(e.auth){const p=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";i.set("Authorization","Basic "+btoa(p+":"+h))}const u=dv(e.baseURL,e.url);c.open(e.method.toUpperCase(),sv(u,e.params,e.paramsSerializer),!0),c.timeout=e.timeout;function d(){if(!c)return;const p=$r.from("getAllResponseHeaders"in c&&c.getAllResponseHeaders()),m={data:!a||a==="text"||a==="json"?c.responseText:c.response,status:c.status,statusText:c.statusText,headers:p,config:e,request:c};DR(function(g){r(g),l()},function(g){o(g),l()},m),c=null}if("onloadend"in c?c.onloadend=d:c.onreadystatechange=function(){!c||c.readyState!==4||c.status===0&&!(c.responseURL&&c.responseURL.indexOf("file:")===0)||setTimeout(d)},c.onabort=function(){c&&(o(new Ne("Request aborted",Ne.ECONNABORTED,e,c)),c=null)},c.onerror=function(){o(new Ne("Network Error",Ne.ERR_NETWORK,e,c)),c=null},c.ontimeout=function(){let h=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const m=e.transitional||lv;e.timeoutErrorMessage&&(h=e.timeoutErrorMessage),o(new Ne(h,m.clarifyTimeoutError?Ne.ETIMEDOUT:Ne.ECONNABORTED,e,c)),c=null},xr.isStandardBrowserEnv){const p=(e.withCredentials||WR(u))&&e.xsrfCookieName&&FR.read(e.xsrfCookieName);p&&i.set(e.xsrfHeaderName,p)}n===void 0&&i.setContentType(null),"setRequestHeader"in c&&K.forEach(i.toJSON(),function(h,m){c.setRequestHeader(m,h)}),K.isUndefined(e.withCredentials)||(c.withCredentials=!!e.withCredentials),a&&a!=="json"&&(c.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&c.addEventListener("progress",ah(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&c.upload&&c.upload.addEventListener("progress",ah(e.onUploadProgress)),(e.cancelToken||e.signal)&&(s=p=>{c&&(o(!p||p.type?new Ei(null,e,c):p),c.abort(),c=null)},e.cancelToken&&e.cancelToken.subscribe(s),e.signal&&(e.signal.aborted?s():e.signal.addEventListener("abort",s)));const f=jR(u);if(f&&xr.protocols.indexOf(f)===-1){o(new Ne("Unsupported protocol "+f+":",Ne.ERR_BAD_REQUEST,e));return}c.send(n||null)})},sa={http:xR,xhr:qR};K.forEach(sa,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const GR={getAdapter:e=>{e=K.isArray(e)?e:[e];const{length:t}=e;let r,o;for(let n=0;ne instanceof $r?e.toJSON():e;function sn(e,t){t=t||{};const r={};function o(c,u,d){return K.isPlainObject(c)&&K.isPlainObject(u)?K.merge.call({caseless:d},c,u):K.isPlainObject(u)?K.merge({},u):K.isArray(u)?u.slice():u}function n(c,u,d){if(K.isUndefined(u)){if(!K.isUndefined(c))return o(void 0,c,d)}else return o(c,u,d)}function i(c,u){if(!K.isUndefined(u))return o(void 0,u)}function a(c,u){if(K.isUndefined(u)){if(!K.isUndefined(c))return o(void 0,c)}else return o(void 0,u)}function s(c,u,d){if(d in t)return o(c,u);if(d in e)return o(void 0,c)}const l={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:s,headers:(c,u)=>n(lh(c),lh(u),!0)};return K.forEach(Object.keys(e).concat(Object.keys(t)),function(u){const d=l[u]||n,f=d(e[u],t[u],u);K.isUndefined(f)&&d!==s||(r[u]=f)}),r}const fv="1.3.4",ju={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{ju[e]=function(o){return typeof o===e||"a"+(t<1?"n ":" ")+e}});const ch={};ju.transitional=function(t,r,o){function n(i,a){return"[Axios v"+fv+"] Transitional option '"+i+"'"+a+(o?". "+o:"")}return(i,a,s)=>{if(t===!1)throw new Ne(n(a," has been removed"+(r?" in "+r:"")),Ne.ERR_DEPRECATED);return r&&!ch[a]&&(ch[a]=!0,console.warn(n(a," has been deprecated since v"+r+" and will be removed in the near future"))),t?t(i,a,s):!0}};function KR(e,t,r){if(typeof e!="object")throw new Ne("options must be an object",Ne.ERR_BAD_OPTION_VALUE);const o=Object.keys(e);let n=o.length;for(;n-- >0;){const i=o[n],a=t[i];if(a){const s=e[i],l=s===void 0||a(s,i,e);if(l!==!0)throw new Ne("option "+i+" must be "+l,Ne.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new Ne("Unknown option "+i,Ne.ERR_BAD_OPTION)}}const pc={assertOptions:KR,validators:ju},Vr=pc.validators;class ns{constructor(t){this.defaults=t,this.interceptors={request:new nh,response:new nh}}request(t,r){typeof t=="string"?(r=r||{},r.url=t):r=t||{},r=sn(this.defaults,r);const{transitional:o,paramsSerializer:n,headers:i}=r;o!==void 0&&pc.assertOptions(o,{silentJSONParsing:Vr.transitional(Vr.boolean),forcedJSONParsing:Vr.transitional(Vr.boolean),clarifyTimeoutError:Vr.transitional(Vr.boolean)},!1),n!==void 0&&pc.assertOptions(n,{encode:Vr.function,serialize:Vr.function},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let a;a=i&&K.merge(i.common,i[r.method]),a&&K.forEach(["delete","get","head","post","put","patch","common"],h=>{delete i[h]}),r.headers=$r.concat(a,i);const s=[];let l=!0;this.interceptors.request.forEach(function(m){typeof m.runWhen=="function"&&m.runWhen(r)===!1||(l=l&&m.synchronous,s.unshift(m.fulfilled,m.rejected))});const c=[];this.interceptors.response.forEach(function(m){c.push(m.fulfilled,m.rejected)});let u,d=0,f;if(!l){const h=[sh.bind(this),void 0];for(h.unshift.apply(h,s),h.push.apply(h,c),f=h.length,u=Promise.resolve(r);d{if(!o._listeners)return;let i=o._listeners.length;for(;i-- >0;)o._listeners[i](n);o._listeners=null}),this.promise.then=n=>{let i;const a=new Promise(s=>{o.subscribe(s),i=s}).then(n);return a.cancel=function(){o.unsubscribe(i)},a},t(function(i,a,s){o.reason||(o.reason=new Ei(i,a,s),r(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}static source(){let t;return{token:new Uu(function(n){t=n}),cancel:t}}}const ZR=Uu;function XR(e){return function(r){return e.apply(null,r)}}function YR(e){return K.isObject(e)&&e.isAxiosError===!0}const mc={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(mc).forEach(([e,t])=>{mc[t]=e});const QR=mc;function hv(e){const t=new la(e),r=Kx(la.prototype.request,t);return K.extend(r,la.prototype,t,{allOwnKeys:!0}),K.extend(r,t,null,{allOwnKeys:!0}),r.create=function(n){return hv(sn(e,n))},r}const ht=hv(Wu);ht.Axios=la;ht.CanceledError=Ei;ht.CancelToken=ZR;ht.isCancel=uv;ht.VERSION=fv;ht.toFormData=qs;ht.AxiosError=Ne;ht.Cancel=ht.CanceledError;ht.all=function(t){return Promise.all(t)};ht.spread=XR;ht.isAxiosError=YR;ht.mergeConfig=sn;ht.AxiosHeaders=$r;ht.formToJSON=e=>cv(K.isHTMLForm(e)?new FormData(e):e);ht.HttpStatusCode=QR;ht.default=ht;const JR=ht,is=JR.create({baseURL:"/api"});is.interceptors.request.use(e=>{const t=Ox().token;return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e.response));is.interceptors.response.use(e=>{if(e.status===200)return e;throw new Error(e.status.toString())},e=>Promise.reject(e));/*! - * shared v9.2.2 - * (c) 2022 kazuya kawaguchi - * Released under the MIT License. - */const gc=typeof window<"u",eA=typeof Symbol=="function"&&typeof Symbol.toStringTag=="symbol",lo=e=>eA?Symbol(e):e,tA=(e,t,r)=>rA({l:e,k:t,s:r}),rA=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),ut=e=>typeof e=="number"&&isFinite(e),oA=e=>qu(e)==="[object Date]",io=e=>qu(e)==="[object RegExp]",Zs=e=>Le(e)&&Object.keys(e).length===0;function nA(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const mt=Object.assign;let uh;const Vn=()=>uh||(uh=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function dh(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const iA=Object.prototype.hasOwnProperty;function Vu(e,t){return iA.call(e,t)}const Ge=Array.isArray,at=e=>typeof e=="function",fe=e=>typeof e=="string",Be=e=>typeof e=="boolean",Ke=e=>e!==null&&typeof e=="object",pv=Object.prototype.toString,qu=e=>pv.call(e),Le=e=>qu(e)==="[object Object]",aA=e=>e==null?"":Ge(e)||Le(e)&&e.toString===pv?JSON.stringify(e,null,2):String(e);/*! - * message-compiler v9.2.2 - * (c) 2022 kazuya kawaguchi - * Released under the MIT License. - */const We={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,__EXTEND_POINT__:15};function Xs(e,t,r={}){const{domain:o,messages:n,args:i}=r,a=e,s=new SyntaxError(String(a));return s.code=e,t&&(s.location=t),s.domain=o,s}function sA(e){throw e}function lA(e,t,r){return{line:e,column:t,offset:r}}function xc(e,t,r){const o={start:e,end:t};return r!=null&&(o.source=r),o}const Er=" ",cA="\r",Et=` -`,uA=String.fromCharCode(8232),dA=String.fromCharCode(8233);function fA(e){const t=e;let r=0,o=1,n=1,i=0;const a=S=>t[S]===cA&&t[S+1]===Et,s=S=>t[S]===Et,l=S=>t[S]===dA,c=S=>t[S]===uA,u=S=>a(S)||s(S)||l(S)||c(S),d=()=>r,f=()=>o,p=()=>n,h=()=>i,m=S=>a(S)||l(S)||c(S)?Et:t[S],v=()=>m(r),g=()=>m(r+i);function x(){return i=0,u(r)&&(o++,n=0),a(r)&&r++,r++,n++,t[r]}function C(){return a(r+i)&&i++,i++,t[r+i]}function b(){r=0,o=1,n=1,i=0}function w(S=0){i=S}function T(){const S=r+i;for(;S!==r;)x();i=0}return{index:d,line:f,column:p,peekOffset:h,charAt:m,currentChar:v,currentPeek:g,next:x,peek:C,reset:b,resetPeek:w,skipToPeek:T}}const qr=void 0,fh="'",hA="tokenizer";function pA(e,t={}){const r=t.location!==!1,o=fA(e),n=()=>o.index(),i=()=>lA(o.line(),o.column(),o.index()),a=i(),s=n(),l={currentType:14,offset:s,startLoc:a,endLoc:a,lastType:14,lastOffset:s,lastStartLoc:a,lastEndLoc:a,braceNest:0,inLinked:!1,text:""},c=()=>l,{onError:u}=t;function d(y,_,L,...O){const N=c();if(_.column+=L,_.offset+=L,u){const X=xc(N.startLoc,_),te=Xs(y,X,{domain:hA,args:O});u(te)}}function f(y,_,L){y.endLoc=i(),y.currentType=_;const O={type:_};return r&&(O.loc=xc(y.startLoc,y.endLoc)),L!=null&&(O.value=L),O}const p=y=>f(y,14);function h(y,_){return y.currentChar()===_?(y.next(),_):(d(We.EXPECTED_TOKEN,i(),0,_),"")}function m(y){let _="";for(;y.currentPeek()===Er||y.currentPeek()===Et;)_+=y.currentPeek(),y.peek();return _}function v(y){const _=m(y);return y.skipToPeek(),_}function g(y){if(y===qr)return!1;const _=y.charCodeAt(0);return _>=97&&_<=122||_>=65&&_<=90||_===95}function x(y){if(y===qr)return!1;const _=y.charCodeAt(0);return _>=48&&_<=57}function C(y,_){const{currentType:L}=_;if(L!==2)return!1;m(y);const O=g(y.currentPeek());return y.resetPeek(),O}function b(y,_){const{currentType:L}=_;if(L!==2)return!1;m(y);const O=y.currentPeek()==="-"?y.peek():y.currentPeek(),N=x(O);return y.resetPeek(),N}function w(y,_){const{currentType:L}=_;if(L!==2)return!1;m(y);const O=y.currentPeek()===fh;return y.resetPeek(),O}function T(y,_){const{currentType:L}=_;if(L!==8)return!1;m(y);const O=y.currentPeek()===".";return y.resetPeek(),O}function S(y,_){const{currentType:L}=_;if(L!==9)return!1;m(y);const O=g(y.currentPeek());return y.resetPeek(),O}function E(y,_){const{currentType:L}=_;if(!(L===8||L===12))return!1;m(y);const O=y.currentPeek()===":";return y.resetPeek(),O}function I(y,_){const{currentType:L}=_;if(L!==10)return!1;const O=()=>{const X=y.currentPeek();return X==="{"?g(y.peek()):X==="@"||X==="%"||X==="|"||X===":"||X==="."||X===Er||!X?!1:X===Et?(y.peek(),O()):g(X)},N=O();return y.resetPeek(),N}function P(y){m(y);const _=y.currentPeek()==="|";return y.resetPeek(),_}function $(y){const _=m(y),L=y.currentPeek()==="%"&&y.peek()==="{";return y.resetPeek(),{isModulo:L,hasSpace:_.length>0}}function R(y,_=!0){const L=(N=!1,X="",te=!1)=>{const q=y.currentPeek();return q==="{"?X==="%"?!1:N:q==="@"||!q?X==="%"?!0:N:q==="%"?(y.peek(),L(N,"%",!0)):q==="|"?X==="%"||te?!0:!(X===Er||X===Et):q===Er?(y.peek(),L(!0,Er,te)):q===Et?(y.peek(),L(!0,Et,te)):!0},O=L();return _&&y.resetPeek(),O}function B(y,_){const L=y.currentChar();return L===qr?qr:_(L)?(y.next(),L):null}function j(y){return B(y,L=>{const O=L.charCodeAt(0);return O>=97&&O<=122||O>=65&&O<=90||O>=48&&O<=57||O===95||O===36})}function Y(y){return B(y,L=>{const O=L.charCodeAt(0);return O>=48&&O<=57})}function J(y){return B(y,L=>{const O=L.charCodeAt(0);return O>=48&&O<=57||O>=65&&O<=70||O>=97&&O<=102})}function Q(y){let _="",L="";for(;_=Y(y);)L+=_;return L}function ie(y){v(y);const _=y.currentChar();return _!=="%"&&d(We.EXPECTED_TOKEN,i(),0,_),y.next(),"%"}function ge(y){let _="";for(;;){const L=y.currentChar();if(L==="{"||L==="}"||L==="@"||L==="|"||!L)break;if(L==="%")if(R(y))_+=L,y.next();else break;else if(L===Er||L===Et)if(R(y))_+=L,y.next();else{if(P(y))break;_+=L,y.next()}else _+=L,y.next()}return _}function ve(y){v(y);let _="",L="";for(;_=j(y);)L+=_;return y.currentChar()===qr&&d(We.UNTERMINATED_CLOSING_BRACE,i(),0),L}function z(y){v(y);let _="";return y.currentChar()==="-"?(y.next(),_+=`-${Q(y)}`):_+=Q(y),y.currentChar()===qr&&d(We.UNTERMINATED_CLOSING_BRACE,i(),0),_}function W(y){v(y),h(y,"'");let _="",L="";const O=X=>X!==fh&&X!==Et;for(;_=B(y,O);)_==="\\"?L+=Z(y):L+=_;const N=y.currentChar();return N===Et||N===qr?(d(We.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,i(),0),N===Et&&(y.next(),h(y,"'")),L):(h(y,"'"),L)}function Z(y){const _=y.currentChar();switch(_){case"\\":case"'":return y.next(),`\\${_}`;case"u":return V(y,_,4);case"U":return V(y,_,6);default:return d(We.UNKNOWN_ESCAPE_SEQUENCE,i(),0,_),""}}function V(y,_,L){h(y,_);let O="";for(let N=0;NN!=="{"&&N!=="}"&&N!==Er&&N!==Et;for(;_=B(y,O);)L+=_;return L}function U(y){let _="",L="";for(;_=j(y);)L+=_;return L}function re(y){const _=(L=!1,O)=>{const N=y.currentChar();return N==="{"||N==="%"||N==="@"||N==="|"||!N||N===Er?O:N===Et?(O+=N,y.next(),_(L,O)):(O+=N,y.next(),_(!0,O))};return _(!1,"")}function ee(y){v(y);const _=h(y,"|");return v(y),_}function ce(y,_){let L=null;switch(y.currentChar()){case"{":return _.braceNest>=1&&d(We.NOT_ALLOW_NEST_PLACEHOLDER,i(),0),y.next(),L=f(_,2,"{"),v(y),_.braceNest++,L;case"}":return _.braceNest>0&&_.currentType===2&&d(We.EMPTY_PLACEHOLDER,i(),0),y.next(),L=f(_,3,"}"),_.braceNest--,_.braceNest>0&&v(y),_.inLinked&&_.braceNest===0&&(_.inLinked=!1),L;case"@":return _.braceNest>0&&d(We.UNTERMINATED_CLOSING_BRACE,i(),0),L=ke(y,_)||p(_),_.braceNest=0,L;default:let N=!0,X=!0,te=!0;if(P(y))return _.braceNest>0&&d(We.UNTERMINATED_CLOSING_BRACE,i(),0),L=f(_,1,ee(y)),_.braceNest=0,_.inLinked=!1,L;if(_.braceNest>0&&(_.currentType===5||_.currentType===6||_.currentType===7))return d(We.UNTERMINATED_CLOSING_BRACE,i(),0),_.braceNest=0,ye(y,_);if(N=C(y,_))return L=f(_,5,ve(y)),v(y),L;if(X=b(y,_))return L=f(_,6,z(y)),v(y),L;if(te=w(y,_))return L=f(_,7,W(y)),v(y),L;if(!N&&!X&&!te)return L=f(_,13,D(y)),d(We.INVALID_TOKEN_IN_PLACEHOLDER,i(),0,L.value),v(y),L;break}return L}function ke(y,_){const{currentType:L}=_;let O=null;const N=y.currentChar();switch((L===8||L===9||L===12||L===10)&&(N===Et||N===Er)&&d(We.INVALID_LINKED_FORMAT,i(),0),N){case"@":return y.next(),O=f(_,8,"@"),_.inLinked=!0,O;case".":return v(y),y.next(),f(_,9,".");case":":return v(y),y.next(),f(_,10,":");default:return P(y)?(O=f(_,1,ee(y)),_.braceNest=0,_.inLinked=!1,O):T(y,_)||E(y,_)?(v(y),ke(y,_)):S(y,_)?(v(y),f(_,12,U(y))):I(y,_)?(v(y),N==="{"?ce(y,_)||O:f(_,11,re(y))):(L===8&&d(We.INVALID_LINKED_FORMAT,i(),0),_.braceNest=0,_.inLinked=!1,ye(y,_))}}function ye(y,_){let L={type:14};if(_.braceNest>0)return ce(y,_)||p(_);if(_.inLinked)return ke(y,_)||p(_);switch(y.currentChar()){case"{":return ce(y,_)||p(_);case"}":return d(We.UNBALANCED_CLOSING_BRACE,i(),0),y.next(),f(_,3,"}");case"@":return ke(y,_)||p(_);default:if(P(y))return L=f(_,1,ee(y)),_.braceNest=0,_.inLinked=!1,L;const{isModulo:N,hasSpace:X}=$(y);if(N)return X?f(_,0,ge(y)):f(_,4,ie(y));if(R(y))return f(_,0,ge(y));break}return L}function k(){const{currentType:y,offset:_,startLoc:L,endLoc:O}=l;return l.lastType=y,l.lastOffset=_,l.lastStartLoc=L,l.lastEndLoc=O,l.offset=n(),l.startLoc=i(),o.currentChar()===qr?f(l,14):ye(o,l)}return{nextToken:k,currentOffset:n,currentPosition:i,context:c}}const mA="parser",gA=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function xA(e,t,r){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const o=parseInt(t||r,16);return o<=55295||o>=57344?String.fromCodePoint(o):"�"}}}function vA(e={}){const t=e.location!==!1,{onError:r}=e;function o(g,x,C,b,...w){const T=g.currentPosition();if(T.offset+=b,T.column+=b,r){const S=xc(C,T),E=Xs(x,S,{domain:mA,args:w});r(E)}}function n(g,x,C){const b={type:g,start:x,end:x};return t&&(b.loc={start:C,end:C}),b}function i(g,x,C,b){g.end=x,b&&(g.type=b),t&&g.loc&&(g.loc.end=C)}function a(g,x){const C=g.context(),b=n(3,C.offset,C.startLoc);return b.value=x,i(b,g.currentOffset(),g.currentPosition()),b}function s(g,x){const C=g.context(),{lastOffset:b,lastStartLoc:w}=C,T=n(5,b,w);return T.index=parseInt(x,10),g.nextToken(),i(T,g.currentOffset(),g.currentPosition()),T}function l(g,x){const C=g.context(),{lastOffset:b,lastStartLoc:w}=C,T=n(4,b,w);return T.key=x,g.nextToken(),i(T,g.currentOffset(),g.currentPosition()),T}function c(g,x){const C=g.context(),{lastOffset:b,lastStartLoc:w}=C,T=n(9,b,w);return T.value=x.replace(gA,xA),g.nextToken(),i(T,g.currentOffset(),g.currentPosition()),T}function u(g){const x=g.nextToken(),C=g.context(),{lastOffset:b,lastStartLoc:w}=C,T=n(8,b,w);return x.type!==12?(o(g,We.UNEXPECTED_EMPTY_LINKED_MODIFIER,C.lastStartLoc,0),T.value="",i(T,b,w),{nextConsumeToken:x,node:T}):(x.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,C.lastStartLoc,0,hr(x)),T.value=x.value||"",i(T,g.currentOffset(),g.currentPosition()),{node:T})}function d(g,x){const C=g.context(),b=n(7,C.offset,C.startLoc);return b.value=x,i(b,g.currentOffset(),g.currentPosition()),b}function f(g){const x=g.context(),C=n(6,x.offset,x.startLoc);let b=g.nextToken();if(b.type===9){const w=u(g);C.modifier=w.node,b=w.nextConsumeToken||g.nextToken()}switch(b.type!==10&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(b)),b=g.nextToken(),b.type===2&&(b=g.nextToken()),b.type){case 11:b.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(b)),C.key=d(g,b.value||"");break;case 5:b.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(b)),C.key=l(g,b.value||"");break;case 6:b.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(b)),C.key=s(g,b.value||"");break;case 7:b.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(b)),C.key=c(g,b.value||"");break;default:o(g,We.UNEXPECTED_EMPTY_LINKED_KEY,x.lastStartLoc,0);const w=g.context(),T=n(7,w.offset,w.startLoc);return T.value="",i(T,w.offset,w.startLoc),C.key=T,i(C,w.offset,w.startLoc),{nextConsumeToken:b,node:C}}return i(C,g.currentOffset(),g.currentPosition()),{node:C}}function p(g){const x=g.context(),C=x.currentType===1?g.currentOffset():x.offset,b=x.currentType===1?x.endLoc:x.startLoc,w=n(2,C,b);w.items=[];let T=null;do{const I=T||g.nextToken();switch(T=null,I.type){case 0:I.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(I)),w.items.push(a(g,I.value||""));break;case 6:I.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(I)),w.items.push(s(g,I.value||""));break;case 5:I.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(I)),w.items.push(l(g,I.value||""));break;case 7:I.value==null&&o(g,We.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hr(I)),w.items.push(c(g,I.value||""));break;case 8:const P=f(g);w.items.push(P.node),T=P.nextConsumeToken||null;break}}while(x.currentType!==14&&x.currentType!==1);const S=x.currentType===1?x.lastOffset:g.currentOffset(),E=x.currentType===1?x.lastEndLoc:g.currentPosition();return i(w,S,E),w}function h(g,x,C,b){const w=g.context();let T=b.items.length===0;const S=n(1,x,C);S.cases=[],S.cases.push(b);do{const E=p(g);T||(T=E.items.length===0),S.cases.push(E)}while(w.currentType!==14);return T&&o(g,We.MUST_HAVE_MESSAGES_IN_PLURAL,C,0),i(S,g.currentOffset(),g.currentPosition()),S}function m(g){const x=g.context(),{offset:C,startLoc:b}=x,w=p(g);return x.currentType===14?w:h(g,C,b,w)}function v(g){const x=pA(g,mt({},e)),C=x.context(),b=n(0,C.offset,C.startLoc);return t&&b.loc&&(b.loc.source=g),b.body=m(x),C.currentType!==14&&o(x,We.UNEXPECTED_LEXICAL_ANALYSIS,C.lastStartLoc,0,g[C.offset]||""),i(b,x.currentOffset(),x.currentPosition()),b}return{parse:v}}function hr(e){if(e.type===14)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function bA(e,t={}){const r={ast:e,helpers:new Set};return{context:()=>r,helper:i=>(r.helpers.add(i),i)}}function hh(e,t){for(let r=0;ra;function l(m,v){a.code+=m}function c(m,v=!0){const g=v?n:"";l(i?g+" ".repeat(m):g)}function u(m=!0){const v=++a.indentLevel;m&&c(v)}function d(m=!0){const v=--a.indentLevel;m&&c(v)}function f(){c(a.indentLevel)}return{context:s,push:l,indent:u,deindent:d,newline:f,helper:m=>`_${m}`,needIndent:()=>a.needIndent}}function SA(e,t){const{helper:r}=e;e.push(`${r("linked")}(`),ln(e,t.key),t.modifier?(e.push(", "),ln(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function wA(e,t){const{helper:r,needIndent:o}=e;e.push(`${r("normalize")}([`),e.indent(o());const n=t.items.length;for(let i=0;i1){e.push(`${r("plural")}([`),e.indent(o());const n=t.cases.length;for(let i=0;i{const r=fe(t.mode)?t.mode:"normal",o=fe(t.filename)?t.filename:"message.intl",n=!!t.sourceMap,i=t.breakLineCode!=null?t.breakLineCode:r==="arrow"?";":` -`,a=t.needIndent?t.needIndent:r!=="arrow",s=e.helpers||[],l=yA(e,{mode:r,filename:o,sourceMap:n,breakLineCode:i,needIndent:a});l.push(r==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(a),s.length>0&&(l.push(`const { ${s.map(d=>`${d}: _${d}`).join(", ")} } = ctx`),l.newline()),l.push("return "),ln(l,e),l.deindent(a),l.push("}");const{code:c,map:u}=l.context();return{ast:e,code:c,map:u?u.toJSON():void 0}};function PA(e,t={}){const r=mt({},t),n=vA(r).parse(e);return CA(n,r),EA(n,r)}/*! - * devtools-if v9.2.2 - * (c) 2022 kazuya kawaguchi - * Released under the MIT License. - */const mv={I18nInit:"i18n:init",FunctionTranslate:"function:translate"};/*! - * core-base v9.2.2 - * (c) 2022 kazuya kawaguchi - * Released under the MIT License. - */const co=[];co[0]={w:[0],i:[3,0],["["]:[4],o:[7]};co[1]={w:[1],["."]:[2],["["]:[4],o:[7]};co[2]={w:[2],i:[3,0],[0]:[3,0]};co[3]={i:[3,0],[0]:[3,0],w:[1,1],["."]:[2,1],["["]:[4,1],o:[7,1]};co[4]={["'"]:[5,0],['"']:[6,0],["["]:[4,2],["]"]:[1,3],o:8,l:[4,0]};co[5]={["'"]:[4,0],o:8,l:[5,0]};co[6]={['"']:[4,0],o:8,l:[6,0]};const kA=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function LA(e){return kA.test(e)}function $A(e){const t=e.charCodeAt(0),r=e.charCodeAt(e.length-1);return t===r&&(t===34||t===39)?e.slice(1,-1):e}function IA(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function RA(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:LA(t)?$A(t):"*"+t}function AA(e){const t=[];let r=-1,o=0,n=0,i,a,s,l,c,u,d;const f=[];f[0]=()=>{a===void 0?a=s:a+=s},f[1]=()=>{a!==void 0&&(t.push(a),a=void 0)},f[2]=()=>{f[0](),n++},f[3]=()=>{if(n>0)n--,o=4,f[0]();else{if(n=0,a===void 0||(a=RA(a),a===!1))return!1;f[1]()}};function p(){const h=e[r+1];if(o===5&&h==="'"||o===6&&h==='"')return r++,s="\\"+h,f[0](),!0}for(;o!==null;)if(r++,i=e[r],!(i==="\\"&&p())){if(l=IA(i),d=co[o],c=d[l]||d.l||8,c===8||(o=c[0],c[1]!==void 0&&(u=f[c[1]],u&&(s=i,u()===!1))))return;if(o===7)return t}}const ph=new Map;function OA(e,t){return Ke(e)?e[t]:null}function BA(e,t){if(!Ke(e))return null;let r=ph.get(t);if(r||(r=AA(t),r&&ph.set(t,r)),!r)return null;const o=r.length;let n=e,i=0;for(;ie,MA=e=>"",DA="text",FA=e=>e.length===0?"":e.join(""),zA=aA;function mh(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function NA(e){const t=ut(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(ut(e.named.count)||ut(e.named.n))?ut(e.named.count)?e.named.count:ut(e.named.n)?e.named.n:t:t}function WA(e,t){t.count||(t.count=e),t.n||(t.n=e)}function jA(e={}){const t=e.locale,r=NA(e),o=Ke(e.pluralRules)&&fe(t)&&at(e.pluralRules[t])?e.pluralRules[t]:mh,n=Ke(e.pluralRules)&&fe(t)&&at(e.pluralRules[t])?mh:void 0,i=g=>g[o(r,g.length,n)],a=e.list||[],s=g=>a[g],l=e.named||{};ut(e.pluralIndex)&&WA(r,l);const c=g=>l[g];function u(g){const x=at(e.messages)?e.messages(g):Ke(e.messages)?e.messages[g]:!1;return x||(e.parent?e.parent.message(g):MA)}const d=g=>e.modifiers?e.modifiers[g]:HA,f=Le(e.processor)&&at(e.processor.normalize)?e.processor.normalize:FA,p=Le(e.processor)&&at(e.processor.interpolate)?e.processor.interpolate:zA,h=Le(e.processor)&&fe(e.processor.type)?e.processor.type:DA,v={list:s,named:c,plural:i,linked:(g,...x)=>{const[C,b]=x;let w="text",T="";x.length===1?Ke(C)?(T=C.modifier||T,w=C.type||w):fe(C)&&(T=C||T):x.length===2&&(fe(C)&&(T=C||T),fe(b)&&(w=b||w));let S=u(g)(v);return w==="vnode"&&Ge(S)&&T&&(S=S[0]),T?d(T)(S,w):S},message:u,type:h,interpolate:p,normalize:f};return v}let pi=null;function UA(e){pi=e}function VA(e,t,r){pi&&pi.emit(mv.I18nInit,{timestamp:Date.now(),i18n:e,version:t,meta:r})}const qA=GA(mv.FunctionTranslate);function GA(e){return t=>pi&&pi.emit(e,t)}function KA(e,t,r){return[...new Set([r,...Ge(t)?t:Ke(t)?Object.keys(t):fe(t)?[t]:[r]])]}function gv(e,t,r){const o=fe(r)?r:Pi,n=e;n.__localeChainCache||(n.__localeChainCache=new Map);let i=n.__localeChainCache.get(o);if(!i){i=[];let a=[r];for(;Ge(a);)a=gh(i,a,t);const s=Ge(t)||!Le(t)?t:t.default?t.default:null;a=fe(s)?[s]:s,Ge(a)&&gh(i,a,!1),n.__localeChainCache.set(o,i)}return i}function gh(e,t,r){let o=!0;for(let n=0;n`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function QA(){return{upper:(e,t)=>t==="text"&&fe(e)?e.toUpperCase():t==="vnode"&&Ke(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&fe(e)?e.toLowerCase():t==="vnode"&&Ke(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&fe(e)?vh(e):t==="vnode"&&Ke(e)&&"__v_isVNode"in e?vh(e.children):e}}let xv;function JA(e){xv=e}let vv;function eO(e){vv=e}let bv;function tO(e){bv=e}let Cv=null;const bh=e=>{Cv=e},rO=()=>Cv;let yv=null;const Ch=e=>{yv=e},oO=()=>yv;let yh=0;function nO(e={}){const t=fe(e.version)?e.version:YA,r=fe(e.locale)?e.locale:Pi,o=Ge(e.fallbackLocale)||Le(e.fallbackLocale)||fe(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:r,n=Le(e.messages)?e.messages:{[r]:{}},i=Le(e.datetimeFormats)?e.datetimeFormats:{[r]:{}},a=Le(e.numberFormats)?e.numberFormats:{[r]:{}},s=mt({},e.modifiers||{},QA()),l=e.pluralRules||{},c=at(e.missing)?e.missing:null,u=Be(e.missingWarn)||io(e.missingWarn)?e.missingWarn:!0,d=Be(e.fallbackWarn)||io(e.fallbackWarn)?e.fallbackWarn:!0,f=!!e.fallbackFormat,p=!!e.unresolving,h=at(e.postTranslation)?e.postTranslation:null,m=Le(e.processor)?e.processor:null,v=Be(e.warnHtmlMessage)?e.warnHtmlMessage:!0,g=!!e.escapeParameter,x=at(e.messageCompiler)?e.messageCompiler:xv,C=at(e.messageResolver)?e.messageResolver:vv||OA,b=at(e.localeFallbacker)?e.localeFallbacker:bv||KA,w=Ke(e.fallbackContext)?e.fallbackContext:void 0,T=at(e.onWarn)?e.onWarn:nA,S=e,E=Ke(S.__datetimeFormatters)?S.__datetimeFormatters:new Map,I=Ke(S.__numberFormatters)?S.__numberFormatters:new Map,P=Ke(S.__meta)?S.__meta:{};yh++;const $={version:t,cid:yh,locale:r,fallbackLocale:o,messages:n,modifiers:s,pluralRules:l,missing:c,missingWarn:u,fallbackWarn:d,fallbackFormat:f,unresolving:p,postTranslation:h,processor:m,warnHtmlMessage:v,escapeParameter:g,messageCompiler:x,messageResolver:C,localeFallbacker:b,fallbackContext:w,onWarn:T,__meta:P};return $.datetimeFormats=i,$.numberFormats=a,$.__datetimeFormatters=E,$.__numberFormatters=I,__INTLIFY_PROD_DEVTOOLS__&&VA($,t,P),$}function Ku(e,t,r,o,n){const{missing:i,onWarn:a}=e;if(i!==null){const s=i(e,r,t,n);return fe(s)?s:t}else return t}function $n(e,t,r){const o=e;o.__localeChainCache=new Map,e.localeFallbacker(e,r,t)}const iO=e=>e;let Sh=Object.create(null);function aO(e,t={}){{const o=(t.onCacheKey||iO)(e),n=Sh[o];if(n)return n;let i=!1;const a=t.onError||sA;t.onError=c=>{i=!0,a(c)};const{code:s}=PA(e,t),l=new Function(`return ${s}`)();return i?l:Sh[o]=l}}let Sv=We.__EXTEND_POINT__;const wl=()=>++Sv,Go={INVALID_ARGUMENT:Sv,INVALID_DATE_ARGUMENT:wl(),INVALID_ISO_DATE_ARGUMENT:wl(),__EXTEND_POINT__:wl()};function Ko(e){return Xs(e,null,void 0)}const wh=()=>"",mr=e=>at(e);function _h(e,...t){const{fallbackFormat:r,postTranslation:o,unresolving:n,messageCompiler:i,fallbackLocale:a,messages:s}=e,[l,c]=vc(...t),u=Be(c.missingWarn)?c.missingWarn:e.missingWarn,d=Be(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn,f=Be(c.escapeParameter)?c.escapeParameter:e.escapeParameter,p=!!c.resolvedMessage,h=fe(c.default)||Be(c.default)?Be(c.default)?i?l:()=>l:c.default:r?i?l:()=>l:"",m=r||h!=="",v=fe(c.locale)?c.locale:e.locale;f&&sO(c);let[g,x,C]=p?[l,v,s[v]||{}]:wv(e,l,v,a,d,u),b=g,w=l;if(!p&&!(fe(b)||mr(b))&&m&&(b=h,w=b),!p&&(!(fe(b)||mr(b))||!fe(x)))return n?Ys:l;let T=!1;const S=()=>{T=!0},E=mr(b)?b:_v(e,l,x,b,w,S);if(T)return b;const I=uO(e,x,C,c),P=jA(I),$=lO(e,E,P),R=o?o($,l):$;if(__INTLIFY_PROD_DEVTOOLS__){const B={timestamp:Date.now(),key:fe(l)?l:mr(b)?b.key:"",locale:x||(mr(b)?b.locale:""),format:fe(b)?b:mr(b)?b.source:"",message:R};B.meta=mt({},e.__meta,rO()||{}),qA(B)}return R}function sO(e){Ge(e.list)?e.list=e.list.map(t=>fe(t)?dh(t):t):Ke(e.named)&&Object.keys(e.named).forEach(t=>{fe(e.named[t])&&(e.named[t]=dh(e.named[t]))})}function wv(e,t,r,o,n,i){const{messages:a,onWarn:s,messageResolver:l,localeFallbacker:c}=e,u=c(e,o,r);let d={},f,p=null;const h="translate";for(let m=0;mo;return c.locale=r,c.key=t,c}const l=a(o,cO(e,r,n,o,s,i));return l.locale=r,l.key=t,l.source=o,l}function lO(e,t,r){return t(r)}function vc(...e){const[t,r,o]=e,n={};if(!fe(t)&&!ut(t)&&!mr(t))throw Ko(Go.INVALID_ARGUMENT);const i=ut(t)?String(t):(mr(t),t);return ut(r)?n.plural=r:fe(r)?n.default=r:Le(r)&&!Zs(r)?n.named=r:Ge(r)&&(n.list=r),ut(o)?n.plural=o:fe(o)?n.default=o:Le(o)&&mt(n,o),[i,n]}function cO(e,t,r,o,n,i){return{warnHtmlMessage:n,onError:a=>{throw i&&i(a),a},onCacheKey:a=>tA(t,r,a)}}function uO(e,t,r,o){const{modifiers:n,pluralRules:i,messageResolver:a,fallbackLocale:s,fallbackWarn:l,missingWarn:c,fallbackContext:u}=e,f={locale:t,modifiers:n,pluralRules:i,messages:p=>{let h=a(r,p);if(h==null&&u){const[,,m]=wv(u,p,t,s,l,c);h=a(m,p)}if(fe(h)){let m=!1;const g=_v(e,p,t,h,p,()=>{m=!0});return m?wh:g}else return mr(h)?h:wh}};return e.processor&&(f.processor=e.processor),o.list&&(f.list=o.list),o.named&&(f.named=o.named),ut(o.plural)&&(f.pluralIndex=o.plural),f}function Th(e,...t){const{datetimeFormats:r,unresolving:o,fallbackLocale:n,onWarn:i,localeFallbacker:a}=e,{__datetimeFormatters:s}=e,[l,c,u,d]=bc(...t),f=Be(u.missingWarn)?u.missingWarn:e.missingWarn;Be(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn;const p=!!u.part,h=fe(u.locale)?u.locale:e.locale,m=a(e,n,h);if(!fe(l)||l==="")return new Intl.DateTimeFormat(h,d).format(c);let v={},g,x=null;const C="datetime format";for(let T=0;T{Tv.includes(l)?a[l]=r[l]:i[l]=r[l]}),fe(o)?i.locale=o:Le(o)&&(a=o),Le(n)&&(a=n),[i.key||"",s,i,a]}function Eh(e,t,r){const o=e;for(const n in r){const i=`${t}__${n}`;o.__datetimeFormatters.has(i)&&o.__datetimeFormatters.delete(i)}}function Ph(e,...t){const{numberFormats:r,unresolving:o,fallbackLocale:n,onWarn:i,localeFallbacker:a}=e,{__numberFormatters:s}=e,[l,c,u,d]=Cc(...t),f=Be(u.missingWarn)?u.missingWarn:e.missingWarn;Be(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn;const p=!!u.part,h=fe(u.locale)?u.locale:e.locale,m=a(e,n,h);if(!fe(l)||l==="")return new Intl.NumberFormat(h,d).format(c);let v={},g,x=null;const C="number format";for(let T=0;T{Ev.includes(l)?a[l]=r[l]:i[l]=r[l]}),fe(o)?i.locale=o:Le(o)&&(a=o),Le(n)&&(a=n),[i.key||"",s,i,a]}function kh(e,t,r){const o=e;for(const n in r){const i=`${t}__${n}`;o.__numberFormatters.has(i)&&o.__numberFormatters.delete(i)}}typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Vn().__INTLIFY_PROD_DEVTOOLS__=!1);/*! - * vue-i18n v9.2.2 - * (c) 2022 kazuya kawaguchi - * Released under the MIT License. - */const dO="9.2.2";function fO(){typeof __VUE_I18N_FULL_INSTALL__!="boolean"&&(Vn().__VUE_I18N_FULL_INSTALL__=!0),typeof __VUE_I18N_LEGACY_API__!="boolean"&&(Vn().__VUE_I18N_LEGACY_API__=!0),typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Vn().__INTLIFY_PROD_DEVTOOLS__=!1)}let Pv=We.__EXTEND_POINT__;const Ot=()=>++Pv,lt={UNEXPECTED_RETURN_TYPE:Pv,INVALID_ARGUMENT:Ot(),MUST_BE_CALL_SETUP_TOP:Ot(),NOT_INSLALLED:Ot(),NOT_AVAILABLE_IN_LEGACY_MODE:Ot(),REQUIRED_VALUE:Ot(),INVALID_VALUE:Ot(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:Ot(),NOT_INSLALLED_WITH_PROVIDE:Ot(),UNEXPECTED_ERROR:Ot(),NOT_COMPATIBLE_LEGACY_VUE_I18N:Ot(),BRIDGE_SUPPORT_VUE_2_ONLY:Ot(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:Ot(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:Ot(),__EXTEND_POINT__:Ot()};function ft(e,...t){return Xs(e,null,void 0)}const yc=lo("__transrateVNode"),Sc=lo("__datetimeParts"),wc=lo("__numberParts"),kv=lo("__setPluralRules");lo("__intlifyMeta");const Lv=lo("__injectWithOption");function _c(e){if(!Ke(e))return e;for(const t in e)if(Vu(e,t))if(!t.includes("."))Ke(e[t])&&_c(e[t]);else{const r=t.split("."),o=r.length-1;let n=e;for(let i=0;i{if("locale"in s&&"resource"in s){const{locale:l,resource:c}=s;l?(a[l]=a[l]||{},qn(c,a[l])):qn(c,a)}else fe(s)&&qn(JSON.parse(s),a)}),n==null&&i)for(const s in a)Vu(a,s)&&_c(a[s]);return a}const Ki=e=>!Ke(e)||Ge(e);function qn(e,t){if(Ki(e)||Ki(t))throw ft(lt.INVALID_VALUE);for(const r in e)Vu(e,r)&&(Ki(e[r])||Ki(t[r])?t[r]=e[r]:qn(e[r],t[r]))}function $v(e){return e.type}function Iv(e,t,r){let o=Ke(t.messages)?t.messages:{};"__i18nGlobal"in r&&(o=Qs(e.locale.value,{messages:o,__i18n:r.__i18nGlobal}));const n=Object.keys(o);n.length&&n.forEach(i=>{e.mergeLocaleMessage(i,o[i])});{if(Ke(t.datetimeFormats)){const i=Object.keys(t.datetimeFormats);i.length&&i.forEach(a=>{e.mergeDateTimeFormat(a,t.datetimeFormats[a])})}if(Ke(t.numberFormats)){const i=Object.keys(t.numberFormats);i.length&&i.forEach(a=>{e.mergeNumberFormat(a,t.numberFormats[a])})}}}function Lh(e){return qe(xi,null,e,0)}const $h="__INTLIFY_META__";let Ih=0;function Rh(e){return(t,r,o,n)=>e(r,o,ir()||void 0,n)}const hO=()=>{const e=ir();let t=null;return e&&(t=$v(e)[$h])?{[$h]:t}:null};function Zu(e={},t){const{__root:r}=e,o=r===void 0;let n=Be(e.inheritLocale)?e.inheritLocale:!0;const i=de(r&&n?r.locale.value:fe(e.locale)?e.locale:Pi),a=de(r&&n?r.fallbackLocale.value:fe(e.fallbackLocale)||Ge(e.fallbackLocale)||Le(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:i.value),s=de(Qs(i.value,e)),l=de(Le(e.datetimeFormats)?e.datetimeFormats:{[i.value]:{}}),c=de(Le(e.numberFormats)?e.numberFormats:{[i.value]:{}});let u=r?r.missingWarn:Be(e.missingWarn)||io(e.missingWarn)?e.missingWarn:!0,d=r?r.fallbackWarn:Be(e.fallbackWarn)||io(e.fallbackWarn)?e.fallbackWarn:!0,f=r?r.fallbackRoot:Be(e.fallbackRoot)?e.fallbackRoot:!0,p=!!e.fallbackFormat,h=at(e.missing)?e.missing:null,m=at(e.missing)?Rh(e.missing):null,v=at(e.postTranslation)?e.postTranslation:null,g=r?r.warnHtmlMessage:Be(e.warnHtmlMessage)?e.warnHtmlMessage:!0,x=!!e.escapeParameter;const C=r?r.modifiers:Le(e.modifiers)?e.modifiers:{};let b=e.pluralRules||r&&r.pluralRules,w;w=(()=>{o&&Ch(null);const A={version:dO,locale:i.value,fallbackLocale:a.value,messages:s.value,modifiers:C,pluralRules:b,missing:m===null?void 0:m,missingWarn:u,fallbackWarn:d,fallbackFormat:p,unresolving:!0,postTranslation:v===null?void 0:v,warnHtmlMessage:g,escapeParameter:x,messageResolver:e.messageResolver,__meta:{framework:"vue"}};A.datetimeFormats=l.value,A.numberFormats=c.value,A.__datetimeFormatters=Le(w)?w.__datetimeFormatters:void 0,A.__numberFormatters=Le(w)?w.__numberFormatters:void 0;const M=nO(A);return o&&Ch(M),M})(),$n(w,i.value,a.value);function S(){return[i.value,a.value,s.value,l.value,c.value]}const E=ae({get:()=>i.value,set:A=>{i.value=A,w.locale=i.value}}),I=ae({get:()=>a.value,set:A=>{a.value=A,w.fallbackLocale=a.value,$n(w,i.value,A)}}),P=ae(()=>s.value),$=ae(()=>l.value),R=ae(()=>c.value);function B(){return at(v)?v:null}function j(A){v=A,w.postTranslation=A}function Y(){return h}function J(A){A!==null&&(m=Rh(A)),h=A,w.missing=m}const Q=(A,M,ue,xe,Te,Ie)=>{S();let Re;if(__INTLIFY_PROD_DEVTOOLS__)try{bh(hO()),o||(w.fallbackContext=r?oO():void 0),Re=A(w)}finally{bh(null),o||(w.fallbackContext=void 0)}else Re=A(w);if(ut(Re)&&Re===Ys){const[Ue,ct]=M();return r&&f?xe(r):Te(Ue)}else{if(Ie(Re))return Re;throw ft(lt.UNEXPECTED_RETURN_TYPE)}};function ie(...A){return Q(M=>Reflect.apply(_h,null,[M,...A]),()=>vc(...A),"translate",M=>Reflect.apply(M.t,M,[...A]),M=>M,M=>fe(M))}function ge(...A){const[M,ue,xe]=A;if(xe&&!Ke(xe))throw ft(lt.INVALID_ARGUMENT);return ie(M,ue,mt({resolvedMessage:!0},xe||{}))}function ve(...A){return Q(M=>Reflect.apply(Th,null,[M,...A]),()=>bc(...A),"datetime format",M=>Reflect.apply(M.d,M,[...A]),()=>xh,M=>fe(M))}function z(...A){return Q(M=>Reflect.apply(Ph,null,[M,...A]),()=>Cc(...A),"number format",M=>Reflect.apply(M.n,M,[...A]),()=>xh,M=>fe(M))}function W(A){return A.map(M=>fe(M)||ut(M)||Be(M)?Lh(String(M)):M)}const V={normalize:W,interpolate:A=>A,type:"vnode"};function D(...A){return Q(M=>{let ue;const xe=M;try{xe.processor=V,ue=Reflect.apply(_h,null,[xe,...A])}finally{xe.processor=null}return ue},()=>vc(...A),"translate",M=>M[yc](...A),M=>[Lh(M)],M=>Ge(M))}function U(...A){return Q(M=>Reflect.apply(Ph,null,[M,...A]),()=>Cc(...A),"number format",M=>M[wc](...A),()=>[],M=>fe(M)||Ge(M))}function re(...A){return Q(M=>Reflect.apply(Th,null,[M,...A]),()=>bc(...A),"datetime format",M=>M[Sc](...A),()=>[],M=>fe(M)||Ge(M))}function ee(A){b=A,w.pluralRules=b}function ce(A,M){const ue=fe(M)?M:i.value,xe=k(ue);return w.messageResolver(xe,A)!==null}function ke(A){let M=null;const ue=gv(w,a.value,i.value);for(let xe=0;xe{n&&(i.value=A,w.locale=A,$n(w,i.value,a.value))}),kt(r.fallbackLocale,A=>{n&&(a.value=A,w.fallbackLocale=A,$n(w,i.value,a.value))}));const F={id:Ih,locale:E,fallbackLocale:I,get inheritLocale(){return n},set inheritLocale(A){n=A,A&&r&&(i.value=r.locale.value,a.value=r.fallbackLocale.value,$n(w,i.value,a.value))},get availableLocales(){return Object.keys(s.value).sort()},messages:P,get modifiers(){return C},get pluralRules(){return b||{}},get isGlobal(){return o},get missingWarn(){return u},set missingWarn(A){u=A,w.missingWarn=u},get fallbackWarn(){return d},set fallbackWarn(A){d=A,w.fallbackWarn=d},get fallbackRoot(){return f},set fallbackRoot(A){f=A},get fallbackFormat(){return p},set fallbackFormat(A){p=A,w.fallbackFormat=p},get warnHtmlMessage(){return g},set warnHtmlMessage(A){g=A,w.warnHtmlMessage=A},get escapeParameter(){return x},set escapeParameter(A){x=A,w.escapeParameter=A},t:ie,getLocaleMessage:k,setLocaleMessage:y,mergeLocaleMessage:_,getPostTranslationHandler:B,setPostTranslationHandler:j,getMissingHandler:Y,setMissingHandler:J,[kv]:ee};return F.datetimeFormats=$,F.numberFormats=R,F.rt=ge,F.te=ce,F.tm=ye,F.d=ve,F.n=z,F.getDateTimeFormat=L,F.setDateTimeFormat=O,F.mergeDateTimeFormat=N,F.getNumberFormat=X,F.setNumberFormat=te,F.mergeNumberFormat=q,F[Lv]=e.__injectWithOption,F[yc]=D,F[Sc]=re,F[wc]=U,F}function pO(e){const t=fe(e.locale)?e.locale:Pi,r=fe(e.fallbackLocale)||Ge(e.fallbackLocale)||Le(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:t,o=at(e.missing)?e.missing:void 0,n=Be(e.silentTranslationWarn)||io(e.silentTranslationWarn)?!e.silentTranslationWarn:!0,i=Be(e.silentFallbackWarn)||io(e.silentFallbackWarn)?!e.silentFallbackWarn:!0,a=Be(e.fallbackRoot)?e.fallbackRoot:!0,s=!!e.formatFallbackMessages,l=Le(e.modifiers)?e.modifiers:{},c=e.pluralizationRules,u=at(e.postTranslation)?e.postTranslation:void 0,d=fe(e.warnHtmlInMessage)?e.warnHtmlInMessage!=="off":!0,f=!!e.escapeParameterHtml,p=Be(e.sync)?e.sync:!0;let h=e.messages;if(Le(e.sharedMessages)){const w=e.sharedMessages;h=Object.keys(w).reduce((S,E)=>{const I=S[E]||(S[E]={});return mt(I,w[E]),S},h||{})}const{__i18n:m,__root:v,__injectWithOption:g}=e,x=e.datetimeFormats,C=e.numberFormats,b=e.flatJson;return{locale:t,fallbackLocale:r,messages:h,flatJson:b,datetimeFormats:x,numberFormats:C,missing:o,missingWarn:n,fallbackWarn:i,fallbackRoot:a,fallbackFormat:s,modifiers:l,pluralRules:c,postTranslation:u,warnHtmlMessage:d,escapeParameter:f,messageResolver:e.messageResolver,inheritLocale:p,__i18n:m,__root:v,__injectWithOption:g}}function Tc(e={},t){{const r=Zu(pO(e)),o={id:r.id,get locale(){return r.locale.value},set locale(n){r.locale.value=n},get fallbackLocale(){return r.fallbackLocale.value},set fallbackLocale(n){r.fallbackLocale.value=n},get messages(){return r.messages.value},get datetimeFormats(){return r.datetimeFormats.value},get numberFormats(){return r.numberFormats.value},get availableLocales(){return r.availableLocales},get formatter(){return{interpolate(){return[]}}},set formatter(n){},get missing(){return r.getMissingHandler()},set missing(n){r.setMissingHandler(n)},get silentTranslationWarn(){return Be(r.missingWarn)?!r.missingWarn:r.missingWarn},set silentTranslationWarn(n){r.missingWarn=Be(n)?!n:n},get silentFallbackWarn(){return Be(r.fallbackWarn)?!r.fallbackWarn:r.fallbackWarn},set silentFallbackWarn(n){r.fallbackWarn=Be(n)?!n:n},get modifiers(){return r.modifiers},get formatFallbackMessages(){return r.fallbackFormat},set formatFallbackMessages(n){r.fallbackFormat=n},get postTranslation(){return r.getPostTranslationHandler()},set postTranslation(n){r.setPostTranslationHandler(n)},get sync(){return r.inheritLocale},set sync(n){r.inheritLocale=n},get warnHtmlInMessage(){return r.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(n){r.warnHtmlMessage=n!=="off"},get escapeParameterHtml(){return r.escapeParameter},set escapeParameterHtml(n){r.escapeParameter=n},get preserveDirectiveContent(){return!0},set preserveDirectiveContent(n){},get pluralizationRules(){return r.pluralRules||{}},__composer:r,t(...n){const[i,a,s]=n,l={};let c=null,u=null;if(!fe(i))throw ft(lt.INVALID_ARGUMENT);const d=i;return fe(a)?l.locale=a:Ge(a)?c=a:Le(a)&&(u=a),Ge(s)?c=s:Le(s)&&(u=s),Reflect.apply(r.t,r,[d,c||u||{},l])},rt(...n){return Reflect.apply(r.rt,r,[...n])},tc(...n){const[i,a,s]=n,l={plural:1};let c=null,u=null;if(!fe(i))throw ft(lt.INVALID_ARGUMENT);const d=i;return fe(a)?l.locale=a:ut(a)?l.plural=a:Ge(a)?c=a:Le(a)&&(u=a),fe(s)?l.locale=s:Ge(s)?c=s:Le(s)&&(u=s),Reflect.apply(r.t,r,[d,c||u||{},l])},te(n,i){return r.te(n,i)},tm(n){return r.tm(n)},getLocaleMessage(n){return r.getLocaleMessage(n)},setLocaleMessage(n,i){r.setLocaleMessage(n,i)},mergeLocaleMessage(n,i){r.mergeLocaleMessage(n,i)},d(...n){return Reflect.apply(r.d,r,[...n])},getDateTimeFormat(n){return r.getDateTimeFormat(n)},setDateTimeFormat(n,i){r.setDateTimeFormat(n,i)},mergeDateTimeFormat(n,i){r.mergeDateTimeFormat(n,i)},n(...n){return Reflect.apply(r.n,r,[...n])},getNumberFormat(n){return r.getNumberFormat(n)},setNumberFormat(n,i){r.setNumberFormat(n,i)},mergeNumberFormat(n,i){r.mergeNumberFormat(n,i)},getChoiceIndex(n,i){return-1},__onComponentInstanceCreated(n){const{componentInstanceCreatedListener:i}=e;i&&i(n,o)}};return o}}const Xu={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function mO({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((o,n)=>o=[...o,...Ge(n.children)?n.children:[n]],[]):t.reduce((r,o)=>{const n=e[o];return n&&(r[o]=n()),r},{})}function Rv(e){return Je}const Ah={name:"i18n-t",props:mt({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>ut(e)||!isNaN(e)}},Xu),setup(e,t){const{slots:r,attrs:o}=t,n=e.i18n||Yu({useScope:e.scope,__useComponent:!0});return()=>{const i=Object.keys(r).filter(d=>d!=="_"),a={};e.locale&&(a.locale=e.locale),e.plural!==void 0&&(a.plural=fe(e.plural)?+e.plural:e.plural);const s=mO(t,i),l=n[yc](e.keypath,s,a),c=mt({},o),u=fe(e.tag)||Ke(e.tag)?e.tag:Rv();return H(u,c,l)}}};function gO(e){return Ge(e)&&!fe(e[0])}function Av(e,t,r,o){const{slots:n,attrs:i}=t;return()=>{const a={part:!0};let s={};e.locale&&(a.locale=e.locale),fe(e.format)?a.key=e.format:Ke(e.format)&&(fe(e.format.key)&&(a.key=e.format.key),s=Object.keys(e.format).reduce((f,p)=>r.includes(p)?mt({},f,{[p]:e.format[p]}):f,{}));const l=o(e.value,a,s);let c=[a.key];Ge(l)?c=l.map((f,p)=>{const h=n[f.type],m=h?h({[f.type]:f.value,index:p,parts:l}):[f.value];return gO(m)&&(m[0].key=`${f.type}-${p}`),m}):fe(l)&&(c=[l]);const u=mt({},i),d=fe(e.tag)||Ke(e.tag)?e.tag:Rv();return H(d,u,c)}}const Oh={name:"i18n-n",props:mt({value:{type:Number,required:!0},format:{type:[String,Object]}},Xu),setup(e,t){const r=e.i18n||Yu({useScope:"parent",__useComponent:!0});return Av(e,t,Ev,(...o)=>r[wc](...o))}},Bh={name:"i18n-d",props:mt({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Xu),setup(e,t){const r=e.i18n||Yu({useScope:"parent",__useComponent:!0});return Av(e,t,Tv,(...o)=>r[Sc](...o))}};function xO(e,t){const r=e;if(e.mode==="composition")return r.__getInstance(t)||e.global;{const o=r.__getInstance(t);return o!=null?o.__composer:e.global.__composer}}function vO(e){const t=a=>{const{instance:s,modifiers:l,value:c}=a;if(!s||!s.$)throw ft(lt.UNEXPECTED_ERROR);const u=xO(e,s.$),d=Hh(c);return[Reflect.apply(u.t,u,[...Mh(d)]),u]};return{created:(a,s)=>{const[l,c]=t(s);gc&&e.global===c&&(a.__i18nWatcher=kt(c.locale,()=>{s.instance&&s.instance.$forceUpdate()})),a.__composer=c,a.textContent=l},unmounted:a=>{gc&&a.__i18nWatcher&&(a.__i18nWatcher(),a.__i18nWatcher=void 0,delete a.__i18nWatcher),a.__composer&&(a.__composer=void 0,delete a.__composer)},beforeUpdate:(a,{value:s})=>{if(a.__composer){const l=a.__composer,c=Hh(s);a.textContent=Reflect.apply(l.t,l,[...Mh(c)])}},getSSRProps:a=>{const[s]=t(a);return{textContent:s}}}}function Hh(e){if(fe(e))return{path:e};if(Le(e)){if(!("path"in e))throw ft(lt.REQUIRED_VALUE,"path");return e}else throw ft(lt.INVALID_VALUE)}function Mh(e){const{path:t,locale:r,args:o,choice:n,plural:i}=e,a={},s=o||{};return fe(r)&&(a.locale=r),ut(n)&&(a.plural=n),ut(i)&&(a.plural=i),[t,s,a]}function bO(e,t,...r){const o=Le(r[0])?r[0]:{},n=!!o.useI18nComponentName;(Be(o.globalInstall)?o.globalInstall:!0)&&(e.component(n?"i18n":Ah.name,Ah),e.component(Oh.name,Oh),e.component(Bh.name,Bh)),e.directive("t",vO(t))}function CO(e,t,r){return{beforeCreate(){const o=ir();if(!o)throw ft(lt.UNEXPECTED_ERROR);const n=this.$options;if(n.i18n){const i=n.i18n;n.__i18n&&(i.__i18n=n.__i18n),i.__root=t,this===this.$root?this.$i18n=Dh(e,i):(i.__injectWithOption=!0,this.$i18n=Tc(i))}else n.__i18n?this===this.$root?this.$i18n=Dh(e,n):this.$i18n=Tc({__i18n:n.__i18n,__injectWithOption:!0,__root:t}):this.$i18n=e;n.__i18nGlobal&&Iv(t,n,n),e.__onComponentInstanceCreated(this.$i18n),r.__setInstance(o,this.$i18n),this.$t=(...i)=>this.$i18n.t(...i),this.$rt=(...i)=>this.$i18n.rt(...i),this.$tc=(...i)=>this.$i18n.tc(...i),this.$te=(i,a)=>this.$i18n.te(i,a),this.$d=(...i)=>this.$i18n.d(...i),this.$n=(...i)=>this.$i18n.n(...i),this.$tm=i=>this.$i18n.tm(i)},mounted(){},unmounted(){const o=ir();if(!o)throw ft(lt.UNEXPECTED_ERROR);delete this.$t,delete this.$rt,delete this.$tc,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,r.__deleteInstance(o),delete this.$i18n}}}function Dh(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[kv](t.pluralizationRules||e.pluralizationRules);const r=Qs(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(r).forEach(o=>e.mergeLocaleMessage(o,r[o])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(o=>e.mergeDateTimeFormat(o,t.datetimeFormats[o])),t.numberFormats&&Object.keys(t.numberFormats).forEach(o=>e.mergeNumberFormat(o,t.numberFormats[o])),e}const yO=lo("global-vue-i18n");function SO(e={},t){const r=__VUE_I18N_LEGACY_API__&&Be(e.legacy)?e.legacy:__VUE_I18N_LEGACY_API__,o=Be(e.globalInjection)?e.globalInjection:!0,n=__VUE_I18N_LEGACY_API__&&r?!!e.allowComposition:!0,i=new Map,[a,s]=wO(e,r),l=lo("");function c(f){return i.get(f)||null}function u(f,p){i.set(f,p)}function d(f){i.delete(f)}{const f={get mode(){return __VUE_I18N_LEGACY_API__&&r?"legacy":"composition"},get allowComposition(){return n},async install(p,...h){p.__VUE_I18N_SYMBOL__=l,p.provide(p.__VUE_I18N_SYMBOL__,f),!r&&o&&RO(p,f.global),__VUE_I18N_FULL_INSTALL__&&bO(p,f,...h),__VUE_I18N_LEGACY_API__&&r&&p.mixin(CO(s,s.__composer,f));const m=p.unmount;p.unmount=()=>{f.dispose(),m()}},get global(){return s},dispose(){a.stop()},__instances:i,__getInstance:c,__setInstance:u,__deleteInstance:d};return f}}function Yu(e={}){const t=ir();if(t==null)throw ft(lt.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw ft(lt.NOT_INSLALLED);const r=_O(t),o=EO(r),n=$v(t),i=TO(e,n);if(__VUE_I18N_LEGACY_API__&&r.mode==="legacy"&&!e.__useComponent){if(!r.allowComposition)throw ft(lt.NOT_AVAILABLE_IN_LEGACY_MODE);return LO(t,i,o,e)}if(i==="global")return Iv(o,e,n),o;if(i==="parent"){let l=PO(r,t,e.__useComponent);return l==null&&(l=o),l}const a=r;let s=a.__getInstance(t);if(s==null){const l=mt({},e);"__i18n"in n&&(l.__i18n=n.__i18n),o&&(l.__root=o),s=Zu(l),kO(a,t),a.__setInstance(t,s)}return s}function wO(e,t,r){const o=Oc();{const n=__VUE_I18N_LEGACY_API__&&t?o.run(()=>Tc(e)):o.run(()=>Zu(e));if(n==null)throw ft(lt.UNEXPECTED_ERROR);return[o,n]}}function _O(e){{const t=Me(e.isCE?yO:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw ft(e.isCE?lt.NOT_INSLALLED_WITH_PROVIDE:lt.UNEXPECTED_ERROR);return t}}function TO(e,t){return Zs(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function EO(e){return e.mode==="composition"?e.global:e.global.__composer}function PO(e,t,r=!1){let o=null;const n=t.root;let i=t.parent;for(;i!=null;){const a=e;if(e.mode==="composition")o=a.__getInstance(i);else if(__VUE_I18N_LEGACY_API__){const s=a.__getInstance(i);s!=null&&(o=s.__composer,r&&o&&!o[Lv]&&(o=null))}if(o!=null||n===i)break;i=i.parent}return o}function kO(e,t,r){Sr(()=>{},t),Vc(()=>{e.__deleteInstance(t)},t)}function LO(e,t,r,o={}){const n=t==="local",i=fs(null);if(n&&e.proxy&&!(e.proxy.$options.i18n||e.proxy.$options.__i18n))throw ft(lt.MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION);const a=Be(o.inheritLocale)?o.inheritLocale:!0,s=de(n&&a?r.locale.value:fe(o.locale)?o.locale:Pi),l=de(n&&a?r.fallbackLocale.value:fe(o.fallbackLocale)||Ge(o.fallbackLocale)||Le(o.fallbackLocale)||o.fallbackLocale===!1?o.fallbackLocale:s.value),c=de(Qs(s.value,o)),u=de(Le(o.datetimeFormats)?o.datetimeFormats:{[s.value]:{}}),d=de(Le(o.numberFormats)?o.numberFormats:{[s.value]:{}}),f=n?r.missingWarn:Be(o.missingWarn)||io(o.missingWarn)?o.missingWarn:!0,p=n?r.fallbackWarn:Be(o.fallbackWarn)||io(o.fallbackWarn)?o.fallbackWarn:!0,h=n?r.fallbackRoot:Be(o.fallbackRoot)?o.fallbackRoot:!0,m=!!o.fallbackFormat,v=at(o.missing)?o.missing:null,g=at(o.postTranslation)?o.postTranslation:null,x=n?r.warnHtmlMessage:Be(o.warnHtmlMessage)?o.warnHtmlMessage:!0,C=!!o.escapeParameter,b=n?r.modifiers:Le(o.modifiers)?o.modifiers:{},w=o.pluralRules||n&&r.pluralRules;function T(){return[s.value,l.value,c.value,u.value,d.value]}const S=ae({get:()=>i.value?i.value.locale.value:s.value,set:_=>{i.value&&(i.value.locale.value=_),s.value=_}}),E=ae({get:()=>i.value?i.value.fallbackLocale.value:l.value,set:_=>{i.value&&(i.value.fallbackLocale.value=_),l.value=_}}),I=ae(()=>i.value?i.value.messages.value:c.value),P=ae(()=>u.value),$=ae(()=>d.value);function R(){return i.value?i.value.getPostTranslationHandler():g}function B(_){i.value&&i.value.setPostTranslationHandler(_)}function j(){return i.value?i.value.getMissingHandler():v}function Y(_){i.value&&i.value.setMissingHandler(_)}function J(_){return T(),_()}function Q(..._){return i.value?J(()=>Reflect.apply(i.value.t,null,[..._])):J(()=>"")}function ie(..._){return i.value?Reflect.apply(i.value.rt,null,[..._]):""}function ge(..._){return i.value?J(()=>Reflect.apply(i.value.d,null,[..._])):J(()=>"")}function ve(..._){return i.value?J(()=>Reflect.apply(i.value.n,null,[..._])):J(()=>"")}function z(_){return i.value?i.value.tm(_):{}}function W(_,L){return i.value?i.value.te(_,L):!1}function Z(_){return i.value?i.value.getLocaleMessage(_):{}}function V(_,L){i.value&&(i.value.setLocaleMessage(_,L),c.value[_]=L)}function D(_,L){i.value&&i.value.mergeLocaleMessage(_,L)}function U(_){return i.value?i.value.getDateTimeFormat(_):{}}function re(_,L){i.value&&(i.value.setDateTimeFormat(_,L),u.value[_]=L)}function ee(_,L){i.value&&i.value.mergeDateTimeFormat(_,L)}function ce(_){return i.value?i.value.getNumberFormat(_):{}}function ke(_,L){i.value&&(i.value.setNumberFormat(_,L),d.value[_]=L)}function ye(_,L){i.value&&i.value.mergeNumberFormat(_,L)}const k={get id(){return i.value?i.value.id:-1},locale:S,fallbackLocale:E,messages:I,datetimeFormats:P,numberFormats:$,get inheritLocale(){return i.value?i.value.inheritLocale:a},set inheritLocale(_){i.value&&(i.value.inheritLocale=_)},get availableLocales(){return i.value?i.value.availableLocales:Object.keys(c.value)},get modifiers(){return i.value?i.value.modifiers:b},get pluralRules(){return i.value?i.value.pluralRules:w},get isGlobal(){return i.value?i.value.isGlobal:!1},get missingWarn(){return i.value?i.value.missingWarn:f},set missingWarn(_){i.value&&(i.value.missingWarn=_)},get fallbackWarn(){return i.value?i.value.fallbackWarn:p},set fallbackWarn(_){i.value&&(i.value.missingWarn=_)},get fallbackRoot(){return i.value?i.value.fallbackRoot:h},set fallbackRoot(_){i.value&&(i.value.fallbackRoot=_)},get fallbackFormat(){return i.value?i.value.fallbackFormat:m},set fallbackFormat(_){i.value&&(i.value.fallbackFormat=_)},get warnHtmlMessage(){return i.value?i.value.warnHtmlMessage:x},set warnHtmlMessage(_){i.value&&(i.value.warnHtmlMessage=_)},get escapeParameter(){return i.value?i.value.escapeParameter:C},set escapeParameter(_){i.value&&(i.value.escapeParameter=_)},t:Q,getPostTranslationHandler:R,setPostTranslationHandler:B,getMissingHandler:j,setMissingHandler:Y,rt:ie,d:ge,n:ve,tm:z,te:W,getLocaleMessage:Z,setLocaleMessage:V,mergeLocaleMessage:D,getDateTimeFormat:U,setDateTimeFormat:re,mergeDateTimeFormat:ee,getNumberFormat:ce,setNumberFormat:ke,mergeNumberFormat:ye};function y(_){_.locale.value=s.value,_.fallbackLocale.value=l.value,Object.keys(c.value).forEach(L=>{_.mergeLocaleMessage(L,c.value[L])}),Object.keys(u.value).forEach(L=>{_.mergeDateTimeFormat(L,u.value[L])}),Object.keys(d.value).forEach(L=>{_.mergeNumberFormat(L,d.value[L])}),_.escapeParameter=C,_.fallbackFormat=m,_.fallbackRoot=h,_.fallbackWarn=p,_.missingWarn=f,_.warnHtmlMessage=x}return Hr(()=>{if(e.proxy==null||e.proxy.$i18n==null)throw ft(lt.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const _=i.value=e.proxy.$i18n.__composer;t==="global"?(s.value=_.locale.value,l.value=_.fallbackLocale.value,c.value=_.messages.value,u.value=_.datetimeFormats.value,d.value=_.numberFormats.value):n&&y(_)}),k}const $O=["locale","fallbackLocale","availableLocales"],IO=["t","rt","d","n","tm"];function RO(e,t){const r=Object.create(null);$O.forEach(o=>{const n=Object.getOwnPropertyDescriptor(t,o);if(!n)throw ft(lt.UNEXPECTED_ERROR);const i=ot(n.value)?{get(){return n.value.value},set(a){n.value.value=a}}:{get(){return n.get&&n.get()}};Object.defineProperty(r,o,i)}),e.config.globalProperties.$i18n=r,IO.forEach(o=>{const n=Object.getOwnPropertyDescriptor(t,o);if(!n||!n.value)throw ft(lt.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${o}`,n)})}JA(aO);eO(BA);tO(gv);fO();if(__INTLIFY_PROD_DEVTOOLS__){const e=Vn();e.__INTLIFY__=!0,UA(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const AO={EditpasswordPlaceholder:"Enter new password, leave blank to keep the current password",alertText:"Data between accounts is not shared",appName:"Account management",currentUseUsername:"Current username",deletePromptContent:"Are you sure you want to delete {name} ({username})?",formRules:{passwordLimit:"6-20 characters",roleRequired:"Please select a role",usernameRequired:"Enter username with at least 5 characters"},passwordPlaceholder:"Enter password",pblicText:"Public",role:"Role",setOrUnsetPublicMode:"Set/Unset public access",userCountText:"Total {count} users"},OO={loginExpires:"Login status has expired, please login again"},BO={1e3:"Not logged in",1003:"wrong user name or password",1004:"Account has been deactivated or inactivated",1005:"Currently no permission to operate",1006:"Account does not exist",1007:"Old password error",1200:"database error",1201:"Please keep at least one",1202:"Data record not found",1300:"Upload failed",1301:"Upload failed, unsupported file format",1400:"Parameter format error"},HO={title:"System Applications"},MO={about:{QQGroup:"QQ Group:",QR:"QR Code(recommend)",addQQGroupUrl:"Click to join",appName:"About",author:"Author:",checkUpdate:"Check for new version",discussions:"Discussions:",donate:"☕Donate",frontVersionText:"Front-end version number",issue:"Feedback:",viewUpdateLog:"Click here to view update log"},baseSettings:{appName:"Style Settings",bottomMargin:"Bottom margin",clock:"Clock component",clockSecondShow:"Show seconds",configFailed:"Configuration save failed, {message}",configSaved:"Configuration saved",contentArea:"Content area",customFooter:"Custom footer",customImageAddress:"Expand image link input box",detailIcon:"Detail icon",hideDescription:"Hide description information",hideTitle:"Hide title",leftRightMargin:"Left-right margin",mask:"Mask",maxWidth:"Max width",netModeChangeButtonShow:"Show network mode switch button",publicVisitModeShow:"Allow public mode display",resetWarnText:"Are you sure you want to reset these styles?",searchBar:"Search bar component",searchBarSearchItem:"Allow search bar to search items",searchBarShow:"Configuration saved",show:"Show",showTitle:"Show title",smallIcon:"Small icon",systemMonitorStatus:"System status component",textContent:"Text content",topMargin:"Top margin",uploadOrDragText:"Click to upload or drag and drop into the box to replace the image",vague:"Blur",wallpaper:"Wallpaper"},exportImport:{appName:"Export/Import",errorConfigFileFormat:"The configuration file format is incorrect and cannot be imported",errorConfigFileLow:"The configuration file version is too low and cannot be compatible",export:"Export configuration",fileModified:"The file has been modified, import with caution",import:"Import configuration",moduleIcon:"Icon configuration",moduleStyle:"Style configuration",selectExportData:"Select the configuration data to export",selectImportData:"Select the configuration data to import",softwareVersionLow:"The current software version may be too old and may not be compatible with this configuration file. It is recommended to update the software to the latest version before importing again.",tip:"Importing icon configuration data will not clear existing icon data",transmuteStandard:"Transmute Standard",warnConfigFileLow:"The configuration file version is too low but compatible"},itemGroupManage:{appName:"Group Management",deleteWarnText:"Are you sure you want to delete this group [{name}]? The application icons in this group will be lost after deletion.",groupName:"Group name"},uploadsFileManager:{alertText:"Here you can manage wallpapers and icons you have uploaded.",appName:"Upload File Management",copyFailed:"Copy failed",copyLink:"Copy link",copySuccess:"Link copied successfully. You can paste it in the address bar.",deleteWarningText:"Cannot be recovered after deletion. Are you sure you want to continue?",fileName:"Original file name",infoTitle:"File details",nothingText:"You haven't uploaded any images yet.",path:"File path",setWallpaper:"Set as wallpaper",uploadTime:"Upload time"},userInfo:{appName:"My Information",theme:"Theme",themeStyle:{auto:"Follow the system ",dark:"Dark ",light:"Light "}}},DO={action:"Action",add:"Add",addSuccess:"Added successfully",appName:"Sun-Panel",backgroundColor:"Background color",cancel:"Cancel",confirm:"Confirm",continue:"Continue",delete:"Delete",deleteConfirm:"Are you sure you want to delete?",deleteConfirmByName:"Are you sure you want to delete {name}?",deleteFail:"Delete failed",deleteSuccess:"Deleted successfully",description:"Description",download:"Download",edit:"Edit",editFail:"Edit failed",editSuccess:"Edited successfully",export:"Export",exportSuccess:"Exported successfully",failed:"Operation failed",icon:"Icon",image:"Image",import:"Import",importSuccess:"Imported successfully",inputPlaceholder:"Please enter",inputPlaceholderByText:"Please enter {text}",language:"Language",leastOne:"Please keep at least one",networkError:"Network error, please try again later",nikeName:"Nickname",no:"No",noData:"No data available",password:"Password",refreshPage:"Please refresh the page",repeatLater:"Please try again later",reset:"Reset",role:{admin:"Admin",regularUser:"Regular"},save:"Save",saveFail:"Save failed",saveSort:"Save sort",saveSuccess:"Saved successfully",serverError:"Server error",show:"Show",sort:"Sort",style:"Style",success:"Operation successful",text:"Text",textColor:"Text color",title:"Title",unknownError:"Unknown error",uploadFail:"Upload failed",username:"Username",verify:"Verify",warning:"Warning",yes:"Yes"},FO={clock:{fri:"Friday",mon:"Monday",sat:"Saturday",sun:"Sunday",thu:"Thursday",tue:"Tuesday",wed:"Wednesday"},searchBox:{inputPlaceholder:"Enter search content",openWithNewOpen:"Open in new window"},systemMonitor:{cpuState:"CPU status",diskMountPoint:"Mount point",diskState:"Disk status",memoryState:"Memory status",progressColor:"Main color",progressRailColor:"Secondary color",systemState:"System status"}},zO={required:"Required field"},NO={add:"Add item",currentPageLayerOpen:"Open in current page as layer",currentPageOpen:"Open in current page",edit:"Edit item",getGroupFail:"Failed to get group information",getIcon:"Get icon",geticonFail:"Failed to get icon",iconGroup:"Group",inputIconName:"Enter icon name",inputIconUrlOrUpload:"Enter icon URL or upload",lanUrl:"LAN URL",lanUrlInputPlaceholder:"http(s):// (LAN mode, will redirect to this address)",newWindowOpen:"Open in new window",onlineIcon:"Online icon",onlineIconLibrary:"Online icon library",openMethod:"Open method",selectUpload:"Local upload",url:"URL"},WO={loginButton:"Login",passwordPlaceholder:"Password",usernamePlaceholder:"Username",welcomeMessage:"Welcome back!"},jO={changeToLanModel:"Switch to LAN mode",changeToLanModelSuccess:"Switched to LAN mode (mode status saved locally)",changeToWanModel:"Switch to WAN mode",changeToWanModelSuccess:"Switched to WAN mode (mode status saved locally)",goToLogin:"Go to login",openLanUrl:"Open LAN URL",openWanUrl:"Open WAN URL"},UO={confirmLogoutText:"Are you sure you want to logout?",confirmPassword:"Confirm new password",confirmPasswordInconsistentMsg:"Passwords do not match",logout:"Logout",logoutSuccess:"You have safely logged out. Looking forward to seeing you again!",newPassword:"New password",oldPassword:"Old password",updatePassword:"Change password"},VO={adminSettingUsers:AO,api:OO,apiErrorCode:BO,appLauncher:HO,apps:MO,common:DO,deskModule:FO,form:zO,iconItem:NO,login:WO,panelHome:jO,settingUserInfo:UO},qO={EditpasswordPlaceholder:"请输入新密码,留空密码不变",alertText:"账号之间的数据不互通",appName:"账号管理",currentUseUsername:"当前账号",deletePromptContent:"你确定删除{name}({username})?",formRules:{passwordLimit:"6-20个字符",roleRequired:"请选择角色",usernameRequired:"请输入账号且大于5个字符"},passwordPlaceholder:"请输入密码",pblicText:"公开",role:"角色",setOrUnsetPublicMode:"设置/取消公开访问",userCountText:"共{count}位用户"},GO={loginExpires:"登录状态已过期,请重新登录"},KO={1e3:"未登录",1003:"用户名或密码错误",1004:"账号已停用或未激活",1005:"当前无权限操作",1006:"账号不存在",1007:"旧密码错误",1200:"数据库出错",1201:"请至少保留一个",1202:"未找到数据记录",1300:"上传失败",1301:"上传失败,不被支持的文件格式",1400:"参数格式错误"},ZO={title:"系统应用"},XO={about:{QQGroup:"QQ交流群:",QR:"二维码(推荐)",addQQGroupUrl:"点击添加",appName:"关于",author:"作者:",checkUpdate:"检查新版本",discussions:"交流社区:",donate:"🧧打赏",frontVersionText:"前端版本号",issue:"建议反馈:",viewUpdateLog:"点此查看更新说明"},baseSettings:{appName:"风格设置",bottomMargin:"下边距",clock:"时钟组件",clockSecondShow:"显示秒",configFailed:"配置保存失败,{message}",configSaved:"配置已保存",contentArea:"内容区域",customFooter:"自定义页脚",customImageAddress:"展开图片链接输入框",detailIcon:"详情图标",hideDescription:"隐藏描述信息",hideTitle:"隐藏标题",leftRightMargin:"左右边距",mask:"遮罩",maxWidth:"最大宽度",netModeChangeButtonShow:"显示网络模式切换按钮",publicVisitModeShow:"公开模式允许显示",resetWarnText:"确定要重置这些样式吗?",searchBar:"搜索栏组件",searchBarSearchItem:"允许搜索栏搜索项目",searchBarShow:"配置已保存",show:"显示",showTitle:"显示标题",smallIcon:"小图标",systemMonitorStatus:"系统状态组件",textContent:"文本内容",topMargin:"上边距",uploadOrDragText:"点击上传替换图片或拖拽到框内",vague:"模糊",wallpaper:"壁纸"},exportImport:{appName:"导出导入",errorConfigFileFormat:"配置文件格式不正确,无法导入",errorConfigFileLow:"配置文件版本过低,无法兼容",export:"导出配置",fileModified:"文件被修改过,谨慎导入",import:"导入配置",moduleIcon:"图标配置",moduleStyle:"样式配置",selectExportData:"请选择要导出的配置数据",selectImportData:"请选择要导入的配置数据",softwareVersionLow:"当前软件版本可能过旧,很有可能无法兼容该配置文件,请谨慎导入。推荐将软件更新到新版后再次导入",tip:"导入图标配置数据不会清空现有图标数据",transmuteStandard:"浏览器书签转换工具",warnConfigFileLow:"配置文件版本过低,但是兼容"},itemGroupManage:{appName:"分组管理",deleteWarnText:"你确定删除此分组[{name}],删除后此分组应用图标将丢失?",groupName:"分组名称"},uploadsFileManager:{alertText:"你可以在这里管理你上传过的壁纸和图标",appName:"上传文件管理",copyFailed:"复制失败",copyLink:"复制链接",copySuccess:"链接复制成功,可以在图标地址栏",deleteWarningText:"删除后无法恢复,你确定要继续吗?",fileName:"原文件名",infoTitle:"文件详情",nothingText:"你还没有上传过任何图片",path:"文件路径",setWallpaper:"设置为壁纸",uploadTime:"上传时间"},userInfo:{appName:"我的信息",theme:"主题",themeStyle:{auto:"跟随系统 ",dark:"深色 ",light:"浅色 "}}},YO={action:"操作",add:"添加",addSuccess:"添加成功",appName:"Sun-Panel",backgroundColor:"背景颜色",cancel:"取消",confirm:"确定",continue:"继续",delete:"删除",deleteConfirm:"你确定要删除吗?",deleteConfirmByName:"你确定要删除{name}吗?",deleteFail:"删除失败",deleteSuccess:"删除成功",description:"描述信息",download:"下载",edit:"编辑",editFail:"编辑失败",editSuccess:"编辑成功",export:"导出",exportSuccess:"导出成功",failed:"操作失败",icon:"图标",image:"图片",import:"导入",importSuccess:"导入成功",inputPlaceholder:"请输入",inputPlaceholderByText:"请输入{text}",language:"语言",leastOne:"请至少保留一项",networkError:"网络错误,请稍后重试",nikeName:"昵称",no:"否",noData:"暂无数据",password:"密码",refreshPage:"请刷新页面",repeatLater:"请稍后重试",reset:"重置",role:{admin:"管理",regularUser:"普通"},save:"保存",saveFail:"保存成功",saveSort:"保存排序",saveSuccess:"保存成功",serverError:"服务器错误",show:"显示",sort:"排序",style:"风格",success:"操作成功",text:"文字",textColor:"文字颜色",title:"标题",unknownError:"未知错误",uploadFail:"上传失败",username:"账号",verify:"验证",warning:"警告",yes:"是"},QO={clock:{fri:"星期五",mon:"星期一",sat:"星期六",sun:"星期日",thu:"星期四",tue:"星期二",wed:"星期三"},searchBox:{inputPlaceholder:"请输入搜索内容",openWithNewOpen:"新窗口打开"},systemMonitor:{cpuState:"CPU状态",diskMountPoint:"挂载点",diskState:"磁盘状态",memoryState:"内存状态",progressColor:"主色",progressRailColor:"副色",systemState:"系统状态"}},JO={required:"必填项"},eB={add:"添加项目",currentPageLayerOpen:"当前页面弹窗打开",currentPageOpen:"当前页面打开",edit:"修改项目",getGroupFail:"分组信息获取失败",getIcon:"获取图标",geticonFail:"图标获取失败",iconGroup:"分组",inputIconName:"请输入图标名称",inputIconUrlOrUpload:"输入图标地址或上传",lanUrl:"内网地址",lanUrlInputPlaceholder:"http(s)://(内网模式,会跳转该地址)",newWindowOpen:"新窗口打开",onlineIcon:"在线图标",onlineIconLibrary:"在线图标库",openMethod:"打开方式",selectUpload:"本地上传",url:"地址"},tB={loginButton:"登录",passwordPlaceholder:"密码",usernamePlaceholder:"账号",welcomeMessage:"欢迎回来!"},rB={changeToLanModel:"切换为内网模式",changeToLanModelSuccess:"已经切换到内网模式(模式状态仅保存在本地)",changeToWanModel:"切换为公网模式",changeToWanModelSuccess:"已经切换到公网模式(模式状态仅保存在本地)",goToLogin:"前往登录",openLanUrl:"打开局域网地址",openWanUrl:"打开公网地址"},oB={confirmLogoutText:"你确定要退出登录吗?",confirmPassword:"确认新密码",confirmPasswordInconsistentMsg:"两次密码不一致",logout:"退出登录",logoutSuccess:"您已经安全退出,期待与你再次相见!",newPassword:"新密码",oldPassword:"旧密码",updatePassword:"修改密码"},nB={adminSettingUsers:qO,api:GO,apiErrorCode:KO,appLauncher:ZO,apps:XO,common:YO,deskModule:QO,form:JO,iconItem:eB,login:tB,panelHome:rB,settingUserInfo:oB},Fh="zh-CN",Qu=SO({locale:Fh,fallbackLocale:Fh,allowComposition:!0,messages:{"en-US":VO,"zh-CN":nB}}),as=Qu.global.t;function _l(e){Qu.global.locale=e}function iB(e){e.use(Qu)}const Ec=de("light"),aB=ae(()=>({theme:Ec.value==="light"?ta:zn})),{message:ca}=VP(["message"],{configProviderProps:aB});function sB(e){const t=Ws(),r=cm();t.theme==="auto"?Ec.value=r.value:Ec.value=t.theme;const o=`apiErrorCode.${e.code}`,n=as(o);return o===n?!1:(ca.error(as(`apiErrorCode.${e.code}`)),!0)}let Tl=!1;function lB({url:e,data:t,method:r,headers:o,onDownloadProgress:n,signal:i,beforeRequest:a,afterRequest:s}){const l=Ox(),c=Ws(),u=p=>p.data.code===0?p.data:p.data.code===1001?(Tl===!1&&(Tl=!0,ca.warning(as("api.loginExpires"),{onLeave(){Tl=!1}})),an.push({path:"/login"}),l.removeToken(),p.data):p.data.code===1e3?(an.push({path:"/login"}),l.removeToken(),p.data):p.data.code===1005?(ca.warning(p.data.msg),p.data):p.data.code===-1||sB(p.data)?p.data:Promise.reject(p.data),d=p=>{throw s==null||s(),ca.error(as("common.networkError"),{duration:5e4,closable:!0}),new Error((p==null?void 0:p.msg)||"Error")};a==null||a(),r=r||"GET";const f=Object.assign(typeof t=="function"?t():t??{},{});return o||(o={}),o.token=l.token,o.lang=c.language,r==="GET"?is.get(e,{params:f,signal:i,onDownloadProgress:n}).then(u,d):is.post(e,f,{headers:o,signal:i,onDownloadProgress:n}).then(u,d)}function Js({url:e,data:t,method:r="POST",headers:o,onDownloadProgress:n,signal:i,beforeRequest:a,afterRequest:s}){return lB({url:e,method:r,data:t,headers:o,onDownloadProgress:n,signal:i,beforeRequest:a,afterRequest:s})}function iH(e){return Js({url:"/panel/userConfig/set",data:e})}function cB(){return Js({url:"/panel/userConfig/get"})}const aH=Do("panel",{state:()=>$$()||Hx(),getters:{},actions:{setLeftSiderCollapsed(e){this.leftSiderCollapsed=e},setRightSiderCollapsed(e){this.rightSiderCollapsed=e},setNetworkMode(e){this.networkMode=e,this.recordState()},updatePanelConfigByCloud(){cB().then(e=>{e.code===0?this.panelConfig={...lc(),...e.data.panel}:this.resetPanelConfig(),this.recordState()})},resetPanelConfig(){this.panelConfig=lc()},async reloadRoute(e){await an.push({name:"AppletDialog",params:{aiAppletId:e}})},recordState(){I$(this.$state)},removeState(){R$()}}}),Ov="moduleConfig";function uB(){return{...Rt.get(Ov)}}function dB(e){Rt.set(Ov,e)}function fB(e){return Js({url:"/system/moduleConfig/getByName",data:{name:e}})}function hB(e,t){return Js({url:"/system/moduleConfig/save",data:{name:e,value:t}})}const sH=Do("module-config-store",{state:()=>uB(),actions:{async getValueByNameFromCloud(e){const t=`module-${e}`;return await fB(t)},async saveToCloud(e,t){const r=`module-${e}`;return hB(r,t)},recordState(){dB(this.$state)}}}),pB=Jk();function mB(e){e.use(pB)}function Bv(){const e=Ws(),t=cm(),r=ae(()=>e.theme==="auto"?t.value==="dark":e.theme==="dark"),o=ae(()=>r.value?zn:void 0),n=ae(()=>r.value?{common:{}}:{});return kt(()=>r.value,i=>{i?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")},{immediate:!0}),{theme:o,themeOverrides:n}}function gB(){const e=Ws();return{language:ae(()=>{switch(e.language){case"en-US":return _l("en-US"),w3;case"zh-CN":return _l("zh-CN"),Od;default:return _l("zh-CN"),Od}})}}const xB=Oe({__name:"App",setup(e){const{theme:t,themeOverrides:r}=Bv(),{language:o}=gB();return(n,i)=>{const a=r2("RouterView");return bs(),Cs(pt($g),{class:"h-full",theme:pt(t),"theme-overrides":pt(r),locale:pt(o)},{default:Co(()=>[qe(pt(YP),null,{default:Co(()=>[qe(a)]),_:1})]),_:1},8,["theme","theme-overrides","locale"])}}});function vB(){const e=document.createElement("meta");e.name="naive-ui-style",document.head.appendChild(e)}function bB(){vB()}const CB=()=>{var r,o,n,i,a,s;const e=document.createElement("style"),t=` - ::-webkit-scrollbar { - background-color: transparent; - width: ${(r=ta.Scrollbar.common)==null?void 0:r.scrollbarWidth}; - } - ::-webkit-scrollbar-thumb { - background-color: ${(o=ta.Scrollbar.common)==null?void 0:o.scrollbarColor}; - border-radius: ${(n=ta.Scrollbar.common)==null?void 0:n.scrollbarBorderRadius}; - } - html.dark ::-webkit-scrollbar { - background-color: transparent; - width: ${(i=zn.Scrollbar.common)==null?void 0:i.scrollbarWidth}; - } - html.dark ::-webkit-scrollbar-thumb { - background-color: ${(a=zn.Scrollbar.common)==null?void 0:a.scrollbarColor}; - border-radius: ${(s=zn.Scrollbar.common)==null?void 0:s.scrollbarBorderRadius}; - } - `;e.innerHTML=t,document.head.appendChild(e)};if(typeof window<"u"){let e=function(){var t=document.body,r=document.getElementById("__svg__icons__dom__");r||(r=document.createElementNS("http://www.w3.org/2000/svg","svg"),r.style.position="absolute",r.style.width="0",r.style.height="0",r.id="__svg__icons__dom__",r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("xmlns:link","http://www.w3.org/1999/xlink")),r.innerHTML='',t.insertBefore(r,t.lastChild)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e):e()}async function yB(){const e=Kp(xB);bB(),CB(),mB(e),iB(e),await FI(e),e.mount("#app")}yB();export{DB as $,_e as A,so as B,W0 as C,Sr as D,gs as E,z0 as F,Jt as G,Me as H,hg as I,G3 as J,Ce as K,Rr as L,md as M,iu as N,xy as O,Yc as P,Dw as Q,jt as R,Is as S,br as T,UB as U,ud as V,Cr as W,jB as X,NB as Y,yC as Z,MB as _,Or as a,Co as a$,VB as a0,WB as a1,FB as a2,zB as a3,oi as a4,Vy as a5,dt as a6,Qc as a7,pa as a8,cy as a9,Uy as aA,tg as aB,hu as aC,fu as aD,pu as aE,Ca as aF,P1 as aG,BB as aH,qB as aI,HP as aJ,vi as aK,Rs as aL,ou as aM,Zp as aN,bE as aO,Dl as aP,oC as aQ,Ar as aR,Km as aS,hw as aT,vs as aU,ZE as aV,bs as aW,kB as aX,Tp as aY,kc as aZ,Cs as a_,l_ as aa,_o as ab,Fd as ac,ya as ad,jl as ae,yi as af,ws as ag,mu as ah,gn as ai,Wl as aj,Ug as ak,f5 as al,sy as am,Nt as an,Je as ao,eH as ap,iy as aq,ay as ar,ri as as,yu as at,dn as au,HB as av,OB as aw,zl as ax,p1 as ay,J6 as az,Zt as b,Os as b$,ti as b0,SB as b1,pt as b2,Mp as b3,qe as b4,$B as b5,IB as b6,rH as b7,fs as b8,EB as b9,an as bA,Ws as bB,x_ as bC,bp as bD,Cp as bE,cd as bF,Dr as bG,oo as bH,wi as bI,Zm as bJ,ag as bK,xu as bL,N0 as bM,KB as bN,Cw as bO,Yt as bP,Og as bQ,YB as bR,v6 as bS,_s as bT,ao as bU,vd as bV,LB as bW,nH as bX,im as bY,x8 as bZ,Zw as b_,TB as ba,Pn as bb,yx as bc,Lc as bd,Js as be,Rb as bf,ir as bg,Vc as bh,ot as bi,w5 as bj,Ae as bk,Ox as bl,sB as bm,ex as bn,as as bo,W5 as bp,PB as bq,sH as br,RB as bs,AB as bt,Ax as bu,aH as bv,l1 as bw,Cx as bx,wB as by,_B as bz,Pt as c,JB as c0,Ng as c1,gu as c2,I6 as c3,hy as c4,ZT as c5,oH as c6,C$ as c7,VP as c8,Y0 as c9,XB as cA,Ho as cB,wC as cC,Ny as cD,SC as cE,xi as cF,tH as cG,T6 as cH,sc as cI,kT as cJ,Yb as cK,GT as cL,dE as cM,iH as cN,G5 as cO,Rg as cP,Mg as cQ,li as cR,l5 as cS,uw as cT,QB as ca,FC as cb,cu as cc,zS as cd,km as ce,du as cf,FS as cg,va as ch,pn as ci,x4 as cj,Ci as ck,Bm as cl,rn as cm,Ps as cn,Ad as co,Im as cp,mn as cq,Am as cr,hn as cs,Pm as ct,Em as cu,ql as cv,Tm as cw,h3 as cx,a4 as cy,w3 as cz,nr as d,Gt as e,Oe as f,H as g,nu as h,i4 as i,Oo as j,fn as k,Si as l,Se as m,ne as n,Hr as o,he as p,sr as q,de as r,$s as s,GB as t,Es as u,rm as v,kt as w,VC as x,ae as y,Ct as z}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-85275cb2.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-85275cb2.js deleted file mode 100644 index 1f326b860..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-85275cb2.js +++ /dev/null @@ -1 +0,0 @@ -import{h as D,s as F,i as G,e as T,g as q}from"./index-bc9666b7.js";import{S as y}from"./index-c238f14b.js";import{_ as L}from"./index-b1d3d9b0.js";import{f as U,r as v,bn as A,bw as E,bo as r,D as I,aW as c,aX as b,b3 as i,b4 as o,a$ as n,b0 as h,b1 as f,b2 as t,ac as m,a_ as k,ao as R,bq as W,bC as P,bd as X,aZ as Z}from"./index-7e19b821.js";import{d as j,a as H,N as J}from"./index-2b595d91.js";import"./_plugin-vue_export-helper-c27b6911.js";const K={class:"h-full"},O={class:"p-2"},Q={class:"overflow-auto w-full mt-[20px] bg-slate-200 dark:bg-zinc-900 rounded-xl",style:{height:"calc(100% - 65px)"}},Y={class:"flex items-center"},ee={class:"mr-[10px]"},se={class:"ml-auto"},le={class:"ml-[10px]"},de=U({__name:"index",setup(ae){const x=v(null),p=A(),S=E(),u=v(!1),w={title:"",icon:"material-symbols:folder-outline",sort:9999},a=v({show:!1,editStatus:1,model:w,rules:{title:[{required:!0,trigger:"blur",message:r("form.required")}]}}),d=v([]);function C(){a.value.show=!a.value.show}function z(s){a.value.show=!0,a.value.model=s,a.value.editStatus=2}function N(){u.value=!0}function $(){const s=[];for(let e=0;e{e===0?(p.success(r("common.saveSuccess")),u.value=!1):p.error(`${r("common.saveFail")}:${l}`)})}function M(s){S.warning({title:r("common.warning"),content:r("apps.itemGroupManage.deleteWarnText",{name:s.title}),positiveText:r("common.confirm"),negativeText:r("common.cancel"),onPositiveClick:()=>{s.id&&G([s.id]).then(({code:e,msg:l})=>{e!==0?p.error(r("common.deleteFail")):g()})}})}function V(){var s;(s=x.value)==null||s.validate(e=>{e?console.log(e):T(a.value.model).then(({code:l,msg:_})=>{l!==0&&p.error(_),g(),a.value.show=!1,a.value.model={...w}})})}function g(){q().then(({code:s,data:e})=>{d.value=e.list})}return I(()=>{g()}),(s,e)=>(c(),b("div",K,[i("div",O,[o(t(m),{type:"success",size:"small",style:{"margin-right":"10px"},onClick:C},{default:n(()=>[h(f(s.$t("common.add")),1)]),_:1}),u.value?(c(),k(t(m),{key:1,type:"warning",size:"small",onClick:$},{default:n(()=>[h(f(s.$t("common.saveSort")),1)]),_:1})):(c(),k(t(m),{key:0,size:"small",onClick:N},{default:n(()=>[h(f(s.$t("common.sort")),1)]),_:1}))]),i("div",Q,[o(t(D),{modelValue:d.value,"onUpdate:modelValue":e[0]||(e[0]=l=>d.value=l),"item-key":"sort",animation:300,style:Z({padding:u.value?"20px":"10px"}),disabled:!u.value},{default:n(()=>[(c(!0),b(R,null,W(d.value,(l,_)=>(c(),b("div",{key:_,class:"w-full"},[o(t(P),{size:"small",style:{"border-radius":"10px","margin-bottom":"10px"}},{default:n(()=>[i("div",{class:X(["flex",u.value?"cursor-move":""])},[i("div",Y,[i("span",ee,[o(t(y),{class:"text-[20px]",icon:"material-symbols:ad-group-outline-rounded"})]),i("span",null,f(l.title),1)]),i("div",se,[i("span",null,[o(t(m),{strong:"",secondary:"",type:"success",size:"small",onClick:B=>z(l)},{icon:n(()=>[o(t(y),{icon:"basil:edit-solid"})]),_:2},1032,["onClick"])]),i("span",le,[o(t(m),{strong:"",secondary:"",type:"error",size:"small",class:"ml-[10px]",onClick:B=>M(l)},{icon:n(()=>[o(t(y),{icon:"material-symbols:delete"})]),_:2},1032,["onClick"])])])],2)]),_:2},1024)]))),128))]),_:1},8,["modelValue","style","disabled"])]),o(t(L),{show:a.value.show,"onUpdate:show":e[2]||(e[2]=l=>a.value.show=l),size:"small",type:"small",title:a.value.editStatus===1?"添加":"编辑",style:{width:"400px"}},{footer:n(()=>[o(t(m),{type:"success",size:"small",class:"float-right",onClick:V},{default:n(()=>[h(f(s.$t("common.confirm")),1)]),_:1})]),default:n(()=>[o(t(j),{ref_key:"formRef",ref:x,model:a.value.model,rules:a.value.rules},{default:n(()=>[o(t(H),{path:"title",label:s.$t("apps.itemGroupManage.groupName")},{default:n(()=>[o(t(J),{value:a.value.model.title,"onUpdate:value":e[1]||(e[1]=l=>a.value.model.title=l),type:"text",maxlength:20,"show-count":""},null,8,["value"])]),_:1},8,["label"])]),_:1},8,["model","rules"])]),_:1},8,["show","title"])]))}});export{de as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8886367f.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8886367f.css deleted file mode 100644 index d6b991c16..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8886367f.css +++ /dev/null @@ -1 +0,0 @@ -.text-shadow[data-v-da662465]{text-shadow:0px 0px 5px gray} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8a6943bf.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8a6943bf.js deleted file mode 100644 index e4b4d55c5..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8a6943bf.js +++ /dev/null @@ -1 +0,0 @@ -import{f as M,c7 as E,bl as O,bB as W,bv as X,bn as j,bw as G,r as f,bo as l,aW as y,aX as k,b4 as a,a$ as n,b3 as i,b1 as d,b0 as m,b2 as o,ac as c,bC as _}from"./index-7e19b821.js";import{N as b,b as N,l as H,d as J,a as S}from"./index-2b595d91.js";import{a as K}from"./index-8f0537f1.js";import{S as Q}from"./index-c238f14b.js";import{_ as Y,w as Z,u as ee,x as se}from"./index-b1d3d9b0.js";import{N as oe}from"./Divider-a11d112a.js";import"./_plugin-vue_export-helper-c27b6911.js";const ae={class:"bg-slate-200 dark:bg-zinc-900 p-2 h-full"},te={class:"text-slate-500 font-bold"},le={class:"mt-[10px]"},ne={class:"text-slate-500 font-bold"},re={key:0},ie={key:1,class:"flex items-center"},de={class:"max-w-[150px]"},ue={class:"mt-[10px]"},me={class:"text-slate-500 font-bold"},fe={class:"max-w-[200px]"},pe={class:"mt-[10px]"},ve={class:"text-slate-500 font-bold"},ce={class:"max-w-[200px]"},ge={class:"float-right"},Se=M({__name:"index",setup(we){var x;const C=E(),g=O(),p=W(),z=X(),v=j(),L=G(),P=f(p.language),U=f(p.theme),I=f(((x=g.userInfo)==null?void 0:x.name)||""),w=f(!1),$=f(null),T=[{label:l("apps.userInfo.themeStyle.dark"),key:"dark",value:"dark"},{label:l("apps.userInfo.themeStyle.light"),key:"light",value:"light"},{label:l("apps.userInfo.themeStyle.auto"),key:"Auto",value:"auto"}],t=f({show:!1,loading:!1,form:{password:"",oldPassword:"",confirmPassword:""}}),V={oldPassword:{required:!0,trigger:"blur",min:6,max:20,message:l("adminSettingUsers.formRules.passwordLimit")},password:{required:!0,trigger:"blur",min:6,max:20,message:l("adminSettingUsers.formRules.passwordLimit")},confirmPassword:{required:!0,trigger:"blur",min:6,max:20,message:l("adminSettingUsers.formRules.passwordLimit")}};async function R(){await K(),C.resetUserInfo(),g.removeToken(),z.removeState(),p.removeToken(),v.success(l("settingUserInfo.logoutSuccess")),location.reload()}function B(){Z(I.value).then(({code:e,msg:s})=>{e===0?(ee(),w.value=!1):v.error(`${l("common.editFail")}:${s}`)})}function q(e){var s;e.preventDefault(),(s=$.value)==null||s.validate(r=>{if(r){console.log(r);return}if(t.value.form.password!==t.value.form.confirmPassword){v.error(l("settingUserInfo.confirmPasswordInconsistentMsg"));return}t.value.loading=!0,se(t.value.form.oldPassword,t.value.form.password).then(({code:h,msg:u})=>{h===0&&(t.value.show=!1,v.success(l("common.success")))}).finally(()=>{t.value.loading=!1}).catch(()=>{v.error(l("common.serverError"))})})}function A(){L.warning({title:l("common.warning"),content:l("settingUserInfo.confirmLogoutText"),positiveText:l("common.confirm"),negativeText:l("common.cancel"),onPositiveClick:()=>{R()}})}function D(e){P.value=e,p.setLanguage(e),location.reload()}function F(e){U.value=e,p.setTheme(e)}return(e,s)=>(y(),k("div",ae,[a(o(_),{style:{"border-radius":"10px"},size:"small"},{default:n(()=>{var r,h;return[i("div",null,[i("div",te,d(e.$t("common.username")),1),m(" "+d((r=o(g).userInfo)==null?void 0:r.username),1)]),i("div",le,[i("div",ne,d(e.$t("common.nikeName")),1),w.value?(y(),k("div",ie,[i("div",de,[a(o(b),{value:I.value,"onUpdate:value":s[1]||(s[1]=u=>I.value=u),type:"text",placeholder:e.$t("common.inputPlaceholder")},null,8,["value","placeholder"])]),a(o(c),{size:"small",quaternary:"",type:"info",onClick:B},{default:n(()=>[m(d(e.$t("common.save")),1)]),_:1})])):(y(),k("div",re,[m(d((h=o(g).userInfo)==null?void 0:h.name)+" ",1),a(o(c),{size:"small",text:"",type:"info",onClick:s[0]||(s[0]=u=>w.value=!w.value)},{default:n(()=>[m(d(e.$t("common.edit")),1)]),_:1})]))]),i("div",ue,[i("div",me,d(e.$t("common.language")),1),i("div",fe,[a(o(N),{value:P.value,"onUpdate:value":s[2]||(s[2]=u=>P.value=u),options:o(H),onUpdateValue:D},null,8,["value","options"])])]),i("div",pe,[i("div",ve,d(e.$t("apps.userInfo.theme")),1),i("div",ce,[a(o(N),{value:U.value,"onUpdate:value":s[3]||(s[3]=u=>U.value=u),options:T,onUpdateValue:F},null,8,["value"])])]),a(o(oe),{style:{margin:"10px 0"},dashed:""}),i("div",null,[a(o(c),{size:"small",text:"",type:"info",onClick:s[4]||(s[4]=u=>t.value.show=!t.value.show)},{default:n(()=>[m(d(e.$t("settingUserInfo.updatePassword")),1)]),_:1})])]}),_:1}),a(o(_),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:n(()=>[a(o(c),{size:"small",text:"",type:"error",onClick:A},{icon:n(()=>[a(o(Q),{icon:"tabler:logout"})]),default:n(()=>[m(" "+d(e.$t("settingUserInfo.logout")),1)]),_:1})]),_:1}),a(o(Y),{show:t.value.show,"onUpdate:show":s[8]||(s[8]=r=>t.value.show=r),size:"small",preset:"card",style:{width:"400px"},title:e.$t("settingUserInfo.updatePassword")},{footer:n(()=>[i("div",ge,[a(o(c),{type:"success",size:"small",loading:t.value.loading,onClick:q},{default:n(()=>[m(d(e.$t("common.save")),1)]),_:1},8,["loading"])])]),default:n(()=>[a(o(J),{ref_key:"formRef",ref:$,model:t.value.form,rules:V},{default:n(()=>[a(o(S),{path:"oldPassword",label:e.$t("settingUserInfo.oldPassword")},{default:n(()=>[a(o(b),{value:t.value.form.oldPassword,"onUpdate:value":s[5]||(s[5]=r=>t.value.form.oldPassword=r),maxlength:20,type:"password",placeholder:e.$t("settingUserInfo.oldPassword")},null,8,["value","placeholder"])]),_:1},8,["label"]),a(o(S),{path:"password",label:e.$t("settingUserInfo.newPassword")},{default:n(()=>[a(o(b),{value:t.value.form.password,"onUpdate:value":s[6]||(s[6]=r=>t.value.form.password=r),maxlength:20,type:"password",placeholder:e.$t("settingUserInfo.newPassword")},null,8,["value","placeholder"])]),_:1},8,["label"]),a(o(S),{path:"confirmPassword",label:e.$t("settingUserInfo.confirmPassword")},{default:n(()=>[a(o(b),{value:t.value.form.confirmPassword,"onUpdate:value":s[7]||(s[7]=r=>t.value.form.confirmPassword=r),maxlength:20,type:"password",placeholder:e.$t("settingUserInfo.confirmPassword")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1},8,["model"])]),_:1},8,["show","title"])]))}});export{Se as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8f0537f1.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8f0537f1.js deleted file mode 100644 index a5dfbb603..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8f0537f1.js +++ /dev/null @@ -1 +0,0 @@ -import{be as o}from"./index-7e19b821.js";function n(r){return o({url:"/login",data:r})}function u(){return o({url:"/logout"})}export{u as a,n as l}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8f8851de.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8f8851de.js deleted file mode 100644 index b0b7ce7ee..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-8f8851de.js +++ /dev/null @@ -1 +0,0 @@ -import{f as s,aX as a,b3 as c,b4 as o,a$ as r,b2 as n,bW as i,bX as l,aW as d,b0 as x,ac as p}from"./index-7e19b821.js";const u="/assets/404-b0d1a3d9.svg",_={class:"flex h-full"},m={class:"px-4 m-auto space-y-4 text-center max-[400px]"},f=i('

页面不存在

404
',3),N=s({__name:"index",setup(h){const e=l();function t(){e.push("/")}return(b,v)=>(d(),a("div",_,[c("div",m,[f,o(n(p),{type:"primary",onClick:t},{default:r(()=>[x(" 返回首页 ")]),_:1})])]))}});export{N as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-93265a97.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-93265a97.js deleted file mode 100644 index 31ad3ef96..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-93265a97.js +++ /dev/null @@ -1,274 +0,0 @@ -import{t as Bt,f as ge,q as Ne,H as Pt,y as B,B as Pe,L as Ve,F as Ye,g as f,ac as Me,G as J,S as Vt,aE as Mt,bT as Nt,m as h,p as x,n as A,z as le,cJ as It,r as N,a6 as Ut,as as Dt,aM as Ft,ab as L,cK as jt,K as _,J as Qe,v as Ht,x as Ot,cL as At,a5 as lt,w as qe,R as We,b as Et,N as Wt,T as Kt,e as ze,c as $e,ad as et,aj as tt,cM as Lt,A as Z,aH as Ke,aw as W,cC as Le,ah as Xt,bJ as Yt,bl as qt,bv as Gt,bn as Jt,bo as Te,bc as Re,cN as Zt,aW as Q,aX as ee,b4 as u,a$ as C,b3 as d,b1 as y,b2 as n,bC as K,b5 as ie,aZ as Qt,b0 as Xe,by as en,bz as tn}from"./index-7e19b821.js";import{b as nt,N as nn,p as on,u as rt,d as Ge,V as an,e as sn,g as ln}from"./index-c238f14b.js";import{N as Be,b as ot}from"./index-2b595d91.js";import{j as rn,N as dn,k as cn,l as un}from"./index-bc9666b7.js";import{k as hn,l as ve}from"./index-b1d3d9b0.js";import{_ as fn}from"./_plugin-vue_export-helper-c27b6911.js";const dt=Bt("n-popconfirm"),ct={positiveText:String,negativeText:String,showIcon:{type:Boolean,default:!0},onPositiveClick:{type:Function,required:!0},onNegativeClick:{type:Function,required:!0}},at=Nt(ct),vn=ge({name:"NPopconfirmPanel",props:ct,setup(e){const{localeRef:c}=nt("Popconfirm"),{inlineThemeDisabled:s}=Ne(),{mergedClsPrefixRef:g,mergedThemeRef:p,props:m}=Pt(dt),$=B(()=>{const{common:{cubicBezierEaseInOut:k},self:{fontSize:z,iconSize:T,iconColor:r}}=p.value;return{"--n-bezier":k,"--n-font-size":z,"--n-icon-size":T,"--n-icon-color":r}}),w=s?Pe("popconfirm-panel",void 0,$,m):void 0;return Object.assign(Object.assign({},nt("Popconfirm")),{mergedClsPrefix:g,cssVars:s?void 0:$,localizedPositiveText:B(()=>e.positiveText||c.value.positiveText),localizedNegativeText:B(()=>e.negativeText||c.value.negativeText),positiveButtonProps:Ve(m,"positiveButtonProps"),negativeButtonProps:Ve(m,"negativeButtonProps"),handlePositiveClick(k){e.onPositiveClick(k)},handleNegativeClick(k){e.onNegativeClick(k)},themeClass:w==null?void 0:w.themeClass,onRender:w==null?void 0:w.onRender})},render(){var e;const{mergedClsPrefix:c,showIcon:s,$slots:g}=this,p=Ye(g.action,()=>this.negativeText===null&&this.positiveText===null?[]:[this.negativeText!==null&&f(Me,Object.assign({size:"small",onClick:this.handleNegativeClick},this.negativeButtonProps),{default:()=>this.localizedNegativeText}),this.positiveText!==null&&f(Me,Object.assign({size:"small",type:"primary",onClick:this.handlePositiveClick},this.positiveButtonProps),{default:()=>this.localizedPositiveText})]);return(e=this.onRender)===null||e===void 0||e.call(this),f("div",{class:[`${c}-popconfirm__panel`,this.themeClass],style:this.cssVars},J(g.default,m=>s||m?f("div",{class:`${c}-popconfirm__body`},s?f("div",{class:`${c}-popconfirm__icon`},Ye(g.icon,()=>[f(Vt,{clsPrefix:c},{default:()=>f(Mt,null)})])):null,m):null),p?f("div",{class:[`${c}-popconfirm__action`]},p):null)}}),pn=h("popconfirm",[x("body",` - font-size: var(--n-font-size); - display: flex; - align-items: center; - flex-wrap: nowrap; - position: relative; - `,[x("icon",` - display: flex; - font-size: var(--n-icon-size); - color: var(--n-icon-color); - transition: color .3s var(--n-bezier); - margin: 0 8px 0 0; - `)]),x("action",` - display: flex; - justify-content: flex-end; - `,[A("&:not(:first-child)","margin-top: 8px"),h("button",[A("&:not(:last-child)","margin-right: 8px;")])])]),mn=Object.assign(Object.assign(Object.assign({},le.props),on),{positiveText:String,negativeText:String,showIcon:{type:Boolean,default:!0},trigger:{type:String,default:"click"},positiveButtonProps:Object,negativeButtonProps:Object,onPositiveClick:Function,onNegativeClick:Function}),gn=ge({name:"Popconfirm",props:mn,__popover__:!0,setup(e){const{mergedClsPrefixRef:c}=Ne(),s=le("Popconfirm","-popconfirm",pn,It,e,c),g=N(null);function p(w){var k;if(!(!((k=g.value)===null||k===void 0)&&k.getMergedShow()))return;const{onPositiveClick:z,"onUpdate:show":T}=e;Promise.resolve(z?z(w):!0).then(r=>{var a;r!==!1&&((a=g.value)===null||a===void 0||a.setShow(!1),T&&L(T,!1))})}function m(w){var k;if(!(!((k=g.value)===null||k===void 0)&&k.getMergedShow()))return;const{onNegativeClick:z,"onUpdate:show":T}=e;Promise.resolve(z?z(w):!0).then(r=>{var a;r!==!1&&((a=g.value)===null||a===void 0||a.setShow(!1),T&&L(T,!1))})}return Ut(dt,{mergedThemeRef:s,mergedClsPrefixRef:c,props:e}),{setShow(w){var k;(k=g.value)===null||k===void 0||k.setShow(w)},syncPosition(){var w;(w=g.value)===null||w===void 0||w.syncPosition()},mergedTheme:s,popoverInstRef:g,handlePositiveClick:p,handleNegativeClick:m}},render(){const{$slots:e,$props:c,mergedTheme:s}=this;return f(nn,Ft(c,at,{theme:s.peers.Popover,themeOverrides:s.peerOverrides.Popover,internalExtraClass:["popconfirm"],ref:"popoverInstRef"}),{trigger:e.activator||e.trigger,default:()=>{const g=Dt(c,at);return f(vn,Object.assign(Object.assign({},g),{onPositiveClick:this.handlePositiveClick,onNegativeClick:this.handleNegativeClick}),e)}})}});function st(e){return window.TouchEvent&&e instanceof window.TouchEvent}function it(){const e=new Map,c=s=>g=>{e.set(s,g)};return jt(()=>{e.clear()}),[e,c]}const bn=A([h("slider",` - display: block; - padding: calc((var(--n-handle-size) - var(--n-rail-height)) / 2) 0; - position: relative; - z-index: 0; - width: 100%; - cursor: pointer; - user-select: none; - -webkit-user-select: none; - `,[_("reverse",[h("slider-handles",[h("slider-handle-wrapper",` - transform: translate(50%, -50%); - `)]),h("slider-dots",[h("slider-dot",` - transform: translateX(50%, -50%); - `)]),_("vertical",[h("slider-handles",[h("slider-handle-wrapper",` - transform: translate(-50%, -50%); - `)]),h("slider-marks",[h("slider-mark",` - transform: translateY(calc(-50% + var(--n-dot-height) / 2)); - `)]),h("slider-dots",[h("slider-dot",` - transform: translateX(-50%) translateY(0); - `)])])]),_("vertical",` - padding: 0 calc((var(--n-handle-size) - var(--n-rail-height)) / 2); - width: var(--n-rail-width-vertical); - height: 100%; - `,[h("slider-handles",` - top: calc(var(--n-handle-size) / 2); - right: 0; - bottom: calc(var(--n-handle-size) / 2); - left: 0; - `,[h("slider-handle-wrapper",` - top: unset; - left: 50%; - transform: translate(-50%, 50%); - `)]),h("slider-rail",` - height: 100%; - `,[x("fill",` - top: unset; - right: 0; - bottom: unset; - left: 0; - `)]),_("with-mark",` - width: var(--n-rail-width-vertical); - margin: 0 32px 0 8px; - `),h("slider-marks",` - top: calc(var(--n-handle-size) / 2); - right: unset; - bottom: calc(var(--n-handle-size) / 2); - left: 22px; - font-size: var(--n-mark-font-size); - `,[h("slider-mark",` - transform: translateY(50%); - white-space: nowrap; - `)]),h("slider-dots",` - top: calc(var(--n-handle-size) / 2); - right: unset; - bottom: calc(var(--n-handle-size) / 2); - left: 50%; - `,[h("slider-dot",` - transform: translateX(-50%) translateY(50%); - `)])]),_("disabled",` - cursor: not-allowed; - opacity: var(--n-opacity-disabled); - `,[h("slider-handle",` - cursor: not-allowed; - `)]),_("with-mark",` - width: 100%; - margin: 8px 0 32px 0; - `),A("&:hover",[h("slider-rail",{backgroundColor:"var(--n-rail-color-hover)"},[x("fill",{backgroundColor:"var(--n-fill-color-hover)"})]),h("slider-handle",{boxShadow:"var(--n-handle-box-shadow-hover)"})]),_("active",[h("slider-rail",{backgroundColor:"var(--n-rail-color-hover)"},[x("fill",{backgroundColor:"var(--n-fill-color-hover)"})]),h("slider-handle",{boxShadow:"var(--n-handle-box-shadow-hover)"})]),h("slider-marks",` - position: absolute; - top: 18px; - left: calc(var(--n-handle-size) / 2); - right: calc(var(--n-handle-size) / 2); - `,[h("slider-mark",` - position: absolute; - transform: translateX(-50%); - white-space: nowrap; - `)]),h("slider-rail",` - width: 100%; - position: relative; - height: var(--n-rail-height); - background-color: var(--n-rail-color); - transition: background-color .3s var(--n-bezier); - border-radius: calc(var(--n-rail-height) / 2); - `,[x("fill",` - position: absolute; - top: 0; - bottom: 0; - border-radius: calc(var(--n-rail-height) / 2); - transition: background-color .3s var(--n-bezier); - background-color: var(--n-fill-color); - `)]),h("slider-handles",` - position: absolute; - top: 0; - right: calc(var(--n-handle-size) / 2); - bottom: 0; - left: calc(var(--n-handle-size) / 2); - `,[h("slider-handle-wrapper",` - outline: none; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); - cursor: pointer; - display: flex; - `,[h("slider-handle",` - height: var(--n-handle-size); - width: var(--n-handle-size); - border-radius: 50%; - overflow: hidden; - transition: box-shadow .2s var(--n-bezier), background-color .3s var(--n-bezier); - background-color: var(--n-handle-color); - box-shadow: var(--n-handle-box-shadow); - `,[A("&:hover",` - box-shadow: var(--n-handle-box-shadow-hover); - `)]),A("&:focus",[h("slider-handle",` - box-shadow: var(--n-handle-box-shadow-focus); - `,[A("&:hover",` - box-shadow: var(--n-handle-box-shadow-active); - `)])])])]),h("slider-dots",` - position: absolute; - top: 50%; - left: calc(var(--n-handle-size) / 2); - right: calc(var(--n-handle-size) / 2); - `,[_("transition-disabled",[h("slider-dot","transition: none;")]),h("slider-dot",` - transition: - border-color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier); - position: absolute; - transform: translate(-50%, -50%); - height: var(--n-dot-height); - width: var(--n-dot-width); - border-radius: var(--n-dot-border-radius); - overflow: hidden; - box-sizing: border-box; - border: var(--n-dot-border); - background-color: var(--n-dot-color); - `,[_("active","border: var(--n-dot-border-active);")])])]),h("slider-handle-indicator",` - font-size: var(--n-font-size); - padding: 6px 10px; - border-radius: var(--n-indicator-border-radius); - color: var(--n-indicator-text-color); - background-color: var(--n-indicator-color); - box-shadow: var(--n-indicator-box-shadow); - `,[Qe()]),h("slider-handle-indicator",` - font-size: var(--n-font-size); - padding: 6px 10px; - border-radius: var(--n-indicator-border-radius); - color: var(--n-indicator-text-color); - background-color: var(--n-indicator-color); - box-shadow: var(--n-indicator-box-shadow); - `,[_("top",` - margin-bottom: 12px; - `),_("right",` - margin-left: 12px; - `),_("bottom",` - margin-top: 12px; - `),_("left",` - margin-right: 12px; - `),Qe()]),Ht(h("slider",[h("slider-dot","background-color: var(--n-dot-color-modal);")])),Ot(h("slider",[h("slider-dot","background-color: var(--n-dot-color-popover);")]))]),xn=0,wn=Object.assign(Object.assign({},le.props),{to:Ge.propTo,defaultValue:{type:[Number,Array],default:0},marks:Object,disabled:{type:Boolean,default:void 0},formatTooltip:Function,keyboard:{type:Boolean,default:!0},min:{type:Number,default:0},max:{type:Number,default:100},step:{type:[Number,String],default:1},range:Boolean,value:[Number,Array],placement:String,showTooltip:{type:Boolean,default:void 0},tooltip:{type:Boolean,default:!0},vertical:Boolean,reverse:Boolean,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onDragstart:[Function],onDragend:[Function]}),pe=ge({name:"Slider",props:wn,setup(e){const{mergedClsPrefixRef:c,namespaceRef:s,inlineThemeDisabled:g}=Ne(e),p=le("Slider","-slider",bn,At,e,c),m=N(null),[$,w]=it(),[k,z]=it(),T=N(new Set),r=lt(e),{mergedDisabledRef:a}=r,l=B(()=>{const{step:t}=e;if(Number(t)<=0||t==="mark")return 0;const o=t.toString();let i=0;return o.includes(".")&&(i=o.length-o.indexOf(".")-1),i}),D=N(e.defaultValue),Ie=Ve(e,"value"),re=rt(Ie,D),I=B(()=>{const{value:t}=re;return(e.range?t:[t]).map(Y)}),be=B(()=>I.value.length>2),Ue=B(()=>e.placement===void 0?e.vertical?"right":"top":e.placement),xe=B(()=>{const{marks:t}=e;return t?Object.keys(t).map(parseFloat):null}),U=N(-1),de=N(-1),M=N(-1),b=N(!1),E=N(!1),X=B(()=>{const{vertical:t,reverse:o}=e;return t?o?"top":"bottom":o?"right":"left"}),te=B(()=>{if(be.value)return;const t=I.value,o=ne(e.range?Math.min(...t):e.min),i=ne(e.range?Math.max(...t):t[0]),{value:v}=X;return e.vertical?{[v]:`${o}%`,height:`${i-o}%`}:{[v]:`${o}%`,width:`${i-o}%`}}),ce=B(()=>{const t=[],{marks:o}=e;if(o){const i=I.value.slice();i.sort((P,V)=>P-V);const{value:v}=X,{value:S}=be,{range:R}=e,H=S?()=>!1:P=>R?P>=i[0]&&P<=i[i.length-1]:P<=i[0];for(const P of Object.keys(o)){const V=Number(P);t.push({active:H(V),label:o[P],style:{[v]:`${ne(V)}%`}})}}return t});function ue(t,o){const i=ne(t),{value:v}=X;return{[v]:`${i}%`,zIndex:o===U.value?1:0}}function we(t){return e.showTooltip||M.value===t||U.value===t&&b.value}function De(t){return b.value?!(U.value===t&&de.value===t):!0}function Fe(t){var o;~t&&(U.value=t,(o=$.get(t))===null||o===void 0||o.focus())}function je(){k.forEach((t,o)=>{we(o)&&t.syncPosition()})}function j(t){const{"onUpdate:value":o,onUpdateValue:i}=e,{nTriggerFormInput:v,nTriggerFormChange:S}=r;i&&L(i,t),o&&L(o,t),D.value=t,v(),S()}function ye(t){const{range:o}=e;if(o){if(Array.isArray(t)){const{value:i}=I;t.join()!==i.join()&&j(t)}}else Array.isArray(t)||I.value[0]!==t&&j(t)}function he(t,o){if(e.range){const i=I.value.slice();i.splice(o,1,t),ye(i)}else ye(t)}function F(t,o,i){const v=i!==void 0;i||(i=t-o>0?1:-1);const S=xe.value||[],{step:R}=e;if(R==="mark"){const V=q(t,S.concat(o),v?i:void 0);return V?V.value:o}if(R<=0)return o;const{value:H}=l;let P;if(v){const V=Number((o/R).toFixed(H)),G=Math.floor(V),Ae=V>G?G:G-1,Ee=V0)&&(v===null||H0?1:-1),o)}function ut(t){var o,i;if(a.value||!st(t)&&t.button!==xn)return;const v=oe(t);if(v===void 0)return;const S=I.value.slice(),R=e.range?(i=(o=q(v,S))===null||o===void 0?void 0:o.index)!==null&&i!==void 0?i:-1:0;R!==-1&&(t.preventDefault(),Fe(R),ht(),he(F(v,I.value[R]),R))}function ht(){b.value||(b.value=!0,e.onDragstart&&L(e.onDragstart),ze("touchend",document,_e),ze("mouseup",document,_e),ze("touchmove",document,Ce),ze("mousemove",document,Ce))}function Se(){b.value&&(b.value=!1,e.onDragend&&L(e.onDragend),$e("touchend",document,_e),$e("mouseup",document,_e),$e("touchmove",document,Ce),$e("mousemove",document,Ce))}function Ce(t){const{value:o}=U;if(!b.value||o===-1){Se();return}const i=oe(t);i!==void 0&&he(F(i,I.value[o]),o)}function _e(){Se()}function ft(t){U.value=t,a.value||(M.value=t)}function vt(t){U.value===t&&(U.value=-1,Se()),M.value===t&&(M.value=-1)}function pt(t){M.value=t}function mt(t){M.value===t&&(M.value=-1)}qe(U,(t,o)=>void We(()=>de.value=o)),qe(re,()=>{if(e.marks){if(E.value)return;E.value=!0,We(()=>{E.value=!1})}We(je)}),Et(()=>{Se()});const Je=B(()=>{const{self:{markFontSize:t,railColor:o,railColorHover:i,fillColor:v,fillColorHover:S,handleColor:R,opacityDisabled:H,dotColor:P,dotColorModal:V,handleBoxShadow:G,handleBoxShadowHover:Ae,handleBoxShadowActive:Ee,handleBoxShadowFocus:gt,dotBorder:bt,dotBoxShadow:xt,railHeight:wt,railWidthVertical:yt,handleSize:kt,dotHeight:St,dotWidth:Ct,dotBorderRadius:_t,fontSize:zt,dotBorderActive:$t,dotColorPopover:Tt},common:{cubicBezierEaseInOut:Rt}}=p.value;return{"--n-bezier":Rt,"--n-dot-border":bt,"--n-dot-border-active":$t,"--n-dot-border-radius":_t,"--n-dot-box-shadow":xt,"--n-dot-color":P,"--n-dot-color-modal":V,"--n-dot-color-popover":Tt,"--n-dot-height":St,"--n-dot-width":Ct,"--n-fill-color":v,"--n-fill-color-hover":S,"--n-font-size":zt,"--n-handle-box-shadow":G,"--n-handle-box-shadow-active":Ee,"--n-handle-box-shadow-focus":gt,"--n-handle-box-shadow-hover":Ae,"--n-handle-color":R,"--n-handle-size":kt,"--n-opacity-disabled":H,"--n-rail-color":o,"--n-rail-color-hover":i,"--n-rail-height":wt,"--n-rail-width-vertical":yt,"--n-mark-font-size":t}}),ae=g?Pe("slider",void 0,Je,e):void 0,Ze=B(()=>{const{self:{fontSize:t,indicatorColor:o,indicatorBoxShadow:i,indicatorTextColor:v,indicatorBorderRadius:S}}=p.value;return{"--n-font-size":t,"--n-indicator-border-radius":S,"--n-indicator-box-shadow":i,"--n-indicator-color":o,"--n-indicator-text-color":v}}),se=g?Pe("slider-indicator",void 0,Ze,e):void 0;return{mergedClsPrefix:c,namespace:s,uncontrolledValue:D,mergedValue:re,mergedDisabled:a,mergedPlacement:Ue,isMounted:Wt(),adjustedTo:Ge(e),dotTransitionDisabled:E,markInfos:ce,isShowTooltip:we,shouldKeepTooltipTransition:De,handleRailRef:m,setHandleRefs:w,setFollowerRefs:z,fillStyle:te,getHandleStyle:ue,activeIndex:U,arrifiedValues:I,followerEnabledIndexSet:T,handleRailMouseDown:ut,handleHandleFocus:ft,handleHandleBlur:vt,handleHandleMouseEnter:pt,handleHandleMouseLeave:mt,handleRailKeyDown:fe,indicatorCssVars:g?void 0:Ze,indicatorThemeClass:se==null?void 0:se.themeClass,indicatorOnRender:se==null?void 0:se.onRender,cssVars:g?void 0:Je,themeClass:ae==null?void 0:ae.themeClass,onRender:ae==null?void 0:ae.onRender}},render(){var e;const{mergedClsPrefix:c,themeClass:s,formatTooltip:g}=this;return(e=this.onRender)===null||e===void 0||e.call(this),f("div",{class:[`${c}-slider`,s,{[`${c}-slider--disabled`]:this.mergedDisabled,[`${c}-slider--active`]:this.activeIndex!==-1,[`${c}-slider--with-mark`]:this.marks,[`${c}-slider--vertical`]:this.vertical,[`${c}-slider--reverse`]:this.reverse}],style:this.cssVars,onKeydown:this.handleRailKeyDown,onMousedown:this.handleRailMouseDown,onTouchstart:this.handleRailMouseDown},f("div",{class:`${c}-slider-rail`},f("div",{class:`${c}-slider-rail__fill`,style:this.fillStyle}),this.marks?f("div",{class:[`${c}-slider-dots`,this.dotTransitionDisabled&&`${c}-slider-dots--transition-disabled`]},this.markInfos.map(p=>f("div",{key:p.label,class:[`${c}-slider-dot`,{[`${c}-slider-dot--active`]:p.active}],style:p.style}))):null,f("div",{ref:"handleRailRef",class:`${c}-slider-handles`},this.arrifiedValues.map((p,m)=>{const $=this.isShowTooltip(m);return f(an,null,{default:()=>[f(sn,null,{default:()=>f("div",{ref:this.setHandleRefs(m),class:`${c}-slider-handle-wrapper`,tabindex:this.mergedDisabled?-1:0,style:this.getHandleStyle(p,m),onFocus:()=>{this.handleHandleFocus(m)},onBlur:()=>{this.handleHandleBlur(m)},onMouseenter:()=>{this.handleHandleMouseEnter(m)},onMouseleave:()=>{this.handleHandleMouseLeave(m)}},Ye(this.$slots.thumb,()=>[f("div",{class:`${c}-slider-handle`})]))}),this.tooltip&&f(ln,{ref:this.setFollowerRefs(m),show:$,to:this.adjustedTo,enabled:this.showTooltip&&!this.range||this.followerEnabledIndexSet.has(m),teleportDisabled:this.adjustedTo===Ge.tdkey,placement:this.mergedPlacement,containerClass:this.namespace},{default:()=>f(Kt,{name:"fade-in-scale-up-transition",appear:this.isMounted,css:this.shouldKeepTooltipTransition(m),onEnter:()=>{this.followerEnabledIndexSet.add(m)},onAfterLeave:()=>{this.followerEnabledIndexSet.delete(m)}},{default:()=>{var w;return $?((w=this.indicatorOnRender)===null||w===void 0||w.call(this),f("div",{class:[`${c}-slider-handle-indicator`,this.indicatorThemeClass,`${c}-slider-handle-indicator--${this.mergedPlacement}`],style:this.indicatorCssVars},typeof g=="function"?g(p):p)):null}})})]})})),this.marks?f("div",{class:`${c}-slider-marks`},this.markInfos.map(p=>f("div",{key:p.label,class:`${c}-slider-mark`,style:p.style},p.label))):null))}}),yn=h("switch",` - height: var(--n-height); - min-width: var(--n-width); - vertical-align: middle; - user-select: none; - -webkit-user-select: none; - display: inline-flex; - outline: none; - justify-content: center; - align-items: center; -`,[x("children-placeholder",` - height: var(--n-rail-height); - display: flex; - flex-direction: column; - overflow: hidden; - pointer-events: none; - visibility: hidden; - `),x("rail-placeholder",` - display: flex; - flex-wrap: none; - `),x("button-placeholder",` - width: calc(1.75 * var(--n-rail-height)); - height: var(--n-rail-height); - `),h("base-loading",` - position: absolute; - top: 50%; - left: 50%; - transform: translateX(-50%) translateY(-50%); - font-size: calc(var(--n-button-width) - 4px); - color: var(--n-loading-color); - transition: color .3s var(--n-bezier); - `,[et({left:"50%",top:"50%",originalTransform:"translateX(-50%) translateY(-50%)"})]),x("checked, unchecked",` - transition: color .3s var(--n-bezier); - color: var(--n-text-color); - box-sizing: border-box; - position: absolute; - white-space: nowrap; - top: 0; - bottom: 0; - display: flex; - align-items: center; - line-height: 1; - `),x("checked",` - right: 0; - padding-right: calc(1.25 * var(--n-rail-height) - var(--n-offset)); - `),x("unchecked",` - left: 0; - justify-content: flex-end; - padding-left: calc(1.25 * var(--n-rail-height) - var(--n-offset)); - `),A("&:focus",[x("rail",` - box-shadow: var(--n-box-shadow-focus); - `)]),_("round",[x("rail","border-radius: calc(var(--n-rail-height) / 2);",[x("button","border-radius: calc(var(--n-button-height) / 2);")])]),tt("disabled",[tt("icon",[_("rubber-band",[_("pressed",[x("rail",[x("button","max-width: var(--n-button-width-pressed);")])]),x("rail",[A("&:active",[x("button","max-width: var(--n-button-width-pressed);")])]),_("active",[_("pressed",[x("rail",[x("button","left: calc(100% - var(--n-offset) - var(--n-button-width-pressed));")])]),x("rail",[A("&:active",[x("button","left: calc(100% - var(--n-offset) - var(--n-button-width-pressed));")])])])])])]),_("active",[x("rail",[x("button","left: calc(100% - var(--n-button-width) - var(--n-offset))")])]),x("rail",` - overflow: hidden; - height: var(--n-rail-height); - min-width: var(--n-rail-width); - border-radius: var(--n-rail-border-radius); - cursor: pointer; - position: relative; - transition: - opacity .3s var(--n-bezier), - background .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); - background-color: var(--n-rail-color); - `,[x("button-icon",` - color: var(--n-icon-color); - transition: color .3s var(--n-bezier); - font-size: calc(var(--n-button-height) - 4px); - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - display: flex; - justify-content: center; - align-items: center; - line-height: 1; - `,[et()]),x("button",` - align-items: center; - top: var(--n-offset); - left: var(--n-offset); - height: var(--n-button-height); - width: var(--n-button-width-pressed); - max-width: var(--n-button-width); - border-radius: var(--n-button-border-radius); - background-color: var(--n-button-color); - box-shadow: var(--n-button-box-shadow); - box-sizing: border-box; - cursor: inherit; - content: ""; - position: absolute; - transition: - background-color .3s var(--n-bezier), - left .3s var(--n-bezier), - opacity .3s var(--n-bezier), - max-width .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); - `)]),_("active",[x("rail","background-color: var(--n-rail-color-active);")]),_("loading",[x("rail",` - cursor: wait; - `)]),_("disabled",[x("rail",` - cursor: not-allowed; - opacity: .5; - `)])]),kn=Object.assign(Object.assign({},le.props),{size:{type:String,default:"medium"},value:{type:[String,Number,Boolean],default:void 0},loading:Boolean,defaultValue:{type:[String,Number,Boolean],default:!1},disabled:{type:Boolean,default:void 0},round:{type:Boolean,default:!0},"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],checkedValue:{type:[String,Number,Boolean],default:!0},uncheckedValue:{type:[String,Number,Boolean],default:!1},railStyle:Function,rubberBand:{type:Boolean,default:!0},onChange:[Function,Array]});let me;const O=ge({name:"Switch",props:kn,setup(e){me===void 0&&(typeof CSS<"u"?typeof CSS.supports<"u"?me=CSS.supports("width","max(1px)"):me=!1:me=!0);const{mergedClsPrefixRef:c,inlineThemeDisabled:s}=Ne(e),g=le("Switch","-switch",yn,Lt,e,c),p=lt(e),{mergedSizeRef:m,mergedDisabledRef:$}=p,w=N(e.defaultValue),k=Ve(e,"value"),z=rt(k,w),T=B(()=>z.value===e.checkedValue),r=N(!1),a=N(!1),l=B(()=>{const{railStyle:b}=e;if(b)return b({focused:a.value,checked:T.value})});function D(b){const{"onUpdate:value":E,onChange:X,onUpdateValue:te}=e,{nTriggerFormInput:ce,nTriggerFormChange:ue}=p;E&&L(E,b),te&&L(te,b),X&&L(X,b),w.value=b,ce(),ue()}function Ie(){const{nTriggerFormFocus:b}=p;b()}function re(){const{nTriggerFormBlur:b}=p;b()}function I(){e.loading||$.value||(z.value!==e.checkedValue?D(e.checkedValue):D(e.uncheckedValue))}function be(){a.value=!0,Ie()}function Ue(){a.value=!1,re(),r.value=!1}function xe(b){e.loading||$.value||b.key===" "&&(z.value!==e.checkedValue?D(e.checkedValue):D(e.uncheckedValue),r.value=!1)}function U(b){e.loading||$.value||b.key===" "&&(b.preventDefault(),r.value=!0)}const de=B(()=>{const{value:b}=m,{self:{opacityDisabled:E,railColor:X,railColorActive:te,buttonBoxShadow:ce,buttonColor:ue,boxShadowFocus:we,loadingColor:De,textColor:Fe,iconColor:je,[Z("buttonHeight",b)]:j,[Z("buttonWidth",b)]:ye,[Z("buttonWidthPressed",b)]:he,[Z("railHeight",b)]:F,[Z("railWidth",b)]:Y,[Z("railBorderRadius",b)]:ne,[Z("buttonBorderRadius",b)]:He},common:{cubicBezierEaseInOut:Oe}}=g.value;let q,oe,fe;return me?(q=`calc((${F} - ${j}) / 2)`,oe=`max(${F}, ${j})`,fe=`max(${Y}, calc(${Y} + ${j} - ${F}))`):(q=Ke((W(F)-W(j))/2),oe=Ke(Math.max(W(F),W(j))),fe=W(F)>W(j)?Y:Ke(W(Y)+W(j)-W(F))),{"--n-bezier":Oe,"--n-button-border-radius":He,"--n-button-box-shadow":ce,"--n-button-color":ue,"--n-button-width":ye,"--n-button-width-pressed":he,"--n-button-height":j,"--n-height":oe,"--n-offset":q,"--n-opacity-disabled":E,"--n-rail-border-radius":ne,"--n-rail-color":X,"--n-rail-color-active":te,"--n-rail-height":F,"--n-rail-width":Y,"--n-width":fe,"--n-box-shadow-focus":we,"--n-loading-color":De,"--n-text-color":Fe,"--n-icon-color":je}}),M=s?Pe("switch",B(()=>m.value[0]),de,e):void 0;return{handleClick:I,handleBlur:Ue,handleFocus:be,handleKeyup:xe,handleKeydown:U,mergedRailStyle:l,pressed:r,mergedClsPrefix:c,mergedValue:z,checked:T,mergedDisabled:$,cssVars:s?void 0:de,themeClass:M==null?void 0:M.themeClass,onRender:M==null?void 0:M.onRender}},render(){const{mergedClsPrefix:e,mergedDisabled:c,checked:s,mergedRailStyle:g,onRender:p,$slots:m}=this;p==null||p();const{checked:$,unchecked:w,icon:k,"checked-icon":z,"unchecked-icon":T}=m,r=!(Le(k)&&Le(z)&&Le(T));return f("div",{role:"switch","aria-checked":s,class:[`${e}-switch`,this.themeClass,r&&`${e}-switch--icon`,s&&`${e}-switch--active`,c&&`${e}-switch--disabled`,this.round&&`${e}-switch--round`,this.loading&&`${e}-switch--loading`,this.pressed&&`${e}-switch--pressed`,this.rubberBand&&`${e}-switch--rubber-band`],tabindex:this.mergedDisabled?void 0:0,style:this.cssVars,onClick:this.handleClick,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyup:this.handleKeyup,onKeydown:this.handleKeydown},f("div",{class:`${e}-switch__rail`,"aria-hidden":"true",style:g},J($,a=>J(w,l=>a||l?f("div",{"aria-hidden":!0,class:`${e}-switch__children-placeholder`},f("div",{class:`${e}-switch__rail-placeholder`},f("div",{class:`${e}-switch__button-placeholder`}),a),f("div",{class:`${e}-switch__rail-placeholder`},f("div",{class:`${e}-switch__button-placeholder`}),l)):null)),f("div",{class:`${e}-switch__button`},J(k,a=>J(z,l=>J(T,D=>f(Xt,null,{default:()=>this.loading?f(Yt,{key:"loading",clsPrefix:e,strokeWidth:20}):this.checked&&(l||a)?f("div",{class:`${e}-switch__button-icon`,key:l?"checked-icon":"icon"},l||a):!this.checked&&(D||a)?f("div",{class:`${e}-switch__button-icon`,key:D?"unchecked-icon":"icon"},D||a):null})))),J($,a=>a&&f("div",{key:"checked",class:`${e}-switch__checked`},a)),J(w,a=>a&&f("div",{key:"unchecked",class:`${e}-switch__unchecked`},a)))))}}),Sn=e=>(en("data-v-da662465"),e=e(),tn(),e),Cn={class:"bg-slate-200 dark:bg-zinc-900 rounded-[10px] p-[8px] overflow-auto"},_n=Sn(()=>d("div",{class:"text-slate-500 mb-[5px] font-bold"}," LOGO ",-1)),zn={class:"flex items-center mt-[5px]"},$n={class:"text-slate-500 mb-[5px] font-bold"},Tn={class:"flex items-center mt-[5px]"},Rn={class:"mr-[10px]"},Bn={class:"text-slate-500 mb-[5px] font-bold"},Pn={class:"flex items-center mt-[5px]"},Vn={class:"mr-[10px]"},Mn={key:0,class:"flex items-center mt-[5px]"},Nn={class:"mr-[10px]"},In={class:"text-slate-500 mb-[5px] font-bold"},Un={class:"flex items-center mt-[5px]"},Dn={class:"mr-[10px]"},Fn={key:0,class:"flex items-center mt-[5px]"},jn={class:"mr-[10px]"},Hn={key:1,class:"flex items-center mt-[5px]"},On={class:"mr-[10px]"},An={class:"text-slate-500 mb-[5px] font-bold"},En={class:"mt-[5px]"},Wn={class:"flex items-center mt-[5px]"},Kn={key:0,class:"mt-[5px]"},Ln={class:"flex items-center mt-[5px]"},Xn={key:1,class:"mt-[5px]"},Yn={class:"flex items-center mt-[5px]"},qn={class:"mt-[5px]"},Gn={class:"flex items-center mt-[5px]"},Jn={class:"text-slate-500 mb-[5px] font-bold"},Zn={class:"text-shadow text-white"},Qn={class:"flex items-center mt-[5px]"},eo={class:"mr-[10px]"},to={key:0,class:"mt-1"},no={class:"flex items-center mt-[10px]"},oo={class:"mr-[10px]"},ao={class:"flex items-center mt-[10px]"},so={class:"mr-[10px]"},io={class:"text-slate-500 mb-[5px] font-bold"},lo={class:"flex items-center mt-[5px]"},ro={class:"mr-[10px]"},co={class:"flex items-center mt-[10px]"},uo={class:"mr-[10px]"},ho={class:"flex"},fo={class:"flex items-center mt-[10px]"},vo={class:"mr-[10px]"},po={class:"flex items-center mt-[10px]"},mo={class:"mr-[10px]"},go={class:"flex items-center mt-[10px]"},bo={class:"mr-[10px]"},xo={class:"text-slate-500 mb-[5px] font-bold"},wo=ge({__name:"index",setup(e){const c=qt(),s=Gt(),g=Jt(),p=N(!1),m=N(!1),$=[{label:Te("apps.baseSettings.detailIcon"),value:Re.info},{label:Te("apps.baseSettings.smallIcon"),value:Re.icon}],w=[{label:"px",value:"px"},{label:"%",value:"%"}];qe(s.panelConfig,()=>{m.value||(m.value=!0,setTimeout(()=>{s.recordState(),m.value=!1,z()},1e3))});function k({file:r,event:a}){const l=JSON.parse((a==null?void 0:a.target).response);return s.panelConfig.backgroundImageSrc=l.data.imageUrl,r}function z(){Zt({panel:s.panelConfig}).then(r=>{r.code===0?g.success(Te("apps.baseSettings.configSaved")):g.error(Te("apps.baseSettings.configFailed",{message:r.msg}))})}function T(){s.resetPanelConfig(),z()}return(r,a)=>(Q(),ee("div",Cn,[u(n(K),{style:{"border-radius":"10px"},size:"small"},{default:C(()=>[_n,d("div",null,[d("div",null,y(r.$t("apps.baseSettings.textContent")),1),d("div",zn,[u(n(Be),{value:n(s).panelConfig.logoText,"onUpdate:value":a[0]||(a[0]=l=>n(s).panelConfig.logoText=l),type:"text","show-count":"",maxlength:20,placeholder:"请输入文字"},null,8,["value"])])])]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",$n,y(r.$t("apps.baseSettings.clock")),1),d("div",Tn,[d("span",Rn,y(r.$t("apps.baseSettings.clockSecondShow")),1),u(n(O),{value:n(s).panelConfig.clockShowSecond,"onUpdate:value":a[1]||(a[1]=l=>n(s).panelConfig.clockShowSecond=l)},null,8,["value"])])]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",Bn,y(r.$t("apps.baseSettings.searchBar")),1),d("div",Pn,[d("span",Vn,y(r.$t("common.show")),1),u(n(O),{value:n(s).panelConfig.searchBoxShow,"onUpdate:value":a[2]||(a[2]=l=>n(s).panelConfig.searchBoxShow=l)},null,8,["value"])]),n(s).panelConfig.searchBoxShow?(Q(),ee("div",Mn,[d("span",Nn,y(r.$t("apps.baseSettings.searchBarSearchItem")),1),u(n(O),{value:n(s).panelConfig.searchBoxSearchIcon,"onUpdate:value":a[3]||(a[3]=l=>n(s).panelConfig.searchBoxSearchIcon=l)},null,8,["value"])])):ie("",!0)]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",In,y(r.$t("apps.baseSettings.systemMonitorStatus")),1),d("div",Un,[d("span",Dn,y(r.$t("common.show")),1),u(n(O),{value:n(s).panelConfig.systemMonitorShow,"onUpdate:value":a[4]||(a[4]=l=>n(s).panelConfig.systemMonitorShow=l)},null,8,["value"])]),n(s).panelConfig.systemMonitorShow?(Q(),ee("div",Fn,[d("span",jn,y(r.$t("apps.baseSettings.showTitle")),1),u(n(O),{value:n(s).panelConfig.systemMonitorShowTitle,"onUpdate:value":a[5]||(a[5]=l=>n(s).panelConfig.systemMonitorShowTitle=l)},null,8,["value"])])):ie("",!0),n(s).panelConfig.systemMonitorShow?(Q(),ee("div",Hn,[d("span",On,y(r.$t("apps.baseSettings.publicVisitModeShow")),1),u(n(O),{value:n(s).panelConfig.systemMonitorPublicVisitModeShow,"onUpdate:value":a[6]||(a[6]=l=>n(s).panelConfig.systemMonitorPublicVisitModeShow=l)},null,8,["value"])])):ie("",!0)]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",An,y(r.$t("common.icon")),1),d("div",En,[d("div",null,y(r.$t("common.style")),1),d("div",Wn,[u(n(ot),{value:n(s).panelConfig.iconStyle,"onUpdate:value":a[7]||(a[7]=l=>n(s).panelConfig.iconStyle=l),options:$},null,8,["value"])])]),n(s).panelConfig.iconStyle===n(Re).info?(Q(),ee("div",Kn,[d("div",null,y(r.$t("apps.baseSettings.hideDescription")),1),d("div",Ln,[u(n(O),{value:n(s).panelConfig.iconTextInfoHideDescription,"onUpdate:value":a[8]||(a[8]=l=>n(s).panelConfig.iconTextInfoHideDescription=l)},null,8,["value"])])])):ie("",!0),n(s).panelConfig.iconStyle===n(Re).icon?(Q(),ee("div",Xn,[d("div",null,y(r.$t("apps.baseSettings.hideTitle")),1),d("div",Yn,[u(n(O),{value:n(s).panelConfig.iconTextIconHideTitle,"onUpdate:value":a[9]||(a[9]=l=>n(s).panelConfig.iconTextIconHideTitle=l)},null,8,["value"])])])):ie("",!0),d("div",qn,[d("div",null,y(r.$t("common.textColor")),1),d("div",Gn,[u(n(rn),{value:n(s).panelConfig.iconTextColor,"onUpdate:value":a[10]||(a[10]=l=>n(s).panelConfig.iconTextColor=l),"show-alpha":!1,size:"small",modes:["hex"],swatches:["#000000","#ffffff","#18A058","#2080F0","#F0A020"]},null,8,["value"])])])]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",Jn,y(r.$t("apps.baseSettings.wallpaper")),1),u(n(dn),{action:"/api/file/uploadImg","show-file-list":!1,name:"imgfile",headers:{token:n(c).token},"directory-dnd":!0,onFinish:k},{default:C(()=>[u(n(cn),{style:{width:"100%"}},{default:C(()=>[d("div",{class:"h-[200px] w-full border bg-slate-100 flex justify-center items-center cursor-pointer rounded-[10px]",style:Qt({background:`url(${n(s).panelConfig.backgroundImageSrc}) no-repeat`,backgroundSize:"cover"})},[d("div",Zn,y(r.$t("apps.baseSettings.uploadOrDragText")),1)],4)]),_:1})]),_:1},8,["headers"]),d("div",Qn,[d("span",eo,y(r.$t("apps.baseSettings.customImageAddress")),1),u(n(O),{value:p.value,"onUpdate:value":a[11]||(a[11]=l=>p.value=l)},null,8,["value"])]),p.value?(Q(),ee("div",to,[u(n(Be),{value:n(s).panelConfig.backgroundImageSrc,"onUpdate:value":a[12]||(a[12]=l=>n(s).panelConfig.backgroundImageSrc=l),type:"text",size:"small",clearable:""},null,8,["value"])])):ie("",!0),d("div",no,[d("span",oo,y(r.$t("apps.baseSettings.vague")),1),u(n(pe),{value:n(s).panelConfig.backgroundBlur,"onUpdate:value":a[13]||(a[13]=l=>n(s).panelConfig.backgroundBlur=l),class:"max-w-[200px]",step:2,max:20},null,8,["value"])]),d("div",ao,[d("span",so,y(r.$t("apps.baseSettings.mask")),1),u(n(pe),{value:n(s).panelConfig.backgroundMaskNumber,"onUpdate:value":a[14]||(a[14]=l=>n(s).panelConfig.backgroundMaskNumber=l),class:"max-w-[200px]",step:.1,max:1},null,8,["value","step"])])]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",io,y(r.$t("apps.baseSettings.contentArea")),1),u(n(hn),{cols:"2"},{default:C(()=>[u(n(ve),{span:"12 400:12"},{default:C(()=>[d("div",lo,[d("span",ro,y(r.$t("apps.baseSettings.netModeChangeButtonShow")),1),u(n(O),{value:n(s).panelConfig.netModeChangeButtonShow,"onUpdate:value":a[15]||(a[15]=l=>n(s).panelConfig.netModeChangeButtonShow=l)},null,8,["value"])])]),_:1}),u(n(ve),{span:"12 400:12"},{default:C(()=>[d("div",co,[d("span",uo,y(r.$t("apps.baseSettings.maxWidth")),1),d("div",ho,[u(n(un),null,{default:C(()=>[u(n(Be),{value:n(s).panelConfig.maxWidth,"onUpdate:value":a[16]||(a[16]=l=>n(s).panelConfig.maxWidth=l),size:"small",type:"number",maxlength:10,style:{width:"100px"},placeholder:"1200"},null,8,["value"]),u(n(ot),{value:n(s).panelConfig.maxWidthUnit,"onUpdate:value":a[17]||(a[17]=l=>n(s).panelConfig.maxWidthUnit=l),style:{width:"80px"},options:w,size:"small"},null,8,["value"])]),_:1})])])]),_:1}),u(n(ve),{span:"12 400:12"},{default:C(()=>[d("div",fo,[d("span",vo,y(r.$t("apps.baseSettings.leftRightMargin")),1),u(n(pe),{value:n(s).panelConfig.marginX,"onUpdate:value":a[18]||(a[18]=l=>n(s).panelConfig.marginX=l),class:"max-w-[200px]",step:1,max:100},null,8,["value"])])]),_:1}),u(n(ve),{span:"12 400:12"},{default:C(()=>[d("div",po,[d("span",mo,y(r.$t("apps.baseSettings.topMargin"))+" (%)",1),u(n(pe),{value:n(s).panelConfig.marginTop,"onUpdate:value":a[19]||(a[19]=l=>n(s).panelConfig.marginTop=l),class:"max-w-[200px]",step:1,max:50},null,8,["value"])])]),_:1}),u(n(ve),{span:"12 400:6"},{default:C(()=>[d("div",go,[d("span",bo,y(r.$t("apps.baseSettings.bottomMargin"))+" (%)",1),u(n(pe),{value:n(s).panelConfig.marginBottom,"onUpdate:value":a[20]||(a[20]=l=>n(s).panelConfig.marginBottom=l),class:"max-w-[200px]",step:1,max:50},null,8,["value"])])]),_:1})]),_:1})]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[d("div",xo,y(r.$t("apps.baseSettings.customFooter")),1),u(n(Be),{value:n(s).panelConfig.footerHtml,"onUpdate:value":a[21]||(a[21]=l=>n(s).panelConfig.footerHtml=l),type:"textarea",clearable:""},null,8,["value"])]),_:1}),u(n(K),{style:{"border-radius":"10px"},class:"mt-[10px]",size:"small"},{default:C(()=>[u(n(gn),{onPositiveClick:T},{trigger:C(()=>[u(n(Me),{size:"small",quaternary:"",type:"error"},{default:C(()=>[Xe(y(r.$t("common.reset")),1)]),_:1})]),default:C(()=>[Xe(" "+y(r.$t("apps.baseSettings.resetWarnText")),1)]),_:1}),u(n(Me),{size:"small",quaternary:"",type:"success",class:"ml-[10px]",onClick:z},{default:C(()=>[Xe(y(r.$t("common.save")),1)]),_:1})]),_:1})]))}});const $o=fn(wo,[["__scopeId","data-v-da662465"]]);export{$o as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b1580adf.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b1580adf.js deleted file mode 100644 index d096f799d..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b1580adf.js +++ /dev/null @@ -1,549 +0,0 @@ -import{f as te,g as r,t as an,m as F,H as Be,q as Xe,z as Ke,cP as on,y as R,w as Pt,R as wt,L as ie,B as ct,bT as Gn,ab as Z,r as N,a6 as zt,as as Zn,aM as ln,n as G,K as j,aj as at,cQ as Jn,E as tt,af as sn,A as ce,F as Mt,ao as ot,S as Ee,c0 as Qn,s as Yn,P as Ut,p as ye,a5 as er,ak as tr,ax as nr,aw as bt,ac as it,aB as dn,b as rr,c as st,e as Ot,aH as nt,ah as ar,bJ as un,ae as qe,cR as or,bh as ir,V as lr,a4 as _t,aI as sr,J as dr,ad as et,v as ur,x as cr,cS as fr,ag as hr,T as vr,be as lt,bn as cn,bo as oe,aW as fn,a_ as mr,a$ as Le,b3 as hn,b4 as we,b2 as be,b0 as Rt,b1 as kt,bi as gr,bl as pr,bw as br,a as yr,D as xr,aX as Cr}from"./index-7e19b821.js";import{y as wr,z as Rr,n as Bt,A as kr,B as Sr,g as Fr,_ as Pr}from"./index-b1d3d9b0.js";import{c as vn,g as zr,i as Mr,h as St,m as At,N as rt,b as mn,C as Br,V as Tr,j as $r,d as Ur,a as dt,f as Lt}from"./index-2b595d91.js";import{N as gn,p as Et,b as pn,u as Qe,d as Or,f as Me,l as Nt,i as Kt,S as _r}from"./index-c238f14b.js";import{m as Ar,r as Lr,b as Er,c as Tt,n as bn,o as yn,C as Nr}from"./index-bc9666b7.js";import{N as Kr}from"./Alert-018ca7af.js";import"./_plugin-vue_export-helper-c27b6911.js";function It(e){switch(e){case"tiny":return"mini";case"small":return"tiny";case"medium":return"small";case"large":return"medium";case"huge":return"large"}throw Error(`${e} has no smaller size.`)}const Ir=te({name:"ArrowDown",render(){return r("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},r("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},r("g",{"fill-rule":"nonzero"},r("path",{d:"M23.7916,15.2664 C24.0788,14.9679 24.0696,14.4931 23.7711,14.206 C23.4726,13.9188 22.9978,13.928 22.7106,14.2265 L14.7511,22.5007 L14.7511,3.74792 C14.7511,3.33371 14.4153,2.99792 14.0011,2.99792 C13.5869,2.99792 13.2511,3.33371 13.2511,3.74793 L13.2511,22.4998 L5.29259,14.2265 C5.00543,13.928 4.53064,13.9188 4.23213,14.206 C3.93361,14.4931 3.9244,14.9679 4.21157,15.2664 L13.2809,24.6944 C13.6743,25.1034 14.3289,25.1034 14.7223,24.6944 L23.7916,15.2664 Z"}))))}}),Vt=te({name:"Backward",render(){return r("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},r("path",{d:"M12.2674 15.793C11.9675 16.0787 11.4927 16.0672 11.2071 15.7673L6.20572 10.5168C5.9298 10.2271 5.9298 9.7719 6.20572 9.48223L11.2071 4.23177C11.4927 3.93184 11.9675 3.92031 12.2674 4.206C12.5673 4.49169 12.5789 4.96642 12.2932 5.26634L7.78458 9.99952L12.2932 14.7327C12.5789 15.0326 12.5673 15.5074 12.2674 15.793Z",fill:"currentColor"}))}}),Dt=te({name:"FastBackward",render(){return r("svg",{viewBox:"0 0 20 20",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},r("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},r("g",{fill:"currentColor","fill-rule":"nonzero"},r("path",{d:"M8.73171,16.7949 C9.03264,17.0795 9.50733,17.0663 9.79196,16.7654 C10.0766,16.4644 10.0634,15.9897 9.76243,15.7051 L4.52339,10.75 L17.2471,10.75 C17.6613,10.75 17.9971,10.4142 17.9971,10 C17.9971,9.58579 17.6613,9.25 17.2471,9.25 L4.52112,9.25 L9.76243,4.29275 C10.0634,4.00812 10.0766,3.53343 9.79196,3.2325 C9.50733,2.93156 9.03264,2.91834 8.73171,3.20297 L2.31449,9.27241 C2.14819,9.4297 2.04819,9.62981 2.01448,9.8386 C2.00308,9.89058 1.99707,9.94459 1.99707,10 C1.99707,10.0576 2.00356,10.1137 2.01585,10.1675 C2.05084,10.3733 2.15039,10.5702 2.31449,10.7254 L8.73171,16.7949 Z"}))))}}),jt=te({name:"FastForward",render(){return r("svg",{viewBox:"0 0 20 20",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},r("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},r("g",{fill:"currentColor","fill-rule":"nonzero"},r("path",{d:"M11.2654,3.20511 C10.9644,2.92049 10.4897,2.93371 10.2051,3.23464 C9.92049,3.53558 9.93371,4.01027 10.2346,4.29489 L15.4737,9.25 L2.75,9.25 C2.33579,9.25 2,9.58579 2,10.0000012 C2,10.4142 2.33579,10.75 2.75,10.75 L15.476,10.75 L10.2346,15.7073 C9.93371,15.9919 9.92049,16.4666 10.2051,16.7675 C10.4897,17.0684 10.9644,17.0817 11.2654,16.797 L17.6826,10.7276 C17.8489,10.5703 17.9489,10.3702 17.9826,10.1614 C17.994,10.1094 18,10.0554 18,10.0000012 C18,9.94241 17.9935,9.88633 17.9812,9.83246 C17.9462,9.62667 17.8467,9.42976 17.6826,9.27455 L11.2654,3.20511 Z"}))))}}),Vr=te({name:"Filter",render(){return r("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},r("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},r("g",{"fill-rule":"nonzero"},r("path",{d:"M17,19 C17.5522847,19 18,19.4477153 18,20 C18,20.5522847 17.5522847,21 17,21 L11,21 C10.4477153,21 10,20.5522847 10,20 C10,19.4477153 10.4477153,19 11,19 L17,19 Z M21,13 C21.5522847,13 22,13.4477153 22,14 C22,14.5522847 21.5522847,15 21,15 L7,15 C6.44771525,15 6,14.5522847 6,14 C6,13.4477153 6.44771525,13 7,13 L21,13 Z M24,7 C24.5522847,7 25,7.44771525 25,8 C25,8.55228475 24.5522847,9 24,9 L4,9 C3.44771525,9 3,8.55228475 3,8 C3,7.44771525 3.44771525,7 4,7 L24,7 Z"}))))}}),Ht=te({name:"Forward",render(){return r("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},r("path",{d:"M7.73271 4.20694C8.03263 3.92125 8.50737 3.93279 8.79306 4.23271L13.7944 9.48318C14.0703 9.77285 14.0703 10.2281 13.7944 10.5178L8.79306 15.7682C8.50737 16.0681 8.03263 16.0797 7.73271 15.794C7.43279 15.5083 7.42125 15.0336 7.70694 14.7336L12.2155 10.0005L7.70694 5.26729C7.42125 4.96737 7.43279 4.49264 7.73271 4.20694Z",fill:"currentColor"}))}}),Wt=te({name:"More",render(){return r("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},r("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},r("g",{fill:"currentColor","fill-rule":"nonzero"},r("path",{d:"M4,7 C4.55228,7 5,7.44772 5,8 C5,8.55229 4.55228,9 4,9 C3.44772,9 3,8.55229 3,8 C3,7.44772 3.44772,7 4,7 Z M8,7 C8.55229,7 9,7.44772 9,8 C9,8.55229 8.55229,9 8,9 C7.44772,9 7,8.55229 7,8 C7,7.44772 7.44772,7 8,7 Z M12,7 C12.5523,7 13,7.44772 13,8 C13,8.55229 12.5523,9 12,9 C11.4477,9 11,8.55229 11,8 C11,7.44772 11.4477,7 12,7 Z"}))))}}),xn=an("n-popselect"),Dr=F("popselect-menu",` - box-shadow: var(--n-menu-box-shadow); -`),$t={multiple:Boolean,value:{type:[String,Number,Array],default:null},cancelable:Boolean,options:{type:Array,default:()=>[]},size:{type:String,default:"medium"},scrollable:Boolean,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onMouseenter:Function,onMouseleave:Function,renderLabel:Function,showCheckmark:{type:Boolean,default:void 0},nodeProps:Function,virtualScroll:Boolean,onChange:[Function,Array]},qt=Gn($t),jr=te({name:"PopselectPanel",props:$t,setup(e){const n=Be(xn),{mergedClsPrefixRef:t,inlineThemeDisabled:a}=Xe(e),o=Ke("Popselect","-pop-select",Dr,on,n.props,t),i=R(()=>vn(e.options,zr("value","children")));function g(c,s){const{onUpdateValue:d,"onUpdate:value":f,onChange:b}=e;d&&Z(d,c,s),f&&Z(f,c,s),b&&Z(b,c,s)}function v(c){u(c.key)}function l(c){St(c,"action")||c.preventDefault()}function u(c){const{value:{getNode:s}}=i;if(e.multiple)if(Array.isArray(e.value)){const d=[],f=[];let b=!0;e.value.forEach(P=>{if(P===c){b=!1;return}const y=s(P);y&&(d.push(y.key),f.push(y.rawNode))}),b&&(d.push(c),f.push(s(c).rawNode)),g(d,f)}else{const d=s(c);d&&g([c],[d.rawNode])}else if(e.value===c&&e.cancelable)g(null,null);else{const d=s(c);d&&g(c,d.rawNode);const{"onUpdate:show":f,onUpdateShow:b}=n.props;f&&Z(f,!1),b&&Z(b,!1),n.setShow(!1)}wt(()=>{n.syncPosition()})}Pt(ie(e,"options"),()=>{wt(()=>{n.syncPosition()})});const x=R(()=>{const{self:{menuBoxShadow:c}}=o.value;return{"--n-menu-box-shadow":c}}),m=a?ct("select",void 0,x,n.props):void 0;return{mergedTheme:n.mergedThemeRef,mergedClsPrefix:t,treeMate:i,handleToggle:v,handleMenuMousedown:l,cssVars:a?void 0:x,themeClass:m==null?void 0:m.themeClass,onRender:m==null?void 0:m.onRender}},render(){var e;return(e=this.onRender)===null||e===void 0||e.call(this),r(Mr,{clsPrefix:this.mergedClsPrefix,focusable:!0,nodeProps:this.nodeProps,class:[`${this.mergedClsPrefix}-popselect-menu`,this.themeClass],style:this.cssVars,theme:this.mergedTheme.peers.InternalSelectMenu,themeOverrides:this.mergedTheme.peerOverrides.InternalSelectMenu,multiple:this.multiple,treeMate:this.treeMate,size:this.size,value:this.value,virtualScroll:this.virtualScroll,scrollable:this.scrollable,renderLabel:this.renderLabel,onToggle:this.handleToggle,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseenter,onMousedown:this.handleMenuMousedown,showCheckmark:this.showCheckmark},{header:()=>{var n,t;return((t=(n=this.$slots).header)===null||t===void 0?void 0:t.call(n))||[]},action:()=>{var n,t;return((t=(n=this.$slots).action)===null||t===void 0?void 0:t.call(n))||[]},empty:()=>{var n,t;return((t=(n=this.$slots).empty)===null||t===void 0?void 0:t.call(n))||[]}})}}),Hr=Object.assign(Object.assign(Object.assign(Object.assign({},Ke.props),ln(Et,["showArrow","arrow"])),{placement:Object.assign(Object.assign({},Et.placement),{default:"bottom"}),trigger:{type:String,default:"hover"}}),$t),Wr=te({name:"Popselect",props:Hr,inheritAttrs:!1,__popover__:!0,setup(e){const{mergedClsPrefixRef:n}=Xe(e),t=Ke("Popselect","-popselect",void 0,on,e,n),a=N(null);function o(){var v;(v=a.value)===null||v===void 0||v.syncPosition()}function i(v){var l;(l=a.value)===null||l===void 0||l.setShow(v)}return zt(xn,{props:e,mergedThemeRef:t,syncPosition:o,setShow:i}),Object.assign(Object.assign({},{syncPosition:o,setShow:i}),{popoverInstRef:a,mergedTheme:t})},render(){const{mergedTheme:e}=this,n={theme:e.peers.Popover,themeOverrides:e.peerOverrides.Popover,builtinThemeOverrides:{padding:"0"},ref:"popoverInstRef",internalRenderBody:(t,a,o,i,g)=>{const{$attrs:v}=this;return r(jr,Object.assign({},v,{class:[v.class,t],style:[v.style,...o]},Zn(this.$props,qt),{ref:Ar(a),onMouseenter:At([i,v.onMouseenter]),onMouseleave:At([g,v.onMouseleave])}),{header:()=>{var l,u;return(u=(l=this.$slots).header)===null||u===void 0?void 0:u.call(l)},action:()=>{var l,u;return(u=(l=this.$slots).action)===null||u===void 0?void 0:u.call(l)},empty:()=>{var l,u;return(u=(l=this.$slots).empty)===null||u===void 0?void 0:u.call(l)}})}};return r(gn,Object.assign({},ln(this.$props,qt),n,{internalDeactivateImmediately:!0}),{trigger:()=>{var t,a;return(a=(t=this.$slots).default)===null||a===void 0?void 0:a.call(t)}})}});function qr(e,n,t){let a=!1,o=!1,i=1,g=n;if(n===1)return{hasFastBackward:!1,hasFastForward:!1,fastForwardTo:g,fastBackwardTo:i,items:[{type:"page",label:1,active:e===1,mayBeFastBackward:!1,mayBeFastForward:!1}]};if(n===2)return{hasFastBackward:!1,hasFastForward:!1,fastForwardTo:g,fastBackwardTo:i,items:[{type:"page",label:1,active:e===1,mayBeFastBackward:!1,mayBeFastForward:!1},{type:"page",label:2,active:e===2,mayBeFastBackward:!0,mayBeFastForward:!1}]};const v=1,l=n;let u=e,x=e;const m=(t-5)/2;x+=Math.ceil(m),x=Math.min(Math.max(x,v+t-3),l-2),u-=Math.floor(m),u=Math.max(Math.min(u,l-t+3),v+2);let c=!1,s=!1;u>v+2&&(c=!0),x=v+1&&d.push({type:"page",label:v+1,mayBeFastBackward:!0,mayBeFastForward:!1,active:e===v+1});for(let f=u;f<=x;++f)d.push({type:"page",label:f,mayBeFastBackward:!1,mayBeFastForward:!1,active:e===f});return s?(o=!0,g=x+1,d.push({type:"fast-forward",active:!1,label:void 0,options:Xt(x+1,l-1)})):x===l-2&&d[d.length-1].label!==l-1&&d.push({type:"page",mayBeFastForward:!0,mayBeFastBackward:!1,label:l-1,active:e===l-1}),d[d.length-1].label!==l&&d.push({type:"page",mayBeFastForward:!1,mayBeFastBackward:!1,label:l,active:e===l}),{hasFastBackward:a,hasFastForward:o,fastBackwardTo:i,fastForwardTo:g,items:d}}function Xt(e,n){const t=[];for(let a=e;a<=n;++a)t.push({label:`${a}`,value:a});return t}const Gt=` - background: var(--n-item-color-hover); - color: var(--n-item-text-color-hover); - border: var(--n-item-border-hover); -`,Zt=[j("button",` - background: var(--n-button-color-hover); - border: var(--n-button-border-hover); - color: var(--n-button-icon-color-hover); - `)],Xr=F("pagination",` - display: flex; - vertical-align: middle; - font-size: var(--n-item-font-size); - flex-wrap: nowrap; -`,[F("pagination-prefix",` - display: flex; - align-items: center; - margin: var(--n-prefix-margin); - `),F("pagination-suffix",` - display: flex; - align-items: center; - margin: var(--n-suffix-margin); - `),G("> *:not(:first-child)",` - margin: var(--n-item-margin); - `),F("select",` - width: var(--n-select-width); - `),G("&.transition-disabled",[F("pagination-item","transition: none!important;")]),F("pagination-quick-jumper",` - white-space: nowrap; - display: flex; - color: var(--n-jumper-text-color); - transition: color .3s var(--n-bezier); - align-items: center; - font-size: var(--n-jumper-font-size); - `,[F("input",` - margin: var(--n-input-margin); - width: var(--n-input-width); - `)]),F("pagination-item",` - position: relative; - cursor: pointer; - user-select: none; - -webkit-user-select: none; - display: flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - min-width: var(--n-item-size); - height: var(--n-item-size); - padding: var(--n-item-padding); - background-color: var(--n-item-color); - color: var(--n-item-text-color); - border-radius: var(--n-item-border-radius); - border: var(--n-item-border); - fill: var(--n-button-icon-color); - transition: - color .3s var(--n-bezier), - border-color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - fill .3s var(--n-bezier); - `,[j("button",` - background: var(--n-button-color); - color: var(--n-button-icon-color); - border: var(--n-button-border); - padding: 0; - `,[F("base-icon",` - font-size: var(--n-button-icon-size); - `)]),at("disabled",[j("hover",Gt,Zt),G("&:hover",Gt,Zt),G("&:active",` - background: var(--n-item-color-pressed); - color: var(--n-item-text-color-pressed); - border: var(--n-item-border-pressed); - `,[j("button",` - background: var(--n-button-color-pressed); - border: var(--n-button-border-pressed); - color: var(--n-button-icon-color-pressed); - `)]),j("active",` - background: var(--n-item-color-active); - color: var(--n-item-text-color-active); - border: var(--n-item-border-active); - `,[G("&:hover",` - background: var(--n-item-color-active-hover); - `)])]),j("disabled",` - cursor: not-allowed; - color: var(--n-item-text-color-disabled); - `,[j("active, button",` - background-color: var(--n-item-color-disabled); - border: var(--n-item-border-disabled); - `)])]),j("disabled",` - cursor: not-allowed; - `,[F("pagination-quick-jumper",` - color: var(--n-jumper-text-color-disabled); - `)]),j("simple",` - display: flex; - align-items: center; - flex-wrap: nowrap; - `,[F("pagination-quick-jumper",[F("input",` - margin: 0; - `)])])]),Gr=Object.assign(Object.assign({},Ke.props),{simple:Boolean,page:Number,defaultPage:{type:Number,default:1},itemCount:Number,pageCount:Number,defaultPageCount:{type:Number,default:1},showSizePicker:Boolean,pageSize:Number,defaultPageSize:Number,pageSizes:{type:Array,default(){return[10]}},showQuickJumper:Boolean,size:{type:String,default:"medium"},disabled:Boolean,pageSlot:{type:Number,default:9},selectProps:Object,prev:Function,next:Function,goto:Function,prefix:Function,suffix:Function,label:Function,displayOrder:{type:Array,default:["pages","size-picker","quick-jumper"]},to:Or.propTo,"onUpdate:page":[Function,Array],onUpdatePage:[Function,Array],"onUpdate:pageSize":[Function,Array],onUpdatePageSize:[Function,Array],onPageSizeChange:[Function,Array],onChange:[Function,Array]}),Zr=te({name:"Pagination",props:Gr,setup(e){const{mergedComponentPropsRef:n,mergedClsPrefixRef:t,inlineThemeDisabled:a,mergedRtlRef:o}=Xe(e),i=Ke("Pagination","-pagination",Xr,Jn,e,t),{localeRef:g}=pn("Pagination"),v=N(null),l=N(e.defaultPage),x=N((()=>{const{defaultPageSize:p}=e;if(p!==void 0)return p;const E=e.pageSizes[0];return typeof E=="number"?E:E.value||10})()),m=Qe(ie(e,"page"),l),c=Qe(ie(e,"pageSize"),x),s=R(()=>{const{itemCount:p}=e;if(p!==void 0)return Math.max(1,Math.ceil(p/c.value));const{pageCount:E}=e;return E!==void 0?Math.max(E,1):1}),d=N("");tt(()=>{e.simple,d.value=String(m.value)});const f=N(!1),b=N(!1),P=N(!1),y=N(!1),C=()=>{e.disabled||(f.value=!0,X())},K=()=>{e.disabled||(f.value=!1,X())},k=()=>{b.value=!0,X()},z=()=>{b.value=!1,X()},_=p=>{Q(p)},T=R(()=>qr(m.value,s.value,e.pageSlot));tt(()=>{T.value.hasFastBackward?T.value.hasFastForward||(f.value=!1,P.value=!1):(b.value=!1,y.value=!1)});const S=R(()=>{const p=g.value.selectionSuffix;return e.pageSizes.map(E=>typeof E=="number"?{label:`${E} / ${p}`,value:E}:E)}),M=R(()=>{var p,E;return((E=(p=n==null?void 0:n.value)===null||p===void 0?void 0:p.Pagination)===null||E===void 0?void 0:E.inputSize)||It(e.size)}),H=R(()=>{var p,E;return((E=(p=n==null?void 0:n.value)===null||p===void 0?void 0:p.Pagination)===null||E===void 0?void 0:E.selectSize)||It(e.size)}),I=R(()=>(m.value-1)*c.value),V=R(()=>{const p=m.value*c.value-1,{itemCount:E}=e;return E!==void 0&&p>E-1?E-1:p}),D=R(()=>{const{itemCount:p}=e;return p!==void 0?p:(e.pageCount||1)*c.value}),W=sn("Pagination",o,t),X=()=>{wt(()=>{var p;const{value:E}=v;E&&(E.classList.add("transition-disabled"),(p=v.value)===null||p===void 0||p.offsetWidth,E.classList.remove("transition-disabled"))})};function Q(p){if(p===m.value)return;const{"onUpdate:page":E,onUpdatePage:me,onChange:A,simple:ee}=e;E&&Z(E,p),me&&Z(me,p),A&&Z(A,p),l.value=p,ee&&(d.value=String(p))}function ae(p){if(p===c.value)return;const{"onUpdate:pageSize":E,onUpdatePageSize:me,onPageSizeChange:A}=e;E&&Z(E,p),me&&Z(me,p),A&&Z(A,p),x.value=p,s.value{m.value,c.value,X()});const de=R(()=>{const{size:p}=e,{self:{buttonBorder:E,buttonBorderHover:me,buttonBorderPressed:A,buttonIconColor:ee,buttonIconColorHover:Fe,buttonIconColorPressed:ge,itemTextColor:ve,itemTextColorHover:De,itemTextColorPressed:je,itemTextColorActive:Re,itemTextColorDisabled:ke,itemColor:Ne,itemColorHover:Ie,itemColorPressed:He,itemColorActive:Ge,itemColorActiveHover:$e,itemColorDisabled:fe,itemBorder:Ue,itemBorderHover:Oe,itemBorderPressed:B,itemBorderActive:L,itemBorderDisabled:re,itemBorderRadius:w,jumperTextColor:Y,jumperTextColorDisabled:se,buttonColor:_e,buttonColorHover:xe,buttonColorPressed:Se,[ce("itemPadding",p)]:Ae,[ce("itemMargin",p)]:Ye,[ce("inputWidth",p)]:Ve,[ce("selectWidth",p)]:Ze,[ce("inputMargin",p)]:We,[ce("selectMargin",p)]:Pe,[ce("jumperFontSize",p)]:Je,[ce("prefixMargin",p)]:pe,[ce("suffixMargin",p)]:Ce,[ce("itemSize",p)]:ft,[ce("buttonIconSize",p)]:ht,[ce("itemFontSize",p)]:vt,[`${ce("itemMargin",p)}Rtl`]:mt,[`${ce("inputMargin",p)}Rtl`]:gt},common:{cubicBezierEaseInOut:pt}}=i.value;return{"--n-prefix-margin":pe,"--n-suffix-margin":Ce,"--n-item-font-size":vt,"--n-select-width":Ze,"--n-select-margin":Pe,"--n-input-width":Ve,"--n-input-margin":We,"--n-input-margin-rtl":gt,"--n-item-size":ft,"--n-item-text-color":ve,"--n-item-text-color-disabled":ke,"--n-item-text-color-hover":De,"--n-item-text-color-active":Re,"--n-item-text-color-pressed":je,"--n-item-color":Ne,"--n-item-color-hover":Ie,"--n-item-color-disabled":fe,"--n-item-color-active":Ge,"--n-item-color-active-hover":$e,"--n-item-color-pressed":He,"--n-item-border":Ue,"--n-item-border-hover":Oe,"--n-item-border-disabled":re,"--n-item-border-active":L,"--n-item-border-pressed":B,"--n-item-padding":Ae,"--n-item-border-radius":w,"--n-bezier":pt,"--n-jumper-font-size":Je,"--n-jumper-text-color":Y,"--n-jumper-text-color-disabled":se,"--n-item-margin":Ye,"--n-item-margin-rtl":mt,"--n-button-icon-size":ht,"--n-button-icon-color":ee,"--n-button-icon-color-hover":Fe,"--n-button-icon-color-pressed":ge,"--n-button-color-hover":xe,"--n-button-color":_e,"--n-button-color-pressed":Se,"--n-button-border":E,"--n-button-border-hover":me,"--n-button-border-pressed":A}}),ne=a?ct("pagination",R(()=>{let p="";const{size:E}=e;return p+=E[0],p}),de,e):void 0;return{rtlEnabled:W,mergedClsPrefix:t,locale:g,selfRef:v,mergedPage:m,pageItems:R(()=>T.value.items),mergedItemCount:D,jumperValue:d,pageSizeOptions:S,mergedPageSize:c,inputSize:M,selectSize:H,mergedTheme:i,mergedPageCount:s,startIndex:I,endIndex:V,showFastForwardMenu:P,showFastBackwardMenu:y,fastForwardActive:f,fastBackwardActive:b,handleMenuSelect:_,handleFastForwardMouseenter:C,handleFastForwardMouseleave:K,handleFastBackwardMouseenter:k,handleFastBackwardMouseleave:z,handleJumperInput:le,handleBackwardClick:h,handleForwardClick:ue,handlePageItemClick:he,handleSizePickerChange:$,handleQuickJumperChange:J,cssVars:a?void 0:de,themeClass:ne==null?void 0:ne.themeClass,onRender:ne==null?void 0:ne.onRender}},render(){const{$slots:e,mergedClsPrefix:n,disabled:t,cssVars:a,mergedPage:o,mergedPageCount:i,pageItems:g,showSizePicker:v,showQuickJumper:l,mergedTheme:u,locale:x,inputSize:m,selectSize:c,mergedPageSize:s,pageSizeOptions:d,jumperValue:f,simple:b,prev:P,next:y,prefix:C,suffix:K,label:k,goto:z,handleJumperInput:_,handleSizePickerChange:T,handleBackwardClick:S,handlePageItemClick:M,handleForwardClick:H,handleQuickJumperChange:I,onRender:V}=this;V==null||V();const D=e.prefix||C,W=e.suffix||K,X=P||e.prev,Q=y||e.next,ae=k||e.label;return r("div",{ref:"selfRef",class:[`${n}-pagination`,this.themeClass,this.rtlEnabled&&`${n}-pagination--rtl`,t&&`${n}-pagination--disabled`,b&&`${n}-pagination--simple`],style:a},D?r("div",{class:`${n}-pagination-prefix`},D({page:o,pageSize:s,pageCount:i,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount})):null,this.displayOrder.map(ue=>{switch(ue){case"pages":return r(ot,null,r("div",{class:[`${n}-pagination-item`,!X&&`${n}-pagination-item--button`,(o<=1||o>i||t)&&`${n}-pagination-item--disabled`],onClick:S},X?X({page:o,pageSize:s,pageCount:i,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount}):r(Ee,{clsPrefix:n},{default:()=>this.rtlEnabled?r(Ht,null):r(Vt,null)})),b?r(ot,null,r("div",{class:`${n}-pagination-quick-jumper`},r(rt,{value:f,onUpdateValue:_,size:m,placeholder:"",disabled:t,theme:u.peers.Input,themeOverrides:u.peerOverrides.Input,onChange:I}))," / ",i):g.map((h,U)=>{let O,$,q;const{type:J}=h;switch(J){case"page":const le=h.label;ae?O=ae({type:"page",node:le,active:h.active}):O=le;break;case"fast-forward":const de=this.fastForwardActive?r(Ee,{clsPrefix:n},{default:()=>this.rtlEnabled?r(Dt,null):r(jt,null)}):r(Ee,{clsPrefix:n},{default:()=>r(Wt,null)});ae?O=ae({type:"fast-forward",node:de,active:this.fastForwardActive||this.showFastForwardMenu}):O=de,$=this.handleFastForwardMouseenter,q=this.handleFastForwardMouseleave;break;case"fast-backward":const ne=this.fastBackwardActive?r(Ee,{clsPrefix:n},{default:()=>this.rtlEnabled?r(jt,null):r(Dt,null)}):r(Ee,{clsPrefix:n},{default:()=>r(Wt,null)});ae?O=ae({type:"fast-backward",node:ne,active:this.fastBackwardActive||this.showFastBackwardMenu}):O=ne,$=this.handleFastBackwardMouseenter,q=this.handleFastBackwardMouseleave;break}const he=r("div",{key:U,class:[`${n}-pagination-item`,h.active&&`${n}-pagination-item--active`,J!=="page"&&(J==="fast-backward"&&this.showFastBackwardMenu||J==="fast-forward"&&this.showFastForwardMenu)&&`${n}-pagination-item--hover`,t&&`${n}-pagination-item--disabled`,J==="page"&&`${n}-pagination-item--clickable`],onClick:()=>{M(h)},onMouseenter:$,onMouseleave:q},O);if(J==="page"&&!h.mayBeFastBackward&&!h.mayBeFastForward)return he;{const le=h.type==="page"?h.mayBeFastBackward?"fast-backward":"fast-forward":h.type;return r(Wr,{to:this.to,key:le,disabled:t,trigger:"hover",virtualScroll:!0,style:{width:"60px"},theme:u.peers.Popselect,themeOverrides:u.peerOverrides.Popselect,builtinThemeOverrides:{peers:{InternalSelectMenu:{height:"calc(var(--n-option-height) * 4.6)"}}},nodeProps:()=>({style:{justifyContent:"center"}}),show:J==="page"?!1:J==="fast-backward"?this.showFastBackwardMenu:this.showFastForwardMenu,onUpdateShow:de=>{J!=="page"&&(de?J==="fast-backward"?this.showFastBackwardMenu=de:this.showFastForwardMenu=de:(this.showFastBackwardMenu=!1,this.showFastForwardMenu=!1))},options:h.type!=="page"?h.options:[],onUpdateValue:this.handleMenuSelect,scrollable:!0,showCheckmark:!1},{default:()=>he})}}),r("div",{class:[`${n}-pagination-item`,!Q&&`${n}-pagination-item--button`,{[`${n}-pagination-item--disabled`]:o<1||o>=i||t}],onClick:H},Q?Q({page:o,pageSize:s,pageCount:i,itemCount:this.mergedItemCount,startIndex:this.startIndex,endIndex:this.endIndex}):r(Ee,{clsPrefix:n},{default:()=>this.rtlEnabled?r(Vt,null):r(Ht,null)})));case"size-picker":return!b&&v?r(mn,Object.assign({consistentMenuWidth:!1,placeholder:"",showCheckmark:!1,to:this.to},this.selectProps,{size:c,options:d,value:s,disabled:t,theme:u.peers.Select,themeOverrides:u.peerOverrides.Select,onUpdateValue:T})):null;case"quick-jumper":return!b&&l?r("div",{class:`${n}-pagination-quick-jumper`},z?z():Mt(this.$slots.goto,()=>[x.goto]),r(rt,{value:f,onUpdateValue:_,size:m,placeholder:"",disabled:t,theme:u.peers.Input,themeOverrides:u.peerOverrides.Input,onChange:I})):null;default:return null}}),W?r("div",{class:`${n}-pagination-suffix`},W({page:o,pageSize:s,pageCount:i,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount})):null)}}),Jr=te({name:"PerformantEllipsis",props:wr,inheritAttrs:!1,setup(e,{attrs:n,slots:t}){const a=N(!1),o=Qn();return Yn("-ellipsis",Rr,o),{mouseEntered:a,renderTrigger:()=>{const{lineClamp:g}=e,v=o.value;return r("span",Object.assign({},Ut(n,{class:[`${v}-ellipsis`,g!==void 0?kr(v):void 0,e.expandTrigger==="click"?Sr(v,"pointer"):void 0],style:g===void 0?{textOverflow:"ellipsis"}:{"-webkit-line-clamp":g}}),{onMouseenter:()=>{a.value=!0}}),g?t:r("span",null,t))}}},render(){return this.mouseEntered?r(Bt,Ut({},this.$attrs,this.$props),this.$slots):this.renderTrigger()}}),Qr=te({name:"DataTableRenderSorter",props:{render:{type:Function,required:!0},order:{type:[String,Boolean],default:!1}},render(){const{render:e,order:n}=this;return e({order:n})}}),Yr=Object.assign(Object.assign({},Ke.props),{onUnstableColumnResize:Function,pagination:{type:[Object,Boolean],default:!1},paginateSinglePage:{type:Boolean,default:!0},minHeight:[Number,String],maxHeight:[Number,String],columns:{type:Array,default:()=>[]},rowClassName:[String,Function],rowProps:Function,rowKey:Function,summary:[Function],data:{type:Array,default:()=>[]},loading:Boolean,bordered:{type:Boolean,default:void 0},bottomBordered:{type:Boolean,default:void 0},striped:Boolean,scrollX:[Number,String],defaultCheckedRowKeys:{type:Array,default:()=>[]},checkedRowKeys:Array,singleLine:{type:Boolean,default:!0},singleColumn:Boolean,size:{type:String,default:"medium"},remote:Boolean,defaultExpandedRowKeys:{type:Array,default:[]},defaultExpandAll:Boolean,expandedRowKeys:Array,stickyExpandedRows:Boolean,virtualScroll:Boolean,tableLayout:{type:String,default:"auto"},allowCheckingNotLoaded:Boolean,cascade:{type:Boolean,default:!0},childrenKey:{type:String,default:"children"},indent:{type:Number,default:16},flexHeight:Boolean,summaryPlacement:{type:String,default:"bottom"},paginationBehaviorOnFilter:{type:String,default:"current"},scrollbarProps:Object,renderCell:Function,renderExpandIcon:Function,spinProps:{type:Object,default:{}},onLoad:Function,"onUpdate:page":[Function,Array],onUpdatePage:[Function,Array],"onUpdate:pageSize":[Function,Array],onUpdatePageSize:[Function,Array],"onUpdate:sorter":[Function,Array],onUpdateSorter:[Function,Array],"onUpdate:filters":[Function,Array],onUpdateFilters:[Function,Array],"onUpdate:checkedRowKeys":[Function,Array],onUpdateCheckedRowKeys:[Function,Array],"onUpdate:expandedRowKeys":[Function,Array],onUpdateExpandedRowKeys:[Function,Array],onScroll:Function,onPageChange:[Function,Array],onPageSizeChange:[Function,Array],onSorterChange:[Function,Array],onFiltersChange:[Function,Array],onCheckedRowKeysChange:[Function,Array]}),Te=an("n-data-table"),ea=te({name:"SortIcon",props:{column:{type:Object,required:!0}},setup(e){const{mergedComponentPropsRef:n}=Xe(),{mergedSortStateRef:t,mergedClsPrefixRef:a}=Be(Te),o=R(()=>t.value.find(l=>l.columnKey===e.column.key)),i=R(()=>o.value!==void 0),g=R(()=>{const{value:l}=o;return l&&i.value?l.order:!1}),v=R(()=>{var l,u;return((u=(l=n==null?void 0:n.value)===null||l===void 0?void 0:l.DataTable)===null||u===void 0?void 0:u.renderSorter)||e.column.renderSorter});return{mergedClsPrefix:a,active:i,mergedSortOrder:g,mergedRenderSorter:v}},render(){const{mergedRenderSorter:e,mergedSortOrder:n,mergedClsPrefix:t}=this,{renderSorterIcon:a}=this.column;return e?r(Qr,{render:e,order:n}):r("span",{class:[`${t}-data-table-sorter`,n==="ascend"&&`${t}-data-table-sorter--asc`,n==="descend"&&`${t}-data-table-sorter--desc`]},a?a({order:n}):r(Ee,{clsPrefix:t},{default:()=>r(Ir,null)}))}}),ta=te({name:"DataTableRenderFilter",props:{render:{type:Function,required:!0},active:{type:Boolean,default:!1},show:{type:Boolean,default:!1}},render(){const{render:e,active:n,show:t}=this;return e({active:n,show:t})}}),na=F("radio-group",` - display: inline-block; - font-size: var(--n-font-size); -`,[ye("splitor",` - display: inline-block; - vertical-align: bottom; - width: 1px; - transition: - background-color .3s var(--n-bezier), - opacity .3s var(--n-bezier); - background: var(--n-button-border-color); - `,[j("checked",{backgroundColor:"var(--n-button-border-color-active)"}),j("disabled",{opacity:"var(--n-opacity-disabled)"})]),j("button-group",` - white-space: nowrap; - height: var(--n-height); - line-height: var(--n-height); - `,[F("radio-button",{height:"var(--n-height)",lineHeight:"var(--n-height)"}),ye("splitor",{height:"var(--n-height)"})]),F("radio-button",` - vertical-align: bottom; - outline: none; - position: relative; - user-select: none; - -webkit-user-select: none; - display: inline-block; - box-sizing: border-box; - padding-left: 14px; - padding-right: 14px; - white-space: nowrap; - transition: - background-color .3s var(--n-bezier), - opacity .3s var(--n-bezier), - border-color .3s var(--n-bezier), - color .3s var(--n-bezier); - background: var(--n-button-color); - color: var(--n-button-text-color); - border-top: 1px solid var(--n-button-border-color); - border-bottom: 1px solid var(--n-button-border-color); - `,[F("radio-input",` - pointer-events: none; - position: absolute; - border: 0; - border-radius: inherit; - left: 0; - right: 0; - top: 0; - bottom: 0; - opacity: 0; - z-index: 1; - `),ye("state-border",` - z-index: 1; - pointer-events: none; - position: absolute; - box-shadow: var(--n-button-box-shadow); - transition: box-shadow .3s var(--n-bezier); - left: -1px; - bottom: -1px; - right: -1px; - top: -1px; - `),G("&:first-child",` - border-top-left-radius: var(--n-button-border-radius); - border-bottom-left-radius: var(--n-button-border-radius); - border-left: 1px solid var(--n-button-border-color); - `,[ye("state-border",` - border-top-left-radius: var(--n-button-border-radius); - border-bottom-left-radius: var(--n-button-border-radius); - `)]),G("&:last-child",` - border-top-right-radius: var(--n-button-border-radius); - border-bottom-right-radius: var(--n-button-border-radius); - border-right: 1px solid var(--n-button-border-color); - `,[ye("state-border",` - border-top-right-radius: var(--n-button-border-radius); - border-bottom-right-radius: var(--n-button-border-radius); - `)]),at("disabled",` - cursor: pointer; - `,[G("&:hover",[ye("state-border",` - transition: box-shadow .3s var(--n-bezier); - box-shadow: var(--n-button-box-shadow-hover); - `),at("checked",{color:"var(--n-button-text-color-hover)"})]),j("focus",[G("&:not(:active)",[ye("state-border",{boxShadow:"var(--n-button-box-shadow-focus)"})])])]),j("checked",` - background: var(--n-button-color-active); - color: var(--n-button-text-color-active); - border-color: var(--n-button-border-color-active); - `),j("disabled",` - cursor: not-allowed; - opacity: var(--n-opacity-disabled); - `)])]);function ra(e,n,t){var a;const o=[];let i=!1;for(let g=0;g{const{value:k}=t,{common:{cubicBezierEaseInOut:z},self:{buttonBorderColor:_,buttonBorderColorActive:T,buttonBorderRadius:S,buttonBoxShadow:M,buttonBoxShadowFocus:H,buttonBoxShadowHover:I,buttonColor:V,buttonColorActive:D,buttonTextColor:W,buttonTextColorActive:X,buttonTextColorHover:Q,opacityDisabled:ae,[ce("buttonHeight",k)]:ue,[ce("fontSize",k)]:h}}=m.value;return{"--n-font-size":h,"--n-bezier":z,"--n-button-border-color":_,"--n-button-border-color-active":T,"--n-button-border-radius":S,"--n-button-box-shadow":M,"--n-button-box-shadow-focus":H,"--n-button-box-shadow-hover":I,"--n-button-color":V,"--n-button-color-active":D,"--n-button-text-color":W,"--n-button-text-color-hover":Q,"--n-button-text-color-active":X,"--n-height":ue,"--n-opacity-disabled":ae}}),K=u?ct("radio-group",R(()=>t.value[0]),C,e):void 0;return{selfElRef:n,rtlEnabled:y,mergedClsPrefix:l,mergedValue:d,handleFocusout:P,handleFocusin:b,cssVars:u?void 0:C,themeClass:K==null?void 0:K.themeClass,onRender:K==null?void 0:K.onRender}},render(){var e;const{mergedValue:n,mergedClsPrefix:t,handleFocusin:a,handleFocusout:o}=this,{children:i,isButtonGroup:g}=ra(nr(Fr(this)),n,t);return(e=this.onRender)===null||e===void 0||e.call(this),r("div",{onFocusin:a,onFocusout:o,ref:"selfElRef",class:[`${t}-radio-group`,this.rtlEnabled&&`${t}-radio-group--rtl`,this.themeClass,g&&`${t}-radio-group--button-group`],style:this.cssVars},i)}}),Cn=40,wn=40;function Jt(e){if(e.type==="selection")return e.width===void 0?Cn:bt(e.width);if(e.type==="expand")return e.width===void 0?wn:bt(e.width);if(!("children"in e))return typeof e.width=="string"?bt(e.width):e.width}function ia(e){var n,t;if(e.type==="selection")return Me((n=e.width)!==null&&n!==void 0?n:Cn);if(e.type==="expand")return Me((t=e.width)!==null&&t!==void 0?t:wn);if(!("children"in e))return Me(e.width)}function ze(e){return e.type==="selection"?"__n_selection__":e.type==="expand"?"__n_expand__":e.key}function Qt(e){return e&&(typeof e=="object"?Object.assign({},e):e)}function la(e){return e==="ascend"?1:e==="descend"?-1:0}function sa(e,n,t){return t!==void 0&&(e=Math.min(e,typeof t=="number"?t:parseFloat(t))),n!==void 0&&(e=Math.max(e,typeof n=="number"?n:parseFloat(n))),e}function da(e,n){if(n!==void 0)return{width:n,minWidth:n,maxWidth:n};const t=ia(e),{minWidth:a,maxWidth:o}=e;return{width:t,minWidth:Me(a)||t,maxWidth:Me(o)}}function ua(e,n,t){return typeof t=="function"?t(e,n):t||""}function yt(e){return e.filterOptionValues!==void 0||e.filterOptionValue===void 0&&e.defaultFilterOptionValues!==void 0}function xt(e){return"children"in e?!1:!!e.sorter}function Rn(e){return"children"in e&&e.children.length?!1:!!e.resizable}function Yt(e){return"children"in e?!1:!!e.filter&&(!!e.filterOptions||!!e.renderFilterMenu)}function en(e){if(e){if(e==="descend")return"ascend"}else return"descend";return!1}function ca(e,n){return e.sorter===void 0?null:n===null||n.columnKey!==e.key?{columnKey:e.key,sorter:e.sorter,order:en(!1)}:Object.assign(Object.assign({},n),{order:en(n.order)})}function kn(e,n){return n.find(t=>t.columnKey===e.key&&t.order)!==void 0}const fa=te({name:"DataTableFilterMenu",props:{column:{type:Object,required:!0},radioGroupName:{type:String,required:!0},multiple:{type:Boolean,required:!0},value:{type:[Array,String,Number],default:null},options:{type:Array,required:!0},onConfirm:{type:Function,required:!0},onClear:{type:Function,required:!0},onChange:{type:Function,required:!0}},setup(e){const{mergedClsPrefixRef:n,mergedThemeRef:t,localeRef:a}=Be(Te),o=N(e.value),i=R(()=>{const{value:m}=o;return Array.isArray(m)?m:null}),g=R(()=>{const{value:m}=o;return yt(e.column)?Array.isArray(m)&&m.length&&m[0]||null:Array.isArray(m)?null:m});function v(m){e.onChange(m)}function l(m){e.multiple&&Array.isArray(m)?o.value=m:yt(e.column)&&!Array.isArray(m)?o.value=[m]:o.value=m}function u(){v(o.value),e.onConfirm()}function x(){e.multiple||yt(e.column)?v([]):v(null),e.onClear()}return{mergedClsPrefix:n,mergedTheme:t,locale:a,checkboxGroupValue:i,radioGroupValue:g,handleChange:l,handleConfirmClick:u,handleClearClick:x}},render(){const{mergedTheme:e,locale:n,mergedClsPrefix:t}=this;return r("div",{class:`${t}-data-table-filter-menu`},r(dn,null,{default:()=>{const{checkboxGroupValue:a,handleChange:o}=this;return this.multiple?r(Er,{value:a,class:`${t}-data-table-filter-menu__group`,onUpdateValue:o},{default:()=>this.options.map(i=>r(Tt,{key:i.value,theme:e.peers.Checkbox,themeOverrides:e.peerOverrides.Checkbox,value:i.value},{default:()=>i.label}))}):r(oa,{name:this.radioGroupName,class:`${t}-data-table-filter-menu__group`,value:this.radioGroupValue,onUpdateValue:this.handleChange},{default:()=>this.options.map(i=>r(bn,{key:i.value,value:i.value,theme:e.peers.Radio,themeOverrides:e.peerOverrides.Radio},{default:()=>i.label}))})}}),r("div",{class:`${t}-data-table-filter-menu__action`},r(it,{size:"tiny",theme:e.peers.Button,themeOverrides:e.peerOverrides.Button,onClick:this.handleClearClick},{default:()=>n.clear}),r(it,{theme:e.peers.Button,themeOverrides:e.peerOverrides.Button,type:"primary",size:"tiny",onClick:this.handleConfirmClick},{default:()=>n.confirm})))}});function ha(e,n,t){const a=Object.assign({},e);return a[n]=t,a}const va=te({name:"DataTableFilterButton",props:{column:{type:Object,required:!0},options:{type:Array,default:()=>[]}},setup(e){const{mergedComponentPropsRef:n}=Xe(),{mergedThemeRef:t,mergedClsPrefixRef:a,mergedFilterStateRef:o,filterMenuCssVarsRef:i,paginationBehaviorOnFilterRef:g,doUpdatePage:v,doUpdateFilters:l}=Be(Te),u=N(!1),x=o,m=R(()=>e.column.filterMultiple!==!1),c=R(()=>{const y=x.value[e.column.key];if(y===void 0){const{value:C}=m;return C?[]:null}return y}),s=R(()=>{const{value:y}=c;return Array.isArray(y)?y.length>0:y!==null}),d=R(()=>{var y,C;return((C=(y=n==null?void 0:n.value)===null||y===void 0?void 0:y.DataTable)===null||C===void 0?void 0:C.renderFilter)||e.column.renderFilter});function f(y){const C=ha(x.value,e.column.key,y);l(C,e.column),g.value==="first"&&v(1)}function b(){u.value=!1}function P(){u.value=!1}return{mergedTheme:t,mergedClsPrefix:a,active:s,showPopover:u,mergedRenderFilter:d,filterMultiple:m,mergedFilterValue:c,filterMenuCssVars:i,handleFilterChange:f,handleFilterMenuConfirm:P,handleFilterMenuCancel:b}},render(){const{mergedTheme:e,mergedClsPrefix:n,handleFilterMenuCancel:t}=this;return r(gn,{show:this.showPopover,onUpdateShow:a=>this.showPopover=a,trigger:"click",theme:e.peers.Popover,themeOverrides:e.peerOverrides.Popover,placement:"bottom",style:{padding:0}},{trigger:()=>{const{mergedRenderFilter:a}=this;if(a)return r(ta,{"data-data-table-filter":!0,render:a,active:this.active,show:this.showPopover});const{renderFilterIcon:o}=this.column;return r("div",{"data-data-table-filter":!0,class:[`${n}-data-table-filter`,{[`${n}-data-table-filter--active`]:this.active,[`${n}-data-table-filter--show`]:this.showPopover}]},o?o({active:this.active,show:this.showPopover}):r(Ee,{clsPrefix:n},{default:()=>r(Vr,null)}))},default:()=>{const{renderFilterMenu:a}=this.column;return a?a({hide:t}):r(fa,{style:this.filterMenuCssVars,radioGroupName:String(this.column.key),multiple:this.filterMultiple,value:this.mergedFilterValue,options:this.options,column:this.column,onChange:this.handleFilterChange,onClear:this.handleFilterMenuCancel,onConfirm:this.handleFilterMenuConfirm})}})}}),ma=te({name:"ColumnResizeButton",props:{onResizeStart:Function,onResize:Function,onResizeEnd:Function},setup(e){const{mergedClsPrefixRef:n}=Be(Te),t=N(!1);let a=0;function o(l){return l.clientX}function i(l){var u;l.preventDefault();const x=t.value;a=o(l),t.value=!0,x||(Ot("mousemove",window,g),Ot("mouseup",window,v),(u=e.onResizeStart)===null||u===void 0||u.call(e))}function g(l){var u;(u=e.onResize)===null||u===void 0||u.call(e,o(l)-a)}function v(){var l;t.value=!1,(l=e.onResizeEnd)===null||l===void 0||l.call(e),st("mousemove",window,g),st("mouseup",window,v)}return rr(()=>{st("mousemove",window,g),st("mouseup",window,v)}),{mergedClsPrefix:n,active:t,handleMousedown:i}},render(){const{mergedClsPrefix:e}=this;return r("span",{"data-data-table-resizable":!0,class:[`${e}-data-table-resize-button`,this.active&&`${e}-data-table-resize-button--active`],onMousedown:this.handleMousedown})}}),Sn="_n_all__",Fn="_n_none__";function ga(e,n,t,a){return e?o=>{for(const i of e)switch(o){case Sn:t(!0);return;case Fn:a(!0);return;default:if(typeof i=="object"&&i.key===o){i.onSelect(n.value);return}}}:()=>{}}function pa(e,n){return e?e.map(t=>{switch(t){case"all":return{label:n.checkTableAll,key:Sn};case"none":return{label:n.uncheckTableAll,key:Fn};default:return t}}):[]}const ba=te({name:"DataTableSelectionMenu",props:{clsPrefix:{type:String,required:!0}},setup(e){const{props:n,localeRef:t,checkOptionsRef:a,rawPaginatedDataRef:o,doCheckAll:i,doUncheckAll:g}=Be(Te),v=R(()=>ga(a.value,o,i,g)),l=R(()=>pa(a.value,t.value));return()=>{var u,x,m,c;const{clsPrefix:s}=e;return r(yn,{theme:(x=(u=n.theme)===null||u===void 0?void 0:u.peers)===null||x===void 0?void 0:x.Dropdown,themeOverrides:(c=(m=n.themeOverrides)===null||m===void 0?void 0:m.peers)===null||c===void 0?void 0:c.Dropdown,options:l.value,onSelect:v.value},{default:()=>r(Ee,{clsPrefix:s,class:`${s}-data-table-check-extra`},{default:()=>r(Br,null)})})}}});function Ct(e){return typeof e.title=="function"?e.title(e):e.title}const Pn=te({name:"DataTableHeader",props:{discrete:{type:Boolean,default:!0}},setup(){const{mergedClsPrefixRef:e,scrollXRef:n,fixedColumnLeftMapRef:t,fixedColumnRightMapRef:a,mergedCurrentPageRef:o,allRowsCheckedRef:i,someRowsCheckedRef:g,rowsRef:v,colsRef:l,mergedThemeRef:u,checkOptionsRef:x,mergedSortStateRef:m,componentId:c,mergedTableLayoutRef:s,headerCheckboxDisabledRef:d,onUnstableColumnResize:f,doUpdateResizableWidth:b,handleTableHeaderScroll:P,deriveNextSorter:y,doUncheckAll:C,doCheckAll:K}=Be(Te),k=N({});function z(I){const V=k.value[I];return V==null?void 0:V.getBoundingClientRect().width}function _(){i.value?C():K()}function T(I,V){if(St(I,"dataTableFilter")||St(I,"dataTableResizable")||!xt(V))return;const D=m.value.find(X=>X.columnKey===V.key)||null,W=ca(V,D);y(W)}const S=new Map;function M(I){S.set(I.key,z(I.key))}function H(I,V){const D=S.get(I.key);if(D===void 0)return;const W=D+V,X=sa(W,I.minWidth,I.maxWidth);f(W,X,I,z),b(I,X)}return{cellElsRef:k,componentId:c,mergedSortState:m,mergedClsPrefix:e,scrollX:n,fixedColumnLeftMap:t,fixedColumnRightMap:a,currentPage:o,allRowsChecked:i,someRowsChecked:g,rows:v,cols:l,mergedTheme:u,checkOptions:x,mergedTableLayout:s,headerCheckboxDisabled:d,handleCheckboxUpdateChecked:_,handleColHeaderClick:T,handleTableHeaderScroll:P,handleColumnResizeStart:M,handleColumnResize:H}},render(){const{cellElsRef:e,mergedClsPrefix:n,fixedColumnLeftMap:t,fixedColumnRightMap:a,currentPage:o,allRowsChecked:i,someRowsChecked:g,rows:v,cols:l,mergedTheme:u,checkOptions:x,componentId:m,discrete:c,mergedTableLayout:s,headerCheckboxDisabled:d,mergedSortState:f,handleColHeaderClick:b,handleCheckboxUpdateChecked:P,handleColumnResizeStart:y,handleColumnResize:C}=this,K=r("thead",{class:`${n}-data-table-thead`,"data-n-id":m},v.map(_=>r("tr",{class:`${n}-data-table-tr`},_.map(({column:T,colSpan:S,rowSpan:M,isLast:H})=>{var I,V;const D=ze(T),{ellipsis:W}=T,X=()=>T.type==="selection"?T.multiple!==!1?r(ot,null,r(Tt,{key:o,privateInsideTable:!0,checked:i,indeterminate:g,disabled:d,onUpdateChecked:P}),x?r(ba,{clsPrefix:n}):null):null:r(ot,null,r("div",{class:`${n}-data-table-th__title-wrapper`},r("div",{class:`${n}-data-table-th__title`},W===!0||W&&!W.tooltip?r("div",{class:`${n}-data-table-th__ellipsis`},Ct(T)):W&&typeof W=="object"?r(Bt,Object.assign({},W,{theme:u.peers.Ellipsis,themeOverrides:u.peerOverrides.Ellipsis}),{default:()=>Ct(T)}):Ct(T)),xt(T)?r(ea,{column:T}):null),Yt(T)?r(va,{column:T,options:T.filterOptions}):null,Rn(T)?r(ma,{onResizeStart:()=>{y(T)},onResize:ue=>{C(T,ue)}}):null),Q=D in t,ae=D in a;return r("th",{ref:ue=>e[D]=ue,key:D,style:{textAlign:T.titleAlign||T.align,left:nt((I=t[D])===null||I===void 0?void 0:I.start),right:nt((V=a[D])===null||V===void 0?void 0:V.start)},colspan:S,rowspan:M,"data-col-key":D,class:[`${n}-data-table-th`,(Q||ae)&&`${n}-data-table-th--fixed-${Q?"left":"right"}`,{[`${n}-data-table-th--hover`]:kn(T,f),[`${n}-data-table-th--filterable`]:Yt(T),[`${n}-data-table-th--sortable`]:xt(T),[`${n}-data-table-th--selection`]:T.type==="selection",[`${n}-data-table-th--last`]:H},T.className],onClick:T.type!=="selection"&&T.type!=="expand"&&!("children"in T)?ue=>{b(ue,T)}:void 0},X())}))));if(!c)return K;const{handleTableHeaderScroll:k,scrollX:z}=this;return r("div",{class:`${n}-data-table-base-table-header`,onScroll:k},r("table",{ref:"body",class:`${n}-data-table-table`,style:{minWidth:Me(z),tableLayout:s}},r("colgroup",null,l.map(_=>r("col",{key:_.key,style:_.style}))),K))}}),ya=te({name:"DataTableCell",props:{clsPrefix:{type:String,required:!0},row:{type:Object,required:!0},index:{type:Number,required:!0},column:{type:Object,required:!0},isSummary:Boolean,mergedTheme:{type:Object,required:!0},renderCell:Function},render(){const{isSummary:e,column:n,row:t,renderCell:a}=this;let o;const{render:i,key:g,ellipsis:v}=n;if(i&&!e?o=i(t,this.index):e?o=t[g].value:o=a?a(Nt(t,g),t,n):Nt(t,g),v)if(typeof v=="object"){const{mergedTheme:l}=this;return n.ellipsisComponent==="performant-ellipsis"?r(Jr,Object.assign({},v,{theme:l.peers.Ellipsis,themeOverrides:l.peerOverrides.Ellipsis}),{default:()=>o}):r(Bt,Object.assign({},v,{theme:l.peers.Ellipsis,themeOverrides:l.peerOverrides.Ellipsis}),{default:()=>o})}else return r("span",{class:`${this.clsPrefix}-data-table-td__ellipsis`},o);return o}}),tn=te({name:"DataTableExpandTrigger",props:{clsPrefix:{type:String,required:!0},expanded:Boolean,loading:Boolean,onClick:{type:Function,required:!0},renderExpandIcon:{type:Function}},render(){const{clsPrefix:e}=this;return r("div",{class:[`${e}-data-table-expand-trigger`,this.expanded&&`${e}-data-table-expand-trigger--expanded`],onClick:this.onClick,onMousedown:n=>{n.preventDefault()}},r(ar,null,{default:()=>this.loading?r(un,{key:"loading",clsPrefix:this.clsPrefix,radius:85,strokeWidth:15,scale:.88}):this.renderExpandIcon?this.renderExpandIcon({expanded:this.expanded}):r(Ee,{clsPrefix:e,key:"base-icon"},{default:()=>r(Nr,null)})}))}}),xa=te({name:"DataTableBodyCheckbox",props:{rowKey:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!0},onUpdateChecked:{type:Function,required:!0}},setup(e){const{mergedCheckedRowKeySetRef:n,mergedInderminateRowKeySetRef:t}=Be(Te);return()=>{const{rowKey:a}=e;return r(Tt,{privateInsideTable:!0,disabled:e.disabled,indeterminate:t.value.has(a),checked:n.value.has(a),onUpdateChecked:e.onUpdateChecked})}}}),Ca=te({name:"DataTableBodyRadio",props:{rowKey:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!0},onUpdateChecked:{type:Function,required:!0}},setup(e){const{mergedCheckedRowKeySetRef:n,componentId:t}=Be(Te);return()=>{const{rowKey:a}=e;return r(bn,{name:t,disabled:e.disabled,checked:n.value.has(a),onUpdateChecked:e.onUpdateChecked})}}});function wa(e,n){const t=[];function a(o,i){o.forEach(g=>{g.children&&n.has(g.key)?(t.push({tmNode:g,striped:!1,key:g.key,index:i}),a(g.children,i)):t.push({key:g.key,tmNode:g,striped:!1,index:i})})}return e.forEach(o=>{t.push(o);const{children:i}=o.tmNode;i&&n.has(o.key)&&a(i,o.index)}),t}const Ra=te({props:{clsPrefix:{type:String,required:!0},id:{type:String,required:!0},cols:{type:Array,required:!0},onMouseenter:Function,onMouseleave:Function},render(){const{clsPrefix:e,id:n,cols:t,onMouseenter:a,onMouseleave:o}=this;return r("table",{style:{tableLayout:"fixed"},class:`${e}-data-table-table`,onMouseenter:a,onMouseleave:o},r("colgroup",null,t.map(i=>r("col",{key:i.key,style:i.style}))),r("tbody",{"data-n-id":n,class:`${e}-data-table-tbody`},this.$slots))}}),ka=te({name:"DataTableBody",props:{onResize:Function,showHeader:Boolean,flexHeight:Boolean,bodyStyle:Object},setup(e){const{slots:n,bodyWidthRef:t,mergedExpandedRowKeysRef:a,mergedClsPrefixRef:o,mergedThemeRef:i,scrollXRef:g,colsRef:v,paginatedDataRef:l,rawPaginatedDataRef:u,fixedColumnLeftMapRef:x,fixedColumnRightMapRef:m,mergedCurrentPageRef:c,rowClassNameRef:s,leftActiveFixedColKeyRef:d,leftActiveFixedChildrenColKeysRef:f,rightActiveFixedColKeyRef:b,rightActiveFixedChildrenColKeysRef:P,renderExpandRef:y,hoverKeyRef:C,summaryRef:K,mergedSortStateRef:k,virtualScrollRef:z,componentId:_,mergedTableLayoutRef:T,childTriggerColIndexRef:S,indentRef:M,rowPropsRef:H,maxHeightRef:I,stripedRef:V,loadingRef:D,onLoadRef:W,loadingKeySetRef:X,expandableRef:Q,stickyExpandedRowsRef:ae,renderExpandIconRef:ue,summaryPlacementRef:h,treeMateRef:U,scrollbarPropsRef:O,setHeaderScrollLeft:$,doUpdateExpandedRowKeys:q,handleTableBodyScroll:J,doCheck:he,doUncheck:le,renderCell:de}=Be(Te),ne=N(null),p=N(null),E=N(null),me=qe(()=>l.value.length===0),A=qe(()=>e.showHeader||!me.value),ee=qe(()=>e.showHeader||me.value);let Fe="";const ge=R(()=>new Set(a.value));function ve(B){var L;return(L=U.value.getNode(B))===null||L===void 0?void 0:L.rawNode}function De(B,L,re){const w=ve(B.key);if(!w){_t("data-table",`fail to get row data with key ${B.key}`);return}if(re){const Y=l.value.findIndex(se=>se.key===Fe);if(Y!==-1){const se=l.value.findIndex(Ae=>Ae.key===B.key),_e=Math.min(Y,se),xe=Math.max(Y,se),Se=[];l.value.slice(_e,xe+1).forEach(Ae=>{Ae.disabled||Se.push(Ae.key)}),L?he(Se,!1,w):le(Se,w),Fe=B.key;return}}L?he(B.key,!1,w):le(B.key,w),Fe=B.key}function je(B){const L=ve(B.key);if(!L){_t("data-table",`fail to get row data with key ${B.key}`);return}he(B.key,!0,L)}function Re(){if(!A.value){const{value:L}=E;return L||null}if(z.value)return Ie();const{value:B}=ne;return B?B.containerRef:null}function ke(B,L){var re;if(X.value.has(B))return;const{value:w}=a,Y=w.indexOf(B),se=Array.from(w);~Y?(se.splice(Y,1),q(se)):L&&!L.isLeaf&&!L.shallowLoaded?(X.value.add(B),(re=W.value)===null||re===void 0||re.call(W,L.rawNode).then(()=>{const{value:_e}=a,xe=Array.from(_e);~xe.indexOf(B)||xe.push(B),q(xe)}).finally(()=>{X.value.delete(B)})):(se.push(B),q(se))}function Ne(){C.value=null}function Ie(){const{value:B}=p;return(B==null?void 0:B.listElRef)||null}function He(){const{value:B}=p;return(B==null?void 0:B.itemsElRef)||null}function Ge(B){var L;J(B),(L=ne.value)===null||L===void 0||L.sync()}function $e(B){var L;const{onResize:re}=e;re&&re(B),(L=ne.value)===null||L===void 0||L.sync()}const fe={getScrollContainer:Re,scrollTo(B,L){var re,w;z.value?(re=p.value)===null||re===void 0||re.scrollTo(B,L):(w=ne.value)===null||w===void 0||w.scrollTo(B,L)}},Ue=G([({props:B})=>{const L=w=>w===null?null:G(`[data-n-id="${B.componentId}"] [data-col-key="${w}"]::after`,{boxShadow:"var(--n-box-shadow-after)"}),re=w=>w===null?null:G(`[data-n-id="${B.componentId}"] [data-col-key="${w}"]::before`,{boxShadow:"var(--n-box-shadow-before)"});return G([L(B.leftActiveFixedColKey),re(B.rightActiveFixedColKey),B.leftActiveFixedChildrenColKeys.map(w=>L(w)),B.rightActiveFixedChildrenColKeys.map(w=>re(w))])}]);let Oe=!1;return tt(()=>{const{value:B}=d,{value:L}=f,{value:re}=b,{value:w}=P;if(!Oe&&B===null&&re===null)return;const Y={leftActiveFixedColKey:B,leftActiveFixedChildrenColKeys:L,rightActiveFixedColKey:re,rightActiveFixedChildrenColKeys:w,componentId:_};Ue.mount({id:`n-${_}`,force:!0,props:Y,anchorMetaName:or}),Oe=!0}),ir(()=>{Ue.unmount({id:`n-${_}`})}),Object.assign({bodyWidth:t,summaryPlacement:h,dataTableSlots:n,componentId:_,scrollbarInstRef:ne,virtualListRef:p,emptyElRef:E,summary:K,mergedClsPrefix:o,mergedTheme:i,scrollX:g,cols:v,loading:D,bodyShowHeaderOnly:ee,shouldDisplaySomeTablePart:A,empty:me,paginatedDataAndInfo:R(()=>{const{value:B}=V;let L=!1;return{data:l.value.map(B?(w,Y)=>(w.isLeaf||(L=!0),{tmNode:w,key:w.key,striped:Y%2===1,index:Y}):(w,Y)=>(w.isLeaf||(L=!0),{tmNode:w,key:w.key,striped:!1,index:Y})),hasChildren:L}}),rawPaginatedData:u,fixedColumnLeftMap:x,fixedColumnRightMap:m,currentPage:c,rowClassName:s,renderExpand:y,mergedExpandedRowKeySet:ge,hoverKey:C,mergedSortState:k,virtualScroll:z,mergedTableLayout:T,childTriggerColIndex:S,indent:M,rowProps:H,maxHeight:I,loadingKeySet:X,expandable:Q,stickyExpandedRows:ae,renderExpandIcon:ue,scrollbarProps:O,setHeaderScrollLeft:$,handleVirtualListScroll:Ge,handleVirtualListResize:$e,handleMouseleaveTable:Ne,virtualListContainer:Ie,virtualListContent:He,handleTableBodyScroll:J,handleCheckboxUpdateChecked:De,handleRadioUpdateChecked:je,handleUpdateExpanded:ke,renderCell:de},fe)},render(){const{mergedTheme:e,scrollX:n,mergedClsPrefix:t,virtualScroll:a,maxHeight:o,mergedTableLayout:i,flexHeight:g,loadingKeySet:v,onResize:l,setHeaderScrollLeft:u}=this,x=n!==void 0||o!==void 0||g,m=!x&&i==="auto",c=n!==void 0||m,s={minWidth:Me(n)||"100%"};n&&(s.width="100%");const d=r(dn,Object.assign({},this.scrollbarProps,{ref:"scrollbarInstRef",scrollable:x||m,class:`${t}-data-table-base-table-body`,style:this.bodyStyle,theme:e.peers.Scrollbar,themeOverrides:e.peerOverrides.Scrollbar,contentStyle:s,container:a?this.virtualListContainer:void 0,content:a?this.virtualListContent:void 0,horizontalRailStyle:{zIndex:3},verticalRailStyle:{zIndex:3},xScrollable:c,onScroll:a?void 0:this.handleTableBodyScroll,internalOnUpdateScrollLeft:u,onResize:l}),{default:()=>{const f={},b={},{cols:P,paginatedDataAndInfo:y,mergedTheme:C,fixedColumnLeftMap:K,fixedColumnRightMap:k,currentPage:z,rowClassName:_,mergedSortState:T,mergedExpandedRowKeySet:S,stickyExpandedRows:M,componentId:H,childTriggerColIndex:I,expandable:V,rowProps:D,handleMouseleaveTable:W,renderExpand:X,summary:Q,handleCheckboxUpdateChecked:ae,handleRadioUpdateChecked:ue,handleUpdateExpanded:h}=this,{length:U}=P;let O;const{data:$,hasChildren:q}=y,J=q?wa($,S):$;if(Q){const A=Q(this.rawPaginatedData);if(Array.isArray(A)){const ee=A.map((Fe,ge)=>({isSummaryRow:!0,key:`__n_summary__${ge}`,tmNode:{rawNode:Fe,disabled:!0},index:-1}));O=this.summaryPlacement==="top"?[...ee,...J]:[...J,...ee]}else{const ee={isSummaryRow:!0,key:"__n_summary__",tmNode:{rawNode:A,disabled:!0},index:-1};O=this.summaryPlacement==="top"?[ee,...J]:[...J,ee]}}else O=J;const he=q?{width:nt(this.indent)}:void 0,le=[];O.forEach(A=>{X&&S.has(A.key)&&(!V||V(A.tmNode.rawNode))?le.push(A,{isExpandedRow:!0,key:`${A.key}-expand`,tmNode:A.tmNode,index:A.index}):le.push(A)});const{length:de}=le,ne={};$.forEach(({tmNode:A},ee)=>{ne[ee]=A.key});const p=M?this.bodyWidth:null,E=p===null?void 0:`${p}px`,me=(A,ee,Fe)=>{const{index:ge}=A;if("isExpandedRow"in A){const{tmNode:{key:$e,rawNode:fe}}=A;return r("tr",{class:`${t}-data-table-tr ${t}-data-table-tr--expanded`,key:`${$e}__expand`},r("td",{class:[`${t}-data-table-td`,`${t}-data-table-td--last-col`,ee+1===de&&`${t}-data-table-td--last-row`],colspan:U},M?r("div",{class:`${t}-data-table-expand`,style:{width:E}},X(fe,ge)):X(fe,ge)))}const ve="isSummaryRow"in A,De=!ve&&A.striped,{tmNode:je,key:Re}=A,{rawNode:ke}=je,Ne=S.has(Re),Ie=D?D(ke,ge):void 0,He=typeof _=="string"?_:ua(ke,ge,_);return r("tr",Object.assign({onMouseenter:()=>{this.hoverKey=Re},key:Re,class:[`${t}-data-table-tr`,ve&&`${t}-data-table-tr--summary`,De&&`${t}-data-table-tr--striped`,Ne&&`${t}-data-table-tr--expanded`,He]},Ie),P.map(($e,fe)=>{var Ue,Oe,B,L,re;if(ee in f){const pe=f[ee],Ce=pe.indexOf(fe);if(~Ce)return pe.splice(Ce,1),null}const{column:w}=$e,Y=ze($e),{rowSpan:se,colSpan:_e}=w,xe=ve?((Ue=A.tmNode.rawNode[Y])===null||Ue===void 0?void 0:Ue.colSpan)||1:_e?_e(ke,ge):1,Se=ve?((Oe=A.tmNode.rawNode[Y])===null||Oe===void 0?void 0:Oe.rowSpan)||1:se?se(ke,ge):1,Ae=fe+xe===U,Ye=ee+Se===de,Ve=Se>1;if(Ve&&(b[ee]={[fe]:[]}),xe>1||Ve)for(let pe=ee;pe{h(Re,A.tmNode)}})]:null,w.type==="selection"?ve?null:w.multiple===!1?r(Ca,{key:z,rowKey:Re,disabled:A.tmNode.disabled,onUpdateChecked:()=>{ue(A.tmNode)}}):r(xa,{key:z,rowKey:Re,disabled:A.tmNode.disabled,onUpdateChecked:(pe,Ce)=>{ae(A.tmNode,pe,Ce.shiftKey)}}):w.type==="expand"?ve?null:!w.expandable||!((re=w.expandable)===null||re===void 0)&&re.call(w,ke)?r(tn,{clsPrefix:t,expanded:Ne,renderExpandIcon:this.renderExpandIcon,onClick:()=>{h(Re,null)}}):null:r(ya,{clsPrefix:t,index:ge,row:ke,column:w,isSummary:ve,mergedTheme:C,renderCell:this.renderCell}))}))};return a?r(Tr,{ref:"virtualListRef",items:le,itemSize:28,visibleItemsTag:Ra,visibleItemsProps:{clsPrefix:t,id:H,cols:P,onMouseleave:W},showScrollbar:!1,onResize:this.handleVirtualListResize,onScroll:this.handleVirtualListScroll,itemsStyle:s,itemResizable:!0},{default:({item:A,index:ee})=>me(A,ee,!0)}):r("table",{class:`${t}-data-table-table`,onMouseleave:W,style:{tableLayout:this.mergedTableLayout}},r("colgroup",null,P.map(A=>r("col",{key:A.key,style:A.style}))),this.showHeader?r(Pn,{discrete:!1}):null,this.empty?null:r("tbody",{"data-n-id":H,class:`${t}-data-table-tbody`},le.map((A,ee)=>me(A,ee,!1))))}});if(this.empty){const f=()=>r("div",{class:[`${t}-data-table-empty`,this.loading&&`${t}-data-table-empty--hide`],style:this.bodyStyle,ref:"emptyElRef"},Mt(this.dataTableSlots.empty,()=>[r($r,{theme:this.mergedTheme.peers.Empty,themeOverrides:this.mergedTheme.peerOverrides.Empty})]));return this.shouldDisplaySomeTablePart?r(ot,null,d,f()):r(lr,{onResize:this.onResize},{default:f})}return d}}),Sa=te({setup(){const{mergedClsPrefixRef:e,rightFixedColumnsRef:n,leftFixedColumnsRef:t,bodyWidthRef:a,maxHeightRef:o,minHeightRef:i,flexHeightRef:g,syncScrollState:v}=Be(Te),l=N(null),u=N(null),x=N(null),m=N(!(t.value.length||n.value.length)),c=R(()=>({maxHeight:Me(o.value),minHeight:Me(i.value)}));function s(P){a.value=P.contentRect.width,v(),m.value||(m.value=!0)}function d(){const{value:P}=l;return P?P.$el:null}function f(){const{value:P}=u;return P?P.getScrollContainer():null}const b={getBodyElement:f,getHeaderElement:d,scrollTo(P,y){var C;(C=u.value)===null||C===void 0||C.scrollTo(P,y)}};return tt(()=>{const{value:P}=x;if(!P)return;const y=`${e.value}-data-table-base-table--transition-disabled`;m.value?setTimeout(()=>{P.classList.remove(y)},0):P.classList.add(y)}),Object.assign({maxHeight:o,mergedClsPrefix:e,selfElRef:x,headerInstRef:l,bodyInstRef:u,bodyStyle:c,flexHeight:g,handleBodyResize:s},b)},render(){const{mergedClsPrefix:e,maxHeight:n,flexHeight:t}=this,a=n===void 0&&!t;return r("div",{class:`${e}-data-table-base-table`,ref:"selfElRef"},a?null:r(Pn,{ref:"headerInstRef"}),r(ka,{ref:"bodyInstRef",bodyStyle:this.bodyStyle,showHeader:a,flexHeight:t,onResize:this.handleBodyResize}))}});function Fa(e,n){const{paginatedDataRef:t,treeMateRef:a,selectionColumnRef:o}=n,i=N(e.defaultCheckedRowKeys),g=R(()=>{var k;const{checkedRowKeys:z}=e,_=z===void 0?i.value:z;return((k=o.value)===null||k===void 0?void 0:k.multiple)===!1?{checkedKeys:_.slice(0,1),indeterminateKeys:[]}:a.value.getCheckedKeys(_,{cascade:e.cascade,allowNotLoaded:e.allowCheckingNotLoaded})}),v=R(()=>g.value.checkedKeys),l=R(()=>g.value.indeterminateKeys),u=R(()=>new Set(v.value)),x=R(()=>new Set(l.value)),m=R(()=>{const{value:k}=u;return t.value.reduce((z,_)=>{const{key:T,disabled:S}=_;return z+(!S&&k.has(T)?1:0)},0)}),c=R(()=>t.value.filter(k=>k.disabled).length),s=R(()=>{const{length:k}=t.value,{value:z}=x;return m.value>0&&m.valuez.has(_.key))}),d=R(()=>{const{length:k}=t.value;return m.value!==0&&m.value===k-c.value}),f=R(()=>t.value.length===0);function b(k,z,_){const{"onUpdate:checkedRowKeys":T,onUpdateCheckedRowKeys:S,onCheckedRowKeysChange:M}=e,H=[],{value:{getNode:I}}=a;k.forEach(V=>{var D;const W=(D=I(V))===null||D===void 0?void 0:D.rawNode;H.push(W)}),T&&Z(T,k,H,{row:z,action:_}),S&&Z(S,k,H,{row:z,action:_}),M&&Z(M,k,H,{row:z,action:_}),i.value=k}function P(k,z=!1,_){if(!e.loading){if(z){b(Array.isArray(k)?k.slice(0,1):[k],_,"check");return}b(a.value.check(k,v.value,{cascade:e.cascade,allowNotLoaded:e.allowCheckingNotLoaded}).checkedKeys,_,"check")}}function y(k,z){e.loading||b(a.value.uncheck(k,v.value,{cascade:e.cascade,allowNotLoaded:e.allowCheckingNotLoaded}).checkedKeys,z,"uncheck")}function C(k=!1){const{value:z}=o;if(!z||e.loading)return;const _=[];(k?a.value.treeNodes:t.value).forEach(T=>{T.disabled||_.push(T.key)}),b(a.value.check(_,v.value,{cascade:!0,allowNotLoaded:e.allowCheckingNotLoaded}).checkedKeys,void 0,"checkAll")}function K(k=!1){const{value:z}=o;if(!z||e.loading)return;const _=[];(k?a.value.treeNodes:t.value).forEach(T=>{T.disabled||_.push(T.key)}),b(a.value.uncheck(_,v.value,{cascade:!0,allowNotLoaded:e.allowCheckingNotLoaded}).checkedKeys,void 0,"uncheckAll")}return{mergedCheckedRowKeySetRef:u,mergedCheckedRowKeysRef:v,mergedInderminateRowKeySetRef:x,someRowsCheckedRef:s,allRowsCheckedRef:d,headerCheckboxDisabledRef:f,doUpdateCheckedRowKeys:b,doCheckAll:C,doUncheckAll:K,doCheck:P,doUncheck:y}}function ut(e){return typeof e=="object"&&typeof e.multiple=="number"?e.multiple:!1}function Pa(e,n){return n&&(e===void 0||e==="default"||typeof e=="object"&&e.compare==="default")?za(n):typeof e=="function"?e:e&&typeof e=="object"&&e.compare&&e.compare!=="default"?e.compare:!1}function za(e){return(n,t)=>{const a=n[e],o=t[e];return typeof a=="number"&&typeof o=="number"?a-o:typeof a=="string"&&typeof o=="string"?a.localeCompare(o):0}}function Ma(e,{dataRelatedColsRef:n,filteredDataRef:t}){const a=[];n.value.forEach(s=>{var d;s.sorter!==void 0&&c(a,{columnKey:s.key,sorter:s.sorter,order:(d=s.defaultSortOrder)!==null&&d!==void 0?d:!1})});const o=N(a),i=R(()=>{const s=n.value.filter(b=>b.type!=="selection"&&b.sorter!==void 0&&(b.sortOrder==="ascend"||b.sortOrder==="descend"||b.sortOrder===!1)),d=s.filter(b=>b.sortOrder!==!1);if(d.length)return d.map(b=>({columnKey:b.key,order:b.sortOrder,sorter:b.sorter}));if(s.length)return[];const{value:f}=o;return Array.isArray(f)?f:f?[f]:[]}),g=R(()=>{const s=i.value.slice().sort((d,f)=>{const b=ut(d.sorter)||0;return(ut(f.sorter)||0)-b});return s.length?t.value.slice().sort((f,b)=>{let P=0;return s.some(y=>{const{columnKey:C,sorter:K,order:k}=y,z=Pa(K,C);return z&&k&&(P=z(f.rawNode,b.rawNode),P!==0)?(P=P*la(k),!0):!1}),P}):t.value});function v(s){let d=i.value.slice();return s&&ut(s.sorter)!==!1?(d=d.filter(f=>ut(f.sorter)!==!1),c(d,s),d):s||null}function l(s){const d=v(s);u(d)}function u(s){const{"onUpdate:sorter":d,onUpdateSorter:f,onSorterChange:b}=e;d&&Z(d,s),f&&Z(f,s),b&&Z(b,s),o.value=s}function x(s,d="ascend"){if(!s)m();else{const f=n.value.find(P=>P.type!=="selection"&&P.type!=="expand"&&P.key===s);if(!(f!=null&&f.sorter))return;const b=f.sorter;l({columnKey:s,sorter:b,order:d})}}function m(){u(null)}function c(s,d){const f=s.findIndex(b=>(d==null?void 0:d.columnKey)&&b.columnKey===d.columnKey);f!==void 0&&f>=0?s[f]=d:s.push(d)}return{clearSorter:m,sort:x,sortedDataRef:g,mergedSortStateRef:i,deriveNextSorter:l}}function Ba(e,{dataRelatedColsRef:n}){const t=R(()=>{const h=U=>{for(let O=0;O{const{childrenKey:h}=e;return vn(e.data,{ignoreEmptyChildren:!0,getKey:e.rowKey,getChildren:U=>U[h],getDisabled:U=>{var O,$;return!!(!(($=(O=t.value)===null||O===void 0?void 0:O.disabled)===null||$===void 0)&&$.call(O,U))}})}),o=qe(()=>{const{columns:h}=e,{length:U}=h;let O=null;for(let $=0;${const h=n.value.filter($=>$.filterOptionValues!==void 0||$.filterOptionValue!==void 0),U={};return h.forEach($=>{var q;$.type==="selection"||$.type==="expand"||($.filterOptionValues===void 0?U[$.key]=(q=$.filterOptionValue)!==null&&q!==void 0?q:null:U[$.key]=$.filterOptionValues)}),Object.assign(Qt(i.value),U)}),u=R(()=>{const h=l.value,{columns:U}=e;function O(J){return(he,le)=>!!~String(le[J]).indexOf(String(he))}const{value:{treeNodes:$}}=a,q=[];return U.forEach(J=>{J.type==="selection"||J.type==="expand"||"children"in J||q.push([J.key,J])}),$?$.filter(J=>{const{rawNode:he}=J;for(const[le,de]of q){let ne=h[le];if(ne==null||(Array.isArray(ne)||(ne=[ne]),!ne.length))continue;const p=de.filter==="default"?O(le):de.filter;if(de&&typeof p=="function")if(de.filterMode==="and"){if(ne.some(E=>!p(E,he)))return!1}else{if(ne.some(E=>p(E,he)))continue;return!1}}return!0}):[]}),{sortedDataRef:x,deriveNextSorter:m,mergedSortStateRef:c,sort:s,clearSorter:d}=Ma(e,{dataRelatedColsRef:n,filteredDataRef:u});n.value.forEach(h=>{var U;if(h.filter){const O=h.defaultFilterOptionValues;h.filterMultiple?i.value[h.key]=O||[]:O!==void 0?i.value[h.key]=O===null?[]:O:i.value[h.key]=(U=h.defaultFilterOptionValue)!==null&&U!==void 0?U:null}});const f=R(()=>{const{pagination:h}=e;if(h!==!1)return h.page}),b=R(()=>{const{pagination:h}=e;if(h!==!1)return h.pageSize}),P=Qe(f,g),y=Qe(b,v),C=qe(()=>{const h=P.value;return e.remote?h:Math.max(1,Math.min(Math.ceil(u.value.length/y.value),h))}),K=R(()=>{const{pagination:h}=e;if(h){const{pageCount:U}=h;if(U!==void 0)return U}}),k=R(()=>{if(e.remote)return a.value.treeNodes;if(!e.pagination)return x.value;const h=y.value,U=(C.value-1)*h;return x.value.slice(U,U+h)}),z=R(()=>k.value.map(h=>h.rawNode));function _(h){const{pagination:U}=e;if(U){const{onChange:O,"onUpdate:page":$,onUpdatePage:q}=U;O&&Z(O,h),q&&Z(q,h),$&&Z($,h),H(h)}}function T(h){const{pagination:U}=e;if(U){const{onPageSizeChange:O,"onUpdate:pageSize":$,onUpdatePageSize:q}=U;O&&Z(O,h),q&&Z(q,h),$&&Z($,h),I(h)}}const S=R(()=>{if(e.remote){const{pagination:h}=e;if(h){const{itemCount:U}=h;if(U!==void 0)return U}return}return u.value.length}),M=R(()=>Object.assign(Object.assign({},e.pagination),{onChange:void 0,onUpdatePage:void 0,onUpdatePageSize:void 0,onPageSizeChange:void 0,"onUpdate:page":_,"onUpdate:pageSize":T,page:C.value,pageSize:y.value,pageCount:S.value===void 0?K.value:void 0,itemCount:S.value}));function H(h){const{"onUpdate:page":U,onPageChange:O,onUpdatePage:$}=e;$&&Z($,h),U&&Z(U,h),O&&Z(O,h),g.value=h}function I(h){const{"onUpdate:pageSize":U,onPageSizeChange:O,onUpdatePageSize:$}=e;O&&Z(O,h),$&&Z($,h),U&&Z(U,h),v.value=h}function V(h,U){const{onUpdateFilters:O,"onUpdate:filters":$,onFiltersChange:q}=e;O&&Z(O,h,U),$&&Z($,h,U),q&&Z(q,h,U),i.value=h}function D(h,U,O,$){var q;(q=e.onUnstableColumnResize)===null||q===void 0||q.call(e,h,U,O,$)}function W(h){H(h)}function X(){Q()}function Q(){ae({})}function ae(h){ue(h)}function ue(h){h?h&&(i.value=Qt(h)):i.value={}}return{treeMateRef:a,mergedCurrentPageRef:C,mergedPaginationRef:M,paginatedDataRef:k,rawPaginatedDataRef:z,mergedFilterStateRef:l,mergedSortStateRef:c,hoverKeyRef:N(null),selectionColumnRef:t,childTriggerColIndexRef:o,doUpdateFilters:V,deriveNextSorter:m,doUpdatePageSize:I,doUpdatePage:H,onUnstableColumnResize:D,filter:ue,filters:ae,clearFilter:X,clearFilters:Q,clearSorter:d,page:W,sort:s}}function Ta(e,{mainTableInstRef:n,mergedCurrentPageRef:t,bodyWidthRef:a}){let o=0;const i=N(),g=N(null),v=N([]),l=N(null),u=N([]),x=R(()=>Me(e.scrollX)),m=R(()=>e.columns.filter(S=>S.fixed==="left")),c=R(()=>e.columns.filter(S=>S.fixed==="right")),s=R(()=>{const S={};let M=0;function H(I){I.forEach(V=>{const D={start:M,end:0};S[ze(V)]=D,"children"in V?(H(V.children),D.end=M):(M+=Jt(V)||0,D.end=M)})}return H(m.value),S}),d=R(()=>{const S={};let M=0;function H(I){for(let V=I.length-1;V>=0;--V){const D=I[V],W={start:M,end:0};S[ze(D)]=W,"children"in D?(H(D.children),W.end=M):(M+=Jt(D)||0,W.end=M)}}return H(c.value),S});function f(){var S,M;const{value:H}=m;let I=0;const{value:V}=s;let D=null;for(let W=0;W(((S=V[X])===null||S===void 0?void 0:S.start)||0)-I)D=X,I=((M=V[X])===null||M===void 0?void 0:M.end)||0;else break}g.value=D}function b(){v.value=[];let S=e.columns.find(M=>ze(M)===g.value);for(;S&&"children"in S;){const M=S.children.length;if(M===0)break;const H=S.children[M-1];v.value.push(ze(H)),S=H}}function P(){var S,M;const{value:H}=c,I=Number(e.scrollX),{value:V}=a;if(V===null)return;let D=0,W=null;const{value:X}=d;for(let Q=H.length-1;Q>=0;--Q){const ae=ze(H[Q]);if(Math.round(o+(((S=X[ae])===null||S===void 0?void 0:S.start)||0)+V-D)ze(M)===l.value);for(;S&&"children"in S&&S.children.length;){const M=S.children[0];u.value.push(ze(M)),S=M}}function C(){const S=n.value?n.value.getHeaderElement():null,M=n.value?n.value.getBodyElement():null;return{header:S,body:M}}function K(){const{body:S}=C();S&&(S.scrollTop=0)}function k(){i.value!=="body"?Kt(_):i.value=void 0}function z(S){var M;(M=e.onScroll)===null||M===void 0||M.call(e,S),i.value!=="head"?Kt(_):i.value=void 0}function _(){const{header:S,body:M}=C();if(!M)return;const{value:H}=a;if(H!==null){if(e.maxHeight||e.flexHeight){if(!S)return;const I=o-S.scrollLeft;i.value=I!==0?"head":"body",i.value==="head"?(o=S.scrollLeft,M.scrollLeft=o):(o=M.scrollLeft,S.scrollLeft=o)}else o=M.scrollLeft;f(),b(),P(),y()}}function T(S){const{header:M}=C();M&&(M.scrollLeft=S,_())}return Pt(t,()=>{K()}),{styleScrollXRef:x,fixedColumnLeftMapRef:s,fixedColumnRightMapRef:d,leftFixedColumnsRef:m,rightFixedColumnsRef:c,leftActiveFixedColKeyRef:g,leftActiveFixedChildrenColKeysRef:v,rightActiveFixedColKeyRef:l,rightActiveFixedChildrenColKeysRef:u,syncScrollState:_,handleTableBodyScroll:z,handleTableHeaderScroll:k,setHeaderScrollLeft:T}}function $a(){const e=N({});function n(o){return e.value[o]}function t(o,i){Rn(o)&&"key"in o&&(e.value[o.key]=i)}function a(){e.value={}}return{getResizableWidth:n,doUpdateResizableWidth:t,clearResizableWidth:a}}function Ua(e,n){const t=[],a=[],o=[],i=new WeakMap;let g=-1,v=0,l=!1;function u(c,s){s>g&&(t[s]=[],g=s);for(const d of c)if("children"in d)u(d.children,s+1);else{const f="key"in d?d.key:void 0;a.push({key:ze(d),style:da(d,f!==void 0?Me(n(f)):void 0),column:d}),v+=1,l||(l=!!d.ellipsis),o.push(d)}}u(e,0);let x=0;function m(c,s){let d=0;c.forEach((f,b)=>{var P;if("children"in f){const y=x,C={column:f,colSpan:0,rowSpan:1,isLast:!1};m(f.children,s+1),f.children.forEach(K=>{var k,z;C.colSpan+=(z=(k=i.get(K))===null||k===void 0?void 0:k.colSpan)!==null&&z!==void 0?z:0}),y+C.colSpan===v&&(C.isLast=!0),i.set(f,C),t[s].push(C)}else{if(x1&&(d=x+y);const C=x+y===v,K={column:f,colSpan:y,rowSpan:g-s+1,isLast:C};i.set(f,K),t[s].push(K),x+=1}})}return m(e,0),{hasEllipsis:l,rows:t,cols:a,dataRelatedCols:o}}function Oa(e,n){const t=R(()=>Ua(e.columns,n));return{rowsRef:R(()=>t.value.rows),colsRef:R(()=>t.value.cols),hasEllipsisRef:R(()=>t.value.hasEllipsis),dataRelatedColsRef:R(()=>t.value.dataRelatedCols)}}function _a(e,n){const t=qe(()=>{for(const u of e.columns)if(u.type==="expand")return u.renderExpand}),a=qe(()=>{let u;for(const x of e.columns)if(x.type==="expand"){u=x.expandable;break}return u}),o=N(e.defaultExpandAll?t!=null&&t.value?(()=>{const u=[];return n.value.treeNodes.forEach(x=>{var m;!((m=a.value)===null||m===void 0)&&m.call(a,x.rawNode)&&u.push(x.key)}),u})():n.value.getNonLeafKeys():e.defaultExpandedRowKeys),i=ie(e,"expandedRowKeys"),g=ie(e,"stickyExpandedRows"),v=Qe(i,o);function l(u){const{onUpdateExpandedRowKeys:x,"onUpdate:expandedRowKeys":m}=e;x&&Z(x,u),m&&Z(m,u),o.value=u}return{stickyExpandedRowsRef:g,mergedExpandedRowKeysRef:v,renderExpandRef:t,expandableRef:a,doUpdateExpandedRowKeys:l}}const nn=La(),Aa=G([F("data-table",` - width: 100%; - font-size: var(--n-font-size); - display: flex; - flex-direction: column; - position: relative; - --n-merged-th-color: var(--n-th-color); - --n-merged-td-color: var(--n-td-color); - --n-merged-border-color: var(--n-border-color); - --n-merged-th-color-hover: var(--n-th-color-hover); - --n-merged-td-color-hover: var(--n-td-color-hover); - --n-merged-td-color-striped: var(--n-td-color-striped); - `,[F("data-table-wrapper",` - flex-grow: 1; - display: flex; - flex-direction: column; - `),j("flex-height",[G(">",[F("data-table-wrapper",[G(">",[F("data-table-base-table",` - display: flex; - flex-direction: column; - flex-grow: 1; - `,[G(">",[F("data-table-base-table-body","flex-basis: 0;",[G("&:last-child","flex-grow: 1;")])])])])])])]),G(">",[F("data-table-loading-wrapper",` - color: var(--n-loading-color); - font-size: var(--n-loading-size); - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - transition: color .3s var(--n-bezier); - display: flex; - align-items: center; - justify-content: center; - `,[dr({originalTransform:"translateX(-50%) translateY(-50%)"})])]),F("data-table-expand-placeholder",` - margin-right: 8px; - display: inline-block; - width: 16px; - height: 1px; - `),F("data-table-indent",` - display: inline-block; - height: 1px; - `),F("data-table-expand-trigger",` - display: inline-flex; - margin-right: 8px; - cursor: pointer; - font-size: 16px; - vertical-align: -0.2em; - position: relative; - width: 16px; - height: 16px; - color: var(--n-td-text-color); - transition: color .3s var(--n-bezier); - `,[j("expanded",[F("icon","transform: rotate(90deg);",[et({originalTransform:"rotate(90deg)"})]),F("base-icon","transform: rotate(90deg);",[et({originalTransform:"rotate(90deg)"})])]),F("base-loading",` - color: var(--n-loading-color); - transition: color .3s var(--n-bezier); - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `,[et()]),F("icon",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `,[et()]),F("base-icon",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `,[et()])]),F("data-table-thead",` - transition: background-color .3s var(--n-bezier); - background-color: var(--n-merged-th-color); - `),F("data-table-tr",` - box-sizing: border-box; - background-clip: padding-box; - transition: background-color .3s var(--n-bezier); - `,[F("data-table-expand",` - position: sticky; - left: 0; - overflow: hidden; - margin: calc(var(--n-th-padding) * -1); - padding: var(--n-th-padding); - box-sizing: border-box; - `),j("striped","background-color: var(--n-merged-td-color-striped);",[F("data-table-td","background-color: var(--n-merged-td-color-striped);")]),at("summary",[G("&:hover","background-color: var(--n-merged-td-color-hover);",[G(">",[F("data-table-td","background-color: var(--n-merged-td-color-hover);")])])])]),F("data-table-th",` - padding: var(--n-th-padding); - position: relative; - text-align: start; - box-sizing: border-box; - background-color: var(--n-merged-th-color); - border-color: var(--n-merged-border-color); - border-bottom: 1px solid var(--n-merged-border-color); - color: var(--n-th-text-color); - transition: - border-color .3s var(--n-bezier), - color .3s var(--n-bezier), - background-color .3s var(--n-bezier); - font-weight: var(--n-th-font-weight); - `,[j("filterable",` - padding-right: 36px; - `,[j("sortable",` - padding-right: calc(var(--n-th-padding) + 36px); - `)]),nn,j("selection",` - padding: 0; - text-align: center; - line-height: 0; - z-index: 3; - `),ye("title-wrapper",` - display: flex; - align-items: center; - flex-wrap: nowrap; - max-width: 100%; - `,[ye("title",` - flex: 1; - min-width: 0; - `)]),ye("ellipsis",` - display: inline-block; - vertical-align: bottom; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - max-width: 100%; - `),j("hover",` - background-color: var(--n-merged-th-color-hover); - `),j("sortable",` - cursor: pointer; - `,[ye("ellipsis",` - max-width: calc(100% - 18px); - `),G("&:hover",` - background-color: var(--n-merged-th-color-hover); - `)]),F("data-table-sorter",` - height: var(--n-sorter-size); - width: var(--n-sorter-size); - margin-left: 4px; - position: relative; - display: inline-flex; - align-items: center; - justify-content: center; - vertical-align: -0.2em; - color: var(--n-th-icon-color); - transition: color .3s var(--n-bezier); - `,[F("base-icon","transition: transform .3s var(--n-bezier)"),j("desc",[F("base-icon",` - transform: rotate(0deg); - `)]),j("asc",[F("base-icon",` - transform: rotate(-180deg); - `)]),j("asc, desc",` - color: var(--n-th-icon-color-active); - `)]),F("data-table-resize-button",` - width: var(--n-resizable-container-size); - position: absolute; - top: 0; - right: calc(var(--n-resizable-container-size) / 2); - bottom: 0; - cursor: col-resize; - user-select: none; - `,[G("&::after",` - width: var(--n-resizable-size); - height: 50%; - position: absolute; - top: 50%; - left: calc(var(--n-resizable-container-size) / 2); - bottom: 0; - background-color: var(--n-merged-border-color); - transform: translateY(-50%); - transition: background-color .3s var(--n-bezier); - z-index: 1; - content: ''; - `),j("active",[G("&::after",` - background-color: var(--n-th-icon-color-active); - `)]),G("&:hover::after",` - background-color: var(--n-th-icon-color-active); - `)]),F("data-table-filter",` - position: absolute; - z-index: auto; - right: 0; - width: 36px; - top: 0; - bottom: 0; - cursor: pointer; - display: flex; - justify-content: center; - align-items: center; - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - font-size: var(--n-filter-size); - color: var(--n-th-icon-color); - `,[G("&:hover",` - background-color: var(--n-th-button-color-hover); - `),j("show",` - background-color: var(--n-th-button-color-hover); - `),j("active",` - background-color: var(--n-th-button-color-hover); - color: var(--n-th-icon-color-active); - `)])]),F("data-table-td",` - padding: var(--n-td-padding); - text-align: start; - box-sizing: border-box; - border: none; - background-color: var(--n-merged-td-color); - color: var(--n-td-text-color); - border-bottom: 1px solid var(--n-merged-border-color); - transition: - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier), - border-color .3s var(--n-bezier), - color .3s var(--n-bezier); - `,[j("expand",[F("data-table-expand-trigger",` - margin-right: 0; - `)]),j("last-row",` - border-bottom: 0 solid var(--n-merged-border-color); - `,[G("&::after",` - bottom: 0 !important; - `),G("&::before",` - bottom: 0 !important; - `)]),j("summary",` - background-color: var(--n-merged-th-color); - `),j("hover",` - background-color: var(--n-merged-td-color-hover); - `),ye("ellipsis",` - display: inline-block; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - max-width: 100%; - vertical-align: bottom; - max-width: calc(100% - var(--indent-offset, -1.5) * 16px - 24px); - `),j("selection, expand",` - text-align: center; - padding: 0; - line-height: 0; - `),nn]),F("data-table-empty",` - box-sizing: border-box; - padding: var(--n-empty-padding); - flex-grow: 1; - flex-shrink: 0; - opacity: 1; - display: flex; - align-items: center; - justify-content: center; - transition: opacity .3s var(--n-bezier); - `,[j("hide",` - opacity: 0; - `)]),ye("pagination",` - margin: var(--n-pagination-margin); - display: flex; - justify-content: flex-end; - `),F("data-table-wrapper",` - position: relative; - opacity: 1; - transition: opacity .3s var(--n-bezier), border-color .3s var(--n-bezier); - border-top-left-radius: var(--n-border-radius); - border-top-right-radius: var(--n-border-radius); - line-height: var(--n-line-height); - `),j("loading",[F("data-table-wrapper",` - opacity: var(--n-opacity-loading); - pointer-events: none; - `)]),j("single-column",[F("data-table-td",` - border-bottom: 0 solid var(--n-merged-border-color); - `,[G("&::after, &::before",` - bottom: 0 !important; - `)])]),at("single-line",[F("data-table-th",` - border-right: 1px solid var(--n-merged-border-color); - `,[j("last",` - border-right: 0 solid var(--n-merged-border-color); - `)]),F("data-table-td",` - border-right: 1px solid var(--n-merged-border-color); - `,[j("last-col",` - border-right: 0 solid var(--n-merged-border-color); - `)])]),j("bordered",[F("data-table-wrapper",` - border: 1px solid var(--n-merged-border-color); - border-bottom-left-radius: var(--n-border-radius); - border-bottom-right-radius: var(--n-border-radius); - overflow: hidden; - `)]),F("data-table-base-table",[j("transition-disabled",[F("data-table-th",[G("&::after, &::before","transition: none;")]),F("data-table-td",[G("&::after, &::before","transition: none;")])])]),j("bottom-bordered",[F("data-table-td",[j("last-row",` - border-bottom: 1px solid var(--n-merged-border-color); - `)])]),F("data-table-table",` - font-variant-numeric: tabular-nums; - width: 100%; - word-break: break-word; - transition: background-color .3s var(--n-bezier); - border-collapse: separate; - border-spacing: 0; - background-color: var(--n-merged-td-color); - `),F("data-table-base-table-header",` - border-top-left-radius: calc(var(--n-border-radius) - 1px); - border-top-right-radius: calc(var(--n-border-radius) - 1px); - z-index: 3; - overflow: scroll; - flex-shrink: 0; - transition: border-color .3s var(--n-bezier); - scrollbar-width: none; - `,[G("&::-webkit-scrollbar",` - width: 0; - height: 0; - `)]),F("data-table-check-extra",` - transition: color .3s var(--n-bezier); - color: var(--n-th-icon-color); - position: absolute; - font-size: 14px; - right: -4px; - top: 50%; - transform: translateY(-50%); - z-index: 1; - `)]),F("data-table-filter-menu",[F("scrollbar",` - max-height: 240px; - `),ye("group",` - display: flex; - flex-direction: column; - padding: 12px 12px 0 12px; - `,[F("checkbox",` - margin-bottom: 12px; - margin-right: 0; - `),F("radio",` - margin-bottom: 12px; - margin-right: 0; - `)]),ye("action",` - padding: var(--n-action-padding); - display: flex; - flex-wrap: nowrap; - justify-content: space-evenly; - border-top: 1px solid var(--n-action-divider-color); - `,[F("button",[G("&:not(:last-child)",` - margin: var(--n-action-button-margin); - `),G("&:last-child",` - margin-right: 0; - `)])]),F("divider",` - margin: 0 !important; - `)]),ur(F("data-table",` - --n-merged-th-color: var(--n-th-color-modal); - --n-merged-td-color: var(--n-td-color-modal); - --n-merged-border-color: var(--n-border-color-modal); - --n-merged-th-color-hover: var(--n-th-color-hover-modal); - --n-merged-td-color-hover: var(--n-td-color-hover-modal); - --n-merged-td-color-striped: var(--n-td-color-striped-modal); - `)),cr(F("data-table",` - --n-merged-th-color: var(--n-th-color-popover); - --n-merged-td-color: var(--n-td-color-popover); - --n-merged-border-color: var(--n-border-color-popover); - --n-merged-th-color-hover: var(--n-th-color-hover-popover); - --n-merged-td-color-hover: var(--n-td-color-hover-popover); - --n-merged-td-color-striped: var(--n-td-color-striped-popover); - `))]);function La(){return[j("fixed-left",` - left: 0; - position: sticky; - z-index: 2; - `,[G("&::after",` - pointer-events: none; - content: ""; - width: 36px; - display: inline-block; - position: absolute; - top: 0; - bottom: -1px; - transition: box-shadow .2s var(--n-bezier); - right: -36px; - `)]),j("fixed-right",` - right: 0; - position: sticky; - z-index: 1; - `,[G("&::before",` - pointer-events: none; - content: ""; - width: 36px; - display: inline-block; - position: absolute; - top: 0; - bottom: -1px; - transition: box-shadow .2s var(--n-bezier); - left: -36px; - `)])]}const Ea=te({name:"DataTable",alias:["AdvancedTable"],props:Yr,setup(e,{slots:n}){const{mergedBorderedRef:t,mergedClsPrefixRef:a,inlineThemeDisabled:o}=Xe(e),i=R(()=>{const{bottomBordered:w}=e;return t.value?!1:w!==void 0?w:!0}),g=Ke("DataTable","-data-table",Aa,fr,e,a),v=N(null),l=N(null),{getResizableWidth:u,clearResizableWidth:x,doUpdateResizableWidth:m}=$a(),{rowsRef:c,colsRef:s,dataRelatedColsRef:d,hasEllipsisRef:f}=Oa(e,u),{treeMateRef:b,mergedCurrentPageRef:P,paginatedDataRef:y,rawPaginatedDataRef:C,selectionColumnRef:K,hoverKeyRef:k,mergedPaginationRef:z,mergedFilterStateRef:_,mergedSortStateRef:T,childTriggerColIndexRef:S,doUpdatePage:M,doUpdateFilters:H,onUnstableColumnResize:I,deriveNextSorter:V,filter:D,filters:W,clearFilter:X,clearFilters:Q,clearSorter:ae,page:ue,sort:h}=Ba(e,{dataRelatedColsRef:d}),{doCheckAll:U,doUncheckAll:O,doCheck:$,doUncheck:q,headerCheckboxDisabledRef:J,someRowsCheckedRef:he,allRowsCheckedRef:le,mergedCheckedRowKeySetRef:de,mergedInderminateRowKeySetRef:ne}=Fa(e,{selectionColumnRef:K,treeMateRef:b,paginatedDataRef:y}),{stickyExpandedRowsRef:p,mergedExpandedRowKeysRef:E,renderExpandRef:me,expandableRef:A,doUpdateExpandedRowKeys:ee}=_a(e,b),{handleTableBodyScroll:Fe,handleTableHeaderScroll:ge,syncScrollState:ve,setHeaderScrollLeft:De,leftActiveFixedColKeyRef:je,leftActiveFixedChildrenColKeysRef:Re,rightActiveFixedColKeyRef:ke,rightActiveFixedChildrenColKeysRef:Ne,leftFixedColumnsRef:Ie,rightFixedColumnsRef:He,fixedColumnLeftMapRef:Ge,fixedColumnRightMapRef:$e}=Ta(e,{bodyWidthRef:v,mainTableInstRef:l,mergedCurrentPageRef:P}),{localeRef:fe}=pn("DataTable"),Ue=R(()=>e.virtualScroll||e.flexHeight||e.maxHeight!==void 0||f.value?"fixed":e.tableLayout);zt(Te,{props:e,treeMateRef:b,renderExpandIconRef:ie(e,"renderExpandIcon"),loadingKeySetRef:N(new Set),slots:n,indentRef:ie(e,"indent"),childTriggerColIndexRef:S,bodyWidthRef:v,componentId:hr(),hoverKeyRef:k,mergedClsPrefixRef:a,mergedThemeRef:g,scrollXRef:R(()=>e.scrollX),rowsRef:c,colsRef:s,paginatedDataRef:y,leftActiveFixedColKeyRef:je,leftActiveFixedChildrenColKeysRef:Re,rightActiveFixedColKeyRef:ke,rightActiveFixedChildrenColKeysRef:Ne,leftFixedColumnsRef:Ie,rightFixedColumnsRef:He,fixedColumnLeftMapRef:Ge,fixedColumnRightMapRef:$e,mergedCurrentPageRef:P,someRowsCheckedRef:he,allRowsCheckedRef:le,mergedSortStateRef:T,mergedFilterStateRef:_,loadingRef:ie(e,"loading"),rowClassNameRef:ie(e,"rowClassName"),mergedCheckedRowKeySetRef:de,mergedExpandedRowKeysRef:E,mergedInderminateRowKeySetRef:ne,localeRef:fe,expandableRef:A,stickyExpandedRowsRef:p,rowKeyRef:ie(e,"rowKey"),renderExpandRef:me,summaryRef:ie(e,"summary"),virtualScrollRef:ie(e,"virtualScroll"),rowPropsRef:ie(e,"rowProps"),stripedRef:ie(e,"striped"),checkOptionsRef:R(()=>{const{value:w}=K;return w==null?void 0:w.options}),rawPaginatedDataRef:C,filterMenuCssVarsRef:R(()=>{const{self:{actionDividerColor:w,actionPadding:Y,actionButtonMargin:se}}=g.value;return{"--n-action-padding":Y,"--n-action-button-margin":se,"--n-action-divider-color":w}}),onLoadRef:ie(e,"onLoad"),mergedTableLayoutRef:Ue,maxHeightRef:ie(e,"maxHeight"),minHeightRef:ie(e,"minHeight"),flexHeightRef:ie(e,"flexHeight"),headerCheckboxDisabledRef:J,paginationBehaviorOnFilterRef:ie(e,"paginationBehaviorOnFilter"),summaryPlacementRef:ie(e,"summaryPlacement"),scrollbarPropsRef:ie(e,"scrollbarProps"),syncScrollState:ve,doUpdatePage:M,doUpdateFilters:H,getResizableWidth:u,onUnstableColumnResize:I,clearResizableWidth:x,doUpdateResizableWidth:m,deriveNextSorter:V,doCheck:$,doUncheck:q,doCheckAll:U,doUncheckAll:O,doUpdateExpandedRowKeys:ee,handleTableHeaderScroll:ge,handleTableBodyScroll:Fe,setHeaderScrollLeft:De,renderCell:ie(e,"renderCell")});const Oe={filter:D,filters:W,clearFilters:Q,clearSorter:ae,page:ue,sort:h,clearFilter:X,scrollTo:(w,Y)=>{var se;(se=l.value)===null||se===void 0||se.scrollTo(w,Y)}},B=R(()=>{const{size:w}=e,{common:{cubicBezierEaseInOut:Y},self:{borderColor:se,tdColorHover:_e,thColor:xe,thColorHover:Se,tdColor:Ae,tdTextColor:Ye,thTextColor:Ve,thFontWeight:Ze,thButtonColorHover:We,thIconColor:Pe,thIconColorActive:Je,filterSize:pe,borderRadius:Ce,lineHeight:ft,tdColorModal:ht,thColorModal:vt,borderColorModal:mt,thColorHoverModal:gt,tdColorHoverModal:pt,borderColorPopover:zn,thColorPopover:Mn,tdColorPopover:Bn,tdColorHoverPopover:Tn,thColorHoverPopover:$n,paginationMargin:Un,emptyPadding:On,boxShadowAfter:_n,boxShadowBefore:An,sorterSize:Ln,resizableContainerSize:En,resizableSize:Nn,loadingColor:Kn,loadingSize:In,opacityLoading:Vn,tdColorStriped:Dn,tdColorStripedModal:jn,tdColorStripedPopover:Hn,[ce("fontSize",w)]:Wn,[ce("thPadding",w)]:qn,[ce("tdPadding",w)]:Xn}}=g.value;return{"--n-font-size":Wn,"--n-th-padding":qn,"--n-td-padding":Xn,"--n-bezier":Y,"--n-border-radius":Ce,"--n-line-height":ft,"--n-border-color":se,"--n-border-color-modal":mt,"--n-border-color-popover":zn,"--n-th-color":xe,"--n-th-color-hover":Se,"--n-th-color-modal":vt,"--n-th-color-hover-modal":gt,"--n-th-color-popover":Mn,"--n-th-color-hover-popover":$n,"--n-td-color":Ae,"--n-td-color-hover":_e,"--n-td-color-modal":ht,"--n-td-color-hover-modal":pt,"--n-td-color-popover":Bn,"--n-td-color-hover-popover":Tn,"--n-th-text-color":Ve,"--n-td-text-color":Ye,"--n-th-font-weight":Ze,"--n-th-button-color-hover":We,"--n-th-icon-color":Pe,"--n-th-icon-color-active":Je,"--n-filter-size":pe,"--n-pagination-margin":Un,"--n-empty-padding":On,"--n-box-shadow-before":An,"--n-box-shadow-after":_n,"--n-sorter-size":Ln,"--n-resizable-container-size":En,"--n-resizable-size":Nn,"--n-loading-size":In,"--n-loading-color":Kn,"--n-opacity-loading":Vn,"--n-td-color-striped":Dn,"--n-td-color-striped-modal":jn,"--n-td-color-striped-popover":Hn}}),L=o?ct("data-table",R(()=>e.size[0]),B,e):void 0,re=R(()=>{if(!e.pagination)return!1;if(e.paginateSinglePage)return!0;const w=z.value,{pageCount:Y}=w;return Y!==void 0?Y>1:w.itemCount&&w.pageSize&&w.itemCount>w.pageSize});return Object.assign({mainTableInstRef:l,mergedClsPrefix:a,mergedTheme:g,paginatedData:y,mergedBordered:t,mergedBottomBordered:i,mergedPagination:z,mergedShowPagination:re,cssVars:o?void 0:B,themeClass:L==null?void 0:L.themeClass,onRender:L==null?void 0:L.onRender},Oe)},render(){const{mergedClsPrefix:e,themeClass:n,onRender:t,$slots:a,spinProps:o}=this;return t==null||t(),r("div",{class:[`${e}-data-table`,n,{[`${e}-data-table--bordered`]:this.mergedBordered,[`${e}-data-table--bottom-bordered`]:this.mergedBottomBordered,[`${e}-data-table--single-line`]:this.singleLine,[`${e}-data-table--single-column`]:this.singleColumn,[`${e}-data-table--loading`]:this.loading,[`${e}-data-table--flex-height`]:this.flexHeight}],style:this.cssVars},r("div",{class:`${e}-data-table-wrapper`},r(Sa,{ref:"mainTableInstRef"})),this.mergedShowPagination?r("div",{class:`${e}-data-table__pagination`},r(Zr,Object.assign({theme:this.mergedTheme.peers.Pagination,themeOverrides:this.mergedTheme.peerOverrides.Pagination,disabled:this.loading},this.mergedPagination))):null,r(vr,{name:"fade-in-scale-up-transition"},{default:()=>this.loading?r("div",{class:`${e}-data-table-loading-wrapper`},Mt(a.loading,()=>[r(un,Object.assign({clsPrefix:e,strokeWidth:20},o))])):null}))}});function Na(e){let n="/panel/users/create";return e.id&&(n="/panel/users/update"),lt({url:n,data:e})}function Ka(e){return lt({url:"/panel/users/getList",data:e})}function Ia(e){return lt({url:"/panel/users/deletes",data:{userIds:e}})}function Va(){return lt({url:"/panel/users/getPublicVisitUser"})}function rn(e){return lt({url:"/panel/users/setPublicVisitUser",data:{userId:e}})}const Da={class:"float-right"},ja=te({__name:"index",props:{visible:{type:Boolean},userId:null,userInfo:null},emits:["update:visible","done"],setup(e,{emit:n}){const t=e,a=cn(),o={name:"",username:"",role:2,status:3},i=N(o),g=N(null),v=N([{label:oe("common.role.regularUser"),value:2},{label:oe("common.role.admin"),value:1}]),l={username:[{required:!0,trigger:"blur",message:oe("adminSettingUsers.formRules.usernameRequired"),min:5}],role:{required:!0,trigger:"blur",type:"number",message:oe("adminSettingUsers.formRules.roleRequired")},password:{trigger:"blur",min:6,max:20,message:oe("adminSettingUsers.formRules.passwordLimit")}},u=R({get:()=>t.visible,set:c=>{n("update:visible",c)}});Pt(u,(c,s)=>{var d;(d=t.userInfo)!=null&&d.id?i.value=t.userInfo||{}:i.value=o});const x=async()=>{const c=await Na(i.value);c.code===0?n("done",c.data.id):c.code!==-1&&a.warning(oe("common.failed"))},m=c=>{var s;c.preventDefault(),(s=g.value)==null||s.validate(d=>{d?console.log(d):x()})};return(c,s)=>{var d;return fn(),mr(be(Pr),{show:be(u),"onUpdate:show":s[4]||(s[4]=f=>gr(u)?u.value=f:null),size:"small",preset:"card",style:{width:"400px"},title:`${(d=e.userInfo)!=null&&d.id?c.$t("common.edit"):c.$t("common.add")}`},{footer:Le(()=>[hn("div",Da,[we(be(it),{type:"success",size:"small",onClick:m},{default:Le(()=>[Rt(kt(c.$t("common.save")),1)]),_:1})])]),default:Le(()=>[we(be(Ur),{ref_key:"formRef",ref:g,model:i.value,rules:l},{default:Le(()=>[we(be(dt),{path:"username",label:c.$t("common.username")},{default:Le(()=>[we(be(rt),{value:i.value.username,"onUpdate:value":s[0]||(s[0]=f=>i.value.username=f),type:"text",placeholder:c.$t("common.inputPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),we(be(dt),{path:"name",label:c.$t("common.nikeName")},{default:Le(()=>[we(be(rt),{value:i.value.name,"onUpdate:value":s[1]||(s[1]=f=>i.value.name=f),type:"text",placeholder:c.$t("common.inputPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),we(be(dt),{path:"role",label:c.$t("adminSettingUsers.role")},{default:Le(()=>[we(be(mn),{value:i.value.role,"onUpdate:value":s[2]||(s[2]=f=>i.value.role=f),options:v.value},null,8,["value","options"])]),_:1},8,["label"]),we(be(dt),{path:"password",label:c.$t("common.password")},{default:Le(()=>{var f;return[we(be(rt),{value:i.value.password,"onUpdate:value":s[3]||(s[3]=b=>i.value.password=b),maxlength:20,type:"password",placeholder:`${(f=e.userInfo)!=null&&f.id?c.$t("adminSettingUsers.EditpasswordPlaceholder"):c.$t("adminSettingUsers.passwordPlaceholder")}`},null,8,["value","placeholder"])]}),_:1},8,["label"])]),_:1},8,["model"])]),_:1},8,["show","title"])}}});var Ft=(e=>(e[e.admin=1]="admin",e[e.regularUser=2]="regularUser",e))(Ft||{});const Ha={class:"overflow-auto pt-2"},Wa={class:"my-[10px]"},eo=te({__name:"index",setup(e){const n=cn(),t=pr(),a=N(!1),o=N(!1),i=N(),g=N(),v=br(),l=N(null),u=({update:y})=>[{title:oe("common.username"),key:"username",render(C){var k;let K="";return l.value&&l.value===C.id&&(K=`[${oe("adminSettingUsers.pblicText")}]-`),C.username===((k=t.userInfo)==null?void 0:k.username)?`${K}${C.username} (${oe("adminSettingUsers.currentUseUsername")})`:K+C.username}},{title:oe("common.nikeName"),key:"name"},{title:oe("adminSettingUsers.role"),key:"role",render(C){switch(C.role){case Ft.admin:return r(Lt,{type:"info"},oe("common.role.admin"));case Ft.regularUser:return r(Lt,oe("common.role.regularUser"));default:return"-"}}},{title:oe("common.action"),key:"",render(C){const K=r(it,{strong:!0,tertiary:!0,size:"small"},{default(){return r(_r,{icon:"mingcute:more-1-fill"})}});return r(yn,{trigger:"click",onSelect(k){switch(k){case"update":y(C);break;case"publicMode":l.value&&l.value===C.id?rn(null).then(({code:z})=>{z===0&&(l.value=null)}):rn(C.id).then(({code:z})=>{z===0&&(l.value=C.id)});break;case"delete":v.warning({title:oe("common.warning"),content:oe("adminSettingUsers.deletePromptContent",{name:C.name,username:C.username}),positiveText:oe("common.confirm"),negativeText:oe("common.cancel"),onPositiveClick:()=>{P([C.id])}});break}},options:[{label:oe("common.edit"),key:"update"},{label:oe("adminSettingUsers.setOrUnsetPublicMode"),key:"publicMode"},{label:oe("common.delete"),key:"delete"}]},{default:()=>K})}}],x=N(),m=u({update(y){g.value=y,o.value=!0}}),c=yr({page:1,showSizePicker:!0,pageSizes:[10,30,50,100,200],pageSize:10,itemCount:0,onChange:y=>{c.page=y,b(null)},onUpdatePageSize:y=>{c.pageSize=y,c.page=1,b(null)},prefix(y){return oe("adminSettingUsers.userCountText",{count:y.itemCount})}});function s(y){b(y)}function d(){o.value=!0,g.value={}}function f(){o.value=!1,n.success(oe("common.success")),b(null)}async function b(y){a.value=!0;const C={page:y||c.page,limit:c.pageSize};i.value!==""&&(C.keyWord=i.value);const{data:K}=await Ka(C);c.itemCount=K.count,K.list&&(x.value=K.list),a.value=!1}async function P(y){const{code:C}=await Ia(y);C===0&&(n.success(oe("common.deleteSuccess")),b(null))}return xr(()=>{Va().then(({data:y})=>{l.value=y.id||null}),b(null)}),(y,C)=>(fn(),Cr("div",Ha,[we(be(Kr),{type:"info",bordered:!1},{default:Le(()=>[Rt(kt(y.$t("adminSettingUsers.alertText")),1)]),_:1}),hn("div",Wa,[we(be(it),{type:"primary",size:"small",ghost:"",onClick:d},{default:Le(()=>[Rt(kt(y.$t("common.add")),1)]),_:1})]),we(be(Ea),{columns:be(m),data:x.value,pagination:c,bordered:!1,loading:a.value,remote:!0,"onUpdate:page":s},null,8,["columns","data","pagination","loading"]),we(ja,{visible:o.value,"onUpdate:visible":C[0]||(C[0]=K=>o.value=K),"user-info":g.value,onDone:f},null,8,["visible","user-info"])]))}});export{eo as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b1d3d9b0.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b1d3d9b0.js deleted file mode 100644 index 298062238..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b1d3d9b0.js +++ /dev/null @@ -1,149 +0,0 @@ -import{aP as ys,bY as Gn,y as j,r as F,b as _s,bZ as mr,l as Et,g as h,f as he,au as bs,m as H,aj as Ot,n as K,K as de,p as Ct,q as $e,s as jn,af as Vn,a6 as Ft,b_ as Bn,z as Ie,b$ as Zn,c0 as Xn,bE as qn,c1 as Jn,P as Yt,t as Ss,bg as vr,aH as We,H as xs,ae as wt,D as us,L as Rt,V as Qn,ax as Kn,aR as qs,c2 as ds,J as ei,c3 as ti,w as si,c as yt,B as pr,N as ri,O as ni,a8 as Js,c4 as ii,T as xt,ao as Qs,S as _e,e as Kt,aZ as ai,ag as oi,E as fs,A as li,bJ as ui,c5 as di,b6 as fi,aW as ci,a_ as hi,a$ as je,aY as Ve,b2 as es,bi as mi,bp as vi,be as ks,c6 as pi,c7 as gi,bl as wi,c8 as yi}from"./index-7e19b821.js";import{N as _i,p as bi,i as gr,b as Si,h as xi}from"./index-c238f14b.js";function ki(e){if(typeof e=="number")return{"":e.toString()};const t={};return e.split(/ +/).forEach(s=>{if(s==="")return;const[r,n]=s.split(":");n===void 0?t[""]=r:t[r]=n}),t}function Be(e,t){var s;if(e==null)return;const r=ki(e);if(t===void 0)return r[""];if(typeof t=="string")return(s=r[t])!==null&&s!==void 0?s:r[""];if(Array.isArray(t)){for(let n=t.length-1;n>=0;--n){const i=t[n];if(i in r)return r[i]}return r[""]}else{let n,i=-1;return Object.keys(r).forEach(a=>{const o=Number(a);!Number.isNaN(o)&&t>=o&&o>=i&&(i=o,n=r[a])}),n}}function Mi(e,t="default",s=[]){const n=e.$slots[t];return n===void 0?s:n()}function Di(e){var t;const s=(t=e.dirs)===null||t===void 0?void 0:t.find(({dir:r})=>r===ys);return!!(s&&s.value===!1)}const Oi={xs:0,s:640,m:1024,l:1280,xl:1536,"2xl":1920};function Ci(e){return`(min-width: ${e}px)`}const it={};function Yi(e=Oi){if(!Gn)return j(()=>[]);if(typeof window.matchMedia!="function")return j(()=>[]);const t=F({}),s=Object.keys(e),r=(n,i)=>{n.matches?t.value[i]=!0:t.value[i]=!1};return s.forEach(n=>{const i=e[n];let a,o;it[i]===void 0?(a=window.matchMedia(Ci(i)),a.addEventListener?a.addEventListener("change",l=>{o.forEach(u=>{u(l,n)})}):a.addListener&&a.addListener(l=>{o.forEach(u=>{u(l,n)})}),o=new Set,it[i]={mql:a,cbs:o}):(a=it[i].mql,o=it[i].cbs),o.add(r),a.matches&&o.forEach(l=>{l(a,n)})}),_s(()=>{s.forEach(n=>{const{cbs:i}=it[e[n]];i.has(r)&&i.delete(r)})}),j(()=>{const{value:n}=t;return s.filter(i=>n[i])})}function Ri(e,t,s,r){var n=-1,i=e==null?0:e.length;for(r&&i&&(s=e[++n]);++n{var t;const{root:s=null}=e;return{hash:`${e.rootMargin||"0px 0px 0px 0px"}-${Array.isArray(e.threshold)?e.threshold.join(","):(t=e.threshold)!==null&&t!==void 0?t:"0"}`,options:Object.assign(Object.assign({},e),{root:(typeof s=="string"?document.querySelector(s):s)||document.documentElement})}},ts=new WeakMap,ss=new WeakMap,rs=new WeakMap,Ya=(e,t,s)=>{if(!e)return()=>{};const r=Ca(t),{root:n}=r.options;let i;const a=ts.get(n);a?i=a:(i=new Map,ts.set(n,i));let o,l;i.has(r.hash)?(l=i.get(r.hash),l[1].has(e)||(o=l[0],l[1].add(e),o.observe(e))):(o=new IntersectionObserver(w=>{w.forEach(M=>{if(M.isIntersecting){const P=ss.get(M.target),I=rs.get(M.target);P&&P(),I&&(I.value=!0)}})},r.options),o.observe(e),l=[o,new Set([e])],i.set(r.hash,l));let u=!1;const f=()=>{u||(ss.delete(e),rs.delete(e),u=!0,l[1].has(e)&&(l[0].unobserve(e),l[1].delete(e)),l[1].size<=0&&i.delete(r.hash),i.size||ts.delete(n))};return ss.set(e,f),rs.set(e,s),f},E="0!important",Tr="-1px!important";function Ze(e){return de(e+"-type",[K("& +",[H("button",{},[de(e+"-type",[Ct("border",{borderLeftWidth:E}),Ct("state-border",{left:Tr})])])])])}function Xe(e){return de(e+"-type",[K("& +",[H("button",[de(e+"-type",[Ct("border",{borderTopWidth:E}),Ct("state-border",{top:Tr})])])])])}const Ra=H("button-group",` - flex-wrap: nowrap; - display: inline-flex; - position: relative; -`,[Ot("vertical",{flexDirection:"row"},[Ot("rtl",[H("button",[K("&:first-child:not(:last-child)",` - margin-right: ${E}; - border-top-right-radius: ${E}; - border-bottom-right-radius: ${E}; - `),K("&:last-child:not(:first-child)",` - margin-left: ${E}; - border-top-left-radius: ${E}; - border-bottom-left-radius: ${E}; - `),K("&:not(:first-child):not(:last-child)",` - margin-left: ${E}; - margin-right: ${E}; - border-radius: ${E}; - `),Ze("default"),de("ghost",[Ze("primary"),Ze("info"),Ze("success"),Ze("warning"),Ze("error")])])])]),de("vertical",{flexDirection:"column"},[H("button",[K("&:first-child:not(:last-child)",` - margin-bottom: ${E}; - margin-left: ${E}; - margin-right: ${E}; - border-bottom-left-radius: ${E}; - border-bottom-right-radius: ${E}; - `),K("&:last-child:not(:first-child)",` - margin-top: ${E}; - margin-left: ${E}; - margin-right: ${E}; - border-top-left-radius: ${E}; - border-top-right-radius: ${E}; - `),K("&:not(:first-child):not(:last-child)",` - margin: ${E}; - border-radius: ${E}; - `),Xe("default"),de("ghost",[Xe("primary"),Xe("info"),Xe("success"),Xe("warning"),Xe("error")])])])]),Ta={size:{type:String,default:void 0},vertical:Boolean},sf=he({name:"ButtonGroup",props:Ta,setup(e){const{mergedClsPrefixRef:t,mergedRtlRef:s}=$e(e);return jn("-button-group",Ra,t),Ft(Bn,e),{rtlEnabled:Vn("ButtonGroup",s,t),mergedClsPrefix:t}},render(){const{mergedClsPrefix:e}=this;return h("div",{class:[`${e}-button-group`,this.rtlEnabled&&`${e}-button-group--rtl`,this.vertical&&`${e}-button-group--vertical`],role:"group"},this.$slots)}}),Pa=Object.assign(Object.assign({},bi),Ie.props),Pr=he({name:"Tooltip",props:Pa,__popover__:!0,setup(e){const{mergedClsPrefixRef:t}=$e(e),s=Ie("Tooltip","-tooltip",void 0,Zn,e,t),r=F(null);return Object.assign(Object.assign({},{syncPosition(){r.value.syncPosition()},setShow(i){r.value.setShow(i)}}),{popoverRef:r,mergedTheme:s,popoverThemeOverrides:j(()=>s.value.self)})},render(){const{mergedTheme:e,internalExtraClass:t}=this;return h(_i,Object.assign(Object.assign({},this.$props),{theme:e.peers.Popover,themeOverrides:e.peerOverrides.Popover,builtinThemeOverrides:this.popoverThemeOverrides,internalExtraClass:t.concat("tooltip"),ref:"popoverRef"}),this.$slots)}}),Na=H("ellipsis",{overflow:"hidden"},[Ot("line-clamp",` - white-space: nowrap; - display: inline-block; - vertical-align: bottom; - max-width: 100%; - `),de("line-clamp",` - display: -webkit-inline-box; - -webkit-box-orient: vertical; - `),de("cursor-pointer",` - cursor: pointer; - `)]);function rr(e){return`${e}-ellipsis--line-clamp`}function nr(e,t){return`${e}-ellipsis--cursor-${t}`}const Ia=Object.assign(Object.assign({},Ie.props),{expandTrigger:String,lineClamp:[Number,String],tooltip:{type:[Boolean,Object],default:!0}}),rf=he({name:"Ellipsis",inheritAttrs:!1,props:Ia,setup(e,{slots:t,attrs:s}){const r=Xn(),n=Ie("Ellipsis","-ellipsis",Na,Jn,e,r),i=F(null),a=F(null),o=F(null),l=F(!1),u=j(()=>{const{lineClamp:b}=e,{value:x}=l;return b!==void 0?{textOverflow:"","-webkit-line-clamp":x?"":b}:{textOverflow:x?"":"ellipsis","-webkit-line-clamp":""}});function f(){let b=!1;const{value:x}=l;if(x)return!0;const{value:_}=i;if(_){const{lineClamp:G}=e;if(P(_),G!==void 0)b=_.scrollHeight<=_.offsetHeight;else{const{value:Q}=a;Q&&(b=Q.getBoundingClientRect().width<=_.getBoundingClientRect().width)}I(_,b)}return b}const w=j(()=>e.expandTrigger==="click"?()=>{var b;const{value:x}=l;x&&((b=o.value)===null||b===void 0||b.setShow(!1)),l.value=!x}:void 0);qn(()=>{var b;e.tooltip&&((b=o.value)===null||b===void 0||b.setShow(!1))});const M=()=>h("span",Object.assign({},Yt(s,{class:[`${r.value}-ellipsis`,e.lineClamp!==void 0?rr(r.value):void 0,e.expandTrigger==="click"?nr(r.value,"pointer"):void 0],style:u.value}),{ref:"triggerRef",onClick:w.value,onMouseenter:e.expandTrigger==="click"?f:void 0}),e.lineClamp?t:h("span",{ref:"triggerInnerRef"},t));function P(b){if(!b)return;const x=u.value,_=rr(r.value);e.lineClamp!==void 0?$(b,_,"add"):$(b,_,"remove");for(const G in x)b.style[G]!==x[G]&&(b.style[G]=x[G])}function I(b,x){const _=nr(r.value,"pointer");e.expandTrigger==="click"&&!x?$(b,_,"add"):$(b,_,"remove")}function $(b,x,_){_==="add"?b.classList.contains(x)||b.classList.add(x):b.classList.contains(x)&&b.classList.remove(x)}return{mergedTheme:n,triggerRef:i,triggerInnerRef:a,tooltipRef:o,handleClick:w,renderTrigger:M,getTooltipDisabled:f}},render(){var e;const{tooltip:t,renderTrigger:s,$slots:r}=this;if(t){const{mergedTheme:n}=this;return h(Pr,Object.assign({ref:"tooltipRef",placement:"top"},t,{getDisabled:this.getTooltipDisabled,theme:n.peers.Tooltip,themeOverrides:n.peerOverrides.Tooltip}),{trigger:s,default:(e=r.tooltip)!==null&&e!==void 0?e:r.default})}else return s()}}),ir=1,Nr=Ss("n-grid"),Ir=1,La={span:{type:[Number,String],default:Ir},offset:{type:[Number,String],default:0},suffix:Boolean,privateOffset:Number,privateSpan:Number,privateColStart:Number,privateShow:{type:Boolean,default:!0}},nf=he({__GRID_ITEM__:!0,name:"GridItem",alias:["Gi"],props:La,setup(){const{isSsrRef:e,xGapRef:t,itemStyleRef:s,overflowRef:r,layoutShiftDisabledRef:n}=xs(Nr),i=vr();return{overflow:r,itemStyle:s,layoutShiftDisabled:n,mergedXGap:j(()=>We(t.value||0)),deriveStyle:()=>{e.value;const{privateSpan:a=Ir,privateShow:o=!0,privateColStart:l=void 0,privateOffset:u=0}=i.vnode.props,{value:f}=t,w=We(f||0);return{display:o?"":"none",gridColumn:`${l??`span ${a}`} / span ${a}`,marginLeft:u?`calc((100% - (${a} - 1) * ${w}) / ${a} * ${u} + ${w} * ${u})`:""}}}},render(){var e,t;if(this.layoutShiftDisabled){const{span:s,offset:r,mergedXGap:n}=this;return h("div",{style:{gridColumn:`span ${s} / span ${s}`,marginLeft:r?`calc((100% - (${s} - 1) * ${n}) / ${s} * ${r} + ${n} * ${r})`:""}},this.$slots)}return h("div",{style:[this.itemStyle,this.deriveStyle()]},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e,{overflow:this.overflow}))}}),Wa={xs:0,s:640,m:1024,l:1280,xl:1536,xxl:1920},Lr=24,ns="__ssr__",Ea={layoutShiftDisabled:Boolean,responsive:{type:[String,Boolean],default:"self"},cols:{type:[Number,String],default:Lr},itemResponsive:Boolean,collapsed:Boolean,collapsedRows:{type:Number,default:1},itemStyle:[Object,String],xGap:{type:[Number,String],default:0},yGap:{type:[Number,String],default:0}},af=he({name:"Grid",inheritAttrs:!1,props:Ea,setup(e){const{mergedClsPrefixRef:t,mergedBreakpointsRef:s}=$e(e),r=/^\d+$/,n=F(void 0),i=Yi((s==null?void 0:s.value)||Wa),a=wt(()=>!!(e.itemResponsive||!r.test(e.cols.toString())||!r.test(e.xGap.toString())||!r.test(e.yGap.toString()))),o=j(()=>{if(a.value)return e.responsive==="self"?n.value:i.value}),l=wt(()=>{var x;return(x=Number(Be(e.cols.toString(),o.value)))!==null&&x!==void 0?x:Lr}),u=wt(()=>Be(e.xGap.toString(),o.value)),f=wt(()=>Be(e.yGap.toString(),o.value)),w=x=>{n.value=x.contentRect.width},M=x=>{gr(w,x)},P=F(!1),I=j(()=>{if(e.responsive==="self")return M}),$=F(!1),b=F();return us(()=>{const{value:x}=b;x&&x.hasAttribute(ns)&&(x.removeAttribute(ns),$.value=!0)}),Ft(Nr,{layoutShiftDisabledRef:Rt(e,"layoutShiftDisabled"),isSsrRef:$,itemStyleRef:Rt(e,"itemStyle"),xGapRef:u,overflowRef:P}),{isSsr:!bs,contentEl:b,mergedClsPrefix:t,style:j(()=>e.layoutShiftDisabled?{width:"100%",display:"grid",gridTemplateColumns:`repeat(${e.cols}, minmax(0, 1fr))`,columnGap:We(e.xGap),rowGap:We(e.yGap)}:{width:"100%",display:"grid",gridTemplateColumns:`repeat(${l.value}, minmax(0, 1fr))`,columnGap:We(u.value),rowGap:We(f.value)}),isResponsive:a,responsiveQuery:o,responsiveCols:l,handleResize:I,overflow:P}},render(){if(this.layoutShiftDisabled)return h("div",Yt({ref:"contentEl",class:`${this.mergedClsPrefix}-grid`,style:this.style},this.$attrs),this.$slots);const e=()=>{var t,s,r,n,i,a,o;this.overflow=!1;const l=Kn(Mi(this)),u=[],{collapsed:f,collapsedRows:w,responsiveCols:M,responsiveQuery:P}=this;l.forEach(_=>{var G,Q,ae,ye,He;if(((G=_==null?void 0:_.type)===null||G===void 0?void 0:G.__GRID_ITEM__)!==!0)return;if(Di(_)){const Ye=qs(_);Ye.props?Ye.props.privateShow=!1:Ye.props={privateShow:!1},u.push({child:Ye,rawChildSpan:0});return}_.dirs=((Q=_.dirs)===null||Q===void 0?void 0:Q.filter(({dir:Ye})=>Ye!==ys))||null,((ae=_.dirs)===null||ae===void 0?void 0:ae.length)===0&&(_.dirs=null);const z=qs(_),gt=Number((He=Be((ye=z.props)===null||ye===void 0?void 0:ye.span,P))!==null&&He!==void 0?He:ir);gt!==0&&u.push({child:z,rawChildSpan:gt})});let I=0;const $=(t=u[u.length-1])===null||t===void 0?void 0:t.child;if($!=null&&$.props){const _=(s=$.props)===null||s===void 0?void 0:s.suffix;_!==void 0&&_!==!1&&(I=Number((n=Be((r=$.props)===null||r===void 0?void 0:r.span,P))!==null&&n!==void 0?n:ir),$.props.privateSpan=I,$.props.privateColStart=M+1-I,$.props.privateShow=(i=$.props.privateShow)!==null&&i!==void 0?i:!0)}let b=0,x=!1;for(const{child:_,rawChildSpan:G}of u){if(x&&(this.overflow=!0),!x){const Q=Number((o=Be((a=_.props)===null||a===void 0?void 0:a.offset,P))!==null&&o!==void 0?o:0),ae=Math.min(G+Q,M);if(_.props?(_.props.privateSpan=ae,_.props.privateOffset=Q):_.props={privateSpan:ae,privateOffset:Q},f){const ye=b%M;ae+ye>M&&(b+=M-ye),ae+b+I>w*M?x=!0:b+=ae}}x&&(_.props?_.props.privateShow!==!0&&(_.props.privateShow=!1):_.props={privateShow:!1})}return h("div",Yt({ref:"contentEl",class:`${this.mergedClsPrefix}-grid`,style:this.style,[ns]:this.isSsr||void 0},this.$attrs),u.map(({child:_})=>_))};return this.isResponsive&&this.responsive==="self"?h(Qn,{onResize:this.handleResize},{default:e}):e()}}),Ms=Object.assign(Object.assign({},Ie.props),{onPreviewPrev:Function,onPreviewNext:Function,showToolbar:{type:Boolean,default:!0},showToolbarTooltip:Boolean}),Wr=Ss("n-image");var Er=globalThis&&globalThis.__awaiter||function(e,t,s,r){function n(i){return i instanceof s?i:new s(function(a){a(i)})}return new(s||(s=Promise))(function(i,a){function o(f){try{u(r.next(f))}catch(w){a(w)}}function l(f){try{u(r.throw(f))}catch(w){a(w)}}function u(f){f.done?i(f.value):n(f.value).then(o,l)}u((r=r.apply(e,t||[])).next())})};const Fr=e=>e.includes("image/"),ar=(e="")=>{const t=e.split("/"),r=t[t.length-1].split(/#|\?/)[0];return(/\.[^./\\]*$/.exec(r)||[""])[0]},or=/(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico)$/i,of=e=>{if(e.type)return Fr(e.type);const t=ar(e.name||"");if(or.test(t))return!0;const s=e.thumbnailUrl||e.url||"",r=ar(s);return!!(/^data:image\//.test(s)||or.test(r))};function lf(e){return Er(this,void 0,void 0,function*(){return yield new Promise(t=>{if(!e.type||!Fr(e.type)){t("");return}t(window.URL.createObjectURL(e))})})}const uf=bs&&window.FileReader&&window.File;function Fa(e){return e.isDirectory}function $a(e){return e.isFile}function df(e,t){return Er(this,void 0,void 0,function*(){const s=[];let r,n=0;function i(){n++}function a(){n--,n||r(s)}function o(l){l.forEach(u=>{if(u){if(i(),t&&Fa(u)){const f=u.createReader();i(),f.readEntries(w=>{o(w),a()},()=>{a()})}else $a(u)&&(i(),u.file(f=>{s.push({file:f,entry:u,source:"dnd"}),a()},()=>{a()}));a()}})}return yield new Promise(l=>{r=l,o(e)}),s})}function ff(e){const{id:t,name:s,percentage:r,status:n,url:i,file:a,thumbnailUrl:o,type:l,fullPath:u,batchId:f}=e;return{id:t,name:s,percentage:r??null,status:n,url:i??null,file:a??null,thumbnailUrl:o??null,type:l??null,fullPath:u??null,batchId:f??null}}function cf(e,t,s){return e=e.toLowerCase(),t=t.toLocaleLowerCase(),s=s.toLocaleLowerCase(),s.split(",").map(n=>n.trim()).filter(Boolean).some(n=>{if(n.startsWith(".")){if(e.endsWith(n))return!0}else if(n.includes("/")){const[i,a]=t.split("/"),[o,l]=n.split("/");if((o==="*"||i&&o&&o===i)&&(l==="*"||a&&l&&l===a))return!0}else return!0;return!1})}const Aa=(e,t)=>{if(!e)return;const s=document.createElement("a");s.href=e,t!==void 0&&(s.download=t),document.body.appendChild(s),s.click(),document.body.removeChild(s)},Ha=h("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},h("path",{d:"M6 5C5.75454 5 5.55039 5.17688 5.50806 5.41012L5.5 5.5V14.5C5.5 14.7761 5.72386 15 6 15C6.24546 15 6.44961 14.8231 6.49194 14.5899L6.5 14.5V5.5C6.5 5.22386 6.27614 5 6 5ZM13.8536 5.14645C13.68 4.97288 13.4106 4.9536 13.2157 5.08859L13.1464 5.14645L8.64645 9.64645C8.47288 9.82001 8.4536 10.0894 8.58859 10.2843L8.64645 10.3536L13.1464 14.8536C13.3417 15.0488 13.6583 15.0488 13.8536 14.8536C14.0271 14.68 14.0464 14.4106 13.9114 14.2157L13.8536 14.1464L9.70711 10L13.8536 5.85355C14.0488 5.65829 14.0488 5.34171 13.8536 5.14645Z",fill:"currentColor"})),Ua=h("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},h("path",{d:"M13.5 5C13.7455 5 13.9496 5.17688 13.9919 5.41012L14 5.5V14.5C14 14.7761 13.7761 15 13.5 15C13.2545 15 13.0504 14.8231 13.0081 14.5899L13 14.5V5.5C13 5.22386 13.2239 5 13.5 5ZM5.64645 5.14645C5.82001 4.97288 6.08944 4.9536 6.28431 5.08859L6.35355 5.14645L10.8536 9.64645C11.0271 9.82001 11.0464 10.0894 10.9114 10.2843L10.8536 10.3536L6.35355 14.8536C6.15829 15.0488 5.84171 15.0488 5.64645 14.8536C5.47288 14.68 5.4536 14.4106 5.58859 14.2157L5.64645 14.1464L9.79289 10L5.64645 5.85355C5.45118 5.65829 5.45118 5.34171 5.64645 5.14645Z",fill:"currentColor"})),za=h("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},h("path",{d:"M4.089 4.216l.057-.07a.5.5 0 0 1 .638-.057l.07.057L10 9.293l5.146-5.147a.5.5 0 0 1 .638-.057l.07.057a.5.5 0 0 1 .057.638l-.057.07L10.707 10l5.147 5.146a.5.5 0 0 1 .057.638l-.057.07a.5.5 0 0 1-.638.057l-.07-.057L10 10.707l-5.146 5.147a.5.5 0 0 1-.638.057l-.07-.057a.5.5 0 0 1-.057-.638l.057-.07L9.293 10L4.146 4.854a.5.5 0 0 1-.057-.638l.057-.07l-.057.07z",fill:"currentColor"})),Ga=h("svg",{xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",viewBox:"0 0 1024 1024"},h("path",{fill:"currentColor",d:"M505.7 661a8 8 0 0 0 12.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"})),ja=K([K("body >",[H("image-container","position: fixed;")]),H("image-preview-container",` - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - display: flex; - `),H("image-preview-overlay",` - z-index: -1; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - background: rgba(0, 0, 0, .3); - `,[ds()]),H("image-preview-toolbar",` - z-index: 1; - position: absolute; - left: 50%; - transform: translateX(-50%); - border-radius: var(--n-toolbar-border-radius); - height: 48px; - bottom: 40px; - padding: 0 12px; - background: var(--n-toolbar-color); - box-shadow: var(--n-toolbar-box-shadow); - color: var(--n-toolbar-icon-color); - transition: color .3s var(--n-bezier); - display: flex; - align-items: center; - `,[H("base-icon",` - padding: 0 8px; - font-size: 28px; - cursor: pointer; - `),ds()]),H("image-preview-wrapper",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - display: flex; - pointer-events: none; - `,[ei()]),H("image-preview",` - user-select: none; - -webkit-user-select: none; - pointer-events: all; - margin: auto; - max-height: calc(100vh - 32px); - max-width: calc(100vw - 32px); - transition: transform .3s var(--n-bezier); - `),H("image",` - display: inline-flex; - max-height: 100%; - max-width: 100%; - `,[Ot("preview-disabled",` - cursor: pointer; - `),K("img",` - border-radius: inherit; - `)])]),_t=32,$r=he({name:"ImagePreview",props:Object.assign(Object.assign({},Ms),{onNext:Function,onPrev:Function,clsPrefix:{type:String,required:!0}}),setup(e){const t=Ie("Image","-image",ja,ti,e,Rt(e,"clsPrefix"));let s=null;const r=F(null),n=F(null),i=F(void 0),a=F(!1),o=F(!1),{localeRef:l}=Si("Image");function u(){const{value:v}=n;if(!s||!v)return;const{style:y}=v,p=s.getBoundingClientRect(),L=p.left+p.width/2,W=p.top+p.height/2;y.transformOrigin=`${L}px ${W}px`}function f(v){var y,p;switch(v.key){case" ":v.preventDefault();break;case"ArrowLeft":(y=e.onPrev)===null||y===void 0||y.call(e);break;case"ArrowRight":(p=e.onNext)===null||p===void 0||p.call(e);break;case"Escape":Bs();break}}si(a,v=>{v?Kt("keydown",document,f):yt("keydown",document,f)}),_s(()=>{yt("keydown",document,f)});let w=0,M=0,P=0,I=0,$=0,b=0,x=0,_=0,G=!1;function Q(v){const{clientX:y,clientY:p}=v;P=y-w,I=p-M,gr(oe)}function ae(v){const{mouseUpClientX:y,mouseUpClientY:p,mouseDownClientX:L,mouseDownClientY:W}=v,q=L-y,se=W-p,le=`vertical${se>0?"Top":"Bottom"}`,Re=`horizontal${q>0?"Left":"Right"}`;return{moveVerticalDirection:le,moveHorizontalDirection:Re,deltaHorizontal:q,deltaVertical:se}}function ye(v){const{value:y}=r;if(!y)return{offsetX:0,offsetY:0};const p=y.getBoundingClientRect(),{moveVerticalDirection:L,moveHorizontalDirection:W,deltaHorizontal:q,deltaVertical:se}=v||{};let le=0,Re=0;return p.width<=window.innerWidth?le=0:p.left>0?le=(p.width-window.innerWidth)/2:p.right0?Re=(p.height-window.innerHeight)/2:p.bottom.5){const v=X;Ue-=1,X=Math.max(.5,Math.pow(Jt,Ue));const y=v-X;oe(!1);const p=ye();X+=y,oe(!1),X-=y,P=p.offsetX,I=p.offsetY,oe()}}function An(){const v=i.value;v&&Aa(v,void 0)}function oe(v=!0){var y;const{value:p}=r;if(!p)return;const{style:L}=p,W=ai((y=z==null?void 0:z.previewedImgPropsRef.value)===null||y===void 0?void 0:y.style);let q="";if(typeof W=="string")q=W+";";else for(const le in W)q+=`${ba(le)}: ${W[le]};`;const se=`transform-origin: center; transform: translateX(${P}px) translateY(${I}px) rotate(${ze}deg) scale(${X});`;G?L.cssText=q+"cursor: grabbing; transition: none;"+se:L.cssText=q+"cursor: grab;"+se+(v?"":"transition: none;"),v||p.offsetHeight}function Bs(){a.value=!a.value,o.value=!0}function Hn(){X=Vs(),Ue=Math.ceil(Math.log(X)/Math.log(Jt)),P=0,I=0,oe()}const Un={setPreviewSrc:v=>{i.value=v},setThumbnailEl:v=>{s=v},toggleShow:Bs};function zn(v,y){if(e.showToolbarTooltip){const{value:p}=t;return h(Pr,{to:!1,theme:p.peers.Tooltip,themeOverrides:p.peerOverrides.Tooltip,keepAliveOnHover:!1},{default:()=>l.value[y],trigger:()=>v})}else return v}const Zs=j(()=>{const{common:{cubicBezierEaseInOut:v},self:{toolbarIconColor:y,toolbarBorderRadius:p,toolbarBoxShadow:L,toolbarColor:W}}=t.value;return{"--n-bezier":v,"--n-toolbar-icon-color":y,"--n-toolbar-color":W,"--n-toolbar-border-radius":p,"--n-toolbar-box-shadow":L}}),{inlineThemeDisabled:Xs}=$e(),Ge=Xs?pr("image-preview",void 0,Zs,e):void 0;return Object.assign({previewRef:r,previewWrapperRef:n,previewSrc:i,show:a,appear:ri(),displayed:o,previewedImgProps:z==null?void 0:z.previewedImgPropsRef,handleWheel(v){v.preventDefault()},handlePreviewMousedown:gt,handlePreviewDblclick:Ye,syncTransformOrigin:u,handleAfterLeave:()=>{Qt(),ze=0,o.value=!1},handleDragStart:v=>{var y,p;(p=(y=z==null?void 0:z.previewedImgPropsRef.value)===null||y===void 0?void 0:y.onDragstart)===null||p===void 0||p.call(y,v),v.preventDefault()},zoomIn:Fn,zoomOut:$n,handleDownloadClick:An,rotateCounterclockwise:Ln,rotateClockwise:Wn,handleSwitchPrev:Nn,handleSwitchNext:In,withTooltip:zn,resizeToOrignalImageSize:Hn,cssVars:Xs?void 0:Zs,themeClass:Ge==null?void 0:Ge.themeClass,onRender:Ge==null?void 0:Ge.onRender},Un)},render(){var e,t;const{clsPrefix:s}=this;return h(Qs,null,(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e),h(ni,{show:this.show},{default:()=>{var r;return this.show||this.displayed?((r=this.onRender)===null||r===void 0||r.call(this),Js(h("div",{class:[`${s}-image-preview-container`,this.themeClass],style:this.cssVars,onWheel:this.handleWheel},h(xt,{name:"fade-in-transition",appear:this.appear},{default:()=>this.show?h("div",{class:`${s}-image-preview-overlay`,onClick:this.toggleShow}):null}),this.showToolbar?h(xt,{name:"fade-in-transition",appear:this.appear},{default:()=>{if(!this.show)return null;const{withTooltip:n}=this;return h("div",{class:`${s}-image-preview-toolbar`},this.onPrev?h(Qs,null,n(h(_e,{clsPrefix:s,onClick:this.handleSwitchPrev},{default:()=>Ha}),"tipPrevious"),n(h(_e,{clsPrefix:s,onClick:this.handleSwitchNext},{default:()=>Ua}),"tipNext")):null,n(h(_e,{clsPrefix:s,onClick:this.rotateCounterclockwise},{default:()=>h(xa,null)}),"tipCounterclockwise"),n(h(_e,{clsPrefix:s,onClick:this.rotateClockwise},{default:()=>h(Sa,null)}),"tipClockwise"),n(h(_e,{clsPrefix:s,onClick:this.resizeToOrignalImageSize},{default:()=>h(Da,null)}),"tipOriginalSize"),n(h(_e,{clsPrefix:s,onClick:this.zoomOut},{default:()=>h(Ma,null)}),"tipZoomOut"),n(h(_e,{clsPrefix:s,onClick:this.zoomIn},{default:()=>h(ka,null)}),"tipZoomIn"),n(h(_e,{clsPrefix:s,onClick:this.handleDownloadClick},{default:()=>Ga}),"tipDownload"),n(h(_e,{clsPrefix:s,onClick:this.toggleShow},{default:()=>za}),"tipClose"))}}):null,h(xt,{name:"fade-in-scale-up-transition",onAfterLeave:this.handleAfterLeave,appear:this.appear,onEnter:this.syncTransformOrigin,onBeforeLeave:this.syncTransformOrigin},{default:()=>{const{previewedImgProps:n={}}=this;return Js(h("div",{class:`${s}-image-preview-wrapper`,ref:"previewWrapperRef"},h("img",Object.assign({},n,{draggable:!1,onMousedown:this.handlePreviewMousedown,onDblclick:this.handlePreviewDblclick,class:[`${s}-image-preview`,n.class],key:this.previewSrc,src:this.previewSrc,ref:"previewRef",onDragstart:this.handleDragStart}))),[[ys,this.show]])}})),[[ii,{enabled:this.show}]])):null}}))}}),Ar=Ss("n-image-group"),Va=Ms,hf=he({name:"ImageGroup",props:Va,setup(e){let t;const{mergedClsPrefixRef:s}=$e(e),r=`c${oi()}`,n=vr(),i=l=>{var u;t=l,(u=o.value)===null||u===void 0||u.setPreviewSrc(l)};function a(l){var u,f;if(!(n!=null&&n.proxy))return;const M=n.proxy.$el.parentElement.querySelectorAll(`[data-group-id=${r}]:not([data-error=true])`);if(!M.length)return;const P=Array.from(M).findIndex(I=>I.dataset.previewSrc===t);~P?i(M[(P+l+M.length)%M.length].dataset.previewSrc):i(M[0].dataset.previewSrc),l===1?(u=e.onPreviewNext)===null||u===void 0||u.call(e):(f=e.onPreviewPrev)===null||f===void 0||f.call(e)}Ft(Ar,{mergedClsPrefixRef:s,setPreviewSrc:i,setThumbnailEl:l=>{var u;(u=o.value)===null||u===void 0||u.setThumbnailEl(l)},toggleShow:()=>{var l;(l=o.value)===null||l===void 0||l.toggleShow()},groupId:r});const o=F(null);return{mergedClsPrefix:s,previewInstRef:o,next:()=>{a(1)},prev:()=>{a(-1)}}},render(){return h($r,{theme:this.theme,themeOverrides:this.themeOverrides,clsPrefix:this.mergedClsPrefix,ref:"previewInstRef",onPrev:this.prev,onNext:this.next,showToolbar:this.showToolbar,showToolbarTooltip:this.showToolbarTooltip},this.$slots)}}),Ba=Object.assign({alt:String,height:[String,Number],imgProps:Object,previewedImgProps:Object,lazy:Boolean,intersectionObserverOptions:Object,objectFit:{type:String,default:"fill"},previewSrc:String,fallbackSrc:String,width:[String,Number],src:String,previewDisabled:Boolean,loadDescription:String,onError:Function,onLoad:Function},Ms),mf=he({name:"Image",props:Ba,inheritAttrs:!1,setup(e){const t=F(null),s=F(!1),r=F(null),n=xs(Ar,null),{mergedClsPrefixRef:i}=n||$e(e),a={click:()=>{if(e.previewDisabled||s.value)return;const u=e.previewSrc||e.src;if(n){n.setPreviewSrc(u),n.setThumbnailEl(t.value),n.toggleShow();return}const{value:f}=r;f&&(f.setPreviewSrc(u),f.setThumbnailEl(t.value),f.toggleShow())}},o=F(!e.lazy);us(()=>{var u;(u=t.value)===null||u===void 0||u.setAttribute("data-group-id",(n==null?void 0:n.groupId)||"")}),us(()=>{if(e.lazy&&e.intersectionObserverOptions){let u;const f=fs(()=>{u==null||u(),u=void 0,u=Ya(t.value,e.intersectionObserverOptions,o)});_s(()=>{f(),u==null||u()})}}),fs(()=>{var u;e.src,(u=e.imgProps)===null||u===void 0||u.src,s.value=!1});const l=F(!1);return Ft(Wr,{previewedImgPropsRef:Rt(e,"previewedImgProps")}),Object.assign({mergedClsPrefix:i,groupId:n==null?void 0:n.groupId,previewInstRef:r,imageRef:t,showError:s,shouldStartLoading:o,loaded:l,mergedOnClick:u=>{var f,w;a.click(),(w=(f=e.imgProps)===null||f===void 0?void 0:f.onClick)===null||w===void 0||w.call(f,u)},mergedOnError:u=>{if(!o.value)return;s.value=!0;const{onError:f,imgProps:{onError:w}={}}=e;f==null||f(u),w==null||w(u)},mergedOnLoad:u=>{const{onLoad:f,imgProps:{onLoad:w}={}}=e;f==null||f(u),w==null||w(u),l.value=!0}},a)},render(){var e,t;const{mergedClsPrefix:s,imgProps:r={},loaded:n,$attrs:i,lazy:a}=this,o=(t=(e=this.$slots).placeholder)===null||t===void 0?void 0:t.call(e),l=this.src||r.src,u=h("img",Object.assign(Object.assign({},r),{ref:"imageRef",width:this.width||r.width,height:this.height||r.height,src:this.showError?this.fallbackSrc:a&&this.intersectionObserverOptions?this.shouldStartLoading?l:void 0:l,alt:this.alt||r.alt,"aria-label":this.alt||r.alt,onClick:this.mergedOnClick,onError:this.mergedOnError,onLoad:this.mergedOnLoad,loading:Oa&&a&&!this.intersectionObserverOptions?"lazy":"eager",style:[r.style||"",o&&!n?{height:"0",width:"0",visibility:"hidden"}:"",{objectFit:this.objectFit}],"data-error":this.showError,"data-preview-src":this.previewSrc||this.src}));return h("div",Object.assign({},i,{role:"none",class:[i.class,`${s}-image`,(this.previewDisabled||this.showError)&&`${s}-image--preview-disabled`]}),this.groupId?u:h($r,{theme:this.theme,themeOverrides:this.themeOverrides,clsPrefix:s,ref:"previewInstRef",showToolbar:this.showToolbar,showToolbarTooltip:this.showToolbarTooltip},{default:()=>u}),!n&&o)}}),Za=K([K("@keyframes spin-rotate",` - from { - transform: rotate(0); - } - to { - transform: rotate(360deg); - } - `),H("spin-container",{position:"relative"},[H("spin-body",` - position: absolute; - top: 50%; - left: 50%; - transform: translateX(-50%) translateY(-50%); - `,[ds()])]),H("spin-body",` - display: inline-flex; - align-items: center; - justify-content: center; - flex-direction: column; - `),H("spin",` - display: inline-flex; - height: var(--n-size); - width: var(--n-size); - font-size: var(--n-size); - color: var(--n-color); - `,[de("rotate",` - animation: spin-rotate 2s linear infinite; - `)]),H("spin-description",` - display: inline-block; - font-size: var(--n-font-size); - color: var(--n-text-color); - transition: color .3s var(--n-bezier); - margin-top: 8px; - `),H("spin-content",` - opacity: 1; - transition: opacity .3s var(--n-bezier); - pointer-events: all; - `,[de("spinning",` - user-select: none; - -webkit-user-select: none; - pointer-events: none; - opacity: var(--n-opacity-spinning); - `)])]),Xa={small:20,medium:18,large:16},qa=Object.assign(Object.assign({},Ie.props),{contentClass:String,contentStyle:[Object,String],description:String,stroke:String,size:{type:[String,Number],default:"medium"},show:{type:Boolean,default:!0},strokeWidth:Number,rotate:{type:Boolean,default:!0},spinning:{type:Boolean,validator:()=>!0,default:void 0},delay:Number}),vf=he({name:"Spin",props:qa,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:s}=$e(e),r=Ie("Spin","-spin",Za,di,e,t),n=j(()=>{const{size:l}=e,{common:{cubicBezierEaseInOut:u},self:f}=r.value,{opacitySpinning:w,color:M,textColor:P}=f,I=typeof l=="number"?We(l):f[li("size",l)];return{"--n-bezier":u,"--n-opacity-spinning":w,"--n-size":I,"--n-color":M,"--n-text-color":P}}),i=s?pr("spin",j(()=>{const{size:l}=e;return typeof l=="number"?String(l):l[0]}),n,e):void 0,a=xi(e,["spinning","show"]),o=F(!1);return fs(l=>{let u;if(a.value){const{delay:f}=e;if(f){u=window.setTimeout(()=>{o.value=!0},f),l(()=>{clearTimeout(u)});return}}o.value=a.value}),{mergedClsPrefix:t,active:o,mergedStrokeWidth:j(()=>{const{strokeWidth:l}=e;if(l!==void 0)return l;const{size:u}=e;return Xa[typeof u=="number"?"medium":u]}),cssVars:s?void 0:n,themeClass:i==null?void 0:i.themeClass,onRender:i==null?void 0:i.onRender}},render(){var e,t;const{$slots:s,mergedClsPrefix:r,description:n}=this,i=s.icon&&this.rotate,a=(n||s.description)&&h("div",{class:`${r}-spin-description`},n||((e=s.description)===null||e===void 0?void 0:e.call(s))),o=s.icon?h("div",{class:[`${r}-spin-body`,this.themeClass]},h("div",{class:[`${r}-spin`,i&&`${r}-spin--rotate`],style:s.default?"":this.cssVars},s.icon()),a):h("div",{class:[`${r}-spin-body`,this.themeClass]},h(ui,{clsPrefix:r,style:s.default?"":this.cssVars,stroke:this.stroke,"stroke-width":this.mergedStrokeWidth,class:`${r}-spin`}),a);return(t=this.onRender)===null||t===void 0||t.call(this),s.default?h("div",{class:[`${r}-spin-container`,this.themeClass],style:this.cssVars},h("div",{class:[`${r}-spin-content`,this.active&&`${r}-spin-content--spinning`,this.contentClass],style:this.contentStyle},s),h(xt,{name:"fade-in-transition"},{default:()=>this.active?o:null})):o}}),pf=he({__name:"index",props:{title:null,show:{type:Boolean},size:null},emits:["update:show"],setup(e,{emit:t}){const s=e,r=fi(),n=j(()=>({class:r.class||"",style:r.style||""})),i=j({get:()=>s.show,set:a=>{t("update:show",a)}});return(a,o)=>(ci(),hi(es(vi),Yt({show:es(i),"onUpdate:show":o[0]||(o[0]=l=>mi(i)?i.value=l:null),preset:"card",size:e.size},es(n),{style:[{"border-radius":"1rem"},a.$parent],title:e.title}),{cover:je(()=>[Ve(a.$slots,"cover")]),header:je(()=>[Ve(a.$slots,"header")]),"eader-extra":je(()=>[Ve(a.$slots,"header-extra")]),footer:je(()=>[Ve(a.$slots,"footer")]),action:je(()=>[Ve(a.$slots,"action")]),default:je(()=>[Ve(a.$slots,"default")]),_:3},16,["show","size","style","title"]))}});//! moment.js -//! version : 2.29.4 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -var Hr;function c(){return Hr.apply(null,arguments)}function Ja(e){Hr=e}function fe(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function Fe(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Ds(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(O(e,t))return!1;return!0}function J(e){return e===void 0}function De(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function ht(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function Ur(e,t){var s=[],r,n=e.length;for(r=0;r>>0,r;for(r=0;r0)for(s=0;s=0;return(i?s?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+r}var Rs=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,bt=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,as={},et={};function g(e,t,s,r){var n=r;typeof r=="string"&&(n=function(){return this[r]()}),e&&(et[e]=n),t&&(et[t[0]]=function(){return pe(n.apply(this,arguments),t[1],t[2])}),s&&(et[s]=function(){return this.localeData().ordinal(n.apply(this,arguments),e)})}function so(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function ro(e){var t=e.match(Rs),s,r;for(s=0,r=t.length;s=0&&bt.test(e);)e=e.replace(bt,r),bt.lastIndex=0,s-=1;return e}var no={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function io(e){var t=this._longDateFormat[e],s=this._longDateFormat[e.toUpperCase()];return t||!s?t:(this._longDateFormat[e]=s.match(Rs).map(function(r){return r==="MMMM"||r==="MM"||r==="DD"||r==="dddd"?r.slice(1):r}).join(""),this._longDateFormat[e])}var ao="Invalid date";function oo(){return this._invalidDate}var lo="%d",uo=/\d{1,2}/;function fo(e){return this._ordinal.replace("%d",e)}var co={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function ho(e,t,s,r){var n=this._relativeTime[s];return we(n)?n(e,t,s,r):n.replace(/%d/i,e)}function mo(e,t){var s=this._relativeTime[e>0?"future":"past"];return we(s)?s(t):s.replace(/%s/i,t)}var lt={};function B(e,t){var s=e.toLowerCase();lt[s]=lt[s+"s"]=lt[t]=e}function ie(e){return typeof e=="string"?lt[e]||lt[e.toLowerCase()]:void 0}function Ts(e){var t={},s,r;for(r in e)O(e,r)&&(s=ie(r),s&&(t[s]=e[r]));return t}var Vr={};function Z(e,t){Vr[e]=t}function vo(e){var t=[],s;for(s in e)O(e,s)&&t.push({unit:s,priority:Vr[s]});return t.sort(function(r,n){return r.priority-n.priority}),t}function At(e){return e%4===0&&e%100!==0||e%400===0}function re(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function k(e){var t=+e,s=0;return t!==0&&isFinite(t)&&(s=re(t)),s}function rt(e,t){return function(s){return s!=null?(Br(this,e,s),c.updateOffset(this,t),this):Tt(this,e)}}function Tt(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Br(e,t,s){e.isValid()&&!isNaN(s)&&(t==="FullYear"&&At(e.year())&&e.month()===1&&e.date()===29?(s=k(s),e._d["set"+(e._isUTC?"UTC":"")+t](s,e.month(),Vt(s,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](s))}function po(e){return e=ie(e),we(this[e])?this[e]():this}function go(e,t){if(typeof e=="object"){e=Ts(e);var s=vo(e),r,n=s.length;for(r=0;r68?1900:2e3)};var rn=rt("FullYear",!0);function Wo(){return At(this.year())}function Eo(e,t,s,r,n,i,a){var o;return e<100&&e>=0?(o=new Date(e+400,t,s,r,n,i,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,s,r,n,i,a),o}function dt(e){var t,s;return e<100&&e>=0?(s=Array.prototype.slice.call(arguments),s[0]=e+400,t=new Date(Date.UTC.apply(null,s)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Nt(e,t,s){var r=7+t-s,n=(7+dt(e,0,r).getUTCDay()-t)%7;return-n+r-1}function nn(e,t,s,r,n){var i=(7+s-r)%7,a=Nt(e,r,n),o=1+7*(t-1)+i+a,l,u;return o<=0?(l=e-1,u=ut(l)+o):o>ut(e)?(l=e+1,u=o-ut(e)):(l=e,u=o),{year:l,dayOfYear:u}}function ft(e,t,s){var r=Nt(e.year(),t,s),n=Math.floor((e.dayOfYear()-r-1)/7)+1,i,a;return n<1?(a=e.year()-1,i=n+Me(a,t,s)):n>Me(e.year(),t,s)?(i=n-Me(e.year(),t,s),a=e.year()+1):(a=e.year(),i=n),{week:i,year:a}}function Me(e,t,s){var r=Nt(e,t,s),n=Nt(e+1,t,s);return(ut(e)-r+n)/7}g("w",["ww",2],"wo","week");g("W",["WW",2],"Wo","isoWeek");B("week","w");B("isoWeek","W");Z("week",5);Z("isoWeek",5);m("w",T);m("ww",T,te);m("W",T);m("WW",T,te);pt(["w","ww","W","WW"],function(e,t,s,r){t[r.substr(0,1)]=k(e)});function Fo(e){return ft(e,this._week.dow,this._week.doy).week}var $o={dow:0,doy:6};function Ao(){return this._week.dow}function Ho(){return this._week.doy}function Uo(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function zo(e){var t=ft(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}g("d",0,"do","day");g("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});g("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});g("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});g("e",0,0,"weekday");g("E",0,0,"isoWeekday");B("day","d");B("weekday","e");B("isoWeekday","E");Z("day",11);Z("weekday",11);Z("isoWeekday",11);m("d",T);m("e",T);m("E",T);m("dd",function(e,t){return t.weekdaysMinRegex(e)});m("ddd",function(e,t){return t.weekdaysShortRegex(e)});m("dddd",function(e,t){return t.weekdaysRegex(e)});pt(["dd","ddd","dddd"],function(e,t,s,r){var n=s._locale.weekdaysParse(e,r,s._strict);n!=null?t.d=n:S(s).invalidWeekday=e});pt(["d","e","E"],function(e,t,s,r){t[r]=k(e)});function Go(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function jo(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Is(e,t){return e.slice(t,7).concat(e.slice(0,t))}var Vo="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),an="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Bo="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Zo=vt,Xo=vt,qo=vt;function Jo(e,t){var s=fe(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Is(s,this._week.dow):e?s[e.day()]:s}function Qo(e){return e===!0?Is(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function Ko(e){return e===!0?Is(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function el(e,t,s){var r,n,i,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)i=ge([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(i,"").toLocaleLowerCase();return s?t==="dddd"?(n=A.call(this._weekdaysParse,a),n!==-1?n:null):t==="ddd"?(n=A.call(this._shortWeekdaysParse,a),n!==-1?n:null):(n=A.call(this._minWeekdaysParse,a),n!==-1?n:null):t==="dddd"?(n=A.call(this._weekdaysParse,a),n!==-1||(n=A.call(this._shortWeekdaysParse,a),n!==-1)?n:(n=A.call(this._minWeekdaysParse,a),n!==-1?n:null)):t==="ddd"?(n=A.call(this._shortWeekdaysParse,a),n!==-1||(n=A.call(this._weekdaysParse,a),n!==-1)?n:(n=A.call(this._minWeekdaysParse,a),n!==-1?n:null)):(n=A.call(this._minWeekdaysParse,a),n!==-1||(n=A.call(this._weekdaysParse,a),n!==-1)?n:(n=A.call(this._shortWeekdaysParse,a),n!==-1?n:null))}function tl(e,t,s){var r,n,i;if(this._weekdaysParseExact)return el.call(this,e,t,s);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(n=ge([2e3,1]).day(r),s&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(n,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(n,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(n,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(i="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[r]=new RegExp(i.replace(".",""),"i")),s&&t==="dddd"&&this._fullWeekdaysParse[r].test(e))return r;if(s&&t==="ddd"&&this._shortWeekdaysParse[r].test(e))return r;if(s&&t==="dd"&&this._minWeekdaysParse[r].test(e))return r;if(!s&&this._weekdaysParse[r].test(e))return r}}function sl(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=Go(e,this.localeData()),this.add(e-t,"d")):t}function rl(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function nl(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=jo(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function il(e){return this._weekdaysParseExact?(O(this,"_weekdaysRegex")||Ls.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(O(this,"_weekdaysRegex")||(this._weekdaysRegex=Zo),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function al(e){return this._weekdaysParseExact?(O(this,"_weekdaysRegex")||Ls.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(O(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Xo),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function ol(e){return this._weekdaysParseExact?(O(this,"_weekdaysRegex")||Ls.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(O(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=qo),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Ls(){function e(f,w){return w.length-f.length}var t=[],s=[],r=[],n=[],i,a,o,l,u;for(i=0;i<7;i++)a=ge([2e3,1]).day(i),o=ee(this.weekdaysMin(a,"")),l=ee(this.weekdaysShort(a,"")),u=ee(this.weekdays(a,"")),t.push(o),s.push(l),r.push(u),n.push(o),n.push(l),n.push(u);t.sort(e),s.sort(e),r.sort(e),n.sort(e),this._weekdaysRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Ws(){return this.hours()%12||12}function ll(){return this.hours()||24}g("H",["HH",2],0,"hour");g("h",["hh",2],0,Ws);g("k",["kk",2],0,ll);g("hmm",0,0,function(){return""+Ws.apply(this)+pe(this.minutes(),2)});g("hmmss",0,0,function(){return""+Ws.apply(this)+pe(this.minutes(),2)+pe(this.seconds(),2)});g("Hmm",0,0,function(){return""+this.hours()+pe(this.minutes(),2)});g("Hmmss",0,0,function(){return""+this.hours()+pe(this.minutes(),2)+pe(this.seconds(),2)});function on(e,t){g(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}on("a",!0);on("A",!1);B("hour","h");Z("hour",13);function ln(e,t){return t._meridiemParse}m("a",ln);m("A",ln);m("H",T);m("h",T);m("k",T);m("HH",T,te);m("hh",T,te);m("kk",T,te);m("hmm",qr);m("hmmss",Jr);m("Hmm",qr);m("Hmmss",Jr);Y(["H","HH"],U);Y(["k","kk"],function(e,t,s){var r=k(e);t[U]=r===24?0:r});Y(["a","A"],function(e,t,s){s._isPm=s._locale.isPM(e),s._meridiem=e});Y(["h","hh"],function(e,t,s){t[U]=k(e),S(s).bigHour=!0});Y("hmm",function(e,t,s){var r=e.length-2;t[U]=k(e.substr(0,r)),t[ue]=k(e.substr(r)),S(s).bigHour=!0});Y("hmmss",function(e,t,s){var r=e.length-4,n=e.length-2;t[U]=k(e.substr(0,r)),t[ue]=k(e.substr(r,2)),t[ke]=k(e.substr(n)),S(s).bigHour=!0});Y("Hmm",function(e,t,s){var r=e.length-2;t[U]=k(e.substr(0,r)),t[ue]=k(e.substr(r))});Y("Hmmss",function(e,t,s){var r=e.length-4,n=e.length-2;t[U]=k(e.substr(0,r)),t[ue]=k(e.substr(r,2)),t[ke]=k(e.substr(n))});function ul(e){return(e+"").toLowerCase().charAt(0)==="p"}var dl=/[ap]\.?m?\.?/i,fl=rt("Hours",!0);function cl(e,t,s){return e>11?s?"pm":"PM":s?"am":"AM"}var un={calendar:eo,longDateFormat:no,invalidDate:ao,ordinal:lo,dayOfMonthOrdinalParse:uo,relativeTime:co,months:Do,monthsShort:Qr,week:$o,weekdays:Vo,weekdaysMin:Bo,weekdaysShort:an,meridiemParse:dl},N={},at={},ct;function hl(e,t){var s,r=Math.min(e.length,t.length);for(s=0;s0;){if(n=Bt(i.slice(0,s).join("-")),n)return n;if(r&&r.length>=s&&hl(i,r)>=s-1)break;s--}t++}return ct}function vl(e){return e.match("^[^/\\\\]*$")!=null}function Bt(e){var t=null,s;if(N[e]===void 0&&typeof module<"u"&&module&&module.exports&&vl(e))try{t=ct._abbr,s=require,s("./locale/"+e),Ne(t)}catch{N[e]=null}return N[e]}function Ne(e,t){var s;return e&&(J(t)?s=Oe(e):s=Es(e,t),s?ct=s:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ct._abbr}function Es(e,t){if(t!==null){var s,r=un;if(t.abbr=e,N[e]!=null)Gr("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=N[e]._config;else if(t.parentLocale!=null)if(N[t.parentLocale]!=null)r=N[t.parentLocale]._config;else if(s=Bt(t.parentLocale),s!=null)r=s._config;else return at[t.parentLocale]||(at[t.parentLocale]=[]),at[t.parentLocale].push({name:e,config:t}),null;return N[e]=new Ys(hs(r,t)),at[e]&&at[e].forEach(function(n){Es(n.name,n.config)}),Ne(e),N[e]}else return delete N[e],null}function pl(e,t){if(t!=null){var s,r,n=un;N[e]!=null&&N[e].parentLocale!=null?N[e].set(hs(N[e]._config,t)):(r=Bt(e),r!=null&&(n=r._config),t=hs(n,t),r==null&&(t.abbr=e),s=new Ys(t),s.parentLocale=N[e],N[e]=s),Ne(e)}else N[e]!=null&&(N[e].parentLocale!=null?(N[e]=N[e].parentLocale,e===Ne()&&Ne(e)):N[e]!=null&&delete N[e]);return N[e]}function Oe(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ct;if(!fe(e)){if(t=Bt(e),t)return t;e=[e]}return ml(e)}function gl(){return ms(N)}function Fs(e){var t,s=e._a;return s&&S(e).overflow===-2&&(t=s[xe]<0||s[xe]>11?xe:s[ve]<1||s[ve]>Vt(s[V],s[xe])?ve:s[U]<0||s[U]>24||s[U]===24&&(s[ue]!==0||s[ke]!==0||s[Ee]!==0)?U:s[ue]<0||s[ue]>59?ue:s[ke]<0||s[ke]>59?ke:s[Ee]<0||s[Ee]>999?Ee:-1,S(e)._overflowDayOfYear&&(tve)&&(t=ve),S(e)._overflowWeeks&&t===-1&&(t=xo),S(e)._overflowWeekday&&t===-1&&(t=ko),S(e).overflow=t),e}var wl=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yl=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_l=/Z|[+-]\d\d(?::?\d\d)?/,St=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],os=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],bl=/^\/?Date\((-?\d+)/i,Sl=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,xl={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function dn(e){var t,s,r=e._i,n=wl.exec(r)||yl.exec(r),i,a,o,l,u=St.length,f=os.length;if(n){for(S(e).iso=!0,t=0,s=u;tut(a)||e._dayOfYear===0)&&(S(e)._overflowDayOfYear=!0),s=dt(a,0,e._dayOfYear),e._a[xe]=s.getUTCMonth(),e._a[ve]=s.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=r[t]=n[t];for(;t<7;t++)e._a[t]=r[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[U]===24&&e._a[ue]===0&&e._a[ke]===0&&e._a[Ee]===0&&(e._nextDay=!0,e._a[U]=0),e._d=(e._useUTC?dt:Eo).apply(null,r),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[U]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==i&&(S(e).weekdayMismatch=!0)}}function Tl(e){var t,s,r,n,i,a,o,l,u;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(i=1,a=4,s=Qe(t.GG,e._a[V],ft(R(),1,4).year),r=Qe(t.W,1),n=Qe(t.E,1),(n<1||n>7)&&(l=!0)):(i=e._locale._week.dow,a=e._locale._week.doy,u=ft(R(),i,a),s=Qe(t.gg,e._a[V],u.year),r=Qe(t.w,u.week),t.d!=null?(n=t.d,(n<0||n>6)&&(l=!0)):t.e!=null?(n=t.e+i,(t.e<0||t.e>6)&&(l=!0)):n=i),r<1||r>Me(s,i,a)?S(e)._overflowWeeks=!0:l!=null?S(e)._overflowWeekday=!0:(o=nn(s,r,n,i,a),e._a[V]=o.year,e._dayOfYear=o.dayOfYear)}c.ISO_8601=function(){};c.RFC_2822=function(){};function As(e){if(e._f===c.ISO_8601){dn(e);return}if(e._f===c.RFC_2822){fn(e);return}e._a=[],S(e).empty=!0;var t=""+e._i,s,r,n,i,a,o=t.length,l=0,u,f;for(n=jr(e._f,e._locale).match(Rs)||[],f=n.length,s=0;s0&&S(e).unusedInput.push(a),t=t.slice(t.indexOf(r)+r.length),l+=r.length),et[i]?(r?S(e).empty=!1:S(e).unusedTokens.push(i),So(i,r,e)):e._strict&&!r&&S(e).unusedTokens.push(i);S(e).charsLeftOver=o-l,t.length>0&&S(e).unusedInput.push(t),e._a[U]<=12&&S(e).bigHour===!0&&e._a[U]>0&&(S(e).bigHour=void 0),S(e).parsedDateParts=e._a.slice(0),S(e).meridiem=e._meridiem,e._a[U]=Pl(e._locale,e._a[U],e._meridiem),u=S(e).era,u!==null&&(e._a[V]=e._locale.erasConvertYear(u,e._a[V])),$s(e),Fs(e)}function Pl(e,t,s){var r;return s==null?t:e.meridiemHour!=null?e.meridiemHour(t,s):(e.isPM!=null&&(r=e.isPM(s),r&&t<12&&(t+=12),!r&&t===12&&(t=0)),t)}function Nl(e){var t,s,r,n,i,a,o=!1,l=e._f.length;if(l===0){S(e).invalidFormat=!0,e._d=new Date(NaN);return}for(n=0;nthis?this:e:$t()});function mn(e,t){var s,r;if(t.length===1&&fe(t[0])&&(t=t[0]),!t.length)return R();for(s=t[0],r=1;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function eu(){if(!J(this._isDSTShifted))return this._isDSTShifted;var e={},t;return Cs(e,this),e=cn(e),e._a?(t=e._isUTC?ge(e._a):R(e._a),this._isDSTShifted=this.isValid()&&jl(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function tu(){return this.isValid()?!this._isUTC:!1}function su(){return this.isValid()?this._isUTC:!1}function pn(){return this.isValid()?this._isUTC&&this._offset===0:!1}var ru=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,nu=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function me(e,t){var s=e,r=null,n,i,a;return Mt(e)?s={ms:e._milliseconds,d:e._days,M:e._months}:De(e)||!isNaN(+e)?(s={},t?s[t]=+e:s.milliseconds=+e):(r=ru.exec(e))?(n=r[1]==="-"?-1:1,s={y:0,d:k(r[ve])*n,h:k(r[U])*n,m:k(r[ue])*n,s:k(r[ke])*n,ms:k(ps(r[Ee]*1e3))*n}):(r=nu.exec(e))?(n=r[1]==="-"?-1:1,s={y:Le(r[2],n),M:Le(r[3],n),w:Le(r[4],n),d:Le(r[5],n),h:Le(r[6],n),m:Le(r[7],n),s:Le(r[8],n)}):s==null?s={}:typeof s=="object"&&("from"in s||"to"in s)&&(a=iu(R(s.from),R(s.to)),s={},s.ms=a.milliseconds,s.M=a.months),i=new Zt(s),Mt(e)&&O(e,"_locale")&&(i._locale=e._locale),Mt(e)&&O(e,"_isValid")&&(i._isValid=e._isValid),i}me.fn=Zt.prototype;me.invalid=Gl;function Le(e,t){var s=e&&parseFloat(e.replace(",","."));return(isNaN(s)?0:s)*t}function fr(e,t){var s={};return s.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(s.months,"M").isAfter(t)&&--s.months,s.milliseconds=+t-+e.clone().add(s.months,"M"),s}function iu(e,t){var s;return e.isValid()&&t.isValid()?(t=Us(t,e),e.isBefore(t)?s=fr(e,t):(s=fr(t,e),s.milliseconds=-s.milliseconds,s.months=-s.months),s):{milliseconds:0,months:0}}function gn(e,t){return function(s,r){var n,i;return r!==null&&!isNaN(+r)&&(Gr(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),i=s,s=r,r=i),n=me(s,r),wn(this,n,e),this}}function wn(e,t,s,r){var n=t._milliseconds,i=ps(t._days),a=ps(t._months);e.isValid()&&(r=r??!0,a&&en(e,Tt(e,"Month")+a*s),i&&Br(e,"Date",Tt(e,"Date")+i*s),n&&e._d.setTime(e._d.valueOf()+n*s),r&&c.updateOffset(e,i||a))}var au=gn(1,"add"),ou=gn(-1,"subtract");function yn(e){return typeof e=="string"||e instanceof String}function lu(e){return ce(e)||ht(e)||yn(e)||De(e)||du(e)||uu(e)||e===null||e===void 0}function uu(e){var t=Fe(e)&&!Ds(e),s=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],n,i,a=r.length;for(n=0;ns.valueOf():s.valueOf()9999?kt(s,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):we(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",kt(s,"Z")):kt(s,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function ku(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",s,r,n,i;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),s="["+e+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n="-MM-DD[T]HH:mm:ss.SSS",i=t+'[")]',this.format(s+r+n+i)}function Mu(e){e||(e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat);var t=kt(this,e);return this.localeData().postformat(t)}function Du(e,t){return this.isValid()&&(ce(e)&&e.isValid()||R(e).isValid())?me({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Ou(e){return this.from(R(),e)}function Cu(e,t){return this.isValid()&&(ce(e)&&e.isValid()||R(e).isValid())?me({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Yu(e){return this.to(R(),e)}function _n(e){var t;return e===void 0?this._locale._abbr:(t=Oe(e),t!=null&&(this._locale=t),this)}var bn=ne("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function Sn(){return this._locale}var It=1e3,tt=60*It,Lt=60*tt,xn=(365*400+97)*24*Lt;function st(e,t){return(e%t+t)%t}function kn(e,t,s){return e<100&&e>=0?new Date(e+400,t,s)-xn:new Date(e,t,s).valueOf()}function Mn(e,t,s){return e<100&&e>=0?Date.UTC(e+400,t,s)-xn:Date.UTC(e,t,s)}function Ru(e){var t,s;if(e=ie(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(s=this._isUTC?Mn:kn,e){case"year":t=s(this.year(),0,1);break;case"quarter":t=s(this.year(),this.month()-this.month()%3,1);break;case"month":t=s(this.year(),this.month(),1);break;case"week":t=s(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=s(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=s(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=st(t+(this._isUTC?0:this.utcOffset()*tt),Lt);break;case"minute":t=this._d.valueOf(),t-=st(t,tt);break;case"second":t=this._d.valueOf(),t-=st(t,It);break}return this._d.setTime(t),c.updateOffset(this,!0),this}function Tu(e){var t,s;if(e=ie(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(s=this._isUTC?Mn:kn,e){case"year":t=s(this.year()+1,0,1)-1;break;case"quarter":t=s(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=s(this.year(),this.month()+1,1)-1;break;case"week":t=s(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=s(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=s(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Lt-st(t+(this._isUTC?0:this.utcOffset()*tt),Lt)-1;break;case"minute":t=this._d.valueOf(),t+=tt-st(t,tt)-1;break;case"second":t=this._d.valueOf(),t+=It-st(t,It)-1;break}return this._d.setTime(t),c.updateOffset(this,!0),this}function Pu(){return this._d.valueOf()-(this._offset||0)*6e4}function Nu(){return Math.floor(this.valueOf()/1e3)}function Iu(){return new Date(this.valueOf())}function Lu(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Wu(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function Eu(){return this.isValid()?this.toISOString():null}function Fu(){return Os(this)}function $u(){return Te({},S(this))}function Au(){return S(this).overflow}function Hu(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}g("N",0,0,"eraAbbr");g("NN",0,0,"eraAbbr");g("NNN",0,0,"eraAbbr");g("NNNN",0,0,"eraName");g("NNNNN",0,0,"eraNarrow");g("y",["y",1],"yo","eraYear");g("y",["yy",2],0,"eraYear");g("y",["yyy",3],0,"eraYear");g("y",["yyyy",4],0,"eraYear");m("N",zs);m("NN",zs);m("NNN",zs);m("NNNN",Qu);m("NNNNN",Ku);Y(["N","NN","NNN","NNNN","NNNNN"],function(e,t,s,r){var n=s._locale.erasParse(e,r,s._strict);n?S(s).era=n:S(s).invalidEra=e});m("y",nt);m("yy",nt);m("yyy",nt);m("yyyy",nt);m("yo",ed);Y(["y","yy","yyy","yyyy"],V);Y(["yo"],function(e,t,s,r){var n;s._locale._eraYearOrdinalRegex&&(n=e.match(s._locale._eraYearOrdinalRegex)),s._locale.eraYearOrdinalParse?t[V]=s._locale.eraYearOrdinalParse(e,n):t[V]=parseInt(e,10)});function Uu(e,t){var s,r,n,i=this._eras||Oe("en")._eras;for(s=0,r=i.length;s=0)return i[r]}function Gu(e,t){var s=e.since<=e.until?1:-1;return t===void 0?c(e.since).year():c(e.since).year()+(t-e.offset)*s}function ju(){var e,t,s,r=this.localeData().eras();for(e=0,t=r.length;ei&&(t=i),od.call(this,e,t,s,r,n))}function od(e,t,s,r,n){var i=nn(e,t,s,r,n),a=dt(i.year,0,i.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}g("Q",0,"Qo","quarter");B("quarter","Q");Z("quarter",7);m("Q",Zr);Y("Q",function(e,t){t[xe]=(k(e)-1)*3});function ld(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}g("D",["DD",2],"Do","date");B("date","D");Z("date",9);m("D",T);m("DD",T,te);m("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});Y(["D","DD"],ve);Y("Do",function(e,t){t[ve]=k(e.match(T)[0])});var On=rt("Date",!0);g("DDD",["DDDD",3],"DDDo","dayOfYear");B("dayOfYear","DDD");Z("dayOfYear",4);m("DDD",Ut);m("DDDD",Xr);Y(["DDD","DDDD"],function(e,t,s){s._dayOfYear=k(e)});function ud(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}g("m",["mm",2],0,"minute");B("minute","m");Z("minute",14);m("m",T);m("mm",T,te);Y(["m","mm"],ue);var dd=rt("Minutes",!1);g("s",["ss",2],0,"second");B("second","s");Z("second",15);m("s",T);m("ss",T,te);Y(["s","ss"],ke);var fd=rt("Seconds",!1);g("S",0,0,function(){return~~(this.millisecond()/100)});g(0,["SS",2],0,function(){return~~(this.millisecond()/10)});g(0,["SSS",3],0,"millisecond");g(0,["SSSS",4],0,function(){return this.millisecond()*10});g(0,["SSSSS",5],0,function(){return this.millisecond()*100});g(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});g(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});g(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});g(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});B("millisecond","ms");Z("millisecond",16);m("S",Ut,Zr);m("SS",Ut,te);m("SSS",Ut,Xr);var Pe,Cn;for(Pe="SSSS";Pe.length<=9;Pe+="S")m(Pe,nt);function cd(e,t){t[Ee]=k(("0."+e)*1e3)}for(Pe="S";Pe.length<=9;Pe+="S")Y(Pe,cd);Cn=rt("Milliseconds",!1);g("z",0,0,"zoneAbbr");g("zz",0,0,"zoneName");function hd(){return this._isUTC?"UTC":""}function md(){return this._isUTC?"Coordinated Universal Time":""}var d=mt.prototype;d.add=au;d.calendar=hu;d.clone=mu;d.diff=bu;d.endOf=Tu;d.format=Mu;d.from=Du;d.fromNow=Ou;d.to=Cu;d.toNow=Yu;d.get=po;d.invalidAt=Au;d.isAfter=vu;d.isBefore=pu;d.isBetween=gu;d.isSame=wu;d.isSameOrAfter=yu;d.isSameOrBefore=_u;d.isValid=Fu;d.lang=bn;d.locale=_n;d.localeData=Sn;d.max=Fl;d.min=El;d.parsingFlags=$u;d.set=go;d.startOf=Ru;d.subtract=ou;d.toArray=Lu;d.toObject=Wu;d.toDate=Iu;d.toISOString=xu;d.inspect=ku;typeof Symbol<"u"&&Symbol.for!=null&&(d[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});d.toJSON=Eu;d.toString=Su;d.unix=Nu;d.valueOf=Pu;d.creationData=Hu;d.eraName=ju;d.eraNarrow=Vu;d.eraAbbr=Bu;d.eraYear=Zu;d.year=rn;d.isLeapYear=Wo;d.weekYear=td;d.isoWeekYear=sd;d.quarter=d.quarters=ld;d.month=tn;d.daysInMonth=No;d.week=d.weeks=Uo;d.isoWeek=d.isoWeeks=zo;d.weeksInYear=id;d.weeksInWeekYear=ad;d.isoWeeksInYear=rd;d.isoWeeksInISOWeekYear=nd;d.date=On;d.day=d.days=sl;d.weekday=rl;d.isoWeekday=nl;d.dayOfYear=ud;d.hour=d.hours=fl;d.minute=d.minutes=dd;d.second=d.seconds=fd;d.millisecond=d.milliseconds=Cn;d.utcOffset=Bl;d.utc=Xl;d.local=ql;d.parseZone=Jl;d.hasAlignedHourOffset=Ql;d.isDST=Kl;d.isLocal=tu;d.isUtcOffset=su;d.isUtc=pn;d.isUTC=pn;d.zoneAbbr=hd;d.zoneName=md;d.dates=ne("dates accessor is deprecated. Use date instead.",On);d.months=ne("months accessor is deprecated. Use month instead",tn);d.years=ne("years accessor is deprecated. Use year instead",rn);d.zone=ne("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Zl);d.isDSTShifted=ne("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",eu);function vd(e){return R(e*1e3)}function pd(){return R.apply(null,arguments).parseZone()}function Yn(e){return e}var C=Ys.prototype;C.calendar=to;C.longDateFormat=io;C.invalidDate=oo;C.ordinal=fo;C.preparse=Yn;C.postformat=Yn;C.relativeTime=ho;C.pastFuture=mo;C.set=Ka;C.eras=Uu;C.erasParse=zu;C.erasConvertYear=Gu;C.erasAbbrRegex=qu;C.erasNameRegex=Xu;C.erasNarrowRegex=Ju;C.months=Yo;C.monthsShort=Ro;C.monthsParse=Po;C.monthsRegex=Lo;C.monthsShortRegex=Io;C.week=Fo;C.firstDayOfYear=Ho;C.firstDayOfWeek=Ao;C.weekdays=Jo;C.weekdaysMin=Ko;C.weekdaysShort=Qo;C.weekdaysParse=tl;C.weekdaysRegex=il;C.weekdaysShortRegex=al;C.weekdaysMinRegex=ol;C.isPM=ul;C.meridiem=cl;function Wt(e,t,s,r){var n=Oe(),i=ge().set(r,t);return n[s](i,e)}function Rn(e,t,s){if(De(e)&&(t=e,e=void 0),e=e||"",t!=null)return Wt(e,t,s,"month");var r,n=[];for(r=0;r<12;r++)n[r]=Wt(e,r,s,"month");return n}function js(e,t,s,r){typeof e=="boolean"?(De(t)&&(s=t,t=void 0),t=t||""):(t=e,s=t,e=!1,De(t)&&(s=t,t=void 0),t=t||"");var n=Oe(),i=e?n._week.dow:0,a,o=[];if(s!=null)return Wt(t,(s+i)%7,r,"day");for(a=0;a<7;a++)o[a]=Wt(t,(a+i)%7,r,"day");return o}function gd(e,t){return Rn(e,t,"months")}function wd(e,t){return Rn(e,t,"monthsShort")}function yd(e,t,s){return js(e,t,s,"weekdays")}function _d(e,t,s){return js(e,t,s,"weekdaysShort")}function bd(e,t,s){return js(e,t,s,"weekdaysMin")}Ne("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,s=k(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+s}});c.lang=ne("moment.lang is deprecated. Use moment.locale instead.",Ne);c.langData=ne("moment.langData is deprecated. Use moment.localeData instead.",Oe);var be=Math.abs;function Sd(){var e=this._data;return this._milliseconds=be(this._milliseconds),this._days=be(this._days),this._months=be(this._months),e.milliseconds=be(e.milliseconds),e.seconds=be(e.seconds),e.minutes=be(e.minutes),e.hours=be(e.hours),e.months=be(e.months),e.years=be(e.years),this}function Tn(e,t,s,r){var n=me(t,s);return e._milliseconds+=r*n._milliseconds,e._days+=r*n._days,e._months+=r*n._months,e._bubble()}function xd(e,t){return Tn(this,e,t,1)}function kd(e,t){return Tn(this,e,t,-1)}function cr(e){return e<0?Math.floor(e):Math.ceil(e)}function Md(){var e=this._milliseconds,t=this._days,s=this._months,r=this._data,n,i,a,o,l;return e>=0&&t>=0&&s>=0||e<=0&&t<=0&&s<=0||(e+=cr(ws(s)+t)*864e5,t=0,s=0),r.milliseconds=e%1e3,n=re(e/1e3),r.seconds=n%60,i=re(n/60),r.minutes=i%60,a=re(i/60),r.hours=a%24,t+=re(a/24),l=re(Pn(t)),s+=l,t-=cr(ws(l)),o=re(s/12),s%=12,r.days=t,r.months=s,r.years=o,this}function Pn(e){return e*4800/146097}function ws(e){return e*146097/4800}function Dd(e){if(!this.isValid())return NaN;var t,s,r=this._milliseconds;if(e=ie(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+r/864e5,s=this._months+Pn(t),e){case"month":return s;case"quarter":return s/3;case"year":return s/12}else switch(t=this._days+Math.round(ws(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return t*24+r/36e5;case"minute":return t*1440+r/6e4;case"second":return t*86400+r/1e3;case"millisecond":return Math.floor(t*864e5)+r;default:throw new Error("Unknown unit "+e)}}function Od(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+k(this._months/12)*31536e6:NaN}function Ce(e){return function(){return this.as(e)}}var Cd=Ce("ms"),Yd=Ce("s"),Rd=Ce("m"),Td=Ce("h"),Pd=Ce("d"),Nd=Ce("w"),Id=Ce("M"),Ld=Ce("Q"),Wd=Ce("y");function Ed(){return me(this)}function Fd(e){return e=ie(e),this.isValid()?this[e+"s"]():NaN}function Ae(e){return function(){return this.isValid()?this._data[e]:NaN}}var $d=Ae("milliseconds"),Ad=Ae("seconds"),Hd=Ae("minutes"),Ud=Ae("hours"),zd=Ae("days"),Gd=Ae("months"),jd=Ae("years");function Vd(){return re(this.days()/7)}var Se=Math.round,Ke={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function Bd(e,t,s,r,n){return n.relativeTime(t||1,!!s,e,r)}function Zd(e,t,s,r){var n=me(e).abs(),i=Se(n.as("s")),a=Se(n.as("m")),o=Se(n.as("h")),l=Se(n.as("d")),u=Se(n.as("M")),f=Se(n.as("w")),w=Se(n.as("y")),M=i<=s.ss&&["s",i]||i0,M[4]=r,Bd.apply(null,M)}function Xd(e){return e===void 0?Se:typeof e=="function"?(Se=e,!0):!1}function qd(e,t){return Ke[e]===void 0?!1:t===void 0?Ke[e]:(Ke[e]=t,e==="s"&&(Ke.ss=t-1),!0)}function Jd(e,t){if(!this.isValid())return this.localeData().invalidDate();var s=!1,r=Ke,n,i;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(s=e),typeof t=="object"&&(r=Object.assign({},Ke,t),t.s!=null&&t.ss==null&&(r.ss=t.s-1)),n=this.localeData(),i=Zd(this,!s,r,n),s&&(i=n.pastFuture(+this,i)),n.postformat(i)}var ls=Math.abs;function qe(e){return(e>0)-(e<0)||+e}function qt(){if(!this.isValid())return this.localeData().invalidDate();var e=ls(this._milliseconds)/1e3,t=ls(this._days),s=ls(this._months),r,n,i,a,o=this.asSeconds(),l,u,f,w;return o?(r=re(e/60),n=re(r/60),e%=60,r%=60,i=re(s/12),s%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",l=o<0?"-":"",u=qe(this._months)!==qe(o)?"-":"",f=qe(this._days)!==qe(o)?"-":"",w=qe(this._milliseconds)!==qe(o)?"-":"",l+"P"+(i?u+i+"Y":"")+(s?u+s+"M":"")+(t?f+t+"D":"")+(n||r||e?"T":"")+(n?w+n+"H":"")+(r?w+r+"M":"")+(e?w+a+"S":"")):"P0D"}var D=Zt.prototype;D.isValid=zl;D.abs=Sd;D.add=xd;D.subtract=kd;D.as=Dd;D.asMilliseconds=Cd;D.asSeconds=Yd;D.asMinutes=Rd;D.asHours=Td;D.asDays=Pd;D.asWeeks=Nd;D.asMonths=Id;D.asQuarters=Ld;D.asYears=Wd;D.valueOf=Od;D._bubble=Md;D.clone=Ed;D.get=Fd;D.milliseconds=$d;D.seconds=Ad;D.minutes=Hd;D.hours=Ud;D.days=zd;D.weeks=Vd;D.months=Gd;D.years=jd;D.humanize=Jd;D.toISOString=qt;D.toString=qt;D.toJSON=qt;D.locale=_n;D.localeData=Sn;D.toIsoString=ne("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",qt);D.lang=bn;g("X",0,0,"unix");g("x",0,0,"valueOf");m("x",Gt);m("X",yo);Y("X",function(e,t,s){s._d=new Date(parseFloat(e)*1e3)});Y("x",function(e,t,s){s._d=new Date(k(e))});//! moment.js -c.version="2.29.4";Ja(R);c.fn=d;c.min=$l;c.max=Al;c.now=Hl;c.utc=ge;c.unix=vd;c.months=gd;c.isDate=ht;c.locale=Ne;c.invalid=$t;c.duration=me;c.isMoment=ce;c.weekdays=yd;c.parseZone=pd;c.localeData=Oe;c.isDuration=Mt;c.monthsShort=wd;c.weekdaysMin=bd;c.defineLocale=Es;c.updateLocale=pl;c.locales=gl;c.weekdaysShort=_d;c.normalizeUnits=ie;c.relativeTimeRounding=Xd;c.relativeTimeThreshold=qd;c.calendarFormat=cu;c.prototype=d;c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};function Qd(){return ks({url:"/user/getAuthInfo"})}function gf(e){return ks({url:"/user/updateInfo",data:{name:e}})}function wf(e,t){return ks({url:"/user/updatePassword",data:{newPassword:t,oldPassword:e}})}pi();const Kd=gi(),hr=wi();yi(["notification"]);function yf(e){return c(e).format("YYYY-MM-DD HH:mm:ss")}function _f(e){document.title=e}async function bf(){const{data:e}=await Qd();Kd.updateUserInfo({headImage:e.user.headImage,name:e.user.name}),hr.setUserInfo(e.user),hr.setVisitMode(e.visitMode)}async function Sf(e){if(navigator.clipboard)try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.error("copy fail",t),!1}else{const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select();try{return document.execCommand("copy"),!0}catch(s){return console.error("copy fail",s),!1}finally{document.body.removeChild(t)}}}function xf(e){const t=["B","KB","MB","GB","TB","PB","EB"];if(e===0)return"0B";const s=parseInt(String(Math.floor(Math.log(e)/Math.log(1024))));return`${(e/1024**s).toFixed(1)} ${t[s]}`}export{rr as A,nr as B,mf as N,pf as _,df as a,of as b,hf as c,Aa as d,ff as e,uf as f,Mi as g,lf as h,Oa as i,vf as j,af as k,nf as l,cf as m,rf as n,Ya as o,xf as p,sf as q,c as r,_f as s,yf as t,bf as u,Sf as v,gf as w,wf as x,Ia as y,Na as z}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b57a7b1c.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b57a7b1c.js deleted file mode 100644 index 67ff6f001..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-b57a7b1c.js +++ /dev/null @@ -1 +0,0 @@ -import{g as w}from"./about-2688cabc.js";import{f as u,bB as B,r as g,D as f,aW as p,aX as d,b3 as s,b2 as A,b1 as e,b4 as a,a$ as n,b0 as o,b5 as E}from"./index-7e19b821.js";import{_ as D}from"./index-b1d3d9b0.js";import{N as x}from"./GradientText-44d798c5.js";import{N as C}from"./Divider-a11d112a.js";import{f as Q}from"./index-2b595d91.js";import"./index-c238f14b.js";import"./_plugin-vue_export-helper-c27b6911.js";const b="/assets/logo-3d38229d.svg",I="/assets/gitee-9d895e3a.png",U="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAACAtJREFUeF7tW2msZFURrjp1enDfR9Qgg84QXHCJQxBwY+IKanAEMe5Go0bR0TFGERgZRAElCo6CJi4BFUURNYiKITqAgOMahBmdREGCE1FEUVFR+3ynvNW576W73+2+dXu5bxI4yfvx7v1uVZ3vbLWcZrqTN76T95+Wi4C7EdGDO53OnjYA3W73T0R0CxH9p+0BmTcBe8QYn0JEz1XVp1qny7/7jOjoP0oibmHmK4noeymlq4jov/MiZuYEdDqdJwFYx8zW8ecR0d2nNP4OIrpEVa8Ska3dbvcXU8ob+HyWBOwdY9ygqhuIqDNLI/tkdZl5S0ppCxHdNAsdsyDgHiGEDcxsHX/oLIxyyLhZVbfknI2IfzvwIyFTESAir1TVdzPz46YxYtJvVfU6Zv4wgC9OKmNiAmKMp6nqeyZVPMvvmPlDKaVjJ5E5EQEi8i0iesEkCuf4zcUAXthUfmMCROQGInpEU0Ut4X8H4JFNdDUiQERuJ6J7NVGwDNh/Ari3V6+bABG5nIie7hW8zLgrADzDY4OLgBjjx8rz3SNzt8CU/sLb64ypJSDGeKqqjtxhVfUkZt6LiFYT0aF1Cmfw3s59m403MvM6VX3UKJnMfFpK6b3jdI4lIITwZmY+u8bo9QC+WWJWioidDkcR0eEz6Gy/iE+bSwzg6wsPY4ynqOrYDqrqW3LOnxxJ0hgj7xtj3DaOYfsWgJ0INw7LEZGXEtHpRPTwoXd3qOoNzNz7IyJW1dXMvFpV1xBRHMJfyszvTylZcDTQOp3OgTnnH48dYeadKaWDiOjvVbiRMyCEsMkU14ziTQBWjcOEEDYz8/XW2ZSSdfjmGpmrYoxGhi2p2wGcPw4vIhYsWXg9sqnq+3LOJzchYLWIbCOiB9UYuw3AwTOe6o3EichPieiAmo9uBWCz4PphXOUMaLDr/xFAWwFQZR9FpFuxbJZgR50KVQSsEZHfeIcBgMX7rWdyzL4VK1bsD+C6BrbuS0S/7ccvISCE8DZjq4HQRxPRTi9+ljiLRovj9wtemebL5Jw/PpYAEfkOER3mFQrgYY6NzSuuEU5EXkJEX23w0XcBDBzPwzPg/iLyV69AVd2ccz7Ji58HTkSMACPC1QA8gIhuWwAPEFBEeq8uIr1zXZKIrgZgeb9lbyGE7cz8WKchrykixs+PIuBrRHSkRxAzPzOl9AMPdt6YGKNlnS9x6rkQgHmqvTYwA0II1zDzE+oEqeqOnPP+dbg234cQrvWk5lT1lznnJ46aAX9wJjYvAHB0mx2s0yUi5xHRy+twtmGXG/fSGSAiiYikTohFgDnnzXW4Nt+HEI5l5lMdOgFgMd7oXwIPFJFbHQIMcjSAC5zYVmCFS/z8wiW+2KMMgLn4fxneAx5TnKs7PAKI6MUAvuHEtgITkZcR0Zc8yorBsxPjVwMExBgPVdWtHgGq+q6c80c82LYwIYTjmfkDHn2WSEkpXTZAgNX0cs4/9wgoCpxnAzjGiW0FJiKfLcplr/MoCyGsXagx9u8BFgIPBApjhFlmxu0ue4yaFmOFU29KrqgkWeKlFxr3E2DpLKvRe5rF1ys9wLYwImK5QlclGoCV6f88TMAeIuIOa0MIB3S7Xe+SmSsPMcaDVfVqrxIAlkHq3TkYjgV+T0SW4a1tqrox53xmLbAFQAhhIzN/1KlqF4DFPOUwAe7ISlW355wtzfQvp+J5we4ZQtjGzF7XfMCLHY4FmjBJqnp8zvmUefXMIzeEcBwzf9CDNYyqvjPnfMYCfoCApmupFLJsXuEECRFi5kNSSj+qJMAehhDs0oF3Oi3IaZ2ESTpfLtuByxxVOcETmLkyhz5umrUZIJW1hhO9034Bp6qbcs4D3mJVVnhfEdluSdchBVb9sXzhWiJ68gjl37YkJYCvNDXOgV8TQjiMmc0Bm8QJ+x8Am9kDGe/KuoCIWMroVUNGXQrgOfas0+mstdsYzDxqFH5miph5lyVPAFjxohd8eFuM0Urxz1bVxzPzfqq6n/fbETgbGEv5DbRRBIwKLc8HYFFXr4nIp4oEw5s8hqnqMTnnukJrT1TT1LxHv13pAWAztJ4AQ8QYz1DVd1QI/xyA1/eRcKGFxzVGDHzjMVhErAq83oOtwzDzmSmljVW4ceXx+4UQtjLzYv6sT8BnALyh/H+ViFxBRHuPMeQIABfVGTr03oKzX0976VJVr8k5ryOivzUlwKb4i4ioMvFR3OV9Vkrp++VSsCVzHBEdMqxEVa/NOdvzxh6jiHhzlOO47b+/sATnuSFysqqeUKHhIgBH9D8XkfXmaKjqQ8qY4twibLb6vY1k4zahT7KoxxIkKaVN4xTXElCzHxwFwPaAubQmMf6wAePWfT/WRUA5zW2dP21I0W0hhMO73a7dJZh5m4KAHwJw3WhzE1CSoBVM7zQvsO4mxyTsTEoAAHe/3MCFDoiIrekDKza7HUWy8XJzfMwBKt/vqaorJ40YJyDgJwBGeamVY9CYgHImfKJIKXmTopfZDyhamAFnAXhrUz0TEVCSYG6llcb3qVE6bwIsRjmxv+LbhISJCSiV7CMiFg+8dozSeRJwTrHebRCWXNPzkjAtAT09ImIEGBFVs2EeBFiHbeM9x9vRUbiZEFAKX1k4Lkcy8yuIyH4httC+DMBTtV1io4gMxxlXqup5OWd73ktrT9tmScCiLZ1O56Ccs22Se5UVpEahcN+JY5HnG4loVwjhrHn4G3MhYNpRafP7uwhok+3dUdddM2B3HJU2bfo/fuILbpqP6yUAAAAASUVORK5CYII=",z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABTxJREFUeF7tW3toW1UY/53bZmnS9JW260NHoQ+wG9M/Oh+jdCCuUZgOcc4qWEFxE5kKc+rw8YdFpgy3bvMPUYcwmAgi6zbnCnZjY8OuILab1cLq2kltTds17dKmWfNoc+VLm9Hkps09uTdJ8ziQf879zvm+73e/1/lyD8MSw3Rw5EmReeoB1ACsHEABIGqWol9Z88wNwAKINwF0MlE417an+OdgMrLAyc0HzTsEge0VRbFiZSmlTBrGWL/HI+4/v6f06OKd/ACobzYfB/CiMlYrfvV3594ubfRJeReAJFHep/ddELwAkNkzhm9W/LtTUUBRxE5yBy8ApkPDfYnm86GwopjQtrukki1E+zOhFiTicyYKT7H6ZvMRAG8looIydPqCAPgVQK0M4kQkaWf1zcNmQCxJRO1C68SGCQBX/FR4oVXio2BucgGRb1FiUacASFlAygViGwPK8tPx2TNGv8Aybvfgze8tUQk2MY8BBMDRlwr9lO0ddacASFlAMrnAjrpsib9/dGoifmNA48YsifDdg07cv0YrmW+/MYPaKp1k/niHLb4BaHzE4KfAuz+O4/Pt+RKlgs3/MeQCzcsZOToBkzMeOaRBaSKSBcgCogHAxooMNG3NA2WNA79YMTA+yw1EXANAFvXAvau8SpPy77dMwDI9xwVC3AKwoUyLTwMKqJYuO766NBU9AHzoSzgywGKT+mWBQZCQ9gy7UZSVJpknWsu0/x4GLfOaO43HqnXY+0SuZF3jt7cwOiXfChRZAAEQGNgogI1OzsG0zj+y7zt7Gx9uyZMIvPuHcRxq8A+OnQNO9N1yo+FB/0D65cUpnLpm9+7xbE0mdm6Sps8DbVa09czItoK4BWBztQ7vBbGAxZqbrbO4NuhC179OXP7boX4WiKUF6DQMp98olv2mW/+8g8PnJ6XeqqQfEEsASBM6RNFhSs5YyjUUu0BgdadJA2wODwTm/78rpamqooU/l0URWHjePeTEfcXzqWzxEBjgCWjWjdnmcOH6vH8bMwVsWa9HsKozcK/lsgMXAHl6AbsezUGOXhrN5bwFNWio8svOEJCtE5AeQozx6Tm0/jWD5cpqLgCCVXhqKKXmHtNOD7qHXOgfm8XZbjsm7MuXyQkFwActE/h9wMmFZ8IAcGPUjV1h9BC4AHj+IQNeqZUedbkgjxAxpThKdbyDCwCq7t4xSctPXqZq0/eYXaCKMpzBBUBNmVbSwQ2Hqdpr9rVacalXfvm7mD8XAFkZAk68XqS2/Ir2a+9zoOnM7bD34AKAuBxuyMfaUmnhErYEChbOzol4+dgY1+kvkB03AK9tysa2mkwFYqu3lBqnv/3Dl/YUA1BeoMGRF/KhTZd8YqieZjJ2utLvwMc/hW/6PhbcFkALX63LwnMb/M/qMmRWjUQt5UmgsAAoMKRh/zYj1hjlncRU0xzAiU47vr7M1/Zajn9YANCG1SUaNG01IjdKByPrHQ+OXbGFVexEBADalBqTnzxtRFqED4cnr9pBv5FJ+b0+uVYXtgX4GDxcroVprR51VRlyecqmu9g7g5NddlwfmW+ERmIoBsAn1Pp7VuHxdXpJM5RXaDq+dvQ70HHToTjFyeGtGgA+ZtSpqSjUoGK1BpWFGlSuTkdp7vLBkjrJPf+5vJ3gq4NO2J3R+25LdQCCoU4xwqAVQKU09fZpTDlEb+uMfrEcUQEglgqG4p0CQElbPBS68fA89als6mPp1OfySX5hIumvzFCkTupLUwRA0l+bIxCS+uKkr2BJEhCCX531gZDUl6cXl67Jcn3+f8i3uNMBUgQwAAAAAElFTkSuQmCC",q="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAADcBJREFUeF7lWwmQVEUSffV/39Pd0zMMo8MNcirKKYwHqKiAIKwQEosr4C4q4oqu60UI7q6xCooiu6wr3gdXiCesoiKHyiqsioiBAiL3wHDN2ffxu//fyPr9e/qc7h5GHSUjOvqqysx6lZWVlZWfIQNVTZl7NVNwpaIoAxhDFwAlAPSZ2rew3yUA1YqC/YyxrQrDutZLZq1OpyNL/rFm8tybFSgzAZzVwgZ1qursY2DzWi2d9Xw8owQAqifNWQqGSacqqUX3V7CsZNnsyZqOMQBOi8Fro44DgQMQNfvnWvTMNbNyDGwaLQcOQPXkOXt/hWs+G2T7SpbO7spUb6+8m631r/F/hbExrHry3IWAckdzDZAZDQC99DooNfXNwpZZzFACQUCWm4VfAxP2L1Y1ac5njOGiZuEsiBA7lQEGA2eneHyQjxxvMmsOZutiCFYL5yEfOAIlGGoyv+SOioJNrHrynKMAypqDq1BoBSsrTWAlH6uC4nTnzV4BoOtJ8VcDKXVOyCdq8ubVSIdjBABB2iwRHiu0QShrnai0JEE5eBRKJJKX4kLHMjCzOZFXvQvy8eq8+GRpLBEABHbzEC2Bzm35+k+YuTwVF+xWsDaJlsSXQBOtqbHBNS8AANJZAVe+8jgUty8r0EwnQujaMaWdEgpDPlQJ5GlJ2QQ2OwAkkJYBAZFAoRAi+49k0wdCm1IwuzWlnXyiGkqdK2v/fBv8KADQEhA7tElZCnJNPZSq2ow6siI7hDPo0JlE/gAih8hXNz81CQDGGGDQAzoR0OvBdDpAFABBACi2ZPQZYAXq9pVA/mBDW+pDvLKQ4vUDsgIosvouy6pTDUcAKQxFkvh7UygvAJjZqJonOSlRbIq8H7WPXO9S/Yw3u6/RFMkZAKFtKZgtdW3+qCNqInMegB2vUi0kC+UEwC9p8Np4lUAI8tGTQKjxyDErAKykCEJJUTYgW+T/tGvQ7tEYNQoAOTehU1vV2f0SSZYROVAJkJPMQI0CYBpzEcQ2JQhs/Dbz8Mkjh8KqNw5LQDh6YuMnN/Lc9BYNNuldexFH7XRHuwcA49DzIDhs8L/3uSqPdgi+STB1h6FPfOfRgVG0qe0+jUyOXF0HpboudwDE9qUwjxwEQ/nZXEjwy93wr9+WwkBxe6C4fKD3U6FkeYEPv4R3+fqcWZJjZnZLRgdNBzEKoXO2gOLn7gEzqcdZotA3++B7f0tC/5xiclGAYDGBFZggFNkg7TqUVodkecFPvoHnpfdzBkBryIoKIXZuw3UXbGaED51U//IHEaEQOgOlLIHCv0yBrlu7BgB2VsC3anPsu1xVm1OiQ2xbAscj03g/91MrEfpiV1oVkuUFP98Jz6JVeQMQL8+7cjOkXRUqj0gEkT3pwae/UwAo+P1ImIb1jykg7T0K7+v/jX2P7KvIKeqioKn42bt5P+/StQis+yrtoJLlhb7ZC/eC1/MGIF6ef+1WBL/a06Dz7v2qL0pDKQDQ4EkpjciUPMs/4l8Vf1A9keVIrZbM4i39/9kE31sb0/ZKlkdLxfXI8hwlJDbT5AU27Uhw3PIPB6BQCJ0LAGT+ZJYaRY7Vwv3yWv41V/PX+hYv+jOY1cwdqXfxh2kdZrK88IFjcM1/g/dTQhIUl7fRbSx+TJq80LZ98H3Q4Lciew4CkfT5xBQLICdCjikGQI0L7mdVp9QYAJZxQ1QroXUlighs3A77zIkQSx2QfjgC75ufQWDR0JS2Qsa4Y0yRd6wG7pfXNYyLtlmnh6fVeGI0SgnyAPhWfgrHnJtAu4omT9dRTaqE1m+Brnu7tI44bRxQtPAOCEVq3C+7fXA9+Y76+WQNlFpnWlMyXtIHlrEXg5yYYVAvuF9cA+vES6DrUoZwZTU8i9fD0KUUlonDuLL6nh1ipp4gr9YN1zPvpZWhuDyQKb/o9YPkmcdchOCGrTBefC7qZ78A+70ToT+3S0yesbwnzMP6onbqYzCPuYDLTaa0AGiM+IwGQnAueFsF4Hg1lPrUpARlbw2Dz4b1plHwr/kKpiG94Vy4CpbRg2Do0wVynQf1Dy6Gsd9Z3L8kA5AgzxdA3b3PgZW2AtNniEC9fohtimG77TfwvrIG5nFDUHf7QlhvHM2BIXmup1fD2L8rzCMHoubGx2G5ujx3ACwTL4d51GAVLFmB84k3oUiRtDk51soBoXUxxBI7bNNGwffO57CMLUf93BUcCHoRiLXT5sN4YW9Yp49NASBBXkRG7S1PqFEiJVkd9pTECqmlyfO8vAbWP4xEzZS5oGVBYFBk6pz/Jgy9O8Iy9gLU3jyfjydnCzBd2hcFU0fFrIVmU/EG+OmKzDBGRgPEzmrMwIx66Lu2gUztql2IHK2C4ZyOKJh8Jf+fBqXv3g6mUeWQvq9IWALJ8upmLIRMzo+PVFDzjAQEJWGiFJPn9EDauovPOs0+WQGR84m3oGvXGrQMnA8vgSUfAPTndIJ95u9iwlyLVkOu90CuPAHFHVUsqpzYrVOsHc02HT9pxqUdB7ijI/Mmqr/vGUSOp0+HJcurv2cRIieTbpUEBuawgzLGMBk5Ty4vIoPuC6Q9RxLkkR+Ra9X7iMjBSiDOgcb7gbQ+QCgpRNGC22Lt3C+s4QrRLQ8lGxIYRJcA/W4ZMYDPApHn+dUI7z8aiwZdc5ZB2l0Bba+O3++T5ZFDixyOhrIJ0tRdRiRrcNi5jzEO7plWnmfZBoQrquCYpU5Apvgi42mw1Sv3A4Kar/MsWY/wkWrIh4+B5+cykLbG6W/fG58gsH5rLBrUwuHip+4Es1lSFIqX53xoCcI0o1moMXlaOFx45zgwizF/AByP3wrxDDUREqlyQmxdCMXj59sivZM5y9VOBP+3I2baYmkRHPNv5X0o9KUQWAtOvMvWIbB2CxzzboFY1kpVaN4KQFZjA8dj0yGeWazKq6yC2LY1z+/JHn9+8p6+ix/A/Ou+RnDLD7DfMhpCK/Uwli7CzGgB9vuvh75X6gVF8qQoUhh0gvO9ugFKOILil2byM3toy/dwP/l2LDjxv7uZW4V2+JF2H+aWRQDIlSdhn3kd9Od0zjbpyCrvkWmgg1Fg804EPtkO65QroGtXkj8AttvGwTC4V0wh2gWCm76D4fyesSApXtvwweNw/X0xbDSQHh0Q3lsJ598Xw37fddD37ozgp9u5X7DdOQGG/t0QPnQCnuUfcxaUUygYfzHnrRFZWXDzDhgG9YTgSE3GhitOwPnAi7DPnpQoLzpxoe0H4Fv9BQomDIG+W9v8ASiYMgKmKwbEFJLr3KidtoCnx0xDz4PpqsHQdTwjmrFRm9EMM4sJ5tHlfHnU3fUUrDdfDeOQ8yBt3w/X/BWwzhgP46Ce/Lzu/vdKfpXOCswwD+8P48DuDfKqnai99Z+qvEv7wDRiUIo8P0V2Rj3Mo+Lk/fEaGMvPhrT/GLwrNsaCsbyXgPmaIbCMV+N7PktBCTWT5sa+0+Dtf5sCwdZw+UFCAh99DbIeSknXTJ0Hy4RLYR5zIWjGXP94CwW/vQzG8l6Q9lTC9dBinuoS25fBPKYcxkE9GuT5g6iZ8miDvE5novDBG/j61ijw8TZI3x2A7fbxDfImDYd5+EBETtTB/eKHMA/ro8rL1weYLh+IghuGJ6zJmhseheILwnB+D9juGJ+QOaKGzoeX8iMzHUqICADTZf1QMHk4ZKcX9XcvgnnCZTCPGJigENPrYbn+SpiG9U2UN2kuB55m1DrjGh5sxZPzry9BicgJ8syjLoDl2qE8IHMtXMUHTyDkDQAdaGwzxiUIdD3+GkzD+sEwoMFUtQa+1z5Sk5miAMe86fwUSEtA17lMnSECZMpcGIf2gfWm0SkKkYkXXH9Forx5r8I04nwY+nZN+J0vt1c3wP/BFyny9L27wDr1Kt6ewnE6i1C8kDcA+u7tYX8gVk+YooD2Q2jbHr7fS9/uj7XRjqqhb/dzZxhP5ADJESYrRH6C/EU24vLWfJlwtI2XJ9d6wUrV7ZSIHCA5wrwBEEuL4Zg/Pa0+tL6knQchbdsDSmE1B5FV2f507SnLYyUOCCUNABBDed9h9QI1DWWMA5jJCMMl/dQu4QiUgMSToeF9R/he3NwUH3MQf9p2FR+9gnnJY2WtISTVJsh7K6CE0+uc+WKEMYg9kgITKYLIvswZ1uYGpSn8hLM6qJcmcRTZfaDhciaJaaM3Q2K3jkDSNTglRcnTt0SizLDQsW2iavmmxeN7py11oWoNqv3LkGT82YARBAjtqbJMPSprlPfNUHxn5rBBODOx7I3+Vzxeft9G5/6WQJRYZa2K+SkzmahOQKnPXKfY+O2w0QAhmvFJN1CqyIDTAzkQBNMuQH8qROiobjSCFVrVbFEGylZdmrU+gCyALKFRosEHgryMlXKHnJpwO6zeBkdfxCPd7bBBpw6cosIs9UU087xSpBHKCgAlRUSqEYjW//5UE3zKcqgsj1JhGW6ENP45lcpStTbV7/1iCiXCETWB68ucvYoCwEtlcyqW5qVwtN6KClsuEDTwOif3S5kCnyTLOpZ3uTwHgu79aUnQOjTowcvafwbipfMhCQhKUKgYiiLHDBFfOvWi5fLN9MAEla4IIphOgELFESKVsAix6pim4sP9XFiGHAmDUQqcSnAoj5hDCVx2mfTAxOn+yAyhdFo/NEUAnPaPzXErOB2eGtWcQvKDk9rvpwUImR6d1UA4rR+ejt82TpfH5/8Plo4FWqU69IAAAAAASUVORK5CYII=",k="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA8JJREFUeF7tmkloFEEUhr9ywQ1RoogICoriAoq4oEYP5iBqBEG8KeZoFDTo0Q1FXG4q5iLm5sGTOYnxJOZgDIhBcYnBgxJEFBUXImpcKOdlqofOpDPTSU1Xume6oSEZql7976tX1VX1SlHhj6pw/0kBpBFQ4QTSIVDhAZBOgukQSIdACQhoGAtMMO/4vL/HWTbRC/wCfpo397eCP5a2B58DNKwi+y4FlgQ46Hd0tK2QYdb/FwDGD6sD6ASeKHgY1MaAOUBnnT0N7BymqLhWawYuKbjnF9gPgHH+ATAprl5Y6pLhtEVBq2cnB0DDQqDLsoGkVJ+l4J2I9QO4D6xLigeWOm8q2J4DoGEr0GJpNGnVaxXc7osADZeBg0nzwFJvo4IGD8AjYLmlwaRVf6pgmdIwFfiSNPUl0lslADYCd0tkMGlmagRAPXAlacpLpHefALgAHC6RwaSZuSgAbgG1DpS/AWY7aGcoTbQIAFcLIFl+ynq8cSgKIy7bLgBcfQJbFdSYdYdAOBCxc2HMPxYAsv6XfUDUTw6AgTDPTL6bom64gP0uAdANzHEgoh8Arz0Nm4GmEZofugXAR2D6SAHwgZCluCzJXT4fBMB3R/v/wAjwe6thWub/Uw7nhx4BIMdKoxxgLwrAFw1rzalU1PPDXwGgHTgvTYQG4ANRB5yJcn6INQDztRiT2bGfBI5H0VGxB2AgzDBzw/5SQ4g9AA2HgBOZL0RVqZ0Xe7EFoGGbcXxNFI57NgWAJBJsszdhNIaaBDUsMGN+dxijlmV6BcBXYIqloTDViwLIfI5kDSALokjCPUDkNwEg5+Mzw3hgWWZQABp2AQ1ApOEeoP+9AHgFzLV0Lkz1AQBM/lEmORfhHqTxtQB4bpKfYZywKePfDsuQk1Mol+EepL1TAEjWdKWNZyHr9gHQ2d4Wx12He5DMDgEg2dL1IZ2wKSYnQm9HMNyDtLcJgBuOUuGfHc7uYTuqWQDIZuNY2BplVu6sANgDXCszx8K6UycAVgBylaQSn9UCQC449ThaDscJ8m9gspcdbgOq46TOgZZ2BdUegCPAOQeNxqmJowrOewAWAS/ipM6BlsUKuvx3hCopSVqv4KpAzr8m5ypR6qCDB22i36Ys6KKk7MnlELIcnyYFe/2OBd4W17AB2EE2mSl5w4kJpvGS7H7nuoI7+X6Eui6vYb7JHwqIobxygVqO2wq9cuxd6Plh1imyVsl/JasV9Lv32zMFnwoZDwUgwb1fVHoKoCiiMi+QRkCZd3BR99IIKIqozAtUfAT8BxZ52hXK+psIAAAAAElFTkSuQmCC",v="/assets/qq_group_qr2-e70d9e73.png",G={class:"pt-5"},F={class:"flex flex-col items-center justify-center"},y=["src"],M={class:"text-3xl font-semibold"},O={class:"text-xl"},Y=["title"],T={class:"mt-2"},V={href:"https://github.com/hslr-s/sun-panel/releases",target:"_blank",class:"link"},X={class:"flex flex-col items-center justify-center text-base"},S=s("a",{href:"https://github.com/hslr-s",target:"_blank",class:"link"},"红烧猎人",-1),H={href:"https://github.com/hslr-s/sun-panel/blob/master/doc/donate.md",target:"_blank",class:"text-red-600 hover:text-red-900"},K=s("a",{href:"https://github.com/hslr-s/sun-panel/issues",target:"_blank",class:"link"},"Github Issues",-1),R=s("a",{href:"https://github.com/hslr-s/sun-panel/discussions",target:"_blank",class:"link"},"Github Discussions",-1),W={href:"http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=K6UII6aEPZUeDRIPOEpOSJZH-Vmr_RPu&authKey=jEXhnVekLbDDx5UkQzKtd3bRmhZggkGBxmvW4NT5LLIAFP7toMmqABwvkANGHbLb&noverify=0&group_code=831615449",target:"_blank",class:"link"},J={class:"flex mt-[10px] flex-wrap justify-center"},L={class:"flex items-center mx-[10px]"},P=["src"],N=s("a",{href:"https://github.com/hslr-s/sun-panel",target:"_blank",class:"link"},"Github",-1),Z={class:"flex items-center mx-[10px]"},j=["src"],_=s("a",{href:"https://gitee.com/hslr/sun-panel",target:"_blank",class:"link"},"Gitee",-1),$={class:"flex items-center mx-[10px]"},ss=["src"],ts=s("a",{href:"https://hub.docker.com/r/hslr/sun-panel",target:"_blank",class:"link"},"Docker",-1),As={class:"flex items-center mx-[10px]"},es=["src"],os=s("a",{href:"https://space.bilibili.com/27407696/channel/collectiondetail?sid=2023810",target:"_blank",class:"link"},"Bilibili",-1),is={key:0,class:"flex items-center mx-[10px]"},ls=["src"],as=s("a",{href:"https://www.youtube.com/channel/UCKwbFmKU25R602z6P2fgPYg",target:"_blank",class:"link"},"YouTube",-1),ns={class:"mt-5"},cs=s("div",{class:"text-center"}," - 如果失效请返回联系作者 - ",-1),rs={class:"flex justify-center"},gs=["src"],Ds=u({__name:"index",setup(ps){const h=B(),c=g(""),i=g(!1),m="20240220";return f(()=>{w().then(t=>{t.code===0&&(c.value=t.data.versionName)})}),(t,l)=>(p(),d("div",G,[s("div",F,[s("img",{src:A(b),width:"100",height:"100",alt:""},null,8,y),s("div",M,e(t.$t("common.appName")),1),s("div",O,[a(A(x),{type:"info"},{default:n(()=>[s("a",{href:"https://github.com/hslr-s/sun-panel/releases",class:"font-semibold",title:t.$t("apps.about.viewUpdateLog"),target:"_blank"},"v"+e(c.value),9,Y)]),_:1})]),s("div",T,[s("a",V,e(t.$t("apps.about.checkUpdate")),1)])]),a(A(C),{style:{margin:"10px 0"}},{default:n(()=>[o(" • ")]),_:1}),s("div",X,[s("div",null,[o(e(t.$t("apps.about.author")),1),S,o(" | "),s("a",H,e(t.$t("apps.about.donate")),1)]),s("div",null,[o(e(t.$t("apps.about.issue")),1),K]),s("div",null,[o(e(t.$t("apps.about.discussions")),1),R]),s("div",null,[o(e(t.$t("apps.about.QQGroup")),1),s("a",W,e(t.$t("apps.about.addQQGroupUrl")),1),o(" | "),s("span",{class:"link cursor-pointer",onClick:l[0]||(l[0]=r=>i.value=!i.value)},e(t.$t("apps.about.QR")),1)]),s("div",J,[s("div",L,[s("img",{class:"w-[20px] h-[20px] mr-[5px]",src:A(U),alt:""},null,8,P),N]),s("div",Z,[s("img",{class:"w-[20px] h-[20px] mr-[5px]",src:A(I),alt:""},null,8,j),_]),s("div",$,[s("img",{class:"w-[20px] h-[20px] mr-[5px]",src:A(z),alt:""},null,8,ss),ts]),s("div",As,[s("img",{class:"w-[20px] h-[20px] mr-[5px]",src:A(q),alt:""},null,8,es),os]),A(h).language!=="zh-CN"?(p(),d("div",is,[s("img",{class:"w-[20px] h-[20px] mr-[5px]",src:A(k),alt:""},null,8,ls),as])):E("",!0)]),s("div",ns,[a(A(Q),{bordered:!1,size:"small"},{default:n(()=>[o(e(t.$t("apps.about.frontVersionText"))+": FV-"+e(A(m)),1)]),_:1})]),a(A(D),{show:i.value,"onUpdate:show":l[1]||(l[1]=r=>i.value=r),title:"交流群二维码",style:{width:"300px"}},{default:n(()=>[cs,s("div",rs,[s("img",{src:A(v),class:"h-[260px]"},null,8,gs)])]),_:1},8,["show"])])]))}});export{Ds as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-bb41db9d.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-bb41db9d.js deleted file mode 100644 index d246160e7..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-bb41db9d.js +++ /dev/null @@ -1 +0,0 @@ -import{S as Y}from"./index-c238f14b.js";import{r as T,_ as A}from"./index-b1d3d9b0.js";import{cI as oe,f as ne,bn as se,r as d,D as re,aW as m,aX as S,b4 as r,a$ as a,b3 as g,b1 as v,b2 as n,ac as $,b0 as b,b5 as C,ao as ae,bq as le,a_ as V,bo as c}from"./index-7e19b821.js";import{g as ie}from"./about-2688cabc.js";import{N as ue,a as L,b as G,c as O,e as ce,d as pe,g as de,f as fe}from"./index-bc9666b7.js";import{N as H}from"./Alert-018ca7af.js";import{N as me}from"./index-2b595d91.js";import{N as W}from"./Divider-a11d112a.js";import"./_plugin-vue_export-helper-c27b6911.js";const F=1,ve=1,ge="Sun-Panel-Config";class j extends Error{constructor(t){super(t),this.name="FormatError"}}class z extends Error{constructor(t){super(t),this.name="ConfigVersionLowError"}}function he(u){const t={version:F,appName:ge,exportTime:T().format("YYYY-MM-DD HH:mm:ss"),appVersion:u||"",md5:""};function s(){t.md5=q(JSON.stringify(t))}return{addIconsData(i){return t.icons=i,this},exportFile(){s();const i=JSON.stringify(t);if(i){const f=new Blob([i],{type:"application/json"}),h=document.createElement("a");h.href=URL.createObjectURL(f),h.download=`SunPanel-Data${T().format("YYYYMMDDHHmm")}.sun-panel.json`,h.click()}},string(){return s(),JSON.stringify(t)}}}function ye(u){let t;try{t=JSON.parse(u)}catch{throw new j("file format error")}const s=xe(t),i=q(u);if(!s)throw new j("file format error");if(t.versioni===s.md5,isPassCheckConfigVersionOld:()=>!(s.version!(s.version>F),isPassCheckConfigVersionBest:()=>s.version===F,jsonStruct:s,hasProperty:f=>f in s,geticons:()=>s.icons||[]}}function xe(u){const t=["version","appName","exportTime","appVersion","md5"];for(const i of t)if(!(i in u))return null;return u}function q(u){try{const t=JSON.parse(u);we(t);const s=JSON.stringify(t);return oe.MD5(s).toString()}catch{return""}}function we(u){for(const t in u)if(t==="md5"){delete u[t];return}}const Ie={class:"pt-2"},be={class:"flex justify-center m-[50px]"},ke={class:"m-[10px]"},Ce={class:"m-[10px]"},Ne={class:"flex justify-center"},_e={href:"https://hslr-s.github.io/sun-panel-tool-page/#/",target:"_blank"},Se={key:0},$e={key:0},Me=g("h2",null,"JSON 数据",-1),De={key:0},Ee={class:"mt-[50px]"},Ve={class:"mt-[50px]"},Ye=ne({__name:"index",setup(u){const t=se(),s=d(null),i=d([]),f=d(!1),h=d(!1),N=d(!1),P=d(!1),U=d(""),K=d(!1),_=d(null),M=d(["icons"]),x=d(["icons"]);async function X(){var l,w;const e=(l=_.value)==null?void 0:l.geticons(),o=50;if(!e)return null;try{for(let y=0;y{const y={title:w.title,sort:w.sort,children:[]},I=await fe(w.id);if(I.code===0)for(const p of I.data.list)y.children.push({icon:p.icon,sort:p.sort||99999,title:p.title,url:p.url,lanUrl:p.lanUrl||"",description:p.description||"",openMethod:p.openMethod||1});e.push(y)})),e):[]}re(()=>{ie().then(e=>{e.code===0&&(U.value=e.data.versionName)})});function Z(e){if(P.value=!0,console.log(e.file.file),e.file.file){const o=new FileReader;o.onload=()=>{o.result?(s.value=o.result,J()):t.error(`${c("common.failed")}: ${c("common.repeatLater")}`),P.value=!1},o.readAsText(e.file.file)}}function J(){if(i.value=[],s.value)try{_.value=ye(s.value),_.value&&(_.value.isPassCheckMd5()||i.value.push(c("apps.exportImport.fileModified")),_.value.isPassCheckConfigVersionOld()||i.value.push(c("apps.exportImport.warnConfigFileLow")),_.value.isPassCheckConfigVersionNew()||i.value.push(c("apps.exportImport.softwareVersionLow")),f.value=!f.value)}catch(e){e instanceof z?(t.error(c("apps.exportImport.errorConfigFileLow")),console.error("The configuration file version is too low to be compatible")):e instanceof j&&(t.error(c("apps.exportImport.errorConfigFileFormat")),console.error("The format is incorrect and cannot be imported"))}else t.error(c("apps.exportImport.errorConfigFileFormat"))}async function ee(){N.value=!0;const e=he(U.value);if(x.value.includes("icons")){console.log("export icons ...");const o=await Q();e.addIconsData(o),console.log("export icons finish",o)}s.value=e.string(),e.exportFile(),N.value=!1,h.value=!1}async function te(){if(N.value=!0,x.value.includes("icons")){console.log("export icons ...");const e=await X();e!==null&&t.success(`${c("common.failed")}:${e}`)}N.value=!1,f.value=!1,t.success(`${c("common.success")}, ${c("common.refreshPage")}`)}return(e,o)=>(m(),S("div",Ie,[r(n(H),{type:"info",bordered:!1},{default:a(()=>[g("p",null,v(e.$t("apps.exportImport.tip")),1)]),_:1}),g("div",be,[g("div",ke,[r(n(ue),{accept:".sun-panel.json,.sunpanel.json","directory-dnd":"","default-upload":!1,"show-file-list":!1,onChange:Z},{default:a(()=>[r(n($),{type:"info",size:"large",loading:P.value},{icon:a(()=>[r(n(Y),{icon:"fa6:solid-file-import"})]),default:a(()=>[b(" "+v(e.$t("apps.exportImport.import")),1)]),_:1},8,["loading"])]),_:1})]),g("div",Ce,[r(n($),{type:"info",size:"large",onClick:o[0]||(o[0]=l=>h.value=!h.value)},{icon:a(()=>[r(n(Y),{icon:"fa6:solid-file-export"})]),default:a(()=>[b(" "+v(e.$t("apps.exportImport.export")),1)]),_:1})])]),g("div",Ne,[g("a",_e,v(e.$t("apps.exportImport.transmuteStandard")),1)]),K.value?(m(),S("div",Se,[r(n($),{onClick:J},{default:a(()=>[b(" 检查导入 ")]),_:1}),r(n($),{onClick:o[1]||(o[1]=l=>s.value="")},{default:a(()=>[b(" 清空导入数据 ")]),_:1}),r(n(me),{value:s.value,"onUpdate:value":o[2]||(o[2]=l=>s.value=l),type:"textarea",placeholder:"基本的 Textarea"},null,8,["value"]),s.value?(m(),S("div",$e,[Me,g("pre",null,v(s.value),1)])):C("",!0)])):C("",!0),r(n(A),{show:f.value,"onUpdate:show":o[4]||(o[4]=l=>f.value=l),style:{"max-width":"400px"},title:e.$t("apps.exportImport.import")},{default:a(()=>[i.value.length>0?(m(),S("div",De,[r(n(H),{title:e.$t("common.warning"),type:"warning"},{default:a(()=>[(m(!0),S(ae,null,le(i.value,(l,w)=>(m(),S("div",{key:w},v(l),1))),128))]),_:1},8,["title"])])):C("",!0),r(n(W),{"title-placement":"left"},{default:a(()=>[b(v(e.$t("apps.exportImport.selectImportData")),1)]),_:1}),r(n(L),{justify:"center",style:{"margin-top":"20px"}},{default:a(()=>[r(n(G),{value:x.value,"onUpdate:value":o[3]||(o[3]=l=>x.value=l)},{default:a(()=>[M.value.includes("icons")?(m(),V(n(O),{key:0,value:"icons",label:e.$t("apps.exportImport.moduleIcon")},null,8,["label"])):C("",!0),M.value.includes("style")?(m(),V(n(O),{key:1,value:"style",label:e.$t("apps.exportImport.moduleStyle")},null,8,["label"])):C("",!0)]),_:1},8,["value"])]),_:1}),r(n(L),{justify:"center"},{default:a(()=>[g("div",Ee,[r(n($),{type:"success",disabled:x.value.length===0,loading:N.value,onClick:te},{default:a(()=>[b(v(e.$t("common.continue")),1)]),_:1},8,["disabled","loading"])])]),_:1})]),_:1},8,["show","title"]),r(n(A),{show:h.value,"onUpdate:show":o[6]||(o[6]=l=>h.value=l),style:{"max-width":"400px"},title:e.$t("apps.exportImport.export")},{default:a(()=>[r(n(W),{"title-placement":"left"},{default:a(()=>[b(v(e.$t("apps.exportImport.selectExportData")),1)]),_:1}),r(n(L),{justify:"center",style:{"margin-top":"20px"}},{default:a(()=>[r(n(G),{value:x.value,"onUpdate:value":o[5]||(o[5]=l=>x.value=l)},{default:a(()=>[M.value.includes("icons")?(m(),V(n(O),{key:0,value:"icons",label:e.$t("apps.exportImport.moduleIcon")},null,8,["label"])):C("",!0),M.value.includes("style")?(m(),V(n(O),{key:1,value:"style",label:e.$t("apps.exportImport.moduleStyle")},null,8,["label"])):C("",!0)]),_:1},8,["value"])]),_:1}),r(n(L),{justify:"center"},{default:a(()=>[g("div",Ve,[r(n($),{type:"success",disabled:x.value.length===0,loading:N.value,onClick:ee},{default:a(()=>[b(v(e.$t("common.continue")),1)]),_:1},8,["disabled","loading"])])]),_:1})]),_:1},8,["show","title"])]))}});export{Ye as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-bc9666b7.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-bc9666b7.js deleted file mode 100644 index ee9db8757..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-bc9666b7.js +++ /dev/null @@ -1,1729 +0,0 @@ -import{r as te,w as tr,a as Mu,h as q1,o as F1,b as di,c as $r,d as L1,e as Dr,f as Re,u as $1,g as D,i as O1,j as Qa,k as U1,l as Zo,m as O,n as he,p as we,q as Ut,s as H1,t as zr,v as Bu,x as Iu,y as de,z as dt,A as ut,B as kr,C as V1,D as dr,E as go,F as gl,G as Vo,H as Rt,I as j1,V as Ys,J as bl,K as le,L as Ue,M as G1,N as Pu,O as W1,T as yl,P as Xn,Q as X1,R as An,S as er,U as Tn,W as tn,X as _n,Y as Hn,Z as nn,_ as ho,$ as Vn,a0 as No,a1 as Ks,a2 as Zs,a3 as Js,a4 as hi,a5 as Jo,a6 as xr,a7 as Y1,a8 as fi,a9 as K1,aa as Z1,ab as Je,ac as Dt,ad as Nu,ae as Dn,af as xl,ag as Qs,ah as qu,ai as J1,aj as ei,ak as Q1,al as ef,am as Fu,an as jo,ao as cr,ap as tf,aq as rf,ar as nf,as as of,at as af,au as sf,av as lf,aw as cc,ax as Ga,ay as cf,az as Lu,aA as $u,aB as Ou,aC as Uu,aD as Hu,aE as Vu,aF as ju,aG as uf,aH as uc,aI as df,aJ as hf,aK as Qo,aL as ff,aM as pf,aN as Ia,aO as mf,aP as Gu,aQ as vf,aR as gf,aS as Wu,aT as dc,aU as bf,aV as yf,aW as pe,aX as Pe,aY as fo,aZ as mt,a_ as pt,a$ as xe,b0 as sr,b1 as ot,b2 as _,b3 as fe,b4 as K,b5 as Xe,b6 as Xu,b7 as xf,b8 as hc,b9 as wf,ba as kf,bb as Pn,bc as xt,bd as yr,be as rr,bf as Sf,bg as wl,bh as ea,bi as bo,bj as Cf,bk as Af,bl as pi,bm as Tf,bn as mi,bo as Ie,bp as kl,bq as jn,br as Yu,bs as _f,bt as fc,bu as gn,bv as Ku,bw as Zu,bx as en,by as Df,bz as zf,bA as Ef}from"./index-7e19b821.js";import{i as gs,o as Rf,g as Mf,a as Bf,b as Ju,N as Qu,d as If,c as Pf,e as Go,f as Nf,m as qf,h as Ff,j as ed,k as Lf,l as pc,n as mc,_ as $f,p as td,u as Of,s as Uf,q as Hf}from"./index-b1d3d9b0.js";import{t as Vf,N as kn,h as vc,c as jf,u as Gf,E as Wf,a as Vt,b as el,d as Sl,e as Sn}from"./index-2b595d91.js";import{c as Xf,a as gc,u as Vr,f as br,b as Yf,d as tl,V as rd,e as nd,g as od,r as Kf,N as Zf,p as ad,h as bc,o as Jf,S as Ft}from"./index-c238f14b.js";import{_ as ta}from"./_plugin-vue_export-helper-c27b6911.js";function Qf(e){return e.nodeType===9?null:e.parentNode}function id(e){if(e===null)return null;const t=Qf(e);if(t===null)return null;if(t.nodeType===9)return document.documentElement;if(t.nodeType===1){const{overflow:n,overflowX:i,overflowY:c}=getComputedStyle(t);if(/(auto|scroll|overlay)/.test(n+c+i))return t}return id(t)}function ep(e){return typeof e=="string"?document.querySelector(e):typeof e=="function"?e():e}function sd(e,t,n){t/=100,n/=100;const i=t*Math.min(n,1-n)+n;return[e,i?(2-2*n/i)*100:0,i*100]}function Wa(e,t,n){t/=100,n/=100;const i=n-n*t/2,c=Math.min(i,1-i);return[e,c?(n-i)/c*100:0,i*100]}function xn(e,t,n){t/=100,n/=100;let i=(c,l=(c+e/60)%6)=>n-n*t*Math.max(Math.min(l,4-l,1),0);return[i(5)*255,i(3)*255,i(1)*255]}function rl(e,t,n){e/=255,t/=255,n/=255;let i=Math.max(e,t,n),c=i-Math.min(e,t,n),l=c&&(i==e?(t-n)/c:i==t?2+(n-e)/c:4+(e-t)/c);return[60*(l<0?l+6:l),i&&c/i*100,i*100]}function nl(e,t,n){e/=255,t/=255,n/=255;let i=Math.max(e,t,n),c=i-Math.min(e,t,n),l=1-Math.abs(i+i-c-1),u=c&&(i==e?(t-n)/c:i==t?2+(n-e)/c:4+(e-t)/c);return[60*(u<0?u+6:u),l?c/l*100:0,(i+i-c)*50]}function ol(e,t,n){t/=100,n/=100;let i=t*Math.min(n,1-n),c=(l,u=(l+e/30)%12)=>n-i*Math.max(Math.min(u-3,9-u,1),-1);return[c(0)*255,c(8)*255,c(4)*255]}function tp(e){return t=>{t?e.value=t.$el:e.value=null}}function rp(e,t,n){if(!t)return e;const i=te(e.value);let c=null;return tr(e,l=>{c!==null&&window.clearTimeout(c),l===!0?n&&!n.value?i.value=!0:c=window.setTimeout(()=>{i.value=!0},t):i.value=!1}),i}function np(e={},t){const n=Mu({ctrl:!1,command:!1,win:!1,shift:!1,tab:!1}),{keydown:i,keyup:c}=e,l=f=>{switch(f.key){case"Control":n.ctrl=!0;break;case"Meta":n.command=!0,n.win=!0;break;case"Shift":n.shift=!0;break;case"Tab":n.tab=!0;break}i!==void 0&&Object.keys(i).forEach(b=>{if(b!==f.key)return;const y=i[b];if(typeof y=="function")y(f);else{const{stop:k=!1,prevent:C=!1}=y;k&&f.stopPropagation(),C&&f.preventDefault(),y.handler(f)}})},u=f=>{switch(f.key){case"Control":n.ctrl=!1;break;case"Meta":n.command=!1,n.win=!1;break;case"Shift":n.shift=!1;break;case"Tab":n.tab=!1;break}c!==void 0&&Object.keys(c).forEach(b=>{if(b!==f.key)return;const y=c[b];if(typeof y=="function")y(f);else{const{stop:k=!1,prevent:C=!1}=y;k&&f.stopPropagation(),C&&f.preventDefault(),y.handler(f)}})},h=()=>{(t===void 0||t.value)&&(Dr("keydown",document,l),Dr("keyup",document,u)),t!==void 0&&tr(t,f=>{f?(Dr("keydown",document,l),Dr("keyup",document,u)):($r("keydown",document,l),$r("keyup",document,u))})};return q1()?(F1(h),di(()=>{(t===void 0||t.value)&&($r("keydown",document,l),$r("keyup",document,u))})):h(),L1(n)}const op=gc(".v-x-scroll",{overflow:"auto",scrollbarWidth:"none"},[gc("&::-webkit-scrollbar",{width:0,height:0})]),ap=Re({name:"XScroll",props:{disabled:Boolean,onScroll:Function},setup(){const e=te(null);function t(c){!(c.currentTarget.offsetWidth=t||j<0||k&&ie>=l}function E(){var R=bs();if($(R))return B(R);h=setTimeout(E,P(R))}function B(R){return h=void 0,C&&i?S(R):(i=c=void 0,u)}function M(){h!==void 0&&clearTimeout(h),b=0,i=f=c=h=void 0}function U(){return h===void 0?u:B(bs())}function q(){var R=bs(),j=$(R);if(i=arguments,c=this,f=R,j){if(h===void 0)return L(f);if(k)return clearTimeout(h),h=setTimeout(E,t),S(f)}return h===void 0&&(h=setTimeout(E,t)),u}return q.cancel=M,q.flush=U,q}var yp="Expected a function";function ys(e,t,n){var i=!0,c=!0;if(typeof e!="function")throw new TypeError(yp);return Qa(n)&&(i="leading"in n?!!n.leading:i,c="trailing"in n?!!n.trailing:c),bp(e,t,{leading:i,maxWait:t,trailing:c})}const ld=Re({name:"Add",render(){return D("svg",{width:"512",height:"512",viewBox:"0 0 512 512",fill:"none",xmlns:"http://www.w3.org/2000/svg"},D("path",{d:"M256 112V400M400 256H112",stroke:"currentColor","stroke-width":"32","stroke-linecap":"round","stroke-linejoin":"round"}))}}),xp=Zo("attach",D("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},D("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},D("g",{fill:"currentColor","fill-rule":"nonzero"},D("path",{d:"M3.25735931,8.70710678 L7.85355339,4.1109127 C8.82986412,3.13460197 10.4127766,3.13460197 11.3890873,4.1109127 C12.365398,5.08722343 12.365398,6.67013588 11.3890873,7.64644661 L6.08578644,12.9497475 C5.69526215,13.3402718 5.06209717,13.3402718 4.67157288,12.9497475 C4.28104858,12.5592232 4.28104858,11.9260582 4.67157288,11.5355339 L9.97487373,6.23223305 C10.1701359,6.0369709 10.1701359,5.72038841 9.97487373,5.52512627 C9.77961159,5.32986412 9.4630291,5.32986412 9.26776695,5.52512627 L3.96446609,10.8284271 C3.18341751,11.6094757 3.18341751,12.8758057 3.96446609,13.6568542 C4.74551468,14.4379028 6.01184464,14.4379028 6.79289322,13.6568542 L12.0961941,8.35355339 C13.4630291,6.98671837 13.4630291,4.77064094 12.0961941,3.40380592 C10.7293591,2.0369709 8.51328163,2.0369709 7.14644661,3.40380592 L2.55025253,8 C2.35499039,8.19526215 2.35499039,8.51184464 2.55025253,8.70710678 C2.74551468,8.90236893 3.06209717,8.90236893 3.25735931,8.70710678 Z"}))))),cd=Re({name:"ChevronRight",render(){return D("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},D("path",{d:"M5.64645 3.14645C5.45118 3.34171 5.45118 3.65829 5.64645 3.85355L9.79289 8L5.64645 12.1464C5.45118 12.3417 5.45118 12.6583 5.64645 12.8536C5.84171 13.0488 6.15829 13.0488 6.35355 12.8536L10.8536 8.35355C11.0488 8.15829 11.0488 7.84171 10.8536 7.64645L6.35355 3.14645C6.15829 2.95118 5.84171 2.95118 5.64645 3.14645Z",fill:"currentColor"}))}}),wp=Zo("trash",D("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},D("path",{d:"M432,144,403.33,419.74A32,32,0,0,1,371.55,448H140.46a32,32,0,0,1-31.78-28.26L80,144",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}),D("rect",{x:"32",y:"64",width:"448",height:"80",rx:"16",ry:"16",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}),D("line",{x1:"312",y1:"240",x2:"200",y2:"352",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}),D("line",{x1:"312",y1:"352",x2:"200",y2:"240",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}))),kp=Zo("download",D("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},D("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},D("g",{fill:"currentColor","fill-rule":"nonzero"},D("path",{d:"M3.5,13 L12.5,13 C12.7761424,13 13,13.2238576 13,13.5 C13,13.7454599 12.8231248,13.9496084 12.5898756,13.9919443 L12.5,14 L3.5,14 C3.22385763,14 3,13.7761424 3,13.5 C3,13.2545401 3.17687516,13.0503916 3.41012437,13.0080557 L3.5,13 L12.5,13 L3.5,13 Z M7.91012437,1.00805567 L8,1 C8.24545989,1 8.44960837,1.17687516 8.49194433,1.41012437 L8.5,1.5 L8.5,10.292 L11.1819805,7.6109127 C11.3555469,7.43734635 11.6249713,7.4180612 11.8198394,7.55305725 L11.8890873,7.6109127 C12.0626536,7.78447906 12.0819388,8.05390346 11.9469427,8.2487716 L11.8890873,8.31801948 L8.35355339,11.8535534 C8.17998704,12.0271197 7.91056264,12.0464049 7.7156945,11.9114088 L7.64644661,11.8535534 L4.1109127,8.31801948 C3.91565056,8.12275734 3.91565056,7.80617485 4.1109127,7.6109127 C4.28447906,7.43734635 4.55390346,7.4180612 4.7487716,7.55305725 L4.81801948,7.6109127 L7.5,10.292 L7.5,1.5 C7.5,1.25454011 7.67687516,1.05039163 7.91012437,1.00805567 L8,1 L7.91012437,1.00805567 Z"}))))),Sp=Zo("cancel",D("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},D("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},D("g",{fill:"currentColor","fill-rule":"nonzero"},D("path",{d:"M2.58859116,2.7156945 L2.64644661,2.64644661 C2.82001296,2.47288026 3.08943736,2.45359511 3.2843055,2.58859116 L3.35355339,2.64644661 L8,7.293 L12.6464466,2.64644661 C12.8417088,2.45118446 13.1582912,2.45118446 13.3535534,2.64644661 C13.5488155,2.84170876 13.5488155,3.15829124 13.3535534,3.35355339 L8.707,8 L13.3535534,12.6464466 C13.5271197,12.820013 13.5464049,13.0894374 13.4114088,13.2843055 L13.3535534,13.3535534 C13.179987,13.5271197 12.9105626,13.5464049 12.7156945,13.4114088 L12.6464466,13.3535534 L8,8.707 L3.35355339,13.3535534 C3.15829124,13.5488155 2.84170876,13.5488155 2.64644661,13.3535534 C2.45118446,13.1582912 2.45118446,12.8417088 2.64644661,12.6464466 L7.293,8 L2.64644661,3.35355339 C2.47288026,3.17998704 2.45359511,2.91056264 2.58859116,2.7156945 L2.64644661,2.64644661 L2.58859116,2.7156945 Z"}))))),Cp=Zo("retry",D("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},D("path",{d:"M320,146s24.36-12-64-12A160,160,0,1,0,416,294",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 32px;"}),D("polyline",{points:"256 58 336 138 256 218",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}))),Ap=O("input-group",` - display: inline-flex; - width: 100%; - flex-wrap: nowrap; - vertical-align: bottom; -`,[he(">",[O("input",[he("&:not(:last-child)",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `),he("&:not(:first-child)",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - margin-left: -1px!important; - `)]),O("button",[he("&:not(:last-child)",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `,[we("state-border, border",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `)]),he("&:not(:first-child)",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `,[we("state-border, border",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `)])]),he("*",[he("&:not(:last-child)",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `,[he(">",[O("input",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `),O("base-selection",[O("base-selection-label",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `),O("base-selection-tags",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `),we("box-shadow, border, state-border",` - border-top-right-radius: 0!important; - border-bottom-right-radius: 0!important; - `)])])]),he("&:not(:first-child)",` - margin-left: -1px!important; - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `,[he(">",[O("input",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `),O("base-selection",[O("base-selection-label",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `),O("base-selection-tags",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `),we("box-shadow, border, state-border",` - border-top-left-radius: 0!important; - border-bottom-left-radius: 0!important; - `)])])])])])]),Tp={},al=Re({name:"InputGroup",props:Tp,setup(e){const{mergedClsPrefixRef:t}=Ut(e);return H1("-input-group",Ap,t),{mergedClsPrefix:t}},render(){const{mergedClsPrefix:e}=this;return D("div",{class:`${e}-input-group`},this.$slots)}}),_p=zr("n-avatar-group"),Dp=O("avatar",` - width: var(--n-merged-size); - height: var(--n-merged-size); - color: #FFF; - font-size: var(--n-font-size); - display: inline-flex; - position: relative; - overflow: hidden; - text-align: center; - border: var(--n-border); - border-radius: var(--n-border-radius); - --n-merged-color: var(--n-color); - background-color: var(--n-merged-color); - transition: - border-color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); -`,[Bu(he("&","--n-merged-color: var(--n-color-modal);")),Iu(he("&","--n-merged-color: var(--n-color-popover);")),he("img",` - width: 100%; - height: 100%; - `),we("text",` - white-space: nowrap; - display: inline-block; - position: absolute; - left: 50%; - top: 50%; - `),O("icon",` - vertical-align: bottom; - font-size: calc(var(--n-merged-size) - 6px); - `),we("text","line-height: 1.25")]),zp=Object.assign(Object.assign({},dt.props),{size:[String,Number],src:String,circle:{type:Boolean,default:void 0},objectFit:String,round:{type:Boolean,default:void 0},bordered:{type:Boolean,default:void 0},onError:Function,fallbackSrc:String,intersectionObserverOptions:Object,lazy:Boolean,onLoad:Function,renderPlaceholder:Function,renderFallback:Function,imgProps:Object,color:String}),qo=Re({name:"Avatar",props:zp,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:n}=Ut(e),i=te(!1);let c=null;const l=te(null),u=te(null),h=()=>{const{value:M}=l;if(M&&(c===null||c!==M.innerHTML)){c=M.innerHTML;const{value:U}=u;if(U){const{offsetWidth:q,offsetHeight:R}=U,{offsetWidth:j,offsetHeight:ie}=M,X=.9,oe=Math.min(q/j*X,R/ie*X,1);M.style.transform=`translateX(-50%) translateY(-50%) scale(${oe})`}}},f=Rt(_p,null),b=de(()=>{const{size:M}=e;if(M)return M;const{size:U}=f||{};return U||"medium"}),y=dt("Avatar","-avatar",Dp,j1,e,t),k=Rt(Vf,null),C=de(()=>{if(f)return!0;const{round:M,circle:U}=e;return M!==void 0||U!==void 0?M||U:k?k.roundRef.value:!1}),S=de(()=>f?!0:e.bordered||!1),L=M=>{var U;if(!E.value)return;i.value=!0;const{onError:q,imgProps:R}=e;(U=R==null?void 0:R.onError)===null||U===void 0||U.call(R,M),q&&q(M)};tr(()=>e.src,()=>i.value=!1);const P=de(()=>{const M=b.value,U=C.value,q=S.value,{color:R}=e,{self:{borderRadius:j,fontSize:ie,color:X,border:oe,colorModal:Z,colorPopover:ee},common:{cubicBezierEaseInOut:ne}}=y.value;let V;return typeof M=="number"?V=`${M}px`:V=y.value.self[ut("height",M)],{"--n-font-size":ie,"--n-border":q?oe:"none","--n-border-radius":U?"50%":j,"--n-color":R||X,"--n-color-modal":R||Z,"--n-color-popover":R||ee,"--n-bezier":ne,"--n-merged-size":`var(--n-avatar-size-override, ${V})`}}),$=n?kr("avatar",de(()=>{const M=b.value,U=C.value,q=S.value,{color:R}=e;let j="";return M&&(typeof M=="number"?j+=`a${M}`:j+=M[0]),U&&(j+="b"),q&&(j+="c"),R&&(j+=V1(R)),j}),P,e):void 0,E=te(!e.lazy);dr(()=>{if(gs)return;let M;const U=go(()=>{M==null||M(),M=void 0,e.lazy&&(M=Rf(u.value,e.intersectionObserverOptions,E))});di(()=>{U(),M==null||M()})});const B=te(!e.lazy);return{textRef:l,selfRef:u,mergedRoundRef:C,mergedClsPrefix:t,fitTextTransform:h,cssVars:n?void 0:P,themeClass:$==null?void 0:$.themeClass,onRender:$==null?void 0:$.onRender,hasLoadError:i,handleError:L,shouldStartLoading:E,loaded:B,mergedOnLoad:M=>{var U;const{onLoad:q,imgProps:R}=e;q==null||q(M),(U=R==null?void 0:R.onLoad)===null||U===void 0||U.call(R,M),B.value=!0}}},render(){var e,t;const{$slots:n,src:i,mergedClsPrefix:c,lazy:l,onRender:u,mergedOnLoad:h,shouldStartLoading:f,loaded:b,hasLoadError:y}=this;u==null||u();let k;const C=!b&&!y&&(this.renderPlaceholder?this.renderPlaceholder():(t=(e=this.$slots).placeholder)===null||t===void 0?void 0:t.call(e));return this.hasLoadError?k=this.renderFallback?this.renderFallback():gl(n.fallback,()=>[D("img",{src:this.fallbackSrc,style:{objectFit:this.objectFit}})]):k=Vo(n.default,S=>{if(S)return D(Ys,{onResize:this.fitTextTransform},{default:()=>D("span",{ref:"textRef",class:`${c}-avatar__text`},S)});if(i){const{imgProps:L}=this;return D("img",Object.assign(Object.assign({},L),{loading:gs&&!this.intersectionObserverOptions&&l?"lazy":"eager",src:gs||f||b?i:void 0,onLoad:h,"data-image-src":i,onError:this.handleError,style:[L==null?void 0:L.style,{objectFit:this.objectFit},C?{height:"0",width:"0",visibility:"hidden",position:"absolute"}:""]}))}}),D("span",{ref:"selfRef",class:[`${c}-avatar`,this.themeClass],style:this.cssVars},k,l&&C)}}),Ep=D("svg",{viewBox:"0 0 24 24",version:"1.1",xmlns:"http://www.w3.org/2000/svg",xlinkHref:"http://www.w3.org/1999/xlink"},D("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},D("g",{transform:"translate(-139.000000, -4423.000000)","fill-rule":"nonzero"},D("g",{transform:"translate(120.000000, 4285.000000)"},D("g",{transform:"translate(7.000000, 126.000000)"},D("g",{transform:"translate(24.000000, 24.000000) scale(1, -1) translate(-24.000000, -24.000000) translate(12.000000, 12.000000)"},D("g",{transform:"translate(4.000000, 2.000000)"},D("path",{d:"M8,0 C8.51283584,0 8.93550716,0.38604019 8.99327227,0.883378875 L9,1 L9,10.584 L12.2928932,7.29289322 C12.6834175,6.90236893 13.3165825,6.90236893 13.7071068,7.29289322 C14.0675907,7.65337718 14.0953203,8.22060824 13.7902954,8.61289944 L13.7071068,8.70710678 L8.70710678,13.7071068 L8.62544899,13.7803112 L8.618,13.784 L8.59530661,13.8036654 L8.4840621,13.8753288 L8.37133602,13.9287745 L8.22929083,13.9735893 L8.14346259,13.9897165 L8.03324678,13.9994506 L7.9137692,13.9962979 L7.77070917,13.9735893 L7.6583843,13.9401293 L7.57677845,13.9063266 L7.47929125,13.8540045 L7.4048407,13.8036865 L7.38131006,13.7856883 C7.35030318,13.7612383 7.32077858,13.7349921 7.29289322,13.7071068 L2.29289322,8.70710678 L2.20970461,8.61289944 C1.90467972,8.22060824 1.93240926,7.65337718 2.29289322,7.29289322 C2.65337718,6.93240926 3.22060824,6.90467972 3.61289944,7.20970461 L3.70710678,7.29289322 L7,10.585 L7,1 L7.00672773,0.883378875 C7.06449284,0.38604019 7.48716416,0 8,0 Z"}),D("path",{d:"M14.9333333,15.9994506 C15.5224371,15.9994506 16,16.4471659 16,16.9994506 C16,17.5122865 15.5882238,17.9349578 15.0577292,17.9927229 L14.9333333,17.9994506 L1.06666667,17.9994506 C0.477562934,17.9994506 0,17.5517354 0,16.9994506 C0,16.4866148 0.411776203,16.0639435 0.9422708,16.0061783 L1.06666667,15.9994506 L14.9333333,15.9994506 Z"})))))))),Rp=O("back-top",` - position: fixed; - right: 40px; - bottom: 40px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - color: var(--n-text-color); - transition: - color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier); - border-radius: var(--n-border-radius); - height: var(--n-height); - min-width: var(--n-width); - box-shadow: var(--n-box-shadow); - background-color: var(--n-color); -`,[bl(),le("transition-disabled",{transition:"none !important"}),O("base-icon",` - font-size: var(--n-icon-size); - color: var(--n-icon-color); - transition: color .3s var(--n-bezier); - `),he("svg",{pointerEvents:"none"}),he("&:hover",{boxShadow:"var(--n-box-shadow-hover)"},[O("base-icon",{color:"var(--n-icon-color-hover)"})]),he("&:active",{boxShadow:"var(--n-box-shadow-pressed)"},[O("base-icon",{color:"var(--n-icon-color-pressed)"})])]),Mp=Object.assign(Object.assign({},dt.props),{show:{type:Boolean,default:void 0},right:{type:[Number,String],default:40},bottom:{type:[Number,String],default:40},to:{type:[String,Object],default:"body"},visibilityHeight:{type:Number,default:180},listenTo:[String,Object,Function],"onUpdate:show":{type:Function,default:()=>{}},target:Function,onShow:Function,onHide:Function}),Bp=Re({name:"BackTop",inheritAttrs:!1,props:Mp,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:n}=Ut(e),i=te(null),c=te(!1);go(()=>{const{value:U}=i;if(U===null){c.value=!1;return}c.value=U>=e.visibilityHeight});const l=te(!1);tr(c,U=>{var q;l.value&&((q=e["onUpdate:show"])===null||q===void 0||q.call(e,U))});const u=Ue(e,"show"),h=Vr(u,c),f=te(!0),b=te(null),y=de(()=>({right:`calc(${br(e.right)} + ${G1.value})`,bottom:br(e.bottom)}));let k,C;tr(h,U=>{var q,R;l.value&&(U&&((q=e.onShow)===null||q===void 0||q.call(e)),(R=e.onHide)===null||R===void 0||R.call(e))});const S=dt("BackTop","-back-top",Rp,X1,e,t);function L(){var U;if(C)return;C=!0;const q=((U=e.target)===null||U===void 0?void 0:U.call(e))||ep(e.listenTo)||id(b.value);if(!q)return;k=q===document.documentElement?document:q;const{to:R}=e;typeof R=="string"&&document.querySelector(R),k.addEventListener("scroll",$),$()}function P(){(yc(k)?document.documentElement:k).scrollTo({top:0,behavior:"smooth"})}function $(){i.value=(yc(k)?document.documentElement:k).scrollTop,l.value||An(()=>{l.value=!0})}function E(){f.value=!1}dr(()=>{L(),f.value=h.value}),di(()=>{k&&k.removeEventListener("scroll",$)});const B=de(()=>{const{self:{color:U,boxShadow:q,boxShadowHover:R,boxShadowPressed:j,iconColor:ie,iconColorHover:X,iconColorPressed:oe,width:Z,height:ee,iconSize:ne,borderRadius:V,textColor:ae},common:{cubicBezierEaseInOut:me}}=S.value;return{"--n-bezier":me,"--n-border-radius":V,"--n-height":ee,"--n-width":Z,"--n-box-shadow":q,"--n-box-shadow-hover":R,"--n-box-shadow-pressed":j,"--n-color":U,"--n-icon-size":ne,"--n-icon-color":ie,"--n-icon-color-hover":X,"--n-icon-color-pressed":oe,"--n-text-color":ae}}),M=n?kr("back-top",void 0,B,e):void 0;return{placeholderRef:b,style:y,mergedShow:h,isMounted:Pu(),scrollElement:te(null),scrollTop:i,DomInfoReady:l,transitionDisabled:f,mergedClsPrefix:t,handleAfterEnter:E,handleScroll:$,handleClick:P,cssVars:n?void 0:B,themeClass:M==null?void 0:M.themeClass,onRender:M==null?void 0:M.onRender}},render(){const{mergedClsPrefix:e}=this;return D("div",{ref:"placeholderRef",class:`${e}-back-top-placeholder`,style:"display: none","aria-hidden":!0},D(W1,{to:this.to,show:this.mergedShow},{default:()=>D(yl,{name:"fade-in-scale-up-transition",appear:this.isMounted,onAfterEnter:this.handleAfterEnter},{default:()=>{var t;return(t=this.onRender)===null||t===void 0||t.call(this),this.mergedShow?D("div",Xn(this.$attrs,{class:[`${e}-back-top`,this.themeClass,this.transitionDisabled&&`${e}-back-top--transition-disabled`],style:[this.style,this.cssVars],onClick:this.handleClick}),gl(this.$slots.default,()=>[D(er,{clsPrefix:e},{default:()=>Ep})])):null}})}))}});function Ip(e,t){switch(e[0]){case"hex":return t?"#000000FF":"#000000";case"rgb":return t?"rgba(0, 0, 0, 1)":"rgb(0, 0, 0)";case"hsl":return t?"hsla(0, 0%, 0%, 1)":"hsl(0, 0%, 0%)";case"hsv":return t?"hsva(0, 0%, 0%, 1)":"hsv(0, 0%, 0%)"}return"#000000"}function Wo(e){return e===null?null:/^ *#/.test(e)?"hex":e.includes("rgb")?"rgb":e.includes("hsl")?"hsl":e.includes("hsv")?"hsv":null}function Pp(e){return e=Math.round(e),e>=360?359:e<0?0:e}function Np(e){return e=Math.round(e*100)/100,e>1?1:e<0?0:e}const qp={rgb:{hex(e){return Tn(tn(e))},hsl(e){const[t,n,i,c]=tn(e);return _n([...nl(t,n,i),c])},hsv(e){const[t,n,i,c]=tn(e);return Hn([...rl(t,n,i),c])}},hex:{rgb(e){return nn(tn(e))},hsl(e){const[t,n,i,c]=tn(e);return _n([...nl(t,n,i),c])},hsv(e){const[t,n,i,c]=tn(e);return Hn([...rl(t,n,i),c])}},hsl:{hex(e){const[t,n,i,c]=ho(e);return Tn([...ol(t,n,i),c])},rgb(e){const[t,n,i,c]=ho(e);return nn([...ol(t,n,i),c])},hsv(e){const[t,n,i,c]=ho(e);return Hn([...sd(t,n,i),c])}},hsv:{hex(e){const[t,n,i,c]=Vn(e);return Tn([...xn(t,n,i),c])},rgb(e){const[t,n,i,c]=Vn(e);return nn([...xn(t,n,i),c])},hsl(e){const[t,n,i,c]=Vn(e);return _n([...Wa(t,n,i),c])}}};function ud(e,t,n){return n=n||Wo(e),n?n===t?e:qp[n][t](e):null}const oo="12px",Fp=12,Nn="6px",Lp=6,$p="linear-gradient(90deg,red,#ff0 16.66%,#0f0 33.33%,#0ff 50%,#00f 66.66%,#f0f 83.33%,red)",Op=Re({name:"HueSlider",props:{clsPrefix:{type:String,required:!0},hue:{type:Number,required:!0},onUpdateHue:{type:Function,required:!0},onComplete:Function},setup(e){const t=te(null);function n(l){t.value&&(Dr("mousemove",document,i),Dr("mouseup",document,c),i(l))}function i(l){const{value:u}=t;if(!u)return;const{width:h,left:f}=u.getBoundingClientRect(),b=Pp((l.clientX-f-Lp)/(h-Fp)*360);e.onUpdateHue(b)}function c(){var l;$r("mousemove",document,i),$r("mouseup",document,c),(l=e.onComplete)===null||l===void 0||l.call(e)}return{railRef:t,handleMouseDown:n}},render(){const{clsPrefix:e}=this;return D("div",{class:`${e}-color-picker-slider`,style:{height:oo,borderRadius:Nn}},D("div",{ref:"railRef",style:{boxShadow:"inset 0 0 2px 0 rgba(0, 0, 0, .24)",boxSizing:"border-box",backgroundImage:$p,height:oo,borderRadius:Nn,position:"relative"},onMousedown:this.handleMouseDown},D("div",{style:{position:"absolute",left:Nn,right:Nn,top:0,bottom:0}},D("div",{class:`${e}-color-picker-handle`,style:{left:`calc((${this.hue}%) / 359 * 100 - ${Nn})`,borderRadius:Nn,width:oo,height:oo}},D("div",{class:`${e}-color-picker-handle__fill`,style:{backgroundColor:`hsl(${this.hue}, 100%, 50%)`,borderRadius:Nn,width:oo,height:oo}})))))}}),Mo="12px",Up=12,qn="6px",Hp=Re({name:"AlphaSlider",props:{clsPrefix:{type:String,required:!0},rgba:{type:Array,default:null},alpha:{type:Number,default:0},onUpdateAlpha:{type:Function,required:!0},onComplete:Function},setup(e){const t=te(null);function n(l){!t.value||!e.rgba||(Dr("mousemove",document,i),Dr("mouseup",document,c),i(l))}function i(l){const{value:u}=t;if(!u)return;const{width:h,left:f}=u.getBoundingClientRect(),b=(l.clientX-f)/(h-Up);e.onUpdateAlpha(Np(b))}function c(){var l;$r("mousemove",document,i),$r("mouseup",document,c),(l=e.onComplete)===null||l===void 0||l.call(e)}return{railRef:t,railBackgroundImage:de(()=>{const{rgba:l}=e;return l?`linear-gradient(to right, rgba(${l[0]}, ${l[1]}, ${l[2]}, 0) 0%, rgba(${l[0]}, ${l[1]}, ${l[2]}, 1) 100%)`:""}),handleMouseDown:n}},render(){const{clsPrefix:e}=this;return D("div",{class:`${e}-color-picker-slider`,ref:"railRef",style:{height:Mo,borderRadius:qn},onMousedown:this.handleMouseDown},D("div",{style:{borderRadius:qn,position:"absolute",left:0,right:0,top:0,bottom:0,overflow:"hidden"}},D("div",{class:`${e}-color-picker-checkboard`}),D("div",{class:`${e}-color-picker-slider__image`,style:{backgroundImage:this.railBackgroundImage}})),this.rgba&&D("div",{style:{position:"absolute",left:qn,right:qn,top:0,bottom:0}},D("div",{class:`${e}-color-picker-handle`,style:{left:`calc(${this.alpha*100}% - ${qn})`,borderRadius:qn,width:Mo,height:Mo}},D("div",{class:`${e}-color-picker-handle__fill`,style:{backgroundColor:nn(this.rgba),borderRadius:qn,width:Mo,height:Mo}}))))}}),Pa="12px",Na="6px",Vp=Re({name:"Pallete",props:{clsPrefix:{type:String,required:!0},rgba:{type:Array,default:null},displayedHue:{type:Number,required:!0},displayedSv:{type:Array,required:!0},onUpdateSV:{type:Function,required:!0},onComplete:Function},setup(e){const t=te(null);function n(l){t.value&&(Dr("mousemove",document,i),Dr("mouseup",document,c),i(l))}function i(l){const{value:u}=t;if(!u)return;const{width:h,height:f,left:b,bottom:y}=u.getBoundingClientRect(),k=(y-l.clientY)/f,C=(l.clientX-b)/h,S=100*(C>1?1:C<0?0:C),L=100*(k>1?1:k<0?0:k);e.onUpdateSV(S,L)}function c(){var l;$r("mousemove",document,i),$r("mouseup",document,c),(l=e.onComplete)===null||l===void 0||l.call(e)}return{palleteRef:t,handleColor:de(()=>{const{rgba:l}=e;return l?`rgb(${l[0]}, ${l[1]}, ${l[2]})`:""}),handleMouseDown:n}},render(){const{clsPrefix:e}=this;return D("div",{class:`${e}-color-picker-pallete`,onMousedown:this.handleMouseDown,ref:"palleteRef"},D("div",{class:`${e}-color-picker-pallete__layer`,style:{backgroundImage:`linear-gradient(90deg, white, hsl(${this.displayedHue}, 100%, 50%))`}}),D("div",{class:`${e}-color-picker-pallete__layer ${e}-color-picker-pallete__layer--shadowed`,style:{backgroundImage:"linear-gradient(180deg, rgba(0, 0, 0, 0%), rgba(0, 0, 0, 100%))"}}),this.rgba&&D("div",{class:`${e}-color-picker-handle`,style:{width:Pa,height:Pa,borderRadius:Na,left:`calc(${this.displayedSv[0]}% - ${Na})`,bottom:`calc(${this.displayedSv[1]}% - ${Na})`}},D("div",{class:`${e}-color-picker-handle__fill`,style:{backgroundColor:this.handleColor,borderRadius:Na,width:Pa,height:Pa}})))}}),Cl=zr("n-color-picker");function jp(e){return/^\d{1,3}\.?\d*$/.test(e.trim())?Math.max(0,Math.min(parseInt(e),255)):!1}function Gp(e){return/^\d{1,3}\.?\d*$/.test(e.trim())?Math.max(0,Math.min(parseInt(e),360)):!1}function Wp(e){return/^\d{1,3}\.?\d*$/.test(e.trim())?Math.max(0,Math.min(parseInt(e),100)):!1}function Xp(e){const t=e.trim();return/^#[0-9a-fA-F]+$/.test(t)?[4,5,7,9].includes(t.length):!1}function Yp(e){return/^\d{1,3}\.?\d*%$/.test(e.trim())?Math.max(0,Math.min(parseInt(e)/100,100)):!1}const Kp={paddingSmall:"0 4px"},kc=Re({name:"ColorInputUnit",props:{label:{type:String,required:!0},value:{type:[Number,String],default:null},showAlpha:Boolean,onUpdateValue:{type:Function,required:!0}},setup(e){const t=te(""),{themeRef:n}=Rt(Cl,null);go(()=>{t.value=i()});function i(){const{value:u}=e;if(u===null)return"";const{label:h}=e;return h==="HEX"?u:h==="A"?`${Math.floor(u*100)}%`:String(Math.floor(u))}function c(u){t.value=u}function l(u){let h,f;switch(e.label){case"HEX":f=Xp(u),f&&e.onUpdateValue(u),t.value=i();break;case"H":h=Gp(u),h===!1?t.value=i():e.onUpdateValue(h);break;case"S":case"L":case"V":h=Wp(u),h===!1?t.value=i():e.onUpdateValue(h);break;case"A":h=Yp(u),h===!1?t.value=i():e.onUpdateValue(h);break;case"R":case"G":case"B":h=jp(u),h===!1?t.value=i():e.onUpdateValue(h);break}}return{mergedTheme:n,inputValue:t,handleInputChange:l,handleInputUpdateValue:c}},render(){const{mergedTheme:e}=this;return D(kn,{size:"small",placeholder:this.label,theme:e.peers.Input,themeOverrides:e.peerOverrides.Input,builtinThemeOverrides:Kp,value:this.inputValue,onUpdateValue:this.handleInputUpdateValue,onChange:this.handleInputChange,style:this.label==="A"?"flex-grow: 1.25;":""})}}),Zp=Re({name:"ColorInput",props:{clsPrefix:{type:String,required:!0},mode:{type:String,required:!0},modes:{type:Array,required:!0},showAlpha:{type:Boolean,required:!0},value:{type:String,default:null},valueArr:{type:Array,default:null},onUpdateValue:{type:Function,required:!0},onUpdateMode:{type:Function,required:!0}},setup(e){return{handleUnitUpdateValue(t,n){const{showAlpha:i}=e;if(e.mode==="hex"){e.onUpdateValue((i?Tn:No)(n));return}let c;switch(e.valueArr===null?c=[0,0,0,0]:c=Array.from(e.valueArr),e.mode){case"hsv":c[t]=n,e.onUpdateValue((i?Hn:Js)(c));break;case"rgb":c[t]=n,e.onUpdateValue((i?nn:Zs)(c));break;case"hsl":c[t]=n,e.onUpdateValue((i?_n:Ks)(c));break}}}},render(){const{clsPrefix:e,modes:t}=this;return D("div",{class:`${e}-color-picker-input`},D("div",{class:`${e}-color-picker-input__mode`,onClick:this.onUpdateMode,style:{cursor:t.length===1?"":"pointer"}},this.mode.toUpperCase()+(this.showAlpha?"A":"")),D(al,null,{default:()=>{const{mode:n,valueArr:i,showAlpha:c}=this;if(n==="hex"){let l=null;try{l=i===null?null:(c?Tn:No)(i)}catch{}return D(kc,{label:"HEX",showAlpha:c,value:l,onUpdateValue:u=>{this.handleUnitUpdateValue(0,u)}})}return(n+(c?"a":"")).split("").map((l,u)=>D(kc,{label:l.toUpperCase(),value:i===null?null:i[u],onUpdateValue:h=>{this.handleUnitUpdateValue(u,h)}}))}}))}}),Jp=Re({name:"ColorPickerTrigger",props:{clsPrefix:{type:String,required:!0},value:{type:String,default:null},hsla:{type:Array,default:null},disabled:Boolean,onClick:Function},setup(e){const{colorPickerSlots:t,renderLabelRef:n}=Rt(Cl,null);return()=>{const{hsla:i,value:c,clsPrefix:l,onClick:u,disabled:h}=e,f=t.label||n.value;return D("div",{class:[`${l}-color-picker-trigger`,h&&`${l}-color-picker-trigger--disabled`],onClick:h?void 0:u},D("div",{class:`${l}-color-picker-trigger__fill`},D("div",{class:`${l}-color-picker-checkboard`}),D("div",{style:{position:"absolute",left:0,right:0,top:0,bottom:0,backgroundColor:i?_n(i):""}}),c&&i?D("div",{class:`${l}-color-picker-trigger__value`,style:{color:i[2]>50||i[3]<.5?"black":"white"}},f?f(c):c):null))}}});function Qp(e,t){if(t==="hsv"){const[n,i,c,l]=Vn(e);return nn([...xn(n,i,c),l])}return e}function em(e){const t=document.createElement("canvas").getContext("2d");return t?(t.fillStyle=e,t.fillStyle):"#000000"}const tm=Re({name:"ColorPickerSwatches",props:{clsPrefix:{type:String,required:!0},mode:{type:String,required:!0},swatches:{type:Array,required:!0},onUpdateColor:{type:Function,required:!0}},setup(e){const t=de(()=>e.swatches.map(l=>{const u=Wo(l);return{value:l,mode:u,legalValue:Qp(l,u)}}));function n(l){const{mode:u}=e;let{value:h,mode:f}=l;return f||(f="hex",/^[a-zA-Z]+$/.test(h)?h=em(h):(hi("color-picker",`color ${h} in swatches is invalid.`),h="#000000")),f===u?h:ud(h,u,f)}function i(l){e.onUpdateColor(n(l))}function c(l,u){l.key==="Enter"&&i(u)}return{parsedSwatchesRef:t,handleSwatchSelect:i,handleSwatchKeyDown:c}},render(){const{clsPrefix:e}=this;return D("div",{class:`${e}-color-picker-swatches`},this.parsedSwatchesRef.map(t=>D("div",{class:`${e}-color-picker-swatch`,tabindex:0,onClick:()=>{this.handleSwatchSelect(t)},onKeydown:n=>{this.handleSwatchKeyDown(n,t)}},D("div",{class:`${e}-color-picker-swatch__fill`,style:{background:t.legalValue}}))))}}),rm=Re({name:"ColorPreview",props:{clsPrefix:{type:String,required:!0},mode:{type:String,required:!0},color:{type:String,default:null,validator:e=>{const t=Wo(e);return!!(!e||t&&t!=="hsv")}},onUpdateColor:{type:Function,required:!0}},setup(e){function t(n){var i;const c=n.target.value;(i=e.onUpdateColor)===null||i===void 0||i.call(e,ud(c.toUpperCase(),e.mode,"hex")),n.stopPropagation()}return{handleChange:t}},render(){const{clsPrefix:e}=this;return D("div",{class:`${e}-color-picker-preview__preview`},D("span",{class:`${e}-color-picker-preview__fill`,style:{background:this.color||"#000000"}}),D("input",{class:`${e}-color-picker-preview__input`,type:"color",value:this.color,onChange:this.handleChange}))}}),nm=he([O("color-picker",` - display: inline-block; - box-sizing: border-box; - height: var(--n-height); - font-size: var(--n-font-size); - width: 100%; - position: relative; - `),O("color-picker-panel",` - margin: 4px 0; - width: 240px; - font-size: var(--n-panel-font-size); - color: var(--n-text-color); - background-color: var(--n-color); - transition: - box-shadow .3s var(--n-bezier), - color .3s var(--n-bezier), - background-color .3s var(--n-bezier); - border-radius: var(--n-border-radius); - box-shadow: var(--n-box-shadow); - `,[bl(),O("input",` - text-align: center; - `)]),O("color-picker-checkboard",` - background: white; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `,[he("&::after",` - background-image: linear-gradient(45deg, #DDD 25%, #0000 25%), linear-gradient(-45deg, #DDD 25%, #0000 25%), linear-gradient(45deg, #0000 75%, #DDD 75%), linear-gradient(-45deg, #0000 75%, #DDD 75%); - background-size: 12px 12px; - background-position: 0 0, 0 6px, 6px -6px, -6px 0px; - background-repeat: repeat; - content: ""; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `)]),O("color-picker-slider",` - margin-bottom: 8px; - position: relative; - box-sizing: border-box; - `,[we("image",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `),he("&::after",` - content: ""; - position: absolute; - border-radius: inherit; - left: 0; - right: 0; - top: 0; - bottom: 0; - box-shadow: inset 0 0 2px 0 rgba(0, 0, 0, .24); - pointer-events: none; - `)]),O("color-picker-handle",` - z-index: 1; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .45); - position: absolute; - background-color: white; - overflow: hidden; - `,[we("fill",` - box-sizing: border-box; - border: 2px solid white; - `)]),O("color-picker-pallete",` - height: 180px; - position: relative; - margin-bottom: 8px; - cursor: crosshair; - `,[we("layer",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `,[le("shadowed",` - box-shadow: inset 0 0 2px 0 rgba(0, 0, 0, .24); - `)])]),O("color-picker-preview",` - display: flex; - `,[we("sliders",` - flex: 1 0 auto; - `),we("preview",` - position: relative; - height: 30px; - width: 30px; - margin: 0 0 8px 6px; - border-radius: 50%; - box-shadow: rgba(0, 0, 0, .15) 0px 0px 0px 1px inset; - overflow: hidden; - `),we("fill",` - display: block; - width: 30px; - height: 30px; - `),we("input",` - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - opacity: 0; - z-index: 1; - `)]),O("color-picker-input",` - display: flex; - align-items: center; - `,[O("input",` - flex-grow: 1; - flex-basis: 0; - `),we("mode",` - width: 72px; - text-align: center; - `)]),O("color-picker-control",` - padding: 12px; - `),O("color-picker-action",` - display: flex; - margin-top: -4px; - border-top: 1px solid var(--n-divider-color); - padding: 8px 12px; - justify-content: flex-end; - `,[O("button","margin-left: 8px;")]),O("color-picker-trigger",` - border: var(--n-border); - height: 100%; - box-sizing: border-box; - border-radius: var(--n-border-radius); - transition: border-color .3s var(--n-bezier); - cursor: pointer; - `,[we("value",` - white-space: nowrap; - position: relative; - `),we("fill",` - border-radius: var(--n-border-radius); - position: absolute; - display: flex; - align-items: center; - justify-content: center; - left: 4px; - right: 4px; - top: 4px; - bottom: 4px; - `),le("disabled","cursor: not-allowed"),O("color-picker-checkboard",` - border-radius: var(--n-border-radius); - `,[he("&::after",` - --n-block-size: calc((var(--n-height) - 8px) / 3); - background-size: calc(var(--n-block-size) * 2) calc(var(--n-block-size) * 2); - background-position: 0 0, 0 var(--n-block-size), var(--n-block-size) calc(-1 * var(--n-block-size)), calc(-1 * var(--n-block-size)) 0px; - `)])]),O("color-picker-swatches",` - display: grid; - grid-gap: 8px; - flex-wrap: wrap; - position: relative; - grid-template-columns: repeat(auto-fill, 18px); - margin-top: 10px; - `,[O("color-picker-swatch",` - width: 18px; - height: 18px; - background-image: linear-gradient(45deg, #DDD 25%, #0000 25%), linear-gradient(-45deg, #DDD 25%, #0000 25%), linear-gradient(45deg, #0000 75%, #DDD 75%), linear-gradient(-45deg, #0000 75%, #DDD 75%); - background-size: 8px 8px; - background-position: 0px 0, 0px 4px, 4px -4px, -4px 0px; - background-repeat: repeat; - `,[we("fill",` - position: relative; - width: 100%; - height: 100%; - border-radius: 3px; - box-shadow: rgba(0, 0, 0, .15) 0px 0px 0px 1px inset; - cursor: pointer; - `),he("&:focus",` - outline: none; - `,[we("fill",[he("&::after",` - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: inherit; - filter: blur(2px); - content: ""; - `)])])])])]),om=Object.assign(Object.assign({},dt.props),{value:String,show:{type:Boolean,default:void 0},defaultShow:Boolean,defaultValue:String,modes:{type:Array,default:()=>["rgb","hex","hsl"]},placement:{type:String,default:"bottom-start"},to:tl.propTo,showAlpha:{type:Boolean,default:!0},showPreview:Boolean,swatches:Array,disabled:{type:Boolean,default:void 0},actions:{type:Array,default:null},internalActions:Array,size:String,renderLabel:Function,onComplete:Function,onConfirm:Function,"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array]}),rn=Re({name:"ColorPicker",props:om,setup(e,{slots:t}){const n=te(null);let i=null;const c=Jo(e),{mergedSizeRef:l,mergedDisabledRef:u}=c,{localeRef:h}=Yf("global"),{mergedClsPrefixRef:f,namespaceRef:b,inlineThemeDisabled:y}=Ut(e),k=dt("ColorPicker","-color-picker",nm,Z1,e,f);xr(Cl,{themeRef:k,renderLabelRef:Ue(e,"renderLabel"),colorPickerSlots:t});const C=te(e.defaultShow),S=Vr(Ue(e,"show"),C);function L(Y){const{onUpdateShow:ye,"onUpdate:show":je}=e;ye&&Je(ye,Y),je&&Je(je,Y),C.value=Y}const{defaultValue:P}=e,$=te(P===void 0?Ip(e.modes,e.showAlpha):P),E=Vr(Ue(e,"value"),$),B=te([E.value]),M=te(0),U=de(()=>Wo(E.value)),{modes:q}=e,R=te(Wo(E.value)||q[0]||"rgb");function j(){const{modes:Y}=e,{value:ye}=R,je=Y.findIndex(Ke=>Ke===ye);~je?R.value=Y[(je+1)%Y.length]:R.value="rgb"}let ie,X,oe,Z,ee,ne,V,ae;const me=de(()=>{const{value:Y}=E;if(!Y)return null;switch(U.value){case"hsv":return Vn(Y);case"hsl":return[ie,X,oe,ae]=ho(Y),[...sd(ie,X,oe),ae];case"rgb":case"hex":return[ee,ne,V,ae]=tn(Y),[...rl(ee,ne,V),ae]}}),Ce=de(()=>{const{value:Y}=E;if(!Y)return null;switch(U.value){case"rgb":case"hex":return tn(Y);case"hsv":return[ie,X,Z,ae]=Vn(Y),[...xn(ie,X,Z),ae];case"hsl":return[ie,X,oe,ae]=ho(Y),[...ol(ie,X,oe),ae]}}),Le=de(()=>{const{value:Y}=E;if(!Y)return null;switch(U.value){case"hsl":return ho(Y);case"hsv":return[ie,X,Z,ae]=Vn(Y),[...Wa(ie,X,Z),ae];case"rgb":case"hex":return[ee,ne,V,ae]=tn(Y),[...nl(ee,ne,V),ae]}}),ht=de(()=>{switch(R.value){case"rgb":case"hex":return Ce.value;case"hsv":return me.value;case"hsl":return Le.value}}),gt=te(0),De=te(1),ve=te([0,0]);function Ee(Y,ye){const{value:je}=me,Ke=gt.value,lt=je?je[3]:1;ve.value=[Y,ye];const{showAlpha:rt}=e;switch(R.value){case"hsv":Be((rt?Hn:Js)([Ke,Y,ye,lt]),"cursor");break;case"hsl":Be((rt?_n:Ks)([...Wa(Ke,Y,ye),lt]),"cursor");break;case"rgb":Be((rt?nn:Zs)([...xn(Ke,Y,ye),lt]),"cursor");break;case"hex":Be((rt?Tn:No)([...xn(Ke,Y,ye),lt]),"cursor");break}}function Se(Y){gt.value=Y;const{value:ye}=me;if(!ye)return;const[,je,Ke,lt]=ye,{showAlpha:rt}=e;switch(R.value){case"hsv":Be((rt?Hn:Js)([Y,je,Ke,lt]),"cursor");break;case"rgb":Be((rt?nn:Zs)([...xn(Y,je,Ke),lt]),"cursor");break;case"hex":Be((rt?Tn:No)([...xn(Y,je,Ke),lt]),"cursor");break;case"hsl":Be((rt?_n:Ks)([...Wa(Y,je,Ke),lt]),"cursor");break}}function Ze(Y){switch(R.value){case"hsv":[ie,X,Z]=me.value,Be(Hn([ie,X,Z,Y]),"cursor");break;case"rgb":[ee,ne,V]=Ce.value,Be(nn([ee,ne,V,Y]),"cursor");break;case"hex":[ee,ne,V]=Ce.value,Be(Tn([ee,ne,V,Y]),"cursor");break;case"hsl":[ie,X,oe]=Le.value,Be(_n([ie,X,oe,Y]),"cursor");break}De.value=Y}function Be(Y,ye){ye==="cursor"?i=Y:i=null;const{nTriggerFormChange:je,nTriggerFormInput:Ke}=c,{onUpdateValue:lt,"onUpdate:value":rt}=e;lt&&Je(lt,Y),rt&&Je(rt,Y),je(),Ke(),$.value=Y}function Ye(Y){Be(Y,"input"),An(wt)}function wt(Y=!0){const{value:ye}=E;if(ye){const{nTriggerFormChange:je,nTriggerFormInput:Ke}=c,{onComplete:lt}=e;lt&<(ye);const{value:rt}=B,{value:Pt}=M;Y&&(rt.splice(Pt+1,rt.length,ye),M.value=Pt+1),je(),Ke()}}function Rr(){const{value:Y}=M;Y-1<0||(Be(B.value[Y-1],"input"),wt(!1),M.value=Y-1)}function hr(){const{value:Y}=M;Y<0||Y+1>=B.value.length||(Be(B.value[Y+1],"input"),wt(!1),M.value=Y+1)}function Mr(){Be(null,"input"),L(!1)}function Xr(){const{value:Y}=E,{onConfirm:ye}=e;ye&&ye(Y),L(!1)}const ln=de(()=>M.value>=1),cn=de(()=>{const{value:Y}=B;return Y.length>1&&M.value{Y||(B.value=[E.value],M.value=0)}),go(()=>{if(!(i&&i===E.value)){const{value:Y}=me;Y&&(gt.value=Y[0],De.value=Y[3],ve.value=[Y[1],Y[2]])}i=null});const Xt=de(()=>{const{value:Y}=l,{common:{cubicBezierEaseInOut:ye},self:{textColor:je,color:Ke,panelFontSize:lt,boxShadow:rt,border:Pt,borderRadius:Nt,dividerColor:Sr,[ut("height",Y)]:Yn,[ut("fontSize",Y)]:Kn}}=k.value;return{"--n-bezier":ye,"--n-text-color":je,"--n-color":Ke,"--n-panel-font-size":lt,"--n-font-size":Kn,"--n-box-shadow":rt,"--n-border":Pt,"--n-border-radius":Nt,"--n-height":Yn,"--n-divider-color":Sr}}),ue=y?kr("color-picker",de(()=>l.value[0]),Xt,e):void 0;function Te(){var Y;const{value:ye}=Ce,{value:je}=gt,{internalActions:Ke,modes:lt,actions:rt}=e,{value:Pt}=k,{value:Nt}=f;return D("div",{class:[`${Nt}-color-picker-panel`,ue==null?void 0:ue.themeClass.value],onDragstart:Sr=>{Sr.preventDefault()},style:y?void 0:Xt.value},D("div",{class:`${Nt}-color-picker-control`},D(Vp,{clsPrefix:Nt,rgba:ye,displayedHue:je,displayedSv:ve.value,onUpdateSV:Ee,onComplete:wt}),D("div",{class:`${Nt}-color-picker-preview`},D("div",{class:`${Nt}-color-picker-preview__sliders`},D(Op,{clsPrefix:Nt,hue:je,onUpdateHue:Se,onComplete:wt}),e.showAlpha?D(Hp,{clsPrefix:Nt,rgba:ye,alpha:De.value,onUpdateAlpha:Ze,onComplete:wt}):null),e.showPreview?D(rm,{clsPrefix:Nt,mode:R.value,color:Ce.value&&No(Ce.value),onUpdateColor:Sr=>{Be(Sr,"input")}}):null),D(Zp,{clsPrefix:Nt,showAlpha:e.showAlpha,mode:R.value,modes:lt,onUpdateMode:j,value:E.value,valueArr:ht.value,onUpdateValue:Ye}),((Y=e.swatches)===null||Y===void 0?void 0:Y.length)&&D(tm,{clsPrefix:Nt,mode:R.value,swatches:e.swatches,onUpdateColor:Sr=>{Be(Sr,"input")}})),rt!=null&&rt.length?D("div",{class:`${Nt}-color-picker-action`},rt.includes("confirm")&&D(Dt,{size:"small",onClick:Xr,theme:Pt.peers.Button,themeOverrides:Pt.peerOverrides.Button},{default:()=>h.value.confirm}),rt.includes("clear")&&D(Dt,{size:"small",onClick:Mr,disabled:!E.value,theme:Pt.peers.Button,themeOverrides:Pt.peerOverrides.Button},{default:()=>h.value.clear})):null,t.action?D("div",{class:`${Nt}-color-picker-action`},{default:t.action}):Ke?D("div",{class:`${Nt}-color-picker-action`},Ke.includes("undo")&&D(Dt,{size:"small",onClick:Rr,disabled:!ln.value,theme:Pt.peers.Button,themeOverrides:Pt.peerOverrides.Button},{default:()=>h.value.undo}),Ke.includes("redo")&&D(Dt,{size:"small",onClick:hr,disabled:!cn.value,theme:Pt.peers.Button,themeOverrides:Pt.peerOverrides.Button},{default:()=>h.value.redo})):null)}return{mergedClsPrefix:f,namespace:b,selfRef:n,hsla:Le,rgba:Ce,mergedShow:S,mergedDisabled:u,isMounted:Pu(),adjustedTo:tl(e),mergedValue:E,handleTriggerClick(){L(!0)},handleClickOutside(Y){var ye;!((ye=n.value)===null||ye===void 0)&&ye.contains(Y1(Y))||L(!1)},renderPanel:Te,cssVars:y?void 0:Xt,themeClass:ue==null?void 0:ue.themeClass,onRender:ue==null?void 0:ue.onRender}},render(){const{$slots:e,mergedClsPrefix:t,onRender:n}=this;return n==null||n(),D("div",{class:[this.themeClass,`${t}-color-picker`],ref:"selfRef",style:this.cssVars},D(rd,null,{default:()=>[D(nd,null,{default:()=>D(Jp,{clsPrefix:t,value:this.mergedValue,hsla:this.hsla,disabled:this.mergedDisabled,onClick:this.handleTriggerClick},{label:e.label})}),D(od,{placement:this.placement,show:this.mergedShow,containerClass:this.namespace,teleportDisabled:this.adjustedTo===tl.tdkey,to:this.adjustedTo},{default:()=>D(yl,{name:"fade-in-scale-up-transition",appear:this.isMounted},{default:()=>this.mergedShow?fi(this.renderPanel(),[[K1,this.handleClickOutside,void 0,{capture:!0}]]):null})})]}))}}),am=D("svg",{viewBox:"0 0 64 64",class:"check-icon"},D("path",{d:"M50.42,16.76L22.34,39.45l-8.1-11.46c-1.12-1.58-3.3-1.96-4.88-0.84c-1.58,1.12-1.95,3.3-0.84,4.88l10.26,14.51 c0.56,0.79,1.42,1.31,2.38,1.45c0.16,0.02,0.32,0.03,0.48,0.03c0.8,0,1.57-0.27,2.2-0.78l30.99-25.03c1.5-1.21,1.74-3.42,0.52-4.92 C54.13,15.78,51.93,15.55,50.42,16.76z"})),im=D("svg",{viewBox:"0 0 100 100",class:"line-icon"},D("path",{d:"M80.2,55.5H21.4c-2.8,0-5.1-2.5-5.1-5.5l0,0c0-3,2.3-5.5,5.1-5.5h58.7c2.8,0,5.1,2.5,5.1,5.5l0,0C85.2,53.1,82.9,55.5,80.2,55.5z"})),dd=zr("n-checkbox-group"),sm={min:Number,max:Number,size:String,value:Array,defaultValue:{type:Array,default:null},disabled:{type:Boolean,default:void 0},"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onChange:[Function,Array]},WQ=Re({name:"CheckboxGroup",props:sm,setup(e){const{mergedClsPrefixRef:t}=Ut(e),n=Jo(e),{mergedSizeRef:i,mergedDisabledRef:c}=n,l=te(e.defaultValue),u=de(()=>e.value),h=Vr(u,l),f=de(()=>{var k;return((k=h.value)===null||k===void 0?void 0:k.length)||0}),b=de(()=>Array.isArray(h.value)?new Set(h.value):new Set);function y(k,C){const{nTriggerFormInput:S,nTriggerFormChange:L}=n,{onChange:P,"onUpdate:value":$,onUpdateValue:E}=e;if(Array.isArray(h.value)){const B=Array.from(h.value),M=B.findIndex(U=>U===C);k?~M||(B.push(C),E&&Je(E,B,{actionType:"check",value:C}),$&&Je($,B,{actionType:"check",value:C}),S(),L(),l.value=B,P&&Je(P,B)):~M&&(B.splice(M,1),E&&Je(E,B,{actionType:"uncheck",value:C}),$&&Je($,B,{actionType:"uncheck",value:C}),P&&Je(P,B),l.value=B,S(),L())}else k?(E&&Je(E,[C],{actionType:"check",value:C}),$&&Je($,[C],{actionType:"check",value:C}),P&&Je(P,[C]),l.value=[C],S(),L()):(E&&Je(E,[],{actionType:"uncheck",value:C}),$&&Je($,[],{actionType:"uncheck",value:C}),P&&Je(P,[]),l.value=[],S(),L())}return xr(dd,{checkedCountRef:f,maxRef:Ue(e,"max"),minRef:Ue(e,"min"),valueSetRef:b,disabledRef:c,mergedSizeRef:i,toggleCheckbox:y}),{mergedClsPrefix:t}},render(){return D("div",{class:`${this.mergedClsPrefix}-checkbox-group`,role:"group"},this.$slots)}}),lm=he([O("checkbox",` - font-size: var(--n-font-size); - outline: none; - cursor: pointer; - display: inline-flex; - flex-wrap: nowrap; - align-items: flex-start; - word-break: break-word; - line-height: var(--n-size); - --n-merged-color-table: var(--n-color-table); - `,[le("show-label","line-height: var(--n-label-line-height);"),he("&:hover",[O("checkbox-box",[we("border","border: var(--n-border-checked);")])]),he("&:focus:not(:active)",[O("checkbox-box",[we("border",` - border: var(--n-border-focus); - box-shadow: var(--n-box-shadow-focus); - `)])]),le("inside-table",[O("checkbox-box",` - background-color: var(--n-merged-color-table); - `)]),le("checked",[O("checkbox-box",` - background-color: var(--n-color-checked); - `,[O("checkbox-icon",[he(".check-icon",` - opacity: 1; - transform: scale(1); - `)])])]),le("indeterminate",[O("checkbox-box",[O("checkbox-icon",[he(".check-icon",` - opacity: 0; - transform: scale(.5); - `),he(".line-icon",` - opacity: 1; - transform: scale(1); - `)])])]),le("checked, indeterminate",[he("&:focus:not(:active)",[O("checkbox-box",[we("border",` - border: var(--n-border-checked); - box-shadow: var(--n-box-shadow-focus); - `)])]),O("checkbox-box",` - background-color: var(--n-color-checked); - border-left: 0; - border-top: 0; - `,[we("border",{border:"var(--n-border-checked)"})])]),le("disabled",{cursor:"not-allowed"},[le("checked",[O("checkbox-box",` - background-color: var(--n-color-disabled-checked); - `,[we("border",{border:"var(--n-border-disabled-checked)"}),O("checkbox-icon",[he(".check-icon, .line-icon",{fill:"var(--n-check-mark-color-disabled-checked)"})])])]),O("checkbox-box",` - background-color: var(--n-color-disabled); - `,[we("border",` - border: var(--n-border-disabled); - `),O("checkbox-icon",[he(".check-icon, .line-icon",` - fill: var(--n-check-mark-color-disabled); - `)])]),we("label",` - color: var(--n-text-color-disabled); - `)]),O("checkbox-box-wrapper",` - position: relative; - width: var(--n-size); - flex-shrink: 0; - flex-grow: 0; - user-select: none; - -webkit-user-select: none; - `),O("checkbox-box",` - position: absolute; - left: 0; - top: 50%; - transform: translateY(-50%); - height: var(--n-size); - width: var(--n-size); - display: inline-block; - box-sizing: border-box; - border-radius: var(--n-border-radius); - background-color: var(--n-color); - transition: background-color 0.3s var(--n-bezier); - `,[we("border",` - transition: - border-color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); - border-radius: inherit; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - border: var(--n-border); - `),O("checkbox-icon",` - display: flex; - align-items: center; - justify-content: center; - position: absolute; - left: 1px; - right: 1px; - top: 1px; - bottom: 1px; - `,[he(".check-icon, .line-icon",` - width: 100%; - fill: var(--n-check-mark-color); - opacity: 0; - transform: scale(0.5); - transform-origin: center; - transition: - fill 0.3s var(--n-bezier), - transform 0.3s var(--n-bezier), - opacity 0.3s var(--n-bezier), - border-color 0.3s var(--n-bezier); - `),Nu({left:"1px",top:"1px"})])]),we("label",` - color: var(--n-text-color); - transition: color .3s var(--n-bezier); - user-select: none; - -webkit-user-select: none; - padding: var(--n-label-padding); - font-weight: var(--n-label-font-weight); - `,[he("&:empty",{display:"none"})])]),Bu(O("checkbox",` - --n-merged-color-table: var(--n-color-table-modal); - `)),Iu(O("checkbox",` - --n-merged-color-table: var(--n-color-table-popover); - `))]),cm=Object.assign(Object.assign({},dt.props),{size:String,checked:{type:[Boolean,String,Number],default:void 0},defaultChecked:{type:[Boolean,String,Number],default:!1},value:[String,Number],disabled:{type:Boolean,default:void 0},indeterminate:Boolean,label:String,focusable:{type:Boolean,default:!0},checkedValue:{type:[Boolean,String,Number],default:!0},uncheckedValue:{type:[Boolean,String,Number],default:!1},"onUpdate:checked":[Function,Array],onUpdateChecked:[Function,Array],privateInsideTable:Boolean,onChange:[Function,Array]}),um=Re({name:"Checkbox",props:cm,setup(e){const t=te(null),{mergedClsPrefixRef:n,inlineThemeDisabled:i,mergedRtlRef:c}=Ut(e),l=Jo(e,{mergedSize(R){const{size:j}=e;if(j!==void 0)return j;if(f){const{value:ie}=f.mergedSizeRef;if(ie!==void 0)return ie}if(R){const{mergedSize:ie}=R;if(ie!==void 0)return ie.value}return"medium"},mergedDisabled(R){const{disabled:j}=e;if(j!==void 0)return j;if(f){if(f.disabledRef.value)return!0;const{maxRef:{value:ie},checkedCountRef:X}=f;if(ie!==void 0&&X.value>=ie&&!C.value)return!0;const{minRef:{value:oe}}=f;if(oe!==void 0&&X.value<=oe&&C.value)return!0}return R?R.disabled.value:!1}}),{mergedDisabledRef:u,mergedSizeRef:h}=l,f=Rt(dd,null),b=te(e.defaultChecked),y=Ue(e,"checked"),k=Vr(y,b),C=Dn(()=>{if(f){const R=f.valueSetRef.value;return R&&e.value!==void 0?R.has(e.value):!1}else return k.value===e.checkedValue}),S=dt("Checkbox","-checkbox",lm,J1,e,n);function L(R){if(f&&e.value!==void 0)f.toggleCheckbox(!C.value,e.value);else{const{onChange:j,"onUpdate:checked":ie,onUpdateChecked:X}=e,{nTriggerFormInput:oe,nTriggerFormChange:Z}=l,ee=C.value?e.uncheckedValue:e.checkedValue;ie&&Je(ie,ee,R),X&&Je(X,ee,R),j&&Je(j,ee,R),oe(),Z(),b.value=ee}}function P(R){u.value||L(R)}function $(R){if(!u.value)switch(R.key){case" ":case"Enter":L(R)}}function E(R){switch(R.key){case" ":R.preventDefault()}}const B={focus:()=>{var R;(R=t.value)===null||R===void 0||R.focus()},blur:()=>{var R;(R=t.value)===null||R===void 0||R.blur()}},M=xl("Checkbox",c,n),U=de(()=>{const{value:R}=h,{common:{cubicBezierEaseInOut:j},self:{borderRadius:ie,color:X,colorChecked:oe,colorDisabled:Z,colorTableHeader:ee,colorTableHeaderModal:ne,colorTableHeaderPopover:V,checkMarkColor:ae,checkMarkColorDisabled:me,border:Ce,borderFocus:Le,borderDisabled:ht,borderChecked:gt,boxShadowFocus:De,textColor:ve,textColorDisabled:Ee,checkMarkColorDisabledChecked:Se,colorDisabledChecked:Ze,borderDisabledChecked:Be,labelPadding:Ye,labelLineHeight:wt,labelFontWeight:Rr,[ut("fontSize",R)]:hr,[ut("size",R)]:Mr}}=S.value;return{"--n-label-line-height":wt,"--n-label-font-weight":Rr,"--n-size":Mr,"--n-bezier":j,"--n-border-radius":ie,"--n-border":Ce,"--n-border-checked":gt,"--n-border-focus":Le,"--n-border-disabled":ht,"--n-border-disabled-checked":Be,"--n-box-shadow-focus":De,"--n-color":X,"--n-color-checked":oe,"--n-color-table":ee,"--n-color-table-modal":ne,"--n-color-table-popover":V,"--n-color-disabled":Z,"--n-color-disabled-checked":Ze,"--n-text-color":ve,"--n-text-color-disabled":Ee,"--n-check-mark-color":ae,"--n-check-mark-color-disabled":me,"--n-check-mark-color-disabled-checked":Se,"--n-font-size":hr,"--n-label-padding":Ye}}),q=i?kr("checkbox",de(()=>h.value[0]),U,e):void 0;return Object.assign(l,B,{rtlEnabled:M,selfRef:t,mergedClsPrefix:n,mergedDisabled:u,renderedChecked:C,mergedTheme:S,labelId:Qs(),handleClick:P,handleKeyUp:$,handleKeyDown:E,cssVars:i?void 0:U,themeClass:q==null?void 0:q.themeClass,onRender:q==null?void 0:q.onRender})},render(){var e;const{$slots:t,renderedChecked:n,mergedDisabled:i,indeterminate:c,privateInsideTable:l,cssVars:u,labelId:h,label:f,mergedClsPrefix:b,focusable:y,handleKeyUp:k,handleKeyDown:C,handleClick:S}=this;(e=this.onRender)===null||e===void 0||e.call(this);const L=Vo(t.default,P=>f||P?D("span",{class:`${b}-checkbox__label`,id:h},f||P):null);return D("div",{ref:"selfRef",class:[`${b}-checkbox`,this.themeClass,this.rtlEnabled&&`${b}-checkbox--rtl`,n&&`${b}-checkbox--checked`,i&&`${b}-checkbox--disabled`,c&&`${b}-checkbox--indeterminate`,l&&`${b}-checkbox--inside-table`,L&&`${b}-checkbox--show-label`],tabindex:i||!y?void 0:0,role:"checkbox","aria-checked":c?"mixed":n,"aria-labelledby":h,style:u,onKeyup:k,onKeydown:C,onClick:S,onMousedown:()=>{Dr("selectstart",window,P=>{P.preventDefault()},{once:!0})}},D("div",{class:`${b}-checkbox-box-wrapper`}," ",D("div",{class:`${b}-checkbox-box`},D(qu,null,{default:()=>this.indeterminate?D("div",{key:"indeterminate",class:`${b}-checkbox-icon`},im):D("div",{key:"check",class:`${b}-checkbox-icon`},am)}),D("div",{class:`${b}-checkbox-box__border`}))),L)}}),dm={name:String,value:{type:[String,Number,Boolean],default:"on"},checked:{type:Boolean,default:void 0},defaultChecked:Boolean,disabled:{type:Boolean,default:void 0},label:String,size:String,onUpdateChecked:[Function,Array],"onUpdate:checked":[Function,Array],checkedValue:{type:Boolean,default:void 0}},hm=zr("n-radio-group");function fm(e){const t=Jo(e,{mergedSize(B){const{size:M}=e;if(M!==void 0)return M;if(u){const{mergedSizeRef:{value:U}}=u;if(U!==void 0)return U}return B?B.mergedSize.value:"medium"},mergedDisabled(B){return!!(e.disabled||u!=null&&u.disabledRef.value||B!=null&&B.disabled.value)}}),{mergedSizeRef:n,mergedDisabledRef:i}=t,c=te(null),l=te(null),u=Rt(hm,null),h=te(e.defaultChecked),f=Ue(e,"checked"),b=Vr(f,h),y=Dn(()=>u?u.valueRef.value===e.value:b.value),k=Dn(()=>{const{name:B}=e;if(B!==void 0)return B;if(u)return u.nameRef.value}),C=te(!1);function S(){if(u){const{doUpdateValue:B}=u,{value:M}=e;Je(B,M)}else{const{onUpdateChecked:B,"onUpdate:checked":M}=e,{nTriggerFormInput:U,nTriggerFormChange:q}=t;B&&Je(B,!0),M&&Je(M,!0),U(),q(),h.value=!0}}function L(){i.value||y.value||S()}function P(){L()}function $(){C.value=!1}function E(){C.value=!0}return{mergedClsPrefix:u?u.mergedClsPrefixRef:Ut(e).mergedClsPrefixRef,inputRef:c,labelRef:l,mergedName:k,mergedDisabled:i,uncontrolledChecked:h,renderSafeChecked:y,focus:C,mergedSize:n,handleRadioInputChange:P,handleRadioInputBlur:$,handleRadioInputFocus:E}}const pm=O("radio",` - line-height: var(--n-label-line-height); - outline: none; - position: relative; - user-select: none; - -webkit-user-select: none; - display: inline-flex; - align-items: flex-start; - flex-wrap: nowrap; - font-size: var(--n-font-size); - word-break: break-word; -`,[le("checked",[we("dot",` - background-color: var(--n-color-active); - `)]),we("dot-wrapper",` - position: relative; - flex-shrink: 0; - flex-grow: 0; - width: var(--n-radio-size); - `),O("radio-input",` - position: absolute; - border: 0; - border-radius: inherit; - left: 0; - right: 0; - top: 0; - bottom: 0; - opacity: 0; - z-index: 1; - cursor: pointer; - `),we("dot",` - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); - height: var(--n-radio-size); - width: var(--n-radio-size); - background: var(--n-color); - box-shadow: var(--n-box-shadow); - border-radius: 50%; - transition: - background-color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); - `,[he("&::before",` - content: ""; - opacity: 0; - position: absolute; - left: 4px; - top: 4px; - height: calc(100% - 8px); - width: calc(100% - 8px); - border-radius: 50%; - transform: scale(.8); - background: var(--n-dot-color-active); - transition: - opacity .3s var(--n-bezier), - background-color .3s var(--n-bezier), - transform .3s var(--n-bezier); - `),le("checked",{boxShadow:"var(--n-box-shadow-active)"},[he("&::before",` - opacity: 1; - transform: scale(1); - `)])]),we("label",` - color: var(--n-text-color); - padding: var(--n-label-padding); - font-weight: var(--n-label-font-weight); - display: inline-block; - transition: color .3s var(--n-bezier); - `),ei("disabled",` - cursor: pointer; - `,[he("&:hover",[we("dot",{boxShadow:"var(--n-box-shadow-hover)"})]),le("focus",[he("&:not(:active)",[we("dot",{boxShadow:"var(--n-box-shadow-focus)"})])])]),le("disabled",` - cursor: not-allowed; - `,[we("dot",{boxShadow:"var(--n-box-shadow-disabled)",backgroundColor:"var(--n-color-disabled)"},[he("&::before",{backgroundColor:"var(--n-dot-color-disabled)"}),le("checked",` - opacity: 1; - `)]),we("label",{color:"var(--n-text-color-disabled)"}),O("radio-input",` - cursor: not-allowed; - `)])]),mm=Object.assign(Object.assign({},dt.props),dm),xs=Re({name:"Radio",props:mm,setup(e){const t=fm(e),n=dt("Radio","-radio",pm,Q1,e,t.mergedClsPrefix),i=de(()=>{const{mergedSize:{value:b}}=t,{common:{cubicBezierEaseInOut:y},self:{boxShadow:k,boxShadowActive:C,boxShadowDisabled:S,boxShadowFocus:L,boxShadowHover:P,color:$,colorDisabled:E,colorActive:B,textColor:M,textColorDisabled:U,dotColorActive:q,dotColorDisabled:R,labelPadding:j,labelLineHeight:ie,labelFontWeight:X,[ut("fontSize",b)]:oe,[ut("radioSize",b)]:Z}}=n.value;return{"--n-bezier":y,"--n-label-line-height":ie,"--n-label-font-weight":X,"--n-box-shadow":k,"--n-box-shadow-active":C,"--n-box-shadow-disabled":S,"--n-box-shadow-focus":L,"--n-box-shadow-hover":P,"--n-color":$,"--n-color-active":B,"--n-color-disabled":E,"--n-dot-color-active":q,"--n-dot-color-disabled":R,"--n-font-size":oe,"--n-radio-size":Z,"--n-text-color":M,"--n-text-color-disabled":U,"--n-label-padding":j}}),{inlineThemeDisabled:c,mergedClsPrefixRef:l,mergedRtlRef:u}=Ut(e),h=xl("Radio",u,l),f=c?kr("radio",de(()=>t.mergedSize.value[0]),i,e):void 0;return Object.assign(t,{rtlEnabled:h,cssVars:c?void 0:i,themeClass:f==null?void 0:f.themeClass,onRender:f==null?void 0:f.onRender})},render(){const{$slots:e,mergedClsPrefix:t,onRender:n,label:i}=this;return n==null||n(),D("label",{class:[`${t}-radio`,this.themeClass,{[`${t}-radio--rtl`]:this.rtlEnabled,[`${t}-radio--disabled`]:this.mergedDisabled,[`${t}-radio--checked`]:this.renderSafeChecked,[`${t}-radio--focus`]:this.focus}],style:this.cssVars},D("input",{ref:"inputRef",type:"radio",class:`${t}-radio-input`,value:this.value,name:this.mergedName,checked:this.renderSafeChecked,disabled:this.mergedDisabled,onChange:this.handleRadioInputChange,onFocus:this.handleRadioInputFocus,onBlur:this.handleRadioInputBlur}),D("div",{class:`${t}-radio__dot-wrapper`}," ",D("div",{class:[`${t}-radio__dot`,this.renderSafeChecked&&`${t}-radio__dot--checked`]})),Vo(e.default,c=>!c&&!i?null:D("div",{ref:"labelRef",class:`${t}-radio__label`},c||i)))}}),hd=Re({name:"DropdownDivider",props:{clsPrefix:{type:String,required:!0}},render(){return D("div",{class:`${this.clsPrefix}-dropdown-divider`})}}),vm=O("icon",` - height: 1em; - width: 1em; - line-height: 1em; - text-align: center; - display: inline-block; - position: relative; - fill: currentColor; - transform: translateZ(0); -`,[le("color-transition",{transition:"color .3s var(--n-bezier)"}),le("depth",{color:"var(--n-color)"},[he("svg",{opacity:"var(--n-opacity)",transition:"opacity .3s var(--n-bezier)"})]),he("svg",{height:"1em",width:"1em"})]),gm=Object.assign(Object.assign({},dt.props),{depth:[String,Number],size:[Number,String],color:String,component:Object}),bm=Re({_n_icon__:!0,name:"Icon",inheritAttrs:!1,props:gm,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:n}=Ut(e),i=dt("Icon","-icon",vm,ef,e,t),c=de(()=>{const{depth:u}=e,{common:{cubicBezierEaseInOut:h},self:f}=i.value;if(u!==void 0){const{color:b,[`opacity${u}Depth`]:y}=f;return{"--n-bezier":h,"--n-color":b,"--n-opacity":y}}return{"--n-bezier":h,"--n-color":"","--n-opacity":""}}),l=n?kr("icon",de(()=>`${e.depth||"d"}`),c,e):void 0;return{mergedClsPrefix:t,mergedStyle:de(()=>{const{size:u,color:h}=e;return{fontSize:br(u),color:h}}),cssVars:n?void 0:c,themeClass:l==null?void 0:l.themeClass,onRender:l==null?void 0:l.onRender}},render(){var e;const{$parent:t,depth:n,mergedClsPrefix:i,component:c,onRender:l,themeClass:u}=this;return!((e=t==null?void 0:t.$options)===null||e===void 0)&&e._n_icon__&&hi("icon","don't wrap `n-icon` inside `n-icon`"),l==null||l(),D("i",Xn(this.$attrs,{role:"img",class:[`${i}-icon`,u,{[`${i}-icon--depth`]:n,[`${i}-icon--color-transition`]:n!==void 0}],style:[this.cssVars,this.mergedStyle]}),c?D(c):this.$slots)}}),Al=zr("n-dropdown-menu"),vi=zr("n-dropdown"),Sc=zr("n-dropdown-option");function il(e,t){return e.type==="submenu"||e.type===void 0&&e[t]!==void 0}function ym(e){return e.type==="group"}function fd(e){return e.type==="divider"}function xm(e){return e.type==="render"}const pd=Re({name:"DropdownOption",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0},parentKey:{type:[String,Number],default:null},placement:{type:String,default:"right-start"},props:Object,scrollable:Boolean},setup(e){const t=Rt(vi),{hoverKeyRef:n,keyboardKeyRef:i,lastToggledSubmenuKeyRef:c,pendingKeyPathRef:l,activeKeyPathRef:u,animatedRef:h,mergedShowRef:f,renderLabelRef:b,renderIconRef:y,labelFieldRef:k,childrenFieldRef:C,renderOptionRef:S,nodePropsRef:L,menuPropsRef:P}=t,$=Rt(Sc,null),E=Rt(Al),B=Rt(Fu),M=de(()=>e.tmNode.rawNode),U=de(()=>{const{value:Ce}=C;return il(e.tmNode.rawNode,Ce)}),q=de(()=>{const{disabled:Ce}=e.tmNode;return Ce}),R=de(()=>{if(!U.value)return!1;const{key:Ce,disabled:Le}=e.tmNode;if(Le)return!1;const{value:ht}=n,{value:gt}=i,{value:De}=c,{value:ve}=l;return ht!==null?ve.includes(Ce):gt!==null?ve.includes(Ce)&&ve[ve.length-1]!==Ce:De!==null?ve.includes(Ce):!1}),j=de(()=>i.value===null&&!h.value),ie=rp(R,300,j),X=de(()=>!!($!=null&&$.enteringSubmenuRef.value)),oe=te(!1);xr(Sc,{enteringSubmenuRef:oe});function Z(){oe.value=!0}function ee(){oe.value=!1}function ne(){const{parentKey:Ce,tmNode:Le}=e;Le.disabled||f.value&&(c.value=Ce,i.value=null,n.value=Le.key)}function V(){const{tmNode:Ce}=e;Ce.disabled||f.value&&n.value!==Ce.key&&ne()}function ae(Ce){if(e.tmNode.disabled||!f.value)return;const{relatedTarget:Le}=Ce;Le&&!vc({target:Le},"dropdownOption")&&!vc({target:Le},"scrollbarRail")&&(n.value=null)}function me(){const{value:Ce}=U,{tmNode:Le}=e;f.value&&!Ce&&!Le.disabled&&(t.doSelect(Le.key,Le.rawNode),t.doUpdateShow(!1))}return{labelField:k,renderLabel:b,renderIcon:y,siblingHasIcon:E.showIconRef,siblingHasSubmenu:E.hasSubmenuRef,menuProps:P,popoverBody:B,animated:h,mergedShowSubmenu:de(()=>ie.value&&!X.value),rawNode:M,hasSubmenu:U,pending:Dn(()=>{const{value:Ce}=l,{key:Le}=e.tmNode;return Ce.includes(Le)}),childActive:Dn(()=>{const{value:Ce}=u,{key:Le}=e.tmNode,ht=Ce.findIndex(gt=>Le===gt);return ht===-1?!1:ht{const{value:Ce}=u,{key:Le}=e.tmNode,ht=Ce.findIndex(gt=>Le===gt);return ht===-1?!1:ht===Ce.length-1}),mergedDisabled:q,renderOption:S,nodeProps:L,handleClick:me,handleMouseMove:V,handleMouseEnter:ne,handleMouseLeave:ae,handleSubmenuBeforeEnter:Z,handleSubmenuAfterEnter:ee}},render(){var e,t;const{animated:n,rawNode:i,mergedShowSubmenu:c,clsPrefix:l,siblingHasIcon:u,siblingHasSubmenu:h,renderLabel:f,renderIcon:b,renderOption:y,nodeProps:k,props:C,scrollable:S}=this;let L=null;if(c){const B=(e=this.menuProps)===null||e===void 0?void 0:e.call(this,i,i.children);L=D(md,Object.assign({},B,{clsPrefix:l,scrollable:this.scrollable,tmNodes:this.tmNode.children,parentKey:this.tmNode.key}))}const P={class:[`${l}-dropdown-option-body`,this.pending&&`${l}-dropdown-option-body--pending`,this.active&&`${l}-dropdown-option-body--active`,this.childActive&&`${l}-dropdown-option-body--child-active`,this.mergedDisabled&&`${l}-dropdown-option-body--disabled`],onMousemove:this.handleMouseMove,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onClick:this.handleClick},$=k==null?void 0:k(i),E=D("div",Object.assign({class:[`${l}-dropdown-option`,$==null?void 0:$.class],"data-dropdown-option":!0},$),D("div",Xn(P,C),[D("div",{class:[`${l}-dropdown-option-body__prefix`,u&&`${l}-dropdown-option-body__prefix--show-icon`]},[b?b(i):jo(i.icon)]),D("div",{"data-dropdown-option":!0,class:`${l}-dropdown-option-body__label`},f?f(i):jo((t=i[this.labelField])!==null&&t!==void 0?t:i.title)),D("div",{"data-dropdown-option":!0,class:[`${l}-dropdown-option-body__suffix`,h&&`${l}-dropdown-option-body__suffix--has-submenu`]},this.hasSubmenu?D(bm,null,{default:()=>D(cd,null)}):null)]),this.hasSubmenu?D(rd,null,{default:()=>[D(nd,null,{default:()=>D("div",{class:`${l}-dropdown-offset-container`},D(od,{show:this.mergedShowSubmenu,placement:this.placement,to:S&&this.popoverBody||void 0,teleportDisabled:!S},{default:()=>D("div",{class:`${l}-dropdown-menu-wrapper`},n?D(yl,{onBeforeEnter:this.handleSubmenuBeforeEnter,onAfterEnter:this.handleSubmenuAfterEnter,name:"fade-in-scale-up-transition",appear:!0},{default:()=>L}):L)}))})]}):null);return y?y({node:E,option:i}):E}}),wm=Re({name:"DropdownGroupHeader",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0}},setup(){const{showIconRef:e,hasSubmenuRef:t}=Rt(Al),{renderLabelRef:n,labelFieldRef:i,nodePropsRef:c,renderOptionRef:l}=Rt(vi);return{labelField:i,showIcon:e,hasSubmenu:t,renderLabel:n,nodeProps:c,renderOption:l}},render(){var e;const{clsPrefix:t,hasSubmenu:n,showIcon:i,nodeProps:c,renderLabel:l,renderOption:u}=this,{rawNode:h}=this.tmNode,f=D("div",Object.assign({class:`${t}-dropdown-option`},c==null?void 0:c(h)),D("div",{class:`${t}-dropdown-option-body ${t}-dropdown-option-body--group`},D("div",{"data-dropdown-option":!0,class:[`${t}-dropdown-option-body__prefix`,i&&`${t}-dropdown-option-body__prefix--show-icon`]},jo(h.icon)),D("div",{class:`${t}-dropdown-option-body__label`,"data-dropdown-option":!0},l?l(h):jo((e=h.title)!==null&&e!==void 0?e:h[this.labelField])),D("div",{class:[`${t}-dropdown-option-body__suffix`,n&&`${t}-dropdown-option-body__suffix--has-submenu`],"data-dropdown-option":!0})));return u?u({node:f,option:h}):f}}),km=Re({name:"NDropdownGroup",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0},parentKey:{type:[String,Number],default:null}},render(){const{tmNode:e,parentKey:t,clsPrefix:n}=this,{children:i}=e;return D(cr,null,D(wm,{clsPrefix:n,tmNode:e,key:e.key}),i==null?void 0:i.map(c=>{const{rawNode:l}=c;return l.show===!1?null:fd(l)?D(hd,{clsPrefix:n,key:c.key}):c.isGroup?(hi("dropdown","`group` node is not allowed to be put in `group` node."),null):D(pd,{clsPrefix:n,tmNode:c,parentKey:t,key:c.key})}))}}),Sm=Re({name:"DropdownRenderOption",props:{tmNode:{type:Object,required:!0}},render(){const{rawNode:{render:e,props:t}}=this.tmNode;return D("div",t,[e==null?void 0:e()])}}),md=Re({name:"DropdownMenu",props:{scrollable:Boolean,showArrow:Boolean,arrowStyle:[String,Object],clsPrefix:{type:String,required:!0},tmNodes:{type:Array,default:()=>[]},parentKey:{type:[String,Number],default:null}},setup(e){const{renderIconRef:t,childrenFieldRef:n}=Rt(vi);xr(Al,{showIconRef:de(()=>{const c=t.value;return e.tmNodes.some(l=>{var u;if(l.isGroup)return(u=l.children)===null||u===void 0?void 0:u.some(({rawNode:f})=>c?c(f):f.icon);const{rawNode:h}=l;return c?c(h):h.icon})}),hasSubmenuRef:de(()=>{const{value:c}=n;return e.tmNodes.some(l=>{var u;if(l.isGroup)return(u=l.children)===null||u===void 0?void 0:u.some(({rawNode:f})=>il(f,c));const{rawNode:h}=l;return il(h,c)})})});const i=te(null);return xr(rf,null),xr(nf,null),xr(Fu,i),{bodyRef:i}},render(){const{parentKey:e,clsPrefix:t,scrollable:n}=this,i=this.tmNodes.map(c=>{const{rawNode:l}=c;return l.show===!1?null:xm(l)?D(Sm,{tmNode:c,key:c.key}):fd(l)?D(hd,{clsPrefix:t,key:c.key}):ym(l)?D(km,{clsPrefix:t,tmNode:c,parentKey:e,key:c.key}):D(pd,{clsPrefix:t,tmNode:c,parentKey:e,key:c.key,props:l.props,scrollable:n})});return D("div",{class:[`${t}-dropdown-menu`,n&&`${t}-dropdown-menu--scrollable`],ref:"bodyRef"},n?D(tf,{contentClass:`${t}-dropdown-menu__content`},{default:()=>i}):i,this.showArrow?Kf({clsPrefix:t,arrowStyle:this.arrowStyle,arrowClass:void 0,arrowWrapperClass:void 0,arrowWrapperStyle:void 0}):null)}}),Cm=O("dropdown-menu",` - transform-origin: var(--v-transform-origin); - background-color: var(--n-color); - border-radius: var(--n-border-radius); - box-shadow: var(--n-box-shadow); - position: relative; - transition: - background-color .3s var(--n-bezier), - box-shadow .3s var(--n-bezier); -`,[bl(),O("dropdown-option",` - position: relative; - `,[he("a",` - text-decoration: none; - color: inherit; - outline: none; - `,[he("&::before",` - content: ""; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `)]),O("dropdown-option-body",` - display: flex; - cursor: pointer; - position: relative; - height: var(--n-option-height); - line-height: var(--n-option-height); - font-size: var(--n-font-size); - color: var(--n-option-text-color); - transition: color .3s var(--n-bezier); - `,[he("&::before",` - content: ""; - position: absolute; - top: 0; - bottom: 0; - left: 4px; - right: 4px; - transition: background-color .3s var(--n-bezier); - border-radius: var(--n-border-radius); - `),ei("disabled",[le("pending",` - color: var(--n-option-text-color-hover); - `,[we("prefix, suffix",` - color: var(--n-option-text-color-hover); - `),he("&::before","background-color: var(--n-option-color-hover);")]),le("active",` - color: var(--n-option-text-color-active); - `,[we("prefix, suffix",` - color: var(--n-option-text-color-active); - `),he("&::before","background-color: var(--n-option-color-active);")]),le("child-active",` - color: var(--n-option-text-color-child-active); - `,[we("prefix, suffix",` - color: var(--n-option-text-color-child-active); - `)])]),le("disabled",` - cursor: not-allowed; - opacity: var(--n-option-opacity-disabled); - `),le("group",` - font-size: calc(var(--n-font-size) - 1px); - color: var(--n-group-header-text-color); - `,[we("prefix",` - width: calc(var(--n-option-prefix-width) / 2); - `,[le("show-icon",` - width: calc(var(--n-option-icon-prefix-width) / 2); - `)])]),we("prefix",` - width: var(--n-option-prefix-width); - display: flex; - justify-content: center; - align-items: center; - color: var(--n-prefix-color); - transition: color .3s var(--n-bezier); - z-index: 1; - `,[le("show-icon",` - width: var(--n-option-icon-prefix-width); - `),O("icon",` - font-size: var(--n-option-icon-size); - `)]),we("label",` - white-space: nowrap; - flex: 1; - z-index: 1; - `),we("suffix",` - box-sizing: border-box; - flex-grow: 0; - flex-shrink: 0; - display: flex; - justify-content: flex-end; - align-items: center; - min-width: var(--n-option-suffix-width); - padding: 0 8px; - transition: color .3s var(--n-bezier); - color: var(--n-suffix-color); - z-index: 1; - `,[le("has-submenu",` - width: var(--n-option-icon-suffix-width); - `),O("icon",` - font-size: var(--n-option-icon-size); - `)]),O("dropdown-menu","pointer-events: all;")]),O("dropdown-offset-container",` - pointer-events: none; - position: absolute; - left: 0; - right: 0; - top: -4px; - bottom: -4px; - `)]),O("dropdown-divider",` - transition: background-color .3s var(--n-bezier); - background-color: var(--n-divider-color); - height: 1px; - margin: 4px 0; - `),O("dropdown-menu-wrapper",` - transform-origin: var(--v-transform-origin); - width: fit-content; - `),he(">",[O("scrollbar",` - height: inherit; - max-height: inherit; - `)]),ei("scrollable",` - padding: var(--n-padding); - `),le("scrollable",[we("content",` - padding: var(--n-padding); - `)])]),Am={animated:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},size:{type:String,default:"medium"},inverted:Boolean,placement:{type:String,default:"bottom"},onSelect:[Function,Array],options:{type:Array,default:()=>[]},menuProps:Function,showArrow:Boolean,renderLabel:Function,renderIcon:Function,renderOption:Function,nodeProps:Function,labelField:{type:String,default:"label"},keyField:{type:String,default:"key"},childrenField:{type:String,default:"children"},value:[String,Number]},Tm=Object.keys(ad),_m=Object.assign(Object.assign(Object.assign({},ad),Am),dt.props),vd=Re({name:"Dropdown",inheritAttrs:!1,props:_m,setup(e){const t=te(!1),n=Vr(Ue(e,"show"),t),i=de(()=>{const{keyField:ee,childrenField:ne}=e;return jf(e.options,{getKey(V){return V[ee]},getDisabled(V){return V.disabled===!0},getIgnored(V){return V.type==="divider"||V.type==="render"},getChildren(V){return V[ne]}})}),c=de(()=>i.value.treeNodes),l=te(null),u=te(null),h=te(null),f=de(()=>{var ee,ne,V;return(V=(ne=(ee=l.value)!==null&&ee!==void 0?ee:u.value)!==null&&ne!==void 0?ne:h.value)!==null&&V!==void 0?V:null}),b=de(()=>i.value.getPath(f.value).keyPath),y=de(()=>i.value.getPath(e.value).keyPath),k=Dn(()=>e.keyboard&&n.value);np({keydown:{ArrowUp:{prevent:!0,handler:q},ArrowRight:{prevent:!0,handler:U},ArrowDown:{prevent:!0,handler:R},ArrowLeft:{prevent:!0,handler:M},Enter:{prevent:!0,handler:j},Escape:B}},k);const{mergedClsPrefixRef:C,inlineThemeDisabled:S}=Ut(e),L=dt("Dropdown","-dropdown",Cm,af,e,C);xr(vi,{labelFieldRef:Ue(e,"labelField"),childrenFieldRef:Ue(e,"childrenField"),renderLabelRef:Ue(e,"renderLabel"),renderIconRef:Ue(e,"renderIcon"),hoverKeyRef:l,keyboardKeyRef:u,lastToggledSubmenuKeyRef:h,pendingKeyPathRef:b,activeKeyPathRef:y,animatedRef:Ue(e,"animated"),mergedShowRef:n,nodePropsRef:Ue(e,"nodeProps"),renderOptionRef:Ue(e,"renderOption"),menuPropsRef:Ue(e,"menuProps"),doSelect:P,doUpdateShow:$}),tr(n,ee=>{!e.animated&&!ee&&E()});function P(ee,ne){const{onSelect:V}=e;V&&Je(V,ee,ne)}function $(ee){const{"onUpdate:show":ne,onUpdateShow:V}=e;ne&&Je(ne,ee),V&&Je(V,ee),t.value=ee}function E(){l.value=null,u.value=null,h.value=null}function B(){$(!1)}function M(){X("left")}function U(){X("right")}function q(){X("up")}function R(){X("down")}function j(){const ee=ie();ee!=null&&ee.isLeaf&&n.value&&(P(ee.key,ee.rawNode),$(!1))}function ie(){var ee;const{value:ne}=i,{value:V}=f;return!ne||V===null?null:(ee=ne.getNode(V))!==null&&ee!==void 0?ee:null}function X(ee){const{value:ne}=f,{value:{getFirstAvailableNode:V}}=i;let ae=null;if(ne===null){const me=V();me!==null&&(ae=me.key)}else{const me=ie();if(me){let Ce;switch(ee){case"down":Ce=me.getNext();break;case"up":Ce=me.getPrev();break;case"right":Ce=me.getChild();break;case"left":Ce=me.getParent();break}Ce&&(ae=Ce.key)}}ae!==null&&(l.value=null,u.value=ae)}const oe=de(()=>{const{size:ee,inverted:ne}=e,{common:{cubicBezierEaseInOut:V},self:ae}=L.value,{padding:me,dividerColor:Ce,borderRadius:Le,optionOpacityDisabled:ht,[ut("optionIconSuffixWidth",ee)]:gt,[ut("optionSuffixWidth",ee)]:De,[ut("optionIconPrefixWidth",ee)]:ve,[ut("optionPrefixWidth",ee)]:Ee,[ut("fontSize",ee)]:Se,[ut("optionHeight",ee)]:Ze,[ut("optionIconSize",ee)]:Be}=ae,Ye={"--n-bezier":V,"--n-font-size":Se,"--n-padding":me,"--n-border-radius":Le,"--n-option-height":Ze,"--n-option-prefix-width":Ee,"--n-option-icon-prefix-width":ve,"--n-option-suffix-width":De,"--n-option-icon-suffix-width":gt,"--n-option-icon-size":Be,"--n-divider-color":Ce,"--n-option-opacity-disabled":ht};return ne?(Ye["--n-color"]=ae.colorInverted,Ye["--n-option-color-hover"]=ae.optionColorHoverInverted,Ye["--n-option-color-active"]=ae.optionColorActiveInverted,Ye["--n-option-text-color"]=ae.optionTextColorInverted,Ye["--n-option-text-color-hover"]=ae.optionTextColorHoverInverted,Ye["--n-option-text-color-active"]=ae.optionTextColorActiveInverted,Ye["--n-option-text-color-child-active"]=ae.optionTextColorChildActiveInverted,Ye["--n-prefix-color"]=ae.prefixColorInverted,Ye["--n-suffix-color"]=ae.suffixColorInverted,Ye["--n-group-header-text-color"]=ae.groupHeaderTextColorInverted):(Ye["--n-color"]=ae.color,Ye["--n-option-color-hover"]=ae.optionColorHover,Ye["--n-option-color-active"]=ae.optionColorActive,Ye["--n-option-text-color"]=ae.optionTextColor,Ye["--n-option-text-color-hover"]=ae.optionTextColorHover,Ye["--n-option-text-color-active"]=ae.optionTextColorActive,Ye["--n-option-text-color-child-active"]=ae.optionTextColorChildActive,Ye["--n-prefix-color"]=ae.prefixColor,Ye["--n-suffix-color"]=ae.suffixColor,Ye["--n-group-header-text-color"]=ae.groupHeaderTextColor),Ye}),Z=S?kr("dropdown",de(()=>`${e.size[0]}${e.inverted?"i":""}`),oe,e):void 0;return{mergedClsPrefix:C,mergedTheme:L,tmNodes:c,mergedShow:n,handleAfterLeave:()=>{e.animated&&E()},doUpdateShow:$,cssVars:S?void 0:oe,themeClass:Z==null?void 0:Z.themeClass,onRender:Z==null?void 0:Z.onRender}},render(){const e=(i,c,l,u,h)=>{var f;const{mergedClsPrefix:b,menuProps:y}=this;(f=this.onRender)===null||f===void 0||f.call(this);const k=(y==null?void 0:y(void 0,this.tmNodes.map(S=>S.rawNode)))||{},C={ref:tp(c),class:[i,`${b}-dropdown`,this.themeClass],clsPrefix:b,tmNodes:this.tmNodes,style:[...l,this.cssVars],showArrow:this.showArrow,arrowStyle:this.arrowStyle,scrollable:this.scrollable,onMouseenter:u,onMouseleave:h};return D(md,Xn(this.$attrs,C,k))},{mergedTheme:t}=this,n={show:this.mergedShow,theme:t.peers.Popover,themeOverrides:t.peerOverrides.Popover,internalOnAfterLeave:this.handleAfterLeave,internalRenderBody:e,onUpdateShow:this.doUpdateShow,"onUpdate:show":void 0};return D(Zf,Object.assign({},of(this.$props,Tm),n),{trigger:()=>{var i,c;return(c=(i=this.$slots).default)===null||c===void 0?void 0:c.call(i)}})}});let ws;const Dm=()=>{if(!sf)return!0;if(ws===void 0){const e=document.createElement("div");e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e);const t=e.scrollHeight===1;return document.body.removeChild(e),ws=t}return ws},zm=Object.assign(Object.assign({},dt.props),{align:String,justify:{type:String,default:"start"},inline:Boolean,vertical:Boolean,size:{type:[String,Number,Array],default:"medium"},wrapItem:{type:Boolean,default:!0},itemClass:String,itemStyle:[String,Object],wrap:{type:Boolean,default:!0},internalUseGap:{type:Boolean,default:void 0}}),Em=Re({name:"Space",props:zm,setup(e){const{mergedClsPrefixRef:t,mergedRtlRef:n}=Ut(e),i=dt("Space","-space",void 0,cf,e,t),c=xl("Space",n,t);return{useGap:Dm(),rtlEnabled:c,mergedClsPrefix:t,margin:de(()=>{const{size:l}=e;if(Array.isArray(l))return{horizontal:l[0],vertical:l[1]};if(typeof l=="number")return{horizontal:l,vertical:l};const{self:{[ut("gap",l)]:u}}=i.value,{row:h,col:f}=lf(u);return{horizontal:cc(f),vertical:cc(h)}})}},render(){const{vertical:e,align:t,inline:n,justify:i,itemClass:c,itemStyle:l,margin:u,wrap:h,mergedClsPrefix:f,rtlEnabled:b,useGap:y,wrapItem:k,internalUseGap:C}=this,S=Ga(Mf(this));if(!S.length)return null;const L=`${u.horizontal}px`,P=`${u.horizontal/2}px`,$=`${u.vertical}px`,E=`${u.vertical/2}px`,B=S.length-1,M=i.startsWith("space-");return D("div",{role:"none",class:[`${f}-space`,b&&`${f}-space--rtl`],style:{display:n?"inline-flex":"flex",flexDirection:e?"column":"row",justifyContent:["start","end"].includes(i)?"flex-"+i:i,flexWrap:!h||e?"nowrap":"wrap",marginTop:y||e?"":`-${E}`,marginBottom:y||e?"":`-${E}`,alignItems:t,gap:y?`${u.vertical}px ${u.horizontal}px`:""}},!k&&(y||C)?S:S.map((U,q)=>D("div",{role:"none",class:c,style:[l,{maxWidth:"100%"},y?"":e?{marginBottom:q!==B?$:""}:b?{marginLeft:M?i==="space-between"&&q===B?"":P:q!==B?L:"",marginRight:M?i==="space-between"&&q===0?"":P:"",paddingTop:E,paddingBottom:E}:{marginRight:M?i==="space-between"&&q===B?"":P:q!==B?L:"",marginLeft:M?i==="space-between"&&q===0?"":P:"",paddingTop:E,paddingBottom:E}]},U)))}}),Rm=zr("n-layout-sider"),gd={type:String,default:"static"},Mm=O("layout",` - color: var(--n-text-color); - background-color: var(--n-color); - box-sizing: border-box; - position: relative; - z-index: auto; - flex: auto; - overflow: hidden; - transition: - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); -`,[O("layout-scroll-container",` - overflow-x: hidden; - box-sizing: border-box; - height: 100%; - `),le("absolute-positioned",` - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - `)]),Bm={embedded:Boolean,position:gd,nativeScrollbar:{type:Boolean,default:!0},scrollbarProps:Object,onScroll:Function,contentClass:String,contentStyle:{type:[String,Object],default:""},hasSider:Boolean,siderPlacement:{type:String,default:"left"}},bd=zr("n-layout");function yd(e){return Re({name:e?"LayoutContent":"Layout",props:Object.assign(Object.assign({},dt.props),Bm),setup(t){const n=te(null),i=te(null),{mergedClsPrefixRef:c,inlineThemeDisabled:l}=Ut(t),u=dt("Layout","-layout",Mm,Lu,t,c);function h(P,$){if(t.nativeScrollbar){const{value:E}=n;E&&($===void 0?E.scrollTo(P):E.scrollTo(P,$))}else{const{value:E}=i;E&&E.scrollTo(P,$)}}xr(bd,t);let f=0,b=0;const y=P=>{var $;const E=P.target;f=E.scrollLeft,b=E.scrollTop,($=t.onScroll)===null||$===void 0||$.call(t,P)};$u(()=>{if(t.nativeScrollbar){const P=n.value;P&&(P.scrollTop=b,P.scrollLeft=f)}});const k={display:"flex",flexWrap:"nowrap",width:"100%",flexDirection:"row"},C={scrollTo:h},S=de(()=>{const{common:{cubicBezierEaseInOut:P},self:$}=u.value;return{"--n-bezier":P,"--n-color":t.embedded?$.colorEmbedded:$.color,"--n-text-color":$.textColor}}),L=l?kr("layout",de(()=>t.embedded?"e":""),S,t):void 0;return Object.assign({mergedClsPrefix:c,scrollableElRef:n,scrollbarInstRef:i,hasSiderStyle:k,mergedTheme:u,handleNativeElScroll:y,cssVars:l?void 0:S,themeClass:L==null?void 0:L.themeClass,onRender:L==null?void 0:L.onRender},C)},render(){var t;const{mergedClsPrefix:n,hasSider:i}=this;(t=this.onRender)===null||t===void 0||t.call(this);const c=i?this.hasSiderStyle:void 0,l=[this.themeClass,e&&`${n}-layout-content`,`${n}-layout`,`${n}-layout--${this.position}-positioned`];return D("div",{class:l,style:this.cssVars},this.nativeScrollbar?D("div",{ref:"scrollableElRef",class:[`${n}-layout-scroll-container`,this.contentClass],style:[this.contentStyle,c],onScroll:this.handleNativeElScroll},this.$slots):D(Ou,Object.assign({},this.scrollbarProps,{onScroll:this.onScroll,ref:"scrollbarInstRef",theme:this.mergedTheme.peers.Scrollbar,themeOverrides:this.mergedTheme.peerOverrides.Scrollbar,contentClass:this.contentClass,contentStyle:[this.contentStyle,c]}),this.$slots))}})}const Im=yd(!1),Pm=yd(!0),Nm=O("layout-sider",` - flex-shrink: 0; - box-sizing: border-box; - position: relative; - z-index: 1; - color: var(--n-text-color); - transition: - color .3s var(--n-bezier), - border-color .3s var(--n-bezier), - min-width .3s var(--n-bezier), - max-width .3s var(--n-bezier), - transform .3s var(--n-bezier), - background-color .3s var(--n-bezier); - background-color: var(--n-color); - display: flex; - justify-content: flex-end; -`,[le("bordered",[we("border",` - content: ""; - position: absolute; - top: 0; - bottom: 0; - width: 1px; - background-color: var(--n-border-color); - transition: background-color .3s var(--n-bezier); - `)]),we("left-placement",[le("bordered",[we("border",` - right: 0; - `)])]),le("right-placement",` - justify-content: flex-start; - `,[le("bordered",[we("border",` - left: 0; - `)]),le("collapsed",[O("layout-toggle-button",[O("base-icon",` - transform: rotate(180deg); - `)]),O("layout-toggle-bar",[he("&:hover",[we("top",{transform:"rotate(-12deg) scale(1.15) translateY(-2px)"}),we("bottom",{transform:"rotate(12deg) scale(1.15) translateY(2px)"})])])]),O("layout-toggle-button",` - left: 0; - transform: translateX(-50%) translateY(-50%); - `,[O("base-icon",` - transform: rotate(0); - `)]),O("layout-toggle-bar",` - left: -28px; - transform: rotate(180deg); - `,[he("&:hover",[we("top",{transform:"rotate(12deg) scale(1.15) translateY(-2px)"}),we("bottom",{transform:"rotate(-12deg) scale(1.15) translateY(2px)"})])])]),le("collapsed",[O("layout-toggle-bar",[he("&:hover",[we("top",{transform:"rotate(-12deg) scale(1.15) translateY(-2px)"}),we("bottom",{transform:"rotate(12deg) scale(1.15) translateY(2px)"})])]),O("layout-toggle-button",[O("base-icon",` - transform: rotate(0); - `)])]),O("layout-toggle-button",` - transition: - color .3s var(--n-bezier), - right .3s var(--n-bezier), - left .3s var(--n-bezier), - border-color .3s var(--n-bezier), - background-color .3s var(--n-bezier); - cursor: pointer; - width: 24px; - height: 24px; - position: absolute; - top: 50%; - right: 0; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; - color: var(--n-toggle-button-icon-color); - border: var(--n-toggle-button-border); - background-color: var(--n-toggle-button-color); - box-shadow: 0 2px 4px 0px rgba(0, 0, 0, .06); - transform: translateX(50%) translateY(-50%); - z-index: 1; - `,[O("base-icon",` - transition: transform .3s var(--n-bezier); - transform: rotate(180deg); - `)]),O("layout-toggle-bar",` - cursor: pointer; - height: 72px; - width: 32px; - position: absolute; - top: calc(50% - 36px); - right: -28px; - `,[we("top, bottom",` - position: absolute; - width: 4px; - border-radius: 2px; - height: 38px; - left: 14px; - transition: - background-color .3s var(--n-bezier), - transform .3s var(--n-bezier); - `),we("bottom",` - position: absolute; - top: 34px; - `),he("&:hover",[we("top",{transform:"rotate(12deg) scale(1.15) translateY(-2px)"}),we("bottom",{transform:"rotate(-12deg) scale(1.15) translateY(2px)"})]),we("top, bottom",{backgroundColor:"var(--n-toggle-bar-color)"}),he("&:hover",[we("top, bottom",{backgroundColor:"var(--n-toggle-bar-color-hover)"})])]),we("border",` - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 1px; - transition: background-color .3s var(--n-bezier); - `),O("layout-sider-scroll-container",` - flex-grow: 1; - flex-shrink: 0; - box-sizing: border-box; - height: 100%; - opacity: 0; - transition: opacity .3s var(--n-bezier); - max-width: 100%; - `),le("show-content",[O("layout-sider-scroll-container",{opacity:1})]),le("absolute-positioned",` - position: absolute; - left: 0; - top: 0; - bottom: 0; - `)]),qm=Re({name:"LayoutToggleButton",props:{clsPrefix:{type:String,required:!0},onClick:Function},render(){const{clsPrefix:e}=this;return D("div",{class:`${e}-layout-toggle-button`,onClick:this.onClick},D(er,{clsPrefix:e},{default:()=>D(cd,null)}))}}),Fm=Re({props:{clsPrefix:{type:String,required:!0},onClick:Function},render(){const{clsPrefix:e}=this;return D("div",{onClick:this.onClick,class:`${e}-layout-toggle-bar`},D("div",{class:`${e}-layout-toggle-bar__top`}),D("div",{class:`${e}-layout-toggle-bar__bottom`}))}}),Lm={position:gd,bordered:Boolean,collapsedWidth:{type:Number,default:48},width:{type:[Number,String],default:272},contentClass:String,contentStyle:{type:[String,Object],default:""},collapseMode:{type:String,default:"transform"},collapsed:{type:Boolean,default:void 0},defaultCollapsed:Boolean,showCollapsedContent:{type:Boolean,default:!0},showTrigger:{type:[Boolean,String],default:!1},nativeScrollbar:{type:Boolean,default:!0},inverted:Boolean,scrollbarProps:Object,triggerClass:String,triggerStyle:[String,Object],collapsedTriggerClass:String,collapsedTriggerStyle:[String,Object],"onUpdate:collapsed":[Function,Array],onUpdateCollapsed:[Function,Array],onAfterEnter:Function,onAfterLeave:Function,onExpand:[Function,Array],onCollapse:[Function,Array],onScroll:Function},$m=Re({name:"LayoutSider",props:Object.assign(Object.assign({},dt.props),Lm),setup(e){const t=Rt(bd),n=te(null),i=te(null),c=de(()=>br(f.value?e.collapsedWidth:e.width)),l=de(()=>e.collapseMode!=="transform"?{}:{minWidth:br(e.width)}),u=de(()=>t?t.siderPlacement:"left"),h=te(e.defaultCollapsed),f=Vr(Ue(e,"collapsed"),h);function b(q,R){if(e.nativeScrollbar){const{value:j}=n;j&&(R===void 0?j.scrollTo(q):j.scrollTo(q,R))}else{const{value:j}=i;j&&j.scrollTo(q,R)}}function y(){const{"onUpdate:collapsed":q,onUpdateCollapsed:R,onExpand:j,onCollapse:ie}=e,{value:X}=f;R&&Je(R,!X),q&&Je(q,!X),h.value=!X,X?j&&Je(j):ie&&Je(ie)}let k=0,C=0;const S=q=>{var R;const j=q.target;k=j.scrollLeft,C=j.scrollTop,(R=e.onScroll)===null||R===void 0||R.call(e,q)};$u(()=>{if(e.nativeScrollbar){const q=n.value;q&&(q.scrollTop=C,q.scrollLeft=k)}}),xr(Rm,{collapsedRef:f,collapseModeRef:Ue(e,"collapseMode")});const{mergedClsPrefixRef:L,inlineThemeDisabled:P}=Ut(e),$=dt("Layout","-layout-sider",Nm,Lu,e,L);function E(q){var R,j;q.propertyName==="max-width"&&(f.value?(R=e.onAfterLeave)===null||R===void 0||R.call(e):(j=e.onAfterEnter)===null||j===void 0||j.call(e))}const B={scrollTo:b},M=de(()=>{const{common:{cubicBezierEaseInOut:q},self:R}=$.value,{siderToggleButtonColor:j,siderToggleButtonBorder:ie,siderToggleBarColor:X,siderToggleBarColorHover:oe}=R,Z={"--n-bezier":q,"--n-toggle-button-color":j,"--n-toggle-button-border":ie,"--n-toggle-bar-color":X,"--n-toggle-bar-color-hover":oe};return e.inverted?(Z["--n-color"]=R.siderColorInverted,Z["--n-text-color"]=R.textColorInverted,Z["--n-border-color"]=R.siderBorderColorInverted,Z["--n-toggle-button-icon-color"]=R.siderToggleButtonIconColorInverted,Z.__invertScrollbar=R.__invertScrollbar):(Z["--n-color"]=R.siderColor,Z["--n-text-color"]=R.textColor,Z["--n-border-color"]=R.siderBorderColor,Z["--n-toggle-button-icon-color"]=R.siderToggleButtonIconColor),Z}),U=P?kr("layout-sider",de(()=>e.inverted?"a":"b"),M,e):void 0;return Object.assign({scrollableElRef:n,scrollbarInstRef:i,mergedClsPrefix:L,mergedTheme:$,styleMaxWidth:c,mergedCollapsed:f,scrollContainerStyle:l,siderPlacement:u,handleNativeElScroll:S,handleTransitionend:E,handleTriggerClick:y,inlineThemeDisabled:P,cssVars:M,themeClass:U==null?void 0:U.themeClass,onRender:U==null?void 0:U.onRender},B)},render(){var e;const{mergedClsPrefix:t,mergedCollapsed:n,showTrigger:i}=this;return(e=this.onRender)===null||e===void 0||e.call(this),D("aside",{class:[`${t}-layout-sider`,this.themeClass,`${t}-layout-sider--${this.position}-positioned`,`${t}-layout-sider--${this.siderPlacement}-placement`,this.bordered&&`${t}-layout-sider--bordered`,n&&`${t}-layout-sider--collapsed`,(!n||this.showCollapsedContent)&&`${t}-layout-sider--show-content`],onTransitionend:this.handleTransitionend,style:[this.inlineThemeDisabled?void 0:this.cssVars,{maxWidth:this.styleMaxWidth,width:br(this.width)}]},this.nativeScrollbar?D("div",{class:[`${t}-layout-sider-scroll-container`,this.contentClass],onScroll:this.handleNativeElScroll,style:[this.scrollContainerStyle,{overflow:"auto"},this.contentStyle],ref:"scrollableElRef"},this.$slots):D(Ou,Object.assign({},this.scrollbarProps,{onScroll:this.onScroll,ref:"scrollbarInstRef",style:this.scrollContainerStyle,contentStyle:this.contentStyle,contentClass:this.contentClass,theme:this.mergedTheme.peers.Scrollbar,themeOverrides:this.mergedTheme.peerOverrides.Scrollbar,builtinThemeOverrides:this.inverted&&this.cssVars.__invertScrollbar==="true"?{colorHover:"rgba(255, 255, 255, .4)",color:"rgba(255, 255, 255, .3)"}:void 0}),this.$slots),i?i==="bar"?D(Fm,{clsPrefix:t,class:n?this.collapsedTriggerClass:this.triggerClass,style:n?this.collapsedTriggerStyle:this.triggerStyle,onClick:this.handleTriggerClick}):D(qm,{clsPrefix:t,class:n?this.collapsedTriggerClass:this.triggerClass,style:n?this.collapsedTriggerStyle:this.triggerStyle,onClick:this.handleTriggerClick}):null,this.bordered?D("div",{class:`${t}-layout-sider__border`}):null)}}),Om=he([O("progress",{display:"inline-block"},[O("progress-icon",` - color: var(--n-icon-color); - transition: color .3s var(--n-bezier); - `),le("line",` - width: 100%; - display: block; - `,[O("progress-content",` - display: flex; - align-items: center; - `,[O("progress-graph",{flex:1})]),O("progress-custom-content",{marginLeft:"14px"}),O("progress-icon",` - width: 30px; - padding-left: 14px; - height: var(--n-icon-size-line); - line-height: var(--n-icon-size-line); - font-size: var(--n-icon-size-line); - `,[le("as-text",` - color: var(--n-text-color-line-outer); - text-align: center; - width: 40px; - font-size: var(--n-font-size); - padding-left: 4px; - transition: color .3s var(--n-bezier); - `)])]),le("circle, dashboard",{width:"120px"},[O("progress-custom-content",` - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - display: flex; - align-items: center; - justify-content: center; - `),O("progress-text",` - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - display: flex; - align-items: center; - color: inherit; - font-size: var(--n-font-size-circle); - color: var(--n-text-color-circle); - font-weight: var(--n-font-weight-circle); - transition: color .3s var(--n-bezier); - white-space: nowrap; - `),O("progress-icon",` - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - display: flex; - align-items: center; - color: var(--n-icon-color); - font-size: var(--n-icon-size-circle); - `)]),le("multiple-circle",` - width: 200px; - color: inherit; - `,[O("progress-text",` - font-weight: var(--n-font-weight-circle); - color: var(--n-text-color-circle); - position: absolute; - left: 50%; - top: 50%; - transform: translateX(-50%) translateY(-50%); - display: flex; - align-items: center; - justify-content: center; - transition: color .3s var(--n-bezier); - `)]),O("progress-content",{position:"relative"}),O("progress-graph",{position:"relative"},[O("progress-graph-circle",[he("svg",{verticalAlign:"bottom"}),O("progress-graph-circle-fill",` - stroke: var(--n-fill-color); - transition: - opacity .3s var(--n-bezier), - stroke .3s var(--n-bezier), - stroke-dasharray .3s var(--n-bezier); - `,[le("empty",{opacity:0})]),O("progress-graph-circle-rail",` - transition: stroke .3s var(--n-bezier); - overflow: hidden; - stroke: var(--n-rail-color); - `)]),O("progress-graph-line",[le("indicator-inside",[O("progress-graph-line-rail",` - height: 16px; - line-height: 16px; - border-radius: 10px; - `,[O("progress-graph-line-fill",` - height: inherit; - border-radius: 10px; - `),O("progress-graph-line-indicator",` - background: #0000; - white-space: nowrap; - text-align: right; - margin-left: 14px; - margin-right: 14px; - height: inherit; - font-size: 12px; - color: var(--n-text-color-line-inner); - transition: color .3s var(--n-bezier); - `)])]),le("indicator-inside-label",` - height: 16px; - display: flex; - align-items: center; - `,[O("progress-graph-line-rail",` - flex: 1; - transition: background-color .3s var(--n-bezier); - `),O("progress-graph-line-indicator",` - background: var(--n-fill-color); - font-size: 12px; - transform: translateZ(0); - display: flex; - vertical-align: middle; - height: 16px; - line-height: 16px; - padding: 0 10px; - border-radius: 10px; - position: absolute; - white-space: nowrap; - color: var(--n-text-color-line-inner); - transition: - right .2s var(--n-bezier), - color .3s var(--n-bezier), - background-color .3s var(--n-bezier); - `)]),O("progress-graph-line-rail",` - position: relative; - overflow: hidden; - height: var(--n-rail-height); - border-radius: 5px; - background-color: var(--n-rail-color); - transition: background-color .3s var(--n-bezier); - `,[O("progress-graph-line-fill",` - background: var(--n-fill-color); - position: relative; - border-radius: 5px; - height: inherit; - width: 100%; - max-width: 0%; - transition: - background-color .3s var(--n-bezier), - max-width .2s var(--n-bezier); - `,[le("processing",[he("&::after",` - content: ""; - background-image: var(--n-line-bg-processing); - animation: progress-processing-animation 2s var(--n-bezier) infinite; - `)])])])])])]),he("@keyframes progress-processing-animation",` - 0% { - position: absolute; - left: 0; - top: 0; - bottom: 0; - right: 100%; - opacity: 1; - } - 66% { - position: absolute; - left: 0; - top: 0; - bottom: 0; - right: 0; - opacity: 0; - } - 100% { - position: absolute; - left: 0; - top: 0; - bottom: 0; - right: 0; - opacity: 0; - } - `)]),Um={success:D(Uu,null),error:D(Hu,null),warning:D(Vu,null),info:D(ju,null)},Hm=Re({name:"ProgressLine",props:{clsPrefix:{type:String,required:!0},percentage:{type:Number,default:0},railColor:String,railStyle:[String,Object],fillColor:String,status:{type:String,required:!0},indicatorPlacement:{type:String,required:!0},indicatorTextColor:String,unit:{type:String,default:"%"},processing:{type:Boolean,required:!0},showIndicator:{type:Boolean,required:!0},height:[String,Number],railBorderRadius:[String,Number],fillBorderRadius:[String,Number]},setup(e,{slots:t}){const n=de(()=>br(e.height)),i=de(()=>e.railBorderRadius!==void 0?br(e.railBorderRadius):e.height!==void 0?br(e.height,{c:.5}):""),c=de(()=>e.fillBorderRadius!==void 0?br(e.fillBorderRadius):e.railBorderRadius!==void 0?br(e.railBorderRadius):e.height!==void 0?br(e.height,{c:.5}):"");return()=>{const{indicatorPlacement:l,railColor:u,railStyle:h,percentage:f,unit:b,indicatorTextColor:y,status:k,showIndicator:C,fillColor:S,processing:L,clsPrefix:P}=e;return D("div",{class:`${P}-progress-content`,role:"none"},D("div",{class:`${P}-progress-graph`,"aria-hidden":!0},D("div",{class:[`${P}-progress-graph-line`,{[`${P}-progress-graph-line--indicator-${l}`]:!0}]},D("div",{class:`${P}-progress-graph-line-rail`,style:[{backgroundColor:u,height:n.value,borderRadius:i.value},h]},D("div",{class:[`${P}-progress-graph-line-fill`,L&&`${P}-progress-graph-line-fill--processing`],style:{maxWidth:`${e.percentage}%`,backgroundColor:S,height:n.value,lineHeight:n.value,borderRadius:c.value}},l==="inside"?D("div",{class:`${P}-progress-graph-line-indicator`,style:{color:y}},t.default?t.default():`${f}${b}`):null)))),C&&l==="outside"?D("div",null,t.default?D("div",{class:`${P}-progress-custom-content`,style:{color:y},role:"none"},t.default()):k==="default"?D("div",{role:"none",class:`${P}-progress-icon ${P}-progress-icon--as-text`,style:{color:y}},f,b):D("div",{class:`${P}-progress-icon`,"aria-hidden":!0},D(er,{clsPrefix:P},{default:()=>Um[k]}))):null)}}}),Vm={success:D(Uu,null),error:D(Hu,null),warning:D(Vu,null),info:D(ju,null)},jm=Re({name:"ProgressCircle",props:{clsPrefix:{type:String,required:!0},status:{type:String,required:!0},strokeWidth:{type:Number,required:!0},fillColor:String,railColor:String,railStyle:[String,Object],percentage:{type:Number,default:0},offsetDegree:{type:Number,default:0},showIndicator:{type:Boolean,required:!0},indicatorTextColor:String,unit:String,viewBoxWidth:{type:Number,required:!0},gapDegree:{type:Number,required:!0},gapOffsetDegree:{type:Number,default:0}},setup(e,{slots:t}){function n(i,c,l){const{gapDegree:u,viewBoxWidth:h,strokeWidth:f}=e,b=50,y=0,k=b,C=0,S=2*b,L=50+f/2,P=`M ${L},${L} m ${y},${k} - a ${b},${b} 0 1 1 ${C},${-S} - a ${b},${b} 0 1 1 ${-C},${S}`,$=Math.PI*2*b,E={stroke:l,strokeDasharray:`${i/100*($-u)}px ${h*8}px`,strokeDashoffset:`-${u/2}px`,transformOrigin:c?"center":void 0,transform:c?`rotate(${c}deg)`:void 0};return{pathString:P,pathStyle:E}}return()=>{const{fillColor:i,railColor:c,strokeWidth:l,offsetDegree:u,status:h,percentage:f,showIndicator:b,indicatorTextColor:y,unit:k,gapOffsetDegree:C,clsPrefix:S}=e,{pathString:L,pathStyle:P}=n(100,0,c),{pathString:$,pathStyle:E}=n(f,u,i),B=100+l;return D("div",{class:`${S}-progress-content`,role:"none"},D("div",{class:`${S}-progress-graph`,"aria-hidden":!0},D("div",{class:`${S}-progress-graph-circle`,style:{transform:C?`rotate(${C}deg)`:void 0}},D("svg",{viewBox:`0 0 ${B} ${B}`},D("g",null,D("path",{class:`${S}-progress-graph-circle-rail`,d:L,"stroke-width":l,"stroke-linecap":"round",fill:"none",style:P})),D("g",null,D("path",{class:[`${S}-progress-graph-circle-fill`,f===0&&`${S}-progress-graph-circle-fill--empty`],d:$,"stroke-width":l,"stroke-linecap":"round",fill:"none",style:E}))))),b?D("div",null,t.default?D("div",{class:`${S}-progress-custom-content`,role:"none"},t.default()):h!=="default"?D("div",{class:`${S}-progress-icon`,"aria-hidden":!0},D(er,{clsPrefix:S},{default:()=>Vm[h]})):D("div",{class:`${S}-progress-text`,style:{color:y},role:"none"},D("span",{class:`${S}-progress-text__percentage`},f),D("span",{class:`${S}-progress-text__unit`},k))):null)}}});function Cc(e,t,n=100){return`m ${n/2} ${n/2-e} a ${e} ${e} 0 1 1 0 ${2*e} a ${e} ${e} 0 1 1 0 -${2*e}`}const Gm=Re({name:"ProgressMultipleCircle",props:{clsPrefix:{type:String,required:!0},viewBoxWidth:{type:Number,required:!0},percentage:{type:Array,default:[0]},strokeWidth:{type:Number,required:!0},circleGap:{type:Number,required:!0},showIndicator:{type:Boolean,required:!0},fillColor:{type:Array,default:()=>[]},railColor:{type:Array,default:()=>[]},railStyle:{type:Array,default:()=>[]}},setup(e,{slots:t}){const n=de(()=>e.percentage.map((c,l)=>`${Math.PI*c/100*(e.viewBoxWidth/2-e.strokeWidth/2*(1+2*l)-e.circleGap*l)*2}, ${e.viewBoxWidth*8}`));return()=>{const{viewBoxWidth:i,strokeWidth:c,circleGap:l,showIndicator:u,fillColor:h,railColor:f,railStyle:b,percentage:y,clsPrefix:k}=e;return D("div",{class:`${k}-progress-content`,role:"none"},D("div",{class:`${k}-progress-graph`,"aria-hidden":!0},D("div",{class:`${k}-progress-graph-circle`},D("svg",{viewBox:`0 0 ${i} ${i}`},y.map((C,S)=>D("g",{key:S},D("path",{class:`${k}-progress-graph-circle-rail`,d:Cc(i/2-c/2*(1+2*S)-l*S,c,i),"stroke-width":c,"stroke-linecap":"round",fill:"none",style:[{strokeDashoffset:0,stroke:f[S]},b[S]]}),D("path",{class:[`${k}-progress-graph-circle-fill`,C===0&&`${k}-progress-graph-circle-fill--empty`],d:Cc(i/2-c/2*(1+2*S)-l*S,c,i),"stroke-width":c,"stroke-linecap":"round",fill:"none",style:{strokeDasharray:n.value[S],strokeDashoffset:0,stroke:h[S]}})))))),u&&t.default?D("div",null,D("div",{class:`${k}-progress-text`},t.default())):null)}}}),Wm=Object.assign(Object.assign({},dt.props),{processing:Boolean,type:{type:String,default:"line"},gapDegree:Number,gapOffsetDegree:Number,status:{type:String,default:"default"},railColor:[String,Array],railStyle:[String,Array],color:[String,Array],viewBoxWidth:{type:Number,default:100},strokeWidth:{type:Number,default:7},percentage:[Number,Array],unit:{type:String,default:"%"},showIndicator:{type:Boolean,default:!0},indicatorPosition:{type:String,default:"outside"},indicatorPlacement:{type:String,default:"outside"},indicatorTextColor:String,circleGap:{type:Number,default:1},height:Number,borderRadius:[String,Number],fillBorderRadius:[String,Number],offsetDegree:Number}),sl=Re({name:"Progress",props:Wm,setup(e){const t=de(()=>e.indicatorPlacement||e.indicatorPosition),n=de(()=>{if(e.gapDegree||e.gapDegree===0)return e.gapDegree;if(e.type==="dashboard")return 75}),{mergedClsPrefixRef:i,inlineThemeDisabled:c}=Ut(e),l=dt("Progress","-progress",Om,uf,e,i),u=de(()=>{const{status:f}=e,{common:{cubicBezierEaseInOut:b},self:{fontSize:y,fontSizeCircle:k,railColor:C,railHeight:S,iconSizeCircle:L,iconSizeLine:P,textColorCircle:$,textColorLineInner:E,textColorLineOuter:B,lineBgProcessing:M,fontWeightCircle:U,[ut("iconColor",f)]:q,[ut("fillColor",f)]:R}}=l.value;return{"--n-bezier":b,"--n-fill-color":R,"--n-font-size":y,"--n-font-size-circle":k,"--n-font-weight-circle":U,"--n-icon-color":q,"--n-icon-size-circle":L,"--n-icon-size-line":P,"--n-line-bg-processing":M,"--n-rail-color":C,"--n-rail-height":S,"--n-text-color-circle":$,"--n-text-color-line-inner":E,"--n-text-color-line-outer":B}}),h=c?kr("progress",de(()=>e.status[0]),u,e):void 0;return{mergedClsPrefix:i,mergedIndicatorPlacement:t,gapDeg:n,cssVars:c?void 0:u,themeClass:h==null?void 0:h.themeClass,onRender:h==null?void 0:h.onRender}},render(){const{type:e,cssVars:t,indicatorTextColor:n,showIndicator:i,status:c,railColor:l,railStyle:u,color:h,percentage:f,viewBoxWidth:b,strokeWidth:y,mergedIndicatorPlacement:k,unit:C,borderRadius:S,fillBorderRadius:L,height:P,processing:$,circleGap:E,mergedClsPrefix:B,gapDeg:M,gapOffsetDegree:U,themeClass:q,$slots:R,onRender:j}=this;return j==null||j(),D("div",{class:[q,`${B}-progress`,`${B}-progress--${e}`,`${B}-progress--${c}`],style:t,"aria-valuemax":100,"aria-valuemin":0,"aria-valuenow":f,role:e==="circle"||e==="line"||e==="dashboard"?"progressbar":"none"},e==="circle"||e==="dashboard"?D(jm,{clsPrefix:B,status:c,showIndicator:i,indicatorTextColor:n,railColor:l,fillColor:h,railStyle:u,offsetDegree:this.offsetDegree,percentage:f,viewBoxWidth:b,strokeWidth:y,gapDegree:M===void 0?e==="dashboard"?75:0:M,gapOffsetDegree:U,unit:C},R):e==="line"?D(Hm,{clsPrefix:B,status:c,showIndicator:i,indicatorTextColor:n,railColor:l,fillColor:h,railStyle:u,percentage:f,processing:$,indicatorPlacement:k,unit:C,fillBorderRadius:L,railBorderRadius:S,height:P},R):e==="multiple-circle"?D(Gm,{clsPrefix:B,strokeWidth:y,railColor:l,fillColor:h,railStyle:u,viewBoxWidth:b,percentage:f,showIndicator:i,circleGap:E},R):null)}}),Xm=he([O("skeleton",` - height: 1em; - width: 100%; - transition: background-color .3s var(--n-bezier); - transition: - --n-color-start .3s var(--n-bezier), - --n-color-end .3s var(--n-bezier), - background-color .3s var(--n-bezier); - animation: 2s skeleton-loading infinite cubic-bezier(0.36, 0, 0.64, 1); - background-color: var(--n-color-start); - `),he("@keyframes skeleton-loading",` - 0% { - background: var(--n-color-start); - } - 40% { - background: var(--n-color-end); - } - 80% { - background: var(--n-color-start); - } - 100% { - background: var(--n-color-start); - } - `)]),Ym=Object.assign(Object.assign({},dt.props),{text:Boolean,round:Boolean,circle:Boolean,height:[String,Number],width:[String,Number],size:String,repeat:{type:Number,default:1},animated:{type:Boolean,default:!0},sharp:{type:Boolean,default:!0}}),ks=Re({name:"Skeleton",inheritAttrs:!1,props:Ym,setup(e){Gf();const{mergedClsPrefixRef:t}=Ut(e),n=dt("Skeleton","-skeleton",Xm,hf,e,t);return{mergedClsPrefix:t,style:de(()=>{var i,c;const l=n.value,{common:{cubicBezierEaseInOut:u}}=l,h=l.self,{color:f,colorEnd:b,borderRadius:y}=h;let k;const{circle:C,sharp:S,round:L,width:P,height:$,size:E,text:B,animated:M}=e;E!==void 0&&(k=h[ut("height",E)]);const U=C?(i=P??$)!==null&&i!==void 0?i:k:P,q=(c=C?P??$:$)!==null&&c!==void 0?c:k;return{display:B?"inline-block":"",verticalAlign:B?"-0.125em":"",borderRadius:C?"50%":L?"4096px":S?"":y,width:typeof U=="number"?uc(U):U,height:typeof q=="number"?uc(q):q,animation:M?"":"none","--n-bezier":u,"--n-color-start":f,"--n-color-end":b}})}},render(){const{repeat:e,style:t,mergedClsPrefix:n,$attrs:i}=this,c=D("div",Xn({class:`${n}-skeleton`,style:t},i));return e>1?D(cr,null,df(e,null).map(l=>[c,` -`])):c}}),Tl=zr("n-tabs"),xd={tab:[String,Number,Object,Function],name:{type:[String,Number],required:!0},disabled:Boolean,displayDirective:{type:String,default:"if"},closable:{type:Boolean,default:void 0},tabProps:Object,label:[String,Number,Object,Function]},Ss=Re({__TAB_PANE__:!0,name:"TabPane",alias:["TabPanel"],props:xd,setup(e){const t=Rt(Tl,null);return t||Qo("tab-pane","`n-tab-pane` must be placed inside `n-tabs`."),{style:t.paneStyleRef,class:t.paneClassRef,mergedClsPrefix:t.mergedClsPrefixRef}},render(){return D("div",{class:[`${this.mergedClsPrefix}-tab-pane`,this.class],style:this.style},this.$slots)}}),Km=Object.assign({internalLeftPadded:Boolean,internalAddable:Boolean,internalCreatedByPane:Boolean},pf(xd,["displayDirective"])),ll=Re({__TAB__:!0,inheritAttrs:!1,name:"Tab",props:Km,setup(e){const{mergedClsPrefixRef:t,valueRef:n,typeRef:i,closableRef:c,tabStyleRef:l,tabChangeIdRef:u,onBeforeLeaveRef:h,triggerRef:f,handleAdd:b,activateTab:y,handleClose:k}=Rt(Tl);return{trigger:f,mergedClosable:de(()=>{if(e.internalAddable)return!1;const{closable:C}=e;return C===void 0?c.value:C}),style:l,clsPrefix:t,value:n,type:i,handleClose(C){C.stopPropagation(),!e.disabled&&k(e.name)},activateTab(){if(e.disabled)return;if(e.internalAddable){b();return}const{name:C}=e,S=++u.id;if(C!==n.value){const{value:L}=h;L?Promise.resolve(L(e.name,n.value)).then(P=>{P&&u.id===S&&y(C)}):y(C)}}}},render(){const{internalAddable:e,clsPrefix:t,name:n,disabled:i,label:c,tab:l,value:u,mergedClosable:h,style:f,trigger:b,$slots:{default:y}}=this,k=c??l;return D("div",{class:`${t}-tabs-tab-wrapper`},this.internalLeftPadded?D("div",{class:`${t}-tabs-tab-pad`}):null,D("div",Object.assign({key:n,"data-name":n,"data-disabled":i?!0:void 0},Xn({class:[`${t}-tabs-tab`,u===n&&`${t}-tabs-tab--active`,i&&`${t}-tabs-tab--disabled`,h&&`${t}-tabs-tab--closable`,e&&`${t}-tabs-tab--addable`],onClick:b==="click"?this.activateTab:void 0,onMouseenter:b==="hover"?this.activateTab:void 0,style:e?void 0:f},this.internalCreatedByPane?this.tabProps||{}:this.$attrs)),D("span",{class:`${t}-tabs-tab__label`},e?D(cr,null,D("div",{class:`${t}-tabs-tab__height-placeholder`}," "),D(er,{clsPrefix:t},{default:()=>D(ld,null)})):y?y():typeof k=="object"?k:jo(k??n)),h&&this.type==="card"?D(ff,{clsPrefix:t,class:`${t}-tabs-tab__close`,onClick:this.handleClose,disabled:i}):null))}}),Zm=O("tabs",` - box-sizing: border-box; - width: 100%; - display: flex; - flex-direction: column; - transition: - background-color .3s var(--n-bezier), - border-color .3s var(--n-bezier); -`,[le("segment-type",[O("tabs-rail",[he("&.transition-disabled","color: red;",[O("tabs-tab",` - transition: none; - `)])])]),le("top",[O("tab-pane",` - padding: var(--n-pane-padding-top) var(--n-pane-padding-right) var(--n-pane-padding-bottom) var(--n-pane-padding-left); - `)]),le("left",[O("tab-pane",` - padding: var(--n-pane-padding-right) var(--n-pane-padding-bottom) var(--n-pane-padding-left) var(--n-pane-padding-top); - `)]),le("left, right",` - flex-direction: row; - `,[O("tabs-bar",` - width: 2px; - right: 0; - transition: - top .2s var(--n-bezier), - max-height .2s var(--n-bezier), - background-color .3s var(--n-bezier); - `),O("tabs-tab",` - padding: var(--n-tab-padding-vertical); - `)]),le("right",` - flex-direction: row-reverse; - `,[O("tab-pane",` - padding: var(--n-pane-padding-left) var(--n-pane-padding-top) var(--n-pane-padding-right) var(--n-pane-padding-bottom); - `),O("tabs-bar",` - left: 0; - `)]),le("bottom",` - flex-direction: column-reverse; - justify-content: flex-end; - `,[O("tab-pane",` - padding: var(--n-pane-padding-bottom) var(--n-pane-padding-right) var(--n-pane-padding-top) var(--n-pane-padding-left); - `),O("tabs-bar",` - top: 0; - `)]),O("tabs-rail",` - padding: 3px; - border-radius: var(--n-tab-border-radius); - width: 100%; - background-color: var(--n-color-segment); - transition: background-color .3s var(--n-bezier); - display: flex; - align-items: center; - `,[O("tabs-tab-wrapper",` - flex-basis: 0; - flex-grow: 1; - display: flex; - align-items: center; - justify-content: center; - `,[O("tabs-tab",` - overflow: hidden; - border-radius: var(--n-tab-border-radius); - width: 100%; - display: flex; - align-items: center; - justify-content: center; - `,[le("active",` - font-weight: var(--n-font-weight-strong); - color: var(--n-tab-text-color-active); - background-color: var(--n-tab-color-segment); - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .08); - `),he("&:hover",` - color: var(--n-tab-text-color-hover); - `)])])]),le("flex",[O("tabs-nav",{width:"100%"},[O("tabs-wrapper",{width:"100%"},[O("tabs-tab",{marginRight:0})])])]),O("tabs-nav",` - box-sizing: border-box; - line-height: 1.5; - display: flex; - transition: border-color .3s var(--n-bezier); - `,[we("prefix, suffix",` - display: flex; - align-items: center; - `),we("prefix","padding-right: 16px;"),we("suffix","padding-left: 16px;")]),le("top, bottom",[O("tabs-nav-scroll-wrapper",[he("&::before",` - top: 0; - bottom: 0; - left: 0; - width: 20px; - `),he("&::after",` - top: 0; - bottom: 0; - right: 0; - width: 20px; - `),le("shadow-start",[he("&::before",` - box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, .12); - `)]),le("shadow-end",[he("&::after",` - box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, .12); - `)])])]),le("left, right",[O("tabs-nav-scroll-content",` - flex-direction: column; - `),O("tabs-nav-scroll-wrapper",[he("&::before",` - top: 0; - left: 0; - right: 0; - height: 20px; - `),he("&::after",` - bottom: 0; - left: 0; - right: 0; - height: 20px; - `),le("shadow-start",[he("&::before",` - box-shadow: inset 0 10px 8px -8px rgba(0, 0, 0, .12); - `)]),le("shadow-end",[he("&::after",` - box-shadow: inset 0 -10px 8px -8px rgba(0, 0, 0, .12); - `)])])]),O("tabs-nav-scroll-wrapper",` - flex: 1; - position: relative; - overflow: hidden; - `,[O("tabs-nav-y-scroll",` - height: 100%; - width: 100%; - overflow-y: auto; - scrollbar-width: none; - `,[he("&::-webkit-scrollbar",` - width: 0; - height: 0; - `)]),he("&::before, &::after",` - transition: box-shadow .3s var(--n-bezier); - pointer-events: none; - content: ""; - position: absolute; - z-index: 1; - `)]),O("tabs-nav-scroll-content",` - display: flex; - position: relative; - min-width: 100%; - min-height: 100%; - width: fit-content; - box-sizing: border-box; - `),O("tabs-wrapper",` - display: inline-flex; - flex-wrap: nowrap; - position: relative; - `),O("tabs-tab-wrapper",` - display: flex; - flex-wrap: nowrap; - flex-shrink: 0; - flex-grow: 0; - `),O("tabs-tab",` - cursor: pointer; - white-space: nowrap; - flex-wrap: nowrap; - display: inline-flex; - align-items: center; - color: var(--n-tab-text-color); - font-size: var(--n-tab-font-size); - background-clip: padding-box; - padding: var(--n-tab-padding); - transition: - box-shadow .3s var(--n-bezier), - color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - border-color .3s var(--n-bezier); - `,[le("disabled",{cursor:"not-allowed"}),we("close",` - margin-left: 6px; - transition: - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - `),we("label",` - display: flex; - align-items: center; - `)]),O("tabs-bar",` - position: absolute; - bottom: 0; - height: 2px; - border-radius: 1px; - background-color: var(--n-bar-color); - transition: - left .2s var(--n-bezier), - max-width .2s var(--n-bezier), - background-color .3s var(--n-bezier); - `,[he("&.transition-disabled",` - transition: none; - `),le("disabled",` - background-color: var(--n-tab-text-color-disabled) - `)]),O("tabs-pane-wrapper",` - position: relative; - overflow: hidden; - transition: max-height .2s var(--n-bezier); - `),O("tab-pane",` - color: var(--n-pane-text-color); - width: 100%; - transition: - color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - opacity .2s var(--n-bezier); - left: 0; - right: 0; - top: 0; - `,[he("&.next-transition-leave-active, &.prev-transition-leave-active, &.next-transition-enter-active, &.prev-transition-enter-active",` - transition: - color .3s var(--n-bezier), - background-color .3s var(--n-bezier), - transform .2s var(--n-bezier), - opacity .2s var(--n-bezier); - `),he("&.next-transition-leave-active, &.prev-transition-leave-active",` - position: absolute; - `),he("&.next-transition-enter-from, &.prev-transition-leave-to",` - transform: translateX(32px); - opacity: 0; - `),he("&.next-transition-leave-to, &.prev-transition-enter-from",` - transform: translateX(-32px); - opacity: 0; - `),he("&.next-transition-leave-from, &.next-transition-enter-to, &.prev-transition-leave-from, &.prev-transition-enter-to",` - transform: translateX(0); - opacity: 1; - `)]),O("tabs-tab-pad",` - box-sizing: border-box; - width: var(--n-tab-gap); - flex-grow: 0; - flex-shrink: 0; - `),le("line-type, bar-type",[O("tabs-tab",` - font-weight: var(--n-tab-font-weight); - box-sizing: border-box; - vertical-align: bottom; - `,[he("&:hover",{color:"var(--n-tab-text-color-hover)"}),le("active",` - color: var(--n-tab-text-color-active); - font-weight: var(--n-tab-font-weight-active); - `),le("disabled",{color:"var(--n-tab-text-color-disabled)"})])]),O("tabs-nav",[le("line-type",[le("top",[we("prefix, suffix",` - border-bottom: 1px solid var(--n-tab-border-color); - `),O("tabs-nav-scroll-content",` - border-bottom: 1px solid var(--n-tab-border-color); - `),O("tabs-bar",` - bottom: -1px; - `)]),le("left",[we("prefix, suffix",` - border-right: 1px solid var(--n-tab-border-color); - `),O("tabs-nav-scroll-content",` - border-right: 1px solid var(--n-tab-border-color); - `),O("tabs-bar",` - right: -1px; - `)]),le("right",[we("prefix, suffix",` - border-left: 1px solid var(--n-tab-border-color); - `),O("tabs-nav-scroll-content",` - border-left: 1px solid var(--n-tab-border-color); - `),O("tabs-bar",` - left: -1px; - `)]),le("bottom",[we("prefix, suffix",` - border-top: 1px solid var(--n-tab-border-color); - `),O("tabs-nav-scroll-content",` - border-top: 1px solid var(--n-tab-border-color); - `),O("tabs-bar",` - top: -1px; - `)]),we("prefix, suffix",` - transition: border-color .3s var(--n-bezier); - `),O("tabs-nav-scroll-content",` - transition: border-color .3s var(--n-bezier); - `),O("tabs-bar",` - border-radius: 0; - `)]),le("card-type",[we("prefix, suffix",` - transition: border-color .3s var(--n-bezier); - border-bottom: 1px solid var(--n-tab-border-color); - `),O("tabs-pad",` - flex-grow: 1; - transition: border-color .3s var(--n-bezier); - `),O("tabs-tab-pad",` - transition: border-color .3s var(--n-bezier); - `),O("tabs-tab",` - font-weight: var(--n-tab-font-weight); - border: 1px solid var(--n-tab-border-color); - background-color: var(--n-tab-color); - box-sizing: border-box; - position: relative; - vertical-align: bottom; - display: flex; - justify-content: space-between; - font-size: var(--n-tab-font-size); - color: var(--n-tab-text-color); - `,[le("addable",` - padding-left: 8px; - padding-right: 8px; - font-size: 16px; - `,[we("height-placeholder",` - width: 0; - font-size: var(--n-tab-font-size); - `),ei("disabled",[he("&:hover",` - color: var(--n-tab-text-color-hover); - `)])]),le("closable","padding-right: 8px;"),le("active",` - background-color: #0000; - font-weight: var(--n-tab-font-weight-active); - color: var(--n-tab-text-color-active); - `),le("disabled","color: var(--n-tab-text-color-disabled);")]),O("tabs-scroll-padding","border-bottom: 1px solid var(--n-tab-border-color);")]),le("left, right",[O("tabs-wrapper",` - flex-direction: column; - `,[O("tabs-tab-wrapper",` - flex-direction: column; - `,[O("tabs-tab-pad",` - height: var(--n-tab-gap-vertical); - width: 100%; - `)])])]),le("top",[le("card-type",[O("tabs-tab",` - border-top-left-radius: var(--n-tab-border-radius); - border-top-right-radius: var(--n-tab-border-radius); - `,[le("active",` - border-bottom: 1px solid #0000; - `)]),O("tabs-tab-pad",` - border-bottom: 1px solid var(--n-tab-border-color); - `),O("tabs-pad",` - border-bottom: 1px solid var(--n-tab-border-color); - `)])]),le("left",[le("card-type",[O("tabs-tab",` - border-top-left-radius: var(--n-tab-border-radius); - border-bottom-left-radius: var(--n-tab-border-radius); - `,[le("active",` - border-right: 1px solid #0000; - `)]),O("tabs-tab-pad",` - border-right: 1px solid var(--n-tab-border-color); - `),O("tabs-pad",` - border-right: 1px solid var(--n-tab-border-color); - `)])]),le("right",[le("card-type",[O("tabs-tab",` - border-top-right-radius: var(--n-tab-border-radius); - border-bottom-right-radius: var(--n-tab-border-radius); - `,[le("active",` - border-left: 1px solid #0000; - `)]),O("tabs-tab-pad",` - border-left: 1px solid var(--n-tab-border-color); - `),O("tabs-pad",` - border-left: 1px solid var(--n-tab-border-color); - `)])]),le("bottom",[le("card-type",[O("tabs-tab",` - border-bottom-left-radius: var(--n-tab-border-radius); - border-bottom-right-radius: var(--n-tab-border-radius); - `,[le("active",` - border-top: 1px solid #0000; - `)]),O("tabs-tab-pad",` - border-top: 1px solid var(--n-tab-border-color); - `),O("tabs-pad",` - border-top: 1px solid var(--n-tab-border-color); - `)])])])]),Jm=Object.assign(Object.assign({},dt.props),{value:[String,Number],defaultValue:[String,Number],trigger:{type:String,default:"click"},type:{type:String,default:"bar"},closable:Boolean,justifyContent:String,size:{type:String,default:"medium"},placement:{type:String,default:"top"},tabStyle:[String,Object],barWidth:Number,paneClass:String,paneStyle:[String,Object],paneWrapperClass:String,paneWrapperStyle:[String,Object],addable:[Boolean,Object],tabsPadding:{type:Number,default:0},animated:Boolean,onBeforeLeave:Function,onAdd:Function,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onClose:[Function,Array],labelSize:String,activeName:[String,Number],onActiveNameChange:[Function,Array]}),Qm=Re({name:"Tabs",props:Jm,setup(e,{slots:t}){var n,i,c,l;const{mergedClsPrefixRef:u,inlineThemeDisabled:h}=Ut(e),f=dt("Tabs","-tabs",Zm,mf,e,u),b=te(null),y=te(null),k=te(null),C=te(null),S=te(null),L=te(!0),P=te(!0),$=bc(e,["labelSize","size"]),E=bc(e,["activeName","value"]),B=te((i=(n=E.value)!==null&&n!==void 0?n:e.defaultValue)!==null&&i!==void 0?i:t.default?(l=(c=Ga(t.default())[0])===null||c===void 0?void 0:c.props)===null||l===void 0?void 0:l.name:null),M=Vr(E,B),U={id:0},q=de(()=>{if(!(!e.justifyContent||e.type==="card"))return{display:"flex",justifyContent:e.justifyContent}});tr(M,()=>{U.id=0,X(),oe()});function R(){var ue;const{value:Te}=M;return Te===null?null:(ue=b.value)===null||ue===void 0?void 0:ue.querySelector(`[data-name="${Te}"]`)}function j(ue){if(e.type==="card")return;const{value:Te}=y;if(Te&&ue){const Y=`${u.value}-tabs-bar--disabled`,{barWidth:ye,placement:je}=e;if(ue.dataset.disabled==="true"?Te.classList.add(Y):Te.classList.remove(Y),["top","bottom"].includes(je)){if(ie(["top","maxHeight","height"]),typeof ye=="number"&&ue.offsetWidth>=ye){const Ke=Math.floor((ue.offsetWidth-ye)/2)+ue.offsetLeft;Te.style.left=`${Ke}px`,Te.style.maxWidth=`${ye}px`}else Te.style.left=`${ue.offsetLeft}px`,Te.style.maxWidth=`${ue.offsetWidth}px`;Te.style.width="8192px",Te.offsetWidth}else{if(ie(["left","maxWidth","width"]),typeof ye=="number"&&ue.offsetHeight>=ye){const Ke=Math.floor((ue.offsetHeight-ye)/2)+ue.offsetTop;Te.style.top=`${Ke}px`,Te.style.maxHeight=`${ye}px`}else Te.style.top=`${ue.offsetTop}px`,Te.style.maxHeight=`${ue.offsetHeight}px`;Te.style.height="8192px",Te.offsetHeight}}}function ie(ue){const{value:Te}=y;if(Te)for(const Y of ue)Te.style[Y]=""}function X(){if(e.type==="card")return;const ue=R();ue&&j(ue)}function oe(ue){var Te;const Y=(Te=S.value)===null||Te===void 0?void 0:Te.$el;if(!Y)return;const ye=R();if(!ye)return;const{scrollLeft:je,offsetWidth:Ke}=Y,{offsetLeft:lt,offsetWidth:rt}=ye;je>lt?Y.scrollTo({top:0,left:lt,behavior:"smooth"}):lt+rt>je+Ke&&Y.scrollTo({top:0,left:lt+rt-Ke,behavior:"smooth"})}const Z=te(null);let ee=0,ne=null;function V(ue){const Te=Z.value;if(Te){ee=ue.getBoundingClientRect().height;const Y=`${ee}px`,ye=()=>{Te.style.height=Y,Te.style.maxHeight=Y};ne?(ye(),ne(),ne=null):ne=ye}}function ae(ue){const Te=Z.value;if(Te){const Y=ue.getBoundingClientRect().height,ye=()=>{document.body.offsetHeight,Te.style.maxHeight=`${Y}px`,Te.style.height=`${Math.max(ee,Y)}px`};ne?(ne(),ne=null,ye()):ne=ye}}function me(){const ue=Z.value;if(ue){ue.style.maxHeight="",ue.style.height="";const{paneWrapperStyle:Te}=e;if(typeof Te=="string")ue.style.cssText=Te;else if(Te){const{maxHeight:Y,height:ye}=Te;Y!==void 0&&(ue.style.maxHeight=Y),ye!==void 0&&(ue.style.height=ye)}}}const Ce={value:[]},Le=te("next");function ht(ue){const Te=M.value;let Y="next";for(const ye of Ce.value){if(ye===Te)break;if(ye===ue){Y="prev";break}}Le.value=Y,gt(ue)}function gt(ue){const{onActiveNameChange:Te,onUpdateValue:Y,"onUpdate:value":ye}=e;Te&&Je(Te,ue),Y&&Je(Y,ue),ye&&Je(ye,ue),B.value=ue}function De(ue){const{onClose:Te}=e;Te&&Je(Te,ue)}function ve(){const{value:ue}=y;if(!ue)return;const Te="transition-disabled";ue.classList.add(Te),X(),ue.classList.remove(Te)}let Ee=0;function Se(ue){var Te;if(ue.contentRect.width===0&&ue.contentRect.height===0||Ee===ue.contentRect.width)return;Ee=ue.contentRect.width;const{type:Y}=e;(Y==="line"||Y==="bar")&&ve(),Y!=="segment"&&hr(((Te=S.value)===null||Te===void 0?void 0:Te.$el)||null)}const Ze=ys(Se,64);tr([()=>e.justifyContent,()=>e.size],()=>{An(()=>{const{type:ue}=e;(ue==="line"||ue==="bar")&&ve()})});const Be=te(!1);function Ye(ue){var Te;const{target:Y,contentRect:{width:ye}}=ue,je=Y.parentElement.offsetWidth;if(!Be.value)jeKe.$el.offsetWidth&&(Be.value=!1)}hr(((Te=S.value)===null||Te===void 0?void 0:Te.$el)||null)}const wt=ys(Ye,64);function Rr(){const{onAdd:ue}=e;ue&&ue(),An(()=>{const Te=R(),{value:Y}=S;!Te||!Y||Y.scrollTo({left:Te.offsetLeft,top:0,behavior:"smooth"})})}function hr(ue){if(!ue)return;const{placement:Te}=e;if(Te==="top"||Te==="bottom"){const{scrollLeft:Y,scrollWidth:ye,offsetWidth:je}=ue;L.value=Y<=0,P.value=Y+je>=ye}else{const{scrollTop:Y,scrollHeight:ye,offsetHeight:je}=ue;L.value=Y<=0,P.value=Y+je>=ye}}const Mr=ys(ue=>{hr(ue.target)},64);xr(Tl,{triggerRef:Ue(e,"trigger"),tabStyleRef:Ue(e,"tabStyle"),paneClassRef:Ue(e,"paneClass"),paneStyleRef:Ue(e,"paneStyle"),mergedClsPrefixRef:u,typeRef:Ue(e,"type"),closableRef:Ue(e,"closable"),valueRef:M,tabChangeIdRef:U,onBeforeLeaveRef:Ue(e,"onBeforeLeave"),activateTab:ht,handleClose:De,handleAdd:Rr}),Jf(()=>{X(),oe()}),go(()=>{const{value:ue}=k;if(!ue)return;const{value:Te}=u,Y=`${Te}-tabs-nav-scroll-wrapper--shadow-start`,ye=`${Te}-tabs-nav-scroll-wrapper--shadow-end`;L.value?ue.classList.remove(Y):ue.classList.add(Y),P.value?ue.classList.remove(ye):ue.classList.add(ye)});const Xr=te(null);tr(M,()=>{if(e.type==="segment"){const ue=Xr.value;ue&&An(()=>{ue.classList.add("transition-disabled"),ue.offsetWidth,ue.classList.remove("transition-disabled")})}});const ln={syncBarPosition:()=>{X()}},cn=de(()=>{const{value:ue}=$,{type:Te}=e,Y={card:"Card",bar:"Bar",line:"Line",segment:"Segment"}[Te],ye=`${ue}${Y}`,{self:{barColor:je,closeIconColor:Ke,closeIconColorHover:lt,closeIconColorPressed:rt,tabColor:Pt,tabBorderColor:Nt,paneTextColor:Sr,tabFontWeight:Yn,tabBorderRadius:Kn,tabFontWeightActive:ia,colorSegment:Di,fontWeightStrong:So,tabColorSegment:zi,closeSize:sa,closeIconSize:bt,closeColorHover:be,closeColorPressed:Br,closeBorderRadius:la,[ut("panePadding",ue)]:zn,[ut("tabPadding",ye)]:ca,[ut("tabPaddingVertical",ye)]:En,[ut("tabGap",ye)]:Co,[ut("tabGap",`${ye}Vertical`)]:Ei,[ut("tabTextColor",Te)]:Ri,[ut("tabTextColorActive",Te)]:Yt,[ut("tabTextColorHover",Te)]:Cr,[ut("tabTextColorDisabled",Te)]:Ir,[ut("tabFontSize",ue)]:Ao},common:{cubicBezierEaseInOut:ua}}=f.value;return{"--n-bezier":ua,"--n-color-segment":Di,"--n-bar-color":je,"--n-tab-font-size":Ao,"--n-tab-text-color":Ri,"--n-tab-text-color-active":Yt,"--n-tab-text-color-disabled":Ir,"--n-tab-text-color-hover":Cr,"--n-pane-text-color":Sr,"--n-tab-border-color":Nt,"--n-tab-border-radius":Kn,"--n-close-size":sa,"--n-close-icon-size":bt,"--n-close-color-hover":be,"--n-close-color-pressed":Br,"--n-close-border-radius":la,"--n-close-icon-color":Ke,"--n-close-icon-color-hover":lt,"--n-close-icon-color-pressed":rt,"--n-tab-color":Pt,"--n-tab-font-weight":Yn,"--n-tab-font-weight-active":ia,"--n-tab-padding":ca,"--n-tab-padding-vertical":En,"--n-tab-gap":Co,"--n-tab-gap-vertical":Ei,"--n-pane-padding-left":Ia(zn,"left"),"--n-pane-padding-right":Ia(zn,"right"),"--n-pane-padding-top":Ia(zn,"top"),"--n-pane-padding-bottom":Ia(zn,"bottom"),"--n-font-weight-strong":So,"--n-tab-color-segment":zi}}),Xt=h?kr("tabs",de(()=>`${$.value[0]}${e.type[0]}`),cn,e):void 0;return Object.assign({mergedClsPrefix:u,mergedValue:M,renderedNames:new Set,tabsRailElRef:Xr,tabsPaneWrapperRef:Z,tabsElRef:b,barElRef:y,addTabInstRef:C,xScrollInstRef:S,scrollWrapperElRef:k,addTabFixed:Be,tabWrapperStyle:q,handleNavResize:Ze,mergedSize:$,handleScroll:Mr,handleTabsResize:wt,cssVars:h?void 0:cn,themeClass:Xt==null?void 0:Xt.themeClass,animationDirection:Le,renderNameListRef:Ce,onAnimationBeforeLeave:V,onAnimationEnter:ae,onAnimationAfterEnter:me,onRender:Xt==null?void 0:Xt.onRender},ln)},render(){const{mergedClsPrefix:e,type:t,placement:n,addTabFixed:i,addable:c,mergedSize:l,renderNameListRef:u,onRender:h,paneWrapperClass:f,paneWrapperStyle:b,$slots:{default:y,prefix:k,suffix:C}}=this;h==null||h();const S=y?Ga(y()).filter(q=>q.type.__TAB_PANE__===!0):[],L=y?Ga(y()).filter(q=>q.type.__TAB__===!0):[],P=!L.length,$=t==="card",E=t==="segment",B=!$&&!E&&this.justifyContent;u.value=[];const M=()=>{const q=D("div",{style:this.tabWrapperStyle,class:[`${e}-tabs-wrapper`]},B?null:D("div",{class:`${e}-tabs-scroll-padding`,style:{width:`${this.tabsPadding}px`}}),P?S.map((R,j)=>(u.value.push(R.props.name),Cs(D(ll,Object.assign({},R.props,{internalCreatedByPane:!0,internalLeftPadded:j!==0&&(!B||B==="center"||B==="start"||B==="end")}),R.children?{default:R.children.tab}:void 0)))):L.map((R,j)=>(u.value.push(R.props.name),Cs(j!==0&&!B?_c(R):R))),!i&&c&&$?Tc(c,(P?S.length:L.length)!==0):null,B?null:D("div",{class:`${e}-tabs-scroll-padding`,style:{width:`${this.tabsPadding}px`}}));return D("div",{ref:"tabsElRef",class:`${e}-tabs-nav-scroll-content`},$&&c?D(Ys,{onResize:this.handleTabsResize},{default:()=>q}):q,$?D("div",{class:`${e}-tabs-pad`}):null,$?null:D("div",{ref:"barElRef",class:`${e}-tabs-bar`}))},U=E?"top":n;return D("div",{class:[`${e}-tabs`,this.themeClass,`${e}-tabs--${t}-type`,`${e}-tabs--${l}-size`,B&&`${e}-tabs--flex`,`${e}-tabs--${U}`],style:this.cssVars},D("div",{class:[`${e}-tabs-nav--${t}-type`,`${e}-tabs-nav--${U}`,`${e}-tabs-nav`]},Vo(k,q=>q&&D("div",{class:`${e}-tabs-nav__prefix`},q)),E?D("div",{class:`${e}-tabs-rail`,ref:"tabsRailElRef"},P?S.map((q,R)=>(u.value.push(q.props.name),D(ll,Object.assign({},q.props,{internalCreatedByPane:!0,internalLeftPadded:R!==0}),q.children?{default:q.children.tab}:void 0))):L.map((q,R)=>(u.value.push(q.props.name),R===0?q:_c(q)))):D(Ys,{onResize:this.handleNavResize},{default:()=>D("div",{class:`${e}-tabs-nav-scroll-wrapper`,ref:"scrollWrapperElRef"},["top","bottom"].includes(U)?D(ap,{ref:"xScrollInstRef",onScroll:this.handleScroll},{default:M}):D("div",{class:`${e}-tabs-nav-y-scroll`,onScroll:this.handleScroll},M()))}),i&&c&&$?Tc(c,!0):null,Vo(C,q=>q&&D("div",{class:`${e}-tabs-nav__suffix`},q))),P&&(this.animated&&(U==="top"||U==="bottom")?D("div",{ref:"tabsPaneWrapperRef",style:b,class:[`${e}-tabs-pane-wrapper`,f]},Ac(S,this.mergedValue,this.renderedNames,this.onAnimationBeforeLeave,this.onAnimationEnter,this.onAnimationAfterEnter,this.animationDirection)):Ac(S,this.mergedValue,this.renderedNames)))}});function Ac(e,t,n,i,c,l,u){const h=[];return e.forEach(f=>{const{name:b,displayDirective:y,"display-directive":k}=f.props,C=L=>y===L||k===L,S=t===b;if(f.key!==void 0&&(f.key=b),S||C("show")||C("show:lazy")&&n.has(b)){n.has(b)||n.add(b);const L=!C("if");h.push(L?fi(f,[[Gu,S]]):f)}}),u?D(vf,{name:`${u}-transition`,onBeforeLeave:i,onEnter:c,onAfterEnter:l},{default:()=>h}):h}function Tc(e,t){return D(ll,{ref:"addTabInstRef",key:"__addable",name:"__addable",internalCreatedByPane:!0,internalAddable:!0,internalLeftPadded:t,disabled:typeof e=="object"&&e.disabled})}function _c(e){const t=gf(e);return t.props?t.props.internalLeftPadded=!0:t.props={internalLeftPadded:!0},t}function Cs(e){return Array.isArray(e.dynamicProps)?e.dynamicProps.includes("internalLeftPadded")||e.dynamicProps.push("internalLeftPadded"):e.dynamicProps=["internalLeftPadded"],e}const yo=zr("n-upload"),wd="__UPLOAD_DRAGGER__",e4=Re({name:"UploadDragger",[wd]:!0,setup(e,{slots:t}){const n=Rt(yo,null);return n||Qo("upload-dragger","`n-upload-dragger` must be placed inside `n-upload`."),()=>{const{mergedClsPrefixRef:{value:i},mergedDisabledRef:{value:c},maxReachedRef:{value:l}}=n;return D("div",{class:[`${i}-upload-dragger`,(c||l)&&`${i}-upload-dragger--disabled`]},t)}}}),kd=Re({name:"UploadTrigger",props:{abstract:Boolean},setup(e,{slots:t}){const n=Rt(yo,null);n||Qo("upload-trigger","`n-upload-trigger` must be placed inside `n-upload`.");const{mergedClsPrefixRef:i,mergedDisabledRef:c,maxReachedRef:l,listTypeRef:u,dragOverRef:h,openOpenFileDialog:f,draggerInsideRef:b,handleFileAddition:y,mergedDirectoryDndRef:k,triggerClassRef:C,triggerStyleRef:S}=n,L=de(()=>u.value==="image-card");function P(){c.value||l.value||f()}function $(U){U.preventDefault(),h.value=!0}function E(U){U.preventDefault(),h.value=!0}function B(U){U.preventDefault(),h.value=!1}function M(U){var q;if(U.preventDefault(),!b.value||c.value||l.value){h.value=!1;return}const R=(q=U.dataTransfer)===null||q===void 0?void 0:q.items;R!=null&&R.length?Bf(Array.from(R).map(j=>j.webkitGetAsEntry()),k.value).then(j=>{y(j)}).finally(()=>{h.value=!1}):h.value=!1}return()=>{var U;const{value:q}=i;return e.abstract?(U=t.default)===null||U===void 0?void 0:U.call(t,{handleClick:P,handleDrop:M,handleDragOver:$,handleDragEnter:E,handleDragLeave:B}):D("div",{class:[`${q}-upload-trigger`,(c.value||l.value)&&`${q}-upload-trigger--disabled`,L.value&&`${q}-upload-trigger--image-card`,C.value],style:S.value,onClick:P,onDrop:M,onDragover:$,onDragenter:E,onDragleave:B},L.value?D(e4,null,{default:()=>gl(t.default,()=>[D(er,{clsPrefix:q},{default:()=>D(ld,null)})])}):t)}}}),t4=Re({name:"UploadProgress",props:{show:Boolean,percentage:{type:Number,required:!0},status:{type:String,required:!0}},setup(){return{mergedTheme:Rt(yo).mergedThemeRef}},render(){return D(Wu,null,{default:()=>this.show?D(sl,{type:"line",showIndicator:!1,percentage:this.percentage,status:this.status,height:2,theme:this.mergedTheme.peers.Progress,themeOverrides:this.mergedTheme.peerOverrides.Progress}):null})}}),r4=D("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 28 28"},D("g",{fill:"none"},D("path",{d:"M21.75 3A3.25 3.25 0 0 1 25 6.25v15.5A3.25 3.25 0 0 1 21.75 25H6.25A3.25 3.25 0 0 1 3 21.75V6.25A3.25 3.25 0 0 1 6.25 3h15.5zm.583 20.4l-7.807-7.68a.75.75 0 0 0-.968-.07l-.084.07l-7.808 7.68c.183.065.38.1.584.1h15.5c.204 0 .4-.035.583-.1l-7.807-7.68l7.807 7.68zM21.75 4.5H6.25A1.75 1.75 0 0 0 4.5 6.25v15.5c0 .208.036.408.103.593l7.82-7.692a2.25 2.25 0 0 1 3.026-.117l.129.117l7.82 7.692c.066-.185.102-.385.102-.593V6.25a1.75 1.75 0 0 0-1.75-1.75zm-3.25 3a2.5 2.5 0 1 1 0 5a2.5 2.5 0 0 1 0-5zm0 1.5a1 1 0 1 0 0 2a1 1 0 0 0 0-2z",fill:"currentColor"}))),n4=D("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 28 28"},D("g",{fill:"none"},D("path",{d:"M6.4 2A2.4 2.4 0 0 0 4 4.4v19.2A2.4 2.4 0 0 0 6.4 26h15.2a2.4 2.4 0 0 0 2.4-2.4V11.578c0-.729-.29-1.428-.805-1.944l-6.931-6.931A2.4 2.4 0 0 0 14.567 2H6.4zm-.9 2.4a.9.9 0 0 1 .9-.9H14V10a2 2 0 0 0 2 2h6.5v11.6a.9.9 0 0 1-.9.9H6.4a.9.9 0 0 1-.9-.9V4.4zm16.44 6.1H16a.5.5 0 0 1-.5-.5V4.06l6.44 6.44z",fill:"currentColor"})));var o4=globalThis&&globalThis.__awaiter||function(e,t,n,i){function c(l){return l instanceof n?l:new n(function(u){u(l)})}return new(n||(n=Promise))(function(l,u){function h(y){try{b(i.next(y))}catch(k){u(k)}}function f(y){try{b(i.throw(y))}catch(k){u(k)}}function b(y){y.done?l(y.value):c(y.value).then(h,f)}b((i=i.apply(e,t||[])).next())})};const qa={paddingMedium:"0 3px",heightMedium:"24px",iconSizeMedium:"18px"},a4=Re({name:"UploadFile",props:{clsPrefix:{type:String,required:!0},file:{type:Object,required:!0},listType:{type:String,required:!0}},setup(e){const t=Rt(yo),n=te(null),i=te(""),c=de(()=>{const{file:q}=e;return q.status==="finished"?"success":q.status==="error"?"error":"info"}),l=de(()=>{const{file:q}=e;if(q.status==="error")return"error"}),u=de(()=>{const{file:q}=e;return q.status==="uploading"}),h=de(()=>{if(!t.showCancelButtonRef.value)return!1;const{file:q}=e;return["uploading","pending","error"].includes(q.status)}),f=de(()=>{if(!t.showRemoveButtonRef.value)return!1;const{file:q}=e;return["finished"].includes(q.status)}),b=de(()=>{if(!t.showDownloadButtonRef.value)return!1;const{file:q}=e;return["finished"].includes(q.status)}),y=de(()=>{if(!t.showRetryButtonRef.value)return!1;const{file:q}=e;return["error"].includes(q.status)}),k=Dn(()=>i.value||e.file.thumbnailUrl||e.file.url),C=de(()=>{if(!t.showPreviewButtonRef.value)return!1;const{file:{status:q},listType:R}=e;return["finished"].includes(q)&&k.value&&R==="image-card"});function S(){t.submit(e.file.id)}function L(q){q.preventDefault();const{file:R}=e;["finished","pending","error"].includes(R.status)?$(R):["uploading"].includes(R.status)?B(R):hi("upload","The button clicked type is unknown.")}function P(q){q.preventDefault(),E(e.file)}function $(q){const{xhrMap:R,doChange:j,onRemoveRef:{value:ie},mergedFileListRef:{value:X}}=t;Promise.resolve(ie?ie({file:Object.assign({},q),fileList:X}):!0).then(oe=>{if(oe===!1)return;const Z=Object.assign({},q,{status:"removed"});R.delete(q.id),j(Z,void 0,{remove:!0})})}function E(q){const{onDownloadRef:{value:R}}=t;Promise.resolve(R?R(Object.assign({},q)):!0).then(j=>{j!==!1&&If(q.url,q.name)})}function B(q){const{xhrMap:R}=t,j=R.get(q.id);j==null||j.abort(),$(Object.assign({},q))}function M(){const{onPreviewRef:{value:q}}=t;if(q)q(e.file);else if(e.listType==="image-card"){const{value:R}=n;if(!R)return;R.click()}}const U=()=>o4(this,void 0,void 0,function*(){const{listType:q}=e;q!=="image"&&q!=="image-card"||t.shouldUseThumbnailUrlRef.value(e.file)&&(i.value=yield t.getFileThumbnailUrlResolver(e.file))});return go(()=>{U()}),{mergedTheme:t.mergedThemeRef,progressStatus:c,buttonType:l,showProgress:u,disabled:t.mergedDisabledRef,showCancelButton:h,showRemoveButton:f,showDownloadButton:b,showRetryButton:y,showPreviewButton:C,mergedThumbnailUrl:k,shouldUseThumbnailUrl:t.shouldUseThumbnailUrlRef,renderIcon:t.renderIconRef,imageRef:n,handleRemoveOrCancelClick:L,handleDownloadClick:P,handleRetryClick:S,handlePreviewClick:M}},render(){const{clsPrefix:e,mergedTheme:t,listType:n,file:i,renderIcon:c}=this;let l;const u=n==="image";u||n==="image-card"?l=!this.shouldUseThumbnailUrl(i)||!this.mergedThumbnailUrl?D("span",{class:`${e}-upload-file-info__thumbnail`},c?c(i):Ju(i)?D(er,{clsPrefix:e},{default:()=>r4}):D(er,{clsPrefix:e},{default:()=>n4})):D("a",{rel:"noopener noreferer",target:"_blank",href:i.url||void 0,class:`${e}-upload-file-info__thumbnail`,onClick:this.handlePreviewClick},n==="image-card"?D(Qu,{src:this.mergedThumbnailUrl||void 0,previewSrc:i.url||void 0,alt:i.name,ref:"imageRef"}):D("img",{src:this.mergedThumbnailUrl||void 0,alt:i.name})):l=D("span",{class:`${e}-upload-file-info__thumbnail`},c?c(i):D(er,{clsPrefix:e},{default:()=>D(xp,null)}));const f=D(t4,{show:this.showProgress,percentage:i.percentage||0,status:this.progressStatus}),b=n==="text"||n==="image";return D("div",{class:[`${e}-upload-file`,`${e}-upload-file--${this.progressStatus}-status`,i.url&&i.status!=="error"&&n!=="image-card"&&`${e}-upload-file--with-url`,`${e}-upload-file--${n}-type`]},D("div",{class:`${e}-upload-file-info`},l,D("div",{class:`${e}-upload-file-info__name`},b&&(i.url&&i.status!=="error"?D("a",{rel:"noopener noreferer",target:"_blank",href:i.url||void 0,onClick:this.handlePreviewClick},i.name):D("span",{onClick:this.handlePreviewClick},i.name)),u&&f),D("div",{class:[`${e}-upload-file-info__action`,`${e}-upload-file-info__action--${n}-type`]},this.showPreviewButton?D(Dt,{key:"preview",quaternary:!0,type:this.buttonType,onClick:this.handlePreviewClick,theme:t.peers.Button,themeOverrides:t.peerOverrides.Button,builtinThemeOverrides:qa},{icon:()=>D(er,{clsPrefix:e},{default:()=>D(Wf,null)})}):null,(this.showRemoveButton||this.showCancelButton)&&!this.disabled&&D(Dt,{key:"cancelOrTrash",theme:t.peers.Button,themeOverrides:t.peerOverrides.Button,quaternary:!0,builtinThemeOverrides:qa,type:this.buttonType,onClick:this.handleRemoveOrCancelClick},{icon:()=>D(qu,null,{default:()=>this.showRemoveButton?D(er,{clsPrefix:e,key:"trash"},{default:()=>D(wp,null)}):D(er,{clsPrefix:e,key:"cancel"},{default:()=>D(Sp,null)})})}),this.showRetryButton&&!this.disabled&&D(Dt,{key:"retry",quaternary:!0,type:this.buttonType,onClick:this.handleRetryClick,theme:t.peers.Button,themeOverrides:t.peerOverrides.Button,builtinThemeOverrides:qa},{icon:()=>D(er,{clsPrefix:e},{default:()=>D(Cp,null)})}),this.showDownloadButton?D(Dt,{key:"download",quaternary:!0,type:this.buttonType,onClick:this.handleDownloadClick,theme:t.peers.Button,themeOverrides:t.peerOverrides.Button,builtinThemeOverrides:qa},{icon:()=>D(er,{clsPrefix:e},{default:()=>D(kp,null)})}):null)),!u&&f)}}),i4=Re({name:"UploadFileList",setup(e,{slots:t}){const n=Rt(yo,null);n||Qo("upload-file-list","`n-upload-file-list` must be placed inside `n-upload`.");const{abstractRef:i,mergedClsPrefixRef:c,listTypeRef:l,mergedFileListRef:u,fileListClassRef:h,fileListStyleRef:f,cssVarsRef:b,themeClassRef:y,maxReachedRef:k,showTriggerRef:C,imageGroupPropsRef:S}=n,L=de(()=>l.value==="image-card"),P=()=>u.value.map(E=>D(a4,{clsPrefix:c.value,key:E.id,file:E,listType:l.value})),$=()=>L.value?D(Pf,Object.assign({},S.value),{default:P}):D(Wu,{group:!0},{default:P});return()=>{const{value:E}=c,{value:B}=i;return D("div",{class:[`${E}-upload-file-list`,L.value&&`${E}-upload-file-list--grid`,B?y==null?void 0:y.value:void 0,h.value],style:[B&&b?b.value:"",f.value]},$(),C.value&&!k.value&&L.value&&D(kd,null,t))}}}),s4=he([O("upload","width: 100%;",[le("dragger-inside",[O("upload-trigger",` - display: block; - `)]),le("drag-over",[O("upload-dragger",` - border: var(--n-dragger-border-hover); - `)])]),O("upload-dragger",` - cursor: pointer; - box-sizing: border-box; - width: 100%; - text-align: center; - border-radius: var(--n-border-radius); - padding: 24px; - opacity: 1; - transition: - opacity .3s var(--n-bezier), - border-color .3s var(--n-bezier), - background-color .3s var(--n-bezier); - background-color: var(--n-dragger-color); - border: var(--n-dragger-border); - `,[he("&:hover",` - border: var(--n-dragger-border-hover); - `),le("disabled",` - cursor: not-allowed; - `)]),O("upload-trigger",` - display: inline-block; - box-sizing: border-box; - opacity: 1; - transition: opacity .3s var(--n-bezier); - `,[he("+",[O("upload-file-list","margin-top: 8px;")]),le("disabled",` - opacity: var(--n-item-disabled-opacity); - cursor: not-allowed; - `),le("image-card",` - width: 96px; - height: 96px; - `,[O("base-icon",` - font-size: 24px; - `),O("upload-dragger",` - padding: 0; - height: 100%; - width: 100%; - display: flex; - align-items: center; - justify-content: center; - `)])]),O("upload-file-list",` - line-height: var(--n-line-height); - opacity: 1; - transition: opacity .3s var(--n-bezier); - `,[he("a, img","outline: none;"),le("disabled",` - opacity: var(--n-item-disabled-opacity); - cursor: not-allowed; - `,[O("upload-file","cursor: not-allowed;")]),le("grid",` - display: grid; - grid-template-columns: repeat(auto-fill, 96px); - grid-gap: 8px; - margin-top: 0; - `),O("upload-file",` - display: block; - box-sizing: border-box; - cursor: default; - padding: 0px 12px 0 6px; - transition: background-color .3s var(--n-bezier); - border-radius: var(--n-border-radius); - `,[dc(),O("progress",[dc({foldPadding:!0})]),he("&:hover",` - background-color: var(--n-item-color-hover); - `,[O("upload-file-info",[we("action",` - opacity: 1; - `)])]),le("image-type",` - border-radius: var(--n-border-radius); - text-decoration: underline; - text-decoration-color: #0000; - `,[O("upload-file-info",` - padding-top: 0px; - padding-bottom: 0px; - width: 100%; - height: 100%; - display: flex; - justify-content: space-between; - align-items: center; - padding: 6px 0; - `,[O("progress",` - padding: 2px 0; - margin-bottom: 0; - `),we("name",` - padding: 0 8px; - `),we("thumbnail",` - width: 32px; - height: 32px; - font-size: 28px; - display: flex; - justify-content: center; - align-items: center; - `,[he("img",` - width: 100%; - `)])])]),le("text-type",[O("progress",` - box-sizing: border-box; - padding-bottom: 6px; - margin-bottom: 6px; - `)]),le("image-card-type",` - position: relative; - width: 96px; - height: 96px; - border: var(--n-item-border-image-card); - border-radius: var(--n-border-radius); - padding: 0; - display: flex; - align-items: center; - justify-content: center; - transition: border-color .3s var(--n-bezier), background-color .3s var(--n-bezier); - border-radius: var(--n-border-radius); - overflow: hidden; - `,[O("progress",` - position: absolute; - left: 8px; - bottom: 8px; - right: 8px; - width: unset; - `),O("upload-file-info",` - padding: 0; - width: 100%; - height: 100%; - `,[we("thumbnail",` - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: 36px; - `,[he("img",` - width: 100%; - `)])]),he("&::before",` - position: absolute; - z-index: 1; - left: 0; - right: 0; - top: 0; - bottom: 0; - border-radius: inherit; - opacity: 0; - transition: opacity .2s var(--n-bezier); - content: ""; - `),he("&:hover",[he("&::before","opacity: 1;"),O("upload-file-info",[we("thumbnail","opacity: .12;")])])]),le("error-status",[he("&:hover",` - background-color: var(--n-item-color-hover-error); - `),O("upload-file-info",[we("name","color: var(--n-item-text-color-error);"),we("thumbnail","color: var(--n-item-text-color-error);")]),le("image-card-type",` - border: var(--n-item-border-image-card-error); - `)]),le("with-url",` - cursor: pointer; - `,[O("upload-file-info",[we("name",` - color: var(--n-item-text-color-success); - text-decoration-color: var(--n-item-text-color-success); - `,[he("a",` - text-decoration: underline; - `)])])]),O("upload-file-info",` - position: relative; - padding-top: 6px; - padding-bottom: 6px; - display: flex; - flex-wrap: nowrap; - `,[we("thumbnail",` - font-size: 18px; - opacity: 1; - transition: opacity .2s var(--n-bezier); - color: var(--n-item-icon-color); - `,[O("base-icon",` - margin-right: 2px; - vertical-align: middle; - transition: color .3s var(--n-bezier); - `)]),we("action",` - padding-top: inherit; - padding-bottom: inherit; - position: absolute; - right: 0; - top: 0; - bottom: 0; - width: 80px; - display: flex; - align-items: center; - transition: opacity .2s var(--n-bezier); - justify-content: flex-end; - opacity: 0; - `,[O("button",[he("&:not(:last-child)",{marginRight:"4px"}),O("base-icon",[he("svg",[Nu()])])]),le("image-type",` - position: relative; - max-width: 80px; - width: auto; - `),le("image-card-type",` - z-index: 2; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - bottom: 0; - top: 0; - display: flex; - justify-content: center; - align-items: center; - `)]),we("name",` - color: var(--n-item-text-color); - flex: 1; - display: flex; - justify-content: center; - text-overflow: ellipsis; - overflow: hidden; - flex-direction: column; - text-decoration-color: #0000; - font-size: var(--n-font-size); - transition: - color .3s var(--n-bezier), - text-decoration-color .3s var(--n-bezier); - `,[he("a",` - color: inherit; - text-decoration: underline; - `)])])])]),O("upload-file-input",` - display: block; - width: 0; - height: 0; - opacity: 0; - `)]);var Dc=globalThis&&globalThis.__awaiter||function(e,t,n,i){function c(l){return l instanceof n?l:new n(function(u){u(l)})}return new(n||(n=Promise))(function(l,u){function h(y){try{b(i.next(y))}catch(k){u(k)}}function f(y){try{b(i.throw(y))}catch(k){u(k)}}function b(y){y.done?l(y.value):c(y.value).then(h,f)}b((i=i.apply(e,t||[])).next())})};function l4(e,t,n){const{doChange:i,xhrMap:c}=e;let l=0;function u(f){var b;let y=Object.assign({},t,{status:"error",percentage:l});c.delete(t.id),y=Go(((b=e.onError)===null||b===void 0?void 0:b.call(e,{file:y,event:f}))||y),i(y,f)}function h(f){var b;if(e.isErrorState){if(e.isErrorState(n)){u(f);return}}else if(n.status<200||n.status>=300){u(f);return}let y=Object.assign({},t,{status:"finished",percentage:l});c.delete(t.id),y=Go(((b=e.onFinish)===null||b===void 0?void 0:b.call(e,{file:y,event:f}))||y),i(y,f)}return{handleXHRLoad:h,handleXHRError:u,handleXHRAbort(f){const b=Object.assign({},t,{status:"removed",file:null,percentage:l});c.delete(t.id),i(b,f)},handleXHRProgress(f){const b=Object.assign({},t,{status:"uploading"});if(f.lengthComputable){const y=Math.ceil(f.loaded/f.total*100);b.percentage=y,l=y}i(b,f)}}}function c4(e){const{inst:t,file:n,data:i,headers:c,withCredentials:l,action:u,customRequest:h}=e,{doChange:f}=e.inst;let b=0;h({file:n,data:i,headers:c,withCredentials:l,action:u,onProgress(y){const k=Object.assign({},n,{status:"uploading"}),C=y.percent;k.percentage=C,b=C,f(k)},onFinish(){var y;let k=Object.assign({},n,{status:"finished",percentage:b});k=Go(((y=t.onFinish)===null||y===void 0?void 0:y.call(t,{file:k}))||k),f(k)},onError(){var y;let k=Object.assign({},n,{status:"error",percentage:b});k=Go(((y=t.onError)===null||y===void 0?void 0:y.call(t,{file:k}))||k),f(k)}})}function u4(e,t,n){const i=l4(e,t,n);n.onabort=i.handleXHRAbort,n.onerror=i.handleXHRError,n.onload=i.handleXHRLoad,n.upload&&(n.upload.onprogress=i.handleXHRProgress)}function Sd(e,t){return typeof e=="function"?e({file:t}):e||{}}function d4(e,t,n){const i=Sd(t,n);i&&Object.keys(i).forEach(c=>{e.setRequestHeader(c,i[c])})}function h4(e,t,n){const i=Sd(t,n);i&&Object.keys(i).forEach(c=>{e.append(c,i[c])})}function f4(e,t,n,{method:i,action:c,withCredentials:l,responseType:u,headers:h,data:f}){const b=new XMLHttpRequest;b.responseType=u,e.xhrMap.set(n.id,b),b.withCredentials=l;const y=new FormData;if(h4(y,f,n),n.file!==null&&y.append(t,n.file),u4(e,n,b),c!==void 0){b.open(i.toUpperCase(),c),d4(b,h,n),b.send(y);const k=Object.assign({},n,{status:"uploading"});e.doChange(k)}}const p4=Object.assign(Object.assign({},dt.props),{name:{type:String,default:"file"},accept:String,action:String,customRequest:Function,directory:Boolean,directoryDnd:{type:Boolean,default:void 0},method:{type:String,default:"POST"},multiple:Boolean,showFileList:{type:Boolean,default:!0},data:[Object,Function],headers:[Object,Function],withCredentials:Boolean,responseType:{type:String,default:""},disabled:{type:Boolean,default:void 0},onChange:Function,onRemove:Function,onFinish:Function,onError:Function,onBeforeUpload:Function,isErrorState:Function,onDownload:Function,defaultUpload:{type:Boolean,default:!0},fileList:Array,"onUpdate:fileList":[Function,Array],onUpdateFileList:[Function,Array],fileListClass:String,fileListStyle:[String,Object],defaultFileList:{type:Array,default:()=>[]},showCancelButton:{type:Boolean,default:!0},showRemoveButton:{type:Boolean,default:!0},showDownloadButton:Boolean,showRetryButton:{type:Boolean,default:!0},showPreviewButton:{type:Boolean,default:!0},listType:{type:String,default:"text"},onPreview:Function,shouldUseThumbnailUrl:{type:Function,default:e=>Nf?Ju(e):!1},createThumbnailUrl:Function,abstract:Boolean,max:Number,showTrigger:{type:Boolean,default:!0},imageGroupProps:Object,inputProps:Object,triggerClass:String,triggerStyle:[String,Object],renderIcon:Function}),m4=Re({name:"Upload",props:p4,setup(e){e.abstract&&e.listType==="image-card"&&Qo("upload","when the list-type is image-card, abstract is not supported.");const{mergedClsPrefixRef:t,inlineThemeDisabled:n}=Ut(e),i=dt("Upload","-upload",s4,yf,e,t),c=Jo(e),l=de(()=>{const{max:X}=e;return X!==void 0?S.value.length>=X:!1}),u=te(e.defaultFileList),h=Ue(e,"fileList"),f=te(null),b={value:!1},y=te(!1),k=new Map,C=Vr(h,u),S=de(()=>C.value.map(Go));function L(){var X;(X=f.value)===null||X===void 0||X.click()}function P(X){const oe=X.target;B(oe.files?Array.from(oe.files).map(Z=>({file:Z,entry:null,source:"input"})):null,X),oe.value=""}function $(X){const{"onUpdate:fileList":oe,onUpdateFileList:Z}=e;oe&&Je(oe,X),Z&&Je(Z,X),u.value=X}const E=de(()=>e.multiple||e.directory);function B(X,oe){if(!X||X.length===0)return;const{onBeforeUpload:Z}=e;X=E.value?X:[X[0]];const{max:ee,accept:ne}=e;X=X.filter(({file:ae,source:me})=>me==="dnd"&&(ne!=null&&ne.trim())?qf(ae.name,ae.type,ne):!0),ee&&(X=X.slice(0,ee-S.value.length));const V=Qs();Promise.all(X.map(({file:ae,entry:me})=>Dc(this,void 0,void 0,function*(){var Ce;const Le={id:Qs(),batchId:V,name:ae.name,status:"pending",percentage:0,file:ae,url:null,type:ae.type,thumbnailUrl:null,fullPath:(Ce=me==null?void 0:me.fullPath)!==null&&Ce!==void 0?Ce:`/${ae.webkitRelativePath||ae.name}`};return!Z||(yield Z({file:Le,fileList:S.value}))!==!1?Le:null}))).then(ae=>Dc(this,void 0,void 0,function*(){let me=Promise.resolve();ae.forEach(Ce=>{me=me.then(An).then(()=>{Ce&&U(Ce,oe,{append:!0})})}),yield me})).then(()=>{e.defaultUpload&&M()})}function M(X){const{method:oe,action:Z,withCredentials:ee,headers:ne,data:V,name:ae}=e,me=X!==void 0?S.value.filter(Le=>Le.id===X):S.value,Ce=X!==void 0;me.forEach(Le=>{const{status:ht}=Le;(ht==="pending"||ht==="error"&&Ce)&&(e.customRequest?c4({inst:{doChange:U,xhrMap:k,onFinish:e.onFinish,onError:e.onError},file:Le,action:Z,withCredentials:ee,headers:ne,data:V,customRequest:e.customRequest}):f4({doChange:U,xhrMap:k,onFinish:e.onFinish,onError:e.onError,isErrorState:e.isErrorState},ae,Le,{method:oe,action:Z,withCredentials:ee,responseType:e.responseType,headers:ne,data:V}))})}const U=(X,oe,Z={append:!1,remove:!1})=>{const{append:ee,remove:ne}=Z,V=Array.from(S.value),ae=V.findIndex(me=>me.id===X.id);if(ee||ne||~ae){ee?V.push(X):ne?V.splice(ae,1):V.splice(ae,1,X);const{onChange:me}=e;me&&me({file:X,fileList:V,event:oe}),$(V)}};function q(X){var oe;if(X.thumbnailUrl)return X.thumbnailUrl;const{createThumbnailUrl:Z}=e;return Z?(oe=Z(X.file,X))!==null&&oe!==void 0?oe:X.url||"":X.url?X.url:X.file?Ff(X.file):""}const R=de(()=>{const{common:{cubicBezierEaseInOut:X},self:{draggerColor:oe,draggerBorder:Z,draggerBorderHover:ee,itemColorHover:ne,itemColorHoverError:V,itemTextColorError:ae,itemTextColorSuccess:me,itemTextColor:Ce,itemIconColor:Le,itemDisabledOpacity:ht,lineHeight:gt,borderRadius:De,fontSize:ve,itemBorderImageCardError:Ee,itemBorderImageCard:Se}}=i.value;return{"--n-bezier":X,"--n-border-radius":De,"--n-dragger-border":Z,"--n-dragger-border-hover":ee,"--n-dragger-color":oe,"--n-font-size":ve,"--n-item-color-hover":ne,"--n-item-color-hover-error":V,"--n-item-disabled-opacity":ht,"--n-item-icon-color":Le,"--n-item-text-color":Ce,"--n-item-text-color-error":ae,"--n-item-text-color-success":me,"--n-line-height":gt,"--n-item-border-image-card-error":Ee,"--n-item-border-image-card":Se}}),j=n?kr("upload",void 0,R,e):void 0;xr(yo,{mergedClsPrefixRef:t,mergedThemeRef:i,showCancelButtonRef:Ue(e,"showCancelButton"),showDownloadButtonRef:Ue(e,"showDownloadButton"),showRemoveButtonRef:Ue(e,"showRemoveButton"),showRetryButtonRef:Ue(e,"showRetryButton"),onRemoveRef:Ue(e,"onRemove"),onDownloadRef:Ue(e,"onDownload"),mergedFileListRef:S,triggerClassRef:Ue(e,"triggerClass"),triggerStyleRef:Ue(e,"triggerStyle"),shouldUseThumbnailUrlRef:Ue(e,"shouldUseThumbnailUrl"),renderIconRef:Ue(e,"renderIcon"),xhrMap:k,submit:M,doChange:U,showPreviewButtonRef:Ue(e,"showPreviewButton"),onPreviewRef:Ue(e,"onPreview"),getFileThumbnailUrlResolver:q,listTypeRef:Ue(e,"listType"),dragOverRef:y,openOpenFileDialog:L,draggerInsideRef:b,handleFileAddition:B,mergedDisabledRef:c.mergedDisabledRef,maxReachedRef:l,fileListClassRef:Ue(e,"fileListClass"),fileListStyleRef:Ue(e,"fileListStyle"),abstractRef:Ue(e,"abstract"),acceptRef:Ue(e,"accept"),cssVarsRef:n?void 0:R,themeClassRef:j==null?void 0:j.themeClass,onRender:j==null?void 0:j.onRender,showTriggerRef:Ue(e,"showTrigger"),imageGroupPropsRef:Ue(e,"imageGroupProps"),mergedDirectoryDndRef:de(()=>{var X;return(X=e.directoryDnd)!==null&&X!==void 0?X:e.directory})});const ie={clear:()=>{u.value=[]},submit:M,openOpenFileDialog:L};return Object.assign({mergedClsPrefix:t,draggerInsideRef:b,inputElRef:f,mergedTheme:i,dragOver:y,mergedMultiple:E,cssVars:n?void 0:R,themeClass:j==null?void 0:j.themeClass,onRender:j==null?void 0:j.onRender,handleFileInputChange:P},ie)},render(){var e,t;const{draggerInsideRef:n,mergedClsPrefix:i,$slots:c,directory:l,onRender:u}=this;if(c.default&&!this.abstract){const f=c.default()[0];!((e=f==null?void 0:f.type)===null||e===void 0)&&e[wd]&&(n.value=!0)}const h=D("input",Object.assign({},this.inputProps,{ref:"inputElRef",type:"file",class:`${i}-upload-file-input`,accept:this.accept,multiple:this.mergedMultiple,onChange:this.handleFileInputChange,webkitdirectory:l||void 0,directory:l||void 0}));return this.abstract?D(cr,null,(t=c.default)===null||t===void 0?void 0:t.call(c),D(bf,{to:"body"},h)):(u==null||u(),D("div",{class:[`${i}-upload`,n.value&&`${i}-upload--dragger-inside`,this.dragOver&&`${i}-upload--drag-over`,this.themeClass],style:this.cssVars},h,this.showTrigger&&this.listType!=="image-card"&&D(kd,null,c),this.showFileList&&D(i4,null,c)))}}),v4=["src"],cl=Re({__name:"index",props:{itemIcon:null,size:{default:70},forceBackground:null},setup(e){const t=e,n="#2a2a2a6b",i=te({width:`${t.size}px`,height:`${t.size}px`}),c=de(()=>{var l,u;return(u=(l=t.itemIcon)==null?void 0:l.src)==null?void 0:u.split(".").pop()});return(l,u)=>(pe(),Pe("div",{class:"item-icon",style:mt(i.value)},[fo(l.$slots,"default",{},()=>{var h,f,b,y,k,C,S,L,P;return[e.itemIcon?(pe(),Pe(cr,{key:0},[((h=e.itemIcon)==null?void 0:h.itemType)===1?(pe(),pt(_(qo),{key:0,size:t.size,style:mt({backgroundColor:(e.forceBackground??((f=e.itemIcon)==null?void 0:f.backgroundColor))||n})},{default:xe(()=>[sr(ot(e.itemIcon.text),1)]),_:1},8,["size","style"])):((b=e.itemIcon)==null?void 0:b.itemType)===2?(pe(),Pe(cr,{key:1},[_(c)==="svg"?(pe(),Pe("div",{key:0,style:mt({backgroundColor:(e.forceBackground??((y=e.itemIcon)==null?void 0:y.backgroundColor))||n,...i.value}),class:"flex justify-center items-center"},[fe("img",{src:(k=e.itemIcon)==null?void 0:k.src,class:"w-[35px] h-[35px]"},null,8,v4)],4)):(pe(),pt(_(Qu),{key:1,style:mt({backgroundColor:(e.forceBackground??((C=e.itemIcon)==null?void 0:C.backgroundColor))||n,...i.value}),src:(S=e.itemIcon)==null?void 0:S.src,"preview-disabled":""},null,8,["style","src"]))],64)):((L=e.itemIcon)==null?void 0:L.itemType)===3?(pe(),pt(_(qo),{key:2,size:t.size,style:mt({backgroundColor:(e.forceBackground??((P=e.itemIcon)==null?void 0:P.backgroundColor))||n})},{default:xe(()=>[K(_(g4),{style:{"font-size":"35px"},icon:e.itemIcon.text},null,8,["icon"])]),_:1},8,["size","style"])):Xe("",!0)],64)):(pe(),pt(_(qo),{key:1,size:t.size},null,8,["size"]))]})],4))}}),g4=Re({__name:"index",props:{icon:null},setup(e){const t=Xu(),n=de(()=>({class:t.class||"",style:t.style||""}));return(i,c)=>(pe(),pt(_(xf),Xn({icon:e.icon??""},_(n)),null,16,["icon"]))}}),b4=(e,t)=>{const n=e[t];return n?typeof n=="function"?n():Promise.resolve(n):new Promise((i,c)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(c.bind(null,new Error("Unknown variable dynamic import: "+t)))})},y4={class:"h-full"},x4={key:1},w4=Re({__name:"index",props:{componentName:null},setup(e){const t=e,n=hc(!1),i=hc("");function c(){n.value=!0,i.value=kf(()=>b4(Object.assign({"../../apps/About/index.vue":()=>Pn(()=>import("./index-b57a7b1c.js"),["assets/index-b57a7b1c.js","assets/about-2688cabc.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/index-b1d3d9b0.js","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/GradientText-44d798c5.js","assets/index-2b595d91.js","assets/Divider-a11d112a.js","assets/index-36cf7848.css"]),"../../apps/ImportExport/index.vue":()=>Pn(()=>import("./index-bb41db9d.js"),["assets/index-bb41db9d.js","assets/index-c238f14b.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-b1d3d9b0.js","assets/about-2688cabc.js","assets/Alert-018ca7af.js","assets/index-2b595d91.js","assets/Divider-a11d112a.js"]),"../../apps/ItemGroupManage/index.vue":()=>Pn(()=>import("./index-85275cb2.js"),["assets/index-85275cb2.js","assets/index-c238f14b.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-b1d3d9b0.js","assets/index-2b595d91.js"]),"../../apps/Style/index.vue":()=>Pn(()=>import("./index-93265a97.js"),["assets/index-93265a97.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-2b595d91.js","assets/index-b1d3d9b0.js","assets/index-8886367f.css"]),"../../apps/UploadFileManager/index.vue":()=>Pn(()=>import("./index-d074e84b.js").then(l=>l.i),["assets/index-d074e84b.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-b1d3d9b0.js","assets/Alert-018ca7af.js","assets/index-d715da4a.css"]),"../../apps/UserInfo/index.vue":()=>Pn(()=>import("./index-8a6943bf.js"),["assets/index-8a6943bf.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/index-2b595d91.js","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-8f0537f1.js","assets/index-b1d3d9b0.js","assets/Divider-a11d112a.js"]),"../../apps/Users/index.vue":()=>Pn(()=>import("./index-b1580adf.js"),["assets/index-b1580adf.js","assets/index-7e19b821.js","assets/index-f036cca6.css","assets/index-b1d3d9b0.js","assets/index-c238f14b.js","assets/_plugin-vue_export-helper-c27b6911.js","assets/index-2b595d91.js","assets/Alert-018ca7af.js"])}),`../../apps/${t.componentName}/index.vue`).finally(()=>{n.value=!1}).catch(()=>(i.value="",null)))}return tr(()=>t.componentName,()=>{c()}),dr(()=>{c()}),(l,u)=>(pe(),Pe("div",y4,[K(_(ed),{show:_(n),style:{height:"100%"},"content-style":"height: 100%;",delay:500,description:"loading..."},{default:xe(()=>[_(i)?(pe(),pt(wf(_(i)),{key:0})):_(i)?Xe("",!0):(pe(),Pe("div",x4," Component not found! "))]),_:1},8,["show"])]))}}),k4={class:"item-card w-full"},S4={key:1,class:"item-card-small"},C4=Re({__name:"index",props:{cardTypeStyle:null,class:null,backgroundColor:null,iconTextIconHideTitle:{type:Boolean},iconTextColor:null,iconText:null},setup(e){const t=e,n="#2a2a2a6b",i=te(t.class);return(c,l)=>(pe(),Pe("div",k4,[e.cardTypeStyle===_(xt).info?(pe(),Pe("div",{key:0,class:yr(["item-card-info w-full rounded-2xl transition-all duration-200 flex",i.value]),style:mt({backgroundColor:e.backgroundColor??n})},[fo(c.$slots,"info")],6)):Xe("",!0),e.cardTypeStyle===_(xt).icon?(pe(),Pe("div",S4,[fe("div",{class:yr(["item-card-small-icon overflow-hidden rounded-2xl sunpanel w-[70px] h-[70px] mx-auto transition-all duration-200",i.value]),style:mt({backgroundColor:e.backgroundColor??n})},[fo(c.$slots,"small")],6),e.iconTextIconHideTitle?Xe("",!0):(pe(),Pe("div",{key:0,class:"item-card-small-title text-center app-icon-text-shadow cursor-pointer mt-[2px]",style:mt({color:e.iconTextColor})},ot(e.iconText),5))])):Xe("",!0)]))}});function XQ(e){return rr({url:"/panel/itemIconGroup/edit",data:e})}function Cd(){return rr({url:"/panel/itemIconGroup/getList"})}function YQ(e){return rr({url:"/panel/itemIconGroup/deletes",data:{ids:e}})}function KQ(e){return rr({url:"/panel/itemIconGroup/saveSort",data:{sortItems:e}})}function ZQ(e){return rr({url:"/panel/itemIcon/addMultiple",data:e})}function A4(e){return rr({url:"/panel/itemIcon/edit",data:e})}function T4(e){return rr({url:"/panel/itemIcon/getListByGroupId",data:{itemIconGroupId:e}})}function _4(e){return rr({url:"/panel/itemIcon/deletes",data:{ids:e}})}function D4(e){return rr({url:"/panel/itemIcon/saveSort",data:e})}function z4(e){return rr({url:"/panel/itemIcon/getSiteFavicon",data:{url:e}})}var E4=Object.defineProperty,ti=Object.getOwnPropertySymbols,Ad=Object.prototype.hasOwnProperty,Td=Object.prototype.propertyIsEnumerable,zc=(e,t,n)=>t in e?E4(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,co=(e,t)=>{for(var n in t||(t={}))Ad.call(t,n)&&zc(e,n,t[n]);if(ti)for(var n of ti(t))Td.call(t,n)&&zc(e,n,t[n]);return e},_d=(e,t)=>{var n={};for(var i in e)Ad.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(e!=null&&ti)for(var i of ti(e))t.indexOf(i)<0&&Td.call(e,i)&&(n[i]=e[i]);return n};const Dd="[vue-draggable-plus]: ";function R4(e){console.warn(Dd+e)}function M4(e){console.error(Dd+e)}function Ec(e,t,n){return n>=0&&nn?n.toUpperCase():"")}function I4(e){return Object.keys(e).reduce((t,n)=>(typeof e[n]<"u"&&(t[B4(n)]=e[n]),t),{})}function P4(e,t){if(Array.isArray(e))return e.splice(t,1)}function N4(e,t,n){if(Array.isArray(e))return e.splice(t,0,n)}function q4(e){return typeof e>"u"}function F4(e){return typeof e=="string"}function Rc(e,t,n){const i=e.children[n];e.insertBefore(t,i)}function As(e){e.parentNode&&e.parentNode.removeChild(e)}function L4(e,t=document){var n;let i=null;return typeof(t==null?void 0:t.querySelector)=="function"?i=(n=t==null?void 0:t.querySelector)==null?void 0:n.call(t,e):i=document.querySelector(e),i||R4(`Element not found: ${e}`),i}function $4(e,t,n=null){return function(...i){return e.apply(n,i),t.apply(n,i)}}function O4(e,t){const n=co({},e);return Object.keys(t).forEach(i=>{n[i]?n[i]=$4(e[i],t[i]):n[i]=t[i]}),n}function U4(e){return e instanceof HTMLElement}function H4(e,t){Object.keys(e).forEach(n=>{t(n,e[n])})}/**! - * Sortable 1.15.0 - * @author RubaXa - * @author owenm - * @license MIT - */function Mc(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(c){return Object.getOwnPropertyDescriptor(e,c).enumerable})),n.push.apply(n,i)}return n}function jr(e){for(var t=1;t=0)&&(n[c]=e[c]);return n}function G4(e,t){if(e==null)return{};var n=j4(e,t),i,c;if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(c=0;c=0)&&Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var W4="1.15.0";function on(e){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(e)}var sn=on(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),ra=on(/Edge/i),Bc=on(/firefox/i),Fo=on(/safari/i)&&!on(/chrome/i)&&!on(/android/i),zd=on(/iP(ad|od|hone)/i),Ed=on(/chrome/i)&&on(/android/i),Rd={capture:!1,passive:!1};function at(e,t,n){e.addEventListener(t,n,!sn&&Rd)}function tt(e,t,n){e.removeEventListener(t,n,!sn&&Rd)}function ri(e,t){if(t){if(t[0]===">"&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function X4(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function Lr(e,t,n,i){if(e){n=n||document;do{if(t!=null&&(t[0]===">"?e.parentNode===n&&ri(e,t):ri(e,t))||i&&e===n)return e;if(e===n)break}while(e=X4(e))}return null}var Ic=/\s+/g;function ar(e,t,n){if(e&&t)if(e.classList)e.classList[n?"add":"remove"](t);else{var i=(" "+e.className+" ").replace(Ic," ").replace(" "+t+" "," ");e.className=(i+(n?" "+t:"")).replace(Ic," ")}}function $e(e,t,n){var i=e&&e.style;if(i){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(n=e.currentStyle),t===void 0?n:n[t];!(t in i)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),i[t]=n+(typeof n=="string"?"":"px")}}function po(e,t){var n="";if(typeof e=="string")n=e;else do{var i=$e(e,"transform");i&&i!=="none"&&(n=i+" "+n)}while(!t&&(e=e.parentNode));var c=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return c&&new c(n)}function Md(e,t,n){if(e){var i=e.getElementsByTagName(t),c=0,l=i.length;if(n)for(;c=l:u=c<=l,!u)return i;if(i===Hr())break;i=Cn(i,!1)}return!1}function vo(e,t,n,i){for(var c=0,l=0,u=e.children;l2&&arguments[2]!==void 0?arguments[2]:{},i=n.evt,c=G4(n,rv);na.pluginEvent.bind(Oe)(e,t,jr({dragEl:ke,parentEl:zt,ghostEl:Ve,rootEl:St,nextEl:On,lastDownEl:Ya,cloneEl:_t,cloneHidden:wn,dragStarted:Bo,putSortable:Ot,activeSortable:Oe.active,originalEvent:i,oldIndex:uo,oldDraggableIndex:$o,newIndex:ir,newDraggableIndex:bn,hideGhostForTarget:Ld,unhideGhostForTarget:$d,cloneNowHidden:function(){wn=!0},cloneNowShown:function(){wn=!1},dispatchSortableEvent:function(l){Wt({sortable:t,name:l,originalEvent:i})}},c))};function Wt(e){tv(jr({putSortable:Ot,cloneEl:_t,targetEl:ke,rootEl:St,oldIndex:uo,oldDraggableIndex:$o,newIndex:ir,newDraggableIndex:bn},e))}var ke,zt,Ve,St,On,Ya,_t,wn,uo,ir,$o,bn,Fa,Ot,lo=!1,ni=!1,oi=[],Fn,_r,Ds,zs,qc,Fc,Bo,io,Oo,Uo=!1,La=!1,Ka,Ht,Es=[],ul=!1,ai=[],gi=typeof document<"u",$a=zd,Lc=ra||sn?"cssFloat":"float",nv=gi&&!Ed&&!zd&&"draggable"in document.createElement("div"),Nd=function(){if(gi){if(sn)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto",e.style.pointerEvents==="auto"}}(),qd=function(e,t){var n=$e(e),i=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),c=vo(e,0,t),l=vo(e,1,t),u=c&&$e(c),h=l&&$e(l),f=u&&parseInt(u.marginLeft)+parseInt(u.marginRight)+Lt(c).width,b=h&&parseInt(h.marginLeft)+parseInt(h.marginRight)+Lt(l).width;if(n.display==="flex")return n.flexDirection==="column"||n.flexDirection==="column-reverse"?"vertical":"horizontal";if(n.display==="grid")return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(c&&u.float&&u.float!=="none"){var y=u.float==="left"?"left":"right";return l&&(h.clear==="both"||h.clear===y)?"vertical":"horizontal"}return c&&(u.display==="block"||u.display==="flex"||u.display==="table"||u.display==="grid"||f>=i&&n[Lc]==="none"||l&&n[Lc]==="none"&&f+b>i)?"vertical":"horizontal"},ov=function(e,t,n){var i=n?e.left:e.top,c=n?e.right:e.bottom,l=n?e.width:e.height,u=n?t.left:t.top,h=n?t.right:t.bottom,f=n?t.width:t.height;return i===u||c===h||i+l/2===u+f/2},av=function(e,t){var n;return oi.some(function(i){var c=i[lr].options.emptyInsertThreshold;if(!(!c||_l(i))){var l=Lt(i),u=e>=l.left-c&&e<=l.right+c,h=t>=l.top-c&&t<=l.bottom+c;if(u&&h)return n=i}}),n},Fd=function(e){function t(c,l){return function(u,h,f,b){var y=u.options.group.name&&h.options.group.name&&u.options.group.name===h.options.group.name;if(c==null&&(l||y))return!0;if(c==null||c===!1)return!1;if(l&&c==="clone")return c;if(typeof c=="function")return t(c(u,h,f,b),l)(u,h,f,b);var k=(l?u:h).options.group.name;return c===!0||typeof c=="string"&&c===k||c.join&&c.indexOf(k)>-1}}var n={},i=e.group;(!i||Xa(i)!="object")&&(i={name:i}),n.name=i.name,n.checkPull=t(i.pull,!0),n.checkPut=t(i.put),n.revertClone=i.revertClone,e.group=n},Ld=function(){!Nd&&Ve&&$e(Ve,"display","none")},$d=function(){!Nd&&Ve&&$e(Ve,"display","")};gi&&!Ed&&document.addEventListener("click",function(e){if(ni)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),ni=!1,!1},!0);var Ln=function(e){if(ke){e=e.touches?e.touches[0]:e;var t=av(e.clientX,e.clientY);if(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[lr]._onDragOver(n)}}},iv=function(e){ke&&ke.parentNode[lr]._isOutsideThisEl(e.target)};function Oe(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=an({},t),e[lr]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return qd(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(l,u){l.setData("Text",u.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Oe.supportPointer!==!1&&"PointerEvent"in window&&!Fo,emptyInsertThreshold:5};na.initializePlugins(this,e,n);for(var i in n)!(i in t)&&(t[i]=n[i]);Fd(t);for(var c in this)c.charAt(0)==="_"&&typeof this[c]=="function"&&(this[c]=this[c].bind(this));this.nativeDraggable=t.forceFallback?!1:nv,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?at(e,"pointerdown",this._onTapStart):(at(e,"mousedown",this._onTapStart),at(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(at(e,"dragover",this),at(e,"dragenter",this)),oi.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),an(this,J4())}Oe.prototype={constructor:Oe,_isOutsideThisEl:function(e){!this.el.contains(e)&&e!==this.el&&(io=null)},_getDirection:function(e,t){return typeof this.options.direction=="function"?this.options.direction.call(this,e,t,ke):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,i=this.options,c=i.preventOnFilter,l=e.type,u=e.touches&&e.touches[0]||e.pointerType&&e.pointerType==="touch"&&e,h=(u||e).target,f=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||h,b=i.filter;if(pv(n),!ke&&!(/mousedown|pointerdown/.test(l)&&e.button!==0||i.disabled)&&!f.isContentEditable&&!(!this.nativeDraggable&&Fo&&h&&h.tagName.toUpperCase()==="SELECT")&&(h=Lr(h,i.draggable,n,!1),!(h&&h.animated)&&Ya!==h)){if(uo=gr(h),$o=gr(h,i.draggable),typeof b=="function"){if(b.call(this,e,h,this)){Wt({sortable:t,rootEl:f,name:"filter",targetEl:h,toEl:n,fromEl:n}),Qt("filter",t,{evt:e}),c&&e.cancelable&&e.preventDefault();return}}else if(b&&(b=b.split(",").some(function(y){if(y=Lr(f,y.trim(),n,!1),y)return Wt({sortable:t,rootEl:y,name:"filter",targetEl:h,fromEl:n,toEl:n}),Qt("filter",t,{evt:e}),!0}),b)){c&&e.cancelable&&e.preventDefault();return}i.handle&&!Lr(f,i.handle,n,!1)||this._prepareDragStart(e,u,h)}}},_prepareDragStart:function(e,t,n){var i=this,c=i.el,l=i.options,u=c.ownerDocument,h;if(n&&!ke&&n.parentNode===c){var f=Lt(n);if(St=c,ke=n,zt=ke.parentNode,On=ke.nextSibling,Ya=n,Fa=l.group,Oe.dragged=ke,Fn={target:ke,clientX:(t||e).clientX,clientY:(t||e).clientY},qc=Fn.clientX-f.left,Fc=Fn.clientY-f.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,ke.style["will-change"]="all",h=function(){if(Qt("delayEnded",i,{evt:e}),Oe.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!Bc&&i.nativeDraggable&&(ke.draggable=!0),i._triggerDragStart(e,t),Wt({sortable:i,name:"choose",originalEvent:e}),ar(ke,l.chosenClass,!0)},l.ignore.split(",").forEach(function(b){Md(ke,b.trim(),Rs)}),at(u,"dragover",Ln),at(u,"mousemove",Ln),at(u,"touchmove",Ln),at(u,"mouseup",i._onDrop),at(u,"touchend",i._onDrop),at(u,"touchcancel",i._onDrop),Bc&&this.nativeDraggable&&(this.options.touchStartThreshold=4,ke.draggable=!0),Qt("delayStart",this,{evt:e}),l.delay&&(!l.delayOnTouchOnly||t)&&(!this.nativeDraggable||!(ra||sn))){if(Oe.eventCanceled){this._onDrop();return}at(u,"mouseup",i._disableDelayedDrag),at(u,"touchend",i._disableDelayedDrag),at(u,"touchcancel",i._disableDelayedDrag),at(u,"mousemove",i._delayedDragTouchMoveHandler),at(u,"touchmove",i._delayedDragTouchMoveHandler),l.supportPointer&&at(u,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(h,l.delay)}else h()}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){ke&&Rs(ke),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;tt(e,"mouseup",this._disableDelayedDrag),tt(e,"touchend",this._disableDelayedDrag),tt(e,"touchcancel",this._disableDelayedDrag),tt(e,"mousemove",this._delayedDragTouchMoveHandler),tt(e,"touchmove",this._delayedDragTouchMoveHandler),tt(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||e.pointerType=="touch"&&e,!this.nativeDraggable||t?this.options.supportPointer?at(document,"pointermove",this._onTouchMove):t?at(document,"touchmove",this._onTouchMove):at(document,"mousemove",this._onTouchMove):(at(ke,"dragend",this),at(St,"dragstart",this._onDragStart));try{document.selection?Za(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(e,t){if(lo=!1,St&&ke){Qt("dragStarted",this,{evt:t}),this.nativeDraggable&&at(document,"dragover",iv);var n=this.options;!e&&ar(ke,n.dragClass,!1),ar(ke,n.ghostClass,!0),Oe.active=this,e&&this._appendGhost(),Wt({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(_r){this._lastX=_r.clientX,this._lastY=_r.clientY,Ld();for(var e=document.elementFromPoint(_r.clientX,_r.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(_r.clientX,_r.clientY),e!==t);)t=e;if(ke.parentNode[lr]._isOutsideThisEl(e),t)do{if(t[lr]){var n=void 0;if(n=t[lr]._onDragOver({clientX:_r.clientX,clientY:_r.clientY,target:e,rootEl:t}),n&&!this.options.dragoverBubble)break}e=t}while(t=t.parentNode);$d()}},_onTouchMove:function(e){if(Fn){var t=this.options,n=t.fallbackTolerance,i=t.fallbackOffset,c=e.touches?e.touches[0]:e,l=Ve&&po(Ve,!0),u=Ve&&l&&l.a,h=Ve&&l&&l.d,f=$a&&Ht&&Nc(Ht),b=(c.clientX-Fn.clientX+i.x)/(u||1)+(f?f[0]-Es[0]:0)/(u||1),y=(c.clientY-Fn.clientY+i.y)/(h||1)+(f?f[1]-Es[1]:0)/(h||1);if(!Oe.active&&!lo){if(n&&Math.max(Math.abs(c.clientX-this._lastX),Math.abs(c.clientY-this._lastY))=0&&(Wt({rootEl:zt,name:"add",toEl:zt,fromEl:St,originalEvent:e}),Wt({sortable:this,name:"remove",toEl:zt,originalEvent:e}),Wt({rootEl:zt,name:"sort",toEl:zt,fromEl:St,originalEvent:e}),Wt({sortable:this,name:"sort",toEl:zt,originalEvent:e})),Ot&&Ot.save()):ir!==uo&&ir>=0&&(Wt({sortable:this,name:"update",toEl:zt,originalEvent:e}),Wt({sortable:this,name:"sort",toEl:zt,originalEvent:e})),Oe.active&&((ir==null||ir===-1)&&(ir=uo,bn=$o),Wt({sortable:this,name:"end",toEl:zt,originalEvent:e}),this.save()))),this._nulling()},_nulling:function(){Qt("nulling",this),St=ke=zt=Ve=On=_t=Ya=wn=Fn=_r=Bo=ir=bn=uo=$o=io=Oo=Ot=Fa=Oe.dragged=Oe.ghost=Oe.clone=Oe.active=null,ai.forEach(function(e){e.checked=!0}),ai.length=Ds=zs=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":ke&&(this._onDragOver(e),sv(e));break;case"selectstart":e.preventDefault();break}},toArray:function(){for(var e=[],t,n=this.el.children,i=0,c=n.length,l=this.options;ii.right+c||e.clientX<=i.right&&e.clientY>i.bottom&&e.clientX>=i.left:e.clientX>i.right&&e.clientY>i.top||e.clientX<=i.right&&e.clientY>i.bottom+c}function dv(e,t,n,i,c,l,u,h){var f=i?e.clientY:e.clientX,b=i?n.height:n.width,y=i?n.top:n.left,k=i?n.bottom:n.right,C=!1;if(!u){if(h&&Kay+b*l/2:fk-Ka)return-Oo}else if(f>y+b*(1-c)/2&&fk-b*l/2)?f>y+b/2?1:-1:0}function hv(e){return gr(ke){R=$(R),h&&M.destroy(),h=new Oe(R,E())};tr(()=>u,()=>{h&&H4(E(),(R,j)=>{h==null||h.option(R,j)})},{deep:!0});const M={option:(R,j)=>h==null?void 0:h.option(R,j),destroy:()=>{h==null||h.destroy(),h=null},save:()=>h==null?void 0:h.save(),toArray:()=>h==null?void 0:h.toArray(),closest:(...R)=>h==null?void 0:h.closest(...R)},U=()=>M==null?void 0:M.option("disabled",!0),q=()=>M==null?void 0:M.option("disabled",!1);return bv(()=>{f&&B()}),gv(M.destroy),co({start:B,pause:U,resume:q},M)}const pl=["update","start","add","remove","choose","unchoose","end","sort","filter","clone","move","change"],xv=["animation","ghostClass","group","sort","disabled","store","handle","draggable","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","chosenClass","dragClass","ignore","filter","preventOnFilter","easing","setData","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","emptyInsertThreshold","scroll","forceAutoScrollFallback","scrollSensitivity","scrollSpeed","bubbleScroll","modelValue","tag","target",...pl.map(e=>`on${e.replace(/^\S/,t=>t.toUpperCase())}`)],si=Re({name:"VueDraggable",model:{prop:"modelValue",event:"update:modelValue"},props:xv,emits:["update:modelValue",...pl],setup(e,{slots:t,emit:n,expose:i}){const c=Xu(),l=pl.reduce((y,k)=>{const C=`on${k.replace(/^\S/,S=>S.toUpperCase())}`;return y[C]=S=>n(k,S),y},{}),u=de(()=>{const y=Sf(e),k=_d(y,["modelValue"]),C=Object.entries(k).reduce((S,[L,P])=>{const $=_(P);return $!==void 0&&(S[L]=$),S},{});return co(co({},l),I4(co(co({},c),C)))}),h=de({get:()=>e.modelValue,set:y=>n("update:modelValue",y)}),f=te(),b=Mu(yv(e.target||f,h,u));return i(b),()=>{if(t.default)return D(e.tag||"div",{ref:f},t.default(b))}}});var Uc={},wv={get exports(){return Uc},set exports(e){Uc=e}},it={},li={},kv={get exports(){return li},set exports(e){li=e}};const Sv="Á",Cv="á",Av="Ă",Tv="ă",_v="∾",Dv="∿",zv="∾̳",Ev="Â",Rv="â",Mv="´",Bv="А",Iv="а",Pv="Æ",Nv="æ",qv="⁡",Fv="𝔄",Lv="𝔞",$v="À",Ov="à",Uv="ℵ",Hv="ℵ",Vv="Α",jv="α",Gv="Ā",Wv="ā",Xv="⨿",Yv="&",Kv="&",Zv="⩕",Jv="⩓",Qv="∧",eg="⩜",tg="⩘",rg="⩚",ng="∠",og="⦤",ag="∠",ig="⦨",sg="⦩",lg="⦪",cg="⦫",ug="⦬",dg="⦭",hg="⦮",fg="⦯",pg="∡",mg="∟",vg="⊾",gg="⦝",bg="∢",yg="Å",xg="⍼",wg="Ą",kg="ą",Sg="𝔸",Cg="𝕒",Ag="⩯",Tg="≈",_g="⩰",Dg="≊",zg="≋",Eg="'",Rg="⁡",Mg="≈",Bg="≊",Ig="Å",Pg="å",Ng="𝒜",qg="𝒶",Fg="≔",Lg="*",$g="≈",Og="≍",Ug="Ã",Hg="ã",Vg="Ä",jg="ä",Gg="∳",Wg="⨑",Xg="≌",Yg="϶",Kg="‵",Zg="∽",Jg="⋍",Qg="∖",e2="⫧",t2="⊽",r2="⌅",n2="⌆",o2="⌅",a2="⎵",i2="⎶",s2="≌",l2="Б",c2="б",u2="„",d2="∵",h2="∵",f2="∵",p2="⦰",m2="϶",v2="ℬ",g2="ℬ",b2="Β",y2="β",x2="ℶ",w2="≬",k2="𝔅",S2="𝔟",C2="⋂",A2="◯",T2="⋃",_2="⨀",D2="⨁",z2="⨂",E2="⨆",R2="★",M2="▽",B2="△",I2="⨄",P2="⋁",N2="⋀",q2="⤍",F2="⧫",L2="▪",$2="▴",O2="▾",U2="◂",H2="▸",V2="␣",j2="▒",G2="░",W2="▓",X2="█",Y2="=⃥",K2="≡⃥",Z2="⫭",J2="⌐",Q2="𝔹",e5="𝕓",t5="⊥",r5="⊥",n5="⋈",o5="⧉",a5="┐",i5="╕",s5="╖",l5="╗",c5="┌",u5="╒",d5="╓",h5="╔",f5="─",p5="═",m5="┬",v5="╤",g5="╥",b5="╦",y5="┴",x5="╧",w5="╨",k5="╩",S5="⊟",C5="⊞",A5="⊠",T5="┘",_5="╛",D5="╜",z5="╝",E5="└",R5="╘",M5="╙",B5="╚",I5="│",P5="║",N5="┼",q5="╪",F5="╫",L5="╬",$5="┤",O5="╡",U5="╢",H5="╣",V5="├",j5="╞",G5="╟",W5="╠",X5="‵",Y5="˘",K5="˘",Z5="¦",J5="𝒷",Q5="ℬ",e3="⁏",t3="∽",r3="⋍",n3="⧅",o3="\\",a3="⟈",i3="•",s3="•",l3="≎",c3="⪮",u3="≏",d3="≎",h3="≏",f3="Ć",p3="ć",m3="⩄",v3="⩉",g3="⩋",b3="∩",y3="⋒",x3="⩇",w3="⩀",k3="ⅅ",S3="∩︀",C3="⁁",A3="ˇ",T3="ℭ",_3="⩍",D3="Č",z3="č",E3="Ç",R3="ç",M3="Ĉ",B3="ĉ",I3="∰",P3="⩌",N3="⩐",q3="Ċ",F3="ċ",L3="¸",$3="¸",O3="⦲",U3="¢",H3="·",V3="·",j3="𝔠",G3="ℭ",W3="Ч",X3="ч",Y3="✓",K3="✓",Z3="Χ",J3="χ",Q3="ˆ",e6="≗",t6="↺",r6="↻",n6="⊛",o6="⊚",a6="⊝",i6="⊙",s6="®",l6="Ⓢ",c6="⊖",u6="⊕",d6="⊗",h6="○",f6="⧃",p6="≗",m6="⨐",v6="⫯",g6="⧂",b6="∲",y6="”",x6="’",w6="♣",k6="♣",S6=":",C6="∷",A6="⩴",T6="≔",_6="≔",D6=",",z6="@",E6="∁",R6="∘",M6="∁",B6="ℂ",I6="≅",P6="⩭",N6="≡",q6="∮",F6="∯",L6="∮",$6="𝕔",O6="ℂ",U6="∐",H6="∐",V6="©",j6="©",G6="℗",W6="∳",X6="↵",Y6="✗",K6="⨯",Z6="𝒞",J6="𝒸",Q6="⫏",eb="⫑",tb="⫐",rb="⫒",nb="⋯",ob="⤸",ab="⤵",ib="⋞",sb="⋟",lb="↶",cb="⤽",ub="⩈",db="⩆",hb="≍",fb="∪",pb="⋓",mb="⩊",vb="⊍",gb="⩅",bb="∪︀",yb="↷",xb="⤼",wb="⋞",kb="⋟",Sb="⋎",Cb="⋏",Ab="¤",Tb="↶",_b="↷",Db="⋎",zb="⋏",Eb="∲",Rb="∱",Mb="⌭",Bb="†",Ib="‡",Pb="ℸ",Nb="↓",qb="↡",Fb="⇓",Lb="‐",$b="⫤",Ob="⊣",Ub="⤏",Hb="˝",Vb="Ď",jb="ď",Gb="Д",Wb="д",Xb="‡",Yb="⇊",Kb="ⅅ",Zb="ⅆ",Jb="⤑",Qb="⩷",e7="°",t7="∇",r7="Δ",n7="δ",o7="⦱",a7="⥿",i7="𝔇",s7="𝔡",l7="⥥",c7="⇃",u7="⇂",d7="´",h7="˙",f7="˝",p7="`",m7="˜",v7="⋄",g7="⋄",b7="⋄",y7="♦",x7="♦",w7="¨",k7="ⅆ",S7="ϝ",C7="⋲",A7="÷",T7="÷",_7="⋇",D7="⋇",z7="Ђ",E7="ђ",R7="⌞",M7="⌍",B7="$",I7="𝔻",P7="𝕕",N7="¨",q7="˙",F7="⃜",L7="≐",$7="≑",O7="≐",U7="∸",H7="∔",V7="⊡",j7="⌆",G7="∯",W7="¨",X7="⇓",Y7="⇐",K7="⇔",Z7="⫤",J7="⟸",Q7="⟺",e8="⟹",t8="⇒",r8="⊨",n8="⇑",o8="⇕",a8="∥",i8="⤓",s8="↓",l8="↓",c8="⇓",u8="⇵",d8="̑",h8="⇊",f8="⇃",p8="⇂",m8="⥐",v8="⥞",g8="⥖",b8="↽",y8="⥟",x8="⥗",w8="⇁",k8="↧",S8="⊤",C8="⤐",A8="⌟",T8="⌌",_8="𝒟",D8="𝒹",z8="Ѕ",E8="ѕ",R8="⧶",M8="Đ",B8="đ",I8="⋱",P8="▿",N8="▾",q8="⇵",F8="⥯",L8="⦦",$8="Џ",O8="џ",U8="⟿",H8="É",V8="é",j8="⩮",G8="Ě",W8="ě",X8="Ê",Y8="ê",K8="≖",Z8="≕",J8="Э",Q8="э",e9="⩷",t9="Ė",r9="ė",n9="≑",o9="ⅇ",a9="≒",i9="𝔈",s9="𝔢",l9="⪚",c9="È",u9="è",d9="⪖",h9="⪘",f9="⪙",p9="∈",m9="⏧",v9="ℓ",g9="⪕",b9="⪗",y9="Ē",x9="ē",w9="∅",k9="∅",S9="◻",C9="∅",A9="▫",T9=" ",_9=" ",D9=" ",z9="Ŋ",E9="ŋ",R9=" ",M9="Ę",B9="ę",I9="𝔼",P9="𝕖",N9="⋕",q9="⧣",F9="⩱",L9="ε",$9="Ε",O9="ε",U9="ϵ",H9="≖",V9="≕",j9="≂",G9="⪖",W9="⪕",X9="⩵",Y9="=",K9="≂",Z9="≟",J9="⇌",Q9="≡",ey="⩸",ty="⧥",ry="⥱",ny="≓",oy="ℯ",ay="ℰ",iy="≐",sy="⩳",ly="≂",cy="Η",uy="η",dy="Ð",hy="ð",fy="Ë",py="ë",my="€",vy="!",gy="∃",by="∃",yy="ℰ",xy="ⅇ",wy="ⅇ",ky="≒",Sy="Ф",Cy="ф",Ay="♀",Ty="ffi",_y="ff",Dy="ffl",zy="𝔉",Ey="𝔣",Ry="fi",My="◼",By="▪",Iy="fj",Py="♭",Ny="fl",qy="▱",Fy="ƒ",Ly="𝔽",$y="𝕗",Oy="∀",Uy="∀",Hy="⋔",Vy="⫙",jy="ℱ",Gy="⨍",Wy="½",Xy="⅓",Yy="¼",Ky="⅕",Zy="⅙",Jy="⅛",Qy="⅔",ex="⅖",tx="¾",rx="⅗",nx="⅜",ox="⅘",ax="⅚",ix="⅝",sx="⅞",lx="⁄",cx="⌢",ux="𝒻",dx="ℱ",hx="ǵ",fx="Γ",px="γ",mx="Ϝ",vx="ϝ",gx="⪆",bx="Ğ",yx="ğ",xx="Ģ",wx="Ĝ",kx="ĝ",Sx="Г",Cx="г",Ax="Ġ",Tx="ġ",_x="≥",Dx="≧",zx="⪌",Ex="⋛",Rx="≥",Mx="≧",Bx="⩾",Ix="⪩",Px="⩾",Nx="⪀",qx="⪂",Fx="⪄",Lx="⋛︀",$x="⪔",Ox="𝔊",Ux="𝔤",Hx="≫",Vx="⋙",jx="⋙",Gx="ℷ",Wx="Ѓ",Xx="ѓ",Yx="⪥",Kx="≷",Zx="⪒",Jx="⪤",Qx="⪊",ew="⪊",tw="⪈",rw="≩",nw="⪈",ow="≩",aw="⋧",iw="𝔾",sw="𝕘",lw="`",cw="≥",uw="⋛",dw="≧",hw="⪢",fw="≷",pw="⩾",mw="≳",vw="𝒢",gw="ℊ",bw="≳",yw="⪎",xw="⪐",ww="⪧",kw="⩺",Sw=">",Cw=">",Aw="≫",Tw="⋗",_w="⦕",Dw="⩼",zw="⪆",Ew="⥸",Rw="⋗",Mw="⋛",Bw="⪌",Iw="≷",Pw="≳",Nw="≩︀",qw="≩︀",Fw="ˇ",Lw=" ",$w="½",Ow="ℋ",Uw="Ъ",Hw="ъ",Vw="⥈",jw="↔",Gw="⇔",Ww="↭",Xw="^",Yw="ℏ",Kw="Ĥ",Zw="ĥ",Jw="♥",Qw="♥",ek="…",tk="⊹",rk="𝔥",nk="ℌ",ok="ℋ",ak="⤥",ik="⤦",sk="⇿",lk="∻",ck="↩",uk="↪",dk="𝕙",hk="ℍ",fk="―",pk="─",mk="𝒽",vk="ℋ",gk="ℏ",bk="Ħ",yk="ħ",xk="≎",wk="≏",kk="⁃",Sk="‐",Ck="Í",Ak="í",Tk="⁣",_k="Î",Dk="î",zk="И",Ek="и",Rk="İ",Mk="Е",Bk="е",Ik="¡",Pk="⇔",Nk="𝔦",qk="ℑ",Fk="Ì",Lk="ì",$k="ⅈ",Ok="⨌",Uk="∭",Hk="⧜",Vk="℩",jk="IJ",Gk="ij",Wk="Ī",Xk="ī",Yk="ℑ",Kk="ⅈ",Zk="ℐ",Jk="ℑ",Qk="ı",eS="ℑ",tS="⊷",rS="Ƶ",nS="⇒",oS="℅",aS="∞",iS="⧝",sS="ı",lS="⊺",cS="∫",uS="∬",dS="ℤ",hS="∫",fS="⊺",pS="⋂",mS="⨗",vS="⨼",gS="⁣",bS="⁢",yS="Ё",xS="ё",wS="Į",kS="į",SS="𝕀",CS="𝕚",AS="Ι",TS="ι",_S="⨼",DS="¿",zS="𝒾",ES="ℐ",RS="∈",MS="⋵",BS="⋹",IS="⋴",PS="⋳",NS="∈",qS="⁢",FS="Ĩ",LS="ĩ",$S="І",OS="і",US="Ï",HS="ï",VS="Ĵ",jS="ĵ",GS="Й",WS="й",XS="𝔍",YS="𝔧",KS="ȷ",ZS="𝕁",JS="𝕛",QS="𝒥",eC="𝒿",tC="Ј",rC="ј",nC="Є",oC="є",aC="Κ",iC="κ",sC="ϰ",lC="Ķ",cC="ķ",uC="К",dC="к",hC="𝔎",fC="𝔨",pC="ĸ",mC="Х",vC="х",gC="Ќ",bC="ќ",yC="𝕂",xC="𝕜",wC="𝒦",kC="𝓀",SC="⇚",CC="Ĺ",AC="ĺ",TC="⦴",_C="ℒ",DC="Λ",zC="λ",EC="⟨",RC="⟪",MC="⦑",BC="⟨",IC="⪅",PC="ℒ",NC="«",qC="⇤",FC="⤟",LC="←",$C="↞",OC="⇐",UC="⤝",HC="↩",VC="↫",jC="⤹",GC="⥳",WC="↢",XC="⤙",YC="⤛",KC="⪫",ZC="⪭",JC="⪭︀",QC="⤌",eA="⤎",tA="❲",rA="{",nA="[",oA="⦋",aA="⦏",iA="⦍",sA="Ľ",lA="ľ",cA="Ļ",uA="ļ",dA="⌈",hA="{",fA="Л",pA="л",mA="⤶",vA="“",gA="„",bA="⥧",yA="⥋",xA="↲",wA="≤",kA="≦",SA="⟨",CA="⇤",AA="←",TA="←",_A="⇐",DA="⇆",zA="↢",EA="⌈",RA="⟦",MA="⥡",BA="⥙",IA="⇃",PA="⌊",NA="↽",qA="↼",FA="⇇",LA="↔",$A="↔",OA="⇔",UA="⇆",HA="⇋",VA="↭",jA="⥎",GA="↤",WA="⊣",XA="⥚",YA="⋋",KA="⧏",ZA="⊲",JA="⊴",QA="⥑",eT="⥠",tT="⥘",rT="↿",nT="⥒",oT="↼",aT="⪋",iT="⋚",sT="≤",lT="≦",cT="⩽",uT="⪨",dT="⩽",hT="⩿",fT="⪁",pT="⪃",mT="⋚︀",vT="⪓",gT="⪅",bT="⋖",yT="⋚",xT="⪋",wT="⋚",kT="≦",ST="≶",CT="≶",AT="⪡",TT="≲",_T="⩽",DT="≲",zT="⥼",ET="⌊",RT="𝔏",MT="𝔩",BT="≶",IT="⪑",PT="⥢",NT="↽",qT="↼",FT="⥪",LT="▄",$T="Љ",OT="љ",UT="⇇",HT="≪",VT="⋘",jT="⌞",GT="⇚",WT="⥫",XT="◺",YT="Ŀ",KT="ŀ",ZT="⎰",JT="⎰",QT="⪉",e_="⪉",t_="⪇",r_="≨",n_="⪇",o_="≨",a_="⋦",i_="⟬",s_="⇽",l_="⟦",c_="⟵",u_="⟵",d_="⟸",h_="⟷",f_="⟷",p_="⟺",m_="⟼",v_="⟶",g_="⟶",b_="⟹",y_="↫",x_="↬",w_="⦅",k_="𝕃",S_="𝕝",C_="⨭",A_="⨴",T_="∗",__="_",D_="↙",z_="↘",E_="◊",R_="◊",M_="⧫",B_="(",I_="⦓",P_="⇆",N_="⌟",q_="⇋",F_="⥭",L_="‎",$_="⊿",O_="‹",U_="𝓁",H_="ℒ",V_="↰",j_="↰",G_="≲",W_="⪍",X_="⪏",Y_="[",K_="‘",Z_="‚",J_="Ł",Q_="ł",eD="⪦",tD="⩹",rD="<",nD="<",oD="≪",aD="⋖",iD="⋋",sD="⋉",lD="⥶",cD="⩻",uD="◃",dD="⊴",hD="◂",fD="⦖",pD="⥊",mD="⥦",vD="≨︀",gD="≨︀",bD="¯",yD="♂",xD="✠",wD="✠",kD="↦",SD="↦",CD="↧",AD="↤",TD="↥",_D="▮",DD="⨩",zD="М",ED="м",RD="—",MD="∺",BD="∡",ID=" ",PD="ℳ",ND="𝔐",qD="𝔪",FD="℧",LD="µ",$D="*",OD="⫰",UD="∣",HD="·",VD="⊟",jD="−",GD="∸",WD="⨪",XD="∓",YD="⫛",KD="…",ZD="∓",JD="⊧",QD="𝕄",ez="𝕞",tz="∓",rz="𝓂",nz="ℳ",oz="∾",az="Μ",iz="μ",sz="⊸",lz="⊸",cz="∇",uz="Ń",dz="ń",hz="∠⃒",fz="≉",pz="⩰̸",mz="≋̸",vz="ʼn",gz="≉",bz="♮",yz="ℕ",xz="♮",wz=" ",kz="≎̸",Sz="≏̸",Cz="⩃",Az="Ň",Tz="ň",_z="Ņ",Dz="ņ",zz="≇",Ez="⩭̸",Rz="⩂",Mz="Н",Bz="н",Iz="–",Pz="⤤",Nz="↗",qz="⇗",Fz="↗",Lz="≠",$z="≐̸",Oz="​",Uz="​",Hz="​",Vz="​",jz="≢",Gz="⤨",Wz="≂̸",Xz="≫",Yz="≪",Kz=` -`,Zz="∄",Jz="∄",Qz="𝔑",eE="𝔫",tE="≧̸",rE="≱",nE="≱",oE="≧̸",aE="⩾̸",iE="⩾̸",sE="⋙̸",lE="≵",cE="≫⃒",uE="≯",dE="≯",hE="≫̸",fE="↮",pE="⇎",mE="⫲",vE="∋",gE="⋼",bE="⋺",yE="∋",xE="Њ",wE="њ",kE="↚",SE="⇍",CE="‥",AE="≦̸",TE="≰",_E="↚",DE="⇍",zE="↮",EE="⇎",RE="≰",ME="≦̸",BE="⩽̸",IE="⩽̸",PE="≮",NE="⋘̸",qE="≴",FE="≪⃒",LE="≮",$E="⋪",OE="⋬",UE="≪̸",HE="∤",VE="⁠",jE=" ",GE="𝕟",WE="ℕ",XE="⫬",YE="¬",KE="≢",ZE="≭",JE="∦",QE="∉",eR="≠",tR="≂̸",rR="∄",nR="≯",oR="≱",aR="≧̸",iR="≫̸",sR="≹",lR="⩾̸",cR="≵",uR="≎̸",dR="≏̸",hR="∉",fR="⋵̸",pR="⋹̸",mR="∉",vR="⋷",gR="⋶",bR="⧏̸",yR="⋪",xR="⋬",wR="≮",kR="≰",SR="≸",CR="≪̸",AR="⩽̸",TR="≴",_R="⪢̸",DR="⪡̸",zR="∌",ER="∌",RR="⋾",MR="⋽",BR="⊀",IR="⪯̸",PR="⋠",NR="∌",qR="⧐̸",FR="⋫",LR="⋭",$R="⊏̸",OR="⋢",UR="⊐̸",HR="⋣",VR="⊂⃒",jR="⊈",GR="⊁",WR="⪰̸",XR="⋡",YR="≿̸",KR="⊃⃒",ZR="⊉",JR="≁",QR="≄",eM="≇",tM="≉",rM="∤",nM="∦",oM="∦",aM="⫽⃥",iM="∂̸",sM="⨔",lM="⊀",cM="⋠",uM="⊀",dM="⪯̸",hM="⪯̸",fM="⤳̸",pM="↛",mM="⇏",vM="↝̸",gM="↛",bM="⇏",yM="⋫",xM="⋭",wM="⊁",kM="⋡",SM="⪰̸",CM="𝒩",AM="𝓃",TM="∤",_M="∦",DM="≁",zM="≄",EM="≄",RM="∤",MM="∦",BM="⋢",IM="⋣",PM="⊄",NM="⫅̸",qM="⊈",FM="⊂⃒",LM="⊈",$M="⫅̸",OM="⊁",UM="⪰̸",HM="⊅",VM="⫆̸",jM="⊉",GM="⊃⃒",WM="⊉",XM="⫆̸",YM="≹",KM="Ñ",ZM="ñ",JM="≸",QM="⋪",eB="⋬",tB="⋫",rB="⋭",nB="Ν",oB="ν",aB="#",iB="№",sB=" ",lB="≍⃒",cB="⊬",uB="⊭",dB="⊮",hB="⊯",fB="≥⃒",pB=">⃒",mB="⤄",vB="⧞",gB="⤂",bB="≤⃒",yB="<⃒",xB="⊴⃒",wB="⤃",kB="⊵⃒",SB="∼⃒",CB="⤣",AB="↖",TB="⇖",_B="↖",DB="⤧",zB="Ó",EB="ó",RB="⊛",MB="Ô",BB="ô",IB="⊚",PB="О",NB="о",qB="⊝",FB="Ő",LB="ő",$B="⨸",OB="⊙",UB="⦼",HB="Œ",VB="œ",jB="⦿",GB="𝔒",WB="𝔬",XB="˛",YB="Ò",KB="ò",ZB="⧁",JB="⦵",QB="Ω",eI="∮",tI="↺",rI="⦾",nI="⦻",oI="‾",aI="⧀",iI="Ō",sI="ō",lI="Ω",cI="ω",uI="Ο",dI="ο",hI="⦶",fI="⊖",pI="𝕆",mI="𝕠",vI="⦷",gI="“",bI="‘",yI="⦹",xI="⊕",wI="↻",kI="⩔",SI="∨",CI="⩝",AI="ℴ",TI="ℴ",_I="ª",DI="º",zI="⊶",EI="⩖",RI="⩗",MI="⩛",BI="Ⓢ",II="𝒪",PI="ℴ",NI="Ø",qI="ø",FI="⊘",LI="Õ",$I="õ",OI="⨶",UI="⨷",HI="⊗",VI="Ö",jI="ö",GI="⌽",WI="‾",XI="⏞",YI="⎴",KI="⏜",ZI="¶",JI="∥",QI="∥",eP="⫳",tP="⫽",rP="∂",nP="∂",oP="П",aP="п",iP="%",sP=".",lP="‰",cP="⊥",uP="‱",dP="𝔓",hP="𝔭",fP="Φ",pP="φ",mP="ϕ",vP="ℳ",gP="☎",bP="Π",yP="π",xP="⋔",wP="ϖ",kP="ℏ",SP="ℎ",CP="ℏ",AP="⨣",TP="⊞",_P="⨢",DP="+",zP="∔",EP="⨥",RP="⩲",MP="±",BP="±",IP="⨦",PP="⨧",NP="±",qP="ℌ",FP="⨕",LP="𝕡",$P="ℙ",OP="£",UP="⪷",HP="⪻",VP="≺",jP="≼",GP="⪷",WP="≺",XP="≼",YP="≺",KP="⪯",ZP="≼",JP="≾",QP="⪯",eN="⪹",tN="⪵",rN="⋨",nN="⪯",oN="⪳",aN="≾",iN="′",sN="″",lN="ℙ",cN="⪹",uN="⪵",dN="⋨",hN="∏",fN="∏",pN="⌮",mN="⌒",vN="⌓",gN="∝",bN="∝",yN="∷",xN="∝",wN="≾",kN="⊰",SN="𝒫",CN="𝓅",AN="Ψ",TN="ψ",_N=" ",DN="𝔔",zN="𝔮",EN="⨌",RN="𝕢",MN="ℚ",BN="⁗",IN="𝒬",PN="𝓆",NN="ℍ",qN="⨖",FN="?",LN="≟",$N='"',ON='"',UN="⇛",HN="∽̱",VN="Ŕ",jN="ŕ",GN="√",WN="⦳",XN="⟩",YN="⟫",KN="⦒",ZN="⦥",JN="⟩",QN="»",eq="⥵",tq="⇥",rq="⤠",nq="⤳",oq="→",aq="↠",iq="⇒",sq="⤞",lq="↪",cq="↬",uq="⥅",dq="⥴",hq="⤖",fq="↣",pq="↝",mq="⤚",vq="⤜",gq="∶",bq="ℚ",yq="⤍",xq="⤏",wq="⤐",kq="❳",Sq="}",Cq="]",Aq="⦌",Tq="⦎",_q="⦐",Dq="Ř",zq="ř",Eq="Ŗ",Rq="ŗ",Mq="⌉",Bq="}",Iq="Р",Pq="р",Nq="⤷",qq="⥩",Fq="”",Lq="”",$q="↳",Oq="ℜ",Uq="ℛ",Hq="ℜ",Vq="ℝ",jq="ℜ",Gq="▭",Wq="®",Xq="®",Yq="∋",Kq="⇋",Zq="⥯",Jq="⥽",Qq="⌋",eF="𝔯",tF="ℜ",rF="⥤",nF="⇁",oF="⇀",aF="⥬",iF="Ρ",sF="ρ",lF="ϱ",cF="⟩",uF="⇥",dF="→",hF="→",fF="⇒",pF="⇄",mF="↣",vF="⌉",gF="⟧",bF="⥝",yF="⥕",xF="⇂",wF="⌋",kF="⇁",SF="⇀",CF="⇄",AF="⇌",TF="⇉",_F="↝",DF="↦",zF="⊢",EF="⥛",RF="⋌",MF="⧐",BF="⊳",IF="⊵",PF="⥏",NF="⥜",qF="⥔",FF="↾",LF="⥓",$F="⇀",OF="˚",UF="≓",HF="⇄",VF="⇌",jF="‏",GF="⎱",WF="⎱",XF="⫮",YF="⟭",KF="⇾",ZF="⟧",JF="⦆",QF="𝕣",eL="ℝ",tL="⨮",rL="⨵",nL="⥰",oL=")",aL="⦔",iL="⨒",sL="⇉",lL="⇛",cL="›",uL="𝓇",dL="ℛ",hL="↱",fL="↱",pL="]",mL="’",vL="’",gL="⋌",bL="⋊",yL="▹",xL="⊵",wL="▸",kL="⧎",SL="⧴",CL="⥨",AL="℞",TL="Ś",_L="ś",DL="‚",zL="⪸",EL="Š",RL="š",ML="⪼",BL="≻",IL="≽",PL="⪰",NL="⪴",qL="Ş",FL="ş",LL="Ŝ",$L="ŝ",OL="⪺",UL="⪶",HL="⋩",VL="⨓",jL="≿",GL="С",WL="с",XL="⊡",YL="⋅",KL="⩦",ZL="⤥",JL="↘",QL="⇘",e$="↘",t$="§",r$=";",n$="⤩",o$="∖",a$="∖",i$="✶",s$="𝔖",l$="𝔰",c$="⌢",u$="♯",d$="Щ",h$="щ",f$="Ш",p$="ш",m$="↓",v$="←",g$="∣",b$="∥",y$="→",x$="↑",w$="­",k$="Σ",S$="σ",C$="ς",A$="ς",T$="∼",_$="⩪",D$="≃",z$="≃",E$="⪞",R$="⪠",M$="⪝",B$="⪟",I$="≆",P$="⨤",N$="⥲",q$="←",F$="∘",L$="∖",$$="⨳",O$="⧤",U$="∣",H$="⌣",V$="⪪",j$="⪬",G$="⪬︀",W$="Ь",X$="ь",Y$="⌿",K$="⧄",Z$="/",J$="𝕊",Q$="𝕤",eO="♠",tO="♠",rO="∥",nO="⊓",oO="⊓︀",aO="⊔",iO="⊔︀",sO="√",lO="⊏",cO="⊑",uO="⊏",dO="⊑",hO="⊐",fO="⊒",pO="⊐",mO="⊒",vO="□",gO="□",bO="⊓",yO="⊏",xO="⊑",wO="⊐",kO="⊒",SO="⊔",CO="▪",AO="□",TO="▪",_O="→",DO="𝒮",zO="𝓈",EO="∖",RO="⌣",MO="⋆",BO="⋆",IO="☆",PO="★",NO="ϵ",qO="ϕ",FO="¯",LO="⊂",$O="⋐",OO="⪽",UO="⫅",HO="⊆",VO="⫃",jO="⫁",GO="⫋",WO="⊊",XO="⪿",YO="⥹",KO="⊂",ZO="⋐",JO="⊆",QO="⫅",eU="⊆",tU="⊊",rU="⫋",nU="⫇",oU="⫕",aU="⫓",iU="⪸",sU="≻",lU="≽",cU="≻",uU="⪰",dU="≽",hU="≿",fU="⪰",pU="⪺",mU="⪶",vU="⋩",gU="≿",bU="∋",yU="∑",xU="∑",wU="♪",kU="¹",SU="²",CU="³",AU="⊃",TU="⋑",_U="⪾",DU="⫘",zU="⫆",EU="⊇",RU="⫄",MU="⊃",BU="⊇",IU="⟉",PU="⫗",NU="⥻",qU="⫂",FU="⫌",LU="⊋",$U="⫀",OU="⊃",UU="⋑",HU="⊇",VU="⫆",jU="⊋",GU="⫌",WU="⫈",XU="⫔",YU="⫖",KU="⤦",ZU="↙",JU="⇙",QU="↙",eH="⤪",tH="ß",rH=" ",nH="⌖",oH="Τ",aH="τ",iH="⎴",sH="Ť",lH="ť",cH="Ţ",uH="ţ",dH="Т",hH="т",fH="⃛",pH="⌕",mH="𝔗",vH="𝔱",gH="∴",bH="∴",yH="∴",xH="Θ",wH="θ",kH="ϑ",SH="ϑ",CH="≈",AH="∼",TH="  ",_H=" ",DH=" ",zH="≈",EH="∼",RH="Þ",MH="þ",BH="˜",IH="∼",PH="≃",NH="≅",qH="≈",FH="⨱",LH="⊠",$H="×",OH="⨰",UH="∭",HH="⤨",VH="⌶",jH="⫱",GH="⊤",WH="𝕋",XH="𝕥",YH="⫚",KH="⤩",ZH="‴",JH="™",QH="™",eV="▵",tV="▿",rV="◃",nV="⊴",oV="≜",aV="▹",iV="⊵",sV="◬",lV="≜",cV="⨺",uV="⃛",dV="⨹",hV="⧍",fV="⨻",pV="⏢",mV="𝒯",vV="𝓉",gV="Ц",bV="ц",yV="Ћ",xV="ћ",wV="Ŧ",kV="ŧ",SV="≬",CV="↞",AV="↠",TV="Ú",_V="ú",DV="↑",zV="↟",EV="⇑",RV="⥉",MV="Ў",BV="ў",IV="Ŭ",PV="ŭ",NV="Û",qV="û",FV="У",LV="у",$V="⇅",OV="Ű",UV="ű",HV="⥮",VV="⥾",jV="𝔘",GV="𝔲",WV="Ù",XV="ù",YV="⥣",KV="↿",ZV="↾",JV="▀",QV="⌜",ej="⌜",tj="⌏",rj="◸",nj="Ū",oj="ū",aj="¨",ij="_",sj="⏟",lj="⎵",cj="⏝",uj="⋃",dj="⊎",hj="Ų",fj="ų",pj="𝕌",mj="𝕦",vj="⤒",gj="↑",bj="↑",yj="⇑",xj="⇅",wj="↕",kj="↕",Sj="⇕",Cj="⥮",Aj="↿",Tj="↾",_j="⊎",Dj="↖",zj="↗",Ej="υ",Rj="ϒ",Mj="ϒ",Bj="Υ",Ij="υ",Pj="↥",Nj="⊥",qj="⇈",Fj="⌝",Lj="⌝",$j="⌎",Oj="Ů",Uj="ů",Hj="◹",Vj="𝒰",jj="𝓊",Gj="⋰",Wj="Ũ",Xj="ũ",Yj="▵",Kj="▴",Zj="⇈",Jj="Ü",Qj="ü",eG="⦧",tG="⦜",rG="ϵ",nG="ϰ",oG="∅",aG="ϕ",iG="ϖ",sG="∝",lG="↕",cG="⇕",uG="ϱ",dG="ς",hG="⊊︀",fG="⫋︀",pG="⊋︀",mG="⫌︀",vG="ϑ",gG="⊲",bG="⊳",yG="⫨",xG="⫫",wG="⫩",kG="В",SG="в",CG="⊢",AG="⊨",TG="⊩",_G="⊫",DG="⫦",zG="⊻",EG="∨",RG="⋁",MG="≚",BG="⋮",IG="|",PG="‖",NG="|",qG="‖",FG="∣",LG="|",$G="❘",OG="≀",UG=" ",HG="𝔙",VG="𝔳",jG="⊲",GG="⊂⃒",WG="⊃⃒",XG="𝕍",YG="𝕧",KG="∝",ZG="⊳",JG="𝒱",QG="𝓋",eW="⫋︀",tW="⊊︀",rW="⫌︀",nW="⊋︀",oW="⊪",aW="⦚",iW="Ŵ",sW="ŵ",lW="⩟",cW="∧",uW="⋀",dW="≙",hW="℘",fW="𝔚",pW="𝔴",mW="𝕎",vW="𝕨",gW="℘",bW="≀",yW="≀",xW="𝒲",wW="𝓌",kW="⋂",SW="◯",CW="⋃",AW="▽",TW="𝔛",_W="𝔵",DW="⟷",zW="⟺",EW="Ξ",RW="ξ",MW="⟵",BW="⟸",IW="⟼",PW="⋻",NW="⨀",qW="𝕏",FW="𝕩",LW="⨁",$W="⨂",OW="⟶",UW="⟹",HW="𝒳",VW="𝓍",jW="⨆",GW="⨄",WW="△",XW="⋁",YW="⋀",KW="Ý",ZW="ý",JW="Я",QW="я",eX="Ŷ",tX="ŷ",rX="Ы",nX="ы",oX="¥",aX="𝔜",iX="𝔶",sX="Ї",lX="ї",cX="𝕐",uX="𝕪",dX="𝒴",hX="𝓎",fX="Ю",pX="ю",mX="ÿ",vX="Ÿ",gX="Ź",bX="ź",yX="Ž",xX="ž",wX="З",kX="з",SX="Ż",CX="ż",AX="ℨ",TX="​",_X="Ζ",DX="ζ",zX="𝔷",EX="ℨ",RX="Ж",MX="ж",BX="⇝",IX="𝕫",PX="ℤ",NX="𝒵",qX="𝓏",FX="‍",LX="‌",$X={Aacute:Sv,aacute:Cv,Abreve:Av,abreve:Tv,ac:_v,acd:Dv,acE:zv,Acirc:Ev,acirc:Rv,acute:Mv,Acy:Bv,acy:Iv,AElig:Pv,aelig:Nv,af:qv,Afr:Fv,afr:Lv,Agrave:$v,agrave:Ov,alefsym:Uv,aleph:Hv,Alpha:Vv,alpha:jv,Amacr:Gv,amacr:Wv,amalg:Xv,amp:Yv,AMP:Kv,andand:Zv,And:Jv,and:Qv,andd:eg,andslope:tg,andv:rg,ang:ng,ange:og,angle:ag,angmsdaa:ig,angmsdab:sg,angmsdac:lg,angmsdad:cg,angmsdae:ug,angmsdaf:dg,angmsdag:hg,angmsdah:fg,angmsd:pg,angrt:mg,angrtvb:vg,angrtvbd:gg,angsph:bg,angst:yg,angzarr:xg,Aogon:wg,aogon:kg,Aopf:Sg,aopf:Cg,apacir:Ag,ap:Tg,apE:_g,ape:Dg,apid:zg,apos:Eg,ApplyFunction:Rg,approx:Mg,approxeq:Bg,Aring:Ig,aring:Pg,Ascr:Ng,ascr:qg,Assign:Fg,ast:Lg,asymp:$g,asympeq:Og,Atilde:Ug,atilde:Hg,Auml:Vg,auml:jg,awconint:Gg,awint:Wg,backcong:Xg,backepsilon:Yg,backprime:Kg,backsim:Zg,backsimeq:Jg,Backslash:Qg,Barv:e2,barvee:t2,barwed:r2,Barwed:n2,barwedge:o2,bbrk:a2,bbrktbrk:i2,bcong:s2,Bcy:l2,bcy:c2,bdquo:u2,becaus:d2,because:h2,Because:f2,bemptyv:p2,bepsi:m2,bernou:v2,Bernoullis:g2,Beta:b2,beta:y2,beth:x2,between:w2,Bfr:k2,bfr:S2,bigcap:C2,bigcirc:A2,bigcup:T2,bigodot:_2,bigoplus:D2,bigotimes:z2,bigsqcup:E2,bigstar:R2,bigtriangledown:M2,bigtriangleup:B2,biguplus:I2,bigvee:P2,bigwedge:N2,bkarow:q2,blacklozenge:F2,blacksquare:L2,blacktriangle:$2,blacktriangledown:O2,blacktriangleleft:U2,blacktriangleright:H2,blank:V2,blk12:j2,blk14:G2,blk34:W2,block:X2,bne:Y2,bnequiv:K2,bNot:Z2,bnot:J2,Bopf:Q2,bopf:e5,bot:t5,bottom:r5,bowtie:n5,boxbox:o5,boxdl:a5,boxdL:i5,boxDl:s5,boxDL:l5,boxdr:c5,boxdR:u5,boxDr:d5,boxDR:h5,boxh:f5,boxH:p5,boxhd:m5,boxHd:v5,boxhD:g5,boxHD:b5,boxhu:y5,boxHu:x5,boxhU:w5,boxHU:k5,boxminus:S5,boxplus:C5,boxtimes:A5,boxul:T5,boxuL:_5,boxUl:D5,boxUL:z5,boxur:E5,boxuR:R5,boxUr:M5,boxUR:B5,boxv:I5,boxV:P5,boxvh:N5,boxvH:q5,boxVh:F5,boxVH:L5,boxvl:$5,boxvL:O5,boxVl:U5,boxVL:H5,boxvr:V5,boxvR:j5,boxVr:G5,boxVR:W5,bprime:X5,breve:Y5,Breve:K5,brvbar:Z5,bscr:J5,Bscr:Q5,bsemi:e3,bsim:t3,bsime:r3,bsolb:n3,bsol:o3,bsolhsub:a3,bull:i3,bullet:s3,bump:l3,bumpE:c3,bumpe:u3,Bumpeq:d3,bumpeq:h3,Cacute:f3,cacute:p3,capand:m3,capbrcup:v3,capcap:g3,cap:b3,Cap:y3,capcup:x3,capdot:w3,CapitalDifferentialD:k3,caps:S3,caret:C3,caron:A3,Cayleys:T3,ccaps:_3,Ccaron:D3,ccaron:z3,Ccedil:E3,ccedil:R3,Ccirc:M3,ccirc:B3,Cconint:I3,ccups:P3,ccupssm:N3,Cdot:q3,cdot:F3,cedil:L3,Cedilla:$3,cemptyv:O3,cent:U3,centerdot:H3,CenterDot:V3,cfr:j3,Cfr:G3,CHcy:W3,chcy:X3,check:Y3,checkmark:K3,Chi:Z3,chi:J3,circ:Q3,circeq:e6,circlearrowleft:t6,circlearrowright:r6,circledast:n6,circledcirc:o6,circleddash:a6,CircleDot:i6,circledR:s6,circledS:l6,CircleMinus:c6,CirclePlus:u6,CircleTimes:d6,cir:h6,cirE:f6,cire:p6,cirfnint:m6,cirmid:v6,cirscir:g6,ClockwiseContourIntegral:b6,CloseCurlyDoubleQuote:y6,CloseCurlyQuote:x6,clubs:w6,clubsuit:k6,colon:S6,Colon:C6,Colone:A6,colone:T6,coloneq:_6,comma:D6,commat:z6,comp:E6,compfn:R6,complement:M6,complexes:B6,cong:I6,congdot:P6,Congruent:N6,conint:q6,Conint:F6,ContourIntegral:L6,copf:$6,Copf:O6,coprod:U6,Coproduct:H6,copy:V6,COPY:j6,copysr:G6,CounterClockwiseContourIntegral:W6,crarr:X6,cross:Y6,Cross:K6,Cscr:Z6,cscr:J6,csub:Q6,csube:eb,csup:tb,csupe:rb,ctdot:nb,cudarrl:ob,cudarrr:ab,cuepr:ib,cuesc:sb,cularr:lb,cularrp:cb,cupbrcap:ub,cupcap:db,CupCap:hb,cup:fb,Cup:pb,cupcup:mb,cupdot:vb,cupor:gb,cups:bb,curarr:yb,curarrm:xb,curlyeqprec:wb,curlyeqsucc:kb,curlyvee:Sb,curlywedge:Cb,curren:Ab,curvearrowleft:Tb,curvearrowright:_b,cuvee:Db,cuwed:zb,cwconint:Eb,cwint:Rb,cylcty:Mb,dagger:Bb,Dagger:Ib,daleth:Pb,darr:Nb,Darr:qb,dArr:Fb,dash:Lb,Dashv:$b,dashv:Ob,dbkarow:Ub,dblac:Hb,Dcaron:Vb,dcaron:jb,Dcy:Gb,dcy:Wb,ddagger:Xb,ddarr:Yb,DD:Kb,dd:Zb,DDotrahd:Jb,ddotseq:Qb,deg:e7,Del:t7,Delta:r7,delta:n7,demptyv:o7,dfisht:a7,Dfr:i7,dfr:s7,dHar:l7,dharl:c7,dharr:u7,DiacriticalAcute:d7,DiacriticalDot:h7,DiacriticalDoubleAcute:f7,DiacriticalGrave:p7,DiacriticalTilde:m7,diam:v7,diamond:g7,Diamond:b7,diamondsuit:y7,diams:x7,die:w7,DifferentialD:k7,digamma:S7,disin:C7,div:A7,divide:T7,divideontimes:_7,divonx:D7,DJcy:z7,djcy:E7,dlcorn:R7,dlcrop:M7,dollar:B7,Dopf:I7,dopf:P7,Dot:N7,dot:q7,DotDot:F7,doteq:L7,doteqdot:$7,DotEqual:O7,dotminus:U7,dotplus:H7,dotsquare:V7,doublebarwedge:j7,DoubleContourIntegral:G7,DoubleDot:W7,DoubleDownArrow:X7,DoubleLeftArrow:Y7,DoubleLeftRightArrow:K7,DoubleLeftTee:Z7,DoubleLongLeftArrow:J7,DoubleLongLeftRightArrow:Q7,DoubleLongRightArrow:e8,DoubleRightArrow:t8,DoubleRightTee:r8,DoubleUpArrow:n8,DoubleUpDownArrow:o8,DoubleVerticalBar:a8,DownArrowBar:i8,downarrow:s8,DownArrow:l8,Downarrow:c8,DownArrowUpArrow:u8,DownBreve:d8,downdownarrows:h8,downharpoonleft:f8,downharpoonright:p8,DownLeftRightVector:m8,DownLeftTeeVector:v8,DownLeftVectorBar:g8,DownLeftVector:b8,DownRightTeeVector:y8,DownRightVectorBar:x8,DownRightVector:w8,DownTeeArrow:k8,DownTee:S8,drbkarow:C8,drcorn:A8,drcrop:T8,Dscr:_8,dscr:D8,DScy:z8,dscy:E8,dsol:R8,Dstrok:M8,dstrok:B8,dtdot:I8,dtri:P8,dtrif:N8,duarr:q8,duhar:F8,dwangle:L8,DZcy:$8,dzcy:O8,dzigrarr:U8,Eacute:H8,eacute:V8,easter:j8,Ecaron:G8,ecaron:W8,Ecirc:X8,ecirc:Y8,ecir:K8,ecolon:Z8,Ecy:J8,ecy:Q8,eDDot:e9,Edot:t9,edot:r9,eDot:n9,ee:o9,efDot:a9,Efr:i9,efr:s9,eg:l9,Egrave:c9,egrave:u9,egs:d9,egsdot:h9,el:f9,Element:p9,elinters:m9,ell:v9,els:g9,elsdot:b9,Emacr:y9,emacr:x9,empty:w9,emptyset:k9,EmptySmallSquare:S9,emptyv:C9,EmptyVerySmallSquare:A9,emsp13:T9,emsp14:_9,emsp:D9,ENG:z9,eng:E9,ensp:R9,Eogon:M9,eogon:B9,Eopf:I9,eopf:P9,epar:N9,eparsl:q9,eplus:F9,epsi:L9,Epsilon:$9,epsilon:O9,epsiv:U9,eqcirc:H9,eqcolon:V9,eqsim:j9,eqslantgtr:G9,eqslantless:W9,Equal:X9,equals:Y9,EqualTilde:K9,equest:Z9,Equilibrium:J9,equiv:Q9,equivDD:ey,eqvparsl:ty,erarr:ry,erDot:ny,escr:oy,Escr:ay,esdot:iy,Esim:sy,esim:ly,Eta:cy,eta:uy,ETH:dy,eth:hy,Euml:fy,euml:py,euro:my,excl:vy,exist:gy,Exists:by,expectation:yy,exponentiale:xy,ExponentialE:wy,fallingdotseq:ky,Fcy:Sy,fcy:Cy,female:Ay,ffilig:Ty,fflig:_y,ffllig:Dy,Ffr:zy,ffr:Ey,filig:Ry,FilledSmallSquare:My,FilledVerySmallSquare:By,fjlig:Iy,flat:Py,fllig:Ny,fltns:qy,fnof:Fy,Fopf:Ly,fopf:$y,forall:Oy,ForAll:Uy,fork:Hy,forkv:Vy,Fouriertrf:jy,fpartint:Gy,frac12:Wy,frac13:Xy,frac14:Yy,frac15:Ky,frac16:Zy,frac18:Jy,frac23:Qy,frac25:ex,frac34:tx,frac35:rx,frac38:nx,frac45:ox,frac56:ax,frac58:ix,frac78:sx,frasl:lx,frown:cx,fscr:ux,Fscr:dx,gacute:hx,Gamma:fx,gamma:px,Gammad:mx,gammad:vx,gap:gx,Gbreve:bx,gbreve:yx,Gcedil:xx,Gcirc:wx,gcirc:kx,Gcy:Sx,gcy:Cx,Gdot:Ax,gdot:Tx,ge:_x,gE:Dx,gEl:zx,gel:Ex,geq:Rx,geqq:Mx,geqslant:Bx,gescc:Ix,ges:Px,gesdot:Nx,gesdoto:qx,gesdotol:Fx,gesl:Lx,gesles:$x,Gfr:Ox,gfr:Ux,gg:Hx,Gg:Vx,ggg:jx,gimel:Gx,GJcy:Wx,gjcy:Xx,gla:Yx,gl:Kx,glE:Zx,glj:Jx,gnap:Qx,gnapprox:ew,gne:tw,gnE:rw,gneq:nw,gneqq:ow,gnsim:aw,Gopf:iw,gopf:sw,grave:lw,GreaterEqual:cw,GreaterEqualLess:uw,GreaterFullEqual:dw,GreaterGreater:hw,GreaterLess:fw,GreaterSlantEqual:pw,GreaterTilde:mw,Gscr:vw,gscr:gw,gsim:bw,gsime:yw,gsiml:xw,gtcc:ww,gtcir:kw,gt:Sw,GT:Cw,Gt:Aw,gtdot:Tw,gtlPar:_w,gtquest:Dw,gtrapprox:zw,gtrarr:Ew,gtrdot:Rw,gtreqless:Mw,gtreqqless:Bw,gtrless:Iw,gtrsim:Pw,gvertneqq:Nw,gvnE:qw,Hacek:Fw,hairsp:Lw,half:$w,hamilt:Ow,HARDcy:Uw,hardcy:Hw,harrcir:Vw,harr:jw,hArr:Gw,harrw:Ww,Hat:Xw,hbar:Yw,Hcirc:Kw,hcirc:Zw,hearts:Jw,heartsuit:Qw,hellip:ek,hercon:tk,hfr:rk,Hfr:nk,HilbertSpace:ok,hksearow:ak,hkswarow:ik,hoarr:sk,homtht:lk,hookleftarrow:ck,hookrightarrow:uk,hopf:dk,Hopf:hk,horbar:fk,HorizontalLine:pk,hscr:mk,Hscr:vk,hslash:gk,Hstrok:bk,hstrok:yk,HumpDownHump:xk,HumpEqual:wk,hybull:kk,hyphen:Sk,Iacute:Ck,iacute:Ak,ic:Tk,Icirc:_k,icirc:Dk,Icy:zk,icy:Ek,Idot:Rk,IEcy:Mk,iecy:Bk,iexcl:Ik,iff:Pk,ifr:Nk,Ifr:qk,Igrave:Fk,igrave:Lk,ii:$k,iiiint:Ok,iiint:Uk,iinfin:Hk,iiota:Vk,IJlig:jk,ijlig:Gk,Imacr:Wk,imacr:Xk,image:Yk,ImaginaryI:Kk,imagline:Zk,imagpart:Jk,imath:Qk,Im:eS,imof:tS,imped:rS,Implies:nS,incare:oS,in:"∈",infin:aS,infintie:iS,inodot:sS,intcal:lS,int:cS,Int:uS,integers:dS,Integral:hS,intercal:fS,Intersection:pS,intlarhk:mS,intprod:vS,InvisibleComma:gS,InvisibleTimes:bS,IOcy:yS,iocy:xS,Iogon:wS,iogon:kS,Iopf:SS,iopf:CS,Iota:AS,iota:TS,iprod:_S,iquest:DS,iscr:zS,Iscr:ES,isin:RS,isindot:MS,isinE:BS,isins:IS,isinsv:PS,isinv:NS,it:qS,Itilde:FS,itilde:LS,Iukcy:$S,iukcy:OS,Iuml:US,iuml:HS,Jcirc:VS,jcirc:jS,Jcy:GS,jcy:WS,Jfr:XS,jfr:YS,jmath:KS,Jopf:ZS,jopf:JS,Jscr:QS,jscr:eC,Jsercy:tC,jsercy:rC,Jukcy:nC,jukcy:oC,Kappa:aC,kappa:iC,kappav:sC,Kcedil:lC,kcedil:cC,Kcy:uC,kcy:dC,Kfr:hC,kfr:fC,kgreen:pC,KHcy:mC,khcy:vC,KJcy:gC,kjcy:bC,Kopf:yC,kopf:xC,Kscr:wC,kscr:kC,lAarr:SC,Lacute:CC,lacute:AC,laemptyv:TC,lagran:_C,Lambda:DC,lambda:zC,lang:EC,Lang:RC,langd:MC,langle:BC,lap:IC,Laplacetrf:PC,laquo:NC,larrb:qC,larrbfs:FC,larr:LC,Larr:$C,lArr:OC,larrfs:UC,larrhk:HC,larrlp:VC,larrpl:jC,larrsim:GC,larrtl:WC,latail:XC,lAtail:YC,lat:KC,late:ZC,lates:JC,lbarr:QC,lBarr:eA,lbbrk:tA,lbrace:rA,lbrack:nA,lbrke:oA,lbrksld:aA,lbrkslu:iA,Lcaron:sA,lcaron:lA,Lcedil:cA,lcedil:uA,lceil:dA,lcub:hA,Lcy:fA,lcy:pA,ldca:mA,ldquo:vA,ldquor:gA,ldrdhar:bA,ldrushar:yA,ldsh:xA,le:wA,lE:kA,LeftAngleBracket:SA,LeftArrowBar:CA,leftarrow:AA,LeftArrow:TA,Leftarrow:_A,LeftArrowRightArrow:DA,leftarrowtail:zA,LeftCeiling:EA,LeftDoubleBracket:RA,LeftDownTeeVector:MA,LeftDownVectorBar:BA,LeftDownVector:IA,LeftFloor:PA,leftharpoondown:NA,leftharpoonup:qA,leftleftarrows:FA,leftrightarrow:LA,LeftRightArrow:$A,Leftrightarrow:OA,leftrightarrows:UA,leftrightharpoons:HA,leftrightsquigarrow:VA,LeftRightVector:jA,LeftTeeArrow:GA,LeftTee:WA,LeftTeeVector:XA,leftthreetimes:YA,LeftTriangleBar:KA,LeftTriangle:ZA,LeftTriangleEqual:JA,LeftUpDownVector:QA,LeftUpTeeVector:eT,LeftUpVectorBar:tT,LeftUpVector:rT,LeftVectorBar:nT,LeftVector:oT,lEg:aT,leg:iT,leq:sT,leqq:lT,leqslant:cT,lescc:uT,les:dT,lesdot:hT,lesdoto:fT,lesdotor:pT,lesg:mT,lesges:vT,lessapprox:gT,lessdot:bT,lesseqgtr:yT,lesseqqgtr:xT,LessEqualGreater:wT,LessFullEqual:kT,LessGreater:ST,lessgtr:CT,LessLess:AT,lesssim:TT,LessSlantEqual:_T,LessTilde:DT,lfisht:zT,lfloor:ET,Lfr:RT,lfr:MT,lg:BT,lgE:IT,lHar:PT,lhard:NT,lharu:qT,lharul:FT,lhblk:LT,LJcy:$T,ljcy:OT,llarr:UT,ll:HT,Ll:VT,llcorner:jT,Lleftarrow:GT,llhard:WT,lltri:XT,Lmidot:YT,lmidot:KT,lmoustache:ZT,lmoust:JT,lnap:QT,lnapprox:e_,lne:t_,lnE:r_,lneq:n_,lneqq:o_,lnsim:a_,loang:i_,loarr:s_,lobrk:l_,longleftarrow:c_,LongLeftArrow:u_,Longleftarrow:d_,longleftrightarrow:h_,LongLeftRightArrow:f_,Longleftrightarrow:p_,longmapsto:m_,longrightarrow:v_,LongRightArrow:g_,Longrightarrow:b_,looparrowleft:y_,looparrowright:x_,lopar:w_,Lopf:k_,lopf:S_,loplus:C_,lotimes:A_,lowast:T_,lowbar:__,LowerLeftArrow:D_,LowerRightArrow:z_,loz:E_,lozenge:R_,lozf:M_,lpar:B_,lparlt:I_,lrarr:P_,lrcorner:N_,lrhar:q_,lrhard:F_,lrm:L_,lrtri:$_,lsaquo:O_,lscr:U_,Lscr:H_,lsh:V_,Lsh:j_,lsim:G_,lsime:W_,lsimg:X_,lsqb:Y_,lsquo:K_,lsquor:Z_,Lstrok:J_,lstrok:Q_,ltcc:eD,ltcir:tD,lt:rD,LT:nD,Lt:oD,ltdot:aD,lthree:iD,ltimes:sD,ltlarr:lD,ltquest:cD,ltri:uD,ltrie:dD,ltrif:hD,ltrPar:fD,lurdshar:pD,luruhar:mD,lvertneqq:vD,lvnE:gD,macr:bD,male:yD,malt:xD,maltese:wD,Map:"⤅",map:kD,mapsto:SD,mapstodown:CD,mapstoleft:AD,mapstoup:TD,marker:_D,mcomma:DD,Mcy:zD,mcy:ED,mdash:RD,mDDot:MD,measuredangle:BD,MediumSpace:ID,Mellintrf:PD,Mfr:ND,mfr:qD,mho:FD,micro:LD,midast:$D,midcir:OD,mid:UD,middot:HD,minusb:VD,minus:jD,minusd:GD,minusdu:WD,MinusPlus:XD,mlcp:YD,mldr:KD,mnplus:ZD,models:JD,Mopf:QD,mopf:ez,mp:tz,mscr:rz,Mscr:nz,mstpos:oz,Mu:az,mu:iz,multimap:sz,mumap:lz,nabla:cz,Nacute:uz,nacute:dz,nang:hz,nap:fz,napE:pz,napid:mz,napos:vz,napprox:gz,natural:bz,naturals:yz,natur:xz,nbsp:wz,nbump:kz,nbumpe:Sz,ncap:Cz,Ncaron:Az,ncaron:Tz,Ncedil:_z,ncedil:Dz,ncong:zz,ncongdot:Ez,ncup:Rz,Ncy:Mz,ncy:Bz,ndash:Iz,nearhk:Pz,nearr:Nz,neArr:qz,nearrow:Fz,ne:Lz,nedot:$z,NegativeMediumSpace:Oz,NegativeThickSpace:Uz,NegativeThinSpace:Hz,NegativeVeryThinSpace:Vz,nequiv:jz,nesear:Gz,nesim:Wz,NestedGreaterGreater:Xz,NestedLessLess:Yz,NewLine:Kz,nexist:Zz,nexists:Jz,Nfr:Qz,nfr:eE,ngE:tE,nge:rE,ngeq:nE,ngeqq:oE,ngeqslant:aE,nges:iE,nGg:sE,ngsim:lE,nGt:cE,ngt:uE,ngtr:dE,nGtv:hE,nharr:fE,nhArr:pE,nhpar:mE,ni:vE,nis:gE,nisd:bE,niv:yE,NJcy:xE,njcy:wE,nlarr:kE,nlArr:SE,nldr:CE,nlE:AE,nle:TE,nleftarrow:_E,nLeftarrow:DE,nleftrightarrow:zE,nLeftrightarrow:EE,nleq:RE,nleqq:ME,nleqslant:BE,nles:IE,nless:PE,nLl:NE,nlsim:qE,nLt:FE,nlt:LE,nltri:$E,nltrie:OE,nLtv:UE,nmid:HE,NoBreak:VE,NonBreakingSpace:jE,nopf:GE,Nopf:WE,Not:XE,not:YE,NotCongruent:KE,NotCupCap:ZE,NotDoubleVerticalBar:JE,NotElement:QE,NotEqual:eR,NotEqualTilde:tR,NotExists:rR,NotGreater:nR,NotGreaterEqual:oR,NotGreaterFullEqual:aR,NotGreaterGreater:iR,NotGreaterLess:sR,NotGreaterSlantEqual:lR,NotGreaterTilde:cR,NotHumpDownHump:uR,NotHumpEqual:dR,notin:hR,notindot:fR,notinE:pR,notinva:mR,notinvb:vR,notinvc:gR,NotLeftTriangleBar:bR,NotLeftTriangle:yR,NotLeftTriangleEqual:xR,NotLess:wR,NotLessEqual:kR,NotLessGreater:SR,NotLessLess:CR,NotLessSlantEqual:AR,NotLessTilde:TR,NotNestedGreaterGreater:_R,NotNestedLessLess:DR,notni:zR,notniva:ER,notnivb:RR,notnivc:MR,NotPrecedes:BR,NotPrecedesEqual:IR,NotPrecedesSlantEqual:PR,NotReverseElement:NR,NotRightTriangleBar:qR,NotRightTriangle:FR,NotRightTriangleEqual:LR,NotSquareSubset:$R,NotSquareSubsetEqual:OR,NotSquareSuperset:UR,NotSquareSupersetEqual:HR,NotSubset:VR,NotSubsetEqual:jR,NotSucceeds:GR,NotSucceedsEqual:WR,NotSucceedsSlantEqual:XR,NotSucceedsTilde:YR,NotSuperset:KR,NotSupersetEqual:ZR,NotTilde:JR,NotTildeEqual:QR,NotTildeFullEqual:eM,NotTildeTilde:tM,NotVerticalBar:rM,nparallel:nM,npar:oM,nparsl:aM,npart:iM,npolint:sM,npr:lM,nprcue:cM,nprec:uM,npreceq:dM,npre:hM,nrarrc:fM,nrarr:pM,nrArr:mM,nrarrw:vM,nrightarrow:gM,nRightarrow:bM,nrtri:yM,nrtrie:xM,nsc:wM,nsccue:kM,nsce:SM,Nscr:CM,nscr:AM,nshortmid:TM,nshortparallel:_M,nsim:DM,nsime:zM,nsimeq:EM,nsmid:RM,nspar:MM,nsqsube:BM,nsqsupe:IM,nsub:PM,nsubE:NM,nsube:qM,nsubset:FM,nsubseteq:LM,nsubseteqq:$M,nsucc:OM,nsucceq:UM,nsup:HM,nsupE:VM,nsupe:jM,nsupset:GM,nsupseteq:WM,nsupseteqq:XM,ntgl:YM,Ntilde:KM,ntilde:ZM,ntlg:JM,ntriangleleft:QM,ntrianglelefteq:eB,ntriangleright:tB,ntrianglerighteq:rB,Nu:nB,nu:oB,num:aB,numero:iB,numsp:sB,nvap:lB,nvdash:cB,nvDash:uB,nVdash:dB,nVDash:hB,nvge:fB,nvgt:pB,nvHarr:mB,nvinfin:vB,nvlArr:gB,nvle:bB,nvlt:yB,nvltrie:xB,nvrArr:wB,nvrtrie:kB,nvsim:SB,nwarhk:CB,nwarr:AB,nwArr:TB,nwarrow:_B,nwnear:DB,Oacute:zB,oacute:EB,oast:RB,Ocirc:MB,ocirc:BB,ocir:IB,Ocy:PB,ocy:NB,odash:qB,Odblac:FB,odblac:LB,odiv:$B,odot:OB,odsold:UB,OElig:HB,oelig:VB,ofcir:jB,Ofr:GB,ofr:WB,ogon:XB,Ograve:YB,ograve:KB,ogt:ZB,ohbar:JB,ohm:QB,oint:eI,olarr:tI,olcir:rI,olcross:nI,oline:oI,olt:aI,Omacr:iI,omacr:sI,Omega:lI,omega:cI,Omicron:uI,omicron:dI,omid:hI,ominus:fI,Oopf:pI,oopf:mI,opar:vI,OpenCurlyDoubleQuote:gI,OpenCurlyQuote:bI,operp:yI,oplus:xI,orarr:wI,Or:kI,or:SI,ord:CI,order:AI,orderof:TI,ordf:_I,ordm:DI,origof:zI,oror:EI,orslope:RI,orv:MI,oS:BI,Oscr:II,oscr:PI,Oslash:NI,oslash:qI,osol:FI,Otilde:LI,otilde:$I,otimesas:OI,Otimes:UI,otimes:HI,Ouml:VI,ouml:jI,ovbar:GI,OverBar:WI,OverBrace:XI,OverBracket:YI,OverParenthesis:KI,para:ZI,parallel:JI,par:QI,parsim:eP,parsl:tP,part:rP,PartialD:nP,Pcy:oP,pcy:aP,percnt:iP,period:sP,permil:lP,perp:cP,pertenk:uP,Pfr:dP,pfr:hP,Phi:fP,phi:pP,phiv:mP,phmmat:vP,phone:gP,Pi:bP,pi:yP,pitchfork:xP,piv:wP,planck:kP,planckh:SP,plankv:CP,plusacir:AP,plusb:TP,pluscir:_P,plus:DP,plusdo:zP,plusdu:EP,pluse:RP,PlusMinus:MP,plusmn:BP,plussim:IP,plustwo:PP,pm:NP,Poincareplane:qP,pointint:FP,popf:LP,Popf:$P,pound:OP,prap:UP,Pr:HP,pr:VP,prcue:jP,precapprox:GP,prec:WP,preccurlyeq:XP,Precedes:YP,PrecedesEqual:KP,PrecedesSlantEqual:ZP,PrecedesTilde:JP,preceq:QP,precnapprox:eN,precneqq:tN,precnsim:rN,pre:nN,prE:oN,precsim:aN,prime:iN,Prime:sN,primes:lN,prnap:cN,prnE:uN,prnsim:dN,prod:hN,Product:fN,profalar:pN,profline:mN,profsurf:vN,prop:gN,Proportional:bN,Proportion:yN,propto:xN,prsim:wN,prurel:kN,Pscr:SN,pscr:CN,Psi:AN,psi:TN,puncsp:_N,Qfr:DN,qfr:zN,qint:EN,qopf:RN,Qopf:MN,qprime:BN,Qscr:IN,qscr:PN,quaternions:NN,quatint:qN,quest:FN,questeq:LN,quot:$N,QUOT:ON,rAarr:UN,race:HN,Racute:VN,racute:jN,radic:GN,raemptyv:WN,rang:XN,Rang:YN,rangd:KN,range:ZN,rangle:JN,raquo:QN,rarrap:eq,rarrb:tq,rarrbfs:rq,rarrc:nq,rarr:oq,Rarr:aq,rArr:iq,rarrfs:sq,rarrhk:lq,rarrlp:cq,rarrpl:uq,rarrsim:dq,Rarrtl:hq,rarrtl:fq,rarrw:pq,ratail:mq,rAtail:vq,ratio:gq,rationals:bq,rbarr:yq,rBarr:xq,RBarr:wq,rbbrk:kq,rbrace:Sq,rbrack:Cq,rbrke:Aq,rbrksld:Tq,rbrkslu:_q,Rcaron:Dq,rcaron:zq,Rcedil:Eq,rcedil:Rq,rceil:Mq,rcub:Bq,Rcy:Iq,rcy:Pq,rdca:Nq,rdldhar:qq,rdquo:Fq,rdquor:Lq,rdsh:$q,real:Oq,realine:Uq,realpart:Hq,reals:Vq,Re:jq,rect:Gq,reg:Wq,REG:Xq,ReverseElement:Yq,ReverseEquilibrium:Kq,ReverseUpEquilibrium:Zq,rfisht:Jq,rfloor:Qq,rfr:eF,Rfr:tF,rHar:rF,rhard:nF,rharu:oF,rharul:aF,Rho:iF,rho:sF,rhov:lF,RightAngleBracket:cF,RightArrowBar:uF,rightarrow:dF,RightArrow:hF,Rightarrow:fF,RightArrowLeftArrow:pF,rightarrowtail:mF,RightCeiling:vF,RightDoubleBracket:gF,RightDownTeeVector:bF,RightDownVectorBar:yF,RightDownVector:xF,RightFloor:wF,rightharpoondown:kF,rightharpoonup:SF,rightleftarrows:CF,rightleftharpoons:AF,rightrightarrows:TF,rightsquigarrow:_F,RightTeeArrow:DF,RightTee:zF,RightTeeVector:EF,rightthreetimes:RF,RightTriangleBar:MF,RightTriangle:BF,RightTriangleEqual:IF,RightUpDownVector:PF,RightUpTeeVector:NF,RightUpVectorBar:qF,RightUpVector:FF,RightVectorBar:LF,RightVector:$F,ring:OF,risingdotseq:UF,rlarr:HF,rlhar:VF,rlm:jF,rmoustache:GF,rmoust:WF,rnmid:XF,roang:YF,roarr:KF,robrk:ZF,ropar:JF,ropf:QF,Ropf:eL,roplus:tL,rotimes:rL,RoundImplies:nL,rpar:oL,rpargt:aL,rppolint:iL,rrarr:sL,Rrightarrow:lL,rsaquo:cL,rscr:uL,Rscr:dL,rsh:hL,Rsh:fL,rsqb:pL,rsquo:mL,rsquor:vL,rthree:gL,rtimes:bL,rtri:yL,rtrie:xL,rtrif:wL,rtriltri:kL,RuleDelayed:SL,ruluhar:CL,rx:AL,Sacute:TL,sacute:_L,sbquo:DL,scap:zL,Scaron:EL,scaron:RL,Sc:ML,sc:BL,sccue:IL,sce:PL,scE:NL,Scedil:qL,scedil:FL,Scirc:LL,scirc:$L,scnap:OL,scnE:UL,scnsim:HL,scpolint:VL,scsim:jL,Scy:GL,scy:WL,sdotb:XL,sdot:YL,sdote:KL,searhk:ZL,searr:JL,seArr:QL,searrow:e$,sect:t$,semi:r$,seswar:n$,setminus:o$,setmn:a$,sext:i$,Sfr:s$,sfr:l$,sfrown:c$,sharp:u$,SHCHcy:d$,shchcy:h$,SHcy:f$,shcy:p$,ShortDownArrow:m$,ShortLeftArrow:v$,shortmid:g$,shortparallel:b$,ShortRightArrow:y$,ShortUpArrow:x$,shy:w$,Sigma:k$,sigma:S$,sigmaf:C$,sigmav:A$,sim:T$,simdot:_$,sime:D$,simeq:z$,simg:E$,simgE:R$,siml:M$,simlE:B$,simne:I$,simplus:P$,simrarr:N$,slarr:q$,SmallCircle:F$,smallsetminus:L$,smashp:$$,smeparsl:O$,smid:U$,smile:H$,smt:V$,smte:j$,smtes:G$,SOFTcy:W$,softcy:X$,solbar:Y$,solb:K$,sol:Z$,Sopf:J$,sopf:Q$,spades:eO,spadesuit:tO,spar:rO,sqcap:nO,sqcaps:oO,sqcup:aO,sqcups:iO,Sqrt:sO,sqsub:lO,sqsube:cO,sqsubset:uO,sqsubseteq:dO,sqsup:hO,sqsupe:fO,sqsupset:pO,sqsupseteq:mO,square:vO,Square:gO,SquareIntersection:bO,SquareSubset:yO,SquareSubsetEqual:xO,SquareSuperset:wO,SquareSupersetEqual:kO,SquareUnion:SO,squarf:CO,squ:AO,squf:TO,srarr:_O,Sscr:DO,sscr:zO,ssetmn:EO,ssmile:RO,sstarf:MO,Star:BO,star:IO,starf:PO,straightepsilon:NO,straightphi:qO,strns:FO,sub:LO,Sub:$O,subdot:OO,subE:UO,sube:HO,subedot:VO,submult:jO,subnE:GO,subne:WO,subplus:XO,subrarr:YO,subset:KO,Subset:ZO,subseteq:JO,subseteqq:QO,SubsetEqual:eU,subsetneq:tU,subsetneqq:rU,subsim:nU,subsub:oU,subsup:aU,succapprox:iU,succ:sU,succcurlyeq:lU,Succeeds:cU,SucceedsEqual:uU,SucceedsSlantEqual:dU,SucceedsTilde:hU,succeq:fU,succnapprox:pU,succneqq:mU,succnsim:vU,succsim:gU,SuchThat:bU,sum:yU,Sum:xU,sung:wU,sup1:kU,sup2:SU,sup3:CU,sup:AU,Sup:TU,supdot:_U,supdsub:DU,supE:zU,supe:EU,supedot:RU,Superset:MU,SupersetEqual:BU,suphsol:IU,suphsub:PU,suplarr:NU,supmult:qU,supnE:FU,supne:LU,supplus:$U,supset:OU,Supset:UU,supseteq:HU,supseteqq:VU,supsetneq:jU,supsetneqq:GU,supsim:WU,supsub:XU,supsup:YU,swarhk:KU,swarr:ZU,swArr:JU,swarrow:QU,swnwar:eH,szlig:tH,Tab:rH,target:nH,Tau:oH,tau:aH,tbrk:iH,Tcaron:sH,tcaron:lH,Tcedil:cH,tcedil:uH,Tcy:dH,tcy:hH,tdot:fH,telrec:pH,Tfr:mH,tfr:vH,there4:gH,therefore:bH,Therefore:yH,Theta:xH,theta:wH,thetasym:kH,thetav:SH,thickapprox:CH,thicksim:AH,ThickSpace:TH,ThinSpace:_H,thinsp:DH,thkap:zH,thksim:EH,THORN:RH,thorn:MH,tilde:BH,Tilde:IH,TildeEqual:PH,TildeFullEqual:NH,TildeTilde:qH,timesbar:FH,timesb:LH,times:$H,timesd:OH,tint:UH,toea:HH,topbot:VH,topcir:jH,top:GH,Topf:WH,topf:XH,topfork:YH,tosa:KH,tprime:ZH,trade:JH,TRADE:QH,triangle:eV,triangledown:tV,triangleleft:rV,trianglelefteq:nV,triangleq:oV,triangleright:aV,trianglerighteq:iV,tridot:sV,trie:lV,triminus:cV,TripleDot:uV,triplus:dV,trisb:hV,tritime:fV,trpezium:pV,Tscr:mV,tscr:vV,TScy:gV,tscy:bV,TSHcy:yV,tshcy:xV,Tstrok:wV,tstrok:kV,twixt:SV,twoheadleftarrow:CV,twoheadrightarrow:AV,Uacute:TV,uacute:_V,uarr:DV,Uarr:zV,uArr:EV,Uarrocir:RV,Ubrcy:MV,ubrcy:BV,Ubreve:IV,ubreve:PV,Ucirc:NV,ucirc:qV,Ucy:FV,ucy:LV,udarr:$V,Udblac:OV,udblac:UV,udhar:HV,ufisht:VV,Ufr:jV,ufr:GV,Ugrave:WV,ugrave:XV,uHar:YV,uharl:KV,uharr:ZV,uhblk:JV,ulcorn:QV,ulcorner:ej,ulcrop:tj,ultri:rj,Umacr:nj,umacr:oj,uml:aj,UnderBar:ij,UnderBrace:sj,UnderBracket:lj,UnderParenthesis:cj,Union:uj,UnionPlus:dj,Uogon:hj,uogon:fj,Uopf:pj,uopf:mj,UpArrowBar:vj,uparrow:gj,UpArrow:bj,Uparrow:yj,UpArrowDownArrow:xj,updownarrow:wj,UpDownArrow:kj,Updownarrow:Sj,UpEquilibrium:Cj,upharpoonleft:Aj,upharpoonright:Tj,uplus:_j,UpperLeftArrow:Dj,UpperRightArrow:zj,upsi:Ej,Upsi:Rj,upsih:Mj,Upsilon:Bj,upsilon:Ij,UpTeeArrow:Pj,UpTee:Nj,upuparrows:qj,urcorn:Fj,urcorner:Lj,urcrop:$j,Uring:Oj,uring:Uj,urtri:Hj,Uscr:Vj,uscr:jj,utdot:Gj,Utilde:Wj,utilde:Xj,utri:Yj,utrif:Kj,uuarr:Zj,Uuml:Jj,uuml:Qj,uwangle:eG,vangrt:tG,varepsilon:rG,varkappa:nG,varnothing:oG,varphi:aG,varpi:iG,varpropto:sG,varr:lG,vArr:cG,varrho:uG,varsigma:dG,varsubsetneq:hG,varsubsetneqq:fG,varsupsetneq:pG,varsupsetneqq:mG,vartheta:vG,vartriangleleft:gG,vartriangleright:bG,vBar:yG,Vbar:xG,vBarv:wG,Vcy:kG,vcy:SG,vdash:CG,vDash:AG,Vdash:TG,VDash:_G,Vdashl:DG,veebar:zG,vee:EG,Vee:RG,veeeq:MG,vellip:BG,verbar:IG,Verbar:PG,vert:NG,Vert:qG,VerticalBar:FG,VerticalLine:LG,VerticalSeparator:$G,VerticalTilde:OG,VeryThinSpace:UG,Vfr:HG,vfr:VG,vltri:jG,vnsub:GG,vnsup:WG,Vopf:XG,vopf:YG,vprop:KG,vrtri:ZG,Vscr:JG,vscr:QG,vsubnE:eW,vsubne:tW,vsupnE:rW,vsupne:nW,Vvdash:oW,vzigzag:aW,Wcirc:iW,wcirc:sW,wedbar:lW,wedge:cW,Wedge:uW,wedgeq:dW,weierp:hW,Wfr:fW,wfr:pW,Wopf:mW,wopf:vW,wp:gW,wr:bW,wreath:yW,Wscr:xW,wscr:wW,xcap:kW,xcirc:SW,xcup:CW,xdtri:AW,Xfr:TW,xfr:_W,xharr:DW,xhArr:zW,Xi:EW,xi:RW,xlarr:MW,xlArr:BW,xmap:IW,xnis:PW,xodot:NW,Xopf:qW,xopf:FW,xoplus:LW,xotime:$W,xrarr:OW,xrArr:UW,Xscr:HW,xscr:VW,xsqcup:jW,xuplus:GW,xutri:WW,xvee:XW,xwedge:YW,Yacute:KW,yacute:ZW,YAcy:JW,yacy:QW,Ycirc:eX,ycirc:tX,Ycy:rX,ycy:nX,yen:oX,Yfr:aX,yfr:iX,YIcy:sX,yicy:lX,Yopf:cX,yopf:uX,Yscr:dX,yscr:hX,YUcy:fX,yucy:pX,yuml:mX,Yuml:vX,Zacute:gX,zacute:bX,Zcaron:yX,zcaron:xX,Zcy:wX,zcy:kX,Zdot:SX,zdot:CX,zeetrf:AX,ZeroWidthSpace:TX,Zeta:_X,zeta:DX,zfr:zX,Zfr:EX,ZHcy:RX,zhcy:MX,zigrarr:BX,zopf:IX,Zopf:PX,Zscr:NX,zscr:qX,zwj:FX,zwnj:LX};(function(e){e.exports=$X})(kv);var El=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,xo={},Hc={};function OX(e){var t,n,i=Hc[e];if(i)return i;for(i=Hc[e]=[],t=0;t<128;t++)n=String.fromCharCode(t),/^[0-9a-z]$/i.test(n)?i.push(n):i.push("%"+("0"+t.toString(16).toUpperCase()).slice(-2));for(t=0;t"u"&&(n=!0),h=OX(t),i=0,c=e.length;i=55296&&l<=57343){if(l>=55296&&l<=56319&&i+1=56320&&u<=57343)){f+=encodeURIComponent(e[i]+e[i+1]),i++;continue}f+="%EF%BF%BD";continue}f+=encodeURIComponent(e[i])}return f}bi.defaultChars=";/?:@&=+$,-_.!~*'()#";bi.componentChars="-_.!~*'()";var UX=bi,Vc={};function HX(e){var t,n,i=Vc[e];if(i)return i;for(i=Vc[e]=[],t=0;t<128;t++)n=String.fromCharCode(t),i.push(n);for(t=0;t=55296&&y<=57343?k+="���":k+=String.fromCharCode(y),c+=6;continue}if((u&248)===240&&c+91114111?k+="����":(y-=65536,k+=String.fromCharCode(55296+(y>>10),56320+(y&1023))),c+=9;continue}k+="�"}return k})}yi.defaultChars=";/?:@&=+$,#";yi.componentChars="";var VX=yi,jX=function(t){var n="";return n+=t.protocol||"",n+=t.slashes?"//":"",n+=t.auth?t.auth+"@":"",t.hostname&&t.hostname.indexOf(":")!==-1?n+="["+t.hostname+"]":n+=t.hostname||"",n+=t.port?":"+t.port:"",n+=t.pathname||"",n+=t.search||"",n+=t.hash||"",n};function ci(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var GX=/^([a-z0-9.+-]+:)/i,WX=/:[0-9]*$/,XX=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,YX=["<",">",'"',"`"," ","\r",` -`," "],KX=["{","}","|","\\","^","`"].concat(YX),ZX=["'"].concat(KX),jc=["%","/","?",";","#"].concat(ZX),Gc=["/","?","#"],JX=255,Wc=/^[+a-z0-9A-Z_-]{0,63}$/,QX=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,Xc={javascript:!0,"javascript:":!0},Yc={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function eY(e,t){if(e&&e instanceof ci)return e;var n=new ci;return n.parse(e,t),n}ci.prototype.parse=function(e,t){var n,i,c,l,u,h=e;if(h=h.trim(),!t&&e.split("#").length===1){var f=XX.exec(h);if(f)return this.pathname=f[1],f[2]&&(this.search=f[2]),this}var b=GX.exec(h);if(b&&(b=b[0],c=b.toLowerCase(),this.protocol=b,h=h.substr(b.length)),(t||b||h.match(/^\/\/[^@\/]+@[^@\/]+/))&&(u=h.substr(0,2)==="//",u&&!(b&&Xc[b])&&(h=h.substr(2),this.slashes=!0)),!Xc[b]&&(u||b&&!Yc[b])){var y=-1;for(n=0;n127?E+="x":E+=$[B];if(!E.match(Wc)){var U=P.slice(0,n),q=P.slice(n+1),R=$.match(QX);R&&(U.push(R[1]),q.unshift(R[2])),q.length&&(h=q.join(".")+h),this.hostname=U.join(".");break}}}}this.hostname.length>JX&&(this.hostname=""),L&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var j=h.indexOf("#");j!==-1&&(this.hash=h.substr(j),h=h.slice(0,j));var ie=h.indexOf("?");return ie!==-1&&(this.search=h.substr(ie),h=h.slice(0,ie)),h&&(this.pathname=h),Yc[c]&&this.hostname&&!this.pathname&&(this.pathname=""),this};ci.prototype.parseHost=function(e){var t=WX.exec(e);t&&(t=t[0],t!==":"&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};var tY=eY;xo.encode=UX;xo.decode=VX;xo.format=jX;xo.parse=tY;var $n={},Ps,Kc;function Ud(){return Kc||(Kc=1,Ps=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/),Ps}var Ns,Zc;function Hd(){return Zc||(Zc=1,Ns=/[\0-\x1F\x7F-\x9F]/),Ns}var qs,Jc;function rY(){return Jc||(Jc=1,qs=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/),qs}var Fs,Qc;function Vd(){return Qc||(Qc=1,Fs=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/),Fs}var eu;function nY(){return eu||(eu=1,$n.Any=Ud(),$n.Cc=Hd(),$n.Cf=rY(),$n.P=El,$n.Z=Vd()),$n}(function(e){function t(V){return Object.prototype.toString.call(V)}function n(V){return t(V)==="[object String]"}var i=Object.prototype.hasOwnProperty;function c(V,ae){return i.call(V,ae)}function l(V){var ae=Array.prototype.slice.call(arguments,1);return ae.forEach(function(me){if(me){if(typeof me!="object")throw new TypeError(me+"must be object");Object.keys(me).forEach(function(Ce){V[Ce]=me[Ce]})}}),V}function u(V,ae,me){return[].concat(V.slice(0,ae),me,V.slice(ae+1))}function h(V){return!(V>=55296&&V<=57343||V>=64976&&V<=65007||(V&65535)===65535||(V&65535)===65534||V>=0&&V<=8||V===11||V>=14&&V<=31||V>=127&&V<=159||V>1114111)}function f(V){if(V>65535){V-=65536;var ae=55296+(V>>10),me=56320+(V&1023);return String.fromCharCode(ae,me)}return String.fromCharCode(V)}var b=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,y=/&([a-z#][a-z0-9]{1,31});/gi,k=new RegExp(b.source+"|"+y.source,"gi"),C=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,S=li;function L(V,ae){var me=0;return c(S,ae)?S[ae]:ae.charCodeAt(0)===35&&C.test(ae)&&(me=ae[1].toLowerCase()==="x"?parseInt(ae.slice(2),16):parseInt(ae.slice(1),10),h(me))?f(me):V}function P(V){return V.indexOf("\\")<0?V:V.replace(b,"$1")}function $(V){return V.indexOf("\\")<0&&V.indexOf("&")<0?V:V.replace(k,function(ae,me,Ce){return me||L(ae,Ce)})}var E=/[&<>"]/,B=/[&<>"]/g,M={"&":"&","<":"<",">":">",'"':"""};function U(V){return M[V]}function q(V){return E.test(V)?V.replace(B,U):V}var R=/[.?*+^$[\]\\(){}|-]/g;function j(V){return V.replace(R,"\\$&")}function ie(V){switch(V){case 9:case 32:return!0}return!1}function X(V){if(V>=8192&&V<=8202)return!0;switch(V){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}var oe=El;function Z(V){return oe.test(V)}function ee(V){switch(V){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function ne(V){return V=V.trim().replace(/\s+/g," "),"ẞ".toLowerCase()==="Ṿ"&&(V=V.replace(/ẞ/g,"ß")),V.toLowerCase().toUpperCase()}e.lib={},e.lib.mdurl=xo,e.lib.ucmicro=nY(),e.assign=l,e.isString=n,e.has=c,e.unescapeMd=P,e.unescapeAll=$,e.isValidEntityCode=h,e.fromCodePoint=f,e.escapeHtml=q,e.arrayReplaceAt=u,e.isSpace=ie,e.isWhiteSpace=X,e.isMdAsciiPunct=ee,e.isPunctChar=Z,e.escapeRE=j,e.normalizeReference=ne})(it);var xi={},oY=function(t,n,i){var c,l,u,h,f=-1,b=t.posMax,y=t.pos;for(t.pos=n+1,c=1;t.pos32))return f;if(c===41){if(l===0)break;l--}n++}return h===n||l!==0||(f.str=tu(t.slice(h,n)),f.lines=u,f.pos=n,f.ok=!0),f},iY=it.unescapeAll,sY=function(t,n,i){var c,l,u=0,h=n,f={ok:!1,pos:0,lines:0,str:""};if(n>=i||(l=t.charCodeAt(n),l!==34&&l!==39&&l!==40))return f;for(n++,l===40&&(l=41);n"+Gn(e[t].content)+""};Gr.code_block=function(e,t,n,i,c){var l=e[t];return""+Gn(e[t].content)+` -`};Gr.fence=function(e,t,n,i,c){var l=e[t],u=l.info?cY(l.info).trim():"",h="",f="",b,y,k,C,S;return u&&(k=u.split(/(\s+)/g),h=k[0],f=k.slice(2).join("")),n.highlight?b=n.highlight(l.content,h,f)||Gn(l.content):b=Gn(l.content),b.indexOf(""+b+` -`):"
"+b+`
-`};Gr.image=function(e,t,n,i,c){var l=e[t];return l.attrs[l.attrIndex("alt")][1]=c.renderInlineAsText(l.children,n,i),c.renderToken(e,t,n)};Gr.hardbreak=function(e,t,n){return n.xhtmlOut?`
-`:`
-`};Gr.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?`
-`:`
-`:` -`};Gr.text=function(e,t){return Gn(e[t].content)};Gr.html_block=function(e,t){return e[t].content};Gr.html_inline=function(e,t){return e[t].content};function wo(){this.rules=lY({},Gr)}wo.prototype.renderAttrs=function(t){var n,i,c;if(!t.attrs)return"";for(c="",n=0,i=t.attrs.length;n -`:">",l)};wo.prototype.renderInline=function(e,t,n){for(var i,c="",l=this.rules,u=0,h=e.length;u\s]/i.test(e)}function bY(e){return/^<\/a\s*>/i.test(e)}var yY=function(t){var n,i,c,l,u,h,f,b,y,k,C,S,L,P,$,E,B=t.tokens,M;if(t.md.options.linkify){for(i=0,c=B.length;i=0;n--){if(h=l[n],h.type==="link_close"){for(n--;l[n].level!==h.level&&l[n].type!=="link_open";)n--;continue}if(h.type==="html_inline"&&(gY(h.content)&&L>0&&L--,bY(h.content)&&L++),!(L>0)&&h.type==="text"&&t.md.linkify.test(h.content)){for(y=h.content,M=t.md.linkify.match(y),f=[],S=h.level,C=0,M.length>0&&M[0].index===0&&n>0&&l[n-1].type==="text_special"&&(M=M.slice(1)),b=0;bC&&(u=new t.Token("text","",0),u.content=y.slice(C,k),u.level=S,f.push(u)),u=new t.Token("link_open","a",1),u.attrs=[["href",$]],u.level=S++,u.markup="linkify",u.info="auto",f.push(u),u=new t.Token("text","",0),u.content=E,u.level=S,f.push(u),u=new t.Token("link_close","a",-1),u.level=--S,u.markup="linkify",u.info="auto",f.push(u),C=M[b].lastIndex);C=0;t--)n=e[t],n.type==="text"&&!i&&(n.content=n.content.replace(wY,SY)),n.type==="link_open"&&n.info==="auto"&&i--,n.type==="link_close"&&n.info==="auto"&&i++}function AY(e){var t,n,i=0;for(t=e.length-1;t>=0;t--)n=e[t],n.type==="text"&&!i&&jd.test(n.content)&&(n.content=n.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1—").replace(/(^|\s)--(?=\s|$)/mg,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1–")),n.type==="link_open"&&n.info==="auto"&&i--,n.type==="link_close"&&n.info==="auto"&&i++}var TY=function(t){var n;if(t.md.options.typographer)for(n=t.tokens.length-1;n>=0;n--)t.tokens[n].type==="inline"&&(xY.test(t.tokens[n].content)&&CY(t.tokens[n].children),jd.test(t.tokens[n].content)&&AY(t.tokens[n].children))},ru=it.isWhiteSpace,nu=it.isPunctChar,ou=it.isMdAsciiPunct,_Y=/['"]/,au=/['"]/g,iu="’";function Ua(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function DY(e,t){var n,i,c,l,u,h,f,b,y,k,C,S,L,P,$,E,B,M,U,q,R;for(U=[],n=0;n=0&&!(U[B].level<=f);B--);if(U.length=B+1,i.type==="text"){c=i.content,u=0,h=c.length;e:for(;u=0)y=c.charCodeAt(l.index-1);else for(B=n-1;B>=0&&!(e[B].type==="softbreak"||e[B].type==="hardbreak");B--)if(e[B].content){y=e[B].content.charCodeAt(e[B].content.length-1);break}if(k=32,u=48&&y<=57&&(E=$=!1),$&&E&&($=C,E=S),!$&&!E){M&&(i.content=Ua(i.content,l.index,iu));continue}if(E){for(B=U.length-1;B>=0&&(b=U[B],!(U[B].level=0;n--)t.tokens[n].type!=="inline"||!_Y.test(t.tokens[n].content)||DY(t.tokens[n].children,t)},EY=function(t){var n,i,c,l,u,h,f=t.tokens;for(n=0,i=f.length;n=0&&(i=this.attrs[n][1]),i};ko.prototype.attrJoin=function(t,n){var i=this.attrIndex(t);i<0?this.attrPush([t,n]):this.attrs[i][1]=this.attrs[i][1]+" "+n};var Ml=ko,RY=Ml;function Gd(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}Gd.prototype.Token=RY;var MY=Gd,BY=Rl,Ls=[["normalize",fY],["block",pY],["inline",mY],["linkify",yY],["replacements",TY],["smartquotes",zY],["text_join",EY]];function Bl(){this.ruler=new BY;for(var e=0;ei||(y=n+1,t.sCount[y]=4||(h=t.bMarks[y]+t.tShift[y],h>=t.eMarks[y])||(q=t.src.charCodeAt(h++),q!==124&&q!==45&&q!==58)||h>=t.eMarks[y]||(R=t.src.charCodeAt(h++),R!==124&&R!==45&&R!==58&&!$s(R))||q===45&&$s(R))return!1;for(;h=4||(k=su(u),k.length&&k[0]===""&&k.shift(),k.length&&k[k.length-1]===""&&k.pop(),C=k.length,C===0||C!==L.length))return!1;if(c)return!0;for(B=t.parentType,t.parentType="table",U=t.md.block.ruler.getRules("blockquote"),S=t.push("table_open","table",1),S.map=$=[n,0],S=t.push("thead_open","thead",1),S.map=[n,n+1],S=t.push("tr_open","tr",1),S.map=[n,n+1],f=0;f=4)break;for(k=su(u),k.length&&k[0]===""&&k.shift(),k.length&&k[k.length-1]===""&&k.pop(),y===n+2&&(S=t.push("tbody_open","tbody",1),S.map=E=[n+2,0]),S=t.push("tr_open","tr",1),S.map=[y,y+1],f=0;f=4){c++,l=c;continue}break}return t.line=l,u=t.push("code_block","code",0),u.content=t.getLines(n,l,4+t.blkIndent,!1)+` -`,u.map=[n,t.line],!0},qY=function(t,n,i,c){var l,u,h,f,b,y,k,C=!1,S=t.bMarks[n]+t.tShift[n],L=t.eMarks[n];if(t.sCount[n]-t.blkIndent>=4||S+3>L||(l=t.src.charCodeAt(S),l!==126&&l!==96)||(b=S,S=t.skipChars(S,l),u=S-b,u<3)||(k=t.src.slice(b,S),h=t.src.slice(S,L),l===96&&h.indexOf(String.fromCharCode(l))>=0))return!1;if(c)return!0;for(f=n;f++,!(f>=i||(S=b=t.bMarks[f]+t.tShift[f],L=t.eMarks[f],S=4)&&(S=t.skipChars(S,l),!(S-b=4||t.src.charCodeAt(oe++)!==62)return!1;if(c)return!0;for(f=S=t.sCount[n]+1,t.src.charCodeAt(oe)===32?(oe++,f++,S++,l=!1,U=!0):t.src.charCodeAt(oe)===9?(U=!0,(t.bsCount[n]+S)%4===3?(oe++,f++,S++,l=!1):l=!0):U=!1,L=[t.bMarks[n]],t.bMarks[n]=oe;oe=Z,B=[t.sCount[n]],t.sCount[n]=S-f,M=[t.tShift[n]],t.tShift[n]=oe-t.bMarks[n],R=t.md.block.ruler.getRules("blockquote"),E=t.parentType,t.parentType="blockquote",C=n+1;C=Z));C++){if(t.src.charCodeAt(oe++)===62&&!ie){for(f=S=t.sCount[C]+1,t.src.charCodeAt(oe)===32?(oe++,f++,S++,l=!1,U=!0):t.src.charCodeAt(oe)===9?(U=!0,(t.bsCount[C]+S)%4===3?(oe++,f++,S++,l=!1):l=!0):U=!1,L.push(t.bMarks[C]),t.bMarks[C]=oe;oe=Z,P.push(t.bsCount[C]),t.bsCount[C]=t.sCount[C]+1+(U?1:0),B.push(t.sCount[C]),t.sCount[C]=S-f,M.push(t.tShift[C]),t.tShift[C]=oe-t.bMarks[C];continue}if(y)break;for(q=!1,h=0,b=R.length;h",j.map=k=[n,0],t.md.block.tokenize(t,n,C),j=t.push("blockquote_close","blockquote",-1),j.markup=">",t.lineMax=X,t.parentType=E,k[1]=t.line,h=0;h=4||(l=t.src.charCodeAt(b++),l!==42&&l!==45&&l!==95))return!1;for(u=1;b=l||(n=e.src.charCodeAt(c++),n<48||n>57))return-1;for(;;){if(c>=l)return-1;if(n=e.src.charCodeAt(c++),n>=48&&n<=57){if(c-i>=10)return-1;continue}if(n===41||n===46)break;return-1}return c=4||t.listIndent>=0&&t.sCount[n]-t.listIndent>=4&&t.sCount[n]=t.blkIndent&&(Ce=!0),(Z=uu(t,n))>=0){if(k=!0,ne=t.bMarks[n]+t.tShift[n],E=Number(t.src.slice(ne,Z-1)),Ce&&E!==1)return!1}else if((Z=cu(t,n))>=0)k=!1;else return!1;if(Ce&&t.skipSpaces(Z)>=t.eMarks[n])return!1;if($=t.src.charCodeAt(Z-1),c)return!0;for(P=t.tokens.length,k?(me=t.push("ordered_list_open","ol",1),E!==1&&(me.attrs=[["start",E]])):me=t.push("bullet_list_open","ul",1),me.map=L=[n,0],me.markup=String.fromCharCode($),M=n,ee=!1,ae=t.md.block.ruler.getRules("list"),R=t.parentType,t.parentType="list";M=B?b=1:b=U-y,b>4&&(b=1),f=y+b,me=t.push("list_item_open","li",1),me.markup=String.fromCharCode($),me.map=C=[n,0],k&&(me.info=t.src.slice(ne,Z-1)),X=t.tight,ie=t.tShift[n],j=t.sCount[n],q=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=f,t.tight=!0,t.tShift[n]=u-t.bMarks[n],t.sCount[n]=U,u>=B&&t.isEmpty(n+1)?t.line=Math.min(t.line+2,i):t.md.block.tokenize(t,n,i,!0),(!t.tight||ee)&&(Le=!1),ee=t.line-n>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=q,t.tShift[n]=ie,t.sCount[n]=j,t.tight=X,me=t.push("list_item_close","li",-1),me.markup=String.fromCharCode($),M=n=t.line,C[1]=M,u=t.bMarks[n],M>=i||t.sCount[M]=4)break;for(V=!1,h=0,S=ae.length;h=4||t.src.charCodeAt(R)!==91)return!1;for(;++R3)&&!(t.sCount[ie]<0)){for(B=!1,y=0,k=M.length;y"u"&&(t.env.references={}),typeof t.env.references[C]>"u"&&(t.env.references[C]={title:U,href:b}),t.parentType=L,t.line=n+q+1),!0)},jY=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],wi={},GY="[a-zA-Z_:][a-zA-Z0-9:._-]*",WY="[^\"'=<>`\\x00-\\x20]+",XY="'[^']*'",YY='"[^"]*"',KY="(?:"+WY+"|"+XY+"|"+YY+")",ZY="(?:\\s+"+GY+"(?:\\s*=\\s*"+KY+")?)",Xd="<[A-Za-z][A-Za-z0-9\\-]*"+ZY+"*\\s*\\/?>",Yd="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",JY="|",QY="<[?][\\s\\S]*?[?]>",eK="]*>",tK="",rK=new RegExp("^(?:"+Xd+"|"+Yd+"|"+JY+"|"+QY+"|"+eK+"|"+tK+")"),nK=new RegExp("^(?:"+Xd+"|"+Yd+")");wi.HTML_TAG_RE=rK;wi.HTML_OPEN_CLOSE_TAG_RE=nK;var oK=jY,aK=wi.HTML_OPEN_CLOSE_TAG_RE,so=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(aK.source+"\\s*$"),/^$/,!1]],iK=function(t,n,i,c){var l,u,h,f,b=t.bMarks[n]+t.tShift[n],y=t.eMarks[n];if(t.sCount[n]-t.blkIndent>=4||!t.md.options.html||t.src.charCodeAt(b)!==60)return!1;for(f=t.src.slice(b,y),l=0;l=4||(l=t.src.charCodeAt(b),l!==35||b>=y))return!1;for(u=1,l=t.src.charCodeAt(++b);l===35&&b6||bb&&du(t.src.charCodeAt(h-1))&&(y=h),t.line=n+1,f=t.push("heading_open","h"+String(u),1),f.markup="########".slice(0,u),f.map=[n,t.line],f=t.push("inline","",0),f.content=t.src.slice(b,y).trim(),f.map=[n,t.line],f.children=[],f=t.push("heading_close","h"+String(u),-1),f.markup="########".slice(0,u)),!0)},lK=function(t,n,i){var c,l,u,h,f,b,y,k,C,S=n+1,L,P=t.md.block.ruler.getRules("paragraph");if(t.sCount[n]-t.blkIndent>=4)return!1;for(L=t.parentType,t.parentType="paragraph";S3)){if(t.sCount[S]>=t.blkIndent&&(b=t.bMarks[S]+t.tShift[S],y=t.eMarks[S],b=y)))){k=C===61?1:2;break}if(!(t.sCount[S]<0)){for(l=!1,u=0,h=P.length;u3)&&!(t.sCount[b]<0)){for(c=!1,l=0,u=y.length;l0&&this.level++,this.tokens.push(i),i};Wr.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]};Wr.prototype.skipEmptyLines=function(t){for(var n=this.lineMax;tn;)if(!ki(this.src.charCodeAt(--t)))return t+1;return t};Wr.prototype.skipChars=function(t,n){for(var i=this.src.length;ti;)if(n!==this.src.charCodeAt(--t))return t+1;return t};Wr.prototype.getLines=function(t,n,i,c){var l,u,h,f,b,y,k,C=t;if(t>=n)return"";for(y=new Array(n-t),l=0;Ci?y[l]=new Array(u-i+1).join(" ")+this.src.slice(f,b):y[l]=this.src.slice(f,b)}return y.join("")};Wr.prototype.Token=Kd;var uK=Wr,dK=Rl,Va=[["table",PY,["paragraph","reference"]],["code",NY],["fence",qY,["paragraph","reference","blockquote","list"]],["blockquote",FY,["paragraph","reference","blockquote","list"]],["hr",$Y,["paragraph","reference","blockquote","list"]],["list",UY,["paragraph","reference","blockquote"]],["reference",VY],["html_block",iK,["paragraph","reference","blockquote"]],["heading",sK,["paragraph","reference","blockquote"]],["lheading",lK],["paragraph",cK]];function Si(){this.ruler=new dK;for(var e=0;e=n||e.sCount[h]=b){e.line=n;break}for(c=0;c0||(i=t.pos,c=t.posMax,i+3>c)||t.src.charCodeAt(i)!==58||t.src.charCodeAt(i+1)!==47||t.src.charCodeAt(i+2)!==47||(l=t.pending.match(mK),!l)||(u=l[1],h=t.md.linkify.matchAtStart(t.src.slice(i-u.length)),!h)||(f=h.url,f=f.replace(/\*+$/,""),b=t.md.normalizeLink(f),!t.md.validateLink(b))?!1:(n||(t.pending=t.pending.slice(0,-u.length),y=t.push("link_open","a",1),y.attrs=[["href",b]],y.markup="linkify",y.info="auto",y=t.push("text","",0),y.content=t.md.normalizeLinkText(f),y=t.push("link_close","a",-1),y.markup="linkify",y.info="auto"),t.pos+=f.length-u.length,!0)},gK=it.isSpace,bK=function(t,n){var i,c,l,u=t.pos;if(t.src.charCodeAt(u)!==10)return!1;if(i=t.pending.length-1,c=t.posMax,!n)if(i>=0&&t.pending.charCodeAt(i)===32)if(i>=1&&t.pending.charCodeAt(i-1)===32){for(l=i-1;l>=1&&t.pending.charCodeAt(l-1)===32;)l--;t.pending=t.pending.slice(0,l),t.push("hardbreak","br",0)}else t.pending=t.pending.slice(0,-1),t.push("softbreak","br",0);else t.push("softbreak","br",0);for(u++;u?@[]^_`{|}~-".split("").forEach(function(e){Il[e.charCodeAt(0)]=1});var xK=function(t,n){var i,c,l,u,h,f=t.pos,b=t.posMax;if(t.src.charCodeAt(f)!==92||(f++,f>=b))return!1;if(i=t.src.charCodeAt(f),i===10){for(n||t.push("hardbreak","br",0),f++;f=55296&&i<=56319&&f+1=56320&&c<=57343&&(u+=t.src[f+1],f++)),l="\\"+u,n||(h=t.push("text_special","",0),i<256&&Il[i]!==0?h.content=u:h.content=l,h.markup=l,h.info="escape"),t.pos=f+1,!0},wK=function(t,n){var i,c,l,u,h,f,b,y,k=t.pos,C=t.src.charCodeAt(k);if(C!==96)return!1;for(i=k,k++,c=t.posMax;k=0;n--)i=t[n],!(i.marker!==95&&i.marker!==42)&&i.end!==-1&&(c=t[i.end],h=n>0&&t[n-1].end===i.end+1&&t[n-1].marker===i.marker&&t[n-1].token===i.token-1&&t[i.end+1].token===c.token+1,u=String.fromCharCode(i.marker),l=e.tokens[i.token],l.type=h?"strong_open":"em_open",l.tag=h?"strong":"em",l.nesting=1,l.markup=h?u+u:u,l.content="",l=e.tokens[c.token],l.type=h?"strong_close":"em_close",l.tag=h?"strong":"em",l.nesting=-1,l.markup=h?u+u:u,l.content="",h&&(e.tokens[t[n-1].token].content="",e.tokens[t[i.end+1].token].content="",n--))}Ai.postProcess=function(t){var n,i=t.tokens_meta,c=t.tokens_meta.length;for(pu(t,t.delimiters),n=0;n=P)return!1;if($=f,b=t.md.helpers.parseLinkDestination(t.src,f,t.posMax),b.ok){for(C=t.md.normalizeLink(b.str),t.md.validateLink(C)?f=b.pos:C="",$=f;f=P||t.src.charCodeAt(f)!==41)&&(E=!0),f++}if(E){if(typeof t.env.references>"u")return!1;if(f=0?l=t.src.slice($,f++):f=u+1):f=u+1,l||(l=t.src.slice(h,u)),y=t.env.references[kK(l)],!y)return t.pos=L,!1;C=y.href,S=y.title}return n||(t.pos=h,t.posMax=u,k=t.push("link_open","a",1),k.attrs=i=[["href",C]],S&&i.push(["title",S]),t.linkLevel++,t.md.inline.tokenize(t),t.linkLevel--,k=t.push("link_close","a",-1)),t.pos=f,t.posMax=P,!0},CK=it.normalizeReference,Hs=it.isSpace,AK=function(t,n){var i,c,l,u,h,f,b,y,k,C,S,L,P,$="",E=t.pos,B=t.posMax;if(t.src.charCodeAt(t.pos)!==33||t.src.charCodeAt(t.pos+1)!==91||(f=t.pos+2,h=t.md.helpers.parseLinkLabel(t,t.pos+1,!1),h<0))return!1;if(b=h+1,b=B)return!1;for(P=b,k=t.md.helpers.parseLinkDestination(t.src,b,t.posMax),k.ok&&($=t.md.normalizeLink(k.str),t.md.validateLink($)?b=k.pos:$=""),P=b;b=B||t.src.charCodeAt(b)!==41)return t.pos=E,!1;b++}else{if(typeof t.env.references>"u")return!1;if(b=0?u=t.src.slice(P,b++):b=h+1):b=h+1,u||(u=t.src.slice(f,h)),y=t.env.references[CK(u)],!y)return t.pos=E,!1;$=y.href,C=y.title}return n||(l=t.src.slice(f,h),t.md.inline.parse(l,t.md,t.env,L=[]),S=t.push("image","img",0),S.attrs=i=[["src",$],["alt",""]],S.children=L,S.content=l,C&&i.push(["title",C])),t.pos=b,t.posMax=B,!0},TK=/^([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,_K=/^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$/,DK=function(t,n){var i,c,l,u,h,f,b=t.pos;if(t.src.charCodeAt(b)!==60)return!1;for(h=t.pos,f=t.posMax;;){if(++b>=f||(u=t.src.charCodeAt(b),u===60))return!1;if(u===62)break}return i=t.src.slice(h+1,b),_K.test(i)?(c=t.md.normalizeLink(i),t.md.validateLink(c)?(n||(l=t.push("link_open","a",1),l.attrs=[["href",c]],l.markup="autolink",l.info="auto",l=t.push("text","",0),l.content=t.md.normalizeLinkText(i),l=t.push("link_close","a",-1),l.markup="autolink",l.info="auto"),t.pos+=i.length+2,!0):!1):TK.test(i)?(c=t.md.normalizeLink("mailto:"+i),t.md.validateLink(c)?(n||(l=t.push("link_open","a",1),l.attrs=[["href",c]],l.markup="autolink",l.info="auto",l=t.push("text","",0),l.content=t.md.normalizeLinkText(i),l=t.push("link_close","a",-1),l.markup="autolink",l.info="auto"),t.pos+=i.length+2,!0):!1):!1},zK=wi.HTML_TAG_RE;function EK(e){return/^\s]/i.test(e)}function RK(e){return/^<\/a\s*>/i.test(e)}function MK(e){var t=e|32;return t>=97&&t<=122}var BK=function(t,n){var i,c,l,u,h=t.pos;return!t.md.options.html||(l=t.posMax,t.src.charCodeAt(h)!==60||h+2>=l)||(i=t.src.charCodeAt(h+1),i!==33&&i!==63&&i!==47&&!MK(i))||(c=t.src.slice(h).match(zK),!c)?!1:(n||(u=t.push("html_inline","",0),u.content=t.src.slice(h,h+c[0].length),EK(u.content)&&t.linkLevel++,RK(u.content)&&t.linkLevel--),t.pos+=c[0].length,!0)},mu=li,IK=it.has,PK=it.isValidEntityCode,vu=it.fromCodePoint,NK=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,qK=/^&([a-z][a-z0-9]{1,31});/i,FK=function(t,n){var i,c,l,u,h=t.pos,f=t.posMax;if(t.src.charCodeAt(h)!==38||h+1>=f)return!1;if(i=t.src.charCodeAt(h+1),i===35){if(l=t.src.slice(h).match(NK),l)return n||(c=l[1][0].toLowerCase()==="x"?parseInt(l[1].slice(1),16):parseInt(l[1],10),u=t.push("text_special","",0),u.content=PK(c)?vu(c):vu(65533),u.markup=l[0],u.info="entity"),t.pos+=l[0].length,!0}else if(l=t.src.slice(h).match(qK),l&&IK(mu,l[1]))return n||(u=t.push("text_special","",0),u.content=mu[l[1]],u.markup=l[0],u.info="entity"),t.pos+=l[0].length,!0;return!1};function gu(e,t){var n,i,c,l,u,h,f,b,y={},k=t.length;if(k){var C=0,S=-2,L=[];for(n=0;nu;i-=L[i]+1)if(l=t[i],l.marker===c.marker&&l.open&&l.end<0&&(f=!1,(l.close||c.open)&&(l.length+c.length)%3===0&&(l.length%3!==0||c.length%3!==0)&&(f=!0),!f)){b=i>0&&!t[i-1].open?L[i-1]+1:0,L[n]=n-i+b,L[i]=b,c.open=!1,l.end=n,l.close=!1,h=-1,S=-2;break}h!==-1&&(y[c.marker][(c.open?3:0)+(c.length||0)%3]=h)}}}var LK=function(t){var n,i=t.tokens_meta,c=t.tokens_meta.length;for(gu(t,t.delimiters),n=0;n0&&c++,l[n].type==="text"&&n+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],c={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(i),this.tokens_meta.push(c),i};oa.prototype.scanDelims=function(e,t){var n=e,i,c,l,u,h,f,b,y,k,C=!0,S=!0,L=this.posMax,P=this.src.charCodeAt(e);for(i=e>0?this.src.charCodeAt(e-1):32;n=l)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};aa.prototype.parse=function(e,t,n,i){var c,l,u,h=new this.State(e,t,n,i);for(this.tokenize(h),l=this.ruler2.getRules(""),u=l.length,c=0;c|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}),Gs}function ml(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach(function(n){n&&Object.keys(n).forEach(function(i){e[i]=n[i]})}),e}function Ti(e){return Object.prototype.toString.call(e)}function VK(e){return Ti(e)==="[object String]"}function jK(e){return Ti(e)==="[object Object]"}function GK(e){return Ti(e)==="[object RegExp]"}function Su(e){return Ti(e)==="[object Function]"}function WK(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var Zd={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function XK(e){return Object.keys(e||{}).reduce(function(t,n){return t||Zd.hasOwnProperty(n)},!1)}var YK={"http:":{validate:function(e,t,n){var i=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(i)?i.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){var i=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(i)?t>=3&&e[t-3]===":"||t>=3&&e[t-3]==="/"?0:i.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){var i=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(i)?i.match(n.re.mailto)[0].length:0}}},KK="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",ZK="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function JK(e){e.__index__=-1,e.__text_cache__=""}function QK(e){return function(t,n){var i=t.slice(n);return e.test(i)?i.match(e)[0].length:0}}function Cu(){return function(e,t){t.normalize(e)}}function ui(e){var t=e.re=HK()(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(KK),n.push(t.src_xn),t.src_tlds=n.join("|");function i(h){return h.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(i(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(i(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(i(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(i(t.tpl_host_fuzzy_test),"i");var c=[];e.__compiled__={};function l(h,f){throw new Error('(LinkifyIt) Invalid schema "'+h+'": '+f)}Object.keys(e.__schemas__).forEach(function(h){var f=e.__schemas__[h];if(f!==null){var b={validate:null,link:null};if(e.__compiled__[h]=b,jK(f)){GK(f.validate)?b.validate=QK(f.validate):Su(f.validate)?b.validate=f.validate:l(h,f),Su(f.normalize)?b.normalize=f.normalize:f.normalize?l(h,f):b.normalize=Cu();return}if(VK(f)){c.push(h);return}l(h,f)}}),c.forEach(function(h){e.__compiled__[e.__schemas__[h]]&&(e.__compiled__[h].validate=e.__compiled__[e.__schemas__[h]].validate,e.__compiled__[h].normalize=e.__compiled__[e.__schemas__[h]].normalize)}),e.__compiled__[""]={validate:null,normalize:Cu()};var u=Object.keys(e.__compiled__).filter(function(h){return h.length>0&&e.__compiled__[h]}).map(WK).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+u+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+u+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),JK(e)}function eZ(e,t){var n=e.__index__,i=e.__last_index__,c=e.__text_cache__.slice(n,i);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=i+t,this.raw=c,this.text=c,this.url=c}function vl(e,t){var n=new eZ(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function ur(e,t){if(!(this instanceof ur))return new ur(e,t);t||XK(e)&&(t=e,e={}),this.__opts__=ml({},Zd,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=ml({},YK,e),this.__compiled__={},this.__tlds__=ZK,this.__tlds_replaced__=!1,this.re={},ui(this)}ur.prototype.add=function(t,n){return this.__schemas__[t]=n,ui(this),this};ur.prototype.set=function(t){return this.__opts__=ml(this.__opts__,t),this};ur.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var n,i,c,l,u,h,f,b,y;if(this.re.schema_test.test(t)){for(f=this.re.schema_search,f.lastIndex=0;(n=f.exec(t))!==null;)if(l=this.testSchemaAt(t,n[2],f.lastIndex),l){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+l;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(b=t.search(this.re.host_fuzzy_test),b>=0&&(this.__index__<0||b=0&&(c=t.match(this.re.email_fuzzy))!==null&&(u=c.index+c[1].length,h=c.index+c[0].length,(this.__index__<0||uthis.__last_index__)&&(this.__schema__="mailto:",this.__index__=u,this.__last_index__=h))),this.__index__>=0};ur.prototype.pretest=function(t){return this.re.pretest.test(t)};ur.prototype.testSchemaAt=function(t,n,i){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,i,this):0};ur.prototype.match=function(t){var n=0,i=[];this.__index__>=0&&this.__text_cache__===t&&(i.push(vl(this,n)),n=this.__last_index__);for(var c=n?t.slice(n):t;this.test(c);)i.push(vl(this,n)),c=c.slice(this.__last_index__),n+=this.__last_index__;return i.length?i:null};ur.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;var n=this.re.schema_at_start.exec(t);if(!n)return null;var i=this.testSchemaAt(t,n[2],n[0].length);return i?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+i,vl(this,0)):null};ur.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(i,c,l){return i!==l[c-1]}).reverse(),ui(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,ui(this),this)};ur.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};ur.prototype.onCompile=function(){};var tZ=ur;const mo=2147483647,Or=36,Nl=1,Xo=26,rZ=38,nZ=700,Jd=72,Qd=128,eh="-",oZ=/^xn--/,aZ=/[^\0-\x7F]/,iZ=/[\x2E\u3002\uFF0E\uFF61]/g,sZ={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Ws=Or-Nl,Ur=Math.floor,Xs=String.fromCharCode;function yn(e){throw new RangeError(sZ[e])}function lZ(e,t){const n=[];let i=e.length;for(;i--;)n[i]=t(e[i]);return n}function th(e,t){const n=e.split("@");let i="";n.length>1&&(i=n[0]+"@",e=n[1]),e=e.replace(iZ,".");const c=e.split("."),l=lZ(c,t).join(".");return i+l}function ql(e){const t=[];let n=0;const i=e.length;for(;n=55296&&c<=56319&&nString.fromCodePoint(...e),cZ=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:Or},Au=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},nh=function(e,t,n){let i=0;for(e=n?Ur(e/nZ):e>>1,e+=Ur(e/t);e>Ws*Xo>>1;i+=Or)e=Ur(e/Ws);return Ur(i+(Ws+1)*e/(e+rZ))},Fl=function(e){const t=[],n=e.length;let i=0,c=Qd,l=Jd,u=e.lastIndexOf(eh);u<0&&(u=0);for(let h=0;h=128&&yn("not-basic"),t.push(e.charCodeAt(h));for(let h=u>0?u+1:0;h=n&&yn("invalid-input");const C=cZ(e.charCodeAt(h++));C>=Or&&yn("invalid-input"),C>Ur((mo-i)/y)&&yn("overflow"),i+=C*y;const S=k<=l?Nl:k>=l+Xo?Xo:k-l;if(CUr(mo/L)&&yn("overflow"),y*=L}const b=t.length+1;l=nh(i-f,b,f==0),Ur(i/b)>mo-c&&yn("overflow"),c+=Ur(i/b),i%=b,t.splice(i++,0,c)}return String.fromCodePoint(...t)},Ll=function(e){const t=[];e=ql(e);const n=e.length;let i=Qd,c=0,l=Jd;for(const f of e)f<128&&t.push(Xs(f));const u=t.length;let h=u;for(u&&t.push(eh);h=i&&yUr((mo-c)/b)&&yn("overflow"),c+=(f-i)*b,i=f;for(const y of e)if(ymo&&yn("overflow"),y===i){let k=c;for(let C=Or;;C+=Or){const S=C<=l?Nl:C>=l+Xo?Xo:C-l;if(k=0))try{t.hostname=ih.toASCII(t.hostname)}catch{}return Un.encode(Un.format(t))}function _Z(e){var t=Un.parse(e,!0);if(t.hostname&&(!t.protocol||sh.indexOf(t.protocol)>=0))try{t.hostname=ih.toUnicode(t.hostname)}catch{}return Un.decode(Un.format(t),Un.decode.defaultChars+"%")}function wr(e,t){if(!(this instanceof wr))return new wr(e,t);t||Ho.isString(e)||(t=e||{},e="default"),this.inline=new xZ,this.block=new yZ,this.core=new bZ,this.renderer=new gZ,this.linkify=new wZ,this.validateLink=AZ,this.normalizeLink=TZ,this.normalizeLinkText=_Z,this.utils=Ho,this.helpers=Ho.assign({},vZ),this.options={},this.configure(e),t&&this.set(t)}wr.prototype.set=function(e){return Ho.assign(this.options,e),this};wr.prototype.configure=function(e){var t=this,n;if(Ho.isString(e)&&(n=e,e=kZ[n],!e))throw new Error('Wrong `markdown-it` preset "'+n+'", check name');if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(i){e.components[i].rules&&t[i].ruler.enableOnly(e.components[i].rules),e.components[i].rules2&&t[i].ruler2.enableOnly(e.components[i].rules2)}),this};wr.prototype.enable=function(e,t){var n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(c){n=n.concat(this[c].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));var i=e.filter(function(c){return n.indexOf(c)<0});if(i.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+i);return this};wr.prototype.disable=function(e,t){var n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(c){n=n.concat(this[c].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));var i=e.filter(function(c){return n.indexOf(c)<0});if(i.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+i);return this};wr.prototype.use=function(e){var t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};wr.prototype.parse=function(e,t){if(typeof e!="string")throw new Error("Input data should be a String");var n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};wr.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};wr.prototype.parseInline=function(e,t){var n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};wr.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var DZ=wr;(function(e){e.exports=DZ})(wv);var Tu={},zZ={get exports(){return Tu},set exports(e){Tu=e}};(function(e,t){(function(i,c){e.exports=c()})(typeof self<"u"?self:Af,function(){return function(){var n={};(function(){n.d=function(m,r){for(var o in r)n.o(r,o)&&!n.o(m,o)&&Object.defineProperty(m,o,{enumerable:!0,get:r[o]})}})(),function(){n.o=function(m,r){return Object.prototype.hasOwnProperty.call(m,r)}}();var i={};n.d(i,{default:function(){return B1}});var c=function m(r,o){this.position=void 0;var a="KaTeX parse error: "+r,s,d=o&&o.loc;if(d&&d.start<=d.end){var v=d.lexer.input;s=d.start;var x=d.end;s===v.length?a+=" at end of input: ":a+=" at position "+(s+1)+": ";var A=v.slice(s,x).replace(/[^]/g,"$&̲"),z;s>15?z="…"+v.slice(s-15,s):z=v.slice(0,s);var F;x+15":">","<":"<",'"':""","'":"'"},k=/[&><"']/g;function C(m){return String(m).replace(k,function(r){return y[r]})}var S=function m(r){return r.type==="ordgroup"||r.type==="color"?r.body.length===1?m(r.body[0]):r:r.type==="font"?m(r.body):r},L=function(r){var o=S(r);return o.type==="mathord"||o.type==="textord"||o.type==="atom"},P=function(r){if(!r)throw new Error("Expected non-null, but got "+String(r));return r},$=function(r){var o=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(r);return o!=null?o[1]:"_relative"},E={contains:u,deflt:h,escape:C,hyphenate:b,getBaseElem:S,isCharacterBox:L,protocolFromUrl:$},B={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:function(r){return"#"+r}},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:function(r,o){return o.push(r),o}},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:function(r){return Math.max(0,r)},cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:function(r){return Math.max(0,r)},cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:function(r){return Math.max(0,r)},cli:"-e, --max-expand ",cliProcessor:function(r){return r==="Infinity"?1/0:parseInt(r)}},globalGroup:{type:"boolean",cli:!1}};function M(m){if(m.default)return m.default;var r=m.type,o=Array.isArray(r)?r[0]:r;if(typeof o!="string")return o.enum[0];switch(o){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var U=function(){function m(o){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,o=o||{};for(var a in B)if(B.hasOwnProperty(a)){var s=B[a];this[a]=o[a]!==void 0?s.processor?s.processor(o[a]):o[a]:M(s)}}var r=m.prototype;return r.reportNonstrict=function(a,s,d){var v=this.strict;if(typeof v=="function"&&(v=v(a,s,d)),!(!v||v==="ignore")){if(v===!0||v==="error")throw new l("LaTeX-incompatible input and strict mode is set to 'error': "+(s+" ["+a+"]"),d);v==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(s+" ["+a+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+v+"': "+s+" ["+a+"]"))}},r.useStrictBehavior=function(a,s,d){var v=this.strict;if(typeof v=="function")try{v=v(a,s,d)}catch{v="error"}return!v||v==="ignore"?!1:v===!0||v==="error"?!0:v==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(s+" ["+a+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+v+"': "+s+" ["+a+"]")),!1)},r.isTrusted=function(a){a.url&&!a.protocol&&(a.protocol=E.protocolFromUrl(a.url));var s=typeof this.trust=="function"?this.trust(a):this.trust;return!!s},m}(),q=function(){function m(o,a,s){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=o,this.size=a,this.cramped=s}var r=m.prototype;return r.sup=function(){return V[ae[this.id]]},r.sub=function(){return V[me[this.id]]},r.fracNum=function(){return V[Ce[this.id]]},r.fracDen=function(){return V[Le[this.id]]},r.cramp=function(){return V[ht[this.id]]},r.text=function(){return V[gt[this.id]]},r.isTight=function(){return this.size>=2},m}(),R=0,j=1,ie=2,X=3,oe=4,Z=5,ee=6,ne=7,V=[new q(R,0,!1),new q(j,0,!0),new q(ie,1,!1),new q(X,1,!0),new q(oe,2,!1),new q(Z,2,!0),new q(ee,3,!1),new q(ne,3,!0)],ae=[oe,Z,oe,Z,ee,ne,ee,ne],me=[Z,Z,Z,Z,ne,ne,ne,ne],Ce=[ie,X,oe,Z,ee,ne,ee,ne],Le=[X,X,Z,Z,ne,ne,ne,ne],ht=[j,j,X,X,Z,Z,ne,ne],gt=[R,j,ie,X,ie,X,ie,X],De={DISPLAY:V[R],TEXT:V[ie],SCRIPT:V[oe],SCRIPTSCRIPT:V[ee]},ve=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];function Ee(m){for(var r=0;r=s[0]&&m<=s[1])return o.name}return null}var Se=[];ve.forEach(function(m){return m.blocks.forEach(function(r){return Se.push.apply(Se,r)})});function Ze(m){for(var r=0;r=Se[r]&&m<=Se[r+1])return!0;return!1}var Be=80,Ye=function(r,o){return"M95,"+(622+r+o)+` -c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 -c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 -c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 -s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 -c69,-144,104.5,-217.7,106.5,-221 -l`+r/2.075+" -"+r+` -c5.3,-9.3,12,-14,20,-14 -H400000v`+(40+r)+`H845.2724 -s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 -c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z -M`+(834+r)+" "+o+"h400000v"+(40+r)+"h-400000z"},wt=function(r,o){return"M263,"+(601+r+o)+`c0.7,0,18,39.7,52,119 -c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 -c340,-704.7,510.7,-1060.3,512,-1067 -l`+r/2.084+" -"+r+` -c4.7,-7.3,11,-11,19,-11 -H40000v`+(40+r)+`H1012.3 -s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 -c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 -s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 -c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z -M`+(1001+r)+" "+o+"h400000v"+(40+r)+"h-400000z"},Rr=function(r,o){return"M983 "+(10+r+o)+` -l`+r/3.13+" -"+r+` -c4,-6.7,10,-10,18,-10 H400000v`+(40+r)+` -H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 -s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 -c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 -c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 -c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 -c53.7,-170.3,84.5,-266.8,92.5,-289.5z -M`+(1001+r)+" "+o+"h400000v"+(40+r)+"h-400000z"},hr=function(r,o){return"M424,"+(2398+r+o)+` -c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 -c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 -s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 -s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 -l`+r/4.223+" -"+r+`c4,-6.7,10,-10,18,-10 H400000 -v`+(40+r)+`H1014.6 -s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 -c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2z M`+(1001+r)+" "+o+` -h400000v`+(40+r)+"h-400000z"},Mr=function(r,o){return"M473,"+(2713+r+o)+` -c339.3,-1799.3,509.3,-2700,510,-2702 l`+r/5.298+" -"+r+` -c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+r)+`H1017.7 -s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 -c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 -s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, -606zM`+(1001+r)+" "+o+"h400000v"+(40+r)+"H1017.7z"},Xr=function(r){var o=r/2;return"M400000 "+r+" H0 L"+o+" 0 l65 45 L145 "+(r-80)+" H400000z"},ln=function(r,o,a){var s=a-54-o-r;return"M702 "+(r+o)+"H400000"+(40+r)+` -H742v`+s+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 -h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 -c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 -219 661 l218 661zM702 `+o+"H400000v"+(40+r)+"H742z"},cn=function(r,o,a){o=1e3*o;var s="";switch(r){case"sqrtMain":s=Ye(o,Be);break;case"sqrtSize1":s=wt(o,Be);break;case"sqrtSize2":s=Rr(o,Be);break;case"sqrtSize3":s=hr(o,Be);break;case"sqrtSize4":s=Mr(o,Be);break;case"sqrtTall":s=ln(o,Be,a)}return s},Xt=function(r,o){switch(r){case"⎜":return"M291 0 H417 V"+o+" H291z M291 0 H417 V"+o+" H291z";case"∣":return"M145 0 H188 V"+o+" H145z M145 0 H188 V"+o+" H145z";case"∥":return"M145 0 H188 V"+o+" H145z M145 0 H188 V"+o+" H145z"+("M367 0 H410 V"+o+" H367z M367 0 H410 V"+o+" H367z");case"⎟":return"M457 0 H583 V"+o+" H457z M457 0 H583 V"+o+" H457z";case"⎢":return"M319 0 H403 V"+o+" H319z M319 0 H403 V"+o+" H319z";case"⎥":return"M263 0 H347 V"+o+" H263z M263 0 H347 V"+o+" H263z";case"⎪":return"M384 0 H504 V"+o+" H384z M384 0 H504 V"+o+" H384z";case"⏐":return"M312 0 H355 V"+o+" H312z M312 0 H355 V"+o+" H312z";case"‖":return"M257 0 H300 V"+o+" H257z M257 0 H300 V"+o+" H257z"+("M478 0 H521 V"+o+" H478z M478 0 H521 V"+o+" H478z");default:return""}},ue={doubleleftarrow:`M262 157 -l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 - 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 - 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 -c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 - 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 --86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 --2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z -m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l --10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 - 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 --33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 --17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 --13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 -c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 --107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 - 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 --5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 -c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 - 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 - 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 - l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 --45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 - 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 - 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 - 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 --331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 -H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 - 435 0h399565z`,leftgroupunder:`M400000 262 -H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 - 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 --3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 --18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 --196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 - 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 --4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 --10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z -m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 - 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 - 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 --152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 - 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 --2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 -v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 --83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 --68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 - 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z -M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z -M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 --.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 -c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 - 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z -M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 -c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 --53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 - 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 - 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 -c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 - 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 - 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 --5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 --320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z -m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 -60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 --451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z -m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 -c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 --480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z -m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 -85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 --707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z -m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 -c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 --16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 - 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 - 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 --40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 --12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 - 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l --6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 -s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 -c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 - 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 --174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 - 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 - 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 --3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 --10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 - 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 --18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 - 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z -m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 - 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 --7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 --27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 - 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 - 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 --64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z -m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 - 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 --13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 - 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z -M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 - 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 --52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 --167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 - 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 --70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 --40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 --37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 - 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 -c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 - 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 - 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 --19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 - 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 --2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 - 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 - 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 --68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 --8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 - 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 -c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 - 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 --11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 - 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 - 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 - -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 --11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 - 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 - 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 - -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 -3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 -10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 --1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 --7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 -H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 -c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 -c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, --5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 -c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 -c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 -s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 -121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 -s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 -c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z -M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 --27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 -13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 --84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 --119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 --12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 -151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 -c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 -c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 -c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 -c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z -M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 -c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, --231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 -c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z -M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 -c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, -1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, --152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z -M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 -c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, --231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 -c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z -M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},Te=function(r,o){switch(r){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+o+` v1759 h347 v-84 -H403z M403 1759 V0 H319 V1759 v`+o+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+o+` v1759 H0 v84 H347z -M347 1759 V0 H263 V1759 v`+o+" v1759 h84z";case"vert":return"M145 15 v585 v"+o+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-o+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+o+" v585 h43z";case"doublevert":return"M145 15 v585 v"+o+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-o+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+o+` v585 h43z -M367 15 v585 v`+o+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-o+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+o+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+o+` v1715 h263 v84 H319z -MM319 602 V0 H403 V602 v`+o+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+o+` v1799 H0 v-84 H319z -MM319 602 V0 H403 V602 v`+o+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+o+` v602 h84z -M403 1759 V0 H319 V1759 v`+o+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+o+` v602 h84z -M347 1759 V0 h-84 V1759 v`+o+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 -c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, --36,557 l0,`+(o+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, -949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 -c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, --544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 -l0,-`+(o+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, --210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, -63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 -c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(o+9)+` -c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 -c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 -c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 -c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 -l0,-`+(o+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, --470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},Y=function(){function m(o){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=o,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var r=m.prototype;return r.hasClass=function(a){return E.contains(this.classes,a)},r.toNode=function(){for(var a=document.createDocumentFragment(),s=0;s=5?r=0:m>=3?r=1:r=2,!Pt[r]){var o=Pt[r]={cssEmPerMu:je.quad[r]/18};for(var a in je)je.hasOwnProperty(a)&&(o[a]=je[a][r])}return Pt[r]}var Sr=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],Yn=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Kn=function(r,o){return o.size<2?r:Sr[r-1][o.size-1]},ia=function(){function m(o){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=o.style,this.color=o.color,this.size=o.size||m.BASESIZE,this.textSize=o.textSize||this.size,this.phantom=!!o.phantom,this.font=o.font||"",this.fontFamily=o.fontFamily||"",this.fontWeight=o.fontWeight||"",this.fontShape=o.fontShape||"",this.sizeMultiplier=Yn[this.size-1],this.maxSize=o.maxSize,this.minRuleThickness=o.minRuleThickness,this._fontMetrics=void 0}var r=m.prototype;return r.extend=function(a){var s={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var d in a)a.hasOwnProperty(d)&&(s[d]=a[d]);return new m(s)},r.havingStyle=function(a){return this.style===a?this:this.extend({style:a,size:Kn(this.textSize,a)})},r.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},r.havingSize=function(a){return this.size===a&&this.textSize===a?this:this.extend({style:this.style.text(),size:a,textSize:a,sizeMultiplier:Yn[a-1]})},r.havingBaseStyle=function(a){a=a||this.style.text();var s=Kn(m.BASESIZE,a);return this.size===s&&this.textSize===m.BASESIZE&&this.style===a?this:this.extend({style:a,size:s})},r.havingBaseSizing=function(){var a;switch(this.style.id){case 4:case 5:a=3;break;case 6:case 7:a=1;break;default:a=6}return this.extend({style:this.style.text(),size:a})},r.withColor=function(a){return this.extend({color:a})},r.withPhantom=function(){return this.extend({phantom:!0})},r.withFont=function(a){return this.extend({font:a})},r.withTextFontFamily=function(a){return this.extend({fontFamily:a,font:""})},r.withTextFontWeight=function(a){return this.extend({fontWeight:a,font:""})},r.withTextFontShape=function(a){return this.extend({fontShape:a,font:""})},r.sizingClasses=function(a){return a.size!==this.size?["sizing","reset-size"+a.size,"size"+this.size]:[]},r.baseSizingClasses=function(){return this.size!==m.BASESIZE?["sizing","reset-size"+this.size,"size"+m.BASESIZE]:[]},r.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=Nt(this.size)),this._fontMetrics},r.getColor=function(){return this.phantom?"transparent":this.color},m}();ia.BASESIZE=6;var Di=ia,So={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},zi={ex:!0,em:!0,mu:!0},sa=function(r){return typeof r!="string"&&(r=r.unit),r in So||r in zi||r==="ex"},bt=function(r,o){var a;if(r.unit in So)a=So[r.unit]/o.fontMetrics().ptPerEm/o.sizeMultiplier;else if(r.unit==="mu")a=o.fontMetrics().cssEmPerMu;else{var s;if(o.style.isTight()?s=o.havingStyle(o.style.text()):s=o,r.unit==="ex")a=s.fontMetrics().xHeight;else if(r.unit==="em")a=s.fontMetrics().quad;else throw new l("Invalid unit: '"+r.unit+"'");s!==o&&(a*=s.sizeMultiplier/o.sizeMultiplier)}return Math.min(r.number*a,o.maxSize)},be=function(r){return+r.toFixed(4)+"em"},Br=function(r){return r.filter(function(o){return o}).join(" ")},la=function(r,o,a){if(this.classes=r||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=a||{},o){o.style.isTight()&&this.classes.push("mtight");var s=o.getColor();s&&(this.style.color=s)}},zn=function(r){var o=document.createElement(r);o.className=Br(this.classes);for(var a in this.style)this.style.hasOwnProperty(a)&&(o.style[a]=this.style[a]);for(var s in this.attributes)this.attributes.hasOwnProperty(s)&&o.setAttribute(s,this.attributes[s]);for(var d=0;d",o},En=function(){function m(o,a,s,d){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,la.call(this,o,s,d),this.children=a||[]}var r=m.prototype;return r.setAttribute=function(a,s){this.attributes[a]=s},r.hasClass=function(a){return E.contains(this.classes,a)},r.toNode=function(){return zn.call(this,"span")},r.toMarkup=function(){return ca.call(this,"span")},m}(),Co=function(){function m(o,a,s,d){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,la.call(this,a,d),this.children=s||[],this.setAttribute("href",o)}var r=m.prototype;return r.setAttribute=function(a,s){this.attributes[a]=s},r.hasClass=function(a){return E.contains(this.classes,a)},r.toNode=function(){return zn.call(this,"a")},r.toMarkup=function(){return ca.call(this,"a")},m}(),Ei=function(){function m(o,a,s){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=a,this.src=o,this.classes=["mord"],this.style=s}var r=m.prototype;return r.hasClass=function(a){return E.contains(this.classes,a)},r.toNode=function(){var a=document.createElement("img");a.src=this.src,a.alt=this.alt,a.className="mord";for(var s in this.style)this.style.hasOwnProperty(s)&&(a.style[s]=this.style[s]);return a},r.toMarkup=function(){var a=""+this.alt+"0&&(s=document.createElement("span"),s.style.marginRight=be(this.italic)),this.classes.length>0&&(s=s||document.createElement("span"),s.className=Br(this.classes));for(var d in this.style)this.style.hasOwnProperty(d)&&(s=s||document.createElement("span"),s.style[d]=this.style[d]);return s?(s.appendChild(a),s):a},r.toMarkup=function(){var a=!1,s="0&&(d+="margin-right:"+this.italic+"em;");for(var v in this.style)this.style.hasOwnProperty(v)&&(d+=E.hyphenate(v)+":"+this.style[v]+";");d&&(a=!0,s+=' style="'+E.escape(d)+'"');var x=E.escape(this.text);return a?(s+=">",s+=x,s+="",s):x},m}(),Cr=function(){function m(o,a){this.children=void 0,this.attributes=void 0,this.children=o||[],this.attributes=a||{}}var r=m.prototype;return r.toNode=function(){var a="http://www.w3.org/2000/svg",s=document.createElementNS(a,"svg");for(var d in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,d)&&s.setAttribute(d,this.attributes[d]);for(var v=0;v":""},m}(),Ao=function(){function m(o){this.attributes=void 0,this.attributes=o||{}}var r=m.prototype;return r.toNode=function(){var a="http://www.w3.org/2000/svg",s=document.createElementNS(a,"line");for(var d in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,d)&&s.setAttribute(d,this.attributes[d]);return s},r.toMarkup=function(){var a=" but got "+String(m)+".")}var hh={bin:1,close:1,inner:1,open:1,punct:1,rel:1},fh={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},da={math:{},text:{}},Ct=da;function p(m,r,o,a,s,d){da[m][s]={font:r,group:o,replace:a},d&&a&&(da[m][a]=da[m][s])}var g="math",se="text",w="main",I="ams",kt="accent-token",ze="bin",jt="close",Zn="inner",Fe="mathord",Mt="op-token",nr="open",ha="punct",N="rel",Yr="spacing",H="textord";p(g,w,N,"≡","\\equiv",!0),p(g,w,N,"≺","\\prec",!0),p(g,w,N,"≻","\\succ",!0),p(g,w,N,"∼","\\sim",!0),p(g,w,N,"⊥","\\perp"),p(g,w,N,"⪯","\\preceq",!0),p(g,w,N,"⪰","\\succeq",!0),p(g,w,N,"≃","\\simeq",!0),p(g,w,N,"∣","\\mid",!0),p(g,w,N,"≪","\\ll",!0),p(g,w,N,"≫","\\gg",!0),p(g,w,N,"≍","\\asymp",!0),p(g,w,N,"∥","\\parallel"),p(g,w,N,"⋈","\\bowtie",!0),p(g,w,N,"⌣","\\smile",!0),p(g,w,N,"⊑","\\sqsubseteq",!0),p(g,w,N,"⊒","\\sqsupseteq",!0),p(g,w,N,"≐","\\doteq",!0),p(g,w,N,"⌢","\\frown",!0),p(g,w,N,"∋","\\ni",!0),p(g,w,N,"∝","\\propto",!0),p(g,w,N,"⊢","\\vdash",!0),p(g,w,N,"⊣","\\dashv",!0),p(g,w,N,"∋","\\owns"),p(g,w,ha,".","\\ldotp"),p(g,w,ha,"⋅","\\cdotp"),p(g,w,H,"#","\\#"),p(se,w,H,"#","\\#"),p(g,w,H,"&","\\&"),p(se,w,H,"&","\\&"),p(g,w,H,"ℵ","\\aleph",!0),p(g,w,H,"∀","\\forall",!0),p(g,w,H,"ℏ","\\hbar",!0),p(g,w,H,"∃","\\exists",!0),p(g,w,H,"∇","\\nabla",!0),p(g,w,H,"♭","\\flat",!0),p(g,w,H,"ℓ","\\ell",!0),p(g,w,H,"♮","\\natural",!0),p(g,w,H,"♣","\\clubsuit",!0),p(g,w,H,"℘","\\wp",!0),p(g,w,H,"♯","\\sharp",!0),p(g,w,H,"♢","\\diamondsuit",!0),p(g,w,H,"ℜ","\\Re",!0),p(g,w,H,"♡","\\heartsuit",!0),p(g,w,H,"ℑ","\\Im",!0),p(g,w,H,"♠","\\spadesuit",!0),p(g,w,H,"§","\\S",!0),p(se,w,H,"§","\\S"),p(g,w,H,"¶","\\P",!0),p(se,w,H,"¶","\\P"),p(g,w,H,"†","\\dag"),p(se,w,H,"†","\\dag"),p(se,w,H,"†","\\textdagger"),p(g,w,H,"‡","\\ddag"),p(se,w,H,"‡","\\ddag"),p(se,w,H,"‡","\\textdaggerdbl"),p(g,w,jt,"⎱","\\rmoustache",!0),p(g,w,nr,"⎰","\\lmoustache",!0),p(g,w,jt,"⟯","\\rgroup",!0),p(g,w,nr,"⟮","\\lgroup",!0),p(g,w,ze,"∓","\\mp",!0),p(g,w,ze,"⊖","\\ominus",!0),p(g,w,ze,"⊎","\\uplus",!0),p(g,w,ze,"⊓","\\sqcap",!0),p(g,w,ze,"∗","\\ast"),p(g,w,ze,"⊔","\\sqcup",!0),p(g,w,ze,"◯","\\bigcirc",!0),p(g,w,ze,"∙","\\bullet",!0),p(g,w,ze,"‡","\\ddagger"),p(g,w,ze,"≀","\\wr",!0),p(g,w,ze,"⨿","\\amalg"),p(g,w,ze,"&","\\And"),p(g,w,N,"⟵","\\longleftarrow",!0),p(g,w,N,"⇐","\\Leftarrow",!0),p(g,w,N,"⟸","\\Longleftarrow",!0),p(g,w,N,"⟶","\\longrightarrow",!0),p(g,w,N,"⇒","\\Rightarrow",!0),p(g,w,N,"⟹","\\Longrightarrow",!0),p(g,w,N,"↔","\\leftrightarrow",!0),p(g,w,N,"⟷","\\longleftrightarrow",!0),p(g,w,N,"⇔","\\Leftrightarrow",!0),p(g,w,N,"⟺","\\Longleftrightarrow",!0),p(g,w,N,"↦","\\mapsto",!0),p(g,w,N,"⟼","\\longmapsto",!0),p(g,w,N,"↗","\\nearrow",!0),p(g,w,N,"↩","\\hookleftarrow",!0),p(g,w,N,"↪","\\hookrightarrow",!0),p(g,w,N,"↘","\\searrow",!0),p(g,w,N,"↼","\\leftharpoonup",!0),p(g,w,N,"⇀","\\rightharpoonup",!0),p(g,w,N,"↙","\\swarrow",!0),p(g,w,N,"↽","\\leftharpoondown",!0),p(g,w,N,"⇁","\\rightharpoondown",!0),p(g,w,N,"↖","\\nwarrow",!0),p(g,w,N,"⇌","\\rightleftharpoons",!0),p(g,I,N,"≮","\\nless",!0),p(g,I,N,"","\\@nleqslant"),p(g,I,N,"","\\@nleqq"),p(g,I,N,"⪇","\\lneq",!0),p(g,I,N,"≨","\\lneqq",!0),p(g,I,N,"","\\@lvertneqq"),p(g,I,N,"⋦","\\lnsim",!0),p(g,I,N,"⪉","\\lnapprox",!0),p(g,I,N,"⊀","\\nprec",!0),p(g,I,N,"⋠","\\npreceq",!0),p(g,I,N,"⋨","\\precnsim",!0),p(g,I,N,"⪹","\\precnapprox",!0),p(g,I,N,"≁","\\nsim",!0),p(g,I,N,"","\\@nshortmid"),p(g,I,N,"∤","\\nmid",!0),p(g,I,N,"⊬","\\nvdash",!0),p(g,I,N,"⊭","\\nvDash",!0),p(g,I,N,"⋪","\\ntriangleleft"),p(g,I,N,"⋬","\\ntrianglelefteq",!0),p(g,I,N,"⊊","\\subsetneq",!0),p(g,I,N,"","\\@varsubsetneq"),p(g,I,N,"⫋","\\subsetneqq",!0),p(g,I,N,"","\\@varsubsetneqq"),p(g,I,N,"≯","\\ngtr",!0),p(g,I,N,"","\\@ngeqslant"),p(g,I,N,"","\\@ngeqq"),p(g,I,N,"⪈","\\gneq",!0),p(g,I,N,"≩","\\gneqq",!0),p(g,I,N,"","\\@gvertneqq"),p(g,I,N,"⋧","\\gnsim",!0),p(g,I,N,"⪊","\\gnapprox",!0),p(g,I,N,"⊁","\\nsucc",!0),p(g,I,N,"⋡","\\nsucceq",!0),p(g,I,N,"⋩","\\succnsim",!0),p(g,I,N,"⪺","\\succnapprox",!0),p(g,I,N,"≆","\\ncong",!0),p(g,I,N,"","\\@nshortparallel"),p(g,I,N,"∦","\\nparallel",!0),p(g,I,N,"⊯","\\nVDash",!0),p(g,I,N,"⋫","\\ntriangleright"),p(g,I,N,"⋭","\\ntrianglerighteq",!0),p(g,I,N,"","\\@nsupseteqq"),p(g,I,N,"⊋","\\supsetneq",!0),p(g,I,N,"","\\@varsupsetneq"),p(g,I,N,"⫌","\\supsetneqq",!0),p(g,I,N,"","\\@varsupsetneqq"),p(g,I,N,"⊮","\\nVdash",!0),p(g,I,N,"⪵","\\precneqq",!0),p(g,I,N,"⪶","\\succneqq",!0),p(g,I,N,"","\\@nsubseteqq"),p(g,I,ze,"⊴","\\unlhd"),p(g,I,ze,"⊵","\\unrhd"),p(g,I,N,"↚","\\nleftarrow",!0),p(g,I,N,"↛","\\nrightarrow",!0),p(g,I,N,"⇍","\\nLeftarrow",!0),p(g,I,N,"⇏","\\nRightarrow",!0),p(g,I,N,"↮","\\nleftrightarrow",!0),p(g,I,N,"⇎","\\nLeftrightarrow",!0),p(g,I,N,"△","\\vartriangle"),p(g,I,H,"ℏ","\\hslash"),p(g,I,H,"▽","\\triangledown"),p(g,I,H,"◊","\\lozenge"),p(g,I,H,"Ⓢ","\\circledS"),p(g,I,H,"®","\\circledR"),p(se,I,H,"®","\\circledR"),p(g,I,H,"∡","\\measuredangle",!0),p(g,I,H,"∄","\\nexists"),p(g,I,H,"℧","\\mho"),p(g,I,H,"Ⅎ","\\Finv",!0),p(g,I,H,"⅁","\\Game",!0),p(g,I,H,"‵","\\backprime"),p(g,I,H,"▲","\\blacktriangle"),p(g,I,H,"▼","\\blacktriangledown"),p(g,I,H,"■","\\blacksquare"),p(g,I,H,"⧫","\\blacklozenge"),p(g,I,H,"★","\\bigstar"),p(g,I,H,"∢","\\sphericalangle",!0),p(g,I,H,"∁","\\complement",!0),p(g,I,H,"ð","\\eth",!0),p(se,w,H,"ð","ð"),p(g,I,H,"╱","\\diagup"),p(g,I,H,"╲","\\diagdown"),p(g,I,H,"□","\\square"),p(g,I,H,"□","\\Box"),p(g,I,H,"◊","\\Diamond"),p(g,I,H,"¥","\\yen",!0),p(se,I,H,"¥","\\yen",!0),p(g,I,H,"✓","\\checkmark",!0),p(se,I,H,"✓","\\checkmark"),p(g,I,H,"ℶ","\\beth",!0),p(g,I,H,"ℸ","\\daleth",!0),p(g,I,H,"ℷ","\\gimel",!0),p(g,I,H,"ϝ","\\digamma",!0),p(g,I,H,"ϰ","\\varkappa"),p(g,I,nr,"┌","\\@ulcorner",!0),p(g,I,jt,"┐","\\@urcorner",!0),p(g,I,nr,"└","\\@llcorner",!0),p(g,I,jt,"┘","\\@lrcorner",!0),p(g,I,N,"≦","\\leqq",!0),p(g,I,N,"⩽","\\leqslant",!0),p(g,I,N,"⪕","\\eqslantless",!0),p(g,I,N,"≲","\\lesssim",!0),p(g,I,N,"⪅","\\lessapprox",!0),p(g,I,N,"≊","\\approxeq",!0),p(g,I,ze,"⋖","\\lessdot"),p(g,I,N,"⋘","\\lll",!0),p(g,I,N,"≶","\\lessgtr",!0),p(g,I,N,"⋚","\\lesseqgtr",!0),p(g,I,N,"⪋","\\lesseqqgtr",!0),p(g,I,N,"≑","\\doteqdot"),p(g,I,N,"≓","\\risingdotseq",!0),p(g,I,N,"≒","\\fallingdotseq",!0),p(g,I,N,"∽","\\backsim",!0),p(g,I,N,"⋍","\\backsimeq",!0),p(g,I,N,"⫅","\\subseteqq",!0),p(g,I,N,"⋐","\\Subset",!0),p(g,I,N,"⊏","\\sqsubset",!0),p(g,I,N,"≼","\\preccurlyeq",!0),p(g,I,N,"⋞","\\curlyeqprec",!0),p(g,I,N,"≾","\\precsim",!0),p(g,I,N,"⪷","\\precapprox",!0),p(g,I,N,"⊲","\\vartriangleleft"),p(g,I,N,"⊴","\\trianglelefteq"),p(g,I,N,"⊨","\\vDash",!0),p(g,I,N,"⊪","\\Vvdash",!0),p(g,I,N,"⌣","\\smallsmile"),p(g,I,N,"⌢","\\smallfrown"),p(g,I,N,"≏","\\bumpeq",!0),p(g,I,N,"≎","\\Bumpeq",!0),p(g,I,N,"≧","\\geqq",!0),p(g,I,N,"⩾","\\geqslant",!0),p(g,I,N,"⪖","\\eqslantgtr",!0),p(g,I,N,"≳","\\gtrsim",!0),p(g,I,N,"⪆","\\gtrapprox",!0),p(g,I,ze,"⋗","\\gtrdot"),p(g,I,N,"⋙","\\ggg",!0),p(g,I,N,"≷","\\gtrless",!0),p(g,I,N,"⋛","\\gtreqless",!0),p(g,I,N,"⪌","\\gtreqqless",!0),p(g,I,N,"≖","\\eqcirc",!0),p(g,I,N,"≗","\\circeq",!0),p(g,I,N,"≜","\\triangleq",!0),p(g,I,N,"∼","\\thicksim"),p(g,I,N,"≈","\\thickapprox"),p(g,I,N,"⫆","\\supseteqq",!0),p(g,I,N,"⋑","\\Supset",!0),p(g,I,N,"⊐","\\sqsupset",!0),p(g,I,N,"≽","\\succcurlyeq",!0),p(g,I,N,"⋟","\\curlyeqsucc",!0),p(g,I,N,"≿","\\succsim",!0),p(g,I,N,"⪸","\\succapprox",!0),p(g,I,N,"⊳","\\vartriangleright"),p(g,I,N,"⊵","\\trianglerighteq"),p(g,I,N,"⊩","\\Vdash",!0),p(g,I,N,"∣","\\shortmid"),p(g,I,N,"∥","\\shortparallel"),p(g,I,N,"≬","\\between",!0),p(g,I,N,"⋔","\\pitchfork",!0),p(g,I,N,"∝","\\varpropto"),p(g,I,N,"◀","\\blacktriangleleft"),p(g,I,N,"∴","\\therefore",!0),p(g,I,N,"∍","\\backepsilon"),p(g,I,N,"▶","\\blacktriangleright"),p(g,I,N,"∵","\\because",!0),p(g,I,N,"⋘","\\llless"),p(g,I,N,"⋙","\\gggtr"),p(g,I,ze,"⊲","\\lhd"),p(g,I,ze,"⊳","\\rhd"),p(g,I,N,"≂","\\eqsim",!0),p(g,w,N,"⋈","\\Join"),p(g,I,N,"≑","\\Doteq",!0),p(g,I,ze,"∔","\\dotplus",!0),p(g,I,ze,"∖","\\smallsetminus"),p(g,I,ze,"⋒","\\Cap",!0),p(g,I,ze,"⋓","\\Cup",!0),p(g,I,ze,"⩞","\\doublebarwedge",!0),p(g,I,ze,"⊟","\\boxminus",!0),p(g,I,ze,"⊞","\\boxplus",!0),p(g,I,ze,"⋇","\\divideontimes",!0),p(g,I,ze,"⋉","\\ltimes",!0),p(g,I,ze,"⋊","\\rtimes",!0),p(g,I,ze,"⋋","\\leftthreetimes",!0),p(g,I,ze,"⋌","\\rightthreetimes",!0),p(g,I,ze,"⋏","\\curlywedge",!0),p(g,I,ze,"⋎","\\curlyvee",!0),p(g,I,ze,"⊝","\\circleddash",!0),p(g,I,ze,"⊛","\\circledast",!0),p(g,I,ze,"⋅","\\centerdot"),p(g,I,ze,"⊺","\\intercal",!0),p(g,I,ze,"⋒","\\doublecap"),p(g,I,ze,"⋓","\\doublecup"),p(g,I,ze,"⊠","\\boxtimes",!0),p(g,I,N,"⇢","\\dashrightarrow",!0),p(g,I,N,"⇠","\\dashleftarrow",!0),p(g,I,N,"⇇","\\leftleftarrows",!0),p(g,I,N,"⇆","\\leftrightarrows",!0),p(g,I,N,"⇚","\\Lleftarrow",!0),p(g,I,N,"↞","\\twoheadleftarrow",!0),p(g,I,N,"↢","\\leftarrowtail",!0),p(g,I,N,"↫","\\looparrowleft",!0),p(g,I,N,"⇋","\\leftrightharpoons",!0),p(g,I,N,"↶","\\curvearrowleft",!0),p(g,I,N,"↺","\\circlearrowleft",!0),p(g,I,N,"↰","\\Lsh",!0),p(g,I,N,"⇈","\\upuparrows",!0),p(g,I,N,"↿","\\upharpoonleft",!0),p(g,I,N,"⇃","\\downharpoonleft",!0),p(g,w,N,"⊶","\\origof",!0),p(g,w,N,"⊷","\\imageof",!0),p(g,I,N,"⊸","\\multimap",!0),p(g,I,N,"↭","\\leftrightsquigarrow",!0),p(g,I,N,"⇉","\\rightrightarrows",!0),p(g,I,N,"⇄","\\rightleftarrows",!0),p(g,I,N,"↠","\\twoheadrightarrow",!0),p(g,I,N,"↣","\\rightarrowtail",!0),p(g,I,N,"↬","\\looparrowright",!0),p(g,I,N,"↷","\\curvearrowright",!0),p(g,I,N,"↻","\\circlearrowright",!0),p(g,I,N,"↱","\\Rsh",!0),p(g,I,N,"⇊","\\downdownarrows",!0),p(g,I,N,"↾","\\upharpoonright",!0),p(g,I,N,"⇂","\\downharpoonright",!0),p(g,I,N,"⇝","\\rightsquigarrow",!0),p(g,I,N,"⇝","\\leadsto"),p(g,I,N,"⇛","\\Rrightarrow",!0),p(g,I,N,"↾","\\restriction"),p(g,w,H,"‘","`"),p(g,w,H,"$","\\$"),p(se,w,H,"$","\\$"),p(se,w,H,"$","\\textdollar"),p(g,w,H,"%","\\%"),p(se,w,H,"%","\\%"),p(g,w,H,"_","\\_"),p(se,w,H,"_","\\_"),p(se,w,H,"_","\\textunderscore"),p(g,w,H,"∠","\\angle",!0),p(g,w,H,"∞","\\infty",!0),p(g,w,H,"′","\\prime"),p(g,w,H,"△","\\triangle"),p(g,w,H,"Γ","\\Gamma",!0),p(g,w,H,"Δ","\\Delta",!0),p(g,w,H,"Θ","\\Theta",!0),p(g,w,H,"Λ","\\Lambda",!0),p(g,w,H,"Ξ","\\Xi",!0),p(g,w,H,"Π","\\Pi",!0),p(g,w,H,"Σ","\\Sigma",!0),p(g,w,H,"Υ","\\Upsilon",!0),p(g,w,H,"Φ","\\Phi",!0),p(g,w,H,"Ψ","\\Psi",!0),p(g,w,H,"Ω","\\Omega",!0),p(g,w,H,"A","Α"),p(g,w,H,"B","Β"),p(g,w,H,"E","Ε"),p(g,w,H,"Z","Ζ"),p(g,w,H,"H","Η"),p(g,w,H,"I","Ι"),p(g,w,H,"K","Κ"),p(g,w,H,"M","Μ"),p(g,w,H,"N","Ν"),p(g,w,H,"O","Ο"),p(g,w,H,"P","Ρ"),p(g,w,H,"T","Τ"),p(g,w,H,"X","Χ"),p(g,w,H,"¬","\\neg",!0),p(g,w,H,"¬","\\lnot"),p(g,w,H,"⊤","\\top"),p(g,w,H,"⊥","\\bot"),p(g,w,H,"∅","\\emptyset"),p(g,I,H,"∅","\\varnothing"),p(g,w,Fe,"α","\\alpha",!0),p(g,w,Fe,"β","\\beta",!0),p(g,w,Fe,"γ","\\gamma",!0),p(g,w,Fe,"δ","\\delta",!0),p(g,w,Fe,"ϵ","\\epsilon",!0),p(g,w,Fe,"ζ","\\zeta",!0),p(g,w,Fe,"η","\\eta",!0),p(g,w,Fe,"θ","\\theta",!0),p(g,w,Fe,"ι","\\iota",!0),p(g,w,Fe,"κ","\\kappa",!0),p(g,w,Fe,"λ","\\lambda",!0),p(g,w,Fe,"μ","\\mu",!0),p(g,w,Fe,"ν","\\nu",!0),p(g,w,Fe,"ξ","\\xi",!0),p(g,w,Fe,"ο","\\omicron",!0),p(g,w,Fe,"π","\\pi",!0),p(g,w,Fe,"ρ","\\rho",!0),p(g,w,Fe,"σ","\\sigma",!0),p(g,w,Fe,"τ","\\tau",!0),p(g,w,Fe,"υ","\\upsilon",!0),p(g,w,Fe,"ϕ","\\phi",!0),p(g,w,Fe,"χ","\\chi",!0),p(g,w,Fe,"ψ","\\psi",!0),p(g,w,Fe,"ω","\\omega",!0),p(g,w,Fe,"ε","\\varepsilon",!0),p(g,w,Fe,"ϑ","\\vartheta",!0),p(g,w,Fe,"ϖ","\\varpi",!0),p(g,w,Fe,"ϱ","\\varrho",!0),p(g,w,Fe,"ς","\\varsigma",!0),p(g,w,Fe,"φ","\\varphi",!0),p(g,w,ze,"∗","*",!0),p(g,w,ze,"+","+"),p(g,w,ze,"−","-",!0),p(g,w,ze,"⋅","\\cdot",!0),p(g,w,ze,"∘","\\circ",!0),p(g,w,ze,"÷","\\div",!0),p(g,w,ze,"±","\\pm",!0),p(g,w,ze,"×","\\times",!0),p(g,w,ze,"∩","\\cap",!0),p(g,w,ze,"∪","\\cup",!0),p(g,w,ze,"∖","\\setminus",!0),p(g,w,ze,"∧","\\land"),p(g,w,ze,"∨","\\lor"),p(g,w,ze,"∧","\\wedge",!0),p(g,w,ze,"∨","\\vee",!0),p(g,w,H,"√","\\surd"),p(g,w,nr,"⟨","\\langle",!0),p(g,w,nr,"∣","\\lvert"),p(g,w,nr,"∥","\\lVert"),p(g,w,jt,"?","?"),p(g,w,jt,"!","!"),p(g,w,jt,"⟩","\\rangle",!0),p(g,w,jt,"∣","\\rvert"),p(g,w,jt,"∥","\\rVert"),p(g,w,N,"=","="),p(g,w,N,":",":"),p(g,w,N,"≈","\\approx",!0),p(g,w,N,"≅","\\cong",!0),p(g,w,N,"≥","\\ge"),p(g,w,N,"≥","\\geq",!0),p(g,w,N,"←","\\gets"),p(g,w,N,">","\\gt",!0),p(g,w,N,"∈","\\in",!0),p(g,w,N,"","\\@not"),p(g,w,N,"⊂","\\subset",!0),p(g,w,N,"⊃","\\supset",!0),p(g,w,N,"⊆","\\subseteq",!0),p(g,w,N,"⊇","\\supseteq",!0),p(g,I,N,"⊈","\\nsubseteq",!0),p(g,I,N,"⊉","\\nsupseteq",!0),p(g,w,N,"⊨","\\models"),p(g,w,N,"←","\\leftarrow",!0),p(g,w,N,"≤","\\le"),p(g,w,N,"≤","\\leq",!0),p(g,w,N,"<","\\lt",!0),p(g,w,N,"→","\\rightarrow",!0),p(g,w,N,"→","\\to"),p(g,I,N,"≱","\\ngeq",!0),p(g,I,N,"≰","\\nleq",!0),p(g,w,Yr," ","\\ "),p(g,w,Yr," ","\\space"),p(g,w,Yr," ","\\nobreakspace"),p(se,w,Yr," ","\\ "),p(se,w,Yr," "," "),p(se,w,Yr," ","\\space"),p(se,w,Yr," ","\\nobreakspace"),p(g,w,Yr,null,"\\nobreak"),p(g,w,Yr,null,"\\allowbreak"),p(g,w,ha,",",","),p(g,w,ha,";",";"),p(g,I,ze,"⊼","\\barwedge",!0),p(g,I,ze,"⊻","\\veebar",!0),p(g,w,ze,"⊙","\\odot",!0),p(g,w,ze,"⊕","\\oplus",!0),p(g,w,ze,"⊗","\\otimes",!0),p(g,w,H,"∂","\\partial",!0),p(g,w,ze,"⊘","\\oslash",!0),p(g,I,ze,"⊚","\\circledcirc",!0),p(g,I,ze,"⊡","\\boxdot",!0),p(g,w,ze,"△","\\bigtriangleup"),p(g,w,ze,"▽","\\bigtriangledown"),p(g,w,ze,"†","\\dagger"),p(g,w,ze,"⋄","\\diamond"),p(g,w,ze,"⋆","\\star"),p(g,w,ze,"◃","\\triangleleft"),p(g,w,ze,"▹","\\triangleright"),p(g,w,nr,"{","\\{"),p(se,w,H,"{","\\{"),p(se,w,H,"{","\\textbraceleft"),p(g,w,jt,"}","\\}"),p(se,w,H,"}","\\}"),p(se,w,H,"}","\\textbraceright"),p(g,w,nr,"{","\\lbrace"),p(g,w,jt,"}","\\rbrace"),p(g,w,nr,"[","\\lbrack",!0),p(se,w,H,"[","\\lbrack",!0),p(g,w,jt,"]","\\rbrack",!0),p(se,w,H,"]","\\rbrack",!0),p(g,w,nr,"(","\\lparen",!0),p(g,w,jt,")","\\rparen",!0),p(se,w,H,"<","\\textless",!0),p(se,w,H,">","\\textgreater",!0),p(g,w,nr,"⌊","\\lfloor",!0),p(g,w,jt,"⌋","\\rfloor",!0),p(g,w,nr,"⌈","\\lceil",!0),p(g,w,jt,"⌉","\\rceil",!0),p(g,w,H,"\\","\\backslash"),p(g,w,H,"∣","|"),p(g,w,H,"∣","\\vert"),p(se,w,H,"|","\\textbar",!0),p(g,w,H,"∥","\\|"),p(g,w,H,"∥","\\Vert"),p(se,w,H,"∥","\\textbardbl"),p(se,w,H,"~","\\textasciitilde"),p(se,w,H,"\\","\\textbackslash"),p(se,w,H,"^","\\textasciicircum"),p(g,w,N,"↑","\\uparrow",!0),p(g,w,N,"⇑","\\Uparrow",!0),p(g,w,N,"↓","\\downarrow",!0),p(g,w,N,"⇓","\\Downarrow",!0),p(g,w,N,"↕","\\updownarrow",!0),p(g,w,N,"⇕","\\Updownarrow",!0),p(g,w,Mt,"∐","\\coprod"),p(g,w,Mt,"⋁","\\bigvee"),p(g,w,Mt,"⋀","\\bigwedge"),p(g,w,Mt,"⨄","\\biguplus"),p(g,w,Mt,"⋂","\\bigcap"),p(g,w,Mt,"⋃","\\bigcup"),p(g,w,Mt,"∫","\\int"),p(g,w,Mt,"∫","\\intop"),p(g,w,Mt,"∬","\\iint"),p(g,w,Mt,"∭","\\iiint"),p(g,w,Mt,"∏","\\prod"),p(g,w,Mt,"∑","\\sum"),p(g,w,Mt,"⨂","\\bigotimes"),p(g,w,Mt,"⨁","\\bigoplus"),p(g,w,Mt,"⨀","\\bigodot"),p(g,w,Mt,"∮","\\oint"),p(g,w,Mt,"∯","\\oiint"),p(g,w,Mt,"∰","\\oiiint"),p(g,w,Mt,"⨆","\\bigsqcup"),p(g,w,Mt,"∫","\\smallint"),p(se,w,Zn,"…","\\textellipsis"),p(g,w,Zn,"…","\\mathellipsis"),p(se,w,Zn,"…","\\ldots",!0),p(g,w,Zn,"…","\\ldots",!0),p(g,w,Zn,"⋯","\\@cdots",!0),p(g,w,Zn,"⋱","\\ddots",!0),p(g,w,H,"⋮","\\varvdots"),p(g,w,kt,"ˊ","\\acute"),p(g,w,kt,"ˋ","\\grave"),p(g,w,kt,"¨","\\ddot"),p(g,w,kt,"~","\\tilde"),p(g,w,kt,"ˉ","\\bar"),p(g,w,kt,"˘","\\breve"),p(g,w,kt,"ˇ","\\check"),p(g,w,kt,"^","\\hat"),p(g,w,kt,"⃗","\\vec"),p(g,w,kt,"˙","\\dot"),p(g,w,kt,"˚","\\mathring"),p(g,w,Fe,"","\\@imath"),p(g,w,Fe,"","\\@jmath"),p(g,w,H,"ı","ı"),p(g,w,H,"ȷ","ȷ"),p(se,w,H,"ı","\\i",!0),p(se,w,H,"ȷ","\\j",!0),p(se,w,H,"ß","\\ss",!0),p(se,w,H,"æ","\\ae",!0),p(se,w,H,"œ","\\oe",!0),p(se,w,H,"ø","\\o",!0),p(se,w,H,"Æ","\\AE",!0),p(se,w,H,"Œ","\\OE",!0),p(se,w,H,"Ø","\\O",!0),p(se,w,kt,"ˊ","\\'"),p(se,w,kt,"ˋ","\\`"),p(se,w,kt,"ˆ","\\^"),p(se,w,kt,"˜","\\~"),p(se,w,kt,"ˉ","\\="),p(se,w,kt,"˘","\\u"),p(se,w,kt,"˙","\\."),p(se,w,kt,"¸","\\c"),p(se,w,kt,"˚","\\r"),p(se,w,kt,"ˇ","\\v"),p(se,w,kt,"¨",'\\"'),p(se,w,kt,"˝","\\H"),p(se,w,kt,"◯","\\textcircled");var Ol={"--":!0,"---":!0,"``":!0,"''":!0};p(se,w,H,"–","--",!0),p(se,w,H,"–","\\textendash"),p(se,w,H,"—","---",!0),p(se,w,H,"—","\\textemdash"),p(se,w,H,"‘","`",!0),p(se,w,H,"‘","\\textquoteleft"),p(se,w,H,"’","'",!0),p(se,w,H,"’","\\textquoteright"),p(se,w,H,"“","``",!0),p(se,w,H,"“","\\textquotedblleft"),p(se,w,H,"”","''",!0),p(se,w,H,"”","\\textquotedblright"),p(g,w,H,"°","\\degree",!0),p(se,w,H,"°","\\degree"),p(se,w,H,"°","\\textdegree",!0),p(g,w,H,"£","\\pounds"),p(g,w,H,"£","\\mathsterling",!0),p(se,w,H,"£","\\pounds"),p(se,w,H,"£","\\textsterling",!0),p(g,I,H,"✠","\\maltese"),p(se,I,H,"✠","\\maltese");for(var Ul='0123456789/@."',Mi=0;Mio&&(o=v.height),v.depth>a&&(a=v.depth),v.maxFontSize>s&&(s=v.maxFontSize)}r.height=o,r.depth=a,r.maxFontSize=s},Zt=function(r,o,a,s){var d=new En(r,o,a,s);return qi(d),d},Wl=function(r,o,a,s){return new En(r,o,a,s)},xh=function(r,o,a){var s=Zt([r],[],o);return s.height=Math.max(a||o.fontMetrics().defaultRuleThickness,o.minRuleThickness),s.style.borderBottomWidth=be(s.height),s.maxFontSize=1,s},wh=function(r,o,a,s){var d=new Co(r,o,a,s);return qi(d),d},Xl=function(r){var o=new Y(r);return qi(o),o},kh=function(r,o){return r instanceof Y?Zt([],[r],o):r},Sh=function(r){if(r.positionType==="individualShift"){for(var o=r.children,a=[o[0]],s=-o[0].shift-o[0].elem.depth,d=s,v=1;v0&&(d.push(ka(v,r)),v=[]),d.push(a[x]));v.length>0&&d.push(ka(v,r));var z;o?(z=ka(qt(o,r,!0)),z.classes=["tag"],d.push(z)):s&&d.push(s);var F=Zr(["katex-html"],d);if(F.setAttribute("aria-hidden","true"),z){var W=z.children[0];W.style.height=be(F.height+F.depth),F.depth&&(W.style.verticalAlign=be(-F.depth))}return F}function e0(m){return new Y(m)}var fr=function(){function m(o,a,s){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=o,this.attributes={},this.children=a||[],this.classes=s||[]}var r=m.prototype;return r.setAttribute=function(a,s){this.attributes[a]=s},r.getAttribute=function(a){return this.attributes[a]},r.toNode=function(){var a=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var s in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,s)&&a.setAttribute(s,this.attributes[s]);this.classes.length>0&&(a.className=Br(this.classes));for(var d=0;d0&&(a+=' class ="'+E.escape(Br(this.classes))+'"'),a+=">";for(var d=0;d",a},r.toText=function(){return this.children.map(function(a){return a.toText()}).join("")},m}(),_o=function(){function m(o){this.text=void 0,this.text=o}var r=m.prototype;return r.toNode=function(){return document.createTextNode(this.text)},r.toMarkup=function(){return E.escape(this.toText())},r.toText=function(){return this.text},m}(),Ih=function(){function m(o){this.width=void 0,this.character=void 0,this.width=o,o>=.05555&&o<=.05556?this.character=" ":o>=.1666&&o<=.1667?this.character=" ":o>=.2222&&o<=.2223?this.character=" ":o>=.2777&&o<=.2778?this.character="  ":o>=-.05556&&o<=-.05555?this.character=" ⁣":o>=-.1667&&o<=-.1666?this.character=" ⁣":o>=-.2223&&o<=-.2222?this.character=" ⁣":o>=-.2778&&o<=-.2777?this.character=" ⁣":this.character=null}var r=m.prototype;return r.toNode=function(){if(this.character)return document.createTextNode(this.character);var a=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return a.setAttribute("width",be(this.width)),a},r.toMarkup=function(){return this.character?""+this.character+"":''},r.toText=function(){return this.character?this.character:" "},m}(),ce={MathNode:fr,TextNode:_o,SpaceNode:Ih,newDocumentFragment:e0},pr=function(r,o,a){return Ct[o][r]&&Ct[o][r].replace&&r.charCodeAt(0)!==55349&&!(Ol.hasOwnProperty(r)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(r=Ct[o][r].replace),new ce.TextNode(r)},$i=function(r){return r.length===1?r[0]:new ce.MathNode("mrow",r)},Oi=function(r,o){if(o.fontFamily==="texttt")return"monospace";if(o.fontFamily==="textsf")return o.fontShape==="textit"&&o.fontWeight==="textbf"?"sans-serif-bold-italic":o.fontShape==="textit"?"sans-serif-italic":o.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(o.fontShape==="textit"&&o.fontWeight==="textbf")return"bold-italic";if(o.fontShape==="textit")return"italic";if(o.fontWeight==="textbf")return"bold";var a=o.font;if(!a||a==="mathnormal")return null;var s=r.mode;if(a==="mathit")return"italic";if(a==="boldsymbol")return r.type==="textord"?"bold":"bold-italic";if(a==="mathbf")return"bold";if(a==="mathbb")return"double-struck";if(a==="mathfrak")return"fraktur";if(a==="mathscr"||a==="mathcal")return"script";if(a==="mathsf")return"sans-serif";if(a==="mathtt")return"monospace";var d=r.text;if(E.contains(["\\imath","\\jmath"],d))return null;Ct[s][d]&&Ct[s][d].replace&&(d=Ct[s][d].replace);var v=G.fontMap[a].fontName;return rt(d,v,s)?G.fontMap[a].variant:null},Jt=function(r,o,a){if(r.length===1){var s=ft(r[0],o);return a&&s instanceof fr&&s.type==="mo"&&(s.setAttribute("lspace","0em"),s.setAttribute("rspace","0em")),[s]}for(var d=[],v,x=0;x0&&(re.text=re.text.slice(0,1)+"̸"+re.text.slice(1),d.pop())}}}d.push(A),v=A}return d},dn=function(r,o,a){return $i(Jt(r,o,a))},ft=function(r,o){if(!r)return new ce.MathNode("mrow");if(xa[r.type]){var a=xa[r.type](r,o);return a}else throw new l("Got group of unknown type: '"+r.type+"'")};function t0(m,r,o,a,s){var d=Jt(m,o),v;d.length===1&&d[0]instanceof fr&&E.contains(["mrow","mtable"],d[0].type)?v=d[0]:v=new ce.MathNode("mrow",d);var x=new ce.MathNode("annotation",[new ce.TextNode(r)]);x.setAttribute("encoding","application/x-tex");var A=new ce.MathNode("semantics",[v,x]),z=new ce.MathNode("math",[A]);z.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&z.setAttribute("display","block");var F=s?"katex":"katex-mathml";return G.makeSpan([F],[z])}var r0=function(r){return new Di({style:r.displayMode?De.DISPLAY:De.TEXT,maxSize:r.maxSize,minRuleThickness:r.minRuleThickness})},n0=function(r,o){if(o.displayMode){var a=["katex-display"];o.leqno&&a.push("leqno"),o.fleqn&&a.push("fleqn"),r=G.makeSpan(a,[r])}return r},Ph=function(r,o,a){var s=r0(a),d;if(a.output==="mathml")return t0(r,o,s,a.displayMode,!0);if(a.output==="html"){var v=Li(r,s);d=G.makeSpan(["katex"],[v])}else{var x=t0(r,o,s,a.displayMode,!1),A=Li(r,s);d=G.makeSpan(["katex"],[x,A])}return n0(d,a)},Nh=function(r,o,a){var s=r0(a),d=Li(r,s),v=G.makeSpan(["katex"],[d]);return n0(v,a)},qh={widehat:"^",widecheck:"ˇ",widetilde:"~",utilde:"~",overleftarrow:"←",underleftarrow:"←",xleftarrow:"←",overrightarrow:"→",underrightarrow:"→",xrightarrow:"→",underbrace:"⏟",overbrace:"⏞",overgroup:"⏠",undergroup:"⏡",overleftrightarrow:"↔",underleftrightarrow:"↔",xleftrightarrow:"↔",Overrightarrow:"⇒",xRightarrow:"⇒",overleftharpoon:"↼",xleftharpoonup:"↼",overrightharpoon:"⇀",xrightharpoonup:"⇀",xLeftarrow:"⇐",xLeftrightarrow:"⇔",xhookleftarrow:"↩",xhookrightarrow:"↪",xmapsto:"↦",xrightharpoondown:"⇁",xleftharpoondown:"↽",xrightleftharpoons:"⇌",xleftrightharpoons:"⇋",xtwoheadleftarrow:"↞",xtwoheadrightarrow:"↠",xlongequal:"=",xtofrom:"⇄",xrightleftarrows:"⇄",xrightequilibrium:"⇌",xleftequilibrium:"⇋","\\cdrightarrow":"→","\\cdleftarrow":"←","\\cdlongequal":"="},Fh=function(r){var o=new ce.MathNode("mo",[new ce.TextNode(qh[r.replace(/^\\/,"")])]);return o.setAttribute("stretchy","true"),o},Lh={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},$h=function(r){return r.type==="ordgroup"?r.body.length:1},Oh=function(r,o){function a(){var A=4e5,z=r.label.slice(1);if(E.contains(["widehat","widecheck","widetilde","utilde"],z)){var F=r,W=$h(F.base),Q,J,re;if(W>5)z==="widehat"||z==="widecheck"?(Q=420,A=2364,re=.42,J=z+"4"):(Q=312,A=2340,re=.34,J="tilde4");else{var ge=[1,1,2,2,3,3][W];z==="widehat"||z==="widecheck"?(A=[0,1062,2364,2364,2364][ge],Q=[0,239,300,360,420][ge],re=[0,.24,.3,.3,.36,.42][ge],J=z+ge):(A=[0,600,1033,2339,2340][ge],Q=[0,260,286,306,312][ge],re=[0,.26,.286,.3,.306,.34][ge],J="tilde"+ge)}var Ae=new Ir(J),Me=new Cr([Ae],{width:"100%",height:be(re),viewBox:"0 0 "+A+" "+Q,preserveAspectRatio:"none"});return{span:G.makeSvgSpan([],[Me],o),minWidth:0,height:re}}else{var Ne=[],qe=Lh[z],nt=qe[0],We=qe[1],st=qe[2],et=st/1e3,ct=nt.length,yt,$t;if(ct===1){var or=qe[3];yt=["hide-tail"],$t=[or]}else if(ct===2)yt=["halfarrow-left","halfarrow-right"],$t=["xMinYMin","xMaxYMin"];else if(ct===3)yt=["brace-left","brace-center","brace-right"],$t=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support - `+ct+" children.");for(var Tt=0;Tt0&&(d.style.minWidth=be(v)),d},Uh=function(r,o,a,s,d){var v,x=r.height+r.depth+a+s;if(/fbox|color|angl/.test(o)){if(v=G.makeSpan(["stretchy",o],[],d),o==="fbox"){var A=d.color&&d.getColor();A&&(v.style.borderColor=A)}}else{var z=[];/^[bx]cancel$/.test(o)&&z.push(new Ao({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(o)&&z.push(new Ao({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var F=new Cr(z,{width:"100%",height:be(x)});v=G.makeSvgSpan([],[F],d)}return v.height=x,v.style.height=be(x),v},Jr={encloseSpan:Uh,mathMLnode:Fh,svgSpan:Oh};function Ge(m,r){if(!m||m.type!==r)throw new Error("Expected node of type "+r+", but got "+(m?"node of type "+m.type:String(m)));return m}function Ui(m){var r=Sa(m);if(!r)throw new Error("Expected node of symbol group type, but got "+(m?"node of type "+m.type:String(m)));return r}function Sa(m){return m&&(m.type==="atom"||fh.hasOwnProperty(m.type))?m:null}var Hi=function(r,o){var a,s,d;r&&r.type==="supsub"?(s=Ge(r.base,"accent"),a=s.base,r.base=a,d=dh(Qe(r,o)),r.base=s):(s=Ge(r,"accent"),a=s.base);var v=Qe(a,o.havingCrampedStyle()),x=s.isShifty&&E.isCharacterBox(a),A=0;if(x){var z=E.getBaseElem(a),F=Qe(z,o.havingCrampedStyle());A=ua(F).skew}var W=s.label==="\\c",Q=W?v.height+v.depth:Math.min(v.height,o.fontMetrics().xHeight),J;if(s.isStretchy)J=Jr.svgSpan(s,o),J=G.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:v},{type:"elem",elem:J,wrapperClasses:["svg-align"],wrapperStyle:A>0?{width:"calc(100% - "+be(2*A)+")",marginLeft:be(2*A)}:void 0}]},o);else{var re,ge;s.label==="\\vec"?(re=G.staticSvg("vec",o),ge=G.svgData.vec[1]):(re=G.makeOrd({mode:s.mode,text:s.label},o,"textord"),re=ua(re),re.italic=0,ge=re.width,W&&(Q+=re.depth)),J=G.makeSpan(["accent-body"],[re]);var Ae=s.label==="\\textcircled";Ae&&(J.classes.push("accent-full"),Q=v.height);var Me=A;Ae||(Me-=ge/2),J.style.left=be(Me),s.label==="\\textcircled"&&(J.style.top=".2em"),J=G.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:v},{type:"kern",size:-Q},{type:"elem",elem:J}]},o)}var Ne=G.makeSpan(["mord","accent"],[J],o);return d?(d.children[0]=Ne,d.height=Math.max(Ne.height,d.height),d.classes[0]="mord",d):Ne},o0=function(r,o){var a=r.isStretchy?Jr.mathMLnode(r.label):new ce.MathNode("mo",[pr(r.label,r.mode)]),s=new ce.MathNode("mover",[ft(r.base,o),a]);return s.setAttribute("accent","true"),s},Hh=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(m){return"\\"+m}).join("|"));_e({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(r,o){var a=wa(o[0]),s=!Hh.test(r.funcName),d=!s||r.funcName==="\\widehat"||r.funcName==="\\widetilde"||r.funcName==="\\widecheck";return{type:"accent",mode:r.parser.mode,label:r.funcName,isStretchy:s,isShifty:d,base:a}},htmlBuilder:Hi,mathmlBuilder:o0}),_e({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:function(r,o){var a=o[0],s=r.parser.mode;return s==="math"&&(r.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+r.funcName+" works only in text mode"),s="text"),{type:"accent",mode:s,label:r.funcName,isStretchy:!1,isShifty:!0,base:a}},htmlBuilder:Hi,mathmlBuilder:o0}),_e({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[0];return{type:"accentUnder",mode:a.mode,label:s,base:d}},htmlBuilder:function(r,o){var a=Qe(r.base,o),s=Jr.svgSpan(r,o),d=r.label==="\\utilde"?.12:0,v=G.makeVList({positionType:"top",positionData:a.height,children:[{type:"elem",elem:s,wrapperClasses:["svg-align"]},{type:"kern",size:d},{type:"elem",elem:a}]},o);return G.makeSpan(["mord","accentunder"],[v],o)},mathmlBuilder:function(r,o){var a=Jr.mathMLnode(r.label),s=new ce.MathNode("munder",[ft(r.base,o),a]);return s.setAttribute("accentunder","true"),s}});var Ca=function(r){var o=new ce.MathNode("mpadded",r?[r]:[]);return o.setAttribute("width","+0.6em"),o.setAttribute("lspace","0.3em"),o};_e({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(r,o,a){var s=r.parser,d=r.funcName;return{type:"xArrow",mode:s.mode,label:d,body:o[0],below:a[0]}},htmlBuilder:function(r,o){var a=o.style,s=o.havingStyle(a.sup()),d=G.wrapFragment(Qe(r.body,s,o),o),v=r.label.slice(0,2)==="\\x"?"x":"cd";d.classes.push(v+"-arrow-pad");var x;r.below&&(s=o.havingStyle(a.sub()),x=G.wrapFragment(Qe(r.below,s,o),o),x.classes.push(v+"-arrow-pad"));var A=Jr.svgSpan(r,o),z=-o.fontMetrics().axisHeight+.5*A.height,F=-o.fontMetrics().axisHeight-.5*A.height-.111;(d.depth>.25||r.label==="\\xleftequilibrium")&&(F-=d.depth);var W;if(x){var Q=-o.fontMetrics().axisHeight+x.height+.5*A.height+.111;W=G.makeVList({positionType:"individualShift",children:[{type:"elem",elem:d,shift:F},{type:"elem",elem:A,shift:z},{type:"elem",elem:x,shift:Q}]},o)}else W=G.makeVList({positionType:"individualShift",children:[{type:"elem",elem:d,shift:F},{type:"elem",elem:A,shift:z}]},o);return W.children[0].children[0].children[1].classes.push("svg-align"),G.makeSpan(["mrel","x-arrow"],[W],o)},mathmlBuilder:function(r,o){var a=Jr.mathMLnode(r.label);a.setAttribute("minsize",r.label.charAt(0)==="x"?"1.75em":"3.0em");var s;if(r.body){var d=Ca(ft(r.body,o));if(r.below){var v=Ca(ft(r.below,o));s=new ce.MathNode("munderover",[a,v,d])}else s=new ce.MathNode("mover",[a,d])}else if(r.below){var x=Ca(ft(r.below,o));s=new ce.MathNode("munder",[a,x])}else s=Ca(),s=new ce.MathNode("mover",[a,s]);return s}});var Vh=G.makeSpan;function a0(m,r){var o=qt(m.body,r,!0);return Vh([m.mclass],o,r)}function i0(m,r){var o,a=Jt(m.body,r);return m.mclass==="minner"?o=new ce.MathNode("mpadded",a):m.mclass==="mord"?m.isCharacterBox?(o=a[0],o.type="mi"):o=new ce.MathNode("mi",a):(m.isCharacterBox?(o=a[0],o.type="mo"):o=new ce.MathNode("mo",a),m.mclass==="mbin"?(o.attributes.lspace="0.22em",o.attributes.rspace="0.22em"):m.mclass==="mpunct"?(o.attributes.lspace="0em",o.attributes.rspace="0.17em"):m.mclass==="mopen"||m.mclass==="mclose"?(o.attributes.lspace="0em",o.attributes.rspace="0em"):m.mclass==="minner"&&(o.attributes.lspace="0.0556em",o.attributes.width="+0.1111em")),o}_e({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[0];return{type:"mclass",mode:a.mode,mclass:"m"+s.slice(5),body:Et(d),isCharacterBox:E.isCharacterBox(d)}},htmlBuilder:a0,mathmlBuilder:i0});var Aa=function(r){var o=r.type==="ordgroup"&&r.body.length?r.body[0]:r;return o.type==="atom"&&(o.family==="bin"||o.family==="rel")?"m"+o.family:"mord"};_e({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(r,o){var a=r.parser;return{type:"mclass",mode:a.mode,mclass:Aa(o[0]),body:Et(o[1]),isCharacterBox:E.isCharacterBox(o[1])}}}),_e({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[1],v=o[0],x;s!=="\\stackrel"?x=Aa(d):x="mrel";var A={type:"op",mode:d.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:s!=="\\stackrel",body:Et(d)},z={type:"supsub",mode:v.mode,base:A,sup:s==="\\underset"?null:v,sub:s==="\\underset"?v:null};return{type:"mclass",mode:a.mode,mclass:x,body:[z],isCharacterBox:E.isCharacterBox(z)}},htmlBuilder:a0,mathmlBuilder:i0}),_e({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler:function(r,o){var a=r.parser;return{type:"pmb",mode:a.mode,mclass:Aa(o[0]),body:Et(o[0])}},htmlBuilder:function(r,o){var a=qt(r.body,o,!0),s=G.makeSpan([r.mclass],a,o);return s.style.textShadow="0.02em 0.01em 0.04px",s},mathmlBuilder:function(r,o){var a=Jt(r.body,o),s=new ce.MathNode("mstyle",a);return s.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),s}});var jh={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},s0=function(){return{type:"styling",body:[],mode:"math",style:"display"}},l0=function(r){return r.type==="textord"&&r.text==="@"},Gh=function(r,o){return(r.type==="mathord"||r.type==="atom")&&r.text===o};function Wh(m,r,o){var a=jh[m];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return o.callFunction(a,[r[0]],[r[1]]);case"\\uparrow":case"\\downarrow":{var s=o.callFunction("\\\\cdleft",[r[0]],[]),d={type:"atom",text:a,mode:"math",family:"rel"},v=o.callFunction("\\Big",[d],[]),x=o.callFunction("\\\\cdright",[r[1]],[]),A={type:"ordgroup",mode:"math",body:[s,v,x]};return o.callFunction("\\\\cdparent",[A],[])}case"\\\\cdlongequal":return o.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var z={type:"textord",text:"\\Vert",mode:"math"};return o.callFunction("\\Big",[z],[])}default:return{type:"textord",text:" ",mode:"math"}}}function Xh(m){var r=[];for(m.gullet.beginGroup(),m.gullet.macros.set("\\cr","\\\\\\relax"),m.gullet.beginGroup();;){r.push(m.parseExpression(!1,"\\\\")),m.gullet.endGroup(),m.gullet.beginGroup();var o=m.fetch().text;if(o==="&"||o==="\\\\")m.consume();else if(o==="\\end"){r[r.length-1].length===0&&r.pop();break}else throw new l("Expected \\\\ or \\cr or \\end",m.nextToken)}for(var a=[],s=[a],d=0;d-1))if("<>AV".indexOf(z)>-1)for(var W=0;W<2;W++){for(var Q=!0,J=A+1;JAV=|." after @',v[A]);var re=Wh(z,F,m),ge={type:"styling",body:[re],mode:"math",style:"display"};a.push(ge),x=s0()}d%2===0?a.push(x):a.shift(),a=[],s.push(a)}m.gullet.endGroup(),m.gullet.endGroup();var Ae=new Array(s[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:s,arraystretch:1,addJot:!0,rowGaps:[null],cols:Ae,colSeparationType:"CD",hLinesBeforeRow:new Array(s.length+1).fill([])}}_e({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(r,o){var a=r.parser,s=r.funcName;return{type:"cdlabel",mode:a.mode,side:s.slice(4),label:o[0]}},htmlBuilder:function(r,o){var a=o.havingStyle(o.style.sup()),s=G.wrapFragment(Qe(r.label,a,o),o);return s.classes.push("cd-label-"+r.side),s.style.bottom=be(.8-s.depth),s.height=0,s.depth=0,s},mathmlBuilder:function(r,o){var a=new ce.MathNode("mrow",[ft(r.label,o)]);return a=new ce.MathNode("mpadded",[a]),a.setAttribute("width","0"),r.side==="left"&&a.setAttribute("lspace","-1width"),a.setAttribute("voffset","0.7em"),a=new ce.MathNode("mstyle",[a]),a.setAttribute("displaystyle","false"),a.setAttribute("scriptlevel","1"),a}}),_e({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(r,o){var a=r.parser;return{type:"cdlabelparent",mode:a.mode,fragment:o[0]}},htmlBuilder:function(r,o){var a=G.wrapFragment(Qe(r.fragment,o),o);return a.classes.push("cd-vert-arrow"),a},mathmlBuilder:function(r,o){return new ce.MathNode("mrow",[ft(r.fragment,o)])}}),_e({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(r,o){for(var a=r.parser,s=Ge(o[0],"ordgroup"),d=s.body,v="",x=0;x=1114111)throw new l("\\@char with invalid code point "+v);return z<=65535?F=String.fromCharCode(z):(z-=65536,F=String.fromCharCode((z>>10)+55296,(z&1023)+56320)),{type:"textord",mode:a.mode,text:F}}});var c0=function(r,o){var a=qt(r.body,o.withColor(r.color),!1);return G.makeFragment(a)},u0=function(r,o){var a=Jt(r.body,o.withColor(r.color)),s=new ce.MathNode("mstyle",a);return s.setAttribute("mathcolor",r.color),s};_e({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler:function(r,o){var a=r.parser,s=Ge(o[0],"color-token").color,d=o[1];return{type:"color",mode:a.mode,color:s,body:Et(d)}},htmlBuilder:c0,mathmlBuilder:u0}),_e({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler:function(r,o){var a=r.parser,s=r.breakOnTokenText,d=Ge(o[0],"color-token").color;a.gullet.macros.set("\\current@color",d);var v=a.parseExpression(!0,s);return{type:"color",mode:a.mode,color:d,body:v}},htmlBuilder:c0,mathmlBuilder:u0}),_e({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler:function(r,o,a){var s=r.parser,d=s.gullet.future().text==="["?s.parseSizeGroup(!0):null,v=!s.settings.displayMode||!s.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:s.mode,newLine:v,size:d&&Ge(d,"size").value}},htmlBuilder:function(r,o){var a=G.makeSpan(["mspace"],[],o);return r.newLine&&(a.classes.push("newline"),r.size&&(a.style.marginTop=be(bt(r.size,o)))),a},mathmlBuilder:function(r,o){var a=new ce.MathNode("mspace");return r.newLine&&(a.setAttribute("linebreak","newline"),r.size&&a.setAttribute("height",be(bt(r.size,o)))),a}});var Vi={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},d0=function(r){var o=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(o))throw new l("Expected a control sequence",r);return o},Yh=function(r){var o=r.gullet.popToken();return o.text==="="&&(o=r.gullet.popToken(),o.text===" "&&(o=r.gullet.popToken())),o},h0=function(r,o,a,s){var d=r.gullet.macros.get(a.text);d==null&&(a.noexpand=!0,d={tokens:[a],numArgs:0,unexpandable:!r.gullet.isExpandable(a.text)}),r.gullet.macros.set(o,d,s)};_e({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(r){var o=r.parser,a=r.funcName;o.consumeSpaces();var s=o.fetch();if(Vi[s.text])return(a==="\\global"||a==="\\\\globallong")&&(s.text=Vi[s.text]),Ge(o.parseFunction(),"internal");throw new l("Invalid token after macro prefix",s)}}),_e({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(r){var o=r.parser,a=r.funcName,s=o.gullet.popToken(),d=s.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(d))throw new l("Expected a control sequence",s);for(var v=0,x,A=[[]];o.gullet.future().text!=="{";)if(s=o.gullet.popToken(),s.text==="#"){if(o.gullet.future().text==="{"){x=o.gullet.future(),A[v].push("{");break}if(s=o.gullet.popToken(),!/^[1-9]$/.test(s.text))throw new l('Invalid argument number "'+s.text+'"');if(parseInt(s.text)!==v+1)throw new l('Argument number "'+s.text+'" out of order');v++,A.push([])}else{if(s.text==="EOF")throw new l("Expected a macro definition");A[v].push(s.text)}var z=o.gullet.consumeArg(),F=z.tokens;return x&&F.unshift(x),(a==="\\edef"||a==="\\xdef")&&(F=o.gullet.expandTokens(F),F.reverse()),o.gullet.macros.set(d,{tokens:F,numArgs:v,delimiters:A},a===Vi[a]),{type:"internal",mode:o.mode}}}),_e({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(r){var o=r.parser,a=r.funcName,s=d0(o.gullet.popToken());o.gullet.consumeSpaces();var d=Yh(o);return h0(o,s,d,a==="\\\\globallet"),{type:"internal",mode:o.mode}}}),_e({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(r){var o=r.parser,a=r.funcName,s=d0(o.gullet.popToken()),d=o.gullet.popToken(),v=o.gullet.popToken();return h0(o,s,v,a==="\\\\globalfuture"),o.gullet.pushToken(v),o.gullet.pushToken(d),{type:"internal",mode:o.mode}}});var Do=function(r,o,a){var s=Ct.math[r]&&Ct.math[r].replace,d=rt(s||r,o,a);if(!d)throw new Error("Unsupported symbol "+r+" and font size "+o+".");return d},ji=function(r,o,a,s){var d=a.havingBaseStyle(o),v=G.makeSpan(s.concat(d.sizingClasses(a)),[r],a),x=d.sizeMultiplier/a.sizeMultiplier;return v.height*=x,v.depth*=x,v.maxFontSize=d.sizeMultiplier,v},f0=function(r,o,a){var s=o.havingBaseStyle(a),d=(1-o.sizeMultiplier/s.sizeMultiplier)*o.fontMetrics().axisHeight;r.classes.push("delimcenter"),r.style.top=be(d),r.height-=d,r.depth+=d},Kh=function(r,o,a,s,d,v){var x=G.makeSymbol(r,"Main-Regular",d,s),A=ji(x,o,s,v);return a&&f0(A,s,o),A},Zh=function(r,o,a,s){return G.makeSymbol(r,"Size"+o+"-Regular",a,s)},p0=function(r,o,a,s,d,v){var x=Zh(r,o,d,s),A=ji(G.makeSpan(["delimsizing","size"+o],[x],s),De.TEXT,s,v);return a&&f0(A,s,De.TEXT),A},Gi=function(r,o,a){var s;o==="Size1-Regular"?s="delim-size1":s="delim-size4";var d=G.makeSpan(["delimsizinginner",s],[G.makeSpan([],[G.makeSymbol(r,o,a)])]);return{type:"elem",elem:d}},Wi=function(r,o,a){var s=ye["Size4-Regular"][r.charCodeAt(0)]?ye["Size4-Regular"][r.charCodeAt(0)][4]:ye["Size1-Regular"][r.charCodeAt(0)][4],d=new Ir("inner",Xt(r,Math.round(1e3*o))),v=new Cr([d],{width:be(s),height:be(o),style:"width:"+be(s),viewBox:"0 0 "+1e3*s+" "+Math.round(1e3*o),preserveAspectRatio:"xMinYMin"}),x=G.makeSvgSpan([],[v],a);return x.height=o,x.style.height=be(o),x.style.width=be(s),{type:"elem",elem:x}},Xi=.008,Ta={type:"kern",size:-1*Xi},Jh=["|","\\lvert","\\rvert","\\vert"],Qh=["\\|","\\lVert","\\rVert","\\Vert"],m0=function(r,o,a,s,d,v){var x,A,z,F,W="",Q=0;x=z=F=r,A=null;var J="Size1-Regular";r==="\\uparrow"?z=F="⏐":r==="\\Uparrow"?z=F="‖":r==="\\downarrow"?x=z="⏐":r==="\\Downarrow"?x=z="‖":r==="\\updownarrow"?(x="\\uparrow",z="⏐",F="\\downarrow"):r==="\\Updownarrow"?(x="\\Uparrow",z="‖",F="\\Downarrow"):E.contains(Jh,r)?(z="∣",W="vert",Q=333):E.contains(Qh,r)?(z="∥",W="doublevert",Q=556):r==="["||r==="\\lbrack"?(x="⎡",z="⎢",F="⎣",J="Size4-Regular",W="lbrack",Q=667):r==="]"||r==="\\rbrack"?(x="⎤",z="⎥",F="⎦",J="Size4-Regular",W="rbrack",Q=667):r==="\\lfloor"||r==="⌊"?(z=x="⎢",F="⎣",J="Size4-Regular",W="lfloor",Q=667):r==="\\lceil"||r==="⌈"?(x="⎡",z=F="⎢",J="Size4-Regular",W="lceil",Q=667):r==="\\rfloor"||r==="⌋"?(z=x="⎥",F="⎦",J="Size4-Regular",W="rfloor",Q=667):r==="\\rceil"||r==="⌉"?(x="⎤",z=F="⎥",J="Size4-Regular",W="rceil",Q=667):r==="("||r==="\\lparen"?(x="⎛",z="⎜",F="⎝",J="Size4-Regular",W="lparen",Q=875):r===")"||r==="\\rparen"?(x="⎞",z="⎟",F="⎠",J="Size4-Regular",W="rparen",Q=875):r==="\\{"||r==="\\lbrace"?(x="⎧",A="⎨",F="⎩",z="⎪",J="Size4-Regular"):r==="\\}"||r==="\\rbrace"?(x="⎫",A="⎬",F="⎭",z="⎪",J="Size4-Regular"):r==="\\lgroup"||r==="⟮"?(x="⎧",F="⎩",z="⎪",J="Size4-Regular"):r==="\\rgroup"||r==="⟯"?(x="⎫",F="⎭",z="⎪",J="Size4-Regular"):r==="\\lmoustache"||r==="⎰"?(x="⎧",F="⎭",z="⎪",J="Size4-Regular"):(r==="\\rmoustache"||r==="⎱")&&(x="⎫",F="⎩",z="⎪",J="Size4-Regular");var re=Do(x,J,d),ge=re.height+re.depth,Ae=Do(z,J,d),Me=Ae.height+Ae.depth,Ne=Do(F,J,d),qe=Ne.height+Ne.depth,nt=0,We=1;if(A!==null){var st=Do(A,J,d);nt=st.height+st.depth,We=2}var et=ge+qe+nt,ct=Math.max(0,Math.ceil((o-et)/(We*Me))),yt=et+ct*We*Me,$t=s.fontMetrics().axisHeight;a&&($t*=s.sizeMultiplier);var or=yt/2-$t,Tt=[];if(W.length>0){var In=yt-ge-qe,mr=Math.round(yt*1e3),Gt=Te(W,Math.round(In*1e3)),pn=new Ir(W,Gt),Qn=(Q/1e3).toFixed(3)+"em",eo=(mr/1e3).toFixed(3)+"em",fs=new Cr([pn],{width:Qn,height:eo,viewBox:"0 0 "+Q+" "+mr}),mn=G.makeSvgSpan([],[fs],s);mn.height=mr/1e3,mn.style.width=Qn,mn.style.height=eo,Tt.push({type:"elem",elem:mn})}else{if(Tt.push(Gi(F,J,d)),Tt.push(Ta),A===null){var vn=yt-ge-qe+2*Xi;Tt.push(Wi(z,vn,s))}else{var vr=(yt-ge-qe-nt)/2+2*Xi;Tt.push(Wi(z,vr,s)),Tt.push(Ta),Tt.push(Gi(A,J,d)),Tt.push(Ta),Tt.push(Wi(z,vr,s))}Tt.push(Ta),Tt.push(Gi(x,J,d))}var Ro=s.havingBaseStyle(De.TEXT),ps=G.makeVList({positionType:"bottom",positionData:or,children:Tt},Ro);return ji(G.makeSpan(["delimsizing","mult"],[ps],Ro),De.TEXT,s,v)},Yi=80,Ki=.08,Zi=function(r,o,a,s,d){var v=cn(r,s,a),x=new Ir(r,v),A=new Cr([x],{width:"400em",height:be(o),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return G.makeSvgSpan(["hide-tail"],[A],d)},e1=function(r,o){var a=o.havingBaseSizing(),s=y0("\\surd",r*a.sizeMultiplier,b0,a),d=a.sizeMultiplier,v=Math.max(0,o.minRuleThickness-o.fontMetrics().sqrtRuleThickness),x,A=0,z=0,F=0,W;return s.type==="small"?(F=1e3+1e3*v+Yi,r<1?d=1:r<1.4&&(d=.7),A=(1+v+Ki)/d,z=(1+v)/d,x=Zi("sqrtMain",A,F,v,o),x.style.minWidth="0.853em",W=.833/d):s.type==="large"?(F=(1e3+Yi)*zo[s.size],z=(zo[s.size]+v)/d,A=(zo[s.size]+v+Ki)/d,x=Zi("sqrtSize"+s.size,A,F,v,o),x.style.minWidth="1.02em",W=1/d):(A=r+v+Ki,z=r+v,F=Math.floor(1e3*r+v)+Yi,x=Zi("sqrtTall",A,F,v,o),x.style.minWidth="0.742em",W=1.056),x.height=z,x.style.height=be(A),{span:x,advanceWidth:W,ruleWidth:(o.fontMetrics().sqrtRuleThickness+v)*d}},v0=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"],t1=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"],g0=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],zo=[0,1.2,1.8,2.4,3],r1=function(r,o,a,s,d){if(r==="<"||r==="\\lt"||r==="⟨"?r="\\langle":(r===">"||r==="\\gt"||r==="⟩")&&(r="\\rangle"),E.contains(v0,r)||E.contains(g0,r))return p0(r,o,!1,a,s,d);if(E.contains(t1,r))return m0(r,zo[o],!1,a,s,d);throw new l("Illegal delimiter: '"+r+"'")},n1=[{type:"small",style:De.SCRIPTSCRIPT},{type:"small",style:De.SCRIPT},{type:"small",style:De.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],o1=[{type:"small",style:De.SCRIPTSCRIPT},{type:"small",style:De.SCRIPT},{type:"small",style:De.TEXT},{type:"stack"}],b0=[{type:"small",style:De.SCRIPTSCRIPT},{type:"small",style:De.SCRIPT},{type:"small",style:De.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],a1=function(r){if(r.type==="small")return"Main-Regular";if(r.type==="large")return"Size"+r.size+"-Regular";if(r.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+r.type+"' here.")},y0=function(r,o,a,s){for(var d=Math.min(2,3-s.style.size),v=d;vo)return a[v]}return a[a.length-1]},x0=function(r,o,a,s,d,v){r==="<"||r==="\\lt"||r==="⟨"?r="\\langle":(r===">"||r==="\\gt"||r==="⟩")&&(r="\\rangle");var x;E.contains(g0,r)?x=n1:E.contains(v0,r)?x=b0:x=o1;var A=y0(r,o,x,s);return A.type==="small"?Kh(r,A.style,a,s,d,v):A.type==="large"?p0(r,A.size,a,s,d,v):m0(r,o,a,s,d,v)},i1=function(r,o,a,s,d,v){var x=s.fontMetrics().axisHeight*s.sizeMultiplier,A=901,z=5/s.fontMetrics().ptPerEm,F=Math.max(o-x,a+x),W=Math.max(F/500*A,2*F-z);return x0(r,W,!0,s,d,v)},Qr={sqrtImage:e1,sizedDelim:r1,sizeToMaxHeight:zo,customSizedDelim:x0,leftRightDelim:i1},w0={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},s1=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function _a(m,r){var o=Sa(m);if(o&&E.contains(s1,o.text))return o;throw o?new l("Invalid delimiter '"+o.text+"' after '"+r.funcName+"'",m):new l("Invalid delimiter type '"+m.type+"'",m)}_e({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(r,o){var a=_a(o[0],r);return{type:"delimsizing",mode:r.parser.mode,size:w0[r.funcName].size,mclass:w0[r.funcName].mclass,delim:a.text}},htmlBuilder:function(r,o){return r.delim==="."?G.makeSpan([r.mclass]):Qr.sizedDelim(r.delim,r.size,o,r.mode,[r.mclass])},mathmlBuilder:function(r){var o=[];r.delim!=="."&&o.push(pr(r.delim,r.mode));var a=new ce.MathNode("mo",o);r.mclass==="mopen"||r.mclass==="mclose"?a.setAttribute("fence","true"):a.setAttribute("fence","false"),a.setAttribute("stretchy","true");var s=be(Qr.sizeToMaxHeight[r.size]);return a.setAttribute("minsize",s),a.setAttribute("maxsize",s),a}});function k0(m){if(!m.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}_e({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(r,o){var a=r.parser.gullet.macros.get("\\current@color");if(a&&typeof a!="string")throw new l("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:r.parser.mode,delim:_a(o[0],r).text,color:a}}}),_e({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(r,o){var a=_a(o[0],r),s=r.parser;++s.leftrightDepth;var d=s.parseExpression(!1);--s.leftrightDepth,s.expect("\\right",!1);var v=Ge(s.parseFunction(),"leftright-right");return{type:"leftright",mode:s.mode,body:d,left:a.text,right:v.delim,rightColor:v.color}},htmlBuilder:function(r,o){k0(r);for(var a=qt(r.body,o,!0,["mopen","mclose"]),s=0,d=0,v=!1,x=0;x-1?"mpadded":"menclose",[ft(r.body,o)]);switch(r.label){case"\\cancel":s.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":s.setAttribute("notation","downdiagonalstrike");break;case"\\phase":s.setAttribute("notation","phasorangle");break;case"\\sout":s.setAttribute("notation","horizontalstrike");break;case"\\fbox":s.setAttribute("notation","box");break;case"\\angl":s.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(a=o.fontMetrics().fboxsep*o.fontMetrics().ptPerEm,s.setAttribute("width","+"+2*a+"pt"),s.setAttribute("height","+"+2*a+"pt"),s.setAttribute("lspace",a+"pt"),s.setAttribute("voffset",a+"pt"),r.label==="\\fcolorbox"){var d=Math.max(o.fontMetrics().fboxrule,o.minRuleThickness);s.setAttribute("style","border: "+d+"em solid "+String(r.borderColor))}break;case"\\xcancel":s.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return r.backgroundColor&&s.setAttribute("mathbackground",r.backgroundColor),s};_e({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(r,o,a){var s=r.parser,d=r.funcName,v=Ge(o[0],"color-token").color,x=o[1];return{type:"enclose",mode:s.mode,label:d,backgroundColor:v,body:x}},htmlBuilder:Ji,mathmlBuilder:Qi}),_e({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(r,o,a){var s=r.parser,d=r.funcName,v=Ge(o[0],"color-token").color,x=Ge(o[1],"color-token").color,A=o[2];return{type:"enclose",mode:s.mode,label:d,backgroundColor:x,borderColor:v,body:A}},htmlBuilder:Ji,mathmlBuilder:Qi}),_e({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(r,o){var a=r.parser;return{type:"enclose",mode:a.mode,label:"\\fbox",body:o[0]}}}),_e({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[0];return{type:"enclose",mode:a.mode,label:s,body:d}},htmlBuilder:Ji,mathmlBuilder:Qi}),_e({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(r,o){var a=r.parser;return{type:"enclose",mode:a.mode,label:"\\angl",body:o[0]}}});var S0={};function Pr(m){for(var r=m.type,o=m.names,a=m.props,s=m.handler,d=m.htmlBuilder,v=m.mathmlBuilder,x={type:r,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:s},A=0;A1||!F)&&ge.pop(),Me.length0&&(qe+=.25),z.push({pos:qe,isDashed:Ma[Ba]})}for(nt(v[0]),a=0;a0&&(or+=Ne,et=x)){var ro=void 0;(s>0||r.hskipBeforeAndAfter)&&(ro=E.deflt(vr.pregap,Q),ro!==0&&(Gt=G.makeSpan(["arraycolsep"],[]),Gt.style.width=be(ro),mr.push(Gt)));var no=[];for(a=0;a0){for(var P1=G.makeLineSpan("hline",o,F),N1=G.makeLineSpan("hdashline",o,F),ms=[{type:"elem",elem:A,shift:0}];z.length>0;){var sc=z.pop(),lc=sc.pos-Tt;sc.isDashed?ms.push({type:"elem",elem:N1,shift:lc}):ms.push({type:"elem",elem:P1,shift:lc})}A=G.makeVList({positionType:"individualShift",children:ms},o)}if(Qn.length===0)return G.makeSpan(["mord"],[A],o);var vs=G.makeVList({positionType:"individualShift",children:Qn},o);return vs=G.makeSpan(["tag"],[vs],o),G.makeFragment([A,vs])},l1={c:"center ",l:"left ",r:"right "},Fr=function(r,o){for(var a=[],s=new ce.MathNode("mtd",[],["mtr-glue"]),d=new ce.MathNode("mtd",[],["mml-eqn-num"]),v=0;v0){var re=r.cols,ge="",Ae=!1,Me=0,Ne=re.length;re[0].type==="separator"&&(Q+="top ",Me=1),re[re.length-1].type==="separator"&&(Q+="bottom ",Ne-=1);for(var qe=Me;qe0?"left ":"",Q+=ct[ct.length-1].length>0?"right ":"";for(var yt=1;yt-1?"alignat":"align",d=r.envName==="split",v=hn(r.parser,{cols:a,addJot:!0,autoTag:d?void 0:es(r.envName),emptySingleRow:!0,colSeparationType:s,maxNumCols:d?2:void 0,leqno:r.parser.settings.leqno},"display"),x,A=0,z={type:"ordgroup",mode:r.mode,body:[]};if(o[0]&&o[0].type==="ordgroup"){for(var F="",W=0;W0&&J&&(Ae=1),a[re]={type:"align",align:ge,pregap:Ae,postgap:0}}return v.colSeparationType=J?"align":"alignat",v};Pr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(r,o){var a=Sa(o[0]),s=a?[o[0]]:Ge(o[0],"ordgroup").body,d=s.map(function(x){var A=Ui(x),z=A.text;if("lcr".indexOf(z)!==-1)return{type:"align",align:z};if(z==="|")return{type:"separator",separator:"|"};if(z===":")return{type:"separator",separator:":"};throw new l("Unknown column alignment: "+z,x)}),v={cols:d,hskipBeforeAndAfter:!0,maxNumCols:d.length};return hn(r.parser,v,ts(r.envName))},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(r){var o={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[r.envName.replace("*","")],a="c",s={hskipBeforeAndAfter:!1,cols:[{type:"align",align:a}]};if(r.envName.charAt(r.envName.length-1)==="*"){var d=r.parser;if(d.consumeSpaces(),d.fetch().text==="["){if(d.consume(),d.consumeSpaces(),a=d.fetch().text,"lcr".indexOf(a)===-1)throw new l("Expected l or c or r",d.nextToken);d.consume(),d.consumeSpaces(),d.expect("]"),d.consume(),s.cols=[{type:"align",align:a}]}}var v=hn(r.parser,s,ts(r.envName)),x=Math.max.apply(Math,[0].concat(v.body.map(function(A){return A.length})));return v.cols=new Array(x).fill({type:"align",align:a}),o?{type:"leftright",mode:r.mode,body:[v],left:o[0],right:o[1],rightColor:void 0}:v},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(r){var o={arraystretch:.5},a=hn(r.parser,o,"script");return a.colSeparationType="small",a},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["subarray"],props:{numArgs:1},handler:function(r,o){var a=Sa(o[0]),s=a?[o[0]]:Ge(o[0],"ordgroup").body,d=s.map(function(x){var A=Ui(x),z=A.text;if("lc".indexOf(z)!==-1)return{type:"align",align:z};throw new l("Unknown column alignment: "+z,x)});if(d.length>1)throw new l("{subarray} can contain only one column");var v={cols:d,hskipBeforeAndAfter:!1,arraystretch:.5};if(v=hn(r.parser,v,"script"),v.body.length>0&&v.body[0].length>1)throw new l("{subarray} can contain only one column");return v},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(r){var o={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},a=hn(r.parser,o,ts(r.envName));return{type:"leftright",mode:r.mode,body:[a],left:r.envName.indexOf("r")>-1?".":"\\{",right:r.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:T0,htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(r){E.contains(["gather","gather*"],r.envName)&&Da(r);var o={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:es(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return hn(r.parser,o,"display")},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:T0,htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(r){Da(r);var o={autoTag:es(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return hn(r.parser,o,"display")},htmlBuilder:qr,mathmlBuilder:Fr}),Pr({type:"array",names:["CD"],props:{numArgs:0},handler:function(r){return Da(r),Xh(r.parser)},htmlBuilder:qr,mathmlBuilder:Fr}),T("\\nonumber","\\gdef\\@eqnsw{0}"),T("\\notag","\\nonumber"),_e({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(r,o){throw new l(r.funcName+" valid only within array environment")}});var c1=S0,_0=c1;_e({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[0];if(d.type!=="ordgroup")throw new l("Invalid environment name",d);for(var v="",x=0;x=De.SCRIPT.id?a.text():De.DISPLAY:r==="text"&&a.size===De.DISPLAY.size?a=De.TEXT:r==="script"?a=De.SCRIPT:r==="scriptscript"&&(a=De.SCRIPTSCRIPT),a},rs=function(r,o){var a=R0(r.size,o.style),s=a.fracNum(),d=a.fracDen(),v;v=o.havingStyle(s);var x=Qe(r.numer,v,o);if(r.continued){var A=8.5/o.fontMetrics().ptPerEm,z=3.5/o.fontMetrics().ptPerEm;x.height=x.height0?ge=3*J:ge=7*J,Ae=o.fontMetrics().denom1):(Q>0?(re=o.fontMetrics().num2,ge=J):(re=o.fontMetrics().num3,ge=3*J),Ae=o.fontMetrics().denom2);var Me;if(W){var qe=o.fontMetrics().axisHeight;re-x.depth-(qe+.5*Q)0&&(o=r,o=o==="."?null:o),o};_e({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(r,o){var a=r.parser,s=o[4],d=o[5],v=wa(o[0]),x=v.type==="atom"&&v.family==="open"?B0(v.text):null,A=wa(o[1]),z=A.type==="atom"&&A.family==="close"?B0(A.text):null,F=Ge(o[2],"size"),W,Q=null;F.isBlank?W=!0:(Q=F.value,W=Q.number>0);var J="auto",re=o[3];if(re.type==="ordgroup"){if(re.body.length>0){var ge=Ge(re.body[0],"textord");J=M0[Number(ge.text)]}}else re=Ge(re,"textord"),J=M0[Number(re.text)];return{type:"genfrac",mode:a.mode,numer:s,denom:d,continued:!1,hasBarLine:W,barSize:Q,leftDelim:x,rightDelim:z,size:J}},htmlBuilder:rs,mathmlBuilder:ns}),_e({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(r,o){var a=r.parser;r.funcName;var s=r.token;return{type:"infix",mode:a.mode,replaceWith:"\\\\abovefrac",size:Ge(o[0],"size").value,token:s}}}),_e({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(r,o){var a=r.parser;r.funcName;var s=o[0],d=P(Ge(o[1],"infix").size),v=o[2],x=d.number>0;return{type:"genfrac",mode:a.mode,numer:s,denom:v,continued:!1,hasBarLine:x,barSize:d,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:rs,mathmlBuilder:ns});var I0=function(r,o){var a=o.style,s,d;r.type==="supsub"?(s=r.sup?Qe(r.sup,o.havingStyle(a.sup()),o):Qe(r.sub,o.havingStyle(a.sub()),o),d=Ge(r.base,"horizBrace")):d=Ge(r,"horizBrace");var v=Qe(d.base,o.havingBaseStyle(De.DISPLAY)),x=Jr.svgSpan(d,o),A;if(d.isOver?(A=G.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:v},{type:"kern",size:.1},{type:"elem",elem:x}]},o),A.children[0].children[0].children[1].classes.push("svg-align")):(A=G.makeVList({positionType:"bottom",positionData:v.depth+.1+x.height,children:[{type:"elem",elem:x},{type:"kern",size:.1},{type:"elem",elem:v}]},o),A.children[0].children[0].children[0].classes.push("svg-align")),s){var z=G.makeSpan(["mord",d.isOver?"mover":"munder"],[A],o);d.isOver?A=G.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:z},{type:"kern",size:.2},{type:"elem",elem:s}]},o):A=G.makeVList({positionType:"bottom",positionData:z.depth+.2+s.height+s.depth,children:[{type:"elem",elem:s},{type:"kern",size:.2},{type:"elem",elem:z}]},o)}return G.makeSpan(["mord",d.isOver?"mover":"munder"],[A],o)},u1=function(r,o){var a=Jr.mathMLnode(r.label);return new ce.MathNode(r.isOver?"mover":"munder",[ft(r.base,o),a])};_e({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(r,o){var a=r.parser,s=r.funcName;return{type:"horizBrace",mode:a.mode,label:s,isOver:/^\\over/.test(s),base:o[0]}},htmlBuilder:I0,mathmlBuilder:u1}),_e({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(r,o){var a=r.parser,s=o[1],d=Ge(o[0],"url").url;return a.settings.isTrusted({command:"\\href",url:d})?{type:"href",mode:a.mode,href:d,body:Et(s)}:a.formatUnsupportedCmd("\\href")},htmlBuilder:function(r,o){var a=qt(r.body,o,!1);return G.makeAnchor(r.href,[],a,o)},mathmlBuilder:function(r,o){var a=dn(r.body,o);return a instanceof fr||(a=new fr("mrow",[a])),a.setAttribute("href",r.href),a}}),_e({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(r,o){var a=r.parser,s=Ge(o[0],"url").url;if(!a.settings.isTrusted({command:"\\url",url:s}))return a.formatUnsupportedCmd("\\url");for(var d=[],v=0;v0&&(s=bt(r.totalheight,o)-a);var d=0;r.width.number>0&&(d=bt(r.width,o));var v={height:be(a+s)};d>0&&(v.width=be(d)),s>0&&(v.verticalAlign=be(-s));var x=new Ei(r.src,r.alt,v);return x.height=a,x.depth=s,x},mathmlBuilder:function(r,o){var a=new ce.MathNode("mglyph",[]);a.setAttribute("alt",r.alt);var s=bt(r.height,o),d=0;if(r.totalheight.number>0&&(d=bt(r.totalheight,o)-s,a.setAttribute("valign",be(-d))),a.setAttribute("height",be(s+d)),r.width.number>0){var v=bt(r.width,o);a.setAttribute("width",be(v))}return a.setAttribute("src",r.src),a}}),_e({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(r,o){var a=r.parser,s=r.funcName,d=Ge(o[0],"size");if(a.settings.strict){var v=s[1]==="m",x=d.value.unit==="mu";v?(x||a.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+s+" supports only mu units, "+("not "+d.value.unit+" units")),a.mode!=="math"&&a.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+s+" works only in math mode")):x&&a.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+s+" doesn't support mu units")}return{type:"kern",mode:a.mode,dimension:d.value}},htmlBuilder:function(r,o){return G.makeGlue(r.dimension,o)},mathmlBuilder:function(r,o){var a=bt(r.dimension,o);return new ce.SpaceNode(a)}}),_e({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[0];return{type:"lap",mode:a.mode,alignment:s.slice(5),body:d}},htmlBuilder:function(r,o){var a;r.alignment==="clap"?(a=G.makeSpan([],[Qe(r.body,o)]),a=G.makeSpan(["inner"],[a],o)):a=G.makeSpan(["inner"],[Qe(r.body,o)]);var s=G.makeSpan(["fix"],[]),d=G.makeSpan([r.alignment],[a,s],o),v=G.makeSpan(["strut"]);return v.style.height=be(d.height+d.depth),d.depth&&(v.style.verticalAlign=be(-d.depth)),d.children.unshift(v),d=G.makeSpan(["thinbox"],[d],o),G.makeSpan(["mord","vbox"],[d],o)},mathmlBuilder:function(r,o){var a=new ce.MathNode("mpadded",[ft(r.body,o)]);if(r.alignment!=="rlap"){var s=r.alignment==="llap"?"-1":"-0.5";a.setAttribute("lspace",s+"width")}return a.setAttribute("width","0px"),a}}),_e({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(r,o){var a=r.funcName,s=r.parser,d=s.mode;s.switchMode("math");var v=a==="\\("?"\\)":"$",x=s.parseExpression(!1,v);return s.expect(v),s.switchMode(d),{type:"styling",mode:s.mode,style:"text",body:x}}}),_e({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(r,o){throw new l("Mismatched "+r.funcName)}});var P0=function(r,o){switch(o.style.size){case De.DISPLAY.size:return r.display;case De.TEXT.size:return r.text;case De.SCRIPT.size:return r.script;case De.SCRIPTSCRIPT.size:return r.scriptscript;default:return r.text}};_e({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(r,o){var a=r.parser;return{type:"mathchoice",mode:a.mode,display:Et(o[0]),text:Et(o[1]),script:Et(o[2]),scriptscript:Et(o[3])}},htmlBuilder:function(r,o){var a=P0(r,o),s=qt(a,o,!1);return G.makeFragment(s)},mathmlBuilder:function(r,o){var a=P0(r,o);return dn(a,o)}});var N0=function(r,o,a,s,d,v,x){r=G.makeSpan([],[r]);var A=a&&E.isCharacterBox(a),z,F;if(o){var W=Qe(o,s.havingStyle(d.sup()),s);F={elem:W,kern:Math.max(s.fontMetrics().bigOpSpacing1,s.fontMetrics().bigOpSpacing3-W.depth)}}if(a){var Q=Qe(a,s.havingStyle(d.sub()),s);z={elem:Q,kern:Math.max(s.fontMetrics().bigOpSpacing2,s.fontMetrics().bigOpSpacing4-Q.height)}}var J;if(F&&z){var re=s.fontMetrics().bigOpSpacing5+z.elem.height+z.elem.depth+z.kern+r.depth+x;J=G.makeVList({positionType:"bottom",positionData:re,children:[{type:"kern",size:s.fontMetrics().bigOpSpacing5},{type:"elem",elem:z.elem,marginLeft:be(-v)},{type:"kern",size:z.kern},{type:"elem",elem:r},{type:"kern",size:F.kern},{type:"elem",elem:F.elem,marginLeft:be(v)},{type:"kern",size:s.fontMetrics().bigOpSpacing5}]},s)}else if(z){var ge=r.height-x;J=G.makeVList({positionType:"top",positionData:ge,children:[{type:"kern",size:s.fontMetrics().bigOpSpacing5},{type:"elem",elem:z.elem,marginLeft:be(-v)},{type:"kern",size:z.kern},{type:"elem",elem:r}]},s)}else if(F){var Ae=r.depth+x;J=G.makeVList({positionType:"bottom",positionData:Ae,children:[{type:"elem",elem:r},{type:"kern",size:F.kern},{type:"elem",elem:F.elem,marginLeft:be(v)},{type:"kern",size:s.fontMetrics().bigOpSpacing5}]},s)}else return r;var Me=[J];if(z&&v!==0&&!A){var Ne=G.makeSpan(["mspace"],[],s);Ne.style.marginRight=be(v),Me.unshift(Ne)}return G.makeSpan(["mop","op-limits"],Me,s)},q0=["\\smallint"],Jn=function(r,o){var a,s,d=!1,v;r.type==="supsub"?(a=r.sup,s=r.sub,v=Ge(r.base,"op"),d=!0):v=Ge(r,"op");var x=o.style,A=!1;x.size===De.DISPLAY.size&&v.symbol&&!E.contains(q0,v.name)&&(A=!0);var z;if(v.symbol){var F=A?"Size2-Regular":"Size1-Regular",W="";if((v.name==="\\oiint"||v.name==="\\oiiint")&&(W=v.name.slice(1),v.name=W==="oiint"?"\\iint":"\\iiint"),z=G.makeSymbol(v.name,F,"math",o,["mop","op-symbol",A?"large-op":"small-op"]),W.length>0){var Q=z.italic,J=G.staticSvg(W+"Size"+(A?"2":"1"),o);z=G.makeVList({positionType:"individualShift",children:[{type:"elem",elem:z,shift:0},{type:"elem",elem:J,shift:A?.08:0}]},o),v.name="\\"+W,z.classes.unshift("mop"),z.italic=Q}}else if(v.body){var re=qt(v.body,o,!0);re.length===1&&re[0]instanceof Yt?(z=re[0],z.classes[0]="mop"):z=G.makeSpan(["mop"],re,o)}else{for(var ge=[],Ae=1;Ae0){for(var A=v.body.map(function(Q){var J=Q.text;return typeof J=="string"?{type:"textord",mode:Q.mode,text:J}:Q}),z=qt(A,o.withFont("mathrm"),!0),F=0;F=0?A.setAttribute("height",be(d)):(A.setAttribute("height",be(d)),A.setAttribute("depth",be(-d))),A.setAttribute("voffset",be(d)),A}});function L0(m,r,o){for(var a=qt(m,r,!1),s=r.sizeMultiplier/o.sizeMultiplier,d=0;da.height+a.depth+x&&(x=(x+J-a.height-a.depth)/2);var re=F.height-a.height-x-W;a.style.paddingLeft=be(Q);var ge=G.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:-(a.height+re)},{type:"elem",elem:F},{type:"kern",size:W}]},o);if(r.index){var Ae=o.havingStyle(De.SCRIPTSCRIPT),Me=Qe(r.index,Ae,o),Ne=.6*(ge.height-ge.depth),qe=G.makeVList({positionType:"shift",positionData:-Ne,children:[{type:"elem",elem:Me}]},o),nt=G.makeSpan(["root"],[qe]);return G.makeSpan(["mord","sqrt"],[nt,ge],o)}else return G.makeSpan(["mord","sqrt"],[ge],o)},mathmlBuilder:function(r,o){var a=r.body,s=r.index;return s?new ce.MathNode("mroot",[ft(a,o),ft(s,o)]):new ce.MathNode("msqrt",[ft(a,o)])}});var O0={display:De.DISPLAY,text:De.TEXT,script:De.SCRIPT,scriptscript:De.SCRIPTSCRIPT};_e({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(r,o){var a=r.breakOnTokenText,s=r.funcName,d=r.parser,v=d.parseExpression(!0,a),x=s.slice(1,s.length-5);return{type:"styling",mode:d.mode,style:x,body:v}},htmlBuilder:function(r,o){var a=O0[r.style],s=o.havingStyle(a).withFont("");return L0(r.body,s,o)},mathmlBuilder:function(r,o){var a=O0[r.style],s=o.havingStyle(a),d=Jt(r.body,s),v=new ce.MathNode("mstyle",d),x={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},A=x[r.style];return v.setAttribute("scriptlevel",A[0]),v.setAttribute("displaystyle",A[1]),v}});var m1=function(r,o){var a=r.base;if(a)if(a.type==="op"){var s=a.limits&&(o.style.size===De.DISPLAY.size||a.alwaysHandleSupSub);return s?Jn:null}else if(a.type==="operatorname"){var d=a.alwaysHandleSupSub&&(o.style.size===De.DISPLAY.size||a.limits);return d?F0:null}else{if(a.type==="accent")return E.isCharacterBox(a.base)?Hi:null;if(a.type==="horizBrace"){var v=!r.sub;return v===a.isOver?I0:null}else return null}else return null};Bn({type:"supsub",htmlBuilder:function(r,o){var a=m1(r,o);if(a)return a(r,o);var s=r.base,d=r.sup,v=r.sub,x=Qe(s,o),A,z,F=o.fontMetrics(),W=0,Q=0,J=s&&E.isCharacterBox(s);if(d){var re=o.havingStyle(o.style.sup());A=Qe(d,re,o),J||(W=x.height-re.fontMetrics().supDrop*re.sizeMultiplier/o.sizeMultiplier)}if(v){var ge=o.havingStyle(o.style.sub());z=Qe(v,ge,o),J||(Q=x.depth+ge.fontMetrics().subDrop*ge.sizeMultiplier/o.sizeMultiplier)}var Ae;o.style===De.DISPLAY?Ae=F.sup1:o.style.cramped?Ae=F.sup3:Ae=F.sup2;var Me=o.sizeMultiplier,Ne=be(.5/F.ptPerEm/Me),qe=null;if(z){var nt=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(x instanceof Yt||nt)&&(qe=be(-x.italic))}var We;if(A&&z){W=Math.max(W,Ae,A.depth+.25*F.xHeight),Q=Math.max(Q,F.sub2);var st=F.defaultRuleThickness,et=4*st;if(W-A.depth-(z.height-Q)0&&(W+=ct,Q-=ct)}var yt=[{type:"elem",elem:z,shift:Q,marginRight:Ne,marginLeft:qe},{type:"elem",elem:A,shift:-W,marginRight:Ne}];We=G.makeVList({positionType:"individualShift",children:yt},o)}else if(z){Q=Math.max(Q,F.sub1,z.height-.8*F.xHeight);var $t=[{type:"elem",elem:z,marginLeft:qe,marginRight:Ne}];We=G.makeVList({positionType:"shift",positionData:Q,children:$t},o)}else if(A)W=Math.max(W,Ae,A.depth+.25*F.xHeight),We=G.makeVList({positionType:"shift",positionData:-W,children:[{type:"elem",elem:A,marginRight:Ne}]},o);else throw new Error("supsub must have either sup or sub.");var or=Fi(x,"right")||"mord";return G.makeSpan([or],[x,G.makeSpan(["msupsub"],[We])],o)},mathmlBuilder:function(r,o){var a=!1,s,d;r.base&&r.base.type==="horizBrace"&&(d=!!r.sup,d===r.base.isOver&&(a=!0,s=r.base.isOver)),r.base&&(r.base.type==="op"||r.base.type==="operatorname")&&(r.base.parentIsSupSub=!0);var v=[ft(r.base,o)];r.sub&&v.push(ft(r.sub,o)),r.sup&&v.push(ft(r.sup,o));var x;if(a)x=s?"mover":"munder";else if(r.sub)if(r.sup){var F=r.base;F&&F.type==="op"&&F.limits&&o.style===De.DISPLAY||F&&F.type==="operatorname"&&F.alwaysHandleSupSub&&(o.style===De.DISPLAY||F.limits)?x="munderover":x="msubsup"}else{var z=r.base;z&&z.type==="op"&&z.limits&&(o.style===De.DISPLAY||z.alwaysHandleSupSub)||z&&z.type==="operatorname"&&z.alwaysHandleSupSub&&(z.limits||o.style===De.DISPLAY)?x="munder":x="msub"}else{var A=r.base;A&&A.type==="op"&&A.limits&&(o.style===De.DISPLAY||A.alwaysHandleSupSub)||A&&A.type==="operatorname"&&A.alwaysHandleSupSub&&(A.limits||o.style===De.DISPLAY)?x="mover":x="msup"}return new ce.MathNode(x,v)}}),Bn({type:"atom",htmlBuilder:function(r,o){return G.mathsym(r.text,r.mode,o,["m"+r.family])},mathmlBuilder:function(r,o){var a=new ce.MathNode("mo",[pr(r.text,r.mode)]);if(r.family==="bin"){var s=Oi(r,o);s==="bold-italic"&&a.setAttribute("mathvariant",s)}else r.family==="punct"?a.setAttribute("separator","true"):(r.family==="open"||r.family==="close")&&a.setAttribute("stretchy","false");return a}});var U0={mi:"italic",mn:"normal",mtext:"normal"};Bn({type:"mathord",htmlBuilder:function(r,o){return G.makeOrd(r,o,"mathord")},mathmlBuilder:function(r,o){var a=new ce.MathNode("mi",[pr(r.text,r.mode,o)]),s=Oi(r,o)||"italic";return s!==U0[a.type]&&a.setAttribute("mathvariant",s),a}}),Bn({type:"textord",htmlBuilder:function(r,o){return G.makeOrd(r,o,"textord")},mathmlBuilder:function(r,o){var a=pr(r.text,r.mode,o),s=Oi(r,o)||"normal",d;return r.mode==="text"?d=new ce.MathNode("mtext",[a]):/[0-9]/.test(r.text)?d=new ce.MathNode("mn",[a]):r.text==="\\prime"?d=new ce.MathNode("mo",[a]):d=new ce.MathNode("mi",[a]),s!==U0[d.type]&&d.setAttribute("mathvariant",s),d}});var as={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},is={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Bn({type:"spacing",htmlBuilder:function(r,o){if(is.hasOwnProperty(r.text)){var a=is[r.text].className||"";if(r.mode==="text"){var s=G.makeOrd(r,o,"textord");return s.classes.push(a),s}else return G.makeSpan(["mspace",a],[G.mathsym(r.text,r.mode,o)],o)}else{if(as.hasOwnProperty(r.text))return G.makeSpan(["mspace",as[r.text]],[],o);throw new l('Unknown type of space "'+r.text+'"')}},mathmlBuilder:function(r,o){var a;if(is.hasOwnProperty(r.text))a=new ce.MathNode("mtext",[new ce.TextNode(" ")]);else{if(as.hasOwnProperty(r.text))return new ce.MathNode("mspace");throw new l('Unknown type of space "'+r.text+'"')}return a}});var H0=function(){var r=new ce.MathNode("mtd",[]);return r.setAttribute("width","50%"),r};Bn({type:"tag",mathmlBuilder:function(r,o){var a=new ce.MathNode("mtable",[new ce.MathNode("mtr",[H0(),new ce.MathNode("mtd",[dn(r.body,o)]),H0(),new ce.MathNode("mtd",[dn(r.tag,o)])])]);return a.setAttribute("width","100%"),a}});var V0={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},j0={"\\textbf":"textbf","\\textmd":"textmd"},v1={"\\textit":"textit","\\textup":"textup"},G0=function(r,o){var a=r.font;return a?V0[a]?o.withTextFontFamily(V0[a]):j0[a]?o.withTextFontWeight(j0[a]):o.withTextFontShape(v1[a]):o};_e({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(r,o){var a=r.parser,s=r.funcName,d=o[0];return{type:"text",mode:a.mode,body:Et(d),font:s}},htmlBuilder:function(r,o){var a=G0(r,o),s=qt(r.body,a,!0);return G.makeSpan(["mord","text"],s,a)},mathmlBuilder:function(r,o){var a=G0(r,o);return dn(r.body,a)}}),_e({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(r,o){var a=r.parser;return{type:"underline",mode:a.mode,body:o[0]}},htmlBuilder:function(r,o){var a=Qe(r.body,o),s=G.makeLineSpan("underline-line",o),d=o.fontMetrics().defaultRuleThickness,v=G.makeVList({positionType:"top",positionData:a.height,children:[{type:"kern",size:d},{type:"elem",elem:s},{type:"kern",size:3*d},{type:"elem",elem:a}]},o);return G.makeSpan(["mord","underline"],[v],o)},mathmlBuilder:function(r,o){var a=new ce.MathNode("mo",[new ce.TextNode("‾")]);a.setAttribute("stretchy","true");var s=new ce.MathNode("munder",[ft(r.body,o),a]);return s.setAttribute("accentunder","true"),s}}),_e({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(r,o){var a=r.parser;return{type:"vcenter",mode:a.mode,body:o[0]}},htmlBuilder:function(r,o){var a=Qe(r.body,o),s=o.fontMetrics().axisHeight,d=.5*(a.height-s-(a.depth+s));return G.makeVList({positionType:"shift",positionData:d,children:[{type:"elem",elem:a}]},o)},mathmlBuilder:function(r,o){return new ce.MathNode("mpadded",[ft(r.body,o)],["vcenter"])}}),_e({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(r,o,a){throw new l("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(r,o){for(var a=W0(r),s=[],d=o.havingStyle(o.style.text()),v=0;v0;)this.endGroup()},r.has=function(a){return this.current.hasOwnProperty(a)||this.builtins.hasOwnProperty(a)},r.get=function(a){return this.current.hasOwnProperty(a)?this.current[a]:this.builtins[a]},r.set=function(a,s,d){if(d===void 0&&(d=!1),d){for(var v=0;v0&&(this.undefStack[this.undefStack.length-1][a]=s)}else{var x=this.undefStack[this.undefStack.length-1];x&&!x.hasOwnProperty(a)&&(x[a]=this.current[a])}s==null?delete this.current[a]:this.current[a]=s},m}(),A1=C0,T1=A1;T("\\noexpand",function(m){var r=m.popToken();return m.isExpandable(r.text)&&(r.noexpand=!0,r.treatAsRelax=!0),{tokens:[r],numArgs:0}}),T("\\expandafter",function(m){var r=m.popToken();return m.expandOnce(!0),{tokens:[r],numArgs:0}}),T("\\@firstoftwo",function(m){var r=m.consumeArgs(2);return{tokens:r[0],numArgs:0}}),T("\\@secondoftwo",function(m){var r=m.consumeArgs(2);return{tokens:r[1],numArgs:0}}),T("\\@ifnextchar",function(m){var r=m.consumeArgs(3);m.consumeSpaces();var o=m.future();return r[0].length===1&&r[0][0].text===o.text?{tokens:r[1],numArgs:0}:{tokens:r[2],numArgs:0}}),T("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),T("\\TextOrMath",function(m){var r=m.consumeArgs(2);return m.mode==="text"?{tokens:r[0],numArgs:0}:{tokens:r[1],numArgs:0}});var K0={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};T("\\char",function(m){var r=m.popToken(),o,a="";if(r.text==="'")o=8,r=m.popToken();else if(r.text==='"')o=16,r=m.popToken();else if(r.text==="`")if(r=m.popToken(),r.text[0]==="\\")a=r.text.charCodeAt(1);else{if(r.text==="EOF")throw new l("\\char` missing argument");a=r.text.charCodeAt(0)}else o=10;if(o){if(a=K0[r.text],a==null||a>=o)throw new l("Invalid base-"+o+" digit "+r.text);for(var s;(s=K0[m.future().text])!=null&&s":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};T("\\dots",function(m){var r="\\dotso",o=m.expandAfterFuture().text;return o in Z0?r=Z0[o]:(o.slice(0,4)==="\\not"||o in Ct.math&&E.contains(["bin","rel"],Ct.math[o].group))&&(r="\\dotsb"),r});var cs={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};T("\\dotso",function(m){var r=m.future().text;return r in cs?"\\ldots\\,":"\\ldots"}),T("\\dotsc",function(m){var r=m.future().text;return r in cs&&r!==","?"\\ldots\\,":"\\ldots"}),T("\\cdots",function(m){var r=m.future().text;return r in cs?"\\@cdots\\,":"\\@cdots"}),T("\\dotsb","\\cdots"),T("\\dotsm","\\cdots"),T("\\dotsi","\\!\\cdots"),T("\\dotsx","\\ldots\\,"),T("\\DOTSI","\\relax"),T("\\DOTSB","\\relax"),T("\\DOTSX","\\relax"),T("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),T("\\,","\\tmspace+{3mu}{.1667em}"),T("\\thinspace","\\,"),T("\\>","\\mskip{4mu}"),T("\\:","\\tmspace+{4mu}{.2222em}"),T("\\medspace","\\:"),T("\\;","\\tmspace+{5mu}{.2777em}"),T("\\thickspace","\\;"),T("\\!","\\tmspace-{3mu}{.1667em}"),T("\\negthinspace","\\!"),T("\\negmedspace","\\tmspace-{4mu}{.2222em}"),T("\\negthickspace","\\tmspace-{5mu}{.277em}"),T("\\enspace","\\kern.5em "),T("\\enskip","\\hskip.5em\\relax"),T("\\quad","\\hskip1em\\relax"),T("\\qquad","\\hskip2em\\relax"),T("\\tag","\\@ifstar\\tag@literal\\tag@paren"),T("\\tag@paren","\\tag@literal{({#1})}"),T("\\tag@literal",function(m){if(m.macros.get("\\df@tag"))throw new l("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),T("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),T("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),T("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),T("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),T("\\newline","\\\\\\relax"),T("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var J0=be(ye["Main-Regular"]["T".charCodeAt(0)][1]-.7*ye["Main-Regular"]["A".charCodeAt(0)][1]);T("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+J0+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}"),T("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+J0+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}"),T("\\hspace","\\@ifstar\\@hspacer\\@hspace"),T("\\@hspace","\\hskip #1\\relax"),T("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),T("\\ordinarycolon",":"),T("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),T("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),T("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),T("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),T("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),T("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),T("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),T("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),T("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),T("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),T("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),T("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),T("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),T("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),T("∷","\\dblcolon"),T("∹","\\eqcolon"),T("≔","\\coloneqq"),T("≕","\\eqqcolon"),T("⩴","\\Coloneqq"),T("\\ratio","\\vcentcolon"),T("\\coloncolon","\\dblcolon"),T("\\colonequals","\\coloneqq"),T("\\coloncolonequals","\\Coloneqq"),T("\\equalscolon","\\eqqcolon"),T("\\equalscoloncolon","\\Eqqcolon"),T("\\colonminus","\\coloneq"),T("\\coloncolonminus","\\Coloneq"),T("\\minuscolon","\\eqcolon"),T("\\minuscoloncolon","\\Eqcolon"),T("\\coloncolonapprox","\\Colonapprox"),T("\\coloncolonsim","\\Colonsim"),T("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),T("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),T("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),T("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),T("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"),T("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),T("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),T("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),T("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),T("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),T("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),T("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),T("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),T("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}"),T("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}"),T("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}"),T("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}"),T("\\nleqq","\\html@mathml{\\@nleqq}{≰}"),T("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}"),T("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}"),T("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}"),T("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}"),T("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}"),T("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}"),T("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}"),T("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}"),T("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}"),T("\\imath","\\html@mathml{\\@imath}{ı}"),T("\\jmath","\\html@mathml{\\@jmath}{ȷ}"),T("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"),T("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"),T("⟦","\\llbracket"),T("⟧","\\rrbracket"),T("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"),T("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"),T("⦃","\\lBrace"),T("⦄","\\rBrace"),T("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"),T("⦵","\\minuso"),T("\\darr","\\downarrow"),T("\\dArr","\\Downarrow"),T("\\Darr","\\Downarrow"),T("\\lang","\\langle"),T("\\rang","\\rangle"),T("\\uarr","\\uparrow"),T("\\uArr","\\Uparrow"),T("\\Uarr","\\Uparrow"),T("\\N","\\mathbb{N}"),T("\\R","\\mathbb{R}"),T("\\Z","\\mathbb{Z}"),T("\\alef","\\aleph"),T("\\alefsym","\\aleph"),T("\\Alpha","\\mathrm{A}"),T("\\Beta","\\mathrm{B}"),T("\\bull","\\bullet"),T("\\Chi","\\mathrm{X}"),T("\\clubs","\\clubsuit"),T("\\cnums","\\mathbb{C}"),T("\\Complex","\\mathbb{C}"),T("\\Dagger","\\ddagger"),T("\\diamonds","\\diamondsuit"),T("\\empty","\\emptyset"),T("\\Epsilon","\\mathrm{E}"),T("\\Eta","\\mathrm{H}"),T("\\exist","\\exists"),T("\\harr","\\leftrightarrow"),T("\\hArr","\\Leftrightarrow"),T("\\Harr","\\Leftrightarrow"),T("\\hearts","\\heartsuit"),T("\\image","\\Im"),T("\\infin","\\infty"),T("\\Iota","\\mathrm{I}"),T("\\isin","\\in"),T("\\Kappa","\\mathrm{K}"),T("\\larr","\\leftarrow"),T("\\lArr","\\Leftarrow"),T("\\Larr","\\Leftarrow"),T("\\lrarr","\\leftrightarrow"),T("\\lrArr","\\Leftrightarrow"),T("\\Lrarr","\\Leftrightarrow"),T("\\Mu","\\mathrm{M}"),T("\\natnums","\\mathbb{N}"),T("\\Nu","\\mathrm{N}"),T("\\Omicron","\\mathrm{O}"),T("\\plusmn","\\pm"),T("\\rarr","\\rightarrow"),T("\\rArr","\\Rightarrow"),T("\\Rarr","\\Rightarrow"),T("\\real","\\Re"),T("\\reals","\\mathbb{R}"),T("\\Reals","\\mathbb{R}"),T("\\Rho","\\mathrm{P}"),T("\\sdot","\\cdot"),T("\\sect","\\S"),T("\\spades","\\spadesuit"),T("\\sub","\\subset"),T("\\sube","\\subseteq"),T("\\supe","\\supseteq"),T("\\Tau","\\mathrm{T}"),T("\\thetasym","\\vartheta"),T("\\weierp","\\wp"),T("\\Zeta","\\mathrm{Z}"),T("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),T("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),T("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),T("\\bra","\\mathinner{\\langle{#1}|}"),T("\\ket","\\mathinner{|{#1}\\rangle}"),T("\\braket","\\mathinner{\\langle{#1}\\rangle}"),T("\\Bra","\\left\\langle#1\\right|"),T("\\Ket","\\left|#1\\right\\rangle");var Q0=function(r){return function(o){var a=o.consumeArg().tokens,s=o.consumeArg().tokens,d=o.consumeArg().tokens,v=o.consumeArg().tokens,x=o.macros.get("|"),A=o.macros.get("\\|");o.macros.beginGroup();var z=function(J){return function(re){r&&(re.macros.set("|",x),d.length&&re.macros.set("\\|",A));var ge=J;if(!J&&d.length){var Ae=re.future();Ae.text==="|"&&(re.popToken(),ge=!0)}return{tokens:ge?d:s,numArgs:0}}};o.macros.set("|",z(!1)),d.length&&o.macros.set("\\|",z(!0));var F=o.consumeArg().tokens,W=o.expandTokens([].concat(v,F,a));return o.macros.endGroup(),{tokens:W.reverse(),numArgs:0}}};T("\\bra@ket",Q0(!1)),T("\\bra@set",Q0(!0)),T("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),T("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),T("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),T("\\angln","{\\angl n}"),T("\\blue","\\textcolor{##6495ed}{#1}"),T("\\orange","\\textcolor{##ffa500}{#1}"),T("\\pink","\\textcolor{##ff00af}{#1}"),T("\\red","\\textcolor{##df0030}{#1}"),T("\\green","\\textcolor{##28ae7b}{#1}"),T("\\gray","\\textcolor{gray}{#1}"),T("\\purple","\\textcolor{##9d38bd}{#1}"),T("\\blueA","\\textcolor{##ccfaff}{#1}"),T("\\blueB","\\textcolor{##80f6ff}{#1}"),T("\\blueC","\\textcolor{##63d9ea}{#1}"),T("\\blueD","\\textcolor{##11accd}{#1}"),T("\\blueE","\\textcolor{##0c7f99}{#1}"),T("\\tealA","\\textcolor{##94fff5}{#1}"),T("\\tealB","\\textcolor{##26edd5}{#1}"),T("\\tealC","\\textcolor{##01d1c1}{#1}"),T("\\tealD","\\textcolor{##01a995}{#1}"),T("\\tealE","\\textcolor{##208170}{#1}"),T("\\greenA","\\textcolor{##b6ffb0}{#1}"),T("\\greenB","\\textcolor{##8af281}{#1}"),T("\\greenC","\\textcolor{##74cf70}{#1}"),T("\\greenD","\\textcolor{##1fab54}{#1}"),T("\\greenE","\\textcolor{##0d923f}{#1}"),T("\\goldA","\\textcolor{##ffd0a9}{#1}"),T("\\goldB","\\textcolor{##ffbb71}{#1}"),T("\\goldC","\\textcolor{##ff9c39}{#1}"),T("\\goldD","\\textcolor{##e07d10}{#1}"),T("\\goldE","\\textcolor{##a75a05}{#1}"),T("\\redA","\\textcolor{##fca9a9}{#1}"),T("\\redB","\\textcolor{##ff8482}{#1}"),T("\\redC","\\textcolor{##f9685d}{#1}"),T("\\redD","\\textcolor{##e84d39}{#1}"),T("\\redE","\\textcolor{##bc2612}{#1}"),T("\\maroonA","\\textcolor{##ffbde0}{#1}"),T("\\maroonB","\\textcolor{##ff92c6}{#1}"),T("\\maroonC","\\textcolor{##ed5fa6}{#1}"),T("\\maroonD","\\textcolor{##ca337c}{#1}"),T("\\maroonE","\\textcolor{##9e034e}{#1}"),T("\\purpleA","\\textcolor{##ddd7ff}{#1}"),T("\\purpleB","\\textcolor{##c6b9fc}{#1}"),T("\\purpleC","\\textcolor{##aa87ff}{#1}"),T("\\purpleD","\\textcolor{##7854ab}{#1}"),T("\\purpleE","\\textcolor{##543b78}{#1}"),T("\\mintA","\\textcolor{##f5f9e8}{#1}"),T("\\mintB","\\textcolor{##edf2df}{#1}"),T("\\mintC","\\textcolor{##e0e5cc}{#1}"),T("\\grayA","\\textcolor{##f6f7f7}{#1}"),T("\\grayB","\\textcolor{##f0f1f2}{#1}"),T("\\grayC","\\textcolor{##e3e5e6}{#1}"),T("\\grayD","\\textcolor{##d6d8da}{#1}"),T("\\grayE","\\textcolor{##babec2}{#1}"),T("\\grayF","\\textcolor{##888d93}{#1}"),T("\\grayG","\\textcolor{##626569}{#1}"),T("\\grayH","\\textcolor{##3b3e40}{#1}"),T("\\grayI","\\textcolor{##21242c}{#1}"),T("\\kaBlue","\\textcolor{##314453}{#1}"),T("\\kaGreen","\\textcolor{##71B307}{#1}");var ec={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},_1=function(){function m(o,a,s){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=a,this.expansionCount=0,this.feed(o),this.macros=new C1(T1,a.macros),this.mode=s,this.stack=[]}var r=m.prototype;return r.feed=function(a){this.lexer=new Y0(a,this.settings)},r.switchMode=function(a){this.mode=a},r.beginGroup=function(){this.macros.beginGroup()},r.endGroup=function(){this.macros.endGroup()},r.endGroups=function(){this.macros.endGroups()},r.future=function(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},r.popToken=function(){return this.future(),this.stack.pop()},r.pushToken=function(a){this.stack.push(a)},r.pushTokens=function(a){var s;(s=this.stack).push.apply(s,a)},r.scanArgument=function(a){var s,d,v;if(a){if(this.consumeSpaces(),this.future().text!=="[")return null;s=this.popToken();var x=this.consumeArg(["]"]);v=x.tokens,d=x.end}else{var A=this.consumeArg();v=A.tokens,s=A.start,d=A.end}return this.pushToken(new Nr("EOF",d.loc)),this.pushTokens(v),s.range(d,"")},r.consumeSpaces=function(){for(;;){var a=this.future();if(a.text===" ")this.stack.pop();else break}},r.consumeArg=function(a){var s=[],d=a&&a.length>0;d||this.consumeSpaces();var v=this.future(),x,A=0,z=0;do{if(x=this.popToken(),s.push(x),x.text==="{")++A;else if(x.text==="}"){if(--A,A===-1)throw new l("Extra }",x)}else if(x.text==="EOF")throw new l("Unexpected end of input in a macro argument, expected '"+(a&&d?a[z]:"}")+"'",x);if(a&&d)if((A===0||A===1&&a[z]==="{")&&x.text===a[z]){if(++z,z===a.length){s.splice(-z,z);break}}else z=0}while(A!==0||d);return v.text==="{"&&s[s.length-1].text==="}"&&(s.pop(),s.shift()),s.reverse(),{tokens:s,start:v,end:x}},r.consumeArgs=function(a,s){if(s){if(s.length!==a+1)throw new l("The length of delimiters doesn't match the number of args!");for(var d=s[0],v=0;vthis.settings.maxExpand)throw new l("Too many expansions: infinite loop or need to increase maxExpand setting");var x=v.tokens,A=this.consumeArgs(v.numArgs,v.delimiters);if(v.numArgs){x=x.slice();for(var z=x.length-1;z>=0;--z){var F=x[z];if(F.text==="#"){if(z===0)throw new l("Incomplete placeholder at end of macro body",F);if(F=x[--z],F.text==="#")x.splice(z+1,1);else if(/^[1-9]$/.test(F.text)){var W;(W=x).splice.apply(W,[z,2].concat(A[+F.text-1]))}else throw new l("Not a valid argument number",F)}}}return this.pushTokens(x),x},r.expandAfterFuture=function(){return this.expandOnce(),this.future()},r.expandNextToken=function(){for(;;){var a=this.expandOnce();if(a instanceof Nr)return a.treatAsRelax&&(a.text="\\relax"),this.stack.pop()}throw new Error},r.expandMacro=function(a){return this.macros.has(a)?this.expandTokens([new Nr(a)]):void 0},r.expandTokens=function(a){var s=[],d=this.stack.length;for(this.pushTokens(a);this.stack.length>d;){var v=this.expandOnce(!0);v instanceof Nr&&(v.treatAsRelax&&(v.noexpand=!1,v.treatAsRelax=!1),s.push(this.stack.pop()))}return s},r.expandMacroAsText=function(a){var s=this.expandMacro(a);return s&&s.map(function(d){return d.text}).join("")},r._getExpansion=function(a){var s=this.macros.get(a);if(s==null)return s;if(a.length===1){var d=this.lexer.catcodes[a];if(d!=null&&d!==13)return}var v=typeof s=="function"?s(this):s;if(typeof v=="string"){var x=0;if(v.indexOf("#")!==-1)for(var A=v.replace(/##/g,"");A.indexOf("#"+(x+1))!==-1;)++x;for(var z=new Y0(v,this.settings),F=[],W=z.lex();W.text!=="EOF";)F.push(W),W=z.lex();F.reverse();var Q={tokens:F,numArgs:x};return Q}return v},r.isDefined=function(a){return this.macros.has(a)||fn.hasOwnProperty(a)||Ct.math.hasOwnProperty(a)||Ct.text.hasOwnProperty(a)||ec.hasOwnProperty(a)},r.isExpandable=function(a){var s=this.macros.get(a);return s!=null?typeof s=="string"||typeof s=="function"||!s.unexpandable:fn.hasOwnProperty(a)&&!fn[a].primitive},m}(),tc=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,za=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g",ʰ:"h","ⁱ":"i",ʲ:"j","ᵏ":"k",ˡ:"l","ᵐ":"m",ⁿ:"n","ᵒ":"o","ᵖ":"p",ʳ:"r",ˢ:"s","ᵗ":"t","ᵘ":"u","ᵛ":"v",ʷ:"w",ˣ:"x",ʸ:"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),us={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},rc={á:"á",à:"à",ä:"ä",ǟ:"ǟ",ã:"ã",ā:"ā",ă:"ă",ắ:"ắ",ằ:"ằ",ẵ:"ẵ",ǎ:"ǎ",â:"â",ấ:"ấ",ầ:"ầ",ẫ:"ẫ",ȧ:"ȧ",ǡ:"ǡ",å:"å",ǻ:"ǻ",ḃ:"ḃ",ć:"ć",ḉ:"ḉ",č:"č",ĉ:"ĉ",ċ:"ċ",ç:"ç",ď:"ď",ḋ:"ḋ",ḑ:"ḑ",é:"é",è:"è",ë:"ë",ẽ:"ẽ",ē:"ē",ḗ:"ḗ",ḕ:"ḕ",ĕ:"ĕ",ḝ:"ḝ",ě:"ě",ê:"ê",ế:"ế",ề:"ề",ễ:"ễ",ė:"ė",ȩ:"ȩ",ḟ:"ḟ",ǵ:"ǵ",ḡ:"ḡ",ğ:"ğ",ǧ:"ǧ",ĝ:"ĝ",ġ:"ġ",ģ:"ģ",ḧ:"ḧ",ȟ:"ȟ",ĥ:"ĥ",ḣ:"ḣ",ḩ:"ḩ",í:"í",ì:"ì",ï:"ï",ḯ:"ḯ",ĩ:"ĩ",ī:"ī",ĭ:"ĭ",ǐ:"ǐ",î:"î",ǰ:"ǰ",ĵ:"ĵ",ḱ:"ḱ",ǩ:"ǩ",ķ:"ķ",ĺ:"ĺ",ľ:"ľ",ļ:"ļ",ḿ:"ḿ",ṁ:"ṁ",ń:"ń",ǹ:"ǹ",ñ:"ñ",ň:"ň",ṅ:"ṅ",ņ:"ņ",ó:"ó",ò:"ò",ö:"ö",ȫ:"ȫ",õ:"õ",ṍ:"ṍ",ṏ:"ṏ",ȭ:"ȭ",ō:"ō",ṓ:"ṓ",ṑ:"ṑ",ŏ:"ŏ",ǒ:"ǒ",ô:"ô",ố:"ố",ồ:"ồ",ỗ:"ỗ",ȯ:"ȯ",ȱ:"ȱ",ő:"ő",ṕ:"ṕ",ṗ:"ṗ",ŕ:"ŕ",ř:"ř",ṙ:"ṙ",ŗ:"ŗ",ś:"ś",ṥ:"ṥ",š:"š",ṧ:"ṧ",ŝ:"ŝ",ṡ:"ṡ",ş:"ş",ẗ:"ẗ",ť:"ť",ṫ:"ṫ",ţ:"ţ",ú:"ú",ù:"ù",ü:"ü",ǘ:"ǘ",ǜ:"ǜ",ǖ:"ǖ",ǚ:"ǚ",ũ:"ũ",ṹ:"ṹ",ū:"ū",ṻ:"ṻ",ŭ:"ŭ",ǔ:"ǔ",û:"û",ů:"ů",ű:"ű",ṽ:"ṽ",ẃ:"ẃ",ẁ:"ẁ",ẅ:"ẅ",ŵ:"ŵ",ẇ:"ẇ",ẘ:"ẘ",ẍ:"ẍ",ẋ:"ẋ",ý:"ý",ỳ:"ỳ",ÿ:"ÿ",ỹ:"ỹ",ȳ:"ȳ",ŷ:"ŷ",ẏ:"ẏ",ẙ:"ẙ",ź:"ź",ž:"ž",ẑ:"ẑ",ż:"ż",Á:"Á",À:"À",Ä:"Ä",Ǟ:"Ǟ",Ã:"Ã",Ā:"Ā",Ă:"Ă",Ắ:"Ắ",Ằ:"Ằ",Ẵ:"Ẵ",Ǎ:"Ǎ",Â:"Â",Ấ:"Ấ",Ầ:"Ầ",Ẫ:"Ẫ",Ȧ:"Ȧ",Ǡ:"Ǡ",Å:"Å",Ǻ:"Ǻ",Ḃ:"Ḃ",Ć:"Ć",Ḉ:"Ḉ",Č:"Č",Ĉ:"Ĉ",Ċ:"Ċ",Ç:"Ç",Ď:"Ď",Ḋ:"Ḋ",Ḑ:"Ḑ",É:"É",È:"È",Ë:"Ë",Ẽ:"Ẽ",Ē:"Ē",Ḗ:"Ḗ",Ḕ:"Ḕ",Ĕ:"Ĕ",Ḝ:"Ḝ",Ě:"Ě",Ê:"Ê",Ế:"Ế",Ề:"Ề",Ễ:"Ễ",Ė:"Ė",Ȩ:"Ȩ",Ḟ:"Ḟ",Ǵ:"Ǵ",Ḡ:"Ḡ",Ğ:"Ğ",Ǧ:"Ǧ",Ĝ:"Ĝ",Ġ:"Ġ",Ģ:"Ģ",Ḧ:"Ḧ",Ȟ:"Ȟ",Ĥ:"Ĥ",Ḣ:"Ḣ",Ḩ:"Ḩ",Í:"Í",Ì:"Ì",Ï:"Ï",Ḯ:"Ḯ",Ĩ:"Ĩ",Ī:"Ī",Ĭ:"Ĭ",Ǐ:"Ǐ",Î:"Î",İ:"İ",Ĵ:"Ĵ",Ḱ:"Ḱ",Ǩ:"Ǩ",Ķ:"Ķ",Ĺ:"Ĺ",Ľ:"Ľ",Ļ:"Ļ",Ḿ:"Ḿ",Ṁ:"Ṁ",Ń:"Ń",Ǹ:"Ǹ",Ñ:"Ñ",Ň:"Ň",Ṅ:"Ṅ",Ņ:"Ņ",Ó:"Ó",Ò:"Ò",Ö:"Ö",Ȫ:"Ȫ",Õ:"Õ",Ṍ:"Ṍ",Ṏ:"Ṏ",Ȭ:"Ȭ",Ō:"Ō",Ṓ:"Ṓ",Ṑ:"Ṑ",Ŏ:"Ŏ",Ǒ:"Ǒ",Ô:"Ô",Ố:"Ố",Ồ:"Ồ",Ỗ:"Ỗ",Ȯ:"Ȯ",Ȱ:"Ȱ",Ő:"Ő",Ṕ:"Ṕ",Ṗ:"Ṗ",Ŕ:"Ŕ",Ř:"Ř",Ṙ:"Ṙ",Ŗ:"Ŗ",Ś:"Ś",Ṥ:"Ṥ",Š:"Š",Ṧ:"Ṧ",Ŝ:"Ŝ",Ṡ:"Ṡ",Ş:"Ş",Ť:"Ť",Ṫ:"Ṫ",Ţ:"Ţ",Ú:"Ú",Ù:"Ù",Ü:"Ü",Ǘ:"Ǘ",Ǜ:"Ǜ",Ǖ:"Ǖ",Ǚ:"Ǚ",Ũ:"Ũ",Ṹ:"Ṹ",Ū:"Ū",Ṻ:"Ṻ",Ŭ:"Ŭ",Ǔ:"Ǔ",Û:"Û",Ů:"Ů",Ű:"Ű",Ṽ:"Ṽ",Ẃ:"Ẃ",Ẁ:"Ẁ",Ẅ:"Ẅ",Ŵ:"Ŵ",Ẇ:"Ẇ",Ẍ:"Ẍ",Ẋ:"Ẋ",Ý:"Ý",Ỳ:"Ỳ",Ÿ:"Ÿ",Ỹ:"Ỹ",Ȳ:"Ȳ",Ŷ:"Ŷ",Ẏ:"Ẏ",Ź:"Ź",Ž:"Ž",Ẑ:"Ẑ",Ż:"Ż",ά:"ά",ὰ:"ὰ",ᾱ:"ᾱ",ᾰ:"ᾰ",έ:"έ",ὲ:"ὲ",ή:"ή",ὴ:"ὴ",ί:"ί",ὶ:"ὶ",ϊ:"ϊ",ΐ:"ΐ",ῒ:"ῒ",ῑ:"ῑ",ῐ:"ῐ",ό:"ό",ὸ:"ὸ",ύ:"ύ",ὺ:"ὺ",ϋ:"ϋ",ΰ:"ΰ",ῢ:"ῢ",ῡ:"ῡ",ῠ:"ῠ",ώ:"ώ",ὼ:"ὼ",Ύ:"Ύ",Ὺ:"Ὺ",Ϋ:"Ϋ",Ῡ:"Ῡ",Ῠ:"Ῠ",Ώ:"Ώ",Ὼ:"Ὼ"},nc=function(){function m(o,a){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new _1(o,a,this.mode),this.settings=a,this.leftrightDepth=0}var r=m.prototype;return r.expect=function(a,s){if(s===void 0&&(s=!0),this.fetch().text!==a)throw new l("Expected '"+a+"', got '"+this.fetch().text+"'",this.fetch());s&&this.consume()},r.consume=function(){this.nextToken=null},r.fetch=function(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},r.switchMode=function(a){this.mode=a,this.gullet.switchMode(a)},r.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var a=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),a}finally{this.gullet.endGroups()}},r.subparse=function(a){var s=this.nextToken;this.consume(),this.gullet.pushToken(new Nr("}")),this.gullet.pushTokens(a);var d=this.parseExpression(!1);return this.expect("}"),this.nextToken=s,d},r.parseExpression=function(a,s){for(var d=[];;){this.mode==="math"&&this.consumeSpaces();var v=this.fetch();if(m.endOfExpression.indexOf(v.text)!==-1||s&&v.text===s||a&&fn[v.text]&&fn[v.text].infix)break;var x=this.parseAtom(s);if(x){if(x.type==="internal")continue}else break;d.push(x)}return this.mode==="text"&&this.formLigatures(d),this.handleInfixNodes(d)},r.handleInfixNodes=function(a){for(var s=-1,d,v=0;v=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+s[0]+'" used in math mode',a);var z=Ct[this.mode][s].group,F=Tr.range(a),W;if(hh.hasOwnProperty(z)){var Q=z;W={type:"atom",mode:this.mode,family:Q,loc:F,text:s}}else W={type:z,mode:this.mode,loc:F,text:s};A=W}else if(s.charCodeAt(0)>=128)this.settings.strict&&(Ze(s.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+s[0]+'" used in math mode',a):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+s[0]+'"'+(" ("+s.charCodeAt(0)+")"),a)),A={type:"textord",mode:"text",loc:Tr.range(a),text:s};else return null;if(this.consume(),x)for(var J=0;J{const S=JSON.parse((C==null?void 0:C.target).response);if(S.code===0){const L=S.data.imageUrl;u.value.src=L,t("update:itemIcon",u.value||null)}else Tf(S);return k};return(k,C)=>(pe(),Pe("div",null,[fe("div",EZ,[K(_(xs),{checked:_(u).itemType===1,value:1,name:"iconType",onChange:C[0]||(C[0]=S=>h(1))},{default:xe(()=>[sr(ot(k.$t("common.text")),1)]),_:1},8,["checked"]),K(_(xs),{checked:_(u).itemType===2,value:2,name:"iconType",onChange:C[1]||(C[1]=S=>h(2))},{default:xe(()=>[sr(ot(k.$t("common.image")),1)]),_:1},8,["checked"]),K(_(xs),{checked:_(u).itemType===3,value:3,name:"iconType",onChange:C[2]||(C[2]=S=>h(3))},{default:xe(()=>[sr(ot(k.$t("iconItem.onlineIcon")),1)]),_:1},8,["checked"])]),fe("div",RZ,[fe("div",MZ,[fe("div",null,[fe("div",BZ,[K(_(cl),{"item-icon":_(u)},null,8,["item-icon"])])]),fe("div",IZ,[_(u).itemType===1?(pe(),Pe("div",PZ,[K(_(kn),{value:_(u).text,"onUpdate:value":C[3]||(C[3]=S=>_(u).text=S),class:"mb-[5px]",size:"small",type:"text",onInput:f},null,8,["value"])])):Xe("",!0),_(u).itemType===3?(pe(),Pe("div",NZ,[fe("div",null,[K(_(kn),{value:_(u).text,"onUpdate:value":C[4]||(C[4]=S=>_(u).text=S),class:"mb-[5px]",size:"small",type:"text",placeholder:k.$t("iconItem.inputIconName"),onInput:f},null,8,["value","placeholder"]),K(_(Dt),{quaternary:"",type:"info"},{default:xe(()=>[fe("a",qZ,ot(k.$t("iconItem.onlineIconLibrary")),1)]),_:1})])])):Xe("",!0),_(u).itemType===2?(pe(),Pe("div",FZ,[K(_(kn),{value:_(u).src,"onUpdate:value":C[5]||(C[5]=S=>_(u).src=S),class:"mb-[5px] w-full",size:"small",type:"text",placeholder:k.$t("iconItem.inputIconUrlOrUpload"),onInput:f},null,8,["value","placeholder"]),K(_(m4),{action:"/api/file/uploadImg","show-file-list":!1,name:"imgfile",headers:{token:_(i).token},onFinish:y},{default:xe(()=>[K(_(Dt),{size:"small"},{default:xe(()=>[sr(ot(k.$t("iconItem.selectUpload")),1)]),_:1})]),_:1},8,["headers"])])):Xe("",!0)])]),fe("div",LZ,[fe("div",$Z,ot(k.$t("common.backgroundColor")),1),fe("div",OZ,[K(_(rn),{value:_(u).backgroundColor,"onUpdate:value":C[6]||(C[6]=S=>_(u).backgroundColor=S),size:"small",modes:["hex"],swatches:c,onComplete:f,onUpdateValue:f},null,8,["value"])]),_(u).backgroundColor!==l.backgroundColor?(pe(),Pe("div",UZ,[K(_(Dt),{quaternary:"",type:"info",onClick:b},{default:xe(()=>[sr(ot(k.$t("common.reset")),1)]),_:1})])):Xe("",!0)])])]))}});const VZ=ta(HZ,[["__scopeId","data-v-69882464"]]),jZ={class:"h-[600px] overflow-auto p-[5px]"},GZ=Re({__name:"index",props:{visible:{type:Boolean},itemInfo:null,itemGroupId:null},emits:["update:visible","done"],setup(e,{emit:t}){const n=e,i=mi(),c=te(!1),l=te([!1,!1]),u=te([]),h={icon:null,title:"",url:"",lanUrl:"",description:"",openMethod:2},f=te(n.itemInfo?{...n.itemInfo}:{...h}),b=te(null),y={title:{required:!0,trigger:"blur",message:Ie("form.required")},url:{required:!0,trigger:"blur",type:"string",message:Ie("form.required")}},k=[{default:!0,label:Ie("iconItem.currentPageOpen"),value:1},{label:Ie("iconItem.newWindowOpen"),value:2},{label:Ie("iconItem.currentPageLayerOpen"),value:3}],C=de({get:()=>n.visible,set:E=>{t("update:visible",E)}});async function S(){c.value=!0;try{const{code:E,data:B,msg:M}=await A4(f.value);E===0?(C.value=!1,f.value={...h},t("done",B)):i.error(`${Ie("common.saveFail")}:${M}`)}catch{i.error(Ie("common.saveFail"))}c.value=!1}const L=E=>{var B;E.preventDefault(),(B=b.value)==null||B.validate(M=>{M||S()})};async function P(E,B){l.value[B]=!0;try{const{code:M,data:U}=await z4(E);M===0?f.value.icon={itemType:2,src:U.iconUrl}:i.error(Ie("iconItem.geticonFail"))}catch{i.error(Ie("iconItem.geticonFail"))}l.value[B]=!1}tr(()=>n.visible,E=>{E===!0&&(f.value=n.itemInfo?{...n.itemInfo}:{...h},n.itemGroupId&&(f.value.itemIconGroupId=n.itemGroupId)),$()});function $(){Cd().then(({data:E,code:B,msg:M})=>{if(B===0){u.value=[];for(let U=0;U(pe(),pt(_(kl),{show:_(C),"onUpdate:show":B[9]||(B[9]=M=>bo(C)?C.value=M:null),preset:"card",size:"small",style:{width:"600px","border-radius":"1rem"},title:e.itemInfo?_(Ie)("iconItem.edit"):_(Ie)("iconItem.add")},{footer:xe(()=>[K(_(Dt),{type:"success",loading:c.value,style:{float:"right"},onClick:L},{default:xe(()=>[sr(ot(E.$t("common.save")),1)]),_:1},8,["loading"])]),default:xe(()=>[fe("div",jZ,[K(_(Sl),{ref_key:"formRef",ref:b,model:f.value,rules:y},{default:xe(()=>[K(_(Lf),{cols:"2","x-gap":10,"item-responsive":""},{default:xe(()=>[K(_(pc),{span:"2 500:1"},{default:xe(()=>[K(_(Vt),{path:"itemIconGroupId",label:_(Ie)("iconItem.iconGroup")},{default:xe(()=>[K(_(el),{value:f.value.itemIconGroupId,"onUpdate:value":B[0]||(B[0]=M=>f.value.itemIconGroupId=M),options:u.value},null,8,["value","options"])]),_:1},8,["label"])]),_:1}),K(_(pc),{span:"2 500:1"},{default:xe(()=>[K(_(Vt),{path:"title",label:E.$t("common.title")},{default:xe(()=>[K(_(kn),{value:f.value.title,"onUpdate:value":B[1]||(B[1]=M=>f.value.title=M),type:"text","show-count":"",maxlength:20},null,8,["value"])]),_:1},8,["label"])]),_:1})]),_:1}),K(_(Vt),{path:"icon",label:E.$t("common.icon")},{default:xe(()=>[K(VZ,{"item-icon":f.value.icon,"onUpdate:itemIcon":B[2]||(B[2]=M=>f.value.icon=M)},null,8,["item-icon"])]),_:1},8,["label"]),K(_(Vt),{path:"url",label:E.$t("iconItem.url")},{default:xe(()=>[K(_(al),null,{default:xe(()=>[K(_(kn),{value:f.value.url,"onUpdate:value":B[3]||(B[3]=M=>f.value.url=M),type:"text",maxlength:1e3,placeholder:"http(s)://"},null,8,["value"]),K(_(Dt),{disabled:!f.value.url,loading:l.value[0],onClick:B[4]||(B[4]=M=>P(f.value.url,0))},{default:xe(()=>[sr(ot(E.$t("iconItem.getIcon")),1)]),_:1},8,["disabled","loading"])]),_:1})]),_:1},8,["label"]),K(_(Vt),{path:"lanUrl",label:E.$t("iconItem.lanUrl")},{default:xe(()=>[K(_(al),null,{default:xe(()=>[K(_(kn),{value:f.value.lanUrl,"onUpdate:value":B[5]||(B[5]=M=>f.value.lanUrl=M),type:"text",maxlength:1e3,placeholder:E.$t("iconItem.lanUrlInputPlaceholder")},null,8,["value","placeholder"]),K(_(Dt),{disabled:!f.value.lanUrl,loading:l.value[1],onClick:B[6]||(B[6]=M=>P(f.value.lanUrl||"",1))},{default:xe(()=>[sr(ot(E.$t("iconItem.getIcon")),1)]),_:1},8,["disabled","loading"])]),_:1})]),_:1},8,["label"]),K(_(Vt),{path:"description",label:E.$t("common.description")},{default:xe(()=>[K(_(kn),{value:f.value.description,"onUpdate:value":B[7]||(B[7]=M=>f.value.description=M),type:"text","show-count":"",maxlength:100},null,8,["value"])]),_:1},8,["label"]),K(_(Vt),{path:"openMethod",label:E.$t("iconItem.openMethod")},{default:xe(()=>[K(_(el),{value:f.value.openMethod,"onUpdate:value":B[8]||(B[8]=M=>f.value.openMethod=M),options:k},null,8,["value"])]),_:1},8,["label"])]),_:1},8,["model"])])]),_:1},8,["show","title"]))}}),WZ={class:"app-icon w-full"},XZ={class:"app-icon-info-icon w-[70px] h-[70px]"},YZ={class:"w-[70px] h-full flex items-center justify-center"},KZ={class:"app-icon-info-text-box w-full"},ZZ={class:"app-icon-info-text-box-title font-semibold w-full"},JZ={key:0,class:"app-icon-info-text-box-description"},QZ={key:1,class:"app-icon-small"},eJ=["title"],ja=Re({__name:"index",props:{itemInfo:null,size:{default:70},forceBackground:null,iconTextColor:null,iconTextInfoHideDescription:{type:Boolean},iconTextIconHideTitle:{type:Boolean},style:null},setup(e){const t=e,n="#2a2a2a6b",i=l=>{const u=l.replace(/^#/,""),h=parseInt(u.substring(0,2),16),f=parseInt(u.substring(2,4),16),b=parseInt(u.substring(4,6),16);return(.299*h+.587*f+.114*b)/255},c=de(()=>{var u,h;return i(((h=(u=t.itemInfo)==null?void 0:u.icon)==null?void 0:h.backgroundColor)||n)>.5?"black":"white"});return(l,u)=>{var h,f,b,y,k,C;return pe(),Pe("div",WZ,[e.style===_(xt).info?(pe(),Pe("div",{key:0,class:"app-icon-info w-full rounded-2xl transition-all duration-200 hover:shadow-[0_0_20px_10px_rgba(0,0,0,0.2)] flex",style:mt({background:((f=(h=e.itemInfo)==null?void 0:h.icon)==null?void 0:f.backgroundColor)||n})},[fe("div",XZ,[fe("div",YZ,[K(_(cl),{"item-icon":(b=e.itemInfo)==null?void 0:b.icon,"force-background":"transparent",size:50,class:"overflow-hidden rounded-xl"},null,8,["item-icon"])])]),fe("div",{class:"text-white flex items-center",style:mt({color:e.iconTextColor==="#ffffff"?_(c):e.iconTextColor,maxWidth:"calc(100% - 80px)"})},[fe("div",KZ,[fe("div",ZZ,[K(_(mc),null,{default:xe(()=>{var S;return[sr(ot((S=e.itemInfo)==null?void 0:S.title),1)]}),_:1})]),e.iconTextInfoHideDescription?Xe("",!0):(pe(),Pe("div",JZ,[K(_(mc),{"line-clamp":2,class:"text-xs"},{default:xe(()=>{var S;return[sr(ot((S=e.itemInfo)==null?void 0:S.description),1)]}),_:1})]))])],4)],4)):Xe("",!0),e.style===_(xt).icon?(pe(),Pe("div",QZ,[fe("div",{class:"app-icon-small-icon overflow-hidden rounded-2xl sunpanel w-[70px] h-[70px] mx-auto rounded-2xl transition-all duration-200 hover:shadow-[0_0_20px_10px_rgba(0,0,0,0.2)]",title:(y=e.itemInfo)==null?void 0:y.description},[K(_(cl),{"item-icon":(k=e.itemInfo)==null?void 0:k.icon},null,8,["item-icon"])],8,eJ),e.iconTextIconHideTitle?Xe("",!0):(pe(),Pe("div",{key:0,class:"app-icon-small-title text-center app-icon-text-shadow cursor-pointer mt-[2px]",style:mt({color:e.iconTextColor})},[fe("span",null,ot((C=e.itemInfo)==null?void 0:C.title),1)],4))])):Xe("",!0)])}}}),tJ={class:"text-3xl cursor-pointer",style:{color:"var(--n-color-target)"}},rJ={class:"ml-1"},nJ={class:"w-full h-full app-starter-modal-content"},oJ={class:"w-full h-full dark:bg-[#2c2c32]"},aJ=["onClick"],iJ={class:"bg-white dark:bg-zinc-800 p-[10px] rounded-lg mb-[5px] font-bold cursor-pointer flex items-center hover:bg-slate-50 focus:bg-slate-50"},sJ={class:"flex items-center justify-center"},lJ={class:"text-lg"},cJ={class:"ml-2"},uJ=Re({__name:"index",props:{visible:{type:Boolean}},emits:["update:visible"],setup(e,{emit:t}){const n=e,i=te("UserInfo"),c=te(!1),l=te(0),u=te(!1),h=Ie("appLauncher.title"),f=te(""),b=te("500px"),y=te([{name:Ie("apps.userInfo.appName"),componentName:"UserInfo",icon:"material-symbols-person-edit-outline-rounded"},{name:Ie("apps.baseSettings.appName"),componentName:"Style",icon:"ion-color-palette-outline"},{name:Ie("apps.itemGroupManage.appName"),componentName:"ItemGroupManage",icon:"material-symbols-ad-group-outline-rounded"},{name:Ie("apps.uploadsFileManager.appName"),componentName:"UploadFileManager",icon:"tabler:file-upload"},{name:Ie("apps.exportImport.appName"),componentName:"ImportExport",icon:"icon-park-outline-import-and-export"},{name:Ie("apps.about.appName"),componentName:"About",icon:"lucide-info"}]),k=pi(),C=de({get:()=>n.visible,set:$=>{t("update:visible",$)}});function S($){i.value=$.componentName,u.value&&(c.value=!0)}function L(){return window.innerWidth}function P(){l.value=L(),l.value<640?(c.value=!0,u.value=!0):(c.value=!1,u.value=!1)}return dr(()=>{var E;const $={name:Ie("adminSettingUsers.appName"),componentName:"Users",icon:"lucide-users",auth:1};((E=k.userInfo)==null?void 0:E.role)===1&&y.value.push($),window.addEventListener("resize",P),P()}),ea(()=>{window.removeEventListener("resize",P)}),($,E)=>(pe(),Pe("div",null,[K(_($f),{show:_(C),"onUpdate:show":E[2]||(E[2]=B=>bo(C)?C.value=B:null),style:{"max-width":"900px"},size:"small"},{header:xe(()=>[fe("div",{class:"flex items-center select-none",onClick:E[0]||(E[0]=B=>c.value=!c.value)},[fe("div",tJ,[K(_(Ft),{class:"transition-all duration-500",icon:c.value?"tabler-layout-sidebar-right-collapse-filled":"tabler-layout-sidebar-left-collapse-filled"},null,8,["icon"])]),fe("div",rJ,ot(f.value===""?_(h):f.value),1)])]),default:xe(()=>[fe("div",nJ,[K(_(Em),{vertical:"",size:"large",style:{height:"100%",width:"100%"}},{default:xe(()=>[K(_(Im),{"has-sider":"",style:{"border-radius":"0.75rem"}},{default:xe(()=>[K(_($m),{collapsed:c.value,"onUpdate:collapsed":E[1]||(E[1]=B=>c.value=B),"collapse-mode":"width","collapsed-width":0,width:u.value?"100%":240,style:{height:"100%"},"content-style":"overflow: hidden"},{default:xe(()=>[fe("div",oJ,[fe("div",{class:"p-[5px] bg-slate-200 dark:bg-zinc-900 rounded-xl overflow-auto",style:mt({width:u.value?"100%":"220px",minWidth:"200px",height:b.value})},[(pe(!0),Pe(cr,null,jn(y.value,(B,M)=>(pe(),Pe("div",{key:M,style:mt({color:i.value===B.componentName?"var(--n-color-target)":""}),onClick:U=>S(B)},[fe("div",iJ,[fe("div",sJ,[fe("div",lJ,[K(_(Ft),{icon:B.icon},null,8,["icon"])]),fe("span",cJ,ot(B.name),1)])])],12,aJ))),128))],4)])]),_:1},8,["collapsed","width"]),K(_(Pm),{"content-style":{height:b.value}},{default:xe(()=>[fe("div",{class:yr(["rounded-2xl h-full overflow-auto transition-all duration-500 min-w-[300px] h-full",u.value&&!c.value?"opacity-0":"opacity-100"])},[K(_(w4),{"component-name":i.value,class:"h-full"},null,8,["component-name"])],2)]),_:1},8,["content-style"])]),_:1})]),_:1})])]),_:1},8,["show"])]))}});const dJ=ta(uJ,[["__scopeId","data-v-650ea9b6"]]),hJ={class:"clock w-full text-center"},fJ={class:"clock-time text-2xl sm:text-2xl md:text-3xl font-[600]"},pJ={class:"hidden sm:hidden md:block"},mJ={class:"clock-date mr-1"},vJ={class:"clock-week"},gJ=Re({__name:"index",props:{hideSecond:{type:Boolean}},setup(e){const t=e,n=te({time:"--:--",date:"------",week:"--"});function i(){const u=new Date,h=String(u.getHours()).padStart(2,"0"),f=String(u.getMinutes()).padStart(2,"0");if(t.hideSecond)n.value.time=`${h}:${f}`;else{const C=String(u.getSeconds()).padStart(2,"0");n.value.time=`${h}:${f}:${C}`}const b=u.getDate(),y=u.getMonth()+1,k=[Ie("deskModule.clock.sun"),Ie("deskModule.clock.mon"),Ie("deskModule.clock.tue"),Ie("deskModule.clock.wed"),Ie("deskModule.clock.thu"),Ie("deskModule.clock.fri"),Ie("deskModule.clock.sat")];n.value.week=k[u.getDay()],n.value.date=`${y}-${b}`}const c=()=>{i()},l=setInterval(c,1e3);return dr(()=>{c(),i()}),di(()=>{clearInterval(l)}),(u,h)=>(pe(),Pe("div",hJ,[fe("span",fJ,ot(n.value.time),1),fe("div",pJ,[fe("span",mJ,ot(n.value.date),1),fe("span",vJ,ot(n.value.week),1)])]))}}),bJ="/assets/baidu-604a969a.svg",yJ="/assets/bing-4e21c40a.svg",xJ="/assets/google-c8534e94.svg",wJ=["onKeydown"],kJ=["placeholder"],SJ={class:"flex items-center"},CJ={class:"flex items-center"},AJ=["title","onClick"],TJ={class:"mt-[10px]"},_J=Re({__name:"index",props:{background:{default:"#2a2a2a6b"},textColor:{default:"white"}},emits:["itemSearch"],setup(e,{emit:t}){const n="deskModuleSearchBox",i=Yu(),c=pi(),l=te(""),u=te(!1),h=te(!1),f=te([{iconSrc:xJ,title:"Google",url:"https://www.google.com/search?q=%s"},{iconSrc:bJ,title:"Baidu",url:"https://www.baidu.com/s?wd=%s"},{iconSrc:yJ,title:"Bing",url:"https://www.bing.com/search?q=%s"}]),b={currentSearchEngine:f.value[0],searchEngineList:[],newWindowOpen:!1},y=te({...b}),k=()=>{u.value=!0},C=()=>{u.value=!1};function S(){c.visitMode!==gn.VISIT_MODE_PUBLIC&&(h.value=!h.value)}function L(M){y.value.currentSearchEngine=M,i.saveToCloud(n,y.value),h.value=!1}function P(){const M=y.value.currentSearchEngine.url,q=$(M,l.value);B(),y.value.newWindowOpen?window.open(q):window.location.href=q}function $(M,U){return M.includes("%s")?M.replace("%s",encodeURIComponent(U)):M+(U?`${encodeURIComponent(U)}`:"")}const E=()=>{t("itemSearch",l.value)};function B(){l.value="",t("itemSearch",l.value)}return dr(()=>{i.getValueByNameFromCloud("deskModuleSearchBox").then(({code:M,data:U})=>{M===0?y.value=U||b:y.value=b})}),(M,U)=>(pe(),Pe("div",{class:"search-box w-full",onKeydown:[fc(P,["enter"]),fc(B,["esc"])]},[fe("div",{class:yr(["search-container flex rounded-2xl items-center justify-center text-white w-full",{focused:u.value}]),style:mt({background:e.background,color:e.textColor})},[fe("div",{class:"search-box-btn-engine w-[40px] flex justify-center cursor-pointer",onClick:S},[K(_(qo),{src:y.value.currentSearchEngine.iconSrc,style:{"background-color":"transparent"},size:20},null,8,["src"])]),fi(fe("input",{"onUpdate:modelValue":U[0]||(U[0]=q=>l.value=q),placeholder:M.$t("deskModule.searchBox.inputPlaceholder"),onFocus:k,onBlur:C,onInput:E},null,40,kJ),[[_f,l.value]]),l.value!==""?(pe(),Pe("div",{key:0,class:"search-box-btn-clear w-[25px] mr-[10px] flex justify-center cursor-pointer",onClick:B},[K(_(Ft),{style:{width:"20px",height:"20px"},icon:"line-md:close-small"})])):Xe("",!0),fe("div",{class:"search-box-btn-search w-[25px] flex justify-center cursor-pointer",onClick:P},[K(_(Ft),{style:{width:"20px",height:"20px"},icon:"iconamoon:search-fill"})])],6),h.value?(pe(),Pe("div",{key:0,class:"w-full mt-[10px] rounded-xl p-[10px]",style:mt({background:e.background})},[fe("div",SJ,[fe("div",CJ,[(pe(!0),Pe(cr,null,jn(f.value,(q,R)=>(pe(),Pe("div",{key:R,title:q.title,class:"w-[40px] h-[40px] mr-[10px] cursor-pointer bg-[#ffffff] flex items-center justify-center rounded-xl",onClick:j=>L(q)},[K(_(qo),{src:q.iconSrc,style:{"background-color":"transparent"},size:20},null,8,["src"])],8,AJ))),128))])]),fe("div",TJ,[K(_(um),{checked:y.value.newWindowOpen,"onUpdate:checked":U[1]||(U[1]=q=>y.value.newWindowOpen=q),onUpdateChecked:U[2]||(U[2]=q=>_(i).saveToCloud(n,y.value))},{default:xe(()=>[fe("span",{style:mt({color:e.textColor})},ot(M.$t("deskModule.searchBox.openWithNewOpen")),5)]),_:1},8,["checked"])])],4)):Xe("",!0)],40,wJ))}});const DJ=ta(_J,[["__scopeId","data-v-d2b10c26"]]);var vt=(e=>(e.cpu="cpu",e.memory="memory",e.disk="disk",e))(vt||{});const zJ={class:"generic-monitor-card w-full"},EJ={class:"w-[60px] h-[70px]"},RJ={class:"w-[60px] h-full flex items-center justify-center text-white"},Yo=Re({__name:"index",props:{extendParam:null,iconTextColor:null,iconTextIconHideTitle:{type:Boolean},iconText:null,textColor:null,cardTypeStyle:null,icon:null,class:null,backgroundColor:null},setup(e){const n=te(e.class);return(i,c)=>(pe(),Pe("div",zJ,[K(_(C4),{"card-type-style":e.cardTypeStyle,"icon-text":e.iconText,"icon-text-color":e.iconTextColor,class:yr(n.value),"background-color":e.backgroundColor,"icon-text-icon-hide-title":e.iconTextIconHideTitle},{info:xe(()=>[fe("div",EJ,[fe("div",RJ,[fo(i.$slots,"icon",{},()=>[K(_(Ft),{icon:e.icon??"",style:mt([{width:"35px",height:"35px"},{color:e.textColor}])},null,8,["icon","style"])])])]),fe("div",{class:"w-full text-white flex items-center",style:mt({maxWidth:"calc(100% - 80px)"})},[fo(i.$slots,"info")],4)]),small:xe(()=>[fo(i.$slots,"small")]),_:3},8,["card-type-style","icon-text","icon-text-color","class","background-color","icon-text-icon-hide-title"])]))}}),MJ={key:0,class:"w-full"},BJ={class:"float-right"},IJ={key:1,class:"w-full flex justify-center h-full w-full mt-3"},Wn=Re({__name:"index",props:{textColor:null,progressColor:null,progressRailColor:null,progressHeight:null,percentage:null,cardTypeStyle:null,infoCardLeftText:null,infoCardRightText:null},setup(e){return(t,n)=>e.cardTypeStyle===_(xt).info?(pe(),Pe("div",MJ,[fe("div",{class:"mb-1 text-xs",style:mt({color:e.textColor})},[fe("span",null,ot(e.infoCardLeftText),1),fe("span",BJ,ot(e.infoCardRightText),1)],4),K(_(sl),{type:"line",color:e.progressColor,"rail-color":e.progressRailColor,height:e.progressHeight,percentage:e.percentage,"show-indicator":!1,"stroke-width":15,style:{"max-width":"135px"}},null,8,["color","rail-color","height","percentage"])])):(pe(),Pe("div",IJ,[K(_(sl),{color:e.progressColor,"rail-color":e.progressRailColor,type:"dashboard",percentage:e.percentage,"stroke-width":15,style:{width:"50px"}},{default:xe(()=>[fe("div",{class:"text-white",style:mt([{"font-size":"8px"},{color:e.textColor}])},ot(e.percentage)+"% ",5)]),_:1},8,["color","rail-color","percentage"])]))}});function $l(e,t){let n=0;return t===xt.small?n=1:t===xt.info&&(n=2),lh(e,n)}function lh(e,t=2){return e===0?0:Number(e.toFixed(t))}function PJ(){return rr({url:"/system/monitor/getCpuState"})}function NJ(e){return rr({url:"/system/monitor/getDiskStateByPath",data:{path:e}})}function qJ(){return rr({url:"/system/monitor/getMemonyState"})}function FJ(){return rr({url:"/system/monitor/getDiskMountpoints"})}const _u=Re({__name:"CPU",props:{cardTypeStyle:null,refreshInterval:null,textColor:null,progressColor:null,progressRailColor:null},setup(e){const t=e;let n;const i=te(null);async function c(){try{const{data:l,code:u}=await PJ();u===0&&(i.value=l)}catch{}}return dr(()=>{c(),n=setInterval(()=>{c()},!t.refreshInterval||t.refreshInterval<=2e3?2e3:t.refreshInterval)}),ea(()=>{clearInterval(n)}),(l,u)=>{var h,f;return pe(),pt(Wn,{"progress-color":e.progressColor,"progress-rail-color":e.progressRailColor,"progress-height":5,percentage:_($l)(((h=i.value)==null?void 0:h.usages[0])||0,e.cardTypeStyle),"card-type-style":e.cardTypeStyle,"info-card-right-text":`${_(lh)(((f=i.value)==null?void 0:f.usages[0])||0)}%`,"info-card-left-text":"CPU","text-color":e.textColor,style:{width:"100%"}},null,8,["progress-color","progress-rail-color","percentage","card-type-style","info-card-right-text","text-color"])}}}),Du=Re({__name:"Memory",props:{cardTypeStyle:null,refreshInterval:null,textColor:null,progressColor:null,progressRailColor:null},setup(e){const t=e;let n;const i=te(null);function c(u){return td(u)}async function l(){try{const{data:u,code:h}=await qJ();h===0&&(i.value=u)}catch{}}return dr(()=>{l(),n=setInterval(()=>{l()},!t.refreshInterval||t.refreshInterval<=2e3?2e3:t.refreshInterval)}),ea(()=>{clearInterval(n)}),(u,h)=>{var f,b,y,k;return pe(),pt(Wn,{"progress-color":e.progressColor,"progress-rail-color":e.progressRailColor,"progress-height":5,percentage:_($l)(((f=i.value)==null?void 0:f.usedPercent)||0,e.cardTypeStyle),"card-type-style":e.cardTypeStyle,"info-card-right-text":`${c(((b=i.value)==null?void 0:b.used)||0)}/${c((((y=i.value)==null?void 0:y.total)||0)-(((k=i.value)==null?void 0:k.used)||0)||0)}`,"info-card-left-text":"RAM","text-color":e.textColor},null,8,["progress-color","progress-rail-color","percentage","card-type-style","info-card-right-text","text-color"])}}}),zu=Re({__name:"Disk",props:{cardTypeStyle:null,refreshInterval:null,textColor:null,progressColor:null,progressRailColor:null,path:null},setup(e){const t=e;let n;const i=te(null);function c(h){return td(h)}function l(h){return h}async function u(){try{const{data:h,code:f}=await NJ(t.path);f===0&&(i.value=h)}catch{}}return dr(()=>{u(),n=setInterval(()=>{u()},!t.refreshInterval||t.refreshInterval<=2e3?2e3:t.refreshInterval)}),ea(()=>{clearInterval(n)}),(h,f)=>{var b,y,k,C;return pe(),pt(Wn,{"progress-color":e.progressColor,"progress-rail-color":e.progressRailColor,"progress-height":5,percentage:_($l)(((b=i.value)==null?void 0:b.usedPercent)||0,e.cardTypeStyle),"card-type-style":e.cardTypeStyle,"info-card-right-text":`${c(((y=i.value)==null?void 0:y.used)||0)}/${c(((k=i.value)==null?void 0:k.free)||0)}`,"info-card-left-text":(C=i.value)==null?void 0:C.mountpoint,"text-color":e.textColor},null,8,["progress-color","progress-rail-color","percentage","card-type-style","info-card-right-text","info-card-left-text","text-color"])}}}),LJ={class:"w-full"},$J={class:"w-[60px] h-[70px]"},OJ={class:"app-icon w-[60px] h-full flex items-center justify-center text-white"},UJ={class:"w-full text-white flex items-center"},Eu=Re({__name:"index",props:{extendParam:null,iconTextColor:null,iconTextIconHideTitle:{type:Boolean},cardTypeStyle:null,monitorType:null,cardStyle:null},setup(e){const t=e,n=de(()=>{switch(t.monitorType){case vt.cpu:return"CPU";case vt.disk:return t.extendParam.path;case vt.memory:return"RAM"}return""}),i=5e3;return(c,l)=>(pe(),Pe("div",LJ,[K(Yo,{"icon-text-icon-hide-title":!1,"card-type-style":e.cardTypeStyle,"icon-text":_(n),"icon-text-color":e.iconTextColor,"background-color":e.extendParam.backgroundColor,class:"hover:shadow-[0_0_20px_10px_rgba(0,0,0,0.2)]"},{icon:xe(()=>[fe("div",$J,[fe("div",OJ,[e.monitorType===_(vt).cpu?(pe(),pt(_(Ft),{key:0,icon:"solar-cpu-bold",style:mt([{color:e.extendParam.color},{width:"35px",height:"35px"}])},null,8,["style"])):Xe("",!0),e.monitorType===_(vt).memory?(pe(),pt(_(Ft),{key:1,icon:"material-symbols-memory-alt-rounded",style:mt([{color:e.extendParam.color},{width:"35px",height:"35px"}])},null,8,["style"])):Xe("",!0),e.monitorType===_(vt).disk?(pe(),pt(_(Ft),{key:2,icon:"clarity-hard-disk-solid",style:mt([{color:e.extendParam.color},{width:"35px",height:"35px"}])},null,8,["style"])):Xe("",!0)])])]),info:xe(()=>{var u,h,f,b,y,k,C,S,L,P;return[fe("div",UJ,[e.monitorType===_(vt).cpu?(pe(),pt(_u,{key:0,"card-type-style":_(xt).info,"progress-color":(u=e.extendParam)==null?void 0:u.progressColor,"progress-rail-color":(h=e.extendParam)==null?void 0:h.progressRailColor,"text-color":(f=e.extendParam)==null?void 0:f.color,"refresh-interval":i},null,8,["card-type-style","progress-color","progress-rail-color","text-color"])):e.monitorType===_(vt).memory?(pe(),pt(Du,{key:1,"card-type-style":_(xt).info,"progress-color":(b=e.extendParam)==null?void 0:b.progressColor,"progress-rail-color":(y=e.extendParam)==null?void 0:y.progressRailColor,"text-color":(k=e.extendParam)==null?void 0:k.color,"refresh-interval":i},null,8,["card-type-style","progress-color","progress-rail-color","text-color"])):e.monitorType===_(vt).disk?(pe(),pt(zu,{key:2,"card-type-style":_(xt).info,"progress-color":(C=e.extendParam)==null?void 0:C.progressColor,"progress-rail-color":(S=e.extendParam)==null?void 0:S.progressRailColor,"text-color":(L=e.extendParam)==null?void 0:L.color,path:(P=e.extendParam)==null?void 0:P.path,"refresh-interval":i},null,8,["card-type-style","progress-color","progress-rail-color","text-color","path"])):Xe("",!0)])]}),small:xe(()=>{var u,h,f,b,y,k,C,S,L,P;return[e.monitorType===_(vt).cpu?(pe(),pt(_u,{key:0,"card-type-style":_(xt).icon,"progress-color":(u=e.extendParam)==null?void 0:u.progressColor,"progress-rail-color":(h=e.extendParam)==null?void 0:h.progressRailColor,"text-color":(f=e.extendParam)==null?void 0:f.color,"refresh-interval":i},null,8,["card-type-style","progress-color","progress-rail-color","text-color"])):e.monitorType===_(vt).memory?(pe(),pt(Du,{key:1,"card-type-style":_(xt).icon,"progress-color":(b=e.extendParam)==null?void 0:b.progressColor,"progress-rail-color":(y=e.extendParam)==null?void 0:y.progressRailColor,"text-color":(k=e.extendParam)==null?void 0:k.color,"refresh-interval":i},null,8,["card-type-style","progress-color","progress-rail-color","text-color"])):e.monitorType===_(vt).disk?(pe(),pt(zu,{key:2,"card-type-style":_(xt).icon,"progress-color":(C=e.extendParam)==null?void 0:C.progressColor,"progress-rail-color":(S=e.extendParam)==null?void 0:S.progressRailColor,"text-color":(L=e.extendParam)==null?void 0:L.color,path:(P=e.extendParam)==null?void 0:P.path,"refresh-interval":i},null,8,["card-type-style","progress-color","progress-rail-color","text-color","path"])):Xe("",!0)]}),_:1},8,["card-type-style","icon-text","icon-text-color","background-color"])]))}}),ch="systemMonitor",uh=Yu();async function Ko(e){return await uh.saveToCloud(ch,{list:e})}async function _i(){const e=await uh.getValueByNameFromCloud(ch);return e.code===0&&e.data&&e.data.list?e.data.list:[]}async function HJ(e){let t=!0,n=[];try{const i=await _i();i&&(n=i),n.push(e);const c=await Ko(n);c.code!==0&&console.log("save failed",c)}catch(i){console.error(i),t=!1}return t}async function VJ(e,t){e||(e=0);let n=!0,i=[];try{const c=await _i();c&&(i=c),i[e]=t;const l=await Ko(i);l.code!==0&&console.log("save failed",l)}catch(c){console.error(c),n=!1}return n}async function jJ(e){let t=!0;try{const n=await _i();n[e]&&n.splice(e,1),await Ko(n)}catch(n){t=!1,console.error(n)}return t}const GJ={class:"flex mb-5 justify-center transparent-grid p-2 rounded-xl border"},WJ={class:"w-[200px]"},XJ={class:"w-[80px] ml-2"},Ru=Re({__name:"index",props:{genericProgressStyleExtendParam:null},emits:["update:genericProgressStyleExtendParam"],setup(e,{emit:t}){const n=e,i=de({get:()=>n.genericProgressStyleExtendParam,set:c=>{t("update:genericProgressStyleExtendParam",c)}});return(c,l)=>(pe(),Pe("div",null,[fe("div",GJ,[fe("div",WJ,[K(Yo,{"icon-text-icon-hide-title":"","card-type-style":_(xt).info,icon:"solar-cpu-bold","background-color":_(i).backgroundColor,"text-color":_(i).color},{info:xe(()=>[K(Wn,{"progress-color":_(i).progressColor,"progress-rail-color":_(i).progressRailColor,percentage:50,"progress-height":5,"info-card-left-text":"DEMO","info-card-right-text":"TEXT","text-color":_(i).color,"card-type-style":_(xt).info},null,8,["progress-color","progress-rail-color","text-color","card-type-style"])]),_:1},8,["card-type-style","background-color","text-color"])]),fe("div",XJ,[K(Yo,{"icon-text-icon-hide-title":"","card-type-style":_(xt).icon,icon:"solar-cpu-bold","background-color":_(i).backgroundColor,"icon-text-color":_(i).color},{small:xe(()=>[K(Wn,{"progress-color":_(i).progressColor,"progress-rail-color":_(i).progressRailColor,percentage:50,"text-color":_(i).color,"card-type-style":_(xt).icon},null,8,["progress-color","progress-rail-color","text-color","card-type-style"])]),_:1},8,["card-type-style","background-color","icon-text-color"])])]),K(_(Sl),{ref:"formRef",modelValue:_(i),"onUpdate:modelValue":l[4]||(l[4]=u=>bo(i)?i.value=u:null)},{default:xe(()=>[K(_(Vt),{label:c.$t("deskModule.systemMonitor.progressColor")},{default:xe(()=>[K(_(rn),{value:_(i).progressColor,"onUpdate:value":l[0]||(l[0]=u=>_(i).progressColor=u),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"]),K(_(Vt),{label:c.$t("deskModule.systemMonitor.progressRailColor")},{default:xe(()=>[K(_(rn),{value:_(i).progressRailColor,"onUpdate:value":l[1]||(l[1]=u=>_(i).progressRailColor=u),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"]),K(_(Vt),{label:c.$t("common.textColor")},{default:xe(()=>[K(_(rn),{value:_(i).color,"onUpdate:value":l[2]||(l[2]=u=>_(i).color=u),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"]),K(_(Vt),{label:c.$t("common.backgroundColor")},{default:xe(()=>[K(_(rn),{value:_(i).backgroundColor,"onUpdate:value":l[3]||(l[3]=u=>_(i).backgroundColor=u),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"])]),_:1},8,["modelValue"])]))}});const YJ={class:"flex mb-5 justify-center transparent-grid p-2 rounded-xl border"},KJ={class:"w-[200px]"},ZJ={class:"w-[80px] ml-2"},JJ=Re({__name:"index",props:{diskExtendParam:null},emits:["update:diskExtendParam"],setup(e,{expose:t,emit:n}){const i=e,c=te(null),l={path:{required:!0,message:Ie("form.required"),trigger:"blur"}},u=te([]),h=de({get:()=>i.diskExtendParam,set:b=>{n("update:diskExtendParam",b)}});async function f(){try{const{data:b}=await FJ();u.value=[];for(let y=0;y{f()}),t({async verification(){var b;try{const y=await((b=c.value)==null?void 0:b.validate());return y?(console.log(y),Promise.resolve(!1)):Promise.resolve(!0)}catch(y){return console.error("An error occurred during validation:",y),Promise.resolve(!1)}}}),(b,y)=>(pe(),Pe("div",null,[fe("div",YJ,[fe("div",KJ,[K(Yo,{"icon-text-icon-hide-title":"","card-type-style":_(xt).info,icon:"solar-cpu-bold","background-color":_(h).backgroundColor,"text-color":_(h).color},{info:xe(()=>[K(Wn,{"progress-color":_(h).progressColor,"progress-rail-color":_(h).progressRailColor,percentage:50,"progress-height":5,"info-card-left-text":"DEMO","info-card-right-text":"TEXT","text-color":_(h).color,"card-type-style":_(xt).info},null,8,["progress-color","progress-rail-color","text-color","card-type-style"])]),_:1},8,["card-type-style","background-color","text-color"])]),fe("div",ZJ,[K(Yo,{"icon-text-icon-hide-title":"","card-type-style":_(xt).icon,icon:"solar-cpu-bold","background-color":_(h).backgroundColor,"icon-text-color":_(h).color},{small:xe(()=>[K(Wn,{"progress-color":_(h).progressColor,"progress-rail-color":_(h).progressRailColor,percentage:50,"text-color":_(h).color,"card-type-style":_(xt).icon},null,8,["progress-color","progress-rail-color","text-color","card-type-style"])]),_:1},8,["card-type-style","background-color","icon-text-color"])])]),K(_(Sl),{ref_key:"formRef",ref:c,modelValue:_(h),"onUpdate:modelValue":y[5]||(y[5]=k=>bo(h)?h.value=k:null),model:_(h),rules:l},{default:xe(()=>[K(_(Vt),{label:b.$t("deskModule.systemMonitor.diskMountPoint"),path:"path"},{default:xe(()=>[K(_(el),{value:_(h).path,"onUpdate:value":y[0]||(y[0]=k=>_(h).path=k),size:"small",options:u.value},null,8,["value","options"])]),_:1},8,["label"]),K(_(Vt),{label:b.$t("deskModule.systemMonitor.progressColor")},{default:xe(()=>[K(_(rn),{value:_(h).progressColor,"onUpdate:value":y[1]||(y[1]=k=>_(h).progressColor=k),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"]),K(_(Vt),{label:b.$t("deskModule.systemMonitor.progressRailColor")},{default:xe(()=>[K(_(rn),{value:_(h).progressRailColor,"onUpdate:value":y[2]||(y[2]=k=>_(h).progressRailColor=k),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"]),K(_(Vt),{label:b.$t("common.textColor")},{default:xe(()=>[K(_(rn),{value:_(h).color,"onUpdate:value":y[3]||(y[3]=k=>_(h).color=k),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"]),K(_(Vt),{label:b.$t("common.backgroundColor")},{default:xe(()=>[K(_(rn),{value:_(h).backgroundColor,"onUpdate:value":y[4]||(y[4]=k=>_(h).backgroundColor=k),swatches:_(Sn),modes:["hex"],size:"small"},null,8,["value","swatches"])]),_:1},8,["label"])]),_:1},8,["modelValue","model"])]))}});const QJ=Re({__name:"index",props:{visible:{type:Boolean},monitorData:null,index:null},emits:["update:visible","done"],setup(e,{emit:t}){const n=e,i=te(),c={progressColor:"#fff",progressRailColor:"#CFCFCFA8",color:"#fff",backgroundColor:"#2a2a2a6b"},l={progressColor:"#fff",progressRailColor:"#CFCFCFA8",color:"#fff",backgroundColor:"#2a2a2a6b",path:""},u={extendParam:c,monitorType:vt.cpu},h=te(vt.cpu),f=te(n.monitorData||{...u}),b=te({...c}),y=te({...l}),k=mi(),C=te(!1),S=de({get:()=>n.visible,set:$=>{t("update:visible",$)}});tr(()=>n.visible,$=>{var E,B,M,U,q,R;h.value=((E=n.monitorData)==null?void 0:E.monitorType)||vt.cpu,((B=n.monitorData)==null?void 0:B.monitorType)===vt.cpu||((M=n.monitorData)==null?void 0:M.monitorType)===vt.memory?b.value={...(U=n.monitorData)==null?void 0:U.extendParam}:((q=n.monitorData)==null?void 0:q.monitorType)===vt.disk&&(y.value={...(R=n.monitorData)==null?void 0:R.extendParam}),$||L()});function L(){b.value={...c},y.value={...l}}async function P(){var E;let $=!0;if(f.value.monitorType=h.value,f.value.monitorType===vt.cpu||f.value.monitorType===vt.memory)f.value.extendParam=b;else if(f.value.monitorType===vt.disk){f.value.extendParam=y;const B=await((E=i.value)==null?void 0:E.verification());B!==void 0&&($=B)}$&&(n.index!==null?await VJ(n.index,f.value)?(S.value=!1,t("done",!0)):k.error(Ie("common.saveFail")):await HJ(f.value)?(S.value=!1,t("done",!0)):k.error(Ie("common.saveFail")))}return($,E)=>(pe(),pt(_(kl),{show:_(S),"onUpdate:show":E[4]||(E[4]=B=>bo(S)?S.value=B:null),preset:"card",size:"small",style:{width:"600px","border-radius":"1rem"},title:e.monitorData?_(Ie)("common.edit"):_(Ie)("common.add")},{footer:xe(()=>[K(_(Dt),{type:"success",loading:C.value,style:{float:"right"},onClick:P},{default:xe(()=>[sr(ot(_(Ie)("common.confirm")),1)]),_:1},8,["loading"])]),default:xe(()=>[K(_(Qm),{value:h.value,"onUpdate:value":E[3]||(E[3]=B=>h.value=B),type:"segment"},{default:xe(()=>[K(_(Ss),{name:_(vt).cpu,tab:$.$t("deskModule.systemMonitor.cpuState")},{default:xe(()=>[K(Ru,{genericProgressStyleExtendParam:b.value,"onUpdate:genericProgressStyleExtendParam":E[0]||(E[0]=B=>b.value=B)},null,8,["genericProgressStyleExtendParam"])]),_:1},8,["name","tab"]),K(_(Ss),{name:_(vt).memory,tab:$.$t("deskModule.systemMonitor.memoryState")},{default:xe(()=>[K(Ru,{genericProgressStyleExtendParam:b.value,"onUpdate:genericProgressStyleExtendParam":E[1]||(E[1]=B=>b.value=B)},null,8,["genericProgressStyleExtendParam"])]),_:1},8,["name","tab"]),K(_(Ss),{name:_(vt).disk,tab:$.$t("deskModule.systemMonitor.diskState")},{default:xe(()=>[K(JJ,{ref_key:"DiskEditorRef",ref:i,"disk-extend-param":y.value,"onUpdate:diskExtendParam":E[2]||(E[2]=B=>y.value=B)},null,8,["disk-extend-param"])]),_:1},8,["name","tab"])]),_:1},8,["value"]),K(_(Dt),{onClick:L},{default:xe(()=>[sr(ot(_(Ie)("common.reset")),1)]),_:1})]),_:1},8,["show","title"]))}}),eQ={class:"system-monitor w-full"},tQ={class:"system-monitor-header text-white text-xl font-extrabold mb-[20px] ml-[10px] flex items-center"},rQ={key:0,class:"text-shadow"},nQ=["title","onClick","onContextmenu"],oQ=["title","onClick","onContextmenu"],aQ={key:2,class:"system-monitor-edit-bar flex mt-[10px]"},iQ=Re({__name:"index",props:{allowEdit:{type:Boolean},showTitle:{type:Boolean}},setup(e){const t=e,n=Ku(),i=Zu(),c=mi(),l=te(0),u=te(0),h=te(!1),f=te(null),b=te({hoverStatus:!1,sortStatus:!1}),y=te(!1),k=te(null),C=te(null);function S(){y.value=!0,k.value=null,C.value=null}function L(Z){b.value.sortStatus=Z,Z||M()}function P(Z){b.value.hoverStatus=Z}const $={background:"#2a2a2a6b"},E=te([]);function B(Z,ee){t.allowEdit&&(y.value=!0,k.value=ee,C.value=Z)}async function M(){E.value=await _i(),E.value.length===0&&(E.value.push({extendParam:{backgroundColor:"#2a2a2a6b",color:"#fff",progressColor:"#fff",progressRailColor:"#CFCFCFA8"},monitorType:vt.cpu}),Ko(E.value))}dr(()=>{M()});function U(){M()}async function q(){const{code:Z}=await Ko(E.value);Z===0&&(b.value.sortStatus=!1)}function R(Z,ee,ne){ee!==null&&(Z.preventDefault(),f.value=ee),An().then(()=>{h.value=!0,l.value=Z.clientX,u.value=Z.clientY})}function j(){return[{label:Ie("common.delete"),key:"delete"}]}function ie(){h.value=!1}async function X(Z){await jJ(Z)&&M()}function oe(Z){switch(h.value=!1,Z){case"delete":i.warning({title:Ie("common.warning"),content:Ie("common.deleteConfirm"),positiveText:Ie("common.confirm"),negativeText:Ie("common.cancel"),onPositiveClick:()=>{if(E.value.length<=1){c.warning(Ie("common.leastOne"));return}f.value!==null&&X(f.value)}});break}}return(Z,ee)=>(pe(),Pe("div",eQ,[fe("div",{class:yr(["mt-[50px]",b.value.sortStatus?"shadow-2xl border shadow-[0_0_30px_10px_rgba(0,0,0,0.3)] p-[10px] rounded-2xl":""]),onMouseenter:ee[5]||(ee[5]=ne=>P(!0)),onMouseleave:ee[6]||(ee[6]=ne=>P(!1))},[fe("div",tQ,[e.showTitle?(pe(),Pe("span",rQ,ot(Z.$t("deskModule.systemMonitor.systemState")),1)):Xe("",!0),e.allowEdit?(pe(),Pe("div",{key:1,class:yr(["system-monitor-buttons ml-2 delay-100 transition-opacity flex",b.value.hoverStatus?"opacity-100":"opacity-0"])},[fe("span",{class:"mr-2 cursor-pointer",onClick:ee[0]||(ee[0]=ne=>S())},[K(_(Ft),{class:"text-white font-xl",icon:"typcn:plus"})]),fe("span",{class:"mr-2 cursor-pointer",onClick:ee[1]||(ee[1]=ne=>L(!b.value.sortStatus))},[K(_(Ft),{class:"text-white font-xl",icon:"ri:drag-drop-line"})])],2)):Xe("",!0)]),_(n).panelConfig.iconStyle===_(xt).info?(pe(),pt(_(si),{key:0,modelValue:E.value,"onUpdate:modelValue":ee[2]||(ee[2]=ne=>E.value=ne),"item-key":"sort",animation:300,class:"icon-info-box",filter:".not-drag",disabled:!b.value.sortStatus},{default:xe(()=>[(pe(!0),Pe(cr,null,jn(E.value,(ne,V)=>(pe(),Pe("div",{key:V,title:ne.description,onClick:ae=>B(V,ne),onContextmenu:ae=>R(ae,V,ne)},[K(Eu,{"extend-param":ne.extendParam,"icon-text-icon-hide-title":!1,"card-type-style":_(n).panelConfig.iconStyle,"monitor-type":ne.monitorType,"card-style":$,"icon-text-color":_(n).panelConfig.iconTextColor},null,8,["extend-param","card-type-style","monitor-type","icon-text-color"])],40,nQ))),128))]),_:1},8,["modelValue","disabled"])):Xe("",!0),_(n).panelConfig.iconStyle===_(xt).icon?(pe(),pt(_(si),{key:1,modelValue:E.value,"onUpdate:modelValue":ee[3]||(ee[3]=ne=>E.value=ne),"item-key":"sort",animation:300,class:"icon-small-box",filter:".not-drag",disabled:!b.value.sortStatus},{default:xe(()=>[(pe(!0),Pe(cr,null,jn(E.value,(ne,V)=>(pe(),Pe("div",{key:V,title:ne.description,onClick:ae=>B(V,ne),onContextmenu:ae=>R(ae,V,ne)},[K(Eu,{"extend-param":ne.extendParam,"icon-text-icon-hide-title":!1,"card-type-style":_(n).panelConfig.iconStyle,"monitor-type":ne.monitorType,"card-style":$,"icon-text-color":_(n).panelConfig.iconTextColor},null,8,["extend-param","card-type-style","monitor-type","icon-text-color"])],40,oQ))),128))]),_:1},8,["modelValue","disabled"])):Xe("",!0),b.value.sortStatus&&e.allowEdit?(pe(),Pe("div",aQ,[K(_(Dt),{color:"#2a2a2a6b",onClick:ee[4]||(ee[4]=ne=>q())},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"material-symbols:save"})]),default:xe(()=>[fe("div",null,ot(Z.$t("common.saveSort")),1)]),_:1})])):Xe("",!0)],34),K(QJ,{visible:y.value,"onUpdate:visible":ee[7]||(ee[7]=ne=>y.value=ne),"monitor-data":k.value,index:C.value,onDone:U},null,8,["visible","monitor-data","index"]),K(_(vd),{placement:"bottom-start",trigger:"manual",x:l.value,y:u.value,options:j(),show:h.value,"on-clickoutside":ie,onSelect:oe},null,8,["x","y","options","show"])]))}});const sQ=ta(iQ,[["__scopeId","data-v-679daf12"]]),lQ=e=>(Df("data-v-f21ede0f"),e=e(),zf(),e),cQ={class:"w-full h-full sun-main"},uQ={class:"mx-[auto] w-[80%]"},dQ={class:"flex mx-[auto] items-center justify-center text-white"},hQ={class:"logo"},fQ={class:"text-2xl md:text-6xl font-bold text-shadow"},pQ=lQ(()=>fe("div",{class:"divider text-base lg:text-2xl mx-[10px]"}," | ",-1)),mQ={class:"text-shadow"},vQ={key:0,class:"flex mt-[20px] mx-auto sm:w-full lg:w-[80%]"},gQ={key:0,class:"flex mx-auto"},bQ=["onMouseenter","onMouseleave"],yQ={class:"text-white text-xl font-extrabold mb-[20px] ml-[10px] flex items-center"},xQ={class:"group-title text-shadow"},wQ=["title","onClick"],kQ=["title","onClick"],SQ={key:0},CQ={key:0},AQ=["title","onContextmenu"],TQ={key:0,class:"not-drag"},_Q={key:1},DQ={key:0},zQ=["title","onContextmenu"],EQ={key:0,class:"not-drag"},RQ={key:2,class:"flex mt-[10px]"},MQ=["innerHTML"],BQ={class:"fixed-element shadow-[0_0_10px_2px_rgba(0,0,0,0.2)]"},IQ={class:"shadow-[0_0_10px_2px_rgba(0,0,0,0.2)]"},PQ={class:"flex items-center"},NQ={class:"mr-[20px]"},qQ={class:"w-full h-full rounded-2xl overflow-hidden border dark:border-zinc-700"},FQ={key:0,class:"flex flex-col p-5"},LQ=["src"],$Q=Re({__name:"index",setup(e){const t=mi(),n=Zu(),i=Ku(),c=pi(),l=te(void 0),u=te(!1),h=te(null),f=te(!1),b=te(""),y=te(""),k=te(null),C=te(!1),S=te(0),L=te(0),P=te(!1),$=te(null),E=te(),B=te(!1),M=te([]),U=te([]);function q(ve,Ee,Se){switch(ve){case 1:window.location.href=Ee;break;case 2:window.open(Ee);break;case 3:f.value=!0,b.value=Ee,y.value=Se||Ee,C.value=!0;break}}function R(ve,Ee){if(M.value[ve]&&M.value[ve].sortStatus){gt(Ee);return}let Se="";Ee&&(Se=i.networkMode===en.lan?Ee.lanUrl:Ee.url),Ee.lanUrl===""&&(Se=Ee.url),q(Ee.openMethod,Se,Ee.title)}function j(ve){C.value=!1}function ie(){Cd().then(({code:ve,data:Ee,msg:Se})=>{ve===0&&(M.value=Ee.list);for(let Ze=0;Ze{Se.code===0&&(M.value[ve].items=Se.data.list)})}function oe(ve){var Se,Ze,Be,Ye,wt,Rr,hr,Mr,Xr;P.value=!1;let Ee=i.networkMode===en.lan?(Se=$.value)==null?void 0:Se.lanUrl:(Ze=$.value)==null?void 0:Ze.url;switch(((Be=$.value)==null?void 0:Be.lanUrl)===""&&(Ee=$.value.url),ve){case"newWindows":window.open(Ee);break;case"openWanUrl":$.value&&q((Ye=$.value)==null?void 0:Ye.openMethod,(wt=$.value)==null?void 0:wt.url,(Rr=$.value)==null?void 0:Rr.title);break;case"openLanUrl":$.value&&$.value.lanUrl&&q((hr=$.value)==null?void 0:hr.openMethod,$.value.lanUrl,(Mr=$.value)==null?void 0:Mr.title);break;case"edit":gt({...$.value});break;case"delete":n.warning({title:Ie("common.warning"),content:Ie("common.deleteConfirmByName",{name:(Xr=$.value)==null?void 0:Xr.title}),positiveText:Ie("common.confirm"),negativeText:Ie("common.cancel"),onPositiveClick:()=>{var ln;_4([(ln=$.value)==null?void 0:ln.id]).then(({code:cn,msg:Xt})=>{cn===0?(t.success(Ie("common.deleteSuccess")),ie()):t.error(`${Ie("common.deleteFail")}:${Xt}`)})}});break}}function Z(ve,Ee,Se){M.value[Ee]&&M.value[Ee].sortStatus||(ve.preventDefault(),$.value=Se,P.value=!1,An().then(()=>{P.value=!0,S.value=ve.clientX,L.value=ve.clientY}))}function ee(){P.value=!1}function ne(ve){ie()}function V(ve){i.setNetworkMode(ve),ve===en.lan?t.success(Ie("panelHome.changeToLanModelSuccess")):t.success(Ie("panelHome.changeToWanModelSuccess"))}function ae(ve){const Ee=[];if(ve.items){for(let Se=0;Se{Se===0?(t.success(Ie("common.saveSuccess")),ve.sortStatus=!1):t.error(`${Ie("common.saveFail")}:${Ze}`)})}}function me(){var Ee,Se;const ve=[{label:Ie("iconItem.newWindowOpen"),key:"newWindows"}];return(Ee=$.value)!=null&&Ee.lanUrl&&i.networkMode===en.wan&&ve.push({label:Ie("panelHome.openLanUrl"),key:"openLanUrl"}),(Se=$.value)!=null&&Se.lanUrl&&i.networkMode===en.lan&&ve.push({label:Ie("panelHome.openWanUrl"),key:"openWanUrl"}),c.visitMode===gn.VISIT_MODE_LOGIN&&ve.push({label:Ie("common.edit"),key:"edit"},{label:Ie("common.delete"),key:"delete"}),ve}dr(()=>{Of(),ie(),i.updatePanelConfigByCloud(),i.panelConfig.logoText&&Uf(i.panelConfig.logoText)});function Ce(ve){var Ee;if(ve=ve==null?void 0:ve.trim(),ve!==""&&i.panelConfig.searchBoxSearchIcon){const Se=te([]);for(let Ze=0;Ze{var wt;return Ye.title.toLowerCase().includes((ve==null?void 0:ve.toLowerCase())??"")||Ye.url.toLowerCase().includes((ve==null?void 0:ve.toLowerCase())??"")||((wt=Ye.description)==null?void 0:wt.toLowerCase().includes((ve==null?void 0:ve.toLowerCase())??""))});Be&&Be.length>0&&Se.value.push({items:Be,hoverStatus:!1})}U.value=Se.value}else U.value=M.value}function Le(ve,Ee){M.value[ve]&&(M.value[ve].hoverStatus=Ee)}function ht(ve,Ee){M.value[ve]&&(M.value[ve].sortStatus=Ee),Ee||M.value[ve]&&M.value[ve].id&&X(ve,M.value[ve].id)}function gt(ve){h.value=ve,u.value=!0,E.value=void 0}function De(ve){h.value=null,u.value=!0,ve&&(E.value=ve)}return(ve,Ee)=>(pe(),Pe("div",cQ,[fe("div",{class:"cover wallpaper",style:mt({filter:`blur(${_(i).panelConfig.backgroundBlur}px)`,background:`url(${_(i).panelConfig.backgroundImageSrc}) no-repeat`,backgroundSize:"cover",backgroundPosition:"center"})},null,4),fe("div",{class:"mask",style:mt({backgroundColor:`rgba(0,0,0,${_(i).panelConfig.backgroundMaskNumber})`})},null,4),fe("div",{ref_key:"scrollContainerRef",ref:l,class:"absolute w-full h-full overflow-auto"},[fe("div",{class:"p-2.5 mx-auto",style:mt({marginTop:`${_(i).panelConfig.marginTop}%`,marginBottom:`${_(i).panelConfig.marginBottom}%`,maxWidth:(_(i).panelConfig.maxWidth??"1200")+_(i).panelConfig.maxWidthUnit})},[fe("div",uQ,[fe("div",dQ,[fe("div",hQ,[fe("span",fQ,ot(_(i).panelConfig.logoText),1)]),pQ,fe("div",mQ,[K(_(gJ),{"hide-second":!_(i).panelConfig.clockShowSecond},null,8,["hide-second"])])]),_(i).panelConfig.searchBoxShow?(pe(),Pe("div",vQ,[K(_(DJ),{onItemSearch:Ce})])):Xe("",!0)]),fe("div",{style:mt({marginLeft:`${_(i).panelConfig.marginX}px`,marginRight:`${_(i).panelConfig.marginX}px`})},[_(i).panelConfig.systemMonitorShow&&(_(i).panelConfig.systemMonitorPublicVisitModeShow&&_(c).visitMode===_(gn).VISIT_MODE_PUBLIC||_(c).visitMode===_(gn).VISIT_MODE_LOGIN)?(pe(),Pe("div",gQ,[K(_(sQ),{"allow-edit":_(c).visitMode===_(gn).VISIT_MODE_LOGIN,"show-title":_(i).panelConfig.systemMonitorShowTitle},null,8,["allow-edit","show-title"])])):Xe("",!0),(pe(!0),Pe(cr,null,jn(U.value,(Se,Ze)=>(pe(),Pe("div",{key:Ze,class:yr(["item-list mt-[50px]",Se.sortStatus?"shadow-2xl border shadow-[0_0_30px_10px_rgba(0,0,0,0.3)] p-[10px] rounded-2xl":""]),onMouseenter:Be=>Le(Ze,!0),onMouseleave:Be=>Le(Ze,!1)},[fe("div",yQ,[fe("span",xQ,ot(Se.title),1),_(c).visitMode===_(gn).VISIT_MODE_LOGIN?(pe(),Pe("div",{key:0,class:yr(["group-buttons ml-2 delay-100 transition-opacity flex",Se.hoverStatus?"opacity-100":"opacity-0"])},[fe("span",{class:"mr-2 cursor-pointer",title:_(Ie)("common.add"),onClick:Be=>De(Se.id)},[K(_(Ft),{class:"text-white font-xl",icon:"typcn:plus"})],8,wQ),fe("span",{class:"mr-2 cursor-pointer",title:_(Ie)("common.sort"),onClick:Be=>ht(Ze,!Se.sortStatus)},[K(_(Ft),{class:"text-white font-xl",icon:"ri:drag-drop-line"})],8,kQ)],2)):Xe("",!0)]),_(i).panelConfig.iconStyle===_(xt).info?(pe(),Pe("div",SQ,[Se.items?(pe(),Pe("div",CQ,[K(_(si),{modelValue:Se.items,"onUpdate:modelValue":Be=>Se.items=Be,"item-key":"sort",animation:300,class:"icon-info-box",filter:".not-drag",disabled:!Se.sortStatus},{default:xe(()=>[(pe(!0),Pe(cr,null,jn(Se.items,(Be,Ye)=>(pe(),Pe("div",{key:Ye,title:Be.description,onContextmenu:wt=>Z(wt,Ze,Be)},[K(_(ja),{class:yr(Se.sortStatus?"cursor-move":"cursor-pointer"),"item-info":Be,"icon-text-color":_(i).panelConfig.iconTextColor,"icon-text-info-hide-description":_(i).panelConfig.iconTextInfoHideDescription||!1,"icon-text-icon-hide-title":_(i).panelConfig.iconTextIconHideTitle||!1,style:0,onClick:wt=>R(Ze,Be)},null,8,["class","item-info","icon-text-color","icon-text-info-hide-description","icon-text-icon-hide-title","onClick"])],40,AQ))),128)),Se.items.length===0?(pe(),Pe("div",TQ,[K(_(ja),{class:yr(Se.sortStatus?"cursor-move":"cursor-pointer"),"item-info":{icon:{itemType:3,text:"subway:add"},title:_(Ie)("common.add"),url:"",openMethod:0},"icon-text-color":_(i).panelConfig.iconTextColor,"icon-text-info-hide-description":_(i).panelConfig.iconTextInfoHideDescription||!1,"icon-text-icon-hide-title":_(i).panelConfig.iconTextIconHideTitle||!1,style:0,onClick:Be=>De(Se.id)},null,8,["class","item-info","icon-text-color","icon-text-info-hide-description","icon-text-icon-hide-title","onClick"])])):Xe("",!0)]),_:2},1032,["modelValue","onUpdate:modelValue","disabled"])])):Xe("",!0)])):Xe("",!0),_(i).panelConfig.iconStyle===_(xt).icon?(pe(),Pe("div",_Q,[Se.items?(pe(),Pe("div",DQ,[K(_(si),{modelValue:Se.items,"onUpdate:modelValue":Be=>Se.items=Be,"item-key":"sort",animation:300,class:"icon-small-box",filter:".not-drag",disabled:!Se.sortStatus},{default:xe(()=>[(pe(!0),Pe(cr,null,jn(Se.items,(Be,Ye)=>(pe(),Pe("div",{key:Ye,title:Be.description,onContextmenu:wt=>Z(wt,Ze,Be)},[K(_(ja),{class:yr(Se.sortStatus?"cursor-move":"cursor-pointer"),"item-info":Be,"icon-text-color":_(i).panelConfig.iconTextColor,"icon-text-info-hide-description":!_(i).panelConfig.iconTextInfoHideDescription,"icon-text-icon-hide-title":_(i).panelConfig.iconTextIconHideTitle||!1,style:1,onClick:wt=>R(Ze,Be)},null,8,["class","item-info","icon-text-color","icon-text-info-hide-description","icon-text-icon-hide-title","onClick"])],40,zQ))),128)),Se.items.length===0?(pe(),Pe("div",EQ,[K(_(ja),{class:"cursor-pointer","item-info":{icon:{itemType:3,text:"subway:add"},title:ve.$t("common.add"),url:"",openMethod:0},"icon-text-color":_(i).panelConfig.iconTextColor,"icon-text-info-hide-description":!_(i).panelConfig.iconTextInfoHideDescription,"icon-text-icon-hide-title":_(i).panelConfig.iconTextIconHideTitle||!1,style:1,onClick:Be=>De(Se.id)},null,8,["item-info","icon-text-color","icon-text-info-hide-description","icon-text-icon-hide-title","onClick"])])):Xe("",!0)]),_:2},1032,["modelValue","onUpdate:modelValue","disabled"])])):Xe("",!0)])):Xe("",!0),Se.sortStatus?(pe(),Pe("div",RQ,[fe("div",null,[K(_(Dt),{color:"#2a2a2a6b",onClick:Be=>ae(Se)},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"material-symbols:save"})]),default:xe(()=>[fe("div",null,ot(ve.$t("common.saveSort")),1)]),_:2},1032,["onClick"])])])):Xe("",!0)],42,bQ))),128))],4),fe("div",{class:"mt-5 footer",innerHTML:_(i).panelConfig.footerHtml},null,8,MQ)],4)],512),K(_(vd),{placement:"bottom-start",trigger:"manual",x:S.value,y:L.value,options:me(),show:P.value,"on-clickoutside":ee,onSelect:oe},null,8,["x","y","options","show"]),fe("div",BQ,[K(_(Hf),{vertical:""},{default:xe(()=>[_(i).networkMode===_(en).lan&&_(i).panelConfig.netModeChangeButtonShow?(pe(),pt(_(Dt),{key:0,color:"#2a2a2a6b",title:_(Ie)("panelHome.changeToWanModel"),onClick:Ee[0]||(Ee[0]=Se=>V(_(en).wan))},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"material-symbols:lan-outline-rounded"})]),_:1},8,["title"])):Xe("",!0),_(i).networkMode===_(en).wan&&_(i).panelConfig.netModeChangeButtonShow?(pe(),pt(_(Dt),{key:1,color:"#2a2a2a6b",title:_(Ie)("panelHome.changeToLanModel"),onClick:Ee[1]||(Ee[1]=Se=>V(_(en).lan))},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"mdi:wan"})]),_:1},8,["title"])):Xe("",!0),_(c).visitMode===_(gn).VISIT_MODE_LOGIN?(pe(),pt(_(Dt),{key:2,color:"#2a2a2a6b",onClick:Ee[2]||(Ee[2]=Se=>B.value=!B.value)},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"majesticons-applications"})]),_:1})):Xe("",!0),_(c).visitMode===_(gn).VISIT_MODE_PUBLIC?(pe(),pt(_(Dt),{key:3,color:"#2a2a2a6b",title:ve.$t("panelHome.goToLogin"),onClick:Ee[3]||(Ee[3]=Se=>_(Ef).push("/login"))},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"material-symbols:account-circle"})]),_:1},8,["title"])):Xe("",!0)]),_:1}),K(_(dJ),{visible:B.value,"onUpdate:visible":Ee[4]||(Ee[4]=Se=>B.value=Se)},null,8,["visible"])]),K(_(Bp),{"listen-to":()=>l.value,right:10,bottom:10,style:{"background-color":"transparent",border:"none","box-shadow":"none"}},{default:xe(()=>[fe("div",IQ,[K(_(Dt),{color:"#2a2a2a6b"},{icon:xe(()=>[K(_(Ft),{class:"text-white font-xl",icon:"icon-park-outline:to-top"})]),_:1})])]),_:1},8,["listen-to"]),K(_(GZ),{visible:u.value,"onUpdate:visible":Ee[5]||(Ee[5]=Se=>u.value=Se),"item-info":h.value,"item-group-id":E.value,onDone:ne},null,8,["visible","item-info","item-group-id"]),K(_(kl),{show:f.value,"onUpdate:show":Ee[6]||(Ee[6]=Se=>f.value=Se),"mask-closable":!1,preset:"card",style:{"max-width":"1000px",height:"600px","border-radius":"1rem"},bordered:!0,size:"small",role:"dialog","aria-modal":"true"},{header:xe(()=>[fe("div",PQ,[fe("span",NQ,ot(y.value),1),C.value?(pe(),pt(_(ed),{key:0,size:"small"})):Xe("",!0)])]),default:xe(()=>[fe("div",qQ,[C.value?(pe(),Pe("div",FQ,[K(_(ks),{height:"50px",width:"100%",class:"rounded-lg"}),K(_(ks),{height:"180px",width:"100%",class:"mt-[20px] rounded-lg"}),K(_(ks),{height:"180px",width:"100%",class:"mt-[20px] rounded-lg"})])):Xe("",!0),fi(fe("iframe",{id:"windowIframeId",ref_key:"windowIframeRef",ref:k,src:b.value,class:"w-full h-full",frameborder:"0",onLoad:j},null,40,LQ),[[Gu,!C.value]])])]),_:1},8,["show"])]))}});const OQ=ta($Q,[["__scopeId","data-v-f21ede0f"]]),JQ=Object.freeze(Object.defineProperty({__proto__:null,default:OQ},Symbol.toStringTag,{value:"Module"}));export{cd as C,m4 as N,Em as a,WQ as b,um as c,ZQ as d,XQ as e,T4 as f,Cd as g,si as h,YQ as i,rn as j,e4 as k,al as l,tp as m,xs as n,vd as o,JQ as p,hm as r,KQ as s}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-c238f14b.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-c238f14b.js deleted file mode 100644 index d928a2763..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-c238f14b.js +++ /dev/null @@ -1,117 +0,0 @@ -import{D as Fe,b as le,bY as Wt,w as Z,y as L,t as mt,H as N,aq as gt,ar as wt,am as bt,r as T,e as R,c as V,ae as se,f as ue,a6 as ae,bg as Ft,c9 as Nt,a8 as we,ca as je,cb as Lt,u as kt,L as G,N as yt,g as S,c4 as $t,O as Xt,R as Ht,cc as be,k as ye,cd as Yt,ce as Kt,cf as Ne,cg as jt,ch as Y,i as Mt,ci as Le,bZ as Ut,cj as ne,ck as St,cl as Be,cm as Ue,cn as Vt,co as Ve,cp as Ge,cq as ve,cr as Gt,cs as qe,j as qt,ct as Jt,cu as Qt,cv as Zt,cw as Rt,cx as en,cy as tn,cz as nn,bH as rn,n as H,m as F,aj as Me,p as Se,K as pe,cA as on,q as an,z as ke,E as xt,a9 as Je,aP as sn,B as ln,a7 as Qe,T as un,cB as dn,cC as Ze,cD as fn,P as cn,G as xe,ao as hn,ap as vn,cE as Re,aR as pn,cF as mn,as as gn,ab as de,cG as wn,aW as bn,aX as yn,b3 as $n,bd as Mn}from"./index-7e19b821.js";import{_ as Sn}from"./_plugin-vue_export-helper-c27b6911.js";let me=[];const Pt=new WeakMap;function xn(){me.forEach(e=>e(...Pt.get(e))),me=[]}function Pn(e,...t){Pt.set(e,t),!me.includes(e)&&me.push(e)===1&&requestAnimationFrame(xn)}const Cn=/^(\d|\.)+$/,et=/(\d|\.)+/;function Pe(e,{c:t=1,offset:n=0,attachPx:r=!0}={}){if(typeof e=="number"){const o=(e+n)*t;return o===0?"0":`${o}px`}else if(typeof e=="string")if(Cn.test(e)){const o=(Number(e)+n)*t;return r?o===0?"0":`${o}px`:`${o}`}else{const o=et.exec(e);return o?e.replace(et,String((Number(o[0])+n)*t)):e}return e}let Ce;function An(){return Ce===void 0&&(Ce=navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom")),Ce}let ee,ie;const _n=()=>{var e,t;ee=Wt?(t=(e=document)===null||e===void 0?void 0:e.fonts)===null||t===void 0?void 0:t.ready:void 0,ie=!1,ee!==void 0?ee.then(()=>{ie=!0}):ie=!0};_n();function On(e){if(ie)return;let t=!1;Fe(()=>{ie||ee==null||ee.then(()=>{t||e()})}),le(()=>{t=!0})}function En(e,t){return Z(e,n=>{n!==void 0&&(t.value=n)}),L(()=>e.value===void 0?t.value:e.value)}function Tn(e,t){return L(()=>{for(const n of t)if(e[n]!==void 0)return e[n];return e[t[t.length-1]]})}const Ca=mt("n-internal-select-menu"),Bn=mt("n-internal-select-menu-body"),Ct="__disabled__";function te(e){const t=N(gt,null),n=N(wt,null),r=N(bt,null),o=N(Bn,null),a=T();if(typeof document<"u"){a.value=document.fullscreenElement;const i=()=>{a.value=document.fullscreenElement};Fe(()=>{R("fullscreenchange",document,i)}),le(()=>{V("fullscreenchange",document,i)})}return se(()=>{var i;const{to:s}=e;return s!==void 0?s===!1?Ct:s===!0?a.value||"body":s:t!=null&&t.value?(i=t.value.$el)!==null&&i!==void 0?i:t.value:n!=null&&n.value?n.value:r!=null&&r.value?r.value:o!=null&&o.value?o.value:s??(a.value||"body")})}te.tdkey=Ct;te.propTo={type:[String,Object,Boolean],default:void 0};let X=null;function At(){if(X===null&&(X=document.getElementById("v-binder-view-measurer"),X===null)){X=document.createElement("div"),X.id="v-binder-view-measurer";const{style:e}=X;e.position="fixed",e.left="0",e.right="0",e.top="0",e.bottom="0",e.pointerEvents="none",e.visibility="hidden",document.body.appendChild(X)}return X.getBoundingClientRect()}function zn(e,t){const n=At();return{top:t,left:e,height:0,width:0,right:n.width-e,bottom:n.height-t}}function Ae(e){const t=e.getBoundingClientRect(),n=At();return{left:t.left-n.left,top:t.top-n.top,bottom:n.height+n.top-t.bottom,right:n.width+n.left-t.right,width:t.width,height:t.height}}function In(e){return e.nodeType===9?null:e.parentNode}function _t(e){if(e===null)return null;const t=In(e);if(t===null)return null;if(t.nodeType===9)return document;if(t.nodeType===1){const{overflow:n,overflowX:r,overflowY:o}=getComputedStyle(t);if(/(auto|scroll|overlay)/.test(n+o+r))return t}return _t(t)}const Dn=ue({name:"Binder",props:{syncTargetWithParent:Boolean,syncTarget:{type:Boolean,default:!0}},setup(e){var t;ae("VBinder",(t=Ft())===null||t===void 0?void 0:t.proxy);const n=N("VBinder",null),r=T(null),o=c=>{r.value=c,n&&e.syncTargetWithParent&&n.setTargetRef(c)};let a=[];const i=()=>{let c=r.value;for(;c=_t(c),c!==null;)a.push(c);for(const $ of a)R("scroll",$,m,!0)},s=()=>{for(const c of a)V("scroll",c,m,!0);a=[]},l=new Set,d=c=>{l.size===0&&i(),l.has(c)||l.add(c)},p=c=>{l.has(c)&&l.delete(c),l.size===0&&s()},m=()=>{Pn(u)},u=()=>{l.forEach(c=>c())},v=new Set,g=c=>{v.size===0&&R("resize",window,y),v.has(c)||v.add(c)},f=c=>{v.has(c)&&v.delete(c),v.size===0&&V("resize",window,y)},y=()=>{v.forEach(c=>c())};return le(()=>{V("resize",window,y),s()}),{targetRef:r,setTargetRef:o,addScrollListener:d,removeScrollListener:p,addResizeListener:g,removeResizeListener:f}},render(){return Nt("binder",this.$slots)}}),Wn=Dn,Fn=ue({name:"Target",setup(){const{setTargetRef:e,syncTarget:t}=N("VBinder");return{syncTarget:t,setTargetDirective:{mounted:e,updated:e}}},render(){const{syncTarget:e,setTargetDirective:t}=this;return e?we(je("follower",this.$slots),[[t]]):je("follower",this.$slots)}}),Q="@@mmoContext",Nn={mounted(e,{value:t}){e[Q]={handler:void 0},typeof t=="function"&&(e[Q].handler=t,R("mousemoveoutside",e,t))},updated(e,{value:t}){const n=e[Q];typeof t=="function"?n.handler?n.handler!==t&&(V("mousemoveoutside",e,n.handler),n.handler=t,R("mousemoveoutside",e,t)):(e[Q].handler=t,R("mousemoveoutside",e,t)):n.handler&&(V("mousemoveoutside",e,n.handler),n.handler=void 0)},unmounted(e){const{handler:t}=e[Q];t&&V("mousemoveoutside",e,t),e[Q].handler=void 0}},Ln=Nn,{c:fe}=Lt(),kn="vueuc-style",ce={top:"bottom",bottom:"top",left:"right",right:"left"},tt={start:"end",center:"center",end:"start"},_e={top:"height",bottom:"height",left:"width",right:"width"},Xn={"bottom-start":"top left",bottom:"top center","bottom-end":"top right","top-start":"bottom left",top:"bottom center","top-end":"bottom right","right-start":"top left",right:"center left","right-end":"bottom left","left-start":"top right",left:"center right","left-end":"bottom right"},Hn={"bottom-start":"bottom left",bottom:"bottom center","bottom-end":"bottom right","top-start":"top left",top:"top center","top-end":"top right","right-start":"top right",right:"center right","right-end":"bottom right","left-start":"top left",left:"center left","left-end":"bottom left"},Yn={"bottom-start":"right","bottom-end":"left","top-start":"right","top-end":"left","right-start":"bottom","right-end":"top","left-start":"bottom","left-end":"top"},nt={top:!0,bottom:!1,left:!0,right:!1},rt={top:"end",bottom:"start",left:"end",right:"start"};function Kn(e,t,n,r,o,a){if(!o||a)return{placement:e,top:0,left:0};const[i,s]=e.split("-");let l=s??"center",d={top:0,left:0};const p=(v,g,f)=>{let y=0,c=0;const $=n[v]-t[g]-t[v];return $>0&&r&&(f?c=nt[g]?$:-$:y=nt[g]?$:-$),{left:y,top:c}},m=i==="left"||i==="right";if(l!=="center"){const v=Yn[e],g=ce[v],f=_e[v];if(n[f]>t[f]){if(t[v]+t[f]t[g]&&(l=tt[s])}else{const v=i==="bottom"||i==="top"?"left":"top",g=ce[v],f=_e[v],y=(n[f]-t[f])/2;(t[v]t[g]?(l=rt[v],d=p(f,v,m)):(l=rt[g],d=p(f,g,m)))}let u=i;return t[i] *",{pointerEvents:"all"})])]),Gn=ue({name:"Follower",inheritAttrs:!1,props:{show:Boolean,enabled:{type:Boolean,default:void 0},placement:{type:String,default:"bottom"},syncTrigger:{type:Array,default:["resize","scroll"]},to:[String,Object],flip:{type:Boolean,default:!0},internalShift:Boolean,x:Number,y:Number,width:String,minWidth:String,containerClass:String,teleportDisabled:Boolean,zindexable:{type:Boolean,default:!0},zIndex:Number,overlap:Boolean},setup(e){const t=N("VBinder"),n=se(()=>e.enabled!==void 0?e.enabled:e.show),r=T(null),o=T(null),a=()=>{const{syncTrigger:u}=e;u.includes("scroll")&&t.addScrollListener(l),u.includes("resize")&&t.addResizeListener(l)},i=()=>{t.removeScrollListener(l),t.removeResizeListener(l)};Fe(()=>{n.value&&(l(),a())});const s=kt();Vn.mount({id:"vueuc/binder",head:!0,anchorMetaName:kn,ssr:s}),le(()=>{i()}),On(()=>{n.value&&l()});const l=()=>{if(!n.value)return;const u=r.value;if(u===null)return;const v=t.targetRef,{x:g,y:f,overlap:y}=e,c=g!==void 0&&f!==void 0?zn(g,f):Ae(v);u.style.setProperty("--v-target-width",`${Math.round(c.width)}px`),u.style.setProperty("--v-target-height",`${Math.round(c.height)}px`);const{width:$,minWidth:z,placement:_,internalShift:O,flip:K}=e;u.setAttribute("v-placement",_),y?u.setAttribute("v-overlap",""):u.removeAttribute("v-overlap");const{style:w}=u;$==="target"?w.width=`${c.width}px`:$!==void 0?w.width=$:w.width="",z==="target"?w.minWidth=`${c.width}px`:z!==void 0?w.minWidth=z:w.minWidth="";const P=Ae(u),C=Ae(o.value),{left:b,top:k,placement:I}=Kn(_,c,P,O,K,y),B=jn(I,y),{left:j,top:h,transform:M}=Un(I,C,c,k,b,y);u.setAttribute("v-placement",I),u.style.setProperty("--v-offset-left",`${Math.round(b)}px`),u.style.setProperty("--v-offset-top",`${Math.round(k)}px`),u.style.transform=`translateX(${j}) translateY(${h}) ${M}`,u.style.setProperty("--v-transform-origin",B),u.style.transformOrigin=B};Z(n,u=>{u?(a(),d()):i()});const d=()=>{Ht().then(l).catch(u=>console.error(u))};["placement","x","y","internalShift","flip","width","overlap","minWidth"].forEach(u=>{Z(G(e,u),l)}),["teleportDisabled"].forEach(u=>{Z(G(e,u),d)}),Z(G(e,"syncTrigger"),u=>{u.includes("resize")?t.addResizeListener(l):t.removeResizeListener(l),u.includes("scroll")?t.addScrollListener(l):t.removeScrollListener(l)});const p=yt(),m=se(()=>{const{to:u}=e;if(u!==void 0)return u;p.value});return{VBinder:t,mergedEnabled:n,offsetContainerRef:o,followerRef:r,mergedTo:m,syncPosition:l}},render(){return S(Xt,{show:this.show,to:this.mergedTo,disabled:this.teleportDisabled},{default:()=>{var e,t;const n=S("div",{class:["v-binder-follower-container",this.containerClass],ref:"offsetContainerRef"},[S("div",{class:"v-binder-follower-content",ref:"followerRef"},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e))]);return this.zindexable?we(n,[[$t,{enabled:this.mergedEnabled,zIndex:this.zIndex}]]):n}})}});var qn=be(ye,"WeakMap");const ze=qn;var Jn=Yt(Object.keys,Object);const Qn=Jn;var Zn=Object.prototype,Rn=Zn.hasOwnProperty;function er(e){if(!Kt(e))return Qn(e);var t=[];for(var n in Object(e))Rn.call(e,n)&&n!="constructor"&&t.push(n);return t}function Xe(e){return Ne(e)?jt(e):er(e)}var tr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nr=/^\w*$/;function He(e,t){if(Y(e))return!1;var n=typeof e;return n=="number"||n=="symbol"||n=="boolean"||e==null||Mt(e)?!0:nr.test(e)||!tr.test(e)||t!=null&&e in Object(t)}var rr="Expected a function";function Ye(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(rr);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(Ye.Cache||Le),n}Ye.Cache=Le;var or=500;function ar(e){var t=Ye(e,function(r){return n.size===or&&n.clear(),r}),n=t.cache;return t}var ir=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,sr=/\\(\\)?/g,lr=ar(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(ir,function(n,r,o,a){t.push(o?a.replace(sr,"$1"):r||n)}),t});const ur=lr;function Ot(e,t){return Y(e)?e:He(e,t)?[e]:ur(Ut(e))}var dr=1/0;function $e(e){if(typeof e=="string"||Mt(e))return e;var t=e+"";return t=="0"&&1/e==-dr?"-0":t}function Et(e,t){t=Ot(t,e);for(var n=0,r=t.length;e!=null&&ns))return!1;var d=a.get(e),p=a.get(t);if(d&&p)return d==t&&p==e;var m=-1,u=!0,v=n&Dr?new ge:void 0;for(a.set(e,t),a.set(t,e);++m0&&arguments[0]!==void 0?arguments[0]:{},n=t.width?String(t.width):e.defaultWidth,r=e.formats[n]||e.formats[e.defaultWidth];return r}}function re(e){return function(t,n){var r=n!=null&&n.context?String(n.context):"standalone",o;if(r==="formatting"&&e.formattingValues){var a=e.defaultFormattingWidth||e.defaultWidth,i=n!=null&&n.width?String(n.width):a;o=e.formattingValues[i]||e.formattingValues[a]}else{var s=e.defaultWidth,l=n!=null&&n.width?String(n.width):e.defaultWidth;o=e.values[l]||e.values[s]}var d=e.argumentCallback?e.argumentCallback(t):t;return o[d]}}function oe(e){return function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=n.width,o=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],a=t.match(o);if(!a)return null;var i=a[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(s)?_o(s,function(m){return m.test(i)}):Ao(s,function(m){return m.test(i)}),d;d=e.valueCallback?e.valueCallback(l):l,d=n.valueCallback?n.valueCallback(d):d;var p=t.slice(i.length);return{value:d,rest:p}}}function Ao(e,t){for(var n in e)if(e.hasOwnProperty(n)&&t(e[n]))return n}function _o(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{},r=t.match(e.matchPattern);if(!r)return null;var o=r[0],a=t.match(e.parsePattern);if(!a)return null;var i=e.valueCallback?e.valueCallback(a[0]):a[0];i=n.valueCallback?n.valueCallback(i):i;var s=t.slice(o.length);return{value:i,rest:s}}}var Eo={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},To=function(t,n,r){var o,a=Eo[t];return typeof a=="string"?o=a:n===1?o=a.one:o=a.other.replace("{{count}}",n.toString()),r!=null&&r.addSuffix?r.comparison&&r.comparison>0?"in "+o:o+" ago":o};const Bo=To;var zo={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Io={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Do={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Wo={date:Ee({formats:zo,defaultWidth:"full"}),time:Ee({formats:Io,defaultWidth:"full"}),dateTime:Ee({formats:Do,defaultWidth:"full"})};const Fo=Wo;var No={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Lo=function(t,n,r,o){return No[t]};const ko=Lo;var Xo={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Ho={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Yo={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Ko={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},jo={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Uo={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Vo=function(t,n){var r=Number(t),o=r%100;if(o>20||o<10)switch(o%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd"}return r+"th"},Go={ordinalNumber:Vo,era:re({values:Xo,defaultWidth:"wide"}),quarter:re({values:Ho,defaultWidth:"wide",argumentCallback:function(t){return t-1}}),month:re({values:Yo,defaultWidth:"wide"}),day:re({values:Ko,defaultWidth:"wide"}),dayPeriod:re({values:jo,defaultWidth:"wide",formattingValues:Uo,defaultFormattingWidth:"wide"})};const qo=Go;var Jo=/^(\d+)(th|st|nd|rd)?/i,Qo=/\d+/i,Zo={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Ro={any:[/^b/i,/^(a|c)/i]},ea={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},ta={any:[/1/i,/2/i,/3/i,/4/i]},na={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},ra={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},oa={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},aa={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},ia={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},sa={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},la={ordinalNumber:Oo({matchPattern:Jo,parsePattern:Qo,valueCallback:function(t){return parseInt(t,10)}}),era:oe({matchPatterns:Zo,defaultMatchWidth:"wide",parsePatterns:Ro,defaultParseWidth:"any"}),quarter:oe({matchPatterns:ea,defaultMatchWidth:"wide",parsePatterns:ta,defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:oe({matchPatterns:na,defaultMatchWidth:"wide",parsePatterns:ra,defaultParseWidth:"any"}),day:oe({matchPatterns:oa,defaultMatchWidth:"wide",parsePatterns:aa,defaultParseWidth:"any"}),dayPeriod:oe({matchPatterns:ia,defaultMatchWidth:"any",parsePatterns:sa,defaultParseWidth:"any"})};const ua=la;var da={code:"en-US",formatDistance:Bo,formatLong:Fo,formatRelative:ko,localize:qo,match:ua,options:{weekStartsOn:0,firstWeekContainsDate:1}};const fa=da,ca={name:"en-US",locale:fa},ha=ca;function Aa(e){const{mergedLocaleRef:t,mergedDateLocaleRef:n}=N(rn,null)||{},r=L(()=>{var a,i;return(i=(a=t==null?void 0:t.value)===null||a===void 0?void 0:a[e])!==null&&i!==void 0?i:nn[e]});return{dateLocaleRef:L(()=>{var a;return(a=n==null?void 0:n.value)!==null&&a!==void 0?a:ha}),localeRef:r}}const Te={top:"bottom",bottom:"top",left:"right",right:"left"},x="var(--n-arrow-height) * 1.414",va=H([F("popover",` - transition: - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier); - position: relative; - font-size: var(--n-font-size); - color: var(--n-text-color); - box-shadow: var(--n-box-shadow); - word-break: break-word; - `,[H(">",[F("scrollbar",` - height: inherit; - max-height: inherit; - `)]),Me("raw",` - background-color: var(--n-color); - border-radius: var(--n-border-radius); - `,[Me("scrollable",[Me("show-header-or-footer","padding: var(--n-padding);")])]),Se("header",` - padding: var(--n-padding); - border-bottom: 1px solid var(--n-divider-color); - transition: border-color .3s var(--n-bezier); - `),Se("footer",` - padding: var(--n-padding); - border-top: 1px solid var(--n-divider-color); - transition: border-color .3s var(--n-bezier); - `),pe("scrollable, show-header-or-footer",[Se("content",` - padding: var(--n-padding); - `)])]),F("popover-shared",` - transform-origin: inherit; - `,[F("popover-arrow-wrapper",` - position: absolute; - overflow: hidden; - pointer-events: none; - `,[F("popover-arrow",` - transition: background-color .3s var(--n-bezier); - position: absolute; - display: block; - width: calc(${x}); - height: calc(${x}); - box-shadow: 0 0 8px 0 rgba(0, 0, 0, .12); - transform: rotate(45deg); - background-color: var(--n-color); - pointer-events: all; - `)]),H("&.popover-transition-enter-from, &.popover-transition-leave-to",` - opacity: 0; - transform: scale(.85); - `),H("&.popover-transition-enter-to, &.popover-transition-leave-from",` - transform: scale(1); - opacity: 1; - `),H("&.popover-transition-enter-active",` - transition: - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier), - opacity .15s var(--n-bezier-ease-out), - transform .15s var(--n-bezier-ease-out); - `),H("&.popover-transition-leave-active",` - transition: - box-shadow .3s var(--n-bezier), - background-color .3s var(--n-bezier), - color .3s var(--n-bezier), - opacity .15s var(--n-bezier-ease-in), - transform .15s var(--n-bezier-ease-in); - `)]),E("top-start",` - top: calc(${x} / -2); - left: calc(${W("top-start")} - var(--v-offset-left)); - `),E("top",` - top: calc(${x} / -2); - transform: translateX(calc(${x} / -2)) rotate(45deg); - left: 50%; - `),E("top-end",` - top: calc(${x} / -2); - right: calc(${W("top-end")} + var(--v-offset-left)); - `),E("bottom-start",` - bottom: calc(${x} / -2); - left: calc(${W("bottom-start")} - var(--v-offset-left)); - `),E("bottom",` - bottom: calc(${x} / -2); - transform: translateX(calc(${x} / -2)) rotate(45deg); - left: 50%; - `),E("bottom-end",` - bottom: calc(${x} / -2); - right: calc(${W("bottom-end")} + var(--v-offset-left)); - `),E("left-start",` - left: calc(${x} / -2); - top: calc(${W("left-start")} - var(--v-offset-top)); - `),E("left",` - left: calc(${x} / -2); - transform: translateY(calc(${x} / -2)) rotate(45deg); - top: 50%; - `),E("left-end",` - left: calc(${x} / -2); - bottom: calc(${W("left-end")} + var(--v-offset-top)); - `),E("right-start",` - right: calc(${x} / -2); - top: calc(${W("right-start")} - var(--v-offset-top)); - `),E("right",` - right: calc(${x} / -2); - transform: translateY(calc(${x} / -2)) rotate(45deg); - top: 50%; - `),E("right-end",` - right: calc(${x} / -2); - bottom: calc(${W("right-end")} + var(--v-offset-top)); - `),...Co({top:["right-start","left-start"],right:["top-end","bottom-end"],bottom:["right-end","left-end"],left:["top-start","bottom-start"]},(e,t)=>{const n=["right","left"].includes(t),r=n?"width":"height";return e.map(o=>{const a=o.split("-")[1]==="end",s=`calc((${`var(--v-target-${r}, 0px)`} - ${x}) / 2)`,l=W(o);return H(`[v-placement="${o}"] >`,[F("popover-shared",[pe("center-arrow",[F("popover-arrow",`${t}: calc(max(${s}, ${l}) ${a?"+":"-"} var(--v-offset-${n?"left":"top"}));`)])])])})})]);function W(e){return["top","bottom"].includes(e.split("-")[0])?"var(--n-arrow-offset)":"var(--n-arrow-offset-vertical)"}function E(e,t){const n=e.split("-")[0],r=["top","bottom"].includes(n)?"height: var(--n-space-arrow);":"width: var(--n-space-arrow);";return H(`[v-placement="${e}"] >`,[F("popover-shared",` - margin-${Te[n]}: var(--n-space); - `,[pe("show-arrow",` - margin-${Te[n]}: var(--n-space-arrow); - `),pe("overlap",` - margin: 0; - `),on("popover-arrow-wrapper",` - right: 0; - left: 0; - top: 0; - bottom: 0; - ${n}: 100%; - ${Te[n]}: auto; - ${r} - `,[F("popover-arrow",t)])])])}const It=Object.assign(Object.assign({},ke.props),{to:te.propTo,show:Boolean,trigger:String,showArrow:Boolean,delay:Number,duration:Number,raw:Boolean,arrowPointToCenter:Boolean,arrowClass:String,arrowStyle:[String,Object],arrowWrapperClass:String,arrowWrapperStyle:[String,Object],displayDirective:String,x:Number,y:Number,flip:Boolean,overlap:Boolean,placement:String,width:[Number,String],keepAliveOnHover:Boolean,scrollable:Boolean,contentClass:String,contentStyle:[Object,String],headerClass:String,headerStyle:[Object,String],footerClass:String,footerStyle:[Object,String],internalDeactivateImmediately:Boolean,animated:Boolean,onClickoutside:Function,internalTrapFocus:Boolean,internalOnAfterLeave:Function,minWidth:Number,maxWidth:Number}),pa=({arrowClass:e,arrowStyle:t,arrowWrapperClass:n,arrowWrapperStyle:r,clsPrefix:o})=>S("div",{key:"__popover-arrow__",style:r,class:[`${o}-popover-arrow-wrapper`,n]},S("div",{class:[`${o}-popover-arrow`,e],style:t})),ma=ue({name:"PopoverBody",inheritAttrs:!1,props:It,setup(e,{slots:t,attrs:n}){const{namespaceRef:r,mergedClsPrefixRef:o,inlineThemeDisabled:a}=an(e),i=ke("Popover","-popover",va,dn,e,o),s=T(null),l=N("NPopover"),d=T(null),p=T(e.show),m=T(!1);xt(()=>{const{show:w}=e;w&&!An()&&!e.internalDeactivateImmediately&&(m.value=!0)});const u=L(()=>{const{trigger:w,onClickoutside:P}=e,C=[],{positionManuallyRef:{value:b}}=l;return b||(w==="click"&&!P&&C.push([Je,_,void 0,{capture:!0}]),w==="hover"&&C.push([Ln,z])),P&&C.push([Je,_,void 0,{capture:!0}]),(e.displayDirective==="show"||e.animated&&m.value)&&C.push([sn,e.show]),C}),v=L(()=>{const w=e.width==="trigger"?void 0:Pe(e.width),P=[];w&&P.push({width:w});const{maxWidth:C,minWidth:b}=e;return C&&P.push({maxWidth:Pe(C)}),b&&P.push({maxWidth:Pe(b)}),a||P.push(g.value),P}),g=L(()=>{const{common:{cubicBezierEaseInOut:w,cubicBezierEaseIn:P,cubicBezierEaseOut:C},self:{space:b,spaceArrow:k,padding:I,fontSize:B,textColor:j,dividerColor:h,color:M,boxShadow:A,borderRadius:q,arrowHeight:J,arrowOffset:D,arrowOffsetVertical:Dt}}=i.value;return{"--n-box-shadow":A,"--n-bezier":w,"--n-bezier-ease-in":P,"--n-bezier-ease-out":C,"--n-font-size":B,"--n-text-color":j,"--n-color":M,"--n-divider-color":h,"--n-border-radius":q,"--n-arrow-height":J,"--n-arrow-offset":D,"--n-arrow-offset-vertical":Dt,"--n-padding":I,"--n-space":b,"--n-space-arrow":k}}),f=a?ln("popover",void 0,g,e):void 0;l.setBodyInstance({syncPosition:y}),le(()=>{l.setBodyInstance(null)}),Z(G(e,"show"),w=>{e.animated||(w?p.value=!0:p.value=!1)});function y(){var w;(w=s.value)===null||w===void 0||w.syncPosition()}function c(w){e.trigger==="hover"&&e.keepAliveOnHover&&e.show&&l.handleMouseEnter(w)}function $(w){e.trigger==="hover"&&e.keepAliveOnHover&&l.handleMouseLeave(w)}function z(w){e.trigger==="hover"&&!O().contains(Qe(w))&&l.handleMouseMoveOutside(w)}function _(w){(e.trigger==="click"&&!O().contains(Qe(w))||e.onClickoutside)&&l.handleClickOutside(w)}function O(){return l.getTriggerElement()}ae(bt,d),ae(wt,null),ae(gt,null);function K(){if(f==null||f.onRender(),!(e.displayDirective==="show"||e.show||e.animated&&m.value))return null;let P;const C=l.internalRenderBodyRef.value,{value:b}=o;if(C)P=C([`${b}-popover-shared`,f==null?void 0:f.themeClass.value,e.overlap&&`${b}-popover-shared--overlap`,e.showArrow&&`${b}-popover-shared--show-arrow`,e.arrowPointToCenter&&`${b}-popover-shared--center-arrow`],d,v.value,c,$);else{const{value:k}=l.extraClassRef,{internalTrapFocus:I}=e,B=!Ze(t.header)||!Ze(t.footer),j=()=>{var h,M;const A=B?S(hn,null,xe(t.header,D=>D?S("div",{class:[`${b}-popover__header`,e.headerClass],style:e.headerStyle},D):null),xe(t.default,D=>D?S("div",{class:[`${b}-popover__content`,e.contentClass],style:e.contentStyle},t):null),xe(t.footer,D=>D?S("div",{class:[`${b}-popover__footer`,e.footerClass],style:e.footerStyle},D):null)):e.scrollable?(h=t.default)===null||h===void 0?void 0:h.call(t):S("div",{class:[`${b}-popover__content`,e.contentClass],style:e.contentStyle},t),q=e.scrollable?S(vn,{contentClass:B?void 0:`${b}-popover__content ${(M=e.contentClass)!==null&&M!==void 0?M:""}`,contentStyle:B?void 0:e.contentStyle},{default:()=>A}):A,J=e.showArrow?pa({arrowClass:e.arrowClass,arrowStyle:e.arrowStyle,arrowWrapperClass:e.arrowWrapperClass,arrowWrapperStyle:e.arrowWrapperStyle,clsPrefix:b}):null;return[q,J]};P=S("div",cn({class:[`${b}-popover`,`${b}-popover-shared`,f==null?void 0:f.themeClass.value,k.map(h=>`${b}-${h}`),{[`${b}-popover--scrollable`]:e.scrollable,[`${b}-popover--show-header-or-footer`]:B,[`${b}-popover--raw`]:e.raw,[`${b}-popover-shared--overlap`]:e.overlap,[`${b}-popover-shared--show-arrow`]:e.showArrow,[`${b}-popover-shared--center-arrow`]:e.arrowPointToCenter}],ref:d,style:v.value,onKeydown:l.handleKeydown,onMouseenter:c,onMouseleave:$},n),I?S(fn,{active:e.show,autoFocus:!0},{default:j}):j())}return we(P,u.value)}return{displayed:m,namespace:r,isMounted:l.isMountedRef,zIndex:l.zIndexRef,followerRef:s,adjustedTo:te(e),followerEnabled:p,renderContentNode:K}},render(){return S(Gn,{ref:"followerRef",zIndex:this.zIndex,show:this.show,enabled:this.followerEnabled,to:this.adjustedTo,x:this.x,y:this.y,flip:this.flip,placement:this.placement,containerClass:this.namespace,overlap:this.overlap,width:this.width==="trigger"?"target":void 0,teleportDisabled:this.adjustedTo===te.tdkey},{default:()=>this.animated?S(un,{name:"popover-transition",appear:this.isMounted,onEnter:()=>{this.followerEnabled=!0},onAfterLeave:()=>{var e;(e=this.internalOnAfterLeave)===null||e===void 0||e.call(this),this.followerEnabled=!1,this.displayed=!1}},{default:this.renderContentNode}):this.renderContentNode()})}}),ga=Object.keys(It),wa={focus:["onFocus","onBlur"],click:["onClick"],hover:["onMouseenter","onMouseleave"],manual:[],nested:["onFocus","onBlur","onMouseenter","onMouseleave","onClick"]};function ba(e,t,n){wa[t].forEach(r=>{e.props?e.props=Object.assign({},e.props):e.props={};const o=e.props[r],a=n[r];o?e.props[r]=(...i)=>{o(...i),a(...i)}:e.props[r]=a})}const ya={show:{type:Boolean,default:void 0},defaultShow:Boolean,showArrow:{type:Boolean,default:!0},trigger:{type:String,default:"hover"},delay:{type:Number,default:100},duration:{type:Number,default:100},raw:Boolean,placement:{type:String,default:"top"},x:Number,y:Number,arrowPointToCenter:Boolean,disabled:Boolean,getDisabled:Function,displayDirective:{type:String,default:"if"},arrowClass:String,arrowStyle:[String,Object],arrowWrapperClass:String,arrowWrapperStyle:[String,Object],flip:{type:Boolean,default:!0},animated:{type:Boolean,default:!0},width:{type:[Number,String],default:void 0},overlap:Boolean,keepAliveOnHover:{type:Boolean,default:!0},zIndex:Number,to:te.propTo,scrollable:Boolean,contentClass:String,contentStyle:[Object,String],headerClass:String,headerStyle:[Object,String],footerClass:String,footerStyle:[Object,String],onClickoutside:Function,"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],internalDeactivateImmediately:Boolean,internalSyncTargetWithParent:Boolean,internalInheritedEventHandlers:{type:Array,default:()=>[]},internalTrapFocus:Boolean,internalExtraClass:{type:Array,default:()=>[]},onShow:[Function,Array],onHide:[Function,Array],arrow:{type:Boolean,default:void 0},minWidth:Number,maxWidth:Number},$a=Object.assign(Object.assign(Object.assign({},ke.props),ya),{internalOnAfterLeave:Function,internalRenderBody:Function}),_a=ue({name:"Popover",inheritAttrs:!1,props:$a,__popover__:!0,setup(e){const t=yt(),n=T(null),r=L(()=>e.show),o=T(e.defaultShow),a=En(r,o),i=se(()=>e.disabled?!1:a.value),s=()=>{if(e.disabled)return!0;const{getDisabled:h}=e;return!!(h!=null&&h())},l=()=>s()?!1:a.value,d=Tn(e,["arrow","showArrow"]),p=L(()=>e.overlap?!1:d.value);let m=null;const u=T(null),v=T(null),g=se(()=>e.x!==void 0&&e.y!==void 0);function f(h){const{"onUpdate:show":M,onUpdateShow:A,onShow:q,onHide:J}=e;o.value=h,M&&de(M,h),A&&de(A,h),h&&q&&de(q,!0),h&&J&&de(J,!1)}function y(){m&&m.syncPosition()}function c(){const{value:h}=u;h&&(window.clearTimeout(h),u.value=null)}function $(){const{value:h}=v;h&&(window.clearTimeout(h),v.value=null)}function z(){const h=s();if(e.trigger==="focus"&&!h){if(l())return;f(!0)}}function _(){const h=s();if(e.trigger==="focus"&&!h){if(!l())return;f(!1)}}function O(){const h=s();if(e.trigger==="hover"&&!h){if($(),u.value!==null||l())return;const M=()=>{f(!0),u.value=null},{delay:A}=e;A===0?M():u.value=window.setTimeout(M,A)}}function K(){const h=s();if(e.trigger==="hover"&&!h){if(c(),v.value!==null||!l())return;const M=()=>{f(!1),v.value=null},{duration:A}=e;A===0?M():v.value=window.setTimeout(M,A)}}function w(){K()}function P(h){var M;l()&&(e.trigger==="click"&&(c(),$(),f(!1)),(M=e.onClickoutside)===null||M===void 0||M.call(e,h))}function C(){if(e.trigger==="click"&&!s()){c(),$();const h=!l();f(h)}}function b(h){e.internalTrapFocus&&h.key==="Escape"&&(c(),$(),f(!1))}function k(h){o.value=h}function I(){var h;return(h=n.value)===null||h===void 0?void 0:h.targetRef}function B(h){m=h}return ae("NPopover",{getTriggerElement:I,handleKeydown:b,handleMouseEnter:O,handleMouseLeave:K,handleClickOutside:P,handleMouseMoveOutside:w,setBodyInstance:B,positionManuallyRef:g,isMountedRef:t,zIndexRef:G(e,"zIndex"),extraClassRef:G(e,"internalExtraClass"),internalRenderBodyRef:G(e,"internalRenderBody")}),xt(()=>{a.value&&s()&&f(!1)}),{binderInstRef:n,positionManually:g,mergedShowConsideringDisabledProp:i,uncontrolledShow:o,mergedShowArrow:p,getMergedShow:l,setShow:k,handleClick:C,handleMouseEnter:O,handleMouseLeave:K,handleFocus:z,handleBlur:_,syncPosition:y}},render(){var e;const{positionManually:t,$slots:n}=this;let r,o=!1;if(!t&&(n.activator?r=Re(n,"activator"):r=Re(n,"trigger"),r)){r=pn(r),r=r.type===mn?S("span",[r]):r;const a={onClick:this.handleClick,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onFocus:this.handleFocus,onBlur:this.handleBlur};if(!((e=r.type)===null||e===void 0)&&e.__popover__)o=!0,r.props||(r.props={internalSyncTargetWithParent:!0,internalInheritedEventHandlers:[]}),r.props.internalSyncTargetWithParent=!0,r.props.internalInheritedEventHandlers?r.props.internalInheritedEventHandlers=[a,...r.props.internalInheritedEventHandlers]:r.props.internalInheritedEventHandlers=[a];else{const{internalInheritedEventHandlers:i}=this,s=[a,...i],l={onBlur:d=>{s.forEach(p=>{p.onBlur(d)})},onFocus:d=>{s.forEach(p=>{p.onFocus(d)})},onClick:d=>{s.forEach(p=>{p.onClick(d)})},onMouseenter:d=>{s.forEach(p=>{p.onMouseenter(d)})},onMouseleave:d=>{s.forEach(p=>{p.onMouseleave(d)})}};ba(r,i?"nested":t?"manual":this.trigger,l)}}return S(Wn,{ref:"binderInstRef",syncTarget:!o,syncTargetWithParent:this.internalSyncTargetWithParent},{default:()=>{this.mergedShowConsideringDisabledProp;const a=this.getMergedShow();return[this.internalTrapFocus&&a?we(S("div",{style:{position:"fixed",inset:0}}),[[$t,{enabled:a,zIndex:this.zIndex}]]):null,t?null:S(Fn,null,{default:()=>r}),S(ma,gn(this.$props,ga,Object.assign(Object.assign({},this.$attrs),{showArrow:this.mergedShowArrow,show:a})),{default:()=>{var i,s;return(s=(i=this.$slots).default)===null||s===void 0?void 0:s.call(i)},header:()=>{var i,s;return(s=(i=this.$slots).header)===null||s===void 0?void 0:s.call(i)},footer:()=>{var i,s;return(s=(i=this.$slots).footer)===null||s===void 0?void 0:s.call(i)}})]}})}}),Ma=["href"];function Sa(e,t,n,r,o,a){return bn(),yn("svg",{class:Mn(e.svgClass),"aria-hidden":"true"},[$n("use",{class:"svg-use",href:e.symbolId},null,8,Ma)],2)}const Oa=Sn(wn,[["render",Sa],["__scopeId","data-v-bc0bc726"]]);export{_a as N,Oa as S,Wn as V,fe as a,Aa as b,kn as c,te as d,Fn as e,Pe as f,Gn as g,Tn as h,Pn as i,Ca as j,Bn as k,fr as l,On as o,ya as p,pa as r,En as u}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-c4f1fb1a.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-c4f1fb1a.css deleted file mode 100644 index 61e3bf4be..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-c4f1fb1a.css +++ /dev/null @@ -1 +0,0 @@ -.markdown-body{background-color:transparent;font-size:14px}.markdown-body p{white-space:pre-wrap}.markdown-body ol{list-style-type:decimal}.markdown-body ul{list-style-type:disc}.markdown-body pre code,.markdown-body pre tt{line-height:1.65}.markdown-body .highlight pre,.markdown-body pre{background-color:#fff}.markdown-body code.hljs{padding:0}.markdown-body .code-block-wrapper{position:relative;padding-top:24px}.markdown-body .code-block-header{position:absolute;top:5px;right:0;width:100%;padding:0 1rem;display:flex;justify-content:flex-end;align-items:center;color:#b3b3b3}.markdown-body .code-block-header__copy{cursor:pointer;margin-left:.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.markdown-body .code-block-header__copy:hover{color:#65a665}html.dark .message-reply .whitespace-pre-wrap{white-space:pre-wrap;color:var(--n-text-color)}html.dark .highlight pre,html.dark pre{background-color:#282c34}.transparent-grid[data-v-69882464]{background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%);background-size:16px 16px;background-position:0 0,8px 8px}.text-shadow[data-v-650ea9b6]{text-shadow:0px 0px 5px gray}.dark .app-starter-modal-content .n-layout{background-color:#2c2c32}.search-container[data-v-d2b10c26]{border:1px solid #ccc;transition:box-shadow .5s,-webkit-backdrop-filter .5s;transition:box-shadow .5s,backdrop-filter .5s;transition:box-shadow .5s,backdrop-filter .5s,-webkit-backdrop-filter .5s;padding:2px 10px;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.focused[data-v-d2b10c26],.search-container[data-v-d2b10c26]:hover{box-shadow:0 0 30px -5px #29292973;-webkit-box-shadow:0px 0px 30px -5px rgba(0,0,0,.45);-moz-box-shadow:0px 0px 30px -5px rgba(0,0,0,.45);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.before[data-v-d2b10c26]{left:10px}.after[data-v-d2b10c26]{right:10px}input[data-v-d2b10c26]{background-color:transparent;box-sizing:border-box;width:100%;height:40px;padding:10px 5px;border:none;outline:none;font-size:17px}.transparent-grid{background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%);background-size:16px 16px;background-position:0 0,8px 8px;background-color:#e2e8f0}.text-shadow[data-v-679daf12]{text-shadow:2px 2px 50px rgb(0,0,0)}.app-icon-text-shadow[data-v-679daf12]{text-shadow:2px 2px 5px rgb(0,0,0)}.icon-info-box[data-v-679daf12]{width:100%;display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:18px}.icon-small-box[data-v-679daf12]{width:100%;display:grid;grid-template-columns:repeat(auto-fill,minmax(75px,1fr));gap:18px}@media (max-width: 500px){.icon-info-box[data-v-679daf12]{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}}body,html{overflow:hidden;background-color:#363636}.mask[data-v-f21ede0f]{position:absolute;top:0;left:0;width:100%;height:100%}.sun-main[data-v-f21ede0f]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.cover[data-v-f21ede0f]{position:absolute;width:100%;height:100%;overflow:hidden;transform:scale(1.05)}.text-shadow[data-v-f21ede0f]{text-shadow:2px 2px 50px rgb(0,0,0)}.app-icon-text-shadow[data-v-f21ede0f]{text-shadow:2px 2px 5px rgb(0,0,0)}.fixed-element[data-v-f21ede0f]{position:fixed;right:10px;bottom:50px}.icon-info-box[data-v-f21ede0f]{width:100%;display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:18px}.icon-small-box[data-v-f21ede0f]{width:100%;display:grid;grid-template-columns:repeat(auto-fill,minmax(75px,1fr));gap:18px}@media (max-width: 500px){.icon-info-box[data-v-f21ede0f]{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-d074e84b.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-d074e84b.js deleted file mode 100644 index 6813d7ed0..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-d074e84b.js +++ /dev/null @@ -1 +0,0 @@ -import{be as $,f as j,r as y,bn as B,bw as L,bv as D,D as G,aW as u,aX as h,a8 as P,aP as U,b4 as t,b2 as s,a$ as l,b0 as N,b1 as n,b3 as a,a_ as w,ao as W,bq as V,bC as q,ac as m,bo as i,cN as E}from"./index-7e19b821.js";import{S as g}from"./index-c238f14b.js";import{j as O,l as A,N as X,n as H,q as J,t as C,k as K,c as Q,_ as R,v as Y}from"./index-b1d3d9b0.js";import{N as Z}from"./Alert-018ca7af.js";import{_ as ee}from"./_plugin-vue_export-helper-c27b6911.js";function se(){return $({url:"/file/getList"})}function te(b){return $({url:"/file/deletes",data:{ids:b}})}const ae={class:"bg-slate-200 dark:bg-zinc-900 p-2 h-full"},oe={class:"flex justify-center mt-2"},le={key:0,class:"flex"},ne={class:"card transparent-grid"},ie={class:"text-xs"},re={class:"flex justify-center mt-[10px]"},ce={class:"mb-2"},de={class:"text-slate-500"},pe={class:"text-xs"},ue={class:"mb-2"},fe={class:"text-slate-500"},_e={class:"text-xs"},me={class:"mb-2"},ge={class:"text-slate-500"},ve={class:"text-xs"},ye=j({__name:"index",setup(b){const v=y([]),p=B(),F=L(),x=D(),f=y(!1),r=y({show:!1,title:"",fileInfo:null});async function k(){f.value=!0;const{data:e}=await se();v.value=e.list,f.value=!1}async function M(e){await Y(e)?p.success(i("apps.uploadsFileManager.copySuccess")):p.error(i("apps.uploadsFileManager.copyFailed"))}function I(e){F.warning({title:i("common.warning"),content:i("apps.uploadsFileManager.deleteWarningText"),positiveText:i("common.confirm"),negativeText:i("common.cancel"),onPositiveClick:()=>{S(e)}})}async function S(e){try{const{code:c,msg:o}=await te([e]);c===0?(k(),p.success(i("common.success"))):p.error(`${i("common.failed")}:${o}`)}catch{p.error(i("common.failed"))}}function T(e){r.value.fileInfo=e,r.value.show=!0}function z(e){x.panelConfig.backgroundImageSrc=e,E({panel:x.panelConfig})}return G(()=>{k()}),(e,c)=>(u(),h("div",ae,[P(t(s(O),{size:"small"},null,512),[[U,f.value]]),t(s(Z),{type:"info",bordered:!1},{default:l(()=>[N(n(e.$t("apps.uploadsFileManager.alertText")),1)]),_:1}),a("div",oe,[v.value.length===0&&!f.value?(u(),h("div",le,n(e.$t("apps.uploadsFileManager.nothingText")),1)):(u(),w(s(Q),{key:1},{default:l(()=>[t(s(K),{cols:"2 300:2 600:4 900:6 1100:9","x-gap":5,"y-gap":5},{default:l(()=>[(u(!0),h(W,null,V(v.value,(o,_)=>(u(),w(s(A),{key:_},{default:l(()=>[t(s(q),{size:"small",style:{"border-radius":"5px"},bordered:!0},{cover:l(()=>[a("div",ne,[t(s(X),{lazy:!0,style:{"object-fit":"contain",height:"100%"},src:o.src},null,8,["src"])])]),footer:l(()=>[a("span",ie,[t(s(H),null,{default:l(()=>[N(n(o.fileName),1)]),_:2},1024)]),a("div",re,[t(s(J),null,{default:l(()=>[t(s(m),{size:"tiny",tertiary:"",style:{cursor:"pointer"},title:e.$t("apps.uploadsFileManager.copyLink"),onClick:d=>M(o.src)},{icon:l(()=>[t(s(g),{icon:"ion-copy"})]),_:2},1032,["title","onClick"]),t(s(m),{size:"tiny",tertiary:"",style:{cursor:"pointer"},title:s(C)(o.createTime),onClick:d=>T(o)},{icon:l(()=>[t(s(g),{icon:"mdi-information-box-outline"})]),_:2},1032,["title","onClick"]),t(s(m),{size:"tiny",tertiary:"",style:{cursor:"pointer"},title:e.$t("apps.uploadsFileManager.setWallpaper"),onClick:d=>z(o.src)},{icon:l(()=>[t(s(g),{icon:"lucide:wallpaper"})]),_:2},1032,["title","onClick"]),t(s(m),{size:"tiny",tertiary:"",type:"error",style:{cursor:"pointer"},title:e.$t("common.delete"),onClick:d=>I(o.id)},{icon:l(()=>[t(s(g),{icon:"material-symbols-delete"})]),_:2},1032,["title","onClick"])]),_:2},1024)])]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1}))]),t(s(R),{show:r.value.show,"onUpdate:show":c[0]||(c[0]=o=>r.value.show=o),style:{"max-width":"300px"},size:"small",title:e.$t("apps.uploadsFileManager.infoTitle")},{default:l(()=>{var o,_,d;return[a("div",null,[a("div",null,[a("div",ce,[a("span",de,n(e.$t("apps.uploadsFileManager.fileName")),1),a("div",pe,n((o=r.value.fileInfo)==null?void 0:o.fileName),1)]),a("div",ue,[a("span",fe,n(e.$t("apps.uploadsFileManager.path")),1),a("div",_e,n((_=r.value.fileInfo)==null?void 0:_.src),1)]),a("div",me,[a("span",ge,n(e.$t("apps.uploadsFileManager.uploadTime")),1),a("div",ve,n(s(C)((d=r.value.fileInfo)==null?void 0:d.createTime)),1)])])])]}),_:1},8,["show","title"])]))}});const he=ee(ye,[["__scopeId","data-v-ad2e06f3"]]),Ce=Object.freeze(Object.defineProperty({__proto__:null,default:he},Symbol.toStringTag,{value:"Module"}));export{he as U,se as g,Ce as i}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-d715da4a.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-d715da4a.css deleted file mode 100644 index 1f81255d0..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-d715da4a.css +++ /dev/null @@ -1 +0,0 @@ -.card[data-v-ad2e06f3]{display:flex;justify-content:center;align-items:center;height:80px}.transparent-grid[data-v-ad2e06f3]{background-image:linear-gradient(45deg,#f0f0f0 25%,transparent 25%,transparent 75%,#f0f0f0 75%),linear-gradient(45deg,#f0f0f0 25%,transparent 25%,transparent 75%,#f0f0f0 75%);background-size:16px 16px;background-position:0 0,8px 8px} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-e0b65a22.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-e0b65a22.js deleted file mode 100644 index f389a92da..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-e0b65a22.js +++ /dev/null @@ -1 +0,0 @@ -import{g as a,U as s}from"./index-d074e84b.js";import{f as n,r as i,D as _,aX as c,b4 as r,aW as p}from"./index-7e19b821.js";import{_ as l}from"./_plugin-vue_export-helper-c27b6911.js";import"./index-c238f14b.js";import"./index-b1d3d9b0.js";import"./Alert-018ca7af.js";const d=n({__name:"index",setup(m){const t=i([]);async function o(){const{data:e}=await a();console.log(e),t.value=e.list}return _(()=>{o()}),(e,f)=>(p(),c("div",null,[r(s)]))}});const k=l(d,[["__scopeId","data-v-157c4864"]]);export{k as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-ed75c22d.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-ed75c22d.js deleted file mode 100644 index c6fa7f94b..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-ed75c22d.js +++ /dev/null @@ -1 +0,0 @@ -import{aW as t,aX as a,bW as e,f as s,b3 as c,b4 as h,a$ as r,b2 as f,bX as M,b0 as o,ac as v}from"./index-7e19b821.js";import{_ as d}from"./_plugin-vue_export-helper-c27b6911.js";const i={},m={class:"text-[currentColor] dark:text-[#3a71ff]"},n=e('',1),u=[n];function E(Z,l){return t(),a("div",m,u)}const _=d(i,[["render",E]]),B={class:"flex h-full dark:bg-neutral-800"},C={class:"px-4 m-auto space-y-4 text-center max-[400px]"},x={class:"space-y-2"},F=c("h2",{class:"text-2xl font-bold text-center text-slate-800 dark:text-neutral-200"}," 500 ",-1),k=c("p",{class:"text-base text-center text-slate-500 dark:text-slate-500"}," 服务器错误 ",-1),b={class:"flex items-center justify-center text-center"},y=s({__name:"index",setup(Z){const l=M();function p(){l.push("/")}return(g,H)=>(t(),a("div",B,[c("div",C,[c("header",x,[F,k,c("div",b,[h(_,{class:"w-[300px]"})])]),h(f(v),{type:"primary",onClick:p},{default:r(()=>[o(" 返回首页 ")]),_:1})])]))}});export{y as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-f036cca6.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-f036cca6.css deleted file mode 100644 index 0c7df83ff..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-f036cca6.css +++ /dev/null @@ -1 +0,0 @@ -.svg-icon[data-v-bc0bc726]{width:1em;height:1em;fill:currentColor;overflow:hidden}@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/assets/KaTeX_AMS-Regular-0cdd387c.woff2) format("woff2"),url(/assets/KaTeX_AMS-Regular-30da91e8.woff) format("woff"),url(/assets/KaTeX_AMS-Regular-68534840.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Caligraphic-Bold-de7701e4.woff2) format("woff2"),url(/assets/KaTeX_Caligraphic-Bold-1ae6bd74.woff) format("woff"),url(/assets/KaTeX_Caligraphic-Bold-07d8e303.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Caligraphic-Regular-5d53e70a.woff2) format("woff2"),url(/assets/KaTeX_Caligraphic-Regular-3398dd02.woff) format("woff"),url(/assets/KaTeX_Caligraphic-Regular-ed0b7437.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Fraktur-Bold-74444efd.woff2) format("woff2"),url(/assets/KaTeX_Fraktur-Bold-9be7ceb8.woff) format("woff"),url(/assets/KaTeX_Fraktur-Bold-9163df9c.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Fraktur-Regular-51814d27.woff2) format("woff2"),url(/assets/KaTeX_Fraktur-Regular-5e28753b.woff) format("woff"),url(/assets/KaTeX_Fraktur-Regular-1e6f9579.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Main-Bold-0f60d1b8.woff2) format("woff2"),url(/assets/KaTeX_Main-Bold-c76c5d69.woff) format("woff"),url(/assets/KaTeX_Main-Bold-138ac28d.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/assets/KaTeX_Main-BoldItalic-99cd42a3.woff2) format("woff2"),url(/assets/KaTeX_Main-BoldItalic-a6f7ec0d.woff) format("woff"),url(/assets/KaTeX_Main-BoldItalic-70ee1f64.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/assets/KaTeX_Main-Italic-97479ca6.woff2) format("woff2"),url(/assets/KaTeX_Main-Italic-f1d6ef86.woff) format("woff"),url(/assets/KaTeX_Main-Italic-0d85ae7c.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Main-Regular-c2342cd8.woff2) format("woff2"),url(/assets/KaTeX_Main-Regular-c6368d87.woff) format("woff"),url(/assets/KaTeX_Main-Regular-d0332f52.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/assets/KaTeX_Math-BoldItalic-dc47344d.woff2) format("woff2"),url(/assets/KaTeX_Math-BoldItalic-850c0af5.woff) format("woff"),url(/assets/KaTeX_Math-BoldItalic-f9377ab0.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/assets/KaTeX_Math-Italic-7af58c5e.woff2) format("woff2"),url(/assets/KaTeX_Math-Italic-8a8d2445.woff) format("woff"),url(/assets/KaTeX_Math-Italic-08ce98e5.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(/assets/KaTeX_SansSerif-Bold-e99ae511.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Bold-ece03cfd.woff) format("woff"),url(/assets/KaTeX_SansSerif-Bold-1ece03f7.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(/assets/KaTeX_SansSerif-Italic-00b26ac8.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Italic-91ee6750.woff) format("woff"),url(/assets/KaTeX_SansSerif-Italic-3931dd81.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(/assets/KaTeX_SansSerif-Regular-68e8c73e.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Regular-11e4dc8a.woff) format("woff"),url(/assets/KaTeX_SansSerif-Regular-f36ea897.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Script-Regular-036d4e95.woff2) format("woff2"),url(/assets/KaTeX_Script-Regular-d96cdf2b.woff) format("woff"),url(/assets/KaTeX_Script-Regular-1c67f068.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size1-Regular-6b47c401.woff2) format("woff2"),url(/assets/KaTeX_Size1-Regular-c943cc98.woff) format("woff"),url(/assets/KaTeX_Size1-Regular-95b6d2f1.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size2-Regular-d04c5421.woff2) format("woff2"),url(/assets/KaTeX_Size2-Regular-2014c523.woff) format("woff"),url(/assets/KaTeX_Size2-Regular-a6b2099f.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmfttwI4mBo1EG15fxJhUiCLbiiyCf/ZA6MFAhg3pGIZGdGIVjtPn6UcMk9A/UUr9PhoNsCENw1APAq0gpH73e+M+0ueyHbabc3vkbcdtzcf/fiy+NxQEjf9ud/ELBHAXJ0nk4z+MXH2Ev/kWyV4k7SkvpPc9Qr38F6RPWnM9cN6DJ0AdD1BhtgABtmoRoFCvPsBAumNm6soZG2Gk5GyVTo2sJncSyp0jQTYoR6WDvTwaaEcHsxHfvuWhHA3a6bN7twRKtcGok6NsCi7jYRrM2jExsUFMxMQYuJbMhuWNOumEJy9hi29Dmg5zMp/A5+hhPG19j1vBrq8JTLr8ki5VLPmG/PynJHVul440bxg5xuymHUFPBshC+nA9I1FmwbRBTNHAcik3Oae0cxKoI3MOriM42UrPe51nsaGxJ+WfXubAsP84aabUlQSJ1IiE0iPETLUU4CATgfXSCSpuRFRmCGbO+wSpAnzaeaCYW1VNEysRtuXCEL1kUFUbbtMv3Tilt/1c11jt3Q5bbMa84cpWipp8Elw3MZhOHsOlwwVUQM3lAR35JiFQbaYCRnMF2lxAWoOg2gyoIV4PouX8HytNIfLhqpJtXB4vjiViUI8IJ7bkC4ikkQvKksnOTKICwnqWSZ9YS5f0WCxmpgjbIq7EJcM4aI2nmhLNY2JIUgOjXZFWBHb+x5oh6cwb0Tv1ackHdKi0I9OO2wE9aogIOn540CCCziyhN+IaejtgAONKznHlHyutPrHGwCx9S6B8kfS4Mfi4Eyv7OU730bT1SCBjt834cXsf43zVjPUqqJjgrjeGnBxSG4aYAKFuVbeCfkDIjAqMb6yLNIbCuvXhMH2/+k2vkNpkORhR59N1CkzoOENvneIosjYmuTxlhUzaGEJQ/iWqx4dmwpmKjrwTiTGTCVozNAYqk/zXOndWxuWSmJkQpJw3pK5KX6QrLt5LATMqpmPAQhkhK6PUjzHUn7E0gHE0kPE0iKkolgkUx9SZmVAdDgpffdyJKg3k7VmzYGCwVXGz/tXmkOIp+vcWs+EMuhhvN0h9uhfzWJziBQmCREGSIFmQIkgVpAnSBRmC//6hkLZwaVhwxlrJSOdqlFtOYxlau9F2QN5Y98xmIAsiM1HVp2VFX+DHHGg6Ecjh3vmqtidX3qHI2qycTk/iwxSt5UzTmEP92ZBnEWTk4Mx8Mpl78ZDokxg/KWb+Q0QkvdKVmq3TMW+RXEgrsziSAfNXFMhDc60N5N9jQzjfO0kBKpUZl0ZmwJ41j/B9Hz6wmRaJB84niNmQrzp9eSlQCDDzazGDdVi3P36VZQ+Jy4f9UBNp+3zTjqI4abaFAm+GShVaXlsGdF3FYzZcDI6cori4kMxUECl9IjJZpzkvitAoxKue+90pDMvcKRxLl53TmOKCmV/xRolNKSqqUxc6LStOETmFOiLZZptlZepcKiAzteG8PEdpnQpbOMNcMsR4RR2Bs0cKFEvSmIjAFcnarqwUL4lDhHmnVkwu1IwshbiCcgvOheZuYyOteufZZwlcTlLgnZ3o/WcYdzZHW/WGaqaVfmTZ1aWCceJjkbZqsfbkOtcFlUZM/jy+hXHDbaUobWqqXaeWobbLO99yG5N3U4wxco0rQGGcOLASFMXeJoham8M+/x6O2WywK2l4HGbq1CoUyC/IZikQhdq3SiuNrvAEj0AVu9x2x3lp/xWzahaxidezFVtdcb5uEnzyl0ZmYiuKI0exvCd4Xc9CV1KB0db00z92wDPde0kukbvZIWN6jUWFTmPIC/Y4UPCm8UfDTFZpZNon1qLFTkBhxzB+FjQRA2Q/YRJT8pQigslMaUpFyAG8TMlXigiqmAZX4xgijKjRlGpLE0GdplRfCaJo0JQaSxNBk6ZmMzcya0FmrcisDdn0Q3HI2sWSppYigmlM1XT/kLQZSNpMJG0WkjYbSZuDpM1F0uYhFc1HxU4m1QJjDK6iL0S5uSj5rgXc3RejEigtcRBtqYPQsiTskmO5vosV+q4VGIKbOkDg0jtRrq+Em1YloaTFar3EGr1EUC8R0kus1Uus00usL97ABr2BjXoDm/QGNhuWtMVBKOwg/i78lT7hBsAvDmwHc/ao3vmUbBmhjeYySZNWvGkfZAgISDSaDo1SVpzGDsAEkF8B+gEapViUoZgUWXcRIGFZNm6gWbAKk0bp0k1MHG9fLYtV4iS2SmLEQFARzRcnf9PUS0LVn05/J9MiRRBU3v2IrvW974v4N00L7ZMk0wXP1409CHo/an8zTRHD3eSJ6m8D4YMkZNl3M79sqeuAsr/m3f+8/yl7A50aiAEJgeBeMWzu7ui9UfUBCe2TIqZIoOd/3/udRBOQidQZUERzb2/VwZN1H/Sju82ew2H2Wfr6qvfVf3hqwDvAIpkQVFy4B9Pe9e4/XvPeceu7h3dvO56iJPf0+A6cqA2ip18ER+iFgggiuOkvj24bby0N9j2UHIkgqIt+sVgfodC4YghLSMjSZbH0VR/6dMDrYJeKHilKTemt6v6kvzvn3/RrdWtr0GoN/xL+Sex/cPYLUpepx9cz/D46UPU5KXgAQa+NDps1v6J3xP1i2HtaDB0M9aX2deA7SYff//+gUCovMmIK/qfsFcOk+4Y5ZN97XlG6zebqtMbKgeRFi51vnxTQYBUik2rS/Cn6PC8ADR8FGxsRPB82dzfND90gIcshOcYUkfjherBz53odpm6TP8txlwOZ71xmfHHOvq053qFF/MRlS3jP0ELudrf2OeN8DHvp6ZceLe8qKYvWz/7yp0u4dKPfli3CYq0O13Ih71mylJ80tOi10On8wi+F4+LWgDPeJ30msSQt9/vkmHq9/Lvo2b461mP801v3W4xTcs6CbvF9UDdrSt+A8OUbpSh55qAUFXWznBBfdeJ8a4d7ugT5tvxUza3h9m4H7ptTqiG4z0g5dc0X29OcGlhpGFMpQo9ytTS+NViZpNdvU4kWx+LKxNY10kQ1yqGXrhe4/1nvP7E+nd5A92TtaRplbHSqoIdOqtRWti+fkB5/n1+/VvCmz12pG1kpQWsfi1ftlBobm0bpngs16CHkbIwdLnParxtTV3QYRlfJ0KFskH7pdN/YDn+yRuSd7sNH3aO0DYPggk6uWuXrfOc+fa3VTxFVvKaNxHsiHmsXyCLIE5yuOeN3/Jdf8HBL/5M6shjyhxHx9BjB1O0+4NLOnjLLSxwO7ukN4jMbOIcD879KLSi6Pk61Oqm2377n8079PXEEQ7cy7OKEC9nbpet118fxweTafpt69x/Bt8UqGzNQt7aelpc44dn5cqhwf71+qKp/Zf/+a0zcizOUWpl/iBcSXip0pplkatCchoH5c5aUM8I7/dWxAej8WicPL1URFZ9BDJelUwEwTkGqUhgSlydVes95YdXvhh9Gfz/aeFWvgVb4tuLbcv4+wLdutVZv/cUonwBD/6eDlE0aSiKK/uoH3+J1wDE/jMVqY2ysGufN84oIXB0sPzy8ollX/LegY74DgJXJR57sn+VGza0x3DnuIgABFM15LmajjjsNlYj+JEZGbuRYcAMOWxFkPN2w6Wd46xo4gVWQR/X4lyI/R6K/YK0110GzudPRW7Y+UOBGTfNNzHeYT0fiH0taunBpq9HEW8OKSaBGj21L0MqenEmNRWBAWDWAk4CpNoEZJ2tTaPFgbQYj8HxtFilErs3BTRwT8uO1NXQaWfIotchmPkAF5mMBAliEmZiOGVgCG9LgRzpscMAOOwowlT3JhusdazXGSC/hxR3UlmWVwWHpOIKheqONvjyhSiTHIkVUco5bnji8m//zL7PKaT1Vl5I6UE609f+gkr6MZKVyKc7zJRmCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC) format("woff2"),url(/assets/KaTeX_Size3-Regular-6ab6b62e.woff) format("woff"),url(/assets/KaTeX_Size3-Regular-500e04d5.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size4-Regular-a4af7d41.woff2) format("woff2"),url(/assets/KaTeX_Size4-Regular-99f9c675.woff) format("woff"),url(/assets/KaTeX_Size4-Regular-c647367d.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Typewriter-Regular-71d517d6.woff2) format("woff2"),url(/assets/KaTeX_Typewriter-Regular-e14fed02.woff) format("woff"),url(/assets/KaTeX_Typewriter-Regular-f01f3e87.ttf) format("truetype")}.katex{text-rendering:auto;font: 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.4"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.float-right{float:right}.m-\[10px\]{margin:10px}.m-\[50px\]{margin:50px}.m-auto{margin:auto}.mx-\[10px\]{margin-left:10px;margin-right:10px}.mx-\[auto\],.mx-auto{margin-left:auto;margin-right:auto}.my-\[10px\]{margin-top:10px;margin-bottom:10px}.my-\[15px\]{margin-top:15px;margin-bottom:15px}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-5{margin-bottom:1.25rem}.mb-\[10px\]{margin-bottom:10px}.mb-\[20px\]{margin-bottom:20px}.mb-\[5px\]{margin-bottom:5px}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-\[10px\]{margin-left:10px}.ml-\[20px\]{margin-left:20px}.ml-\[5px\]{margin-left:5px}.ml-\[auto\],.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-\[10px\]{margin-right:10px}.mr-\[20px\]{margin-right:20px}.mr-\[5px\]{margin-right:5px}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-\[10px\]{margin-top:10px}.mt-\[20px\]{margin-top:20px}.mt-\[2px\]{margin-top:2px}.mt-\[50px\]{margin-top:50px}.mt-\[5px\]{margin-top:5px}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-\[100px\]{height:100px}.h-\[200px\]{height:200px}.h-\[20px\]{height:20px}.h-\[260px\]{height:260px}.h-\[34px\]{height:34px}.h-\[35px\]{height:35px}.h-\[40px\]{height:40px}.h-\[600px\]{height:600px}.h-\[70px\]{height:70px}.h-full{height:100%}.w-10{width:2.5rem}.w-\[120px\]{width:120px}.w-\[150px\]{width:150px}.w-\[200px\]{width:200px}.w-\[20px\]{width:20px}.w-\[25px\]{width:25px}.w-\[300px\]{width:300px}.w-\[35px\]{width:35px}.w-\[40px\]{width:40px}.w-\[4px\]{width:4px}.w-\[60px\]{width:60px}.w-\[70px\]{width:70px}.w-\[80\%\]{width:80%}.w-\[80px\]{width:80px}.w-auto{width:auto}.w-full{width:100%}.min-w-\[100px\]{min-width:100px}.min-w-\[20px\]{min-width:20px}.min-w-\[300px\]{min-width:300px}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes blink{0%,to{background-color:currentColor}50%{background-color:transparent}}.animate-blink{animation:blink 1.2s infinite steps(1,start)}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.bg-\[\#f4f6f8\]{--tw-bg-opacity: 1;background-color:rgb(244 246 248 / var(--tw-bg-opacity))}.bg-\[\#ffffff\]{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-5{padding:1.25rem}.p-\[10px\]{padding:10px}.p-\[5px\]{padding:5px}.p-\[8px\]{padding:8px}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pt-2{padding-top:.5rem}.pt-5{padding-top:1.25rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[20px\]{font-size:20px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.\!font-bold{font-weight:700!important}.font-\[600\]{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-semibold{font-weight:600}.leading-relaxed{line-height:1.625}.text-\[\#142D6E\]{--tw-text-opacity: 1;color:rgb(20 45 110 / var(--tw-text-opacity))}.text-\[currentColor\]{color:currentColor}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_10px_2px_rgba\(0\,0\,0\,0\.2\)\]{--tw-shadow: 0 0 10px 2px rgba(0,0,0,.2);--tw-shadow-colored: 0 0 10px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_30px_10px_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 0 30px 10px rgba(0,0,0,.3);--tw-shadow-colored: 0 0 30px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-100{transition-delay:.1s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[value\:any\]{value:any}.hover\:bg-neutral-100:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity))}.hover\:text-black:hover{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity))}.hover\:shadow-\[0_0_20px_10px_rgba\(0\,0\,0\,0\.2\)\]:hover{--tw-shadow: 0 0 20px 10px rgba(0,0,0,.2);--tw-shadow-colored: 0 0 20px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:bg-slate-50:focus{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity))}.dark .dark\:border-zinc-700{--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity))}.dark .dark\:bg-\[\#1e1e20\]{--tw-bg-opacity: 1;background-color:rgb(30 30 32 / var(--tw-bg-opacity))}.dark .dark\:bg-\[\#2c2c32\]{--tw-bg-opacity: 1;background-color:rgb(44 44 50 / var(--tw-bg-opacity))}.dark .dark\:bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.dark .dark\:bg-neutral-800{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity))}.dark .dark\:bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.dark .dark\:bg-zinc-900{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity))}.dark .dark\:text-\[\#3a71ff\]{--tw-text-opacity: 1;color:rgb(58 113 255 / var(--tw-text-opacity))}.dark .dark\:text-neutral-200{--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity))}.dark .dark\:text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity))}.dark .dark\:text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity))}.dark .dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark .dark\:hover\:bg-\[\#414755\]:hover{--tw-bg-opacity: 1;background-color:rgb(65 71 85 / var(--tw-bg-opacity))}.dark .dark\:hover\:bg-slate-800:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}.dark .dark\:hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}}@media (min-width: 768px){.md\:block{display:block}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width: 1024px){.lg\:w-\[80\%\]{width:80%}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}}html.dark pre code.hljs{display:block;overflow-x:auto;padding:1em}html.dark code.hljs{padding:3px 5px}html.dark .hljs{color:#abb2bf;background:#282c34}html.dark .hljs-keyword,html.dark .hljs-operator,html.dark .hljs-pattern-match{color:#f92672}html.dark .hljs-function,html.dark .hljs-pattern-match .hljs-constructor{color:#61aeee}html.dark .hljs-function .hljs-params{color:#a6e22e}html.dark .hljs-function .hljs-params .hljs-typing{color:#fd971f}html.dark .hljs-module-access .hljs-module{color:#7e57c2}html.dark .hljs-constructor{color:#e2b93d}html.dark .hljs-constructor .hljs-string{color:#9ccc65}html.dark .hljs-comment,html.dark .hljs-quote{color:#b18eb1;font-style:italic}html.dark .hljs-doctag,html.dark .hljs-formula{color:#c678dd}html.dark .hljs-deletion,html.dark .hljs-name,html.dark .hljs-section,html.dark .hljs-selector-tag,html.dark .hljs-subst{color:#e06c75}html.dark .hljs-literal{color:#56b6c2}html.dark .hljs-addition,html.dark .hljs-attribute,html.dark .hljs-meta .hljs-string,html.dark .hljs-regexp,html.dark .hljs-string{color:#98c379}html.dark .hljs-built_in,html.dark .hljs-class .hljs-title,html.dark .hljs-title.class_{color:#e6c07b}html.dark .hljs-attr,html.dark .hljs-number,html.dark .hljs-selector-attr,html.dark .hljs-selector-class,html.dark .hljs-selector-pseudo,html.dark .hljs-template-variable,html.dark .hljs-type,html.dark .hljs-variable{color:#d19a66}html.dark .hljs-bullet,html.dark .hljs-link,html.dark .hljs-meta,html.dark .hljs-selector-id,html.dark .hljs-symbol,html.dark .hljs-title{color:#61aeee}html.dark .hljs-emphasis{font-style:italic}html.dark .hljs-strong{font-weight:700}html.dark .hljs-link{text-decoration:underline}html pre code.hljs{display:block;overflow-x:auto;padding:1em}html code.hljs{padding:3px 5px}html code.hljs::-webkit-scrollbar{height:4px}html .hljs{color:#383a42;background:#fafafa}html .hljs-comment,html .hljs-quote{color:#a0a1a7;font-style:italic}html .hljs-doctag,html .hljs-formula,html .hljs-keyword{color:#a626a4}html .hljs-deletion,html .hljs-name,html .hljs-section,html .hljs-selector-tag,html .hljs-subst{color:#e45649}html .hljs-literal{color:#0184bb}html .hljs-addition,html .hljs-attribute,html .hljs-meta .hljs-string,html .hljs-regexp,html .hljs-string{color:#50a14f}html .hljs-attr,html .hljs-number,html .hljs-selector-attr,html .hljs-selector-class,html .hljs-selector-pseudo,html .hljs-template-variable,html .hljs-type,html .hljs-variable{color:#986801}html .hljs-bullet,html .hljs-link,html .hljs-meta,html .hljs-selector-id,html .hljs-symbol,html .hljs-title{color:#4078f2}html .hljs-built_in,html .hljs-class .hljs-title,html .hljs-title.class_{color:#c18401}html .hljs-emphasis{font-style:italic}html .hljs-strong{font-weight:700}html .hljs-link{text-decoration:underline}html.dark .markdown-body{color-scheme:dark;--color-prettylights-syntax-comment: #8b949e;--color-prettylights-syntax-constant: #79c0ff;--color-prettylights-syntax-entity: #d2a8ff;--color-prettylights-syntax-storage-modifier-import: #c9d1d9;--color-prettylights-syntax-entity-tag: #7ee787;--color-prettylights-syntax-keyword: #ff7b72;--color-prettylights-syntax-string: #a5d6ff;--color-prettylights-syntax-variable: #ffa657;--color-prettylights-syntax-brackethighlighter-unmatched: #f85149;--color-prettylights-syntax-invalid-illegal-text: #f0f6fc;--color-prettylights-syntax-invalid-illegal-bg: #8e1519;--color-prettylights-syntax-carriage-return-text: #f0f6fc;--color-prettylights-syntax-carriage-return-bg: #b62324;--color-prettylights-syntax-string-regexp: #7ee787;--color-prettylights-syntax-markup-list: #f2cc60;--color-prettylights-syntax-markup-heading: #1f6feb;--color-prettylights-syntax-markup-italic: #c9d1d9;--color-prettylights-syntax-markup-bold: #c9d1d9;--color-prettylights-syntax-markup-deleted-text: #ffdcd7;--color-prettylights-syntax-markup-deleted-bg: #67060c;--color-prettylights-syntax-markup-inserted-text: #aff5b4;--color-prettylights-syntax-markup-inserted-bg: #033a16;--color-prettylights-syntax-markup-changed-text: #ffdfb6;--color-prettylights-syntax-markup-changed-bg: #5a1e02;--color-prettylights-syntax-markup-ignored-text: #c9d1d9;--color-prettylights-syntax-markup-ignored-bg: #1158c7;--color-prettylights-syntax-meta-diff-range: #d2a8ff;--color-prettylights-syntax-brackethighlighter-angle: #8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark: #484f58;--color-prettylights-syntax-constant-other-reference-link: #a5d6ff;--color-fg-default: #c9d1d9;--color-fg-muted: #8b949e;--color-fg-subtle: #6e7681;--color-canvas-default: #0d1117;--color-canvas-subtle: #161b22;--color-border-default: #30363d;--color-border-muted: #21262d;--color-neutral-muted: rgba(110, 118, 129, .4);--color-accent-fg: #58a6ff;--color-accent-emphasis: #1f6feb;--color-attention-subtle: rgba(187, 128, 9, .15);--color-danger-fg: #f85149}html .markdown-body{color-scheme:light;--color-prettylights-syntax-comment: #6e7781;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-entity: #8250df;--color-prettylights-syntax-storage-modifier-import: #24292f;--color-prettylights-syntax-entity-tag: #116329;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #24292f;--color-prettylights-syntax-markup-bold: #24292f;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #eaeef2;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-brackethighlighter-angle: #57606a;--color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-fg-default: #24292f;--color-fg-muted: #57606a;--color-fg-subtle: #6e7781;--color-canvas-default: #ffffff;--color-canvas-subtle: #f6f8fa;--color-border-default: #d0d7de;--color-border-muted: hsl(210, 18%, 87%);--color-neutral-muted: rgba(175, 184, 193, .2);--color-accent-fg: #0969da;--color-accent-emphasis: #0969da;--color-attention-subtle: #fff8c5;--color-danger-fg: #cf222e}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;color:var(--color-fg-default);background-color:var(--color-canvas-default);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,");mask-image:url("data:image/svg+xml,")}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:var(--color-accent-fg);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--color-border-muted)}.markdown-body mark{background-color:var(--color-attention-subtle);color:var(--color-fg-default)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:var(--color-canvas-default)}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em 40px}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-border-muted);height:.25em;padding:0;margin:24px 0;background-color:var(--color-border-default);border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::-moz-placeholder{color:var(--color-fg-subtle);opacity:1}.markdown-body ::placeholder{color:var(--color-fg-subtle);opacity:1}.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:-moz-max-content;width:max-content;max-width:100%;overflow:auto}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>*:not(summary){display:none!important}.markdown-body a:focus,.markdown-body [role=button]:focus,.markdown-body input[type=radio]:focus,.markdown-body input[type=checkbox]:focus{outline:2px solid var(--color-accent-fg);outline-offset:-2px;box-shadow:none}.markdown-body a:focus:not(:focus-visible),.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible){outline:solid 1px transparent}.markdown-body a:focus-visible,.markdown-body [role=button]:focus-visible,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus-visible{outline:2px solid var(--color-accent-fg);outline-offset:-2px;box-shadow:none}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible{outline-offset:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;color:var(--color-fg-default);vertical-align:middle;background-color:var(--color-canvas-subtle);border:solid 1px var(--color-neutral-muted);border-bottom-color:var(--color-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--color-neutral-muted)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}.markdown-body h2{font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--color-border-muted)}.markdown-body h3{font-weight:var(--base-text-weight-semibold, 600);font-size:1.25em}.markdown-body h4{font-weight:var(--base-text-weight-semibold, 600);font-size:1em}.markdown-body h5{font-weight:var(--base-text-weight-semibold, 600);font-size:.875em}.markdown-body h6{font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--color-fg-muted)}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-fg-muted);border-left:.25em solid var(--color-border-default)}.markdown-body ul,.markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body tt,.markdown-body code,.markdown-body samp{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body input::-webkit-outer-spin-button,.markdown-body input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;appearance:none}.markdown-body:before{display:table;content:""}.markdown-body:after{display:table;clear:both;content:""}.markdown-body>*:first-child{margin-top:0!important}.markdown-body>*:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--color-danger-fg)}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:16px}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{padding:0 .2em;font-size:inherit}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{padding-bottom:0;border-bottom:0}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=A]{list-style-type:upper-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body ol[type=I]{list-style-type:upper-roman}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table th{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid var(--color-border-default)}.markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--color-border-default)}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--color-fg-default)}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--color-neutral-muted);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-canvas-subtle);border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:var(--color-canvas-default);border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--color-canvas-subtle);border-top:0}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{font-size:12px;color:var(--color-fg-muted);border-top:1px solid var(--color-border-default)}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes ol ul{display:inline-block;padding-left:16px;margin-top:16px}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-24px;pointer-events:none;content:"";border:2px solid var(--color-accent-emphasis);border-radius:6px}.markdown-body .footnotes li:target{color:var(--color-fg-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .pl-c{color:var(--color-prettylights-syntax-comment)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--color-prettylights-syntax-entity)}.markdown-body .pl-smi,.markdown-body .pl-s .pl-s1{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .pl-k{color:var(--color-prettylights-syntax-keyword)}.markdown-body .pl-s,.markdown-body .pl-pds,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-sr .pl-sra{color:var(--color-prettylights-syntax-string)}.markdown-body .pl-v,.markdown-body .pl-smw{color:var(--color-prettylights-syntax-variable)}.markdown-body .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}.markdown-body .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}.markdown-body .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}.markdown-body .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}.markdown-body .pl-ml{color:var(--color-prettylights-syntax-markup-list)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}.markdown-body .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}.markdown-body .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}.markdown-body .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}.markdown-body .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}.markdown-body .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}.markdown-body .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}.markdown-body .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}.markdown-body .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}.markdown-body .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}.markdown-body g-emoji{display:inline-block;min-width:1ch;font-family:"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:4px}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list{position:relative}.markdown-body .contains-task-list:hover .task-list-item-convert-container,.markdown-body .contains-task-list:focus-within .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip:auto}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}html,body,#app{height:100%}body{padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)} diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-fd895f10.js b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-fd895f10.js deleted file mode 100644 index a63c59f19..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/index-fd895f10.js +++ /dev/null @@ -1 +0,0 @@ -import{f as x,bl as N,bB as S,bn as k,r as d,aX as B,b4 as s,a$ as t,b2 as a,aW as $,b3 as n,b0 as m,b1 as _,bt as C,ac as P,bC as U,bo as V,bA as I}from"./index-7e19b821.js";import{l as T}from"./index-8f0537f1.js";import{S as p}from"./index-c238f14b.js";import{b as A,l as K,d as j,a as c,N as h}from"./index-2b595d91.js";import{N as z}from"./GradientText-44d798c5.js";import"./_plugin-vue_export-helper-c27b6911.js";const F={class:"login-container"},L={class:"mb-5 flex items-center justify-end"},M={class:"mr-2"},D={class:"min-w-[100px]"},E={class:"login-title"},G=n("div",{class:"flex justify-center text-slate-300"},[m(" Powered By "),n("a",{href:"https://github.com/hslr-s/sun-panel",target:"_blank",class:"ml-[5px] text-slate-500"},"Sun-Panel")],-1),R=x({__name:"index",setup(H){const f=N(),g=S(),b=k(),r=d(!1),i=d(g.language),o=d({username:"",password:""}),y=async()=>{r.value=!0;try{const e=await T(o.value);e.code===0?(f.setToken(e.data.token),f.setUserInfo(e.data),setTimeout(()=>{b.success(`Hi ${e.data.name},${V("login.welcomeMessage")}`),r.value=!1,I.push({path:"/"})},500)):r.value=!1}catch(e){r.value=!1,console.log(e)}};function v(){y()}function w(e){i.value=e,g.setLanguage(e)}return(e,l)=>($(),B("div",F,[s(a(U),{class:"login-card",style:{"border-radius":"20px"}},{default:t(()=>[n("div",L,[n("div",M,[s(a(p),{icon:"ion-language",style:{width:"20",height:"20"}})]),n("div",D,[s(a(A),{value:i.value,"onUpdate:value":l[0]||(l[0]=u=>i.value=u),size:"small",options:a(K),onUpdateValue:w},null,8,["value","options"])])]),n("div",E,[s(a(z),{size:30,type:"success",class:"!font-bold"},{default:t(()=>[m(_(e.$t("common.appName")),1)]),_:1})]),s(a(j),{model:o.value,"label-width":"100px",onKeydown:C(v,["enter"])},{default:t(()=>[s(a(c),null,{default:t(()=>[s(a(h),{value:o.value.username,"onUpdate:value":l[1]||(l[1]=u=>o.value.username=u),placeholder:e.$t("login.usernamePlaceholder")},{prefix:t(()=>[s(a(p),{icon:"ph:user-bold"})]),_:1},8,["value","placeholder"])]),_:1}),s(a(c),null,{default:t(()=>[s(a(h),{value:o.value.password,"onUpdate:value":l[2]||(l[2]=u=>o.value.password=u),type:"password",placeholder:e.$t("login.passwordPlaceholder")},{prefix:t(()=>[s(a(p),{icon:"mdi:password-outline"})]),_:1},8,["value","placeholder"])]),_:1}),s(a(c),{style:{"margin-top":"10px"}},{default:t(()=>[s(a(P),{type:"primary",block:"",loading:r.value,onClick:v},{default:t(()=>[m(_(e.$t("login.loginButton")),1)]),_:1},8,["loading"])]),_:1}),G]),_:1},8,["model","onKeydown"])]),_:1})]))}});export{R as default}; diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/logo-3d38229d.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/logo-3d38229d.svg deleted file mode 100644 index 561e1f533..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/logo-3d38229d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/qq_group_qr2-e70d9e73.png b/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/qq_group_qr2-e70d9e73.png deleted file mode 100644 index a956f7fba..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/assets/qq_group_qr2-e70d9e73.png and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon-black.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon-black.svg deleted file mode 100644 index 4f1f1e121..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon-black.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon.ico b/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon.ico deleted file mode 100644 index 3e414ed90..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon.ico and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon.svg b/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon.svg deleted file mode 100644 index 561e1f533..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/index.html b/luci-app-sunpanel/htdocs/luci-static/sunpanel/index.html deleted file mode 100644 index 29f0e6323..000000000 --- a/luci-app-sunpanel/htdocs/luci-static/sunpanel/index.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - Sun-Panel - - - - - -
- -
-
-
-
-
-
-
-
- - - - - diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/logo.png b/luci-app-sunpanel/htdocs/luci-static/sunpanel/logo.png deleted file mode 100644 index a3aac61dc..000000000 Binary files a/luci-app-sunpanel/htdocs/luci-static/sunpanel/logo.png and /dev/null differ diff --git a/luci-app-sunpanel/htdocs/luci-static/sunpanel/static/global.css b/luci-app-sunpanel/htdocs/luci-static/sunpanel/static/global.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/luci-app-trafficctl/Makefile b/luci-app-trafficctl/Makefile index 029f8b700..0d8035cf2 100644 --- a/luci-app-trafficctl/Makefile +++ b/luci-app-trafficctl/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-trafficctl -PKG_VERSION:=1.28.0 -PKG_RELEASE:=23 +PKG_VERSION:=1.28.2 +PKG_RELEASE:=24 PKG_LICENSE:=Apache-2.0 PKG_MAINTAINER:=Denis Iusupov @@ -10,21 +10,24 @@ PKG_MAINTAINER:=Denis Iusupov LUCI_TITLE:=LuCI Traffic Control LUCI_DESCRIPTION:=Per-device traffic monitoring, rate limiting (nft/iptables), \ traffic shaping (tc/HTB), internet blocking, and WiFi MAC filtering. -LUCI_DEPENDS:=+conntrack +luci-base +rpcd +curl +tc +iw +hostapd-utils +# The backend (helper scripts, init scripts, hotplug hooks, the config and the +# metrics CGI) is its own package, ../trafficctl. What is left here is the +# view, its rpcd plugin, the ACL and the menu entry. +# +# The backend's runtime dependencies are repeated here although this package +# does not call them itself. Releases up to 1.28.x were one package that +# depended on them directly, and when that package is upgraded to this one in +# the same run that installs trafficctl, opkg sees conntrack, curl, iw and +# hostapd-utils lose their only installed dependent and removes them as +# orphans: it does not count trafficctl, which is unpacked but not yet +# configured. Measured on OpenWrt 24.10.6 with `opkg install trafficctl.ipk +# luci-app-trafficctl.ipk` and with `opkg upgrade` from a feed. Keeping them +# here costs nothing, since trafficctl needs them anyway. +LUCI_DEPENDS:=+trafficctl +conntrack +curl +tc +iw +hostapd-utils +luci-base +rpcd LUCI_PKGARCH:=all include $(TOPDIR)/feeds/luci/luci.mk -# Only list files that ship in the package and may be user-edited. -# shapes.json / telegram_known.json are runtime state created by scripts; they -# survive sysupgrade via root/lib/upgrade/keep.d/ instead. -define Package/$(PKG_NAME)/conffiles -/etc/config/trafficctl -endef - -# The config holds the Telegram bot token and the metrics token, so it must not -# be world-readable before the first save from the UI applies the same mode. -# # rpcd only learns about a plugin when it starts, so without the restart below # every ubus call lands on "Object not found" (-32000) and the dashboard is # empty until the router is rebooted. build-ipk.sh and build-apk.sh have always @@ -32,27 +35,30 @@ endef # packages are the ones built from here through the SDK — so the bug only ever # reached the people installing the published artifacts. # +# The LuCI index and module caches are dropped as well, as luci.mk's default +# postinst does, so a changed menu entry shows up without a re-login. +# # Guarded on IPKG_INSTROOT: when it is set the package is being unpacked into # an image being built, where there is no running rpcd to talk to. +# +# trafficctl-opkg.backup is the copy opkg makes of a modified +# /etc/config/trafficctl when this package, which owned it up to 1.28.x, is +# upgraded to one that no longer does. trafficctl's postinst removes it too, +# but when trafficctl was installed in an earlier run the copy only appears +# with this upgrade. The config itself is kept by trafficctl, so the copy is +# removed only while the real file is there. +# +# The config mode, the services and the cut release on removal belong to the +# backend and live in ../trafficctl/Makefile. define Package/$(PKG_NAME)/postinst #!/bin/sh -chmod 0600 "$${IPKG_INSTROOT}/etc/config/trafficctl" 2>/dev/null || true if [ -z "$${IPKG_INSTROOT}" ]; then - /etc/init.d/rpcd restart 2>/dev/null || true - if [ -x /etc/init.d/trafficctl-telegram ]; then - /etc/init.d/trafficctl-telegram start 2>/dev/null || true + if [ -f /etc/config/trafficctl ]; then + rm -f /etc/config/trafficctl-opkg.backup fi -fi -exit 0 -endef - -# Fail open on removal. A global internet cut left engaged by a package that is -# going away is a lockout with no UI left to undo it — the drop rule would sit -# in nftables with nothing on the router admitting to owning it. -define Package/$(PKG_NAME)/prerm -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ] && [ -x /usr/local/bin/trafficctl-cut.sh ]; then - /usr/local/bin/trafficctl-cut.sh release >/dev/null 2>&1 || true + rm -f /tmp/luci-indexcache.* + rm -rf /tmp/luci-modulecache + /etc/init.d/rpcd restart 2>/dev/null || true fi exit 0 endef diff --git a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/history.js b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/history.js index 91695f8b1..55c20369e 100644 --- a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/history.js +++ b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/history.js @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 'use strict'; 'require view'; 'require rpc'; diff --git a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/portfw.js b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/portfw.js index 2f28e3b29..63d42d8d8 100644 --- a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/portfw.js +++ b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/portfw.js @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 'use strict'; 'require view'; 'require rpc'; diff --git a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/settings.js b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/settings.js index 780bd3428..0ea3cc5c4 100644 --- a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/settings.js +++ b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/settings.js @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 'use strict'; 'require view'; 'require rpc'; diff --git a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/status.js b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/status.js index 868b0a7f9..8d5921442 100644 --- a/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/status.js +++ b/luci-app-trafficctl/htdocs/luci-static/resources/view/trafficctl/status.js @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 'use strict'; 'require view'; 'require rpc'; @@ -3151,12 +3152,12 @@ return view.extend({ } } if ((data.shape_kbit || 0) > 0) { - parts.push(_('Shaped: 🌊 %s').format(fmtCeiling(data.shape_kbit, data.shape_kbit_up))); + parts.push(_('Shaped: 🌊 %s').format(fmtCeiling(data.shape_kbit, data.shape_kbit_up))); var sm = self._shapeMap[data.ip || searchSelect.getValue()] || {}; - if ((sm.backlog||0) > 0) parts.push(_('Queued: %s').format(fmtBytes(sm.backlog))); + if ((sm.backlog||0) > 0) parts.push(_('Queued: %s').format(fmtBytes(sm.backlog))); if ((sm.bytes||0) > 0) parts.push(_('Passed: %s').format(fmtBytes(sm.bytes))); } else if ((data.rate_limit_kbit || 0) > 0) { - parts.push(_('Speed limit: ⚡ %s').format(fmtCeiling(data.rate_limit_kbit, data.rate_limit_kbit_up))); + parts.push(_('Speed limit: ⚡ %s').format(fmtCeiling(data.rate_limit_kbit, data.rate_limit_kbit_up))); var dm = self._dropMap[data.ip || searchSelect.getValue()] || {}; if ((dm.packets||0) > 0) { parts.push(_('Dropped: 🚫 %d pkts / %s').format(Number(dm.packets) || 0, fmtBytes(dm.bytes||0))); diff --git a/luci-app-trafficctl/po/templates/luci-app-trafficctl.pot b/luci-app-trafficctl/po/templates/luci-app-trafficctl.pot index e3c563754..b56d634cc 100644 --- a/luci-app-trafficctl/po/templates/luci-app-trafficctl.pot +++ b/luci-app-trafficctl/po/templates/luci-app-trafficctl.pot @@ -289,6 +289,9 @@ msgstr "" msgid "Device name" msgstr "" +msgid "Devices" +msgstr "" + msgid "Devices already known:" msgstr "" @@ -421,6 +424,9 @@ msgstr "" msgid "Global internet cut needs nftables (fw4). This router is running iptables." msgstr "" +msgid "Grant access to LuCI Traffic Control" +msgstr "" + msgid "Graph" msgstr "" @@ -448,6 +454,9 @@ msgstr "" msgid "Hardware offload" msgstr "" +msgid "History" +msgstr "" + msgid "History is not recorded by default: it writes to the router's flash on a schedule, and every other persistent store in this app was deliberately kept off that path. Enable it below." msgstr "" @@ -766,6 +775,9 @@ msgstr "" msgid "Port" msgstr "" +msgid "Port Forwards" +msgstr "" + msgid "Port Forwards & Open Ports" msgstr "" diff --git a/luci-app-trafficctl/root/etc/config/trafficctl b/luci-app-trafficctl/root/etc/config/trafficctl deleted file mode 100644 index c28ab02d9..000000000 --- a/luci-app-trafficctl/root/etc/config/trafficctl +++ /dev/null @@ -1,166 +0,0 @@ -config trafficctl 'main' - option enabled '1' - option default_mode 'limiter' - # Write per-device blocks and rate limits to /etc/trafficctl/rules.json so - # the ifup-lan hook can restore them after a reboot. - # - # On by default since #105. It used to ship off, which made the same - # intention behave two ways: a traffic SHAPE persists unconditionally (the - # shaper has to record which HTB class belongs to which device, so - # shapes.json is always written and always restored), while a block or a - # limit vanished on reboot — and the default mode is the limiter, so the - # out-of-the-box path was the one that forgot. That was an unexamined - # default sitting next to a deliberate one, not a design. - # - # The cost is one small write to /etc per rule CHANGE. Not periodic, so - # unlike the byte counters — which live in tmpfs precisely because they are - # rewritten every poll — this is not a flash-wear concern. - # - # NOT the same switch as the global cut's "keep after reboot": that one is - # its own opt-in because an all-devices cut can lock out whoever - # administers the router through a LAN host, so a reboot must be able to - # undo it. See the cut section below. - option persist_rules '1' - # Extra subnets to monitor (space-separated CIDRs), for downstream-router - # clients that have no kernel route on this router. Subnets with a - # "via" route over a LAN interface are picked up automatically. - option extra_subnets '' - # Resolve names for devices with no DHCP lease here (routed/downstream - # clients) via reverse DNS. rdns_server is a space-separated list of - # resolvers tried in order before the system resolver — point it at the - # downstream router (e.g. a MikroTik) so its lease names get used. - option resolve_names '1' - option rdns_server '' - option rdns_ttl '300' - # Optional netifyd (DPI) integration — adds application labels per device. - # Inactive unless the agent is installed and its socket exists. - option netify_enabled '1' - option netify_socket '/var/run/netifyd/netifyd.sock' - # Where flow telemetry is published. Agent v5's unix socket is a - # request/response API that never pushes flows — the socket SINK does, - # usually tcp://127.0.0.1:1780. Empty = auto-detect from - # /etc/netifyd/netify-sink-socket.json. - option netify_endpoint '' - option netify_interval '45' - # IFB device used to shape upload pre-NAT (needs kmod-ifb). - option shape_ifb 'tctl-ifb0' - # Dashboard defaults for a browser that has not chosen its own. The Poll - # and Window chips still override per-browser — these only decide what a - # fresh session starts with, which is the part an admin can usefully set - # once for a router rather than per person (#12). - # - # poll_interval: seconds between live samples; 0 disables polling. - # A smaller number costs a conntrack read per tick on the router, which - # is the overhead the request was about. - # avg_window: seconds of history the displayed speed is averaged over. - # Samples kept per device are avg_window/poll_interval, so a long window - # with a short poll is the expensive combination. - option poll_interval '2' - option avg_window '15' - -config newdevice 'newdevice' - # Apply a limit automatically the first time a device is seen. Off by - # default: it is the only setting here that restricts a device nobody - # has looked at yet. limit_kbit 0 means "no limit" and makes enabled - # a no-op. An existing limit is never overwritten. - option enabled '0' - option limit_kbit '0' - option limit_mode 'limiter' - -config cut 'cut' - # Global internet cut (all devices at once). Only PREFERENCES live here — - # whether the cut is currently engaged never does, because /etc/config - # survives a reboot and this control must not. It is the one control that - # can lock out its own operator: anyone administering the router through a - # LAN host (Tailscale on a NAS, a tunnel from a LAN box, a jump host) loses - # that path while it is on, and a reboot has to be able to undo it. - # - # persist is its own opt-in and deliberately NOT the global persist_rules - # flag: somebody who turned that on so their rate limits survive a reboot - # must not inherit a persistent internet kill as a side effect. - option persist '0' - # Duration offered by default, in seconds; 0 means indefinite — the cut - # stays on until it is switched off. - # - # Indefinite is the default because it is what the feature is FOR: the - # requester's case (#55) is holding a new device off the internet until it - # has been configured, which has no predictable duration, and a cut that - # auto-released halfway through would silently let the device out. The - # safety net is that the engaged state lives in tmpfs, so a reboot always - # restores the internet — a timer is a convenience on top of that, not the - # thing standing between the operator and a permanent lockout. - option default_duration '0' - -config history 'history' - # Durable per-device traffic history (#89, #90). OFF by default: every - # other persistent store in this app was deliberately kept off the write - # path, and this one writes to flash on a schedule. - option enabled '0' - # Where the period files live. One file per accounting period, replaced - # atomically through a temp file in this same directory — so a network - # mount works, but see the note on `interval` before reaching for one. - option dir '/etc/trafficctl/history' - # day | week | month. The period IS the reset: a new period is a new file. - option period 'month' - # Seconds between flushes to durable storage. Floored at 300. Hourly is - # roughly 24 writes a day of a few KB, which is not a wear problem — this - # is the setting to raise if flash wear is the worry, in preference to - # pointing `dir` at a share that can hang when the NAS sleeps. - option interval '3600' - # Seconds between samples of the live accumulator. tmpfs only, no flash. - # Separate from `interval` on purpose and much shorter: with a conntrack - # byte source, a flow that starts and ends between two samples is - # invisible to both, so an hourly sample would miss most short traffic. - option sample_interval '60' - # How many FINISHED periods to retain. The current one is never a - # retention candidate. - option keep '12' - # Also accumulate per-INTERFACE totals (#102), in their own file per - # period. A second series rather than a breakdown of the device one: these - # are the kernel's interface counters, so they include the router's own - # traffic and broadcast, they legitimately disagree with the sum over - # devices, and under flow offloading they are the MORE accurate of the two - # because they come from the driver rather than from conntrack. They also - # answer what the device series cannot: how much went out of wan1 versus - # wan2. Off is reasonable on a single-WAN router. - option interfaces '1' - -config logging 'logging' - option enabled '1' - option log_file '/tmp/trafficctl/activity.log' - option max_lines '500' - option syslog '1' - option log_blocks '1' - option log_ratelimits '1' - option log_shapes '1' - option log_telegram '1' - option log_config '1' - -config telegram 'telegram' - option enabled '0' - option bot_token '' - option chat_id '' - option poll_interval '3' - option notify_new_device '1' - option notify_known_device '0' - option control_enabled '1' - option notify_template '' - option btn_block_inet '1' - option btn_block_wifi '1' - option btn_limiter '1' - option btn_shaper '1' - -config metrics 'metrics' - # Prometheus/OpenMetrics exporter. Off by default: it exposes device - # names, addresses and traffic volumes without a LuCI session. - option enabled '0' - # Shared token for the CGI endpoint (empty = no token check). - option token '' - # Per-device gauges (connections, blocked, limits, name/mac). Costs a - # full summary run per scrape — set 0 for byte counters only. - option state '1' - # Port-forward metrics. - option portfw '1' - # DPI application metrics. Off by default: device x application is a - # cardinality trap on a busy network. - option apps '0' diff --git a/luci-app-trafficctl/root/etc/hotplug.d/dhcp/99-trafficctl-newdevice b/luci-app-trafficctl/root/etc/hotplug.d/dhcp/99-trafficctl-newdevice deleted file mode 100644 index eeb7a13d1..000000000 --- a/luci-app-trafficctl/root/etc/hotplug.d/dhcp/99-trafficctl-newdevice +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Triggered by dnsmasq on DHCP events (add/old/del). -# Available env vars: ACTION, MACADDR, IPADDR, HOSTNAME -# -# Two consumers sit on "this MAC is new": -# * the Telegram bot, which wants a notification -# * the default-limit feature, which applies a rate limit or shape -# -# They are deliberately independent — either can be on without the other — -# and they use different notions of "known". The bot has always keyed off its -# own telegram_known.json, which the bot itself rewrites; the limiter uses the -# seen-MAC ledger in trafficctl-fw.sh, because applying a limit is not an -# action that may be repeated or misfired. - -[ "$ACTION" = "add" ] || exit 0 -[ -n "$MACADDR" ] || exit 0 - -# ── Telegram notification ────────────────────────────────────────────────── - -KNOWN_FILE="/etc/trafficctl/telegram_known.json" -NOTIFY_FLAG="/tmp/trafficctl_tg_newdev" - -if [ "$(uci -q get trafficctl.telegram.enabled)" = "1" ] && - ! grep -q "\"$MACADDR\"" "$KNOWN_FILE" 2>/dev/null; then - mkdir -p "$(dirname "$NOTIFY_FLAG")" - # HOSTNAME comes from the dnsmasq dhcp hotplug environment (see header), - # not a POSIX shell builtin — shellcheck's SC3028 is a false positive. - # shellcheck disable=SC3028 - printf '%s\t%s\t%s\n' "$MACADDR" "${IPADDR:-?}" "${HOSTNAME:-unknown}" >> "$NOTIFY_FLAG" -fi - -# ── Default limit for a device seen for the first time ───────────────────── - -[ "$(uci -q get trafficctl.newdevice.enabled 2>/dev/null)" = "1" ] || exit 0 - -LIMIT_KBIT=$(uci -q get trafficctl.newdevice.limit_kbit 2>/dev/null) -[ -n "$LIMIT_KBIT" ] && [ "$LIMIT_KBIT" -gt 0 ] 2>/dev/null || exit 0 - -. /usr/local/bin/trafficctl-fw.sh - -# The ledger decides what "new" means, so a run that has no ledger yet cannot -# answer the question — and the wrong answer here limits every device on the -# LAN as its lease renews. -# -# Seeding alone would not make that answer trustworthy: the seed reads the -# leases and the neighbour table, and both can be thin or empty early in boot, -# so a device missing from them would look new purely because the router had -# not noticed it yet. The first pass therefore records the baseline and -# applies nothing at all, whatever the seed happened to find. -if ! tctl_seen_ready; then - tctl_seen_seed - tctl_seen_mark "$MACADDR" - logger -t trafficctl "newdevice: seeded the seen-MAC ledger ($(tctl_seen_count) devices); no limit applied on this pass" - exit 0 -fi - -tctl_seen_known "$MACADDR" && exit 0 - -# Mark BEFORE acting. A failure while applying the limit must not leave the -# device unmarked, or every subsequent lease renewal retries — and each retry -# is another chance to race with an operator setting a limit by hand. -tctl_seen_mark "$MACADDR" - -[ -n "$IPADDR" ] || { - logger -t trafficctl "newdevice: $MACADDR is new but has no address yet; no limit applied" - exit 0 -} - -# Never override a limit somebody set deliberately. -if tctl_has_limit "$IPADDR"; then - logger -t trafficctl "newdevice: $IPADDR ($MACADDR) already has a limit; left alone" - exit 0 -fi - -LIMIT_MODE=$(uci -q get trafficctl.newdevice.limit_mode 2>/dev/null) -[ -n "$LIMIT_MODE" ] || LIMIT_MODE="limiter" - -case "$LIMIT_MODE" in - shaper) - TCTL_VIA=newdevice TCTL_SRC=hotplug \ - /usr/local/bin/trafficctl-shape.sh add "$IPADDR" "$LIMIT_KBIT" \ - "shape_$IPADDR" >/dev/null 2>&1 - rc=$? - ;; - *) - TCTL_VIA=newdevice TCTL_SRC=hotplug \ - /usr/local/bin/trafficctl-ratelimit.sh "$IPADDR" "$LIMIT_KBIT" \ - "$(tctl_ratelimit_comment "$IPADDR")" >/dev/null 2>&1 - rc=$? - ;; -esac - -if [ "$rc" = "0" ]; then - # trafficctl-ratelimit.sh writes its own activity-log entry and picks up - # the via=newdevice/src=hotplug exported above, so the limiter path is - # already recorded. trafficctl-shape.sh logs nothing, hence this branch. - [ "$LIMIT_MODE" = "shaper" ] && - tctl_log "shape_set" "$IPADDR" \ - "${LIMIT_KBIT}kbit default for new device $MACADDR" "newdevice" "hotplug" -else - logger -t trafficctl "newdevice: failed to apply ${LIMIT_KBIT}kbit to $IPADDR ($MACADDR)" -fi diff --git a/luci-app-trafficctl/root/etc/hotplug.d/iface/99-trafficctl-shapes b/luci-app-trafficctl/root/etc/hotplug.d/iface/99-trafficctl-shapes deleted file mode 100644 index d05d61b40..000000000 --- a/luci-app-trafficctl/root/etc/hotplug.d/iface/99-trafficctl-shapes +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Restore persistent rules after LAN interface comes up - -. /usr/local/bin/trafficctl-fw.sh - -# Clean up nft monitor table on lan ifdown to avoid stale counters -if [ "$ACTION" = "ifdown" ] && [ "$INTERFACE" = "lan" ]; then - nft delete table inet trafficctl_mon 2>/dev/null - exit 0 -fi - -[ "$ACTION" = "ifup" ] && [ "$INTERFACE" = "lan" ] || exit 0 - -SHAPES_FILE="/etc/trafficctl/shapes.json" -RULES_FILE="/etc/trafficctl/rules.json" - -# Wait for network stack to be ready (up to 10 seconds) -tries=0 -while ! tc qdisc show dev "$(tctl_get_lan_device)" >/dev/null 2>&1; do - tries=$((tries + 1)) - [ "$tries" -ge 20 ] && break - sleep 0.5 2>/dev/null || sleep 1 -done - -# Restore shaping rules -if [ -f "$SHAPES_FILE" ]; then - jsonfilter -i "$SHAPES_FILE" -e '@[*].ip' 2>/dev/null | while read -r ip; do - rate=$(jsonfilter -i "$SHAPES_FILE" -e "@[@.ip='$ip'].rate_kbit" 2>/dev/null) - # Absent on symmetric records, which is all of them before asymmetric - # shaping existed; trafficctl-shape.sh reads empty as "same as - # download". The label has to be passed explicitly because the upload - # rate is the fifth positional. - rate_up=$(jsonfilter -i "$SHAPES_FILE" -e "@[@.ip='$ip'].rate_kbit_up" 2>/dev/null) - if [ -n "$rate" ] && [ "$rate" != "0" ]; then - /usr/local/bin/trafficctl-shape.sh add "$ip" "$rate" "shape_$ip" "$rate_up" || \ - logger -t trafficctl "Failed to restore shape for $ip (${rate}kbit)" - fi - done -fi - -# Restore blocks and ratelimits (if persist enabled) -if [ -f "$RULES_FILE" ] && tctl_persist_enabled; then - # How many records there are comes from the file, not from a constant. - # `seq 0 99` stopped at the hundredth, so every rule past it was silently - # not restored: present in rules.json, shown by the UI as persisted, and - # absent from the kernel after a reboot (#108). Raising 99 to a bigger - # number would only move the cliff. The absent-record sentinel below is - # what ends the loop, exactly as it did before. - # - # (The line that used to sit here piped '@[*]' into a loop whose body was - # `true` — an abandoned attempt at this same iteration that did nothing.) - # Advanced at the TOP, so there is exactly one increment and `continue` - # below cannot skip it. With the increment at the bottom, a record that - # has a type but no ip — a truncated or hand-edited file — would spin the - # loop forever on the same index, inside a boot hook. That is a worse - # failure than the one being fixed here. - idx=-1 - while :; do - idx=$((idx + 1)) - type=$(jsonfilter -i "$RULES_FILE" -e "@[$idx].type" 2>/dev/null) - [ -z "$type" ] && break - ip=$(jsonfilter -i "$RULES_FILE" -e "@[$idx].ip" 2>/dev/null) - param=$(jsonfilter -i "$RULES_FILE" -e "@[$idx].param" 2>/dev/null) - [ -z "$ip" ] && continue - - case "$type" in - block) - tctl_block_add "$ip" "$(tctl_block_comment "$ip")" 2>/dev/null || \ - logger -t trafficctl "Failed to restore block for $ip" - ;; - ratelimit) - # Records written before the mode was stored have none; they - # get the same default the CLI would have given the target, so - # a subnet does not change meaning across the upgrade. - mode=$(jsonfilter -i "$RULES_FILE" -e "@[$idx].mode" 2>/dev/null) - [ -z "$mode" ] && mode=$(tctl_ratelimit_default_mode "$ip") - # Absent on every record written before the directions could - # differ, and on every symmetric one since. tctl_ratelimit_add - # reads that as "same as download", which is what those records - # have always meant. - param_up=$(jsonfilter -i "$RULES_FILE" -e "@[$idx].param_up" 2>/dev/null) - [ -n "$param" ] && [ "$param" != "0" ] && \ - tctl_ratelimit_add "$ip" "$param" "$(tctl_ratelimit_comment "$ip")" "$mode" "$param_up" 2>/dev/null || \ - logger -t trafficctl "Failed to restore ratelimit for $ip (${param}kbit)" - ;; - pfw_pause|pfw_limit) - # ip field is a composite key: scope/proto/ip|local/port - _scope=${ip%%/*}; _rest=${ip#*/} - _proto=${_rest%%/*}; _rest=${_rest#*/} - _pip=${_rest%%/*}; _pport=${_rest#*/} - [ "$_pip" = "local" ] && _pip="-" - if [ "$type" = "pfw_pause" ]; then - /usr/local/bin/trafficctl-portfw.sh pause "$_scope" "$_proto" "$_pip" "$_pport" >/dev/null 2>&1 || \ - logger -t trafficctl "Failed to restore port pause for $_pport" - else - [ -n "$param" ] && [ "$param" != "0" ] && \ - /usr/local/bin/trafficctl-portfw.sh limit "$_scope" "$_proto" "$_pip" "$_pport" "$param" >/dev/null 2>&1 || \ - logger -t trafficctl "Failed to restore port limit for $_pport" - fi - ;; - esac - done -fi - -# Restore a global internet cut the operator explicitly asked to keep. -# -# Guarded on the cut's OWN opt-in, not on tctl_persist_enabled: the global -# persist_rules flag exists so per-device rate limits survive a reboot, and -# inheriting a persistent internet kill from it would be a lockout reached -# through an unrelated decision. Only a cut engaged with "keep after reboot" -# leaves a file in /etc, so the file's existence is the consent. The restore -# path honours the original deadline and refuses to restart the clock. -if [ -f /etc/trafficctl/cut.state ]; then - /usr/local/bin/trafficctl-cut.sh restore >/dev/null 2>&1 || \ - logger -t trafficctl "Failed to restore the global internet cut" -fi - -# Pre-create nft monitor table if software offload is active -if [ "$(tctl_get_offload_mode)" = "software" ]; then - /usr/local/bin/trafficctl-bytes-nft.sh >/dev/null 2>&1 & -fi diff --git a/luci-app-trafficctl/root/etc/init.d/trafficctl-cut b/luci-app-trafficctl/root/etc/init.d/trafficctl-cut deleted file mode 100755 index 221a84326..000000000 --- a/luci-app-trafficctl/root/etc/init.d/trafficctl-cut +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh /etc/rc.common -# shellcheck shell=dash -# Keeper for the global internet cut: enforces the auto-revert deadline and -# re-asserts the rule if the table it lives in is ever taken out from under it. -# -# Not enabled at boot on purpose. The cut's engaged state lives in tmpfs, so -# after a reboot there is normally nothing to keep; the one case that does -# survive — an operator who ticked "keep after reboot" — is restored from the -# ifup-lan hotplug, which starts this service itself. -# -# No respawn either: the loop is meant to end when the cut does, and a -# respawning keeper would restart into an empty state forever. If it dies -# anyway, `trafficctl-cut.sh status` notices and starts a fresh one, and it -# enforces the deadline itself in the meantime. -# -# START/STOP/USE_PROCD are consumed by the sourced /etc/rc.common framework. -# shellcheck disable=SC2034 -START=95 -STOP=10 -USE_PROCD=1 - -start_service() { - procd_open_instance cut - procd_set_param command /usr/local/bin/trafficctl-cut.sh keeper - procd_set_param stdout 1 - procd_set_param stderr 1 - procd_close_instance -} diff --git a/luci-app-trafficctl/root/etc/init.d/trafficctl-history b/luci-app-trafficctl/root/etc/init.d/trafficctl-history deleted file mode 100755 index 15c7dc723..000000000 --- a/luci-app-trafficctl/root/etc/init.d/trafficctl-history +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh /etc/rc.common -# shellcheck shell=dash -# Sampler and flusher for the durable per-period traffic history. -# -# Why a service and not a cron line: there are TWO cadences and they are not -# interchangeable. Sampling must be frequent — with a conntrack source, a flow -# that starts and finishes between two samples is invisible to all of them — -# and costs a tmpfs write. Flushing touches durable storage and is therefore -# rare. One process runs both; see trafficctl-history.sh for the accuracy -# model that forces the split. -# -# Respawns, unlike the cut keeper: this is a steady-state service, and a -# sampler that quietly died would not fail loudly — it would just leave a -# month with a plausible-looking number in it that is far too low. -# -# Enabled at boot, but the loop itself refuses to do anything while -# trafficctl.history.enabled is 0, and re-reads that on every tick. So -# switching history on in the UI does not require knowing there is a service -# behind it. -# -# START/STOP/USE_PROCD are consumed by the sourced /etc/rc.common framework. -# shellcheck disable=SC2034 -START=96 -STOP=10 -USE_PROCD=1 - -start_service() { - procd_open_instance history - procd_set_param command /usr/local/bin/trafficctl-history.sh keeper - procd_set_param respawn 3600 5 0 - procd_set_param stdout 1 - procd_set_param stderr 1 - procd_close_instance -} - -service_triggers() { - # A change to the store location or the intervals is picked up by the loop - # itself, but enabling history for the first time should start sampling - # without waiting for a reboot. - procd_add_reload_trigger "trafficctl" -} diff --git a/luci-app-trafficctl/root/etc/init.d/trafficctl-telegram b/luci-app-trafficctl/root/etc/init.d/trafficctl-telegram deleted file mode 100755 index 9c556cd4b..000000000 --- a/luci-app-trafficctl/root/etc/init.d/trafficctl-telegram +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh /etc/rc.common -# shellcheck shell=dash -# START/STOP/USE_PROCD are consumed by the sourced /etc/rc.common framework. -# shellcheck disable=SC2034 -START=99 -STOP=10 -USE_PROCD=1 - -start_service() { - local enabled - config_load trafficctl - config_get enabled telegram enabled 0 - [ "$enabled" = "1" ] || return 0 - - procd_open_instance telegram - procd_set_param command /usr/local/bin/trafficctl-telegram.sh - procd_set_param stdout 1 - procd_set_param stderr 1 - procd_set_param respawn 3600 5 5 - procd_set_param file /etc/config/trafficctl - procd_close_instance -} - -service_triggers() { - procd_add_reload_trigger "trafficctl" -} - -reload_service() { - stop - start -} diff --git a/luci-app-trafficctl/root/lib/upgrade/keep.d/luci-app-trafficctl b/luci-app-trafficctl/root/lib/upgrade/keep.d/luci-app-trafficctl deleted file mode 100644 index ead234314..000000000 --- a/luci-app-trafficctl/root/lib/upgrade/keep.d/luci-app-trafficctl +++ /dev/null @@ -1 +0,0 @@ -/etc/trafficctl/ diff --git a/luci-app-trafficctl/root/usr/libexec/rpcd/luci.trafficctl b/luci-app-trafficctl/root/usr/libexec/rpcd/luci.trafficctl index aee68ae81..c0e50017c 100755 --- a/luci-app-trafficctl/root/usr/libexec/rpcd/luci.trafficctl +++ b/luci-app-trafficctl/root/usr/libexec/rpcd/luci.trafficctl @@ -1,11 +1,12 @@ #!/bin/sh +# SPDX-License-Identifier: Apache-2.0 # shellcheck shell=dash # rpcd/ubus backend for luci-app-trafficctl. # Provides ubus object "luci.trafficctl" with methods for traffic control. -. /usr/local/bin/trafficctl-fw.sh +. /usr/libexec/trafficctl/trafficctl-fw.sh -SCRIPTS="/usr/local/bin" +SCRIPTS="/usr/libexec/trafficctl" # Strip unsafe chars from label (allow alphanumeric, dash, underscore, dot) sanitize_label() { echo "$1" | tr -cd 'a-zA-Z0-9_.-'; } diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-block.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-block.sh deleted file mode 100755 index 084ad4083..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-block.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Block internet access for a device. -# Usage: trafficctl-block.sh [label] - -. /usr/local/bin/trafficctl-fw.sh - -IP="$1" -LABEL="${2:-block_$IP}" - -if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-block.sh [label]"}' - exit 1 -fi - -if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 -fi - -ROUTER_IP=$(ip -4 addr show dev "$(tctl_get_lan_device)" 2>/dev/null | grep -oE 'inet [0-9.]+' | awk '{print $2}' | head -1) -if [ "$IP" = "$ROUTER_IP" ]; then - echo '{"ok":false,"msg":"cannot block the router itself"}' - exit 1 -fi - -COMMENT=$(tctl_block_comment "$IP") -SELF_BLOCK=false -if [ -n "$TCTL_SRC" ] && [ "$TCTL_SRC" = "$IP" ]; then - SELF_BLOCK=true -fi - -if tctl_is_blocked "$IP"; then - echo "{\"ok\":true,\"msg\":\"$IP is already blocked\"}" - exit 0 -fi - -TCTL_BLOCK_IPV6=0 -if tctl_block_add "$IP" "$COMMENT"; then - conntrack -D -s "$IP" >/dev/null 2>&1 - conntrack -D -d "$IP" >/dev/null 2>&1 - # The v4 flush above leaves every established IPv6 flow running, and with - # flow offload those are never re-evaluated against the new rule — the - # device would stay online over v6 indefinitely while the UI reads blocked. - MAC=$(tctl_target_mac "$IP" 2>/dev/null) && tctl_conntrack_flush_v6 "$MAC" - # Same problem one layer further out: a flow already accelerated by the - # NSS firmware is not re-evaluated against this rule either. - tctl_nss_defunct - - tctl_persist_enabled && tctl_persist_save "block" "$IP" "$LABEL" - tctl_log "block" "$IP" "$LABEL" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - - # Say which families are actually covered. Reporting plain success while - # half the traffic walks past the rule is the bug this fixes, so the - # no-MAC case is stated rather than left to be discovered (same reasoning - # as the half-applied-limit messages in trafficctl-ratelimit.sh). - if [ "$TCTL_BLOCK_IPV6" = "1" ]; then - NOTE="" - elif tctl_ip_is_nexthop "$IP"; then - NOTE=" — IPv4 only: $IP is a routed next hop, and a MAC-keyed IPv6 rule would also block everything behind it" - else - NOTE=" — IPv4 only: no MAC known for $IP (no DHCP lease, no neighbour entry), so IPv6 is not covered" - fi - NOTE="$NOTE$(tctl_nss_note)$(tctl_persist_note)" - NSS="$(tctl_nss_status)" - PERSIST=$(tctl_persist_enabled && echo true || echo false) - if [ "$SELF_BLOCK" = "true" ]; then - echo "{\"ok\":true,\"ipv6\":$([ "$TCTL_BLOCK_IPV6" = "1" ] && echo true || echo false),\"nss\":\"$NSS\",\"persist\":$PERSIST,\"msg\":\"internet blocked for $IP (your device — LuCI access preserved)$NOTE\"}" - else - echo "{\"ok\":true,\"ipv6\":$([ "$TCTL_BLOCK_IPV6" = "1" ] && echo true || echo false),\"nss\":\"$NSS\",\"persist\":$PERSIST,\"msg\":\"internet blocked for $IP$NOTE\"}" - fi -else - echo "{\"ok\":false,\"msg\":\"failed to block $IP\"}" - exit 1 -fi diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-bytes-nft.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-bytes-nft.sh deleted file mode 100755 index 3e7f0f312..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-bytes-nft.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Per-device byte counters using nftables maps. -# Works with software flow offload (hook priority -200, before flowtable at -150). -# Output: JSON array -# [{"ip":"…","bytes_in":N,"bytes_out":N,"bytes_tcp":-1,"bytes_udp":-1, -# "src":"nft","degraded":false}] -# -# "degraded" is always false here, and that is the entire point of this script: -# these counters sit ahead of the flowtable, so they keep moving under offload -# where conntrack freezes. If this path is unavailable, trafficctl-bytes.sh -# reports degraded:true instead of quietly handing back frozen numbers. -# -# The counters here are cumulative since the table was created, unlike the -# conntrack sums trafficctl-bytes.sh returns, which cover live flows only. -# "src" lets trafficctl-totals.sh notice the swap and rebaseline instead of -# accumulating the whole map as a single enormous delta. -# -# The protocol split is -1, i.e. "unknown", not 0: a `type ipv4_addr : counter` -# map is keyed by address alone, so there is nothing here to split TCP from UDP -# with. Reporting 0 would render as a device that sent no TCP at all. - -. /usr/local/bin/trafficctl-fw.sh - -command -v nft >/dev/null 2>&1 || { echo '[]'; exit 0; } - -# Create table/maps/chain/rules if not already present (idempotent). -# -# The gate matches the CURRENT rule orientation, not merely "some rule exists". -# Until 1.13.x the maps were keyed the other way round (bytes_in by saddr), so -# a router upgrading from that version already has the chain: a looser check -# would leave the old, inverted rules in place forever and the fix would only -# ever reach fresh installs. -# -# Direction convention, matching trafficctl-bytes.sh and docs/API.md: -# bytes_in = traffic toward the device (download) -> keyed by ip daddr -# bytes_out = traffic from the device (upload) -> keyed by ip saddr -if ! nft list chain inet trafficctl_mon mon_forward 2>/dev/null | grep -q "bytes_in.*daddr"; then - # Drop the old table wholesale rather than appending to it — leaving the - # previous pair of rules in place would double-count every packet. This - # resets the counters once, on upgrade; they are only used for speed - # deltas, so a single discarded sample is the whole cost. - nft delete table inet trafficctl_mon 2>/dev/null - - nft add table inet trafficctl_mon 2>/dev/null - nft add map inet trafficctl_mon bytes_in \ - '{ type ipv4_addr : counter; flags dynamic; }' 2>/dev/null - nft add map inet trafficctl_mon bytes_out \ - '{ type ipv4_addr : counter; flags dynamic; }' 2>/dev/null - nft add chain inet trafficctl_mon mon_forward \ - '{ type filter hook forward priority -200; policy accept; }' 2>/dev/null - nft add rule inet trafficctl_mon mon_forward \ - 'update @bytes_in { ip daddr counter }' 2>/dev/null - nft add rule inet trafficctl_mon mon_forward \ - 'update @bytes_out { ip saddr counter }' 2>/dev/null -fi - -# Dynamic counter maps are unsupported on some kernels ("Not supported"). -# Without this check the maps silently never exist, every rule fails, and the -# script returns [] forever — per-device speed just stops working. -if ! nft list map inet trafficctl_mon bytes_in >/dev/null 2>&1; then - TCTL_FORCE_CONNTRACK=1 exec /usr/local/bin/trafficctl-bytes.sh -fi - -IN=$(nft list map inet trafficctl_mon bytes_in 2>/dev/null) -OUT=$(nft list map inet trafficctl_mon bytes_out 2>/dev/null) - -# Parse: lines look like "192.168.0.100 : counter packets 584 bytes 892341[,]" -printf '%s\n__SEP__\n%s\n' "$IN" "$OUT" | awk ' -/^__SEP__$/ { phase = 1; next } -/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ : counter/ { - ip = ""; val = 0 - for (i = 1; i <= NF; i++) { - if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) ip = $i - if ($i == "bytes") val = $(i+1) + 0 - } - if (ip != "") { - if (phase == 0) in_b[ip] += val - else out_b[ip] += val - } -} -END { - printf "[" - n = 0 - for (ip in in_b) { - if (n > 0) printf "," - printf "{\"ip\":\"%s\",\"bytes_in\":%.0f,\"bytes_out\":%.0f,\"bytes_tcp\":-1,\"bytes_udp\":-1,\"src\":\"nft\",\"degraded\":false}", \ - ip, in_b[ip], out_b[ip]+0 - n++ - } - for (ip in out_b) { - if (!(ip in in_b)) { - if (n > 0) printf "," - printf "{\"ip\":\"%s\",\"bytes_in\":0,\"bytes_out\":%.0f,\"bytes_tcp\":-1,\"bytes_udp\":-1,\"src\":\"nft\",\"degraded\":false}", \ - ip, out_b[ip] - n++ - } - } - printf "]\n" -} -' diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-bytes.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-bytes.sh deleted file mode 100755 index ff6e6d58a..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-bytes.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Per-device byte counters from conntrack (for speed calculation). -# Output: JSON array -# [{"ip":"…","bytes_in":N,"bytes_out":N,"bytes_tcp":N,"bytes_udp":N, -# "src":"ct","degraded":false}] -# -# "src" names the counter source. trafficctl-totals.sh accumulates these into -# lifetime totals and the two sources have unrelated magnitudes (conntrack -# reports only live flows, the nft maps count since the table was built), so it -# has to be able to tell a source switch from a burst of traffic. -# -# "degraded" says whether the numbers can be believed AT ALL — see below. It is -# separate from "src" on purpose: src is about magnitude (and drives the -# rebaseline), degraded is about trust, and conflating them would make a change -# in trust look like a change of counter and throw away a delta for nothing. -# -# bytes_tcp / bytes_udp carry both directions summed, and exist only on the -# conntrack path — nft counter maps are keyed by address alone and cannot split -# by protocol, so trafficctl-bytes-nft.sh reports -1 there. -1 rather than 0: -# "unknown" and "no TCP traffic" must not render as the same number. - -. /usr/local/bin/trafficctl-fw.sh - -# Any offload mode (software, hardware, hardware-counter) bypasses conntrack counters -# for fast-path packets. Use nftables counters at forward priority -200 (before the -# flowtable at -150) which capture every packet regardless of offload state. -# Only pure "none" mode has accurate conntrack counters. -# Modes whose counters ARE synced back to conntrack ("*-counter") keep the -# conntrack path accurate; only the uncountered ones need the nft fallback. -# TCTL_FORCE_CONNTRACK is set by that fallback when the kernel lacks dynamic -# counter maps, so we don't bounce between the two. -_offload=$(tctl_get_offload_mode) -_uncountered=0 -case "$_offload" in - none|*-counter) ;; - *) - _uncountered=1 - [ "$TCTL_FW" = "nft" ] && [ -z "$TCTL_FORCE_CONNTRACK" ] && \ - exec /usr/local/bin/trafficctl-bytes-nft.sh - ;; -esac - -# Reaching here with uncountered offload means the nft fallback was unavailable -# and we are about to read counters the forwarding path does not update. -# -# Two ways in, and the second is easy to miss: -# * TCTL_FORCE_CONNTRACK — bytes-nft.sh bounced back because the kernel has -# no dynamic counter map support. Observed on real hardware. -# * fw3/iptables — there is no nft fallback to reach in the first place. -# -# The numbers that follow are not merely imprecise, they are FROZEN for every -# offloaded flow: they stop moving while traffic continues. Left unflagged, a -# lifetime total accumulated from them looks authoritative and simply stalls, -# which reads as stale statistics rather than as a broken counter — the same -# shape as the 2 GiB %d freeze (#56), and harder to notice than the tiny live -# values that prompted #26, because the number is plausible. -_degraded=false -[ "$_uncountered" = "1" ] && _degraded=true - -# All monitored subnets (connected LANs + routed downstream subnets + -# trafficctl.main.extra_subnets), as awk membership spec. -MATCH_SPEC=$(tctl_monitored_subnets | awk '{printf "%s%s:%s:%s",(NR>1?" ":""),$2,$3,$4}') -[ -z "$MATCH_SPEC" ] && { echo '[]'; exit 0; } - -# Router-owned IPv4 addresses, excluded from the NAT fallback below. -LOCAL_IPS=$(ip -4 addr show 2>/dev/null | awk '/inet /{split($2,a,"/");print a[1]}' | tr '\n' ' ') - -cat /proc/net/nf_conntrack 2>/dev/null | awk -v spec="$MATCH_SPEC" -v localips="$LOCAL_IPS" -v degraded="$_degraded" ' -function ip2int(ip, a) { - split(ip, a, ".") - return a[1]*16777216 + a[2]*65536 + a[3]*256 + a[4] -} -function is_lan(ip, si, k) { - si = ip2int(ip) - for (k = 1; k <= ns; k++) - if (si - (si % blk[k]) == base[k]) return 1 - return 0 -} -BEGIN { - printf "[" - ns = split(spec, parts, " ") - for (k = 1; k <= ns; k++) { - split(parts[k], kv, ":") - base[k] = kv[1] + 0; blk[k] = kv[2] + 0 - } - nl = split(localips, lp, " ") - for (k = 1; k <= nl; k++) if (lp[k] != "") islocal[lp[k]] = 1 -} -{ - src=""; osrc=""; rdst=""; nsrc=0; bytes_orig=0; bytes_reply=0; bc=0; proto="" - for (i=1; i<=NF; i++) { - # The L4 protocol is a bare word in the header fields ("ipv4 2 tcp 6 …"), - # before any key=value pair, so it is matched by value like summary.sh. - if ($i == "tcp") proto="tcp" - else if ($i == "udp") proto="udp" - if ($i ~ /^src=/) { - v = substr($i, 5) - nsrc++ - if (nsrc == 1) osrc = v - if (src == "" && is_lan(v)) src = v - } - if (nsrc == 2 && rdst == "" && $i ~ /^dst=/) rdst = substr($i, 5) - if ($i ~ /^bytes=/) { - v = substr($i, 7) + 0 - bc++ - if (bc == 1) bytes_orig = v - else if (bc == 2) bytes_reply = v - } - } - # NAT fallback: flow was SNAT/masqueraded here (reply dst != original - # src), so the original src is a forwarded client even though it is not - # in any monitored subnet (e.g. behind a downstream router). - if (src == "" && osrc != "" && rdst != "" && rdst != osrc && \ - osrc ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ && !(osrc in islocal)) - src = osrc - if (src != "") { - key = src - in_total[key] += bytes_reply - out_total[key] += bytes_orig - # Both directions, unlike the per-direction sums above: the protocol - # split answers how much of the traffic for this device was TCP, which - # is not a question about direction. - if (proto == "tcp") tcp_total[key] += bytes_orig + bytes_reply - else if (proto == "udp") udp_total[key] += bytes_orig + bytes_reply - } -} -END { - n = 0 - for (ip in in_total) { - if (n > 0) printf "," - printf "{\"ip\":\"%s\",\"bytes_in\":%.0f,\"bytes_out\":%.0f,\"bytes_tcp\":%.0f,\"bytes_udp\":%.0f,\"src\":\"ct\",\"degraded\":%s}", \ - ip, in_total[ip], out_total[ip], tcp_total[ip]+0, udp_total[ip]+0, degraded - n++ - } - printf "]\n" -} -' diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-cut.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-cut.sh deleted file mode 100755 index d85161d63..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-cut.sh +++ /dev/null @@ -1,597 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Global internet cut — every device loses the internet, the LAN keeps working. -# -# Usage: -# trafficctl-cut.sh engage [persist] 0 seconds = indefinite -# trafficctl-cut.sh release -# trafficctl-cut.sh status -# trafficctl-cut.sh restore (boot path, from the ifup-lan hotplug) -# trafficctl-cut.sh tick (one keeper iteration) -# trafficctl-cut.sh keeper (the procd-supervised loop) -# -# ── Why an own table, not `inet fw4` ────────────────────────────────────── -# -# Per-device blocks insert into `inet fw4 forward`, and fw4 tears that table -# down and rebuilds it on every reload — a plain firewall config change from -# any other app is enough. The restore hook only fires on `ifup lan`, so a bare -# `fw4 reload` drops the rule with nothing to put it back. For per-device -# blocks that is a known wart; for a control whose whole purpose is "this -# device must not reach the internet while I set it up" it is the worst -# possible failure: the rule lapses, the toggle still reads ON, and the new TV -# is on the internet while the UI says it is not. -# -# So the cut lives in its own table (`inet tctl_cut`), the way port-forward -# control already uses `inet tctl_pfw` and the limiter uses `netdev -# tm_ratelimit`. fw4 deletes its own tables, not ours, so the rule survives a -# firewall rebuild structurally rather than by being noticed and re-added. -# The keeper below still re-asserts it, because a wholesale `nft flush ruleset` -# (or `fw4 flush`) takes every table with it. -# -# ── Why prerouting, not just forward ────────────────────────────────────── -# -# A forward-hook rule only sees traffic the router FORWARDS. On a router -# running a transparent proxy — podkop/sing-box, passwall, homeproxy — that is -# not where client traffic goes. TPROXY intercepts at prerouting and delivers -# the packet LOCALLY; the proxy then originates its own outbound connections -# from the router. Neither leg is forwarded: client→router is input, -# router→internet is output. A forward-only cut misses all of it, and on such a -# router that is the bulk of the traffic, not an edge case. The toggle would -# read ON, the rule would genuinely be present, and the new TV would keep -# browsing — the exact lie this feature exists to not tell. -# -# So the primary rule sits at prerouting priority -300, ahead of every hook -# anything else is likely to use, and catches traffic on the way in, before -# anything can divert it. The forward chain is kept as a second layer. -# -# Traffic the router originates ITSELF never traverses prerouting (it goes -# output→postrouting), so the proxy's own outbound path, the router's VPN -# tunnels and its DNS are untouched — only traffic arriving FROM a LAN device -# is considered. -# -# ── Why interface matching ──────────────────────────────────────────────── -# -# Both chains say the same thing: "traffic from a LAN device that is not going -# to stay on the LAN is dropped". Interfaces, not addresses, because: -# -# * IPv4 and IPv6 are both cut by the same rules. The per-device block -# matches `ip saddr` and is v4-only; for a global cut a device holding a -# SLAAC address would walk straight out over v6 while the UI claimed the -# internet was off. -# * LAN↔LAN keeps working, including between VLANs/bridges and out to -# downstream routed subnets — those all resolve to a LAN device. -# * Same-subnet traffic is bridged and reaches neither hook at all. -# -# At prerouting there is no `oifname` yet — the routing decision has not -# happened — so the equivalent question is asked of the FIB: `fib daddr . iif -# oifname` is the interface the packet would leave by. `fib daddr type local` -# answers the more important one first: is this addressed to the router? LuCI, -# SSH, DNS, DHCP and a VPN terminating ON the router all match it and are -# accepted before any of the LAN-device reasoning is consulted, so they survive -# even if that reasoning is wrong. -# -# Inbound flows (WAN→LAN through a port forward) are deliberately NOT cut: -# those exist only where the operator created a forward, this app already has -# a dedicated control for them, and killing them would remove yet another -# remote-admin path from an operator who is about to lose their LAN-hosted one. - -. /usr/local/bin/trafficctl-fw.sh - -# Same priority as port-forward control: after DNAT, and before fw4's -# flowtable rule at filter priority 0 — otherwise an offloaded flow would -# bypass the drop entirely. -CUT_PRIO="-190" -# Earlier than any prerouting hook something else is likely to use: raw (-300) -# sits ahead of conntrack (-200), mangle (-150) and dstnat (-100). podkop / -# sing-box TPROXY at dstnat; passwall and homeproxy at mangle. -CUT_PRE_PRIO="-300" -CUT_COMMENT="tctl_cut" - -# The engaged state lives in tmpfs, and that is the whole point: a reboot must -# clear it. This is the one control in the app that can lock out its own -# operator — anyone administering the router through a LAN host (Tailscale on a -# NAS, a Cloudflare tunnel from a LAN box, a jump host) loses that path when -# the cut goes on, and persistent state would mean a reboot does not bring it -# back either. The remedy would become "be physically present". -CUT_RUN_DIR="/var/run/trafficctl" -CUT_STATE="/var/run/trafficctl/cut.state" - -# The opt-in copy. Written only when the operator ticks "keep after reboot", -# and deliberately NOT listed in root/lib/upgrade/keep.d: a cut that outlives a -# firmware upgrade is strictly worse than one that outlives a reboot. -CUT_PERSIST_STATE="/etc/trafficctl/cut.state" - -CUT_INIT="/etc/init.d/trafficctl-cut" -CUT_TICK_SECS=5 - -# 0 means indefinite. Anything else is clamped to a sane window: a minute is -# the shortest cut worth the conntrack flush, a week the longest that still -# reads as "temporary". -CUT_MIN_SECS=60 -CUT_MAX_SECS=604800 - -now() { date +%s; } - -json_esc() { printf '%s' "$1" | sed 's/\\/\\\\/g;s/"/\\"/g'; } - -fail() { - printf '{"ok":false,"msg":"%s"}\n' "$(json_esc "$1")" - exit 1 -} - -# ── LAN device set ───────────────────────────────────────────────────────── - -# The devices whose traffic stays local. Empty is not an answer we can act on: -# "drop everything not leaving via a LAN device" with no LAN devices means -# "drop everything forwarded", which blackholes the LAN this feature promises -# to keep working. Callers must refuse rather than guess. -cut_lan_devices() { - tctl_get_lan_devices -} - -# nft anonymous set literal: { "br-lan", "br-guest" } -cut_lan_set() { - local devs="$1" dev out="" - for dev in $devs; do - if [ -n "$out" ]; then - out="$out, \"$dev\"" - else - out="\"$dev\"" - fi - done - printf '{ %s }' "$out" -} - -# ── nft plumbing ─────────────────────────────────────────────────────────── - -cut_supported() { - [ "$TCTL_FW" = "nft" ] -} - -# Live state, which is the only honest answer to "is the internet cut?". -# The full quoted comment is matched, not a substring: the codebase learned -# that lesson when unblocking 192.168.1.1 deleted the rule for 192.168.1.10. -cut_rule_present() { - nft list table inet tctl_cut 2>/dev/null | grep -qF "\"$CUT_COMMENT\"" -} - -# "full" once the prerouting chain is in place, "forward" when only the -# forward chain could be installed. Read from the kernel, never remembered. -cut_coverage() { - local dump - dump=$(nft list table inet tctl_cut 2>/dev/null) || { echo none; return 1; } - printf '%s' "$dump" | grep -qF "\"$CUT_COMMENT\"" || { echo none; return 1; } - if printf '%s' "$dump" | grep -q "hook prerouting"; then - echo full - else - echo forward - fi -} - -# Is something on this router intercepting traffic transparently? -# -# podkop/sing-box, passwall and homeproxy all TPROXY at prerouting and deliver -# the packet LOCALLY — it is never forwarded, so the forward hook never sees -# it. A forward-only cut on such a router misses the bulk of the traffic while -# the UI reports the internet as off, which is precisely the failure this -# feature exists to not have. Only consulted on the degraded path, because -# listing the whole ruleset is not something to do on every UI poll. -cut_proxy_intercept() { - nft list ruleset 2>/dev/null | grep -q 'tproxy' -} - -# The ruleset, emitted as one atomic `nft -f` transaction. -# -# Atomic matters more than it looks. Adding these rules one at a time would, on -# a kernel without nft_fib, apply the accepts that parse and the final drop — -# and a prerouting drop without its router-local escape hatch black-holes the -# LAN including LuCI. All-or-nothing means a kernel that cannot do this gets -# nothing at all, and we fall back deliberately instead of by accident. -# -# Rule order is a safety property, not a style choice. `fib daddr type local` -# comes FIRST, before anything that depends on the LAN device list being -# correct: whatever else is wrong, traffic addressed to the router — LuCI, SSH, -# DNS, DHCP, a VPN terminating here — is accepted. -cut_ruleset() { - local devs="$1" mode="$2" set_expr pre="" - set_expr=$(cut_lan_set "$devs") - - if [ "$mode" = "full" ]; then - pre=$(cat </dev/null) || return 1 - printf '%s' "$dump" | grep -qF "\"$CUT_COMMENT\"" || return 1 - [ "$mode" = "full" ] || return 0 - printf '%s' "$dump" | grep -q "hook prerouting" || return 1 - printf '%s' "$dump" | grep -q "fib daddr type" || return 1 - return 0 -} - -cut_install_rule() { - local devs="$1" - - # Preferred: catch traffic at prerouting, before anything can divert it. - if cut_ruleset "$devs" full | nft -f - 2>/dev/null && cut_verify full; then - return 0 - fi - # The prerouting chain did not load — almost certainly a kernel without the - # fib expression (nft_fib_inet). Fall back to forward-only, which is - # correct on a plain router; do_engage decides whether that is good enough - # on THIS router. - nft delete table inet tctl_cut 2>/dev/null - if cut_ruleset "$devs" forward | nft -f - 2>/dev/null && cut_verify forward; then - return 0 - fi - nft delete table inet tctl_cut 2>/dev/null - return 1 -} - -cut_remove_rule() { - nft delete table inet tctl_cut 2>/dev/null - return 0 -} - -# Established flows survive a new drop rule — conntrack keeps them, and any -# flow already handed to the flowtable bypasses the forward hook altogether. -# Without this the toggle reads ON while the TV finishes its firmware download. -# -# Flushed per monitored subnet rather than with a global `conntrack -F`, which -# would also tear down the operator's own sessions to unrelated hosts. -cut_flush_conntrack() { - local spec base block cidr mask bits - - # Whether the flush WORKED cannot be read off the exit status: `conntrack - # -D` reports failure both when the tool is broken and when there was - # simply nothing to delete, and on a quiet network the second is normal. - # So capability is probed once instead — `-C` is a cheap count that fails - # if the tool is missing or nf_conntrack is not loaded — and that is the - # only thing the caller is told about. - command -v conntrack >/dev/null 2>&1 || return 1 - conntrack -C >/dev/null 2>&1 || return 1 - - # Iterated with `for` rather than a pipeline so the loop stays in this - # shell; a `| while` body is a subshell and could report nothing back. - for spec in $(tctl_monitored_subnets 2>/dev/null | awk '{print $2 ":" $3}'); do - base=${spec%%:*} - block=${spec##*:} - [ -n "$base" ] && [ -n "$block" ] || continue - # block = 2^(32-mask); turn it back into a prefix length. - bits=0 - mask="$block" - while [ "$mask" -gt 1 ] 2>/dev/null; do - mask=$((mask / 2)) - bits=$((bits + 1)) - done - cidr="$((base >> 24 & 255)).$((base >> 16 & 255)).$((base >> 8 & 255)).$((base & 255))/$((32 - bits))" - conntrack -D -s "$cidr" >/dev/null 2>&1 - conntrack -D -d "$cidr" >/dev/null 2>&1 - done - return 0 -} - -# ── state files ──────────────────────────────────────────────────────────── - -# Deliberately a plain key=value file and not uci: /etc/config survives a -# reboot, and the engaged state must not. -cut_state_write() { - local file="$1" expires="$2" persist="$3" started="$4" - mkdir -p "$(dirname "$file")" 2>/dev/null - { - printf 'expires_at=%s\n' "$expires" - printf 'persist=%s\n' "$persist" - printf 'started_at=%s\n' "$started" - } > "$file.tmp" 2>/dev/null && mv "$file.tmp" "$file" -} - -# Reads one field without sourcing the file — a state file is written by root -# but parsing it as shell would turn any future corruption into execution. -cut_state_get() { - local file="$1" key="$2" val - [ -f "$file" ] || return 1 - val=$(sed -n "s/^${key}=\\(.*\\)\$/\\1/p" "$file" 2>/dev/null | head -1) - case "$val" in - ''|*[!0-9]*) return 1 ;; - esac - printf '%s' "$val" -} - -cut_active() { - [ -f "$CUT_STATE" ] -} - -# Has a timed cut run out? An indefinite cut (expires_at=0) never has. -cut_expired() { - local file="${1:-$CUT_STATE}" exp - exp=$(cut_state_get "$file" expires_at) || return 1 - [ "$exp" = "0" ] && return 1 - [ "$(now)" -ge "$exp" ] -} - -# ── keeper lifecycle ─────────────────────────────────────────────────────── - -cut_keeper_running() { - pgrep -f "trafficctl-cut.sh keeper" >/dev/null 2>&1 -} - -cut_keeper_start() { - [ -x "$CUT_INIT" ] || return 0 - cut_keeper_running && return 0 - "$CUT_INIT" start >/dev/null 2>&1 - return 0 -} - -cut_keeper_stop() { - [ -x "$CUT_INIT" ] || return 0 - "$CUT_INIT" stop >/dev/null 2>&1 - return 0 -} - -# ── actions ──────────────────────────────────────────────────────────────── - -# secs: 0 (indefinite) or CUT_MIN_SECS..CUT_MAX_SECS -cut_validate_duration() { - local secs="$1" - case "$secs" in - ''|*[!0-9]*) return 1 ;; - esac - [ "$secs" = "0" ] && return 0 - [ "$secs" -ge "$CUT_MIN_SECS" ] && [ "$secs" -le "$CUT_MAX_SECS" ] -} - -# expires_at is passed in as an ABSOLUTE deadline so the boot-restore path can -# reuse this without restarting the clock. Storing a remaining duration and -# counting down again from boot would silently extend every restored cut. -do_engage() { - local expires="$1" persist="$2" quiet="$3" - local devs - - cut_supported || fail "global cut needs nftables (fw4); this system is running iptables" - - devs=$(cut_lan_devices) - if [ -z "$devs" ]; then - fail "no LAN interfaces found — refusing, a cut with no LAN to spare would black-hole the LAN too" - fi - - if ! cut_install_rule "$devs"; then - cut_remove_rule - fail "failed to install the cut rule" - fi - - # Degraded coverage plus a transparent proxy is the one combination where - # the cut would be a lie: the proxy intercepts at prerouting and delivers - # locally, so a forward-only rule never sees the traffic it claims to be - # stopping. Refusing, loudly, beats a switch that does nothing. - if [ "$(cut_coverage)" = "forward" ] && cut_proxy_intercept; then - cut_remove_rule - fail "this router intercepts traffic with a transparent proxy (TPROXY — podkop/sing-box, passwall or similar), and the prerouting chain could not be installed on this kernel (no nft_fib?). A forward-only cut would miss proxied traffic while reporting success, so it is refused rather than faked." - fi - - cut_state_write "$CUT_STATE" "$expires" "$persist" "$(now)" - if [ "$persist" = "1" ]; then - cut_state_write "$CUT_PERSIST_STATE" "$expires" "$persist" "$(now)" - else - rm -f "$CUT_PERSIST_STATE" 2>/dev/null - fi - - local ct_msg="" - cut_flush_conntrack || ct_msg=" (conntrack unavailable — connections opened before now may linger)" - - cut_keeper_start - tctl_log "cut" "all" "expires=$expires persist=$persist" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - - [ "$quiet" = "quiet" ] && return 0 - emit_status "internet cut for all devices${ct_msg}" -} - -# Removing the rule comes first and stopping the keeper last: the keeper may be -# the caller, and its own service stop arrives as a SIGTERM. Ordered this way an -# interrupted release still leaves the internet on, never off. -do_release() { - local quiet="$1" - cut_remove_rule - rm -f "$CUT_STATE" "$CUT_PERSIST_STATE" 2>/dev/null - tctl_log "uncut" "all" "" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - cut_keeper_stop - [ "$quiet" = "quiet" ] && return 0 - emit_status "internet restored for all devices" -} - -# Boot path. Only a cut the operator explicitly asked to keep leaves a file in -# /etc, so the mere existence of one is the opt-in — the global persist_rules -# flag is NOT consulted, because somebody who enabled that so their rate limits -# survive a reboot must not inherit a persistent internet kill from it. -do_restore() { - local exp persist - [ -f "$CUT_PERSIST_STATE" ] || return 0 - persist=$(cut_state_get "$CUT_PERSIST_STATE" persist) || persist=0 - if [ "$persist" != "1" ]; then - rm -f "$CUT_PERSIST_STATE" 2>/dev/null - return 0 - fi - exp=$(cut_state_get "$CUT_PERSIST_STATE" expires_at) || exp=0 - if cut_expired "$CUT_PERSIST_STATE"; then - # The deadline passed while the router was down. Honour it rather than - # starting the countdown again, which would extend the cut by a full - # duration every reboot. - rm -f "$CUT_PERSIST_STATE" 2>/dev/null - logger -t trafficctl "global internet cut expired while down — not restored" 2>/dev/null - return 0 - fi - do_engage "$exp" 1 quiet -} - -# One keeper iteration. -# 0 = still engaged, keep going -# 2 = nothing left to do, the keeper should stop -do_tick() { - local devs - if ! cut_active; then - cut_rule_present && cut_remove_rule - return 2 - fi - if cut_expired; then - do_release quiet - logger -t trafficctl "global internet cut expired — internet restored" 2>/dev/null - return 2 - fi - if ! cut_rule_present; then - # Something took the table with it — a `nft flush ruleset`, or an - # `fw4 flush`. Put it back and say so, because a cut that lapsed even - # briefly is worth a log line. - devs=$(cut_lan_devices) - if [ -n "$devs" ] && cut_install_rule "$devs"; then - logger -t trafficctl "global internet cut re-asserted after the rule disappeared" 2>/dev/null - fi - fi - return 0 -} - -# Supervised by procd, started on engage and stopped on release. No respawn: -# the loop is meant to end when the cut does, and a respawning keeper would -# restart into an empty state over and over. If it dies anyway, `status` -# notices (keeper_running=false), re-enforces the deadline itself and starts a -# fresh one — the UI polls it, so the auto-revert is not staked on one process. -do_keeper() { - # The deadline is re-read from the clock on every pass rather than slept - # through in one go: a router boots with a bogus clock until NTP lands, and - # a single long sleep computed before the step would strand the cut. - while :; do - do_tick || break - sleep "$CUT_TICK_SECS" - done - return 0 -} - -emit_status() { - local msg="$1" - local active=false present=false persist=false keeper=false supported=false - local exp=0 remaining=0 started=0 devs coverage - - cut_supported && supported=true - devs=$(cut_lan_devices | tr '\n' ' ' | sed 's/ *$//') - - if cut_active; then - active=true - exp=$(cut_state_get "$CUT_STATE" expires_at) || exp=0 - started=$(cut_state_get "$CUT_STATE" started_at) || started=0 - [ "$(cut_state_get "$CUT_STATE" persist)" = "1" ] && persist=true - if [ "$exp" != "0" ]; then - remaining=$((exp - $(now))) - [ "$remaining" -lt 0 ] && remaining=0 - fi - fi - cut_rule_present && present=true - cut_keeper_running && keeper=true - - # "full" = the prerouting chain is in place and transparently proxied - # traffic is caught too; "forward" = only forwarded traffic is, which the - # UI must surface rather than bury. - coverage=$(cut_coverage) - - printf '{"ok":true,"active":%s,"rule_present":%s,"supported":%s,"coverage":"%s","expires_at":%s,"remaining":%s,"started_at":%s,"persist":%s,"keeper_running":%s,"lan_devices":"%s","default_duration":%s,"default_persist":%s,"msg":"%s"}\n' \ - "$active" "$present" "$supported" "$coverage" "$exp" "$remaining" "$started" \ - "$persist" "$keeper" "$(json_esc "$devs")" \ - "$(cut_default_duration)" \ - "$(cut_default_persist)" \ - "$(json_esc "$msg")" -} - -cut_default_duration() { - local d - d=$(uci -q get trafficctl.cut.default_duration 2>/dev/null) - case "$d" in - ''|*[!0-9]*) echo 0 ;; - *) echo "$d" ;; - esac -} - -cut_default_persist() { - [ "$(uci -q get trafficctl.cut.persist 2>/dev/null)" = "1" ] && echo true || echo false -} - -# Reported state is reconciled first, and it is reconciled against the KERNEL, -# not against the state file. Two failures are being headed off: -# * a timed cut whose keeper died would otherwise read ON forever; -# * a state file left behind by a rule that lapsed would read ON while the -# traffic flows. `rule_present` is reported separately for exactly that, -# and the UI must never render ON without it. -do_status() { - if cut_active && cut_expired; then - do_release quiet - emit_status "the cut expired and the internet was restored" - return 0 - fi - # A cut that is still on but has lost its keeper gets one back, so the - # auto-revert does not depend on a single process staying alive. - if cut_active && ! cut_keeper_running; then - cut_keeper_start - fi - emit_status "" -} - -case "$1" in -engage) - SECS="${2:-0}" - PERSIST="${3:-0}" - cut_validate_duration "$SECS" || \ - fail "duration must be 0 (indefinite) or between $CUT_MIN_SECS and $CUT_MAX_SECS seconds" - case "$PERSIST" in - 0|1) ;; - *) fail "persist must be 0 or 1" ;; - esac - if [ "$SECS" = "0" ]; then - EXPIRES=0 - else - EXPIRES=$(( $(now) + SECS )) - fi - mkdir -p "$CUT_RUN_DIR" 2>/dev/null - do_engage "$EXPIRES" "$PERSIST" "" - ;; -release) - do_release "" - ;; -status) - do_status - ;; -restore) - do_restore - ;; -tick) - do_tick - ;; -keeper) - do_keeper - ;; -*) - fail "usage: trafficctl-cut.sh engage [persist] | release | status | restore" - ;; -esac diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-device.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-device.sh deleted file mode 100755 index 510b75f88..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-device.sh +++ /dev/null @@ -1,408 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Detailed device info with connections. -# Usage: trafficctl-device.sh [--rdns] [--proto tcp|udp|all] - -. /usr/local/bin/trafficctl-fw.sh - -LAN_DEV=$(tctl_get_lan_device) - -# Parse arguments -IP="" -DO_RDNS=0 -PROTO_FILTER="all" - -while [ $# -gt 0 ]; do - case "$1" in - --rdns) DO_RDNS=1 ;; - --proto) shift; PROTO_FILTER="$1" ;; - *) [ -z "$IP" ] && IP="$1" ;; - esac - shift -done - -if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-device.sh [--rdns] [--proto tcp|udp|all]"}' - exit 1 -fi - -if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 -fi - -# Get device name from DHCP leases -NAME="" -MAC="" -if [ -f /tmp/dhcp.leases ]; then - NAME=$(awk -v ip="$IP" '$3 == ip {print $4}' /tmp/dhcp.leases | head -1) - MAC=$(awk -v ip="$IP" '$3 == ip {print $2}' /tmp/dhcp.leases | head -1) -fi -if [ -z "$MAC" ]; then - MAC=$(ip neigh show "$IP" 2>/dev/null | grep -oE '[0-9a-fA-F:]{17}' | head -1) -fi -MAC=$(echo "$MAC" | tr 'A-F' 'a-f') -[ "$NAME" = "*" ] && NAME="" - -# Same precedence as the summary: manual alias wins, then the lease name above, -# then cached reverse DNS (the only automatic source for routed devices). -ALIAS=$(awk -v ip="$IP" '$1 == ip {sub(/^[^ ]+ +/, ""); print; exit}' /etc/trafficctl/names 2>/dev/null) -[ -n "$ALIAS" ] && NAME="$ALIAS" -if [ -z "$NAME" ] && [ "$(uci -q get trafficctl.main.resolve_names 2>/dev/null)" != "0" ]; then - NAME=$(awk -v ip="$IP" '$1 == ip && $2 != "-" {print $2; exit}' /tmp/trafficctl_rdns_cache 2>/dev/null) -fi -[ -z "$NAME" ] && NAME="*" - -# Detect connection type — specific interface or band -CONN_TYPE="" -CONN_LAST="" -CONN_CACHE="/tmp/trafficctl_conn_cache" -[ -f "$CONN_CACHE" ] || : > "$CONN_CACHE" - -if ! tctl_ip_in_lan "$IP"; then - # Not on any connected LAN subnet — reached via a downstream router. - CONN_TYPE="routed" -elif [ -n "$MAC" ]; then - _wifi_stations=$( - for _wi in $(iw dev 2>/dev/null | awk '/Interface/{print $2}'); do - _ch=$(iw dev "$_wi" info 2>/dev/null | awk '/channel/{print $2}') - _band="" - if [ -n "$_ch" ]; then - if [ "$_ch" -le 14 ] 2>/dev/null; then _band="2.4G" - elif [ "$_ch" -le 177 ] 2>/dev/null; then _band="5G" - else _band="6G"; fi - fi - iw dev "$_wi" station dump 2>/dev/null | awk -v iface="$_wi" -v band="$_band" \ - '/Station/{print tolower($2), iface, band}' - done - ) - WIFI_LINE=$(echo "$_wifi_stations" | grep -i "$MAC") - if [ -n "$WIFI_LINE" ]; then - CONN_TYPE=$(echo "$WIFI_LINE" | awk '{print $3}') - [ -z "$CONN_TYPE" ] && CONN_TYPE="wifi" - else - BR_PORT=$(brctl showmacs "$LAN_DEV" 2>/dev/null | awk -v mac="$MAC" ' - NR>1 && $3=="no" && tolower($2)==mac {print $1; exit}') - if [ -n "$BR_PORT" ]; then - PORT_IFACE="" - for pdir in /sys/class/net/"$LAN_DEV"/brif/*/; do - [ -d "$pdir" ] || continue - pno=$(cat "${pdir}port_no" 2>/dev/null) - [ -z "$pno" ] && continue - if [ $(( pno )) -eq "$BR_PORT" ] 2>/dev/null; then - PORT_IFACE=$(basename "$pdir") - break - fi - done - case "$PORT_IFACE" in - phy*|wlan*) CONN_TYPE="wifi" ;; - "") ;; - *) CONN_TYPE="$PORT_IFACE" ;; - esac - fi - fi -fi - -if [ -n "$CONN_TYPE" ]; then - sed -i "/^$IP /d" "$CONN_CACHE" 2>/dev/null - echo "$IP $CONN_TYPE $(date +%s)" >> "$CONN_CACHE" -else - _arp_state=$(ip neigh show "$IP" 2>/dev/null | awk '{print $NF}') - case "$_arp_state" in - REACHABLE|STALE|DELAY|PROBE) CONN_TYPE="ethernet" ;; - *) - CONN_TYPE="?" - _cached=$(grep "^$IP " "$CONN_CACHE" 2>/dev/null | tail -1) - if [ -n "$_cached" ]; then - CONN_LAST=$(echo "$_cached" | awk '{print $2 "@" $3}') - fi - ;; - esac -fi - -# Check blocked status -BLOCKED=false -BLOCK_PACKETS=0 -BLOCK_BYTES=0 -if tctl_is_blocked "$IP"; then - BLOCKED=true - if [ "$TCTL_FW" = "nft" ]; then - # A block is two rules — the v4 one keyed on the address and the v6 one - # keyed on the MAC (see tctl_block_add) — so the counters are summed - # across both. The v6 rule carries no address, only its "_mac" comment. - block_line=$(nft list chain inet fw4 forward 2>/dev/null \ - | grep -e "ip saddr $IP.*drop" -e "comment \"$(tctl_block_comment "$IP")_mac\"") - BLOCK_PACKETS=$(echo "$block_line" | grep -oE 'packets [0-9]+' | awk '{ t += $2 } END { printf "%.0f", t }') - BLOCK_BYTES=$(echo "$block_line" | grep -oE 'bytes [0-9]+' | awk '{ t += $2 } END { printf "%.0f", t }') - else - block_line=$(iptables -L FORWARD -nvx 2>/dev/null | grep "DROP" | grep "$IP") - BLOCK_PACKETS=$(echo "$block_line" | awk '{print $1}') - BLOCK_BYTES=$(echo "$block_line" | awk '{print $2}') - fi -fi -[ -z "$BLOCK_PACKETS" ] && BLOCK_PACKETS=0 -[ -z "$BLOCK_BYTES" ] && BLOCK_BYTES=0 - -# Check wifi blocked -WIFI_BLOCKED=false -if [ -n "$MAC" ]; then - IFACES=$(tctl_get_wifi_interfaces) - for iface in $IFACES; do - maclist=$(uci -q get "wireless.${iface}.maclist") - listed=0 - echo "$maclist" | grep -qi "$MAC" && listed=1 - # Being listed means the opposite thing per policy: on a deny radio a - # listed MAC is blocked, on an allow (whitelist) radio an UNlisted one is. - if [ "$(tctl_get_wifi_filter_mode "$iface")" = "allow" ]; then - [ "$listed" = "0" ] && { WIFI_BLOCKED=true; break; } - else - [ "$listed" = "1" ] && { WIFI_BLOCKED=true; break; } - fi - done -fi - -# Get rate limit, each direction: upload has its own ceiling since #83. -RATE_LIM=0; RATE_LIM_UP=0 -if [ "$TCTL_FW" = "nft" ]; then - RL_DUMP=$(nft list table netdev tm_ratelimit 2>/dev/null) - RATE_LIM=$(echo "$RL_DUMP" | tctl_rl_rate_kbit "$IP") - RATE_LIM_UP=$(echo "$RL_DUMP" | tctl_rl_rate_kbit "$IP" saddr) -else - # The address as a whole field, not a substring (see tctl_rl_rate_kbit). - # The download rule is listed first; the upload one is the "_ul" name. - RL_DUMP=$(iptables -t mangle -L FORWARD -nv 2>/dev/null | grep "rl_ratelimit" \ - | awk -v ip="$IP" '{ for (i = 1; i <= NF; i++) if ($i == ip || $i == ip "/32") { print; next } }') - RATE_LIM=$(echo "$RL_DUMP" | awk "$TCTL_NFT_RATE_AWK"'{ r = tctl_ipt_first_rate(); if (r >= 0) { print r; exit } }') - RATE_LIM_UP=$(echo "$RL_DUMP" | grep -E 'rl_ratelimit.*_ul' \ - | awk "$TCTL_NFT_RATE_AWK"'{ r = tctl_ipt_first_rate(); if (r >= 0) { print r; exit } }') -fi -[ -z "$RATE_LIM" ] && RATE_LIM=0 -[ -z "$RATE_LIM_UP" ] && RATE_LIM_UP=0 - -# Get shape rate. The classid is looked up in shapes.json, never derived from -# the address: minors are allocated (see lookup_shape_kbit in -# trafficctl-summary.sh). Download is the class on the LAN device, upload the -# one with the same classid on the IFB. -SHAPE_KBIT=0; SHAPE_KBIT_UP=0 -classid=$(tctl_shape_classmap | awk -v ip="$IP" '$1==ip{print $2; exit}') -if [ -n "$classid" ]; then - SHAPE_KBIT=$(tctl_tc_class_rates "$LAN_DEV" | awk -v c="$classid" '$1==c{print $2; exit}') - SHAPE_KBIT_UP=$(tctl_tc_class_rates "$(tctl_shape_ifb_dev)" | awk -v c="$classid" '$1==c{print $2; exit}') -fi -[ -z "$SHAPE_KBIT" ] && SHAPE_KBIT=0 -[ -z "$SHAPE_KBIT_UP" ] && SHAPE_KBIT_UP=0 - -# Parse conntrack for connections and totals -TIMESTAMP=$(date +%s) -CONNTRACK_DATA=$(cat /proc/net/nf_conntrack 2>/dev/null | grep "src=$IP ") - -# Compute metadata (totals + states) -META_LINE=$(echo "$CONNTRACK_DATA" | awk -v ip="$IP" -v pf="$PROTO_FILTER" ' -BEGIN { total=0; n_tcp=0; n_udp=0; n_other=0; est=0; tw=0; ss=0; cw=0 } -{ - proto="" - for (i=1; i<=NF; i++) { - if ($i == "tcp") proto="tcp" - else if ($i == "udp") proto="udp" - else if ($i == "icmp") proto="icmp" - } - if (pf != "all" && proto != pf) next - - dst=""; bytes=0; state="" - src_key = "src=" ip - seen_src=0; got_dst=0 - for (i=1; i<=NF; i++) { - if ($i == src_key && !seen_src) { seen_src=1; continue } - if (seen_src && !got_dst && index($i, "dst=") == 1) { dst=substr($i, 5); got_dst=1 } - if (seen_src && !got_dst) continue - if (seen_src && index($i, "bytes=") == 1 && bytes == 0) { bytes=substr($i, 7)+0 } - if ($i == "ESTABLISHED") state="ESTABLISHED" - else if ($i == "TIME_WAIT") state="TIME_WAIT" - else if ($i == "SYN_SENT") state="SYN_SENT" - else if ($i == "CLOSE_WAIT") state="CLOSE_WAIT" - } - if (dst == "" || dst == ip) next - total += bytes - if (proto == "tcp") n_tcp++ - else if (proto == "udp") n_udp++ - else n_other++ - if (state == "ESTABLISHED") est++ - else if (state == "TIME_WAIT") tw++ - else if (state == "SYN_SENT") ss++ - else if (state == "CLOSE_WAIT") cw++ -} -END { printf "%.0f %d %d %d %d %d %d %d", total, n_tcp, n_udp, n_other, est, tw, ss, cw } -') - -TOTAL=$(echo "$META_LINE" | awk '{print $1}') -N_TCP=$(echo "$META_LINE" | awk '{print $2}') -N_UDP=$(echo "$META_LINE" | awk '{print $3}') -N_OTHER=$(echo "$META_LINE" | awk '{print $4}') -EST=$(echo "$META_LINE" | awk '{print $5}') -TW=$(echo "$META_LINE" | awk '{print $6}') -SS=$(echo "$META_LINE" | awk '{print $7}') -CW=$(echo "$META_LINE" | awk '{print $8}') - -[ -z "$TOTAL" ] && TOTAL=0 -[ -z "$N_TCP" ] && N_TCP=0 -[ -z "$N_UDP" ] && N_UDP=0 -[ -z "$N_OTHER" ] && N_OTHER=0 -[ -z "$EST" ] && EST=0 -[ -z "$TW" ] && TW=0 -[ -z "$SS" ] && SS=0 -[ -z "$CW" ] && CW=0 - -# Build connections JSON array -# Resolve egress interface per destination for policy-routed connections -# (mwan3 etc.). Only connections carrying a NON-zero conntrack mark are -# resolved: `ip route get mark ` honours the fwmark ip-rules, so it -# reports the WAN that mwan3 actually selected. mark=0 connections (no policy -# routing, e.g. plain single-WAN or podkop) are left blank instead of showing a -# misleading main-table egress. -OIF_MAP="/tmp/trafficctl_oif_$$" -: > "$OIF_MAP" -if command -v ip >/dev/null 2>&1; then - echo "$CONNTRACK_DATA" | awk -v ip="$IP" ' - { dst=""; mark="0"; sk="src=" ip; seen=0; got=0 - for (i=1; i<=NF; i++) { - if ($i==sk && !seen) { seen=1; continue } - if (seen && !got && index($i,"dst=")==1) { dst=substr($i,5); got=1 } - if (index($i,"mark=")==1) mark=substr($i,6) - } - if (dst!="" && dst!=ip && mark!="0" && mark!="") print dst, mark - }' | sort -u | while read -r dip dmark; do - [ -n "$dip" ] || continue - dev=$(ip route get "$dip" mark "$dmark" 2>/dev/null | grep -oE 'dev [^ ]+' | head -1 | cut -d' ' -f2) - case "$dev" in lo|"") continue ;; esac - echo "$dip $dev" >> "$OIF_MAP" - done -fi - -# The kernel device is not what the user named the interface: mwan3 egress is -# "awg3", the network is "Finland" (#10). The uci name comes from the role map -# trafficctl-ifaces.sh already memoizes in tmpfs — the overview polls it, so it -# is normally warm. Built here only when it is missing and there is something -# to label, never per connection. -IFROLE_CACHE="${TCTL_IFROLE_CACHE:-/tmp/trafficctl_ifroles}" -if [ -s "$OIF_MAP" ] && [ ! -s "$IFROLE_CACHE" ]; then - /usr/local/bin/trafficctl-ifaces.sh >/dev/null 2>&1 -fi - -CONNS_OUT=$(echo "$CONNTRACK_DATA" | awk -v ip="$IP" -v pf="$PROTO_FILTER" -v oifmap="$OIF_MAP" -v ifroles="$IFROLE_CACHE" ' -BEGIN { - n=0 - while ((getline line < oifmap) > 0) { split(line, p, " "); oifdev[p[1]] = p[2] } - close(oifmap) - # "dev role tunnel primary defroute enslaved label", label "-" when the - # device has no uci interface. Header lines start with "#". - while ((getline line < ifroles) > 0) { - if (substr(line, 1, 1) == "#") continue - if (split(line, f, " ") < 7 || f[7] == "-") continue - oiflbl[f[1]] = f[7] - } - close(ifroles) -} -{ - proto="" - for (i=1; i<=NF; i++) { - if ($i == "tcp") proto="tcp" - else if ($i == "udp") proto="udp" - else if ($i == "icmp") proto="icmp" - } - if (pf != "all" && proto != pf) next - - dst=""; dport=""; bytes=0; state="" - src_key = "src=" ip - seen_src=0; got_dst=0 - for (i=1; i<=NF; i++) { - if ($i == src_key && !seen_src) { seen_src=1; continue } - if (seen_src && !got_dst && index($i, "dst=") == 1) { dst=substr($i, 5); got_dst=1 } - if (seen_src && !got_dst) continue - if (seen_src && index($i, "dport=") == 1 && dport == "") dport=substr($i, 7) - if (seen_src && index($i, "bytes=") == 1 && bytes == 0) bytes=substr($i, 7)+0 - if ($i == "ESTABLISHED") state="ESTABLISHED" - else if ($i == "TIME_WAIT") state="TIME_WAIT" - else if ($i == "SYN_SENT") state="SYN_SENT" - else if ($i == "CLOSE_WAIT") state="CLOSE_WAIT" - else if ($i == "FIN_WAIT") state="FIN_WAIT" - } - if (dst == "" || dst == ip) next - if (dport == "") dport = "0" - - # Service name lookup - svc="" - if (dport == "80") svc="http" - else if (dport == "443") svc="https" - else if (dport == "53") svc="dns" - else if (dport == "22") svc="ssh" - else if (dport == "123") svc="ntp" - else if (dport == "5353") svc="mdns" - else if (dport == "21") svc="ftp" - else if (dport == "25") svc="smtp" - else if (dport == "993") svc="imaps" - else if (dport == "8080") svc="http-alt" - - odev = ""; oif = "" - if (dst in oifdev) { odev = oifdev[dst]; oif = odev } - if (odev in oiflbl) oif = oiflbl[odev] - if (n > 0) printf "," - printf "{\"proto\":\"%s\",\"dst\":\"%s\",\"host\":\"\",\"port\":%s,\"service\":\"%s\",\"bytes\":%.0f,\"state\":\"%s\",\"oif\":\"%s\",\"oif_dev\":\"%s\"}", proto, dst, dport, svc, bytes, state, oif, odev - n++ -} -') -rm -f "$OIF_MAP" - -# Optionally resolve DNS for connection destinations -if [ "$DO_RDNS" = "1" ]; then - DST_IPS=$(echo "$CONNTRACK_DATA" | grep -oE 'dst=[0-9.]+' | sed 's/dst=//' | sort -u | grep -v "^$IP$") - if [ -n "$DST_IPS" ]; then - RDNS_MAP="/tmp/trafficctl_rdns_$$" - # shellcheck disable=SC2064 - trap "rm -f '$RDNS_MAP'" EXIT INT TERM - : > "$RDNS_MAP" - RDNS_DONE=0 - # Batch resolve via ubus network.rrdns (same as LuCI frontend; no extra packages needed) - if command -v ubus >/dev/null 2>&1; then - ADDRS_JSON=$(echo "$DST_IPS" | awk '{printf "%s\"%s\"", (NR>1?",":""), $1}') - RDNS_RESULT=$(ubus call network.rrdns lookup \ - "{\"addrs\":[$ADDRS_JSON],\"timeout\":3000,\"limit\":64}" 2>/dev/null) - if [ -n "$RDNS_RESULT" ]; then - RDNS_DONE=1 - for dip in $DST_IPS; do - host=$(printf '%s' "$RDNS_RESULT" | jsonfilter -e "@[\"$dip\"]" 2>/dev/null) - case "$host" in - *[!a-zA-Z0-9._-]*|"") continue ;; - esac - echo "$dip $host" >> "$RDNS_MAP" - done - fi - fi - # Fallback: per-IP nslookup (BusyBox, always available on OpenWrt) - if [ "$RDNS_DONE" = "0" ] && command -v nslookup >/dev/null 2>&1; then - for dip in $DST_IPS; do - host=$(nslookup "$dip" 2>/dev/null | sed -n 's/.*name = \(.*\)\.$/\1/p' | head -1) - case "$host" in - *[!a-zA-Z0-9._-]*|"") continue ;; - esac - echo "$dip $host" >> "$RDNS_MAP" - done - fi - if [ -s "$RDNS_MAP" ]; then - # Build sed expression from map - SED_EXPR=$(awk '{printf "s|\"dst\":\"%s\",\"host\":\"\"|\"dst\":\"%s\",\"host\":\"%s\"|g\n", $1, $1, $2}' "$RDNS_MAP") - CONNS_OUT=$(printf "%s" "$CONNS_OUT" | sed "$SED_EXPR") - fi - rm -f "$RDNS_MAP" - fi -fi - -# Listed as blocked yet associated right now = the radio never got the block. -WIFI_PENDING=false -tctl_wifi_block_pending "$([ "$WIFI_BLOCKED" = "true" ] && echo 1 || echo 0)" "$CONN_TYPE" \ - && WIFI_PENDING=true - -# Output final JSON -printf '{"ip":"%s","name":"%s","mac":"%s","conn_type":"%s","conn_last":"%s","timestamp":%d,"blocked":%s,"block_packets":%d,"block_bytes":%.0f,"wifi_blocked":%s,"wifi_block_pending":%s,"total":%.0f,"protocols":{"tcp":%d,"udp":%d,"other":%d},"tcp_states":{"established":%d,"time_wait":%d,"syn_sent":%d,"close_wait":%d},"connections":[%s],"rate_limit_kbit":%d,"rate_limit_kbit_up":%d,"shape_kbit":%d,"shape_kbit_up":%d}\n' \ - "$IP" "$NAME" "$MAC" "$CONN_TYPE" "$CONN_LAST" "$TIMESTAMP" "$BLOCKED" "$BLOCK_PACKETS" "$BLOCK_BYTES" \ - "$WIFI_BLOCKED" "$WIFI_PENDING" "$TOTAL" "$N_TCP" "$N_UDP" "$N_OTHER" \ - "$EST" "$TW" "$SS" "$CW" "$CONNS_OUT" "$RATE_LIM" "$RATE_LIM_UP" "$SHAPE_KBIT" "$SHAPE_KBIT_UP" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-fw.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-fw.sh deleted file mode 100755 index 73e318c17..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-fw.sh +++ /dev/null @@ -1,1458 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Firewall abstraction layer for trafficctl. -# Detects nft vs iptables and provides unified functions. -# Source this file: . /usr/local/bin/trafficctl-fw.sh - -if command -v nft >/dev/null 2>&1 && nft list tables 2>/dev/null | grep -q .; then - TCTL_FW="nft" -else - TCTL_FW="iptables" -fi - -# ── MAC-keyed matching (address-family independent) ──────────────────────── -# -# Everything in this package is keyed on the IPv4 address a DHCP lease gives a -# device, and every enforcement rule matches "ip saddr"/"ip daddr" — so IPv6 -# walks past all of it (issue #67: 9.96 Mbit/s over v4 against a 10 Mbit/s cap, -# 151 Mbit/s over v6 to the same endpoint). -# -# The fix is NOT "add ip6 saddr next to ip saddr": with SLAAC and privacy -# extensions a client holds several v6 addresses at once and rotates them on a -# timer, so a rule written against one stops matching without warning — the -# same silent bypass, reached more slowly. The MAC does not rotate, and on the -# hooks used here the client's own frame is still intact, so it is what the v6 -# rules are keyed on. -# -# Only the directions where that holds are covered; see tctl_block_add and -# tctl_ratelimit_add for which, and README/COMPATIBILITY for what is not. - -# Named by absolute path, as it must be on the router; the tests sed this line -# into their scratch directory rather than have the shipped script carry a -# test-only override (same approach as the ledger and shapes paths below). -TCTL_LEASES_FILE="/tmp/dhcp.leases" - -# The MAC behind an IPv4 address: DHCP lease first, neighbour table second. -# Fails (non-zero, no output) when neither knows it — a routed/downstream -# client has no lease and no neighbour entry here, and there is nothing to key -# a rule on. Callers must report that rather than assume coverage. -# -# The result is validated strictly, not merely trimmed: it is interpolated -# into an nft rule string, so anything but six hex pairs is refused. -tctl_lookup_mac() { - local addr="$1" mac - tctl_validate_ip "$addr" || return 1 - mac=$(awk -v ip="$addr" '$3 == ip { print $2; exit }' "$TCTL_LEASES_FILE" 2>/dev/null) - [ -z "$mac" ] && mac=$(ip neigh show 2>/dev/null | awk -v ip="$addr" ' - $1 == ip { for (i = 1; i < NF; i++) if ($i == "lladdr") { print $(i+1); exit } }') - mac=$(printf '%s' "$mac" | tr 'A-F' 'a-f') - case "$mac" in - [0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]) ;; - *) return 1 ;; - esac - printf '%s\n' "$mac" -} - -# True when this address is the next hop of a route, i.e. a router rather than -# an end device. Its MAC is the source of every packet it FORWARDS, so a -# MAC-keyed rule aimed at it would also hit every client behind it — blocking -# one device would black-hole a whole subnet. Those addresses are excluded and -# the caller says so out loud. -tctl_ip_is_nexthop() { - local addr="$1" - [ -n "$addr" ] || return 1 - ip route show 2>/dev/null | awk -v n="$addr" ' - { for (i = 1; i < NF; i++) if ($i == "via" && $(i+1) == n) { hit = 1; exit } } - END { exit hit ? 0 : 1 }' -} - -# The MAC to key a target's IPv6 rules on, or failure. A CIDR target has no -# single MAC; a next hop's MAC is not its own traffic. -tctl_target_mac() { - local t="$1" - case "$t" in - */32) t=${t%/32} ;; - */*) return 1 ;; - esac - tctl_ip_is_nexthop "$t" && return 1 - tctl_lookup_mac "$t" -} - -# Flush a device's live IPv6 flows. -# -# "conntrack -D -s " only touches the IPv4 table, so without this an -# established v6 flow survives a block that was just installed — and with flow -# offload it is never re-evaluated by the forward chain again, so it survives -# indefinitely. That is the same "a block that does not block" failure in a new -# place, on the offload-enabled hardware most likely to hit it. -# -# Addresses come from a one-shot neighbour snapshot. Reading them is sound even -# though a RULE written against them would not be: the snapshot cannot go stale -# between here and the next statement, whereas a rule has to stay correct for -# as long as the block lasts. -tctl_conntrack_flush_v6() { - local mac="$1" addr - [ -n "$mac" ] || return 0 - command -v conntrack >/dev/null 2>&1 || return 0 - ip -6 neigh show 2>/dev/null | awk -v m="$mac" ' - { for (i = 1; i < NF; i++) if ($i == "lladdr" && tolower($(i+1)) == m) { print $1; break } } - ' | while read -r addr; do - case "$addr" in - ''|*[!0-9a-fA-F:]*) continue ;; - esac - conntrack -D -f ipv6 -s "$addr" >/dev/null 2>&1 - conntrack -D -f ipv6 -d "$addr" >/dev/null 2>&1 - done - return 0 -} - -# ── Rate Limiting (policer) ──────────────────────────────────────────────── - -# Rate limits are symmetric: the same ceiling is policed in both directions. -# -# Download is caught at WAN ingress (packets arriving for the client) and -# upload at LAN ingress (packets the client sends into the router). Policing -# upload on the way IN is what makes it work for downstream/routed clients -# too — their packets still enter over a LAN device with the client's source -# address, whatever router sits behind it. -# mode: "each" gives every address inside the target its own bucket (an nft -# meter keyed by address); "shared" makes the whole target share one bucket. -# For a single host the two are identical. -tctl_ratelimit_add() { - local ip="$1" rate_kbit="$2" comment="$3" mode="${4:-shared}" rate_kbit_up="$5" - # Empty means "same as download" — the only meaning this had before the two - # directions could differ. Not zero: a zero ceiling policed every packet and - # would be a silent total block reported as a successful limit. - [ -z "$rate_kbit_up" ] && rate_kbit_up="$rate_kbit" - # bytes/second, not kbytes: see tctl_rate_bytes. - local rate_b rate_b_up - rate_b=$(tctl_rate_bytes "$rate_kbit") - rate_b_up=$(tctl_rate_bytes "$rate_kbit_up") - - local slug dl_expr ul_expr ul6_expr dl6_expr feed6_expr v6set mac - slug=$(tctl_target_slug "$ip") - # The two directions were already separate rules on separate hooks — they - # were symmetric only because both took the same number. - if [ "$mode" = "each" ]; then - dl_expr="ip daddr $ip meter tctl_d_$slug { ip daddr limit rate over ${rate_b} bytes/second }" - ul_expr="ip saddr $ip meter tctl_u_$slug { ip saddr limit rate over ${rate_b_up} bytes/second }" - else - dl_expr="ip daddr $ip limit rate over ${rate_b} bytes/second" - ul_expr="ip saddr $ip limit rate over ${rate_b_up} bytes/second" - fi - - # Upload over IPv6, keyed on the MAC: at LAN ingress the frame is still - # the client's own, so "ether saddr" identifies it whatever address family - # it is using. - # - # Scoped to IPv6 on purpose: IPv4 keeps being policed by exactly the rule it - # always was, so nothing about existing behaviour depends on whether this - # lookup succeeds — and an unscoped ether rule would police a dual-stack - # client's v4 traffic TWICE, halving the ceiling it was given. Its own - # bucket, too: sharing one would make the v4 and v6 halves cannibalise each - # other's allowance, which is not what "10 Mbit/s" has ever meant here. - # - # The scope is "meta protocol ip6", NOT "meta nfproto ipv6" — these chains - # are in the NETDEV family, where nft rejects nfproto outright ("meta - # nfproto is only useful in the inet family", verified with nft --check - # against nftables 1.1.1 / kernel 6.6). nfproto is what tctl_block_add uses, - # because that rule lives in inet fw4. Same intent, different family, and - # the wrong one does not silently under-match — it fails to load. - # - # Download over IPv6 cannot be keyed on the MAC: at LAN egress the L2 - # header is not built yet. It is matched on the device's v6 ADDRESSES, - # which is only sound if the set of them can never go stale — SLAAC - # privacy extensions rotate them, and a set that misses the current one - # is a silent bypass. So the set is not written from a neighbour-table - # snapshot that something would have to keep refreshing; the data path - # fills it. Every v6 packet the client sends crosses LAN ingress with its - # own MAC, and the feed rule there adds its source address with a timeout - # ("update" re-arms it on every packet, so an address in use never - # expires). A new temporary address is in the set from its first packet, - # one that stopped being used drops out after the timeout. Download that - # no packet from the client ever preceded is the only thing that is not - # covered, and for TCP there is none. Link-local is left out: it never - # crosses the router. - # - # Verified on kernel 6.12 / nftables 1.0.9 with a client in its own netns - # behind a bridge: one ping from a privacy address put that address in the - # set, and a 5 Mbit/s limit held an iperf3 download to it at ~6 Mbit/s. - ul6_expr=""; dl6_expr=""; feed6_expr="" - v6set="tctl_v6_$slug" - if mac=$(tctl_target_mac "$ip"); then - ul6_expr="meta protocol ip6 ether saddr $mac limit rate over ${rate_b_up} bytes/second" - feed6_expr="meta protocol ip6 ether saddr $mac ip6 saddr != fe80::/10 update @$v6set { ip6 saddr }" - dl6_expr="meta protocol ip6 ip6 daddr @$v6set limit rate over ${rate_b} bytes/second" - fi - - if [ "$TCTL_FW" = "nft" ]; then - nft add table netdev tm_ratelimit 2>/dev/null - # The set has to exist before any rule that names it. Without it the - # v6 download half is skipped and reported as such, never half-built. - if [ -n "$dl6_expr" ] && ! nft add set netdev tm_ratelimit "$v6set" \ - "{ type ipv6_addr; flags dynamic,timeout; timeout ${TCTL_V6SET_TIMEOUT:-1h}; }" 2>/dev/null; then - feed6_expr=""; dl6_expr="" - fi - - # Download is policed at LAN EGRESS, not WAN ingress. - # - # With masquerading on, a reply arriving at WAN ingress is still - # addressed to the router's own WAN address: conntrack only restores - # the client's address in prerouting, which runs after the netdev - # ingress hook. So "ip daddr " there matches nothing for any - # NATed client. At LAN egress the translation has happened and the - # destination is the real client address. - # Note the asymmetry with the upload hooks: ingress must bind the - # bridge PORTS (a bridge sees nothing on ingress), while egress must - # bind the BRIDGE itself — routed traffic is transmitted to br-lan by - # the IP stack, and the port-level egress hook never fires for it. - # Verified on kernel 6.12: br-lan egress counted every packet, the - # ports counted none. - local dev chain dl_ok=0 dl6_ok=0 wan_dev - for dev in $(tctl_get_lan_devices); do - chain=$(tctl_egress_chain "$dev") - nft add chain netdev tm_ratelimit "$chain" \ - "{ type filter hook egress device $dev priority 0; policy accept; }" 2>/dev/null - nft add rule netdev tm_ratelimit "$chain" \ - "$dl_expr counter drop comment \"$comment\"" 2>/dev/null \ - && dl_ok=1 - [ -n "$dl6_expr" ] || continue - nft add rule netdev tm_ratelimit "$chain" \ - "$dl6_expr counter drop comment \"${comment}_dl6\"" 2>/dev/null \ - && dl6_ok=1 - done - # Kernels older than 5.16 have no netdev egress hook; fall back to WAN - # ingress, which is correct as long as the client isn't masqueraded. - # IPv6 is not masqueraded at all, so the v6 rule is correct there too. - if [ "$dl_ok" = "0" ] && wan_dev=$(tctl_get_wan_device); then - nft add chain netdev tm_ratelimit dl \ - "{ type filter hook ingress device $wan_dev priority -200; policy accept; }" 2>/dev/null - nft add rule netdev tm_ratelimit dl \ - "$dl_expr counter drop comment \"$comment\"" 2>/dev/null \ - && dl_ok=1 - [ -n "$dl6_expr" ] && nft add rule netdev tm_ratelimit dl \ - "$dl6_expr counter drop comment \"${comment}_dl6\"" 2>/dev/null \ - && dl6_ok=1 - fi - # Set for the caller to inspect (see trafficctl-ratelimit.sh). - # shellcheck disable=SC2034 - [ "$dl_ok" = "1" ] || TCTL_RL_DOWNLOAD_FAILED=1 - - # One chain per ingress device: a device that refuses the hook then - # only loses its own chain instead of taking the whole set with it. - local dev chain - local ul_ok=0 ul6_ok=0 feed6_ok=0 - for dev in $(tctl_ingress_devices); do - chain=$(tctl_ingress_chain "$dev") - nft add chain netdev tm_ratelimit "$chain" \ - "{ type filter hook ingress device $dev priority -200; policy accept; }" 2>/dev/null - nft add rule netdev tm_ratelimit "$chain" \ - "$ul_expr counter drop comment \"${comment}_ul\"" 2>/dev/null \ - && ul_ok=1 - [ -n "$ul6_expr" ] || continue - # Feed before police, so a packet the upload limit drops still - # keeps its address in the download set. - [ -n "$feed6_expr" ] && nft add rule netdev tm_ratelimit "$chain" \ - "$feed6_expr comment \"${comment}_v6\"" 2>/dev/null \ - && feed6_ok=1 - nft add rule netdev tm_ratelimit "$chain" \ - "$ul6_expr counter drop comment \"${comment}_ul6\"" 2>/dev/null \ - && ul6_ok=1 - done - # shellcheck disable=SC2034 - [ "$ul_ok" = "1" ] || TCTL_RL_UPLOAD_FAILED=1 - # Set for the caller to report: "limited" means v4 only unless this is 1. - # shellcheck disable=SC2034 - TCTL_RL_UPLOAD6_OK="$ul6_ok" - # A download rule over a set nothing feeds matches nothing, so it only - # counts when both halves loaded. - # shellcheck disable=SC2034 - if [ "$dl6_ok" = "1" ] && [ "$feed6_ok" = "1" ]; then - TCTL_RL_DOWNLOAD6_OK=1 - else - TCTL_RL_DOWNLOAD6_OK=0 - fi - else - # fw3/iptables stays IPv4-only. A half-built ip6tables path would be - # worse than a stated gap; see docs/COMPATIBILITY.md. - # shellcheck disable=SC2034 - TCTL_RL_UPLOAD6_OK=0 - # shellcheck disable=SC2034 - TCTL_RL_DOWNLOAD6_OK=0 - # shellcheck disable=SC2046 # deliberate split into the option words - iptables -t mangle -A FORWARD -d "$ip" -m hashlimit \ - $(tctl_ipt_limit_args "$rate_kbit") \ - --hashlimit-mode dstip --hashlimit-name "rl_${comment}" \ - -j DROP -m comment --comment "$comment" 2>/dev/null - # shellcheck disable=SC2046 # deliberate split into the option words - iptables -t mangle -A FORWARD -s "$ip" -m hashlimit \ - $(tctl_ipt_limit_args "$rate_kbit_up") \ - --hashlimit-mode srcip --hashlimit-name "rl_${comment}_ul" \ - -j DROP -m comment --comment "${comment}_ul" 2>/dev/null - fi -} - -tctl_ratelimit_remove() { - local ip="$1" comment="$2" - local chain h - - if [ "$TCTL_FW" = "nft" ]; then - # Scan the whole table once: rules for this IP live in the dl chains - # (daddr, plus _dl6 over the v6 address set), in one ul_ chain per - # ingress device (saddr), and — for a host with a known MAC — the - # IPv6-scoped _ul6 rule and the _v6 rule feeding the set in each of - # those. - # - # Each comment is matched in FULL, closing quote included. The suffixes - # are prefixes of one another ("_ul" of "_ul6"), and every comment ends - # in an address slug, so a substring match would have a limit on - # 192.168.1.1 delete 192.168.1.10's rules as well. - nft -a list table netdev tm_ratelimit 2>/dev/null | awk -v cmt="$comment" ' - /^[ \t]*chain [a-zA-Z0-9_]+ \{/ { chain = $2; next } - index($0, "\"" cmt "\"") || index($0, "\"" cmt "_ul\"") || - index($0, "\"" cmt "_ul6\"") || index($0, "\"" cmt "_dl6\"") || - index($0, "\"" cmt "_v6\"") { - for (i = 1; i < NF; i++) - if ($i == "handle") { print chain, $(i+1); break } - }' | while read -r chain h; do - [ -n "$chain" ] && [ -n "$h" ] && nft delete rule netdev tm_ratelimit "$chain" handle "$h" 2>/dev/null - done - # Only once nothing references it: nft refuses to delete a set in use. - nft delete set netdev tm_ratelimit "tctl_v6_$(tctl_target_slug "$ip")" 2>/dev/null - else - while iptables -t mangle -D FORWARD -d "$ip" -m comment --comment "$comment" 2>/dev/null; do :; done - while iptables -t mangle -D FORWARD -s "$ip" -m comment --comment "${comment}_ul" 2>/dev/null; do :; done - fi -} - -# Download ceiling in kbit/s of the limit on one address, read from an -# "nft list table netdev tm_ratelimit" dump on stdin; nothing when it has none. -# -# The address is compared as a whole FIELD. A grep for "daddr " also -# matched every address it is a prefix of, so 192.168.1.5 reported -# 192.168.1.50's limit, and the dots matched any character besides. Only the -# first rule counts: the download rule is installed on every LAN device's -# egress chain, so a router with several bridges holds several copies, and -# printing all of them handed printf a multi-line "number". -# -# nft prints the rate in the largest unit that keeps it whole, and its units -# step by 1024, not 1000: 1024 bytes/second lists as "1 kbytes/second" and -# 1024 kbytes/second as "1 mbytes/second" (verified with nftables 1.0.9). -# The readers that only knew "kbytes" turned the latter into 0 — or, in the -# stats, into 8 kbit/s. Every unit goes back to bytes by nft's factor, and -# bytes to kbit by the package's own, SI (see tctl_rate_bytes). -# -# The second argument picks the direction: "daddr" (the default) is the -# download rule, "saddr" the IPv4 upload one, which carries its own ceiling -# since the two directions could differ (#83). -tctl_rl_rate_kbit() { - awk -v ip="$1" -v fld="${2:-daddr}" "$TCTL_NFT_RATE_AWK"' - /limit rate over/ { - hit = 0 - for (i = 1; i < NF; i++) - if ($i == fld && ($(i+1) == ip || $(i+1) == ip "/32")) { hit = 1; break } - if (!hit) next - for (j = i; j < NF - 1; j++) - if ($j == "over") { printf "%.0f\n", tctl_rate_kbit($(j+1), $(j+2)); exit } - }' -} - -# A kbit/s ceiling as the bytes/second an nft "limit rate" is written in. -# -# kbit/s here is SI, 1000 bits, as everywhere else in the package: the UI, -# tc ("kbit" is 1000 bits to tc as well) and the speed graphs. nft's -# "kbytes" is 1024 bytes, so writing rate_kbit / 8 kbytes — what the -# limiter did — policed 2.4% above the ceiling it was given: 5000 kbit/s -# became 5120. Bytes are exact (kbit * 1000 / 8 = kbit * 125). -tctl_rate_bytes() { - local b=$(( $1 * 125 )) - [ "$b" -lt 1 ] && b=1 - echo "$b" -} - -# awk function shared by every reader of an nft rate: tctl_rate_kbit(n, unit) -# turns "n /second" as nft lists it back into SI kbit/s. Prepended to -# an awk program; a rule written before rates were stored in bytes reads as -# what it actually polices (625 kbytes/second is 5120 kbit/s). -TCTL_NFT_RATE_AWK=' -function tctl_rate_kbit(n, u, b) { - if (u ~ /^bytes/) b = n - else if (u ~ /^kbytes/) b = n * 1024 - else if (u ~ /^mbytes/) b = n * 1024 * 1024 - else if (u ~ /^gbytes/) b = n * 1024 * 1024 * 1024 - else return 0 - # Rounded here, so a reader printing %d agrees with one printing %.0f. - return int(b * 8 / 1000 + 0.5) -} -# An iptables hashlimit rate as listed, e.g. "624992b/s" or "1213mb/s". -# iptables prints bytes in 1024 steps too. A packet rate ("5000/sec") is not a -# ceiling in kbit/s and reads 0. -function tctl_ipt_rate_kbit(t, n, u) { - if (!match(t, /^[0-9]+/)) return 0 - n = substr(t, 1, RLENGTH); u = substr(t, RLENGTH + 1) - if (u ~ /^b\//) return tctl_rate_kbit(n, "bytes") - if (u ~ /^kb\//) return tctl_rate_kbit(n, "kbytes") - if (u ~ /^mb\//) return tctl_rate_kbit(n, "mbytes") - if (u ~ /^gb\//) return tctl_rate_kbit(n, "gbytes") - return 0 -} -# The ceiling of the hashlimit rule on the current line: "above X" in an -# "iptables -L" listing, "--hashlimit-above X" in "iptables -S". -1 if none. -function tctl_ipt_first_rate( i) { - for (i = 1; i < NF; i++) - if ($i == "above" || $i == "--hashlimit-above") return tctl_ipt_rate_kbit($(i+1)) - return -1 -} -' - -# hashlimit arguments for a kbit/s ceiling, in BYTES. -# -# "${kbit}kbit/sec" is not a byte rate to hashlimit: it reads the number as -# PACKETS per second (iptables -S lists it back as "5000/sec"), and the -# "${kbit}kbit" burst written next to it is rejected outright ("bad value for -# option --hashlimit-burst", iptables 1.8.7 and 1.8.10). The 2>/dev/null after -# the rule hid that, so on fw3 no limit was ever installed. -# -# Bytes per second, SI like the nft side (tctl_rate_bytes). The burst is two -# seconds of the rate: hashlimit refuses a byte burst below about one second -# of it ("burst cannot be smaller than 125172064b" at 1 Gbit/s), and it is a -# 32-bit field, hence the cap, which puts the highest ceiling fw3 can -# express near 30 Gbit/s (10 Gbit/s is accepted, 40 is not). Verified on iptables-legacy 1.8.7 with iperf3 -# through a forwarding netns: 5, 50 and 1000 Mbit/s held at 4.9-4.97, 49-50.6 -# and 990-1003 Mbit/s. -tctl_ipt_limit_args() { - local b burst - b=$(tctl_rate_bytes "$1") - burst=$(( b * 2 )) - [ "$burst" -gt 4000000000 ] && burst=4000000000 - echo "--hashlimit-above ${b}b/s --hashlimit-burst ${burst}b" -} - -tctl_ratelimit_list() { - if [ "$TCTL_FW" = "nft" ]; then - nft list table netdev tm_ratelimit 2>/dev/null - else - iptables -t mangle -L FORWARD -nv --line-numbers 2>/dev/null | grep "rl_ratelimit" - fi -} - -# Which bucket layout a target gets when the caller names no mode. -# -# A block limited "shared" would let one device starve the rest, so per-device -# is the sane default whenever the target covers more than one address. Lives -# here rather than in trafficctl-ratelimit.sh because the reboot-restore hook -# has to reach the same answer for a record written before modes were stored — -# two copies of this rule would mean a limit that changes meaning on reboot. -tctl_ratelimit_default_mode() { - case "$1" in - */32) echo "shared" ;; # a /32 is one host; both modes are identical - */*) echo "each" ;; # any wider block: per-device buckets - *) echo "shared" ;; # bare host address - esac -} - -# ── Internet Blocking ────────────────────────────────────────────────────── - -# A block is two rules: the address-keyed one for IPv4, and a MAC-keyed one -# scoped to IPv6. -# -# This is the row of issue #67 that matters most. A rate limit that under- -# delivers shows up in a speed test; a block that reports success while the -# device keeps full, unmetered IPv6 access is invisible until it matters — and -# "block internet" is what people reach for as a parental control. -# -# The MAC is resolved HERE rather than in trafficctl-block.sh because three -# callers reach this function: the block script, the Telegram bot, and the -# ifup-lan restore hook. Resolving it in the script would bring every persisted -# block back IPv4-only after each reboot. -# -# "meta nfproto ipv6" keeps the two rules disjoint: IPv4 is still dropped by -# precisely the rule it always was, so a failed MAC lookup costs the v6 half -# and nothing else. (nfproto is correct HERE, in the inet family; the limiter's -# netdev chains need "meta protocol ip6" instead — see tctl_ratelimit_add.) -# `insert`, not `add`, for the same reason the v4 rule uses it — fw4's forward -# chain accepts established/offloaded flows near the top, and a rule appended -# below that is dead. -tctl_block_add() { - local ip="$1" comment="$2" mac rc - - if [ "$TCTL_FW" = "nft" ]; then - nft insert rule inet fw4 forward "ip saddr $ip counter drop comment \"$comment\"" - rc=$? - # Whether the v6 half is live. Read by callers; see trafficctl-block.sh. - # shellcheck disable=SC2034 - TCTL_BLOCK_IPV6=0 - if mac=$(tctl_target_mac "$ip"); then - nft insert rule inet fw4 forward \ - "meta nfproto ipv6 ether saddr $mac counter drop comment \"${comment}_mac\"" \ - 2>/dev/null && TCTL_BLOCK_IPV6=1 - fi - return "$rc" - else - # fw3/iptables stays IPv4-only; see docs/COMPATIBILITY.md. - # shellcheck disable=SC2034 - TCTL_BLOCK_IPV6=0 - iptables -I FORWARD -s "$ip" -j DROP -m comment --comment "$comment" - fi -} - -tctl_block_remove() { - local ip="$1" comment="$2" - - if [ "$TCTL_FW" = "nft" ]; then - # Match the quoted comment in full: comments end in the address, so a - # substring match on 192.168.1.1 also deletes the rule for 192.168.1.10. - # The IPv6 half carries no address to match on at all, only its own - # "_mac" comment — which is why it is listed explicitly here rather - # than being caught by a looser pattern. - for h in $(nft -a list chain inet fw4 forward 2>/dev/null \ - | awk -v cmt="$comment" 'index($0, "\"" cmt "\"") || - index($0, "\"" cmt "_mac\"") { - for (i = 1; i < NF; i++) - if ($i == "handle") { print $(i+1); break } - }'); do - nft delete rule inet fw4 forward handle "$h" - done - else - while iptables -D FORWARD -s "$ip" -m comment --comment "$comment" -j DROP 2>/dev/null; do :; done - fi -} - -tctl_is_blocked() { - local ip="$1" dump comment - if [ "$TCTL_FW" = "nft" ]; then - dump=$(nft list chain inet fw4 forward 2>/dev/null) - # The v4 rule is still found by address, so blocks written by versions - # that derived the comment from the caller's label keep reading as - # blocked. - echo "$dump" | grep -q "ip saddr $ip .*drop" && return 0 - # The v6 rule names a MAC, not an address — its comment is the only - # handle on it, and it is matched in full for the reason above. - comment=$(tctl_block_comment "$ip") - echo "$dump" | grep -qF "comment \"${comment}_mac\"" - else - # The source renders as its own column, "ip" or "ip/32"; an unanchored - # match would report 192.168.1.10's rule as belonging to 192.168.1.1. - iptables -L FORWARD -n 2>/dev/null | awk -v ip="$ip" ' - $1 == "DROP" { - src = $4 - sub(/\/32$/, "", src) - if (src == ip) { found = 1; exit } - } - END { exit(found ? 0 : 1) }' - fi -} - -# ── Helpers ──────────────────────────────────────────────────────────────── - -# Resolve the WAN device to a name that actually exists as a netdev. -# -# The old fallback returned the literal string "wan", which is an interface -# NAME, not a device — nft then rejected the chain ("device wan" doesn't -# exist), the failure was swallowed, and download limiting silently did -# nothing while still reporting success. Every candidate is now verified -# against sysfs, with the default route as a last resort. -tctl_get_wan_device() { - local sysfs="${TCTL_SYSFS_NET:-/sys/class/net}" - local dev candidates - - candidates="$(ubus call network.interface.wan status 2>/dev/null | jsonfilter -e '@.l3_device' 2>/dev/null) -$(uci -q get network.wan.device 2>/dev/null) -$(uci -q get network.wan.device 2>/dev/null) -$(ip route show default 2>/dev/null | awk '/^default/{for (i = 1; i <= NF; i++) if ($i == "dev") { print $(i+1); exit }}')" - - for dev in $candidates; do - [ -n "$dev" ] || continue - # A bridge/device name from uci can still be a config-only alias. - [ -e "$sysfs/$dev" ] || continue - echo "$dev" - return 0 - done - return 1 -} - -tctl_get_lan_device() { - local dev - dev=$(uci -q get network.lan.device 2>/dev/null) - [ -z "$dev" ] && dev=$(uci -q get network.lan.device 2>/dev/null) - [ -z "$dev" ] && dev="br-lan" - echo "$dev" -} - -# Enumerate all LAN-side IPv4 subnets, one per L3 interface. -# -# "LAN" = firewall zones that are NOT internet-facing. A zone is treated as LAN -# if it is named "lan", or if it is neither a wan zone nor masqueraded. This -# deliberately excludes VPN/tunnel zones (e.g. WireGuard/AmneziaWG awg*, which -# carry their own IPv4 and would otherwise be mistaken for LANs) because those -# are masqueraded out. Covers bridges (br-lan), bridge-VLANs and plain VLAN -# interfaces (eth0.20) uniformly via each interface's l3_device. -# -# Output: one line per subnet, "l3_device netbase_int block_size router_int" -# where membership can be tested without awk bit-ops: -# ip in subnet <=> ipint - (ipint % block) == netbase -tctl_lan_subnets() { - local i=0 zname zmasq nets net st l3 addr mask - local o1 o2 o3 o4 ipint block netbase - while zname=$(uci -q get "firewall.@zone[$i].name" 2>/dev/null); [ -n "$zname" ]; do - zmasq=$(uci -q get "firewall.@zone[$i].masq" 2>/dev/null) - nets=$(uci -q get "firewall.@zone[$i].network" 2>/dev/null) - i=$((i + 1)) - case "$zname" in wan|wan6) continue ;; esac - [ "$zname" != "lan" ] && [ "$zmasq" = "1" ] && continue - for net in $nets; do - st=$(ubus call "network.interface.$net" status 2>/dev/null) - l3=$(echo "$st" | jsonfilter -e '@.l3_device' 2>/dev/null) - addr=$(echo "$st" | jsonfilter -e '@["ipv4-address"][0].address' 2>/dev/null) - mask=$(echo "$st" | jsonfilter -e '@["ipv4-address"][0].mask' 2>/dev/null) - [ -n "$l3" ] && [ -n "$addr" ] && [ -n "$mask" ] || continue - [ "$mask" -ge 1 ] && [ "$mask" -le 32 ] 2>/dev/null || continue - o1=${addr%%.*}; rest=${addr#*.} - o2=${rest%%.*}; rest=${rest#*.} - o3=${rest%%.*}; o4=${rest##*.} - ipint=$(( (o1 << 24) + (o2 << 16) + (o3 << 8) + o4 )) - block=$(( 1 << (32 - mask) )) - netbase=$(( ipint - (ipint % block) )) - echo "$l3 $netbase $block $ipint" - done - done -} - -# Concrete devices to attach netdev ingress hooks to. -# -# A netdev ingress hook bound to a BRIDGE never sees bridged traffic: packets -# are received on the bridge's physical ports, so the hook must live there. -# Binding to br-lan silently matches nothing, which is exactly how upload -# limiting appeared to be applied while having no effect. Non-bridge L3 -# devices (plain ports, VLAN interfaces) are hooked directly. -tctl_ingress_devices() { - local sysfs="${TCTL_SYSFS_NET:-/sys/class/net}" - local dev port - for dev in $(tctl_get_lan_devices); do - if [ -d "$sysfs/$dev/brif" ]; then - for port in "$sysfs/$dev/brif/"*; do - [ -e "$port" ] || continue - basename "$port" - done - else - echo "$dev" - fi - done | sort -u -} - -# nft chain names for a device's hooks (chain names can't contain dots or -# dashes, which interface names routinely do). -tctl_ingress_chain() { - printf 'ul_%s' "$(printf '%s' "$1" | tr -c 'a-zA-Z0-9' '_')" -} - -tctl_egress_chain() { - printf 'dl_%s' "$(printf '%s' "$1" | tr -c 'a-zA-Z0-9' '_')" -} - -# LAN L3 device names only (deduplicated), e.g. "br-lan br-guest eth0.20". -tctl_get_lan_devices() { - tctl_lan_subnets | awk '{print $1}' | sort -u -} - -# Convert "a.b.c.d/m" (or a bare host address) to "netbase_int block_size", -# normalized to the network base. Fails silently on malformed input. -tctl_cidr_spec() { - local cidr="$1" addr mask rest o1 o2 o3 o4 ipint block - addr=${cidr%%/*} - mask=${cidr#*/} - [ "$mask" = "$cidr" ] && mask=32 - tctl_validate_ip "$addr" || return 1 - case "$mask" in ''|*[!0-9]*) return 1 ;; esac - [ "$mask" -ge 1 ] && [ "$mask" -le 32 ] || return 1 - o1=${addr%%.*}; rest=${addr#*.} - o2=${rest%%.*}; rest=${rest#*.} - o3=${rest%%.*}; o4=${rest##*.} - ipint=$(( (o1 << 24) + (o2 << 16) + (o3 << 8) + o4 )) - block=$(( 1 << (32 - mask) )) - echo "$(( ipint - (ipint % block) )) $block" -} - -# Downstream subnets routed via a next-hop on a LAN interface — e.g. clients -# behind a second router on the LAN whose packets are forwarded (and NATed on -# WAN) through this router with their original source addresses. Also includes -# operator-defined extras from trafficctl.main.extra_subnets (space-separated -# CIDRs) for setups without an explicit kernel route. -# Output format matches tctl_lan_subnets; router_int is 0 because no local -# address lives inside a routed subnet (consumers use 0 to tell routed from -# directly connected). -tctl_routed_subnets() { - local lan_devs dev cidr spec extras - lan_devs=$(tctl_get_lan_devices) - - if [ -n "$lan_devs" ]; then - ip route show 2>/dev/null | awk ' - $1 != "default" && / via / { - dev = "" - for (i = 1; i <= NF; i++) if ($i == "dev") dev = $(i+1) - if (dev != "") print $1, dev - }' | while read -r cidr dev; do - echo "$lan_devs" | grep -qxF "$dev" || continue - spec=$(tctl_cidr_spec "$cidr") || continue - echo "$dev $spec 0" - done - fi - - extras=$(uci -q get trafficctl.main.extra_subnets 2>/dev/null) - if [ -n "$extras" ]; then - dev=$(tctl_get_lan_device) - for cidr in $extras; do - spec=$(tctl_cidr_spec "$cidr") || continue - echo "$dev $spec 0" - done - fi -} - -# Every subnet worth monitoring: directly connected LANs first, then routed -# and extra ones. Duplicate prefixes are dropped (first wins, keeping the -# connected entry with its real router address). -tctl_monitored_subnets() { - { tctl_lan_subnets; tctl_routed_subnets; } | awk '!seen[$2":"$3]++' -} - -# True (0) when the IP belongs to a directly connected LAN subnet; routed and -# extra subnets do not count. Used to tell on-link devices from downstream -# ones that only have an L3 presence here. -tctl_ip_in_lan() { - local ip="$1" o1 o2 o3 o4 rest ipint - tctl_validate_ip "$ip" || return 1 - o1=${ip%%.*}; rest=${ip#*.} - o2=${rest%%.*}; rest=${rest#*.} - o3=${rest%%.*}; o4=${rest##*.} - ipint=$(( (o1 << 24) + (o2 << 16) + (o3 << 8) + o4 )) - tctl_lan_subnets | awk -v si="$ipint" ' - si - (si % $3) == $2 { hit = 1; exit } - END { exit hit ? 0 : 1 }' -} - -# Accept a single host address or a CIDR block ("all" means every address). -# Echoes the normalized target, or fails. -tctl_validate_target() { - local t="$1" addr mask - case "$t" in - all|any) echo "0.0.0.0/0"; return 0 ;; - esac - case "$t" in - */*) - addr=${t%%/*} - mask=${t#*/} - tctl_validate_ip "$addr" || return 1 - case "$mask" in ''|*[!0-9]*) return 1 ;; esac - [ "$mask" -ge 0 ] && [ "$mask" -le 32 ] || return 1 - echo "$addr/$mask" - ;; - *) - tctl_validate_ip "$t" || return 1 - echo "$t" - ;; - esac -} - -# A target usable inside an nft set/meter name or a rule comment. -tctl_target_slug() { - printf '%s' "$1" | tr './' '__' -} - -# Rule comments identify the target, not the caller. They used to be built from -# a caller-supplied label, so a block placed from LuCI (label "block_") and -# the same block seen from the Telegram bot (label "tg") produced different -# comments — removal grepped for the wrong one, found nothing, and still -# reported success. -tctl_block_comment() { - echo "tctl_block_$(tctl_target_slug "$1")" -} - -tctl_ratelimit_comment() { - echo "rl_ratelimit_$(tctl_target_slug "$1")" -} - -tctl_validate_ip() { - echo "$1" | grep -qE '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' || return 1 - local IFS='.' - # shellcheck disable=SC2086 - set -- $1 - [ "$1" -le 255 ] && [ "$2" -le 255 ] && [ "$3" -le 255 ] && [ "$4" -le 255 ] 2>/dev/null -} - -tctl_get_wifi_interfaces() { - uci show wireless 2>/dev/null | grep '=wifi-iface' | cut -d. -f2 | cut -d= -f1 -} - -# Running AP interface names, one per line (e.g. phy0-ap0), taken from the -# hostapd ubus objects. -# -# Returns non-zero when ubus itself could not be consulted. That is NOT the -# same as "no AP is running", and callers must not read an empty list as -# "nothing to enforce" unless the query actually succeeded — doing so would -# turn a broken router into a silent "blocked". -tctl_get_hostapd_ifaces() { - local out - command -v ubus >/dev/null 2>&1 || return 1 - out=$(ubus list 2>/dev/null) || return 1 - # An empty result is a valid answer -- "no AP is running" -- so the grep - # matching nothing must not be reported as a failed query. Only ubus itself - # failing, above, is that. - printf '%s\n' "$out" | grep '^hostapd\.' | cut -d. -f2- - return 0 -} - -# Which ACL policy a wifi-iface uses: "allow" (whitelist — only listed MACs may -# associate) or "deny" (blacklist — listed MACs are rejected). Anything else, -# including unset, means no filtering is configured yet, reported as "deny" -# because that is the mode we create on demand. -tctl_get_wifi_filter_mode() { - local iface="$1" mode - mode=$(uci -q get "wireless.${iface}.macfilter" 2>/dev/null) - [ "$mode" = "allow" ] && echo "allow" || echo "deny" -} - -# ── Runtime WiFi enforcement ────────────────────────────────────────────── -# -# The uci maclist is the durable half of a WiFi block; hostapd's running ACL is -# the half that decides whether the device is on the air *now*. The two drift -# apart whenever the runtime call cannot be made, and for a long time that -# drift was invisible: the calls below were fire-and-forget, their exit status -# discarded, so a router without hostapd-utils reported every block as done -# while the device kept browsing. -# -# So every entry point here reports how far enforcement actually got, as one -# of these words, and proves it by reading the state back rather than trusting -# a return code: -# -# acl - the running ACL was changed and the change was read back -# ban - no usable hostapd_cli; hostapd's ubus deauthed and banned the -# client, which expires on its own (see TCTL_WIFI_BAN_MS) -# none - nothing could be applied or verified on the running radio -# no-radio - ubus answered and no AP is running, so there is nothing to -# enforce; the uci maclist applies when wifi next starts -# -# Only "acl" and "no-radio" mean the operator's intent is in force, and the -# functions return 0 for exactly those two. - -# How long a ubus ban lasts, in milliseconds. Used only where hostapd_cli is -# unavailable: hostapd's ubus object has no ACL method (del_client, list_bans, -# get_clients, reload), so a timed ban is the strongest immediate measure it -# can offer. One hour is long enough to be worth doing and short enough that -# callers must keep calling it temporary rather than done. -TCTL_WIFI_BAN_MS=3600000 - -# hostapd_cli exists AND this AP's control socket answers. Both halves matter: -# the package can be absent (the router this bug was found on), or present -# while hostapd is not listening, and only a PONG shows the ACL commands will -# reach anything. -tctl_hostapd_cli_alive() { - command -v hostapd_cli >/dev/null 2>&1 || return 1 - hostapd_cli -i "$1" ping 2>/dev/null | grep -q PONG -} - -# Does the running ACL currently keep this MAC off the air? Read back from -# hostapd instead of inferred from our own call: hostapd_cli exits 0 for -# "command delivered", and an ACL that stays empty afterwards is exactly the -# failure being guarded against. hostapd also reloads its maclist file at times -# of its own choosing, so the entry present may not be the one we added — which -# is fine, and another reason to ask rather than assume. -tctl_hostapd_acl_blocks() { - local iface="$1" mac="$2" mode="$3" acl - if [ "$mode" = "allow" ]; then - acl=$(hostapd_cli -i "$iface" accept_acl SHOW 2>/dev/null) - ! printf '%s\n' "$acl" | grep -qi "$mac" - else - acl=$(hostapd_cli -i "$iface" deny_acl SHOW 2>/dev/null) - printf '%s\n' "$acl" | grep -qi "$mac" - fi -} - -tctl_hostapd_ubus_banned() { - local iface="$1" mac="$2" - command -v ubus >/dev/null 2>&1 || return 1 - ubus call "hostapd.$iface" list_bans 2>/dev/null | grep -qi "$mac" -} - -# Fallback when hostapd_cli is unusable. del_client deauthenticates and refuses -# the client for ban_time, which is not an ACL entry — the durable half stays -# the uci maclist. The call's own exit status is deliberately ignored: it can -# fail for a client that is not currently associated while the ban still lands, -# and list_bans is the only answer worth having. -tctl_hostapd_ubus_ban() { - local iface="$1" mac="$2" - command -v ubus >/dev/null 2>&1 || return 1 - ubus call "hostapd.$iface" del_client \ - "{\"addr\":\"$mac\",\"reason\":1,\"deauth\":true,\"ban_time\":$TCTL_WIFI_BAN_MS}" \ - >/dev/null 2>&1 - tctl_hostapd_ubus_banned "$iface" "$mac" -} - -# acl > ban > none, so a loop over several APs can keep the worst result. -tctl_enforce_rank() { - case "$1" in - acl) echo 3 ;; - ban) echo 2 ;; - *) echo 1 ;; - esac -} - -tctl_hostapd_block_iface() { - local iface="$1" mac="$2" mode="$3" - if tctl_hostapd_cli_alive "$iface"; then - if [ "$mode" = "allow" ]; then - hostapd_cli -i "$iface" accept_acl DEL_MAC "$mac" >/dev/null 2>&1 - else - hostapd_cli -i "$iface" deny_acl ADD_MAC "$mac" >/dev/null 2>&1 - fi - hostapd_cli -i "$iface" deauthenticate "$mac" >/dev/null 2>&1 - if tctl_hostapd_acl_blocks "$iface" "$mac" "$mode"; then - echo acl - return - fi - fi - if tctl_hostapd_ubus_ban "$iface" "$mac"; then - echo ban - return - fi - echo none -} - -tctl_hostapd_unblock_iface() { - local iface="$1" mac="$2" mode="$3" - if tctl_hostapd_cli_alive "$iface"; then - if [ "$mode" = "allow" ]; then - hostapd_cli -i "$iface" accept_acl ADD_MAC "$mac" >/dev/null 2>&1 - else - hostapd_cli -i "$iface" deny_acl DEL_MAC "$mac" >/dev/null 2>&1 - fi - if ! tctl_hostapd_acl_blocks "$iface" "$mac" "$mode"; then - # The ACL permits the MAC again, but a ban left over from an - # earlier hostapd_cli-less block would still keep it off the air, - # and there is no ubus method to lift one. - if tctl_hostapd_ubus_banned "$iface" "$mac"; then - echo ban - else - echo acl - fi - return - fi - fi - if tctl_hostapd_ubus_banned "$iface" "$mac"; then - echo ban - return - fi - echo none -} - -# Applies $2 ("allow"/"deny" ACL policy) to every running AP and echoes the -# worst per-AP outcome. Always safe to re-run: it enforces from the runtime -# state, so calling it on a MAC that uci already lists is how a block that was -# only ever written to config gets applied for real. -tctl_hostapd_apply_mac() { - local op="$1" mac="$2" mode="$3" - local ifaces iface state rank worst=3 - ifaces=$(tctl_get_hostapd_ifaces) || { echo none; return 1; } - if [ -z "$ifaces" ]; then - echo no-radio - return 0 - fi - for iface in $ifaces; do - case "$op" in - block) state=$(tctl_hostapd_block_iface "$iface" "$mac" "$mode") ;; - *) state=$(tctl_hostapd_unblock_iface "$iface" "$mac" "$mode") ;; - esac - rank=$(tctl_enforce_rank "$state") - [ "$rank" -lt "$worst" ] && worst="$rank" - done - case "$worst" in - 3) echo acl; return 0 ;; - 2) echo ban ;; - *) echo none ;; - esac - return 1 -} - -tctl_hostapd_block_mac() { - tctl_hostapd_apply_mac block "$1" "$2" -} - -tctl_hostapd_unblock_mac() { - tctl_hostapd_apply_mac unblock "$1" "$2" -} - -# A device listed as WiFi-blocked while it is associated on a radio right now -# is proof the running ACL does not carry the block — the state a silent -# enforcement failure leaves a router in. Keyed off conn_type rather than the -# station dump so it still holds where iw is missing and the connection type -# came from the bridge port instead. -tctl_wifi_block_pending() { - local blocked="$1" conn_type="$2" - [ "$blocked" = "1" ] || return 1 - case "$conn_type" in - wifi|2.4G|5G|6G) return 0 ;; - esac - return 1 -} - -# ── Persistence ─────────────────────────────────────────────────────────── - -TCTL_RULES_FILE="/etc/trafficctl/rules.json" - -tctl_persist_enabled() { - [ "$(uci -q get trafficctl.main.persist_rules 2>/dev/null)" = "1" ] -} - -tctl_persist_save() { - local type="$1" ip="$2" param="$3" mode="$4" param_up="$5" - [ -d "$(dirname "$TCTL_RULES_FILE")" ] || mkdir -p "$(dirname "$TCTL_RULES_FILE")" - [ -f "$TCTL_RULES_FILE" ] || echo '[]' > "$TCTL_RULES_FILE" - local tmp="${TCTL_RULES_FILE}.tmp" - # The mode field is written only when the caller has one, so records for - # rule types that have no bucket layout (blocks, port forwards) keep their - # exact previous shape. param_up follows the same rule: the caller passes it - # only for an asymmetric limit, so a symmetric one still writes the record - # it always wrote and an older package can still read it back. - local extra="" - [ -n "$mode" ] && extra=",\"mode\":\"$mode\"" - [ -n "$param_up" ] && extra="$extra,\"param_up\":\"$param_up\"" - # Remove existing entry for same ip+type, append new one - awk -v ip="$ip" -v t="$type" -v p="$param" -v x="$extra" ' - { - gsub(/^\[/,""); gsub(/\]$/,"") - n=split($0, items, "},{") - printf "[" - first=1 - for (i=1; i<=n; i++) { - sub(/^\{/,"",items[i]); sub(/\}$/,"",items[i]) - # index(), not ~: these values reach awk as a REGEX otherwise, and - # its safety then rests on an argument about which characters the - # fields can hold. That argument happens to hold today — an address - # or a CIDR carries only the dot, which among valid values can line - # up with nothing but another dot — but it is not a property of the - # code, and the next field added here would not have it. A fixed - # string search needs no such argument. - if (index(items[i], "\"ip\":\"" ip "\"") && index(items[i], "\"type\":\"" t "\"")) continue - if (!first) printf "," - printf "{%s}", items[i] - first=0 - } - if (!first) printf "," - printf "{\"type\":\"%s\",\"ip\":\"%s\",\"param\":\"%s\"%s}]", t, ip, p, x - }' "$TCTL_RULES_FILE" > "$tmp" - mv "$tmp" "$TCTL_RULES_FILE" -} - -tctl_persist_remove() { - local type="$1" ip="$2" - [ -f "$TCTL_RULES_FILE" ] || return 0 - local tmp="${TCTL_RULES_FILE}.tmp" - awk -v ip="$ip" -v t="$type" ' - { - gsub(/^\[/,""); gsub(/\]$/,"") - n=split($0, items, "},{") - printf "[" - first=1 - for (i=1; i<=n; i++) { - sub(/^\{/,"",items[i]); sub(/\}$/,"",items[i]) - # index(), not ~: these values reach awk as a REGEX otherwise, and - # its safety then rests on an argument about which characters the - # fields can hold. That argument happens to hold today — an address - # or a CIDR carries only the dot, which among valid values can line - # up with nothing but another dot — but it is not a property of the - # code, and the next field added here would not have it. A fixed - # string search needs no such argument. - if (index(items[i], "\"ip\":\"" ip "\"") && index(items[i], "\"type\":\"" t "\"")) continue - if (!first) printf "," - printf "{%s}", items[i] - first=0 - } - printf "]" - }' "$TCTL_RULES_FILE" > "$tmp" - mv "$tmp" "$TCTL_RULES_FILE" -} - -# ── New-device ledger ───────────────────────────────────────────────────── -# -# Which MAC addresses this router has already seen. The default-limit feature -# keys off it, which makes the ledger safety-critical in one direction only: -# wrongly calling a device NEW applies an unasked-for limit, while wrongly -# calling it KNOWN merely does nothing. Every ambiguous case below therefore -# resolves to "known". -# -# It lives in /etc/trafficctl (kept across sysupgrade by keep.d) rather than -# in tmpfs. A ledger that reset on reboot would make every device on the LAN -# new again on the next lease renewal — the same mass-limiting accident, just -# reached more slowly. Flash cost is bounded by device count, not by DHCP -# traffic: an entry is appended only for a MAC that is not already listed. -TCTL_SEEN_FILE="/etc/trafficctl/seen_macs" -TCTL_SEEN_MAX=1000 -# TCTL_LEASES_FILE is set once at the top of this file (overridable for tests). -TCTL_SHAPES_FILE="/etc/trafficctl/shapes.json" - -# " " for every shape in shapes.json — the only way from an -# address to its HTB class, because minors are ALLOCATED (see -# trafficctl-shape.sh), not derived from the address. Readers that derived -# them anyway showed one device's rate on another. -# -# Same record pattern as shapes_entries in trafficctl-shape.sh, optional -# rate_kbit_up included: a pattern that misses a record form makes that shape -# vanish from every reader. A record from before allocation carries no -# classid, and its class is still the one the old derivation gave it -# (legacy_classid there), so that is what it maps to. -tctl_shape_classmap() { - grep -oE '\{"ip":"[^"]+","rate_kbit":[0-9]+(,"classid":"1:[0-9a-f]+")?(,"rate_kbit_up":[0-9]+)?\}' \ - "$TCTL_SHAPES_FILE" 2>/dev/null | awk ' - { - if (!match($0, /"ip":"[^"]+"/)) next - ip = substr($0, RSTART + 6, RLENGTH - 7) - if (match($0, /"classid":"1:[0-9a-f]+"/)) { - print ip, substr($0, RSTART + 11, RLENGTH - 12) - next - } - if (split(ip, o, ".") != 4) next - dec = o[3] * 256 + o[4] - if (dec < 2 || dec > 65533) next - printf "%s 1:%x\n", ip, dec - }' -} - -# The IFB device upload shaping runs on (see trafficctl-shape.sh). -tctl_shape_ifb_dev() { - local d - d=$(uci -q get trafficctl.main.shape_ifb 2>/dev/null) - echo "${d:-tctl-ifb0}" -} - -# "classid rate_kbit" for every per-device HTB class on a device, from one tc -# call. On the LAN device that is the download ceiling, on the IFB the upload -# one: a shape uses the same classid on both. -tctl_tc_class_rates() { - command -v tc >/dev/null 2>&1 || return 0 - tc class show dev "$1" 2>/dev/null | awk ' - /^class htb 1:/ { - classid=$3 - minor=classid; sub(/^1:/,"",minor) - if (minor=="1" || minor=="fffe") next - rate=0 - for (i=1;i<=NF;i++) { - if ($i=="rate") { - v=$(i+1) - if (v ~ /Gbit/) { sub(/Gbit/,"",v); rate=(v+0)*1000000 } - else if (v ~ /Mbit/) { sub(/Mbit/,"",v); rate=(v+0)*1000 } - else if (v ~ /[Kk]bit/){ sub(/[Kk]bit/,"",v); rate=v+0 } - else { rate=(v+0)/1000 } - break - } - } - print classid, rate - }' -} - -tctl_seen_normalize() { - printf '%s' "$1" | tr 'A-Z' 'a-z' -} - -# Take the baseline from the devices already on the network, so switching the -# feature on does not declare the existing LAN to be new. Callers should do -# this at a moment when the network is up (i.e. from the rpcd setter, on an -# operator's action) rather than early in boot, when both sources are empty. -tctl_seen_seed() { - [ -f "$TCTL_SEEN_FILE" ] && return 0 - mkdir -p "$(dirname "$TCTL_SEEN_FILE")" 2>/dev/null - { - awk '{ print $2 }' "$TCTL_LEASES_FILE" 2>/dev/null - ip neigh show 2>/dev/null | awk '/lladdr/ { print $5 }' - } | tr 'A-Z' 'a-z' \ - | grep -E '^([0-9a-f]{2}:){5}[0-9a-f]{2}$' \ - | sort -u > "${TCTL_SEEN_FILE}.tmp" 2>/dev/null - mv "${TCTL_SEEN_FILE}.tmp" "$TCTL_SEEN_FILE" 2>/dev/null -} - -tctl_seen_count() { - [ -f "$TCTL_SEEN_FILE" ] || { echo 0; return 0; } - wc -l < "$TCTL_SEEN_FILE" 2>/dev/null | tr -d ' ' || echo 0 -} - -# "Known" is the safe answer, so an unreadable MAC or a missing ledger says -# yes. Whether the ledger EXISTS is a separate question, asked by the caller -# through tctl_seen_ready before it acts on a negative. -tctl_seen_known() { - local mac - mac=$(tctl_seen_normalize "$1") - [ -n "$mac" ] || return 0 - [ -f "$TCTL_SEEN_FILE" ] || return 0 - grep -qxF "$mac" "$TCTL_SEEN_FILE" 2>/dev/null -} - -tctl_seen_ready() { - [ -f "$TCTL_SEEN_FILE" ] -} - -tctl_seen_mark() { - local mac n keep - mac=$(tctl_seen_normalize "$1") - [ -n "$mac" ] || return 0 - # Not tctl_seen_known alone: it answers "known" for a missing ledger, - # which here would mean never writing the first entry. - if [ -f "$TCTL_SEEN_FILE" ] && tctl_seen_known "$mac"; then - return 0 - fi - mkdir -p "$(dirname "$TCTL_SEEN_FILE")" 2>/dev/null - printf '%s\n' "$mac" >> "$TCTL_SEEN_FILE" - - # Trim from the head when the ledger outgrows the cap. A device dropped - # this way can be seen as new again later; the cap sits far above any - # plausible LAN, so that is a theoretical cost against an unbounded file. - n=$(tctl_seen_count) - if [ "$n" -gt "$TCTL_SEEN_MAX" ]; then - keep=$((TCTL_SEEN_MAX * 4 / 5)) - tail -n "$keep" "$TCTL_SEEN_FILE" > "${TCTL_SEEN_FILE}.tmp" 2>/dev/null && - mv "${TCTL_SEEN_FILE}.tmp" "$TCTL_SEEN_FILE" - fi -} - -# Does this address already carry a limit somebody set deliberately? -# -# Live nft/tc state alone is not a sufficient answer. After a reboot the -# restore hook runs on `ifup lan` and only when persist_rules is on, so a -# device with a manual limit reads as unlimited until then — and a default -# limit applied in that window would silently overwrite the operator's -# choice. The persisted files are consulted as well. -tctl_has_limit() { - local ip="$1" - [ -n "$ip" ] || return 1 - - /usr/local/bin/trafficctl-ratelimit-stats.sh 2>/dev/null \ - | grep -qF "\"ip\":\"$ip\"" && return 0 - /usr/local/bin/trafficctl-shape-stats.sh 2>/dev/null \ - | grep -qF "\"ip\":\"$ip\"" && return 0 - - if [ -f "$TCTL_RULES_FILE" ]; then - grep -qF "\"ip\":\"$ip\"" "$TCTL_RULES_FILE" 2>/dev/null && return 0 - fi - if [ -f "$TCTL_SHAPES_FILE" ]; then - grep -qF "\"ip\":\"$ip\"" "$TCTL_SHAPES_FILE" 2>/dev/null && return 0 - fi - return 1 -} - -# ── Activity Logging ────────────────────────────────────────────────────── - -TCTL_LOG_TAG="trafficctl" - -tctl_log_enabled() { - [ "$(uci -q get trafficctl.logging.enabled 2>/dev/null)" = "1" ] -} - -tctl_log_category_enabled() { - local cat="$1" - [ "$(uci -q get "trafficctl.logging.log_${cat}" 2>/dev/null)" != "0" ] -} - -TCTL_LOG_DEFAULT="/tmp/trafficctl/activity.log" - -# The log path is writable through the LuCI write ACL and is used both as an -# append target and as a tail/rewrite target, so an unconstrained value is an -# arbitrary root read and truncate. Only dedicated log locations are accepted. -tctl_validate_log_file() { - local f="$1" - case "$f" in - /tmp/trafficctl/*|/var/log/*) ;; - *) return 1 ;; - esac - case "$f" in - */../*|*/..|*/) return 1 ;; - esac - # Path characters are restricted rather than blacklisted so no shell or glob - # metacharacter can reach the redirect, tail or mv below. - case "$f" in - *[!A-Za-z0-9._/-]*) return 1 ;; - esac - return 0 -} - -tctl_log_file() { - local f - f=$(uci -q get trafficctl.logging.log_file 2>/dev/null) - if [ -n "$f" ] && tctl_validate_log_file "$f"; then - echo "$f" - else - echo "$TCTL_LOG_DEFAULT" - fi -} - -# Rotation keeps 3/5 of the cap, so a cap below 5 would round to zero lines and -# empty the file on the next write. -tctl_log_max_lines() { - local n - n=$(uci -q get trafficctl.logging.max_lines 2>/dev/null) - case "$n" in - ''|*[!0-9]*) echo 500; return 0 ;; - esac - [ "$n" -ge 20 ] 2>/dev/null || { echo 20; return 0; } - [ "$n" -le 100000 ] 2>/dev/null || { echo 100000; return 0; } - echo "$n" -} - -tctl_log() { - local action="$1" target="$2" detail="$3" via="${4:-cli}" src="${5:-local}" - tctl_log_enabled || return 0 - - local category - case "$action" in - # The global cut is a block, just a wider one — it belongs in the same - # category so switching "Blocks" off does not leave it unlogged. - block|unblock|cut|uncut) category="blocks" ;; - ratelimit*) category="ratelimits" ;; - shape*) category="shapes" ;; - telegram*) category="telegram" ;; - config*) category="config" ;; - *) category="config" ;; - esac - tctl_log_category_enabled "$category" || return 0 - - local ts user log_file max_lines - ts=$(date '+%Y-%m-%d %H:%M:%S') - user="${TCTL_USER:-$(id -un 2>/dev/null || echo unknown)}" - log_file=$(tctl_log_file) - max_lines=$(tctl_log_max_lines) - - local entry="[$TCTL_LOG_TAG] $ts src=$src user=$user via=$via action=$action target=$target${detail:+ detail=$detail}" - - [ -d "$(dirname "$log_file")" ] || mkdir -p "$(dirname "$log_file")" - echo "$entry" >> "$log_file" - - # Rotate if over max_lines - local lc - lc=$(wc -l < "$log_file" 2>/dev/null || echo 0) - if [ "$lc" -gt "$max_lines" ]; then - local keep=$(( max_lines * 3 / 5 )) - tail -n "$keep" "$log_file" > "${log_file}.tmp" - mv "${log_file}.tmp" "$log_file" - fi - - # Duplicate to syslog if configured - if [ "$(uci -q get trafficctl.logging.syslog 2>/dev/null)" = "1" ]; then - logger -t "$TCTL_LOG_TAG" "$ts src=$src user=$user via=$via action=$action target=$target${detail:+ detail=$detail}" - fi -} - -# ── Flow Offload Detection ───────────────────────────────────────────────── - -tctl_get_offload_mode() { - local sw hw - sw=$(uci -q get firewall.@defaults[0].flow_offloading 2>/dev/null) - hw=$(uci -q get firewall.@defaults[0].flow_offloading_hw 2>/dev/null) - if [ "$hw" = "1" ]; then - # kernel 5.7+ supports counter sync on flowtables (docs.kernel.org/networking/nf_flowtable.html). - # OpenWrt 22.03+ fw4 sets the counter flag by default, syncing hardware - # byte counts back to conntrack — monitoring works. - if nft list flowtables 2>/dev/null | grep -q "counter"; then - echo "hardware-counter" - else - echo "hardware" - fi - elif [ "$sw" = "1" ]; then - # A counter-flagged flowtable syncs offloaded byte counts back to - # conntrack, so conntrack accounting stays valid — worth - # distinguishing, because the nft-map fallback needs dynamic counter - # maps that many kernels don't support. - if nft list flowtables 2>/dev/null | grep -q "counter"; then - echo "software-counter" - else - echo "software" - fi - else - echo "none" - fi -} - -# ── Qualcomm NSS / ECM Detection ─────────────────────────────────────────── -# -# On Qualcomm NSS builds (ipq807x/ipq60xx with qca-nss-ecm, qca-nss-drv and -# qca-nss-clients) the Enhanced Connection Manager installs flow rules into -# the NSS firmware cores, and an accelerated flow NEVER TRAVERSES THE LINUX -# NETWORK STACK. Both of this package's enforcement paths are therefore inert -# on such a router: the nftables netdev policer never sees the packets, and -# Linux HTB/IFB never gets to queue them. Reported in issue #81, where a user -# applied WiFi client limits and nothing was limited. -# -# Nothing here attempts to fix that — an NSS backend would mean nsshtb/nsstbl -# and act_nssmirred in place of htb and ifb, which needs hardware to develop -# against. What these helpers do is let the callers STOP REPORTING SUCCESS for -# a rule that cannot be enforced, which is the part that can be made correct -# without hardware and is the actual complaint. -# -# Named by absolute path, as it must be on the router; the tests sed this line -# into their scratch directory (same approach as TCTL_LEASES_FILE above). -TCTL_ECM_DEBUGFS="/sys/kernel/debug/ecm" - -# absent — no ECM on this system; every rule this package installs applies -# normally and nothing needs qualifying. -# stopped — ECM is present but its front end has been stopped, so flows are -# back on the Linux path and our rules DO apply. -# active — ECM is accelerating. Our rules are installed but not enforced for -# any accelerated flow. -# -# The distinction between "stopped" and "active" is deliberate and is read -# from the kernel rather than inferred from the packages installed: somebody -# who has turned acceleration off to get working QoS must not be told their -# limits do not work. -tctl_nss_status() { - [ -d "$TCTL_ECM_DEBUGFS" ] || { printf 'absent\n'; return 0; } - local v4 v6 - v4=$(cat "$TCTL_ECM_DEBUGFS/front_end_ipv4_stop" 2>/dev/null) - v6=$(cat "$TCTL_ECM_DEBUGFS/front_end_ipv6_stop" 2>/dev/null) - # Both stopped is the only state in which the Linux datapath is whole. A - # missing knob is NOT read as stopped: an ECM build whose debugfs layout we - # do not recognise is still accelerating, and guessing "stopped" there - # would restore exactly the false success this exists to remove. - if [ "$v4" = "1" ] && [ "$v6" = "1" ]; then - printf 'stopped\n' - else - printf 'active\n' - fi -} - -tctl_nss_active() { [ "$(tctl_nss_status)" = "active" ]; } - -# The suffix every caller appends to its own message. One wording in one place, -# so the limiter, the shaper and the block path cannot drift into describing -# the same condition three different ways. -tctl_nss_note() { - tctl_nss_active || return 0 - printf ' [NOT ENFORCED: Qualcomm NSS acceleration is active — accelerated flows bypass the Linux network stack entirely, so this rule is installed but has no effect. Stop acceleration (echo 1 > %s/front_end_ipv4_stop, same for ipv6) or set acceleration_engine in /etc/config/ecm, then re-apply]' \ - "$TCTL_ECM_DEBUGFS" -} - -# The suffix a caller appends when the rule it just installed will not be -# written down, and so will not come back after a reboot (#105). -# -# Same principle as the IPv6 and NSS qualifiers: this package says what a -# success does NOT cover rather than letting the operator discover it later. -# Here "later" meant the next reboot, which is the worst possible moment to -# find out that a device you blocked is online again. -tctl_persist_note() { - tctl_persist_enabled && return 0 - printf ' [NOT PERSISTENT: this will be lost on reboot — persistence is off. Enable it with `uci set trafficctl.main.persist_rules=1 && uci commit trafficctl`, or in Settings → Logging & Persistence, then re-apply]' -} - -# Defunct the flows ECM has already accelerated. -# -# This is the NSS counterpart of the `conntrack -D` every rule change already -# does, and it is needed for the same reason: a flow that is ALREADY offloaded -# is not re-evaluated against a rule that appeared afterwards, so without this -# a new block or limit would only affect connections started later — which -# presents as "it works sometimes". -# -# Best effort by design: absent on every non-NSS router, and a write failure -# must never fail the operation the caller is performing. UNVERIFIED ON -# HARDWARE — there is no IPQ device here to test it against, so it is wired in -# as an addition to the existing flush rather than as something any result -# depends on. -tctl_nss_defunct() { - local f="$TCTL_ECM_DEBUGFS/ecm_db/defunct_all" - [ -w "$f" ] || return 0 - echo 1 > "$f" 2>/dev/null || true - return 0 -} diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-history.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-history.sh deleted file mode 100755 index 22b57c1ab..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-history.sh +++ /dev/null @@ -1,1052 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Durable per-device traffic history, accumulated per accounting period. -# -# WHY THIS EXISTS (#89, #90) -# trafficctl-totals.sh already computes correct lifetime totals, but its store -# is /tmp/trafficctl_totals.state — tmpfs, deliberately: that file is -# rewritten on every LuCI poll (2-10 s) and every metrics scrape, and that -# write volume into flash would wear the device out. So the numbers existed -# and had nowhere durable to go. Everything here is persistence and -# windowing; no new accounting. -# -# ONE FILE PER PERIOD -# /.tsv, where period is 2026-10-09 / 2026-W41 / 2026-10. The -# "reset every day/week/month" request is then a no-op — a new period is a -# new filename — and retention is a file delete rather than a rewrite of -# everything. A finished period's file is never touched again, which also -# means a crash can only ever damage the current one. -# -# TSV, NOT JSON -# An interrupted write to a JSON file costs the whole file; to a TSV, its -# last line. This runs on a device that can lose power mid-write and whose -# store may sit on a network mount. Rewrites still go through a temp file in -# the SAME directory and a mv, because a temp file elsewhere plus a -# cross-filesystem mv is not atomic — and "elsewhere" is exactly what -# happens when dir points at a mount. -# -# DELTAS, NOT SNAPSHOTS -# A flush folds in only the growth since the previous flush, tracked in a -# tmpfs cursor. If the live total is BELOW the cursor the accumulator was -# reset (reboot, counter source switch), so the flush rebaselines and adds -# nothing rather than subtracting — a reboot costs at most one interval of -# traffic instead of corrupting the period. The cursor lives in tmpfs on -# purpose: it must die together with the accumulator it tracks, or the first -# flush after a reboot would subtract a stale high-water mark from a -# restarted counter. -# -# HOW ACCURATE THE STORED NUMBERS ARE -# Three different answers, and the store has to say which one applies rather -# than present all three as "bytes used". -# -# 1. UNCOUNTERED OFFLOAD — "degraded". With flow offloading on and no -# counter-flagged flowtable, an offloaded flow's counters stop moving -# while traffic continues; if the nft-map fallback is also unavailable, -# there is nothing left that sees those packets. The total is then a LOWER -# BOUND that can be arbitrarily far below reality, not an approximation -# around it. trafficctl-bytes.sh flags this, totals keeps the flag STICKY -# per device, and it is stored per row here — a consumer must label such a -# row, never add it to a trustworthy sum. -# -# 2. CONNTRACK SOURCE — sampled, so short flows can be missed. Conntrack -# reports what its CURRENTLY TRACKED flows have carried, which means a -# flow that starts and finishes entirely between two samples was never -# seen by any of them. At the dashboard's 2 s poll that is noise; at an -# hourly flush it would be most of the traffic. That is why `sample` is a -# subcommand of its own, driven at sample_interval (tmpfs only, no flash -# writes), and why the flush interval is NOT the sampling interval. -# -# 3. NFT COUNTER MAPS — cumulative since the table was built, so independent -# of sampling rate and exact. They cannot split TCP from UDP, which is why -# those columns report -1 rather than 0. -# -# Common to all three: the counters are read BEFORE the shaper, so they -# describe what arrived for a device, not what was delivered to it. -# -# NEVER IN A REQUEST PATH -# flush is driven by its own timer. A flash write triggered by somebody -# having a browser tab open is the wrong coupling, and if dir is on a dead -# NFS/CIFS mount the writer blocks — which must not be able to stall a device -# poll. Writes are wrapped in a timeout where one is available and a failure -# parks history in a visible error state instead of retrying silently. -# -# Usage: -# trafficctl-history.sh sample advance the live accumulator (tmpfs only) -# trafficctl-history.sh flush fold live totals into the current period -# trafficctl-history.sh read [period] JSON rows for one period (default: current) -# trafficctl-history.sh read JSON rows aggregated over a range -# trafficctl-history.sh periods JSON list of stored periods -# trafficctl-history.sh prune drop periods beyond the retention count -# trafficctl-history.sh status JSON: enabled, dir, writability, last error -# trafficctl-history.sh keeper the procd service loop (sample + flush) -# trafficctl-history.sh validate-dir

exit 0 if p is an allowed store dir - -. /usr/local/bin/trafficctl-fw.sh - -# Named by absolute path, as they must be on the router; the tests sed these -# lines into their scratch directory rather than have the shipped script carry -# test-only overrides (same approach as trafficctl-totals.sh and the ledger -# paths in trafficctl-fw.sh). All four are tmpfs: see DELTAS, NOT SNAPSHOTS -# above for why the cursor in particular must not survive a reboot. -CURSOR="/tmp/trafficctl_history.cursor" -ERRFILE="/tmp/trafficctl_history.err" -STAMP="/tmp/trafficctl_history.stamp" -LOCKD="/tmp/trafficctl_history.lock.d" -TOTALS_STATE="/tmp/trafficctl_totals.state" -IFCURSOR="/tmp/trafficctl_history.ifcursor" -# Per-period, and suffixed with the period id so a period roll starts a fresh -# one instead of needing to be cleared. tmpfs: it is rebuilt from the durable -# file whenever it is missing, which is every boot. -IFACC="/tmp/trafficctl_history.ifacc" - -# Row layout, tab-separated: -# key mac ip name rx tx tcp udp first_seen last_seen degraded -# key is "mac:" or "ip:" (see hist_key). Fields are appended at the -# END in later versions so an older reader keeps working, same rule the -# shape/limit record formats follow. -FORMAT=1 - -hist_enabled() { - [ "$(uci -q get trafficctl.history.enabled 2>/dev/null)" = "1" ] -} - -# The store directory is both a mkdir -p target and a delete target (prune -# removes *.tsv inside it), so an unconstrained value would hand the write ACL -# arbitrary directory creation plus the removal of any .tsv on the filesystem. -# That is the same mistake tctl_validate_log_file exists to prevent, and it is -# enforced HERE as well as in the rpcd setter — a value that reached the config -# by another route must not be honoured either. -# -# The allowed roots cover the cases the feature is for: the package's own state -# directory, and the usual mount points, which is where a network share or a -# USB disk lands. -HIST_DIR_DEFAULT="/etc/trafficctl/history" - -hist_validate_dir() { - local d="$1" - case "$d" in - */../*|*/..|../*|..) return 1 ;; - *[\'\"\$\`\|\;\&\<\>]*) return 1 ;; - /etc/trafficctl/*|/mnt/*|/media/*|/srv/*|/tmp/*) ;; - *) return 1 ;; - esac - # A bare root would make prune's delete set the whole of /mnt. - case "$d" in - /etc/trafficctl/|/mnt/|/media/|/srv/|/tmp/) return 1 ;; - esac - return 0 -} - -hist_dir() { - local d - d=$(uci -q get trafficctl.history.dir 2>/dev/null) - d="${d%/}" - # An absolute path inside an allowed root, or the default. A relative path - # would resolve against whatever directory the caller happened to be in — - # the procd service, rpcd and an interactive shell all differ — and - # silently scatter period files. - hist_validate_dir "$d" || d="$HIST_DIR_DEFAULT" - printf '%s\n' "$d" -} - -hist_period_kind() { - case "$(uci -q get trafficctl.history.period 2>/dev/null)" in - day) printf 'day\n' ;; - week) printf 'week\n' ;; - *) printf 'month\n' ;; - esac -} - -hist_keep() { - local k - k=$(uci -q get trafficctl.history.keep 2>/dev/null) - case "$k" in - ''|*[!0-9]*) k=12 ;; - esac - [ "$k" -lt 1 ] && k=1 - [ "$k" -gt 120 ] && k=120 - printf '%s\n' "$k" -} - -hist_interval() { - local i - i=$(uci -q get trafficctl.history.interval 2>/dev/null) - case "$i" in - ''|*[!0-9]*) i=3600 ;; - esac - # Floor of 300 s. The point of this store is to stay off the flash write - # path; a 10 s interval would reproduce exactly the problem that put the - # live accumulator in tmpfs. - [ "$i" -lt 300 ] && i=300 - printf '%s\n' "$i" -} - -# How often the live accumulator is advanced. Separate from the flush interval -# and much shorter, because of accuracy note 2 above: with a conntrack source, -# anything that starts and ends between two samples is invisible. This costs a -# conntrack read and a tmpfs write, and never touches flash. -hist_sample_interval() { - local i - i=$(uci -q get trafficctl.history.sample_interval 2>/dev/null) - case "$i" in - ''|*[!0-9]*) i=60 ;; - esac - [ "$i" -lt 10 ] && i=10 - [ "$i" -gt 3600 ] && i=3600 - printf '%s\n' "$i" -} - -# Period id for a timestamp. ISO week uses %G with %V, not %Y: in the days -# where the calendar year and the ISO week year disagree, %Y-%V names a week -# that belongs to the other year and two different weeks collide on one id. -hist_period_id() { - local when="${1:-}" kind - kind=$(hist_period_kind) - case "$kind" in - day) set -- '+%Y-%m-%d' ;; - week) set -- '+%G-W%V' ;; - *) set -- '+%Y-%m' ;; - esac - if [ -n "$when" ]; then - date -d "@$when" "$1" 2>/dev/null || date "$1" - else - date "$1" - fi -} - -hist_file() { printf '%s/%s.tsv\n' "$(hist_dir)" "$1"; } - -# Interface totals live in their OWN file per period, not as an extra record -# type in the device file (#102). -# -# The issue proposed a type column. A separate file is better for the reason -# that matters here: hist_read emits every row it finds as a device, so an -# interface row sharing the file would be reported AS a device by any reader -# that predates the change — including the History tab as shipped in v1.22.0. -# A file the old reader never opens cannot be misread. -hist_iffile() { printf '%s/%s.if.tsv\n' "$(hist_dir)" "$1"; } - -# Per-interface accumulation can be turned off on its own: on a single-WAN -# router it is a handful of rows nobody reads, and the point of the feature is -# multi-WAN. -hist_ifaces_enabled() { - [ "$(uci -q get trafficctl.history.interfaces 2>/dev/null)" != "0" ] -} - -hist_err_set() { - printf '%s\t%s\n' "$(date +%s)" "$1" > "$ERRFILE" 2>/dev/null - tctl_log config "history: $1" 2>/dev/null || true -} -hist_err_clear() { rm -f "$ERRFILE" 2>/dev/null; } - -# Wrap a durable write so a hung mount cannot park this process for ever. -# BusyBox ships timeout, but not every build enables it, so its absence -# degrades to an unguarded call rather than to no write at all. -hist_guard() { - if command -v timeout >/dev/null 2>&1; then - timeout 15 "$@" - else - "$@" - fi -} - -# "mac:" where a MAC can be established, else "ip:". -# -# IP is the wrong key for history even though it is the right one for live -# monitoring: a device offline for a week comes back on a different lease, and -# its old address gets handed to something else — so IP-keyed history silently -# merges two devices. MAC is stable. -# -# It is not always available. Clients behind a downstream router and anything -# in extra_subnets have no lease and no neighbour entry here, and -# tctl_ip_is_nexthop deliberately refuses a router's own MAC (it is the source -# of every packet it forwards, so trusting it would collapse a whole subnet -# into one row). Those get an ip: key, marked as such, so the UI can say which -# history is stable and which is best-effort. -# -# A device that appears first without a MAC and later with one gets a SECOND -# row rather than having the first adopted. Adoption would be a guess that the -# two are the same device, and the case it would fix (a routed client moving -# onto the local LAN) is rare while the case it would break (an address reused -# by something else) silently merges unrelated traffic. -hist_key() { - local ip="$1" mac - mac=$(tctl_target_mac "$ip" 2>/dev/null) || mac="" - if [ -n "$mac" ]; then - printf 'mac:%s\t%s\n' "$mac" "$mac" - else - printf 'ip:%s\t-\n' "$ip" - fi -} - -# Name precedence: manual alias > DHCP lease > cached reverse DNS — the same -# order trafficctl-summary.sh applies. It is reimplemented here rather than -# shared because summary resolves names for every device in one awk pass on a -# 2 s poll, and this runs once an hour for a handful of changed rows; the -# ORDER is the part that must not diverge. -hist_name() { - local ip="$1" n - n=$(awk -v ip="$ip" -F'[ \t]+' '$1 == ip { $1 = ""; sub(/^[ \t]+/, ""); print; exit }' \ - /etc/trafficctl/names 2>/dev/null) - [ -n "$n" ] && { printf '%s\n' "$n"; return 0; } - n=$(awk -v ip="$ip" '$3 == ip && $4 != "*" { print $4; exit }' \ - "${TCTL_LEASES_FILE:-/tmp/dhcp.leases}" 2>/dev/null) - [ -n "$n" ] && { printf '%s\n' "$n"; return 0; } - n=$(awk -v ip="$ip" -F'\t' '$1 == ip && $2 != "-" { print $2; exit }' \ - /tmp/trafficctl_rdns_cache 2>/dev/null) - [ -n "$n" ] && [ "$n" != "-" ] && { printf '%s\n' "$n"; return 0; } - printf '\n' -} - -# Tabs and newlines would corrupt the row format; a name comes from a DHCP -# lease or a PTR record, neither of which this script controls. -hist_sanitize() { - printf '%s' "$1" | tr -d '\t\r\n' | cut -c1-64 -} - -hist_lock() { - local tries=0 - while ! mkdir "$LOCKD" 2>/dev/null; do - tries=$((tries + 1)) - if [ "$tries" -ge 50 ]; then - # Steal rather than skip for ever: a stale lock from a killed - # flush must not freeze history permanently. Losing one interval - # to an interleaved write is the lesser failure. - rmdir "$LOCKD" 2>/dev/null || true - mkdir "$LOCKD" 2>/dev/null || return 1 - return 0 - fi - sleep 0.1 2>/dev/null || sleep 1 - done - return 0 -} -hist_unlock() { rmdir "$LOCKD" 2>/dev/null || true; } - -# ────────────────────────────────────────────────────────────────────────────── -# flush -# ────────────────────────────────────────────────────────────────────────────── -hist_flush() { - local dir pid file tmp now sample keys ip line rc=0 - - hist_enabled || { printf '{"ok":false,"reason":"disabled"}\n'; return 0; } - - dir=$(hist_dir) - if ! hist_guard mkdir -p "$dir" 2>/dev/null; then - hist_err_set "cannot create $dir" - printf '{"ok":false,"reason":"mkdir failed","dir":"%s"}\n' "$dir" - return 1 - fi - if [ ! -w "$dir" ]; then - hist_err_set "$dir is not writable" - printf '{"ok":false,"reason":"not writable","dir":"%s"}\n' "$dir" - return 1 - fi - - pid=$(hist_period_id) - file=$(hist_file "$pid") - now=$(date +%s) - - hist_lock || { - printf '{"ok":false,"reason":"locked"}\n' - return 1 - } - # shellcheck disable=SC2064 # expand now, not at trap time - trap "hist_unlock" EXIT INT TERM - - sample="/tmp/.trafficctl_history.sample.$$" - tmp="$dir/.history.$pid.$$" - # shellcheck disable=SC2064 - trap "rm -f '$sample' '$tmp'; hist_unlock" EXIT INT TERM - - # --all so a device whose last flow expired still reports the total it has - # accumulated; without it a quiet device's growth would be dropped from - # every flush it happened to be idle for. - /usr/local/bin/trafficctl-totals.sh --all 2>/dev/null \ - | sed 's/},{/}\n{/g' > "$sample" - if [ ! -s "$sample" ]; then - hist_err_set "totals produced nothing" - printf '{"ok":false,"reason":"no sample"}\n' - return 1 - fi - - # Resolve key/mac/name per address in the shell, where tctl_* lives, and - # hand awk a plain table. Doing it the other way round would mean calling - # out of awk per device. - keys="/tmp/.trafficctl_history.keys.$$" - # shellcheck disable=SC2064 - trap "rm -f '$sample' '$tmp' '$keys'; hist_unlock" EXIT INT TERM - : > "$keys" - while IFS= read -r line; do - case "$line" in - *'"ip":"'*) ;; - *) continue ;; - esac - ip=${line#*\"ip\":\"} - ip=${ip%%\"*} - tctl_validate_ip "$ip" || continue - printf '%s\t%s\t%s\n' "$ip" "$(hist_key "$ip")" "$(hist_sanitize "$(hist_name "$ip")")" >> "$keys" - done < "$sample" - - awk -v sample="$sample" -v keys="$keys" -v cursor="$CURSOR" -v out="$tmp" \ - -v store="$file" -v now="$now" ' - function num(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return -1 - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /^[0-9]+/)) return -1 - return substr(seg, RSTART, RLENGTH) + 0 - } - BEGIN { - FS = "\t" - # Created unconditionally and up front. If this file did not exist on - # a flush that nonetheless rewrote the period file, the mv below would - # fail, the cursor would stay behind, and the NEXT flush would fold the - # same growth in a second time. - cf = cursor ".new" - printf "" > cf - while ((getline l < keys) > 0) { - n = split(l, f, "\t") - if (n < 3) continue - kkey[f[1]] = f[2]; kmac[f[1]] = f[3]; kname[f[1]] = f[4] - } - close(keys) - - # Cursor: key -> what has already been folded in. - while ((getline l < cursor) > 0) { - n = split(l, f, "\t") - if (n < 5) continue - crx[f[1]] = f[2] + 0; ctx[f[1]] = f[3] + 0 - ctc[f[1]] = f[4] + 0; cud[f[1]] = f[5] + 0 - seen_cursor[f[1]] = 1 - } - close(cursor) - - # Existing rows for this period. - while ((getline l < store) > 0) { - if (l ~ /^#/) continue - n = split(l, f, "\t") - if (n < 10) continue - k = f[1] - order[++norder] = k - rmac[k] = f[2]; rip[k] = f[3]; rname[k] = f[4] - rrx[k] = f[5] + 0; rtx[k] = f[6] + 0 - rtc[k] = f[7] + 0; rud[k] = f[8] + 0 - rfirst[k] = f[9] + 0; rlast[k] = f[10] + 0 - rdeg[k] = (n >= 11 ? f[11] : "false") - have[k] = 1 - } - close(store) - - while ((getline line < sample) > 0) { - if (line !~ /"ip":"/) continue - ip = line - sub(/^.*"ip":"/, "", ip) - sub(/".*$/, "", ip) - if (!(ip in kkey)) continue - k = kkey[ip] - - lrx = num(line, "bytes_in_total"); if (lrx < 0) lrx = 0 - ltx = num(line, "bytes_out_total"); if (ltx < 0) ltx = 0 - ltc = num(line, "bytes_tcp_total") - lud = num(line, "bytes_udp_total") - deg = "false" - if (index(line, "\"degraded\":true") > 0) deg = "true" - - # Two addresses can map to ONE key within a flush (a device that - # changed lease while the cursor still remembers both), so the - # live reading for a key is the sum over its addresses, and the - # cursor comparison happens once, after the loop. - arx[k] += lrx; atx[k] += ltx - if (ltc >= 0) { atc[k] += ltc; ktc[k] = 1 } - if (lud >= 0) { aud[k] += lud; kud[k] = 1 } - if (deg == "true") adeg[k] = "true" - amac[k] = kmac[ip]; aip[k] = ip - if (kname[ip] != "") aname[k] = kname[ip] - touched[k] = 1 - } - close(sample) - - for (k in touched) { - lrx = arx[k] + 0; ltx = atx[k] + 0 - ltc = -1 - if (k in ktc) ltc = atc[k] + 0 - lud = -1 - if (k in kud) lud = aud[k] + 0 - - # Growth only. A live value below the cursor means the accumulator - # restarted; rebaseline and add nothing, because the bytes it is - # now below by were already folded in. - drx = lrx - dtx = ltx - if (seen_cursor[k]) { - drx = 0 - dtx = 0 - if (lrx >= crx[k]) drx = lrx - crx[k] - if (ltx >= ctx[k]) dtx = ltx - ctx[k] - } - dtc = -1; dud = -1 - if (ltc >= 0) { - if (!seen_cursor[k] || ctc[k] < 0) dtc = ltc - else dtc = (ltc >= ctc[k]) ? ltc - ctc[k] : 0 - } - if (lud >= 0) { - if (!seen_cursor[k] || cud[k] < 0) dud = lud - else dud = (lud >= cud[k]) ? lud - cud[k] : 0 - } - - if (!(k in have)) { - order[++norder] = k - have[k] = 1 - rfirst[k] = now - rrx[k] = 0; rtx[k] = 0; rtc[k] = 0; rud[k] = 0 - rdeg[k] = "false" - } - rrx[k] += drx; rtx[k] += dtx - if (dtc >= 0) rtc[k] += dtc - if (dud >= 0) rud[k] += dud - if (amac[k] != "" && amac[k] != "-") rmac[k] = amac[k] - rip[k] = aip[k] - # Keep the last name we knew. A device that goes offline loses its - # lease, so re-reading an empty name over a good one would erase - # the only label its history will ever have. - if (aname[k] != "") rname[k] = aname[k] - if (adeg[k] == "true") rdeg[k] = "true" - # Only movement counts as activity. A device sitting idle should - # not keep refreshing last_seen for a whole month. - if (drx > 0 || dtx > 0) rlast[k] = now - else if (rlast[k] == 0) rlast[k] = now - - ncrx[k] = lrx; nctx[k] = ltx; nctc[k] = ltc; ncud[k] = lud - written[k] = 1 - } - - printf "# trafficctl-history %d\n", 1 > out - for (i = 1; i <= norder; i++) { - k = order[i] - if (!(k in have) || emitted[k]) continue - emitted[k] = 1 - nm = rname[k]; if (nm == "") nm = "-" - mc = rmac[k]; if (mc == "") mc = "-" - dg = rdeg[k]; if (dg == "") dg = "false" - printf "%s\t%s\t%s\t%s\t%.0f\t%.0f\t%.0f\t%.0f\t%d\t%d\t%s\n", \ - k, mc, rip[k], nm, rrx[k], rtx[k], rtc[k], rud[k], \ - rfirst[k], rlast[k], dg > out - } - close(out) - - # The cursor keeps keys that were NOT in this sample: a device absent - # for one flush must not have its next reading treated as a fresh - # baseline, or its whole lifetime total would be folded in twice. - for (k in seen_cursor) { - if (k in written) continue - printf "%s\t%.0f\t%.0f\t%.0f\t%.0f\n", k, crx[k], ctx[k], ctc[k], cud[k] > cf - } - for (k in written) { - printf "%s\t%.0f\t%.0f\t%.0f\t%.0f\n", k, ncrx[k], nctx[k], nctc[k], ncud[k] > cf - } - close(cf) - }' /dev/null; then - hist_err_set "cannot write $file" - printf '{"ok":false,"reason":"write failed","file":"%s"}\n' "$file" - return 1 - fi - # The cursor advances ONLY after the period file is safely in place. - # Advancing it first and then failing the write would discard the deltas - # for good; this way the same growth is simply folded in next time. - mv "$CURSOR.new" "$CURSOR" 2>/dev/null || true - printf '%s\n' "$now" > "$STAMP" 2>/dev/null - hist_err_clear - - # Only after the device file is safely in place. A failure here is not a - # failure of the flush: the interface series is additive, and losing one - # interval of it must not make the caller think the device totals did not - # land. - hist_if_flush || hist_err_set "interface totals could not be written" - - - printf '{"ok":true,"period":"%s","devices":%s,"at":%s}\n' \ - "$pid" "$(grep -vc '^#' "$file" 2>/dev/null || echo 0)" "$now" -} - -# ────────────────────────────────────────────────────────────────────────────── -# Interface totals (#102) -# -# A SECOND SERIES, not a breakdown of the device one, and the distinction is -# not pedantry: -# -# * these bytes are the kernel's own interface counters, read by -# trafficctl-ifaces.sh out of /proc/net/dev. They include the router's own -# traffic, broadcast, and everything per-device accounting cannot -# attribute, so they legitimately DISAGREE with the sum over devices. -# * under flow offloading they are the MORE trustworthy of the two, because -# they come from the driver rather than from conntrack — exactly inverted -# from the device series, where offload is what degrades accuracy. Hence -# hist_if_accuracy below, which must not inherit the device verdict. -# * they answer a question the device series cannot: how much went out of -# wan1 versus wan2 this month. A device's bytes carry no egress interface. -# -# rx/tx are relative to the INTERFACE, not to a client: rx on the WAN device -# is download, rx on br-lan is what the LAN sent upstream. Stored as read, -# with the role, so a consumer can label them rather than guess. -# ────────────────────────────────────────────────────────────────────────────── - -# Interfaces whose bytes are already counted somewhere else, and would -# double-count if recorded: -# enslaved — a bridge port; its traffic is in the bridge's own counters -# lo — loopback -# the IFB — a mirror of LAN ingress that the shaper creates, so every byte -# on it is a byte already counted on the device it mirrors -hist_if_skip() { - local dev="$1" enslaved="$2" ifb - [ "$dev" = "lo" ] && return 0 - [ "$enslaved" = "true" ] && return 0 - ifb=$(uci -q get trafficctl.main.shape_ifb 2>/dev/null) - [ -n "$ifb" ] && [ "$dev" = "$ifb" ] && return 0 - return 1 -} - -# What the interface series is worth. NOT the device verdict: an interface -# counter comes from the driver, so uncountered offload — the thing that makes -# the device totals a lower bound — does not touch it. Reporting "degraded" -# here would be its own kind of wrong. -hist_if_accuracy() { - printf 'exact\n' -} - -# Fold the interface counters into the current period, exactly as the device -# flush does: growth against a tmpfs cursor, and a live value below the cursor -# means the counter restarted rather than that traffic went backwards. -# -# An interface counter restarting is NOT an edge case here. It happens every -# time the link goes down, which on the multi-WAN box this feature is for is -# routine — so a flap costs one sampling interval instead of corrupting the -# month. -# Fold the growth since the last tick into the tmpfs accumulator and advance -# the cursor. Called on every sample tick, because a cursor that only moved at -# flush time lost up to a whole flush interval of a link's traffic whenever its -# counter restarted — an hour by default, on exactly the multi-WAN box with a -# flapping link this series exists for (#111). The accumulator is in tmpfs, so -# touching it every 60s costs no flash. -# -# The durable file is written by hist_if_flush alone. The accumulator is seeded -# from it when absent (every boot, and on a period roll), which is what makes -# the eventual copy-over safe rather than double-counting. -hist_if_accumulate() { - local dir pid file tmp now sample acc rc=0 - hist_ifaces_enabled || return 0 - dir=$(hist_dir) - pid=$(hist_period_id) - file=$(hist_iffile "$pid") - acc="$IFACC.$pid" - now=$(date +%s) - sample="/tmp/.trafficctl_history.ifsample.$$" - tmp="$acc.$$" - [ -f "$acc" ] && file="$acc" - # shellcheck disable=SC2064 - trap "rm -f '$sample' '$tmp'" EXIT INT TERM - - /usr/local/bin/trafficctl-ifaces.sh 2>/dev/null \ - | sed 's/},{/}\n{/g' > "$sample" - [ -s "$sample" ] || return 0 - - awk -v sample="$sample" -v cursor="$IFCURSOR" -v out="$tmp" -v store="$file" \ - -v now="$now" -v ifb="$(uci -q get trafficctl.main.shape_ifb 2>/dev/null)" ' - function num(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return -1 - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /^[0-9]+/)) return -1 - return substr(seg, RSTART, RLENGTH) + 0 - } - function str(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*\"" - if (!match(line, re)) return "" - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) - } - BEGIN { - FS = "\t" - cf = cursor ".new" - printf "" > cf - while ((getline l < cursor) > 0) { - n = split(l, f, "\t") - if (n < 3) continue - crx[f[1]] = f[2] + 0; ctx[f[1]] = f[3] + 0 - seen[f[1]] = 1 - } - close(cursor) - while ((getline l < store) > 0) { - if (l ~ /^#/) continue - n = split(l, f, "\t") - if (n < 7) continue - d = f[1] - order[++norder] = d - role[d] = f[2]; label[d] = f[3] - rrx[d] = f[4] + 0; rtx[d] = f[5] + 0 - first[d] = f[6] + 0; last[d] = f[7] + 0 - have[d] = 1 - } - close(store) - - while ((getline line < sample) > 0) { - if (line !~ /"dev":"/) continue - d = str(line, "dev") - if (d == "") continue - if (d == "lo") continue - if (index(line, "\"enslaved\":true") > 0) continue - if (ifb != "" && d == ifb) continue - lrx = num(line, "rx_bytes"); if (lrx < 0) continue - ltx = num(line, "tx_bytes"); if (ltx < 0) continue - - # A live counter BELOW the cursor has restarted: the link went - # down and came back, or the driver reset it. The bytes carried - # since then have never been counted by anything, because a - # /proc/net/dev counter is monotonic for the lifetime of the - # interface, so they are the delta. - # - # Adding nothing here is right for the DEVICE series, where the - # live value is a conntrack sum that collapses when flows expire - # and those bytes were already accumulated while the flows lived. - # That premise does not transfer to an interface counter, and the - # zero came across with the code (#111). It also made this branch - # disagree with the unseen-interface case, which always took the - # full counter: the same situation, a counter starting from zero, - # handled two ways depending on whether the cursor happened to - # remember the interface. - drx = lrx; dtx = ltx - if (lrx >= crx[d]) drx = lrx - crx[d] - if (ltx >= ctx[d]) dtx = ltx - ctx[d] - if (!(d in have)) { - order[++norder] = d - have[d] = 1 - first[d] = now - rrx[d] = 0; rtx[d] = 0 - } - rrx[d] += drx; rtx[d] += dtx - r = str(line, "role"); if (r != "") role[d] = r - lb = str(line, "label"); if (lb != "") label[d] = lb - if (drx > 0 || dtx > 0) last[d] = now - else if (last[d] == 0) last[d] = now - ncrx[d] = lrx; nctx[d] = ltx - written[d] = 1 - } - close(sample) - - printf "# trafficctl-history-if 1\n" > out - for (i = 1; i <= norder; i++) { - d = order[i] - if (!(d in have) || emitted[d]) continue - emitted[d] = 1 - rl = role[d]; if (rl == "") rl = "?" - lb = label[d]; if (lb == "") lb = "-" - printf "%s\t%s\t%s\t%.0f\t%.0f\t%d\t%d\n", \ - d, rl, lb, rrx[d], rtx[d], first[d], last[d] > out - } - close(out) - - for (d in seen) if (!(d in written)) - printf "%s\t%.0f\t%.0f\n", d, crx[d], ctx[d] > cf - for (d in written) - printf "%s\t%.0f\t%.0f\n", d, ncrx[d], nctx[d] > cf - close(cf) - }' /dev/null || return 1 - # Only after the accumulator is in place, for the same reason the device - # cursor waits for its period file: advancing first and then failing would - # discard the growth for good, where this way it is folded in next tick. - mv "$IFCURSOR.new" "$IFCURSOR" 2>/dev/null || true - return 0 -} - -# Publish the accumulator to the durable per-period file. Picks up the final -# interval first, so no traffic is stranded in tmpfs at flush time. -hist_if_flush() { - local pid acc file tmp - hist_ifaces_enabled || return 0 - hist_if_accumulate || return 1 - pid=$(hist_period_id) - acc="$IFACC.$pid" - [ -f "$acc" ] || return 0 - file=$(hist_iffile "$pid") - tmp="$(hist_dir)/.history-if.$pid.$$" - # shellcheck disable=SC2064 - trap "rm -f '$tmp'" EXIT INT TERM - hist_guard cp "$acc" "$tmp" 2>/dev/null || return 1 - hist_guard mv "$tmp" "$file" 2>/dev/null || return 1 - return 0 -} - -hist_if_read() { - local dir from to files f p - dir=$(hist_dir) - from="$1"; to="$2" - [ -z "$from" ] && from=$(hist_period_id) - [ -z "$to" ] && to="$from" - files="" - for f in "$dir"/*.if.tsv; do - [ -f "$f" ] || continue - p=$(basename "$f" .if.tsv) - [ "$p" \< "$from" ] && continue - [ "$to" \< "$p" ] && continue - files="$files $f" - done - # shellcheck disable=SC2086 # deliberate splitting over the file list - awk -F'\t' ' - /^#/ { next } - NF >= 7 { - d = $1 - if (!(d in seen)) { order[++n] = d; seen[d] = 1; first[d] = $6 } - role[d] = $2; label[d] = $3 - rx[d] += $4; tx[d] += $5 - if ($6 + 0 < first[d] + 0) first[d] = $6 - if ($7 + 0 > last[d] + 0) last[d] = $7 - } - END { - printf "[" - for (i = 1; i <= n; i++) { - d = order[i] - if (i > 1) printf "," - printf "{\"dev\":\"%s\",\"role\":\"%s\",\"label\":\"%s\",\"bytes_in\":%.0f,\"bytes_out\":%.0f,\"first_seen\":%d,\"last_seen\":%d}", \ - d, role[d], label[d], rx[d], tx[d], first[d], last[d] - } - printf "]\n" - }' $files /dev/null || printf '[]\n' -} - -# ────────────────────────────────────────────────────────────────────────────── -# read / periods -# ────────────────────────────────────────────────────────────────────────────── -hist_read() { - local dir from to files f - dir=$(hist_dir) - from="$1"; to="$2" - [ -z "$from" ] && from=$(hist_period_id) - [ -z "$to" ] && to="$from" - - files="" - for f in "$dir"/*.tsv; do - [ -f "$f" ] || continue - # The interface totals are a separate series in their own file; reading - # them here would report an interface as a device. - case "$f" in *.if.tsv) continue ;; esac - p=$(basename "$f" .tsv) - # String comparison is the right one here: every period id this script - # writes is fixed-width and zero-padded, so lexical order IS - # chronological order. (That is why the day format is %Y-%m-%d and not - # anything locale-shaped.) - [ "$p" \< "$from" ] && continue - [ "$to" \< "$p" ] && continue - files="$files $f" - done - - # shellcheck disable=SC2086 # deliberate word splitting over the file list - awk -F'\t' ' - FNR == 1 { period = FILENAME; sub(/.*\//, "", period); sub(/\.tsv$/, "", period) } - /^#/ { next } - NF >= 10 { - k = $1 - if (!(k in seen)) { order[++n] = k; seen[k] = 1; first[k] = $9 } - mac[k] = ($2 != "-" ? $2 : mac[k]) - ip[k] = $3 - if ($4 != "-") name[k] = $4 - rx[k] += $5; tx[k] += $6; tc[k] += $7; ud[k] += $8 - if ($9 + 0 < first[k] + 0) first[k] = $9 - if ($10 + 0 > last[k] + 0) last[k] = $10 - if ($11 == "true") deg[k] = 1 - periods[k] = periods[k] (index(periods[k], "\"" period "\"") ? "" : (periods[k] == "" ? "" : ",") "\"" period "\"") - } - END { - printf "[" - for (i = 1; i <= n; i++) { - k = order[i] - nm = "" - if (k in name) nm = name[k] - kind = "ip" - if (k ~ /^mac:/) kind = "mac" - if (i > 1) printf "," - printf "{\"key\":\"%s\",\"key_kind\":\"%s\",\"mac\":\"%s\",\"ip\":\"%s\",\"name\":\"%s\",\"bytes_in\":%.0f,\"bytes_out\":%.0f,\"bytes_tcp\":%.0f,\"bytes_udp\":%.0f,\"first_seen\":%d,\"last_seen\":%d,\"degraded\":%s,\"periods\":[%s]}", \ - k, kind, (mac[k] == "" ? "-" : mac[k]), ip[k], nm, \ - rx[k], tx[k], tc[k], ud[k], first[k], last[k], \ - (k in deg ? "true" : "false"), periods[k] - } - printf "]\n" - }' $files /dev/null || printf '[]\n' -} - -hist_periods() { - local dir f p - dir=$(hist_dir) - printf '[' - n=0 - for f in "$dir"/*.tsv; do - [ -f "$f" ] || continue - # Skip the interface companion: a period is listed once, by its device - # file, or "2026-10" and "2026-10.if" would both appear as periods. - case "$f" in *.if.tsv) continue ;; esac - p=$(basename "$f" .tsv) - [ "$n" -gt 0 ] && printf ',' - printf '{"period":"%s","devices":%s,"bytes":%s}' \ - "$p" \ - "$(grep -vc '^#' "$f" 2>/dev/null || echo 0)" \ - "$(awk -F'\t' '!/^#/ && NF >= 10 { s += $5 + $6 } END { printf "%.0f", s + 0 }' "$f" 2>/dev/null || echo 0)" - n=$((n + 1)) - done - printf ']\n' -} - -hist_prune() { - local dir keep pid total f dropped=0 - dir=$(hist_dir) - keep=$(hist_keep) - pid=$(hist_period_id) - # The current period is never a retention candidate — it is still being - # written to, and "keep 1" must not mean "delete the data you are - # collecting right now". - # A PERIOD is the unit of retention, and a period is now two files: the - # device totals and the interface totals (#102). Listing *.tsv and - # stripping .tsv would turn "2026-10.if.tsv" into a period called - # "2026-10.if" — never equal to the current period id, so it would be - # pruned as if it were ancient history while its device file survived. - # Enumerate periods from the device files only, then drop both. - # shellcheck disable=SC2046 # deliberate splitting: one word per period id - set -- $(find "$dir" -name '*.tsv' -type f 2>/dev/null \ - | sed 's|.*/||' | grep -v '\.if\.tsv$' | sed 's|\.tsv$||' \ - | grep -vxF "$pid" | sort) - total=$# - while [ "$total" -gt "$keep" ] && [ "$#" -gt 0 ]; do - rm -f "$dir/$1.tsv" 2>/dev/null && dropped=$((dropped + 1)) - rm -f "$dir/$1.if.tsv" 2>/dev/null - total=$((total - 1)) - shift - done - printf '{"ok":true,"kept":%s,"dropped":%s}\n' "$keep" "$dropped" -} - -# What the numbers in the store are worth right now, as one word, derived from -# the live offload mode. Reported so a consumer can label the view instead of -# presenting a lower bound as a measurement. -# -# degraded — uncountered offload, no nft fallback: a LOWER BOUND -# counter — nft counter maps: exact, no protocol split -# sampled — conntrack: exact to within flows shorter than sample_interval -hist_accuracy() { - local mode src - mode=$(tctl_get_offload_mode 2>/dev/null) - # What the sampler actually settled on last time it ran, which is the - # authority on whether the nft fallback was available — the offload mode - # alone cannot tell us that. - src=$(awk '{ print $11; exit }' "$TOTALS_STATE" 2>/dev/null) - case "$mode" in - hardware|software) - if [ "$src" = "nft" ]; then printf 'counter\n'; else printf 'degraded\n'; fi - ;; - *) - if [ "$src" = "nft" ]; then printf 'counter\n'; else printf 'sampled\n'; fi - ;; - esac -} - -hist_status() { - local dir en pid last err errat w - dir=$(hist_dir) - en=false - hist_enabled && en=true - pid=$(hist_period_id) - last=$(cat "$STAMP" 2>/dev/null) - case "$last" in ''|*[!0-9]*) last=0 ;; esac - err=""; errat=0 - if [ -f "$ERRFILE" ]; then - errat=$(cut -f1 "$ERRFILE" 2>/dev/null) - err=$(cut -f2- "$ERRFILE" 2>/dev/null) - case "$errat" in ''|*[!0-9]*) errat=0 ;; esac - fi - w=false - [ -d "$dir" ] && [ -w "$dir" ] && w=true - printf '{"enabled":%s,"dir":"%s","writable":%s,"period":"%s","period_kind":"%s","interval":%s,"sample_interval":%s,"keep":%s,"format":%s,"last_flush":%s,"accuracy":"%s","offload":"%s","interfaces":%s,"iface_accuracy":"%s","error":"%s","error_at":%s}\n' \ - "$en" "$dir" "$w" "$pid" "$(hist_period_kind)" \ - "$(hist_interval)" "$(hist_sample_interval)" "$(hist_keep)" "$FORMAT" "$last" \ - "$(hist_accuracy)" "$(tctl_get_offload_mode 2>/dev/null)" \ - "$(hist_ifaces_enabled && echo true || echo false)" "$(hist_if_accuracy)" \ - "$(printf '%s' "$err" | tr -d '\042\134')" "$errat" -} - -# The procd service loop. Two cadences in one process, which is the whole -# reason this is a service and not a cron line: sampling has to be frequent -# (accuracy note 2 — a conntrack flow shorter than the sample interval is -# invisible) and costs only a tmpfs write, while flushing is rare because it -# touches durable storage. -# -# Re-reads its own configuration every tick rather than caching it at start: -# changing the interval in the UI should take effect without the operator -# having to know there is a service to restart. -hist_keeper() { - local last=0 now interval - - # Pick up where a previous run left off, so a restart does not reset the - # flush clock and silently stretch the gap to the durable store. - last=$(cat "$STAMP" 2>/dev/null) - case "$last" in ''|*[!0-9]*) last=0 ;; esac - - while :; do - if hist_enabled; then - /usr/local/bin/trafficctl-totals.sh --all >/dev/null 2>&1 - # Both series advance their tmpfs cursor on every tick. Only the - # durable store waits for the flush interval below. - hist_if_accumulate >/dev/null 2>&1 - now=$(date +%s) - interval=$(hist_interval) - # A clock that jumped backwards (NTP settling after boot, which is - # the norm on a router with no RTC) would otherwise park the next - # flush an interval into the past's future and stall the store. - [ "$now" -lt "$last" ] && last=0 - if [ $((now - last)) -ge "$interval" ]; then - hist_flush >/dev/null 2>&1 - hist_prune >/dev/null 2>&1 - last=$now - fi - fi - sleep "$(hist_sample_interval)" - done -} - -case "$1" in - sample) - # Advance the accumulator and throw the JSON away. Cheap, tmpfs only, - # and the thing that makes an hourly flush mean anything. - hist_enabled || { printf '{"ok":false,"reason":"disabled"}\n'; exit 0; } - /usr/local/bin/trafficctl-totals.sh --all >/dev/null 2>&1 - # The interface series advances its own tmpfs cursor on the same tick. - # Leaving it to the flush meant a counter that restarted in between - # lost everything since the last flush, not since the last tick (#111). - hist_if_accumulate >/dev/null 2>&1 - printf '{"ok":true,"at":%s}\n' "$(date +%s)" - ;; - flush) hist_flush ;; - keeper) hist_keeper ;; - # Exposed so the rpcd setter validates against THIS implementation rather - # than a second copy of the rule that can drift away from it. - validate-dir) hist_validate_dir "${2%/}" ;; - read) hist_read "$2" "$3" ;; - read-ifaces) hist_if_read "$2" "$3" ;; - periods) hist_periods ;; - prune) hist_prune ;; - status) hist_status ;; - *) - printf 'Usage: %s {sample|flush|keeper|validate-dir |read [period [to]]|read-ifaces [period [to]]|periods|prune|status}\n' "$0" >&2 - exit 1 - ;; -esac diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-ifaces.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-ifaces.sh deleted file mode 100755 index f7ab631c8..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-ifaces.sh +++ /dev/null @@ -1,299 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Per-interface byte counters for the global (bmon-style) overview. -# -# Output: JSON array -# [{"dev":"eth1","label":"wan","role":"wan","tunnel":false,"primary":true, -# "defroute":true,"enslaved":false,"up":true,"rx_bytes":N,"tx_bytes":N}] -# -# rx/tx are the kernel's own counters, i.e. relative to the INTERFACE, not to -# the client: rx on the WAN device is download, rx on br-lan is what the LAN -# sent upstream. Rates are not computed here — the frontend diffs two samples -# exactly as it already does for trafficctl-bytes.sh, so this script stays -# stateless and one sample cheap. -# -# Memory / fork discipline (128–512 MB routers; the dashboard polls this on -# its Poll interval, as often as every 2 s): -# * the hot path is ONE read of /proc/net/dev and ONE awk — nothing else -# * the role map is the expensive part (tctl_lan_subnets forks ubus and -# jsonfilter per configured network, and merely sourcing trafficctl-fw.sh -# runs `nft list tables`), so it is computed on a cold path and memoized -# in tmpfs with a TTL, the same idiom the rdns and netify caches use. -# trafficctl-fw.sh is therefore sourced ONLY inside build_cache() -# * even the cold path classifies every interface in a SINGLE awk rather -# than forking one per device out of a `while read` loop -# * the cache is a few dozen bytes per interface and lives in /tmp, so -# polling never touches flash -# -# Usage: trafficctl-ifaces.sh - -CACHE="${TCTL_IFROLE_CACHE:-/tmp/trafficctl_ifroles}" -PROC_NET_DEV="${TCTL_PROC_NET_DEV:-/proc/net/dev}" -SYSFS="${TCTL_SYSFS_NET:-/sys/class/net}" -# 60 s: a WAN failover or a tunnel changing role shows up within a minute, -# which is 30 polls' worth of work saved at the default 2 s interval. A device -# that is entirely NEW does not wait for the TTL — see the #MISS retry below. -TTL="${TCTL_IFROLE_TTL:-60}" - -build_cache() { - # COLD PATH ONLY. Never call this from the per-poll path. - . /usr/local/bin/trafficctl-fw.sh - - # LAN = the L3 devices trafficctl already monitors (br-lan, br-guest, - # eth0.20 …). Deliberately the L3 devices and not their bridge ports: - # listing both would show the same bytes twice. Naming alone does not - # achieve that — lan2/lan3/phy0-ap0 are ports of br-lan and look like - # ordinary devices — so enslavement is detected from sysfs below. - _lan=$(tctl_get_lan_devices 2>/dev/null | tr '\n' ' ') - - # Devices carrying a default route, v4 or v6. This is NOT the same as - # "the WAN" — see the role rules in the awk below. - _defroute=$( { ip -4 route show default; ip -6 route show default; } 2>/dev/null \ - | awk '{ for (i = 1; i < NF; i++) if ($i == "dev") print $(i + 1) }' \ - | sort -u | tr '\n' ' ') - - # Friendly labels: the uci/ubus interface name for each L3 device, so the - # overview says "wan"/"lan"/"vpn_fi" instead of "eth1"/"br-lan"/"awg0". - # One ubus call, parsed line-wise — "interface" always precedes - # "l3_device" inside an entry, and the outer '"interface": [' line has no - # string value so it cannot seed a stale name. - # - # Flattened to ONE space-separated "dev name dev name …" list, not kept as - # lines: a multi-line value passed through `awk -v` is rejected outright by - # some awks ("newline in string"), so the pairs are read positionally - # below. Neither a device name nor a uci interface name can contain a - # space, so the pairing is unambiguous. - _labels=$(ubus call network.interface dump 2>/dev/null | awk ' - function val(line, seg) { - if (!match(line, /:[ \t]*"/)) return "" - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) - } - /"interface"[ \t]*:/ { name = val($0); next } - /"l3_device"[ \t]*:/ { - dev = val($0) - if (dev != "" && name != "") { print dev " " name; name = "" } - }' | tr '\n' ' ') - - # Every device present in /proc/net/dev gets a line, even the ones with no - # recognisable role. That is what makes the #MISS retry below terminate: - # after a rebuild, a lookup can only miss if an interface appeared in the - # meantime. - _tmp="$CACHE.$$" - { - echo "# $(date +%s)" - awk -v defroute="$_defroute" -v lan="$_lan" -v labels="$_labels" -v sysfs="$SYSFS" ' -# Device-name patterns for tunnels. This is a LABEL as much as a role: it tells -# the UI how to group and badge the interface. ppp*/pppoe* is deliberately -# ABSENT — pppoe-wan is the standard OpenWrt DSL uplink, not a VPN, and badging -# it as one would be wrong on every PPPoE line. -function is_tun(d) { - return (d ~ /^(wg|awg|tun|tap|gre|sit|vti|ipsec|ip6tnl|xfrm|zt|nordlynx|tailscale|l2tp|pptp)/) -} -# Which of several uci interfaces sharing one l3_device gives the device its -# name. A dual-stack uplink is three interfaces on one device — "wan", "wan6" -# and "wan6_alias0" — and whichever the ubus dump happened to emit last used to -# win, so a router could title its uplink row "wan6_alias0". Lower score wins; -# ties break on length then lexically, so the result never depends on dump -# order. -function lbl_score(n_, s) { - s = 0 - if (n_ ~ /_alias/) s += 4 - if (n_ ~ /6$/ || n_ ~ /6_/) s += 2 - return s -} -BEGIN { - n = split(defroute, a, " ") - for (i = 1; i <= n; i++) if (a[i] != "") isdef[a[i]] = 1 - n = split(lan, a, " ") - for (i = 1; i <= n; i++) if (a[i] != "") islan[a[i]] = 1 - # "dev name dev name …" — read two at a time, see the flattening above. - n = split(labels, a, " ") - for (i = 1; i + 1 <= n; i += 2) { - _d = a[i]; _n = a[i + 1] - if (_d == "" || _n == "") continue - # The uci network named wan/wan6 (or an alias on one) marks the uplink - # even when something else currently owns the default route — and it is - # taken from ANY of the device names, not just the one that wins below. - if (_n == "wan" || _n == "wan6" || _n ~ /^wan6?_/) isuciwan[_d] = 1 - s = lbl_score(_n) - if (lblset[_d] != 1) { lbl[_d] = _n; lblscore[_d] = s; lblset[_d] = 1; continue } - if (s < lblscore[_d] || (s == lblscore[_d] && \ - (length(_n) < length(lbl[_d]) || \ - (length(_n) == length(lbl[_d]) && _n < lbl[_d])))) { - lbl[_d] = _n; lblscore[_d] = s - } - } -} -NR > 2 { - if (index($0, ":") == 0) next - d = substr($0, 1, index($0, ":") - 1) - gsub(/[ \t]/, "", d) - if (d == "" || d == "lo") next - devs[++nd] = d - tun[d] = is_tun(d) ? 1 : 0 - - # Enslaved = a port of a bridge (lan2, lan3, phy0-ap0 …), which reports the - # very same bytes its bridge already reports. A sysfs lookup, because the - # names give nothing away: "lan3" and "br-lan" look equally like top-level - # devices. Reading master/ifindex rather than testing the symlink keeps it - # to the one primitive awk has. - ens[d] = 0 - if ((getline _x < (sysfs "/" d "/master/ifindex")) > 0) ens[d] = 1 - close(sysfs "/" d "/master/ifindex") - - # Role rules, in priority order. - # - # Every test below compares a VALUE, never `d in arr`. Referencing arr[d] in - # an awk condition CREATES the element, so a later membership test would be - # true for every device that merely reached the condition — which is exactly - # how "defroute" came out true for every non-LAN, non-tunnel interface. - # - # Tunnels are checked before default routes because a full-tunnel router - # (WireGuard/AmneziaWG, common on these boxes) has its default route via - # awg0 while the physical uplink still carries every byte ENCAPSULATED. - # Classifying awg0 as the WAN would both hide the real uplink under "other" - # and double-count the same traffic, so a tunnel stays a tunnel and the - # uplink stays the WAN; "defroute" records who actually holds the route. - if (ens[d] == 1) role[d] = "other" - else if (islan[d] == 1) role[d] = "lan" - else if (tun[d] == 1) role[d] = "vpn" - else if (isuciwan[d] == 1 || isdef[d] == 1) { role[d] = "wan"; nwan++ } - else role[d] = "other" -} -END { - # Fallback: a router whose ONLY default route is a tunnel and which has no - # uci "wan" would otherwise have no WAN row at all, leaving the overview - # headline blank. Promote the route holder in that case only. - if (!nwan) { - for (i = 1; i <= nd; i++) { - if (isdef[devs[i]] == 1 && ens[devs[i]] != 1) { role[devs[i]] = "wan"; nwan++ } - } - } - # Exactly one interface is flagged primary — the headline graph shows that - # one rather than a sum, because summing several WANs double-counts a - # failover pair and mixes two unrelated links (see #28). - for (i = 1; i <= nd && !prim; i++) { - d = devs[i] - if (role[d] == "wan" && isuciwan[d] == 1) prim = d - } - for (i = 1; i <= nd && !prim; i++) { - d = devs[i] - if (role[d] == "wan" && isdef[d] == 1) prim = d - } - for (i = 1; i <= nd && !prim; i++) { - if (role[devs[i]] == "wan") prim = devs[i] - } - for (i = 1; i <= nd; i++) { - d = devs[i] - dfl = 0; if (isdef[d] == 1) dfl = 1 - pr = 0; if (d == prim) pr = 1 - en = 0; if (ens[d] == 1) en = 1 - lb = "-"; if (lblset[d] == 1) lb = lbl[d] - printf "%s %s %d %d %d %d %s\n", d, role[d], tun[d], pr, dfl, en, lb - } -}' "$PROC_NET_DEV" 2>/dev/null - } > "$_tmp" 2>/dev/null - # Rename into place so a concurrent poll never reads a half-written map. - [ -s "$_tmp" ] && mv "$_tmp" "$CACHE" 2>/dev/null - rm -f "$_tmp" 2>/dev/null -} - -emit() { - awk -v cache="$CACHE" -v sysfs="$SYSFS" ' -BEGIN { - while ((getline l < cache) > 0) { - if (substr(l, 1, 1) == "#") continue - if (split(l, f, " ") < 7) continue - # known[] is a separate explicit flag rather than `f[1] in role`, - # because the fields read below auto-vivify their own arrays and a - # membership test on any of them would then be true for every device. - known[f[1]] = 1 - role[f[1]] = f[2]; tun[f[1]] = f[3] + 0; prim[f[1]] = f[4] + 0 - dfr[f[1]] = f[5] + 0; ens[f[1]] = f[6] + 0; lbl[f[1]] = f[7] - } - close(cache) - printf "[" -} -NR > 2 { - # Split on the COLON, not on whitespace. The kernel pads the name field to - # a fixed width, so a long interface name or a counter wide enough to fill - # it leaves no space before rx_bytes ("enp0s31f6:12345678") and every - # positional field after it shifts by one. - if (index($0, ":") == 0) next - dev = substr($0, 1, index($0, ":") - 1) - gsub(/[ \t]/, "", dev) - if (dev == "" || dev == "lo") next - rest = substr($0, index($0, ":") + 1) - sub(/^[ \t]+/, "", rest) - if (split(rest, c, /[ \t]+/) < 16) next - - # Written as if/else rather than a ternary on purpose: an awk line starting - # "ident = (" trips the array-assignment bashism scanner in - # tests/test_openwrt_compat.sh, which cannot tell shell from an embedded - # awk program. - r = "other" - if (known[dev] == 1) { r = role[dev] } else { miss = 1 } - - # operstate is a sysfs read, not a fork, so it is cheap enough for the - # poll path — and a tunnel that is down while still holding counters is - # exactly what the overview needs to show. - state = "" - if ((getline state < (sysfs "/" dev "/operstate")) <= 0) state = "" - close(sysfs "/" dev "/operstate") - up = "false" - if (state == "up" || state == "unknown") { up = "true" } - - name = dev; gsub(/["\\]/, "", name) - label = name - if (lbl[dev] != "" && lbl[dev] != "-") { label = lbl[dev] } - gsub(/["\\]/, "", label) - - if (n++ > 0) printf "," - # %.0f, never %d: these are 64-bit kernel counters and busybox awk formats - # %d through a 32-bit int (see tests/test_byte_overflow.sh). /proc/net/dev - # is the worst offender in the tree — an uptime of a few days puts any - # active interface past 2 GiB. - printf "{\"dev\":\"%s\",\"label\":\"%s\",\"role\":\"%s\",\"tunnel\":%s,\"primary\":%s,\"defroute\":%s,\"enslaved\":%s,\"up\":%s,\"rx_bytes\":%.0f,\"tx_bytes\":%.0f}", \ - name, label, r, \ - (tun[dev] ? "true" : "false"), (prim[dev] ? "true" : "false"), \ - (dfr[dev] ? "true" : "false"), (ens[dev] ? "true" : "false"), \ - up, c[1] + 0, c[9] + 0 -} -END { - printf "]" - if (miss) printf "#MISS" -}' "$PROC_NET_DEV" 2>/dev/null -} - -# Guard before anything else. awk still runs its BEGIN block when the input -# file is missing but never reaches END, so emit() would print a bare "[" — -# invalid JSON that the frontend surfaces as a dead panel rather than an empty -# one. Nothing below is worth doing without counters anyway. -[ -r "$PROC_NET_DEV" ] || { echo '[]'; exit 0; } - -NOW=$(date +%s) -TS=0 -if [ -f "$CACHE" ]; then - # Builtin read, no fork: the header line is "# ". - read -r _hash TS < "$CACHE" 2>/dev/null - case "$TS" in ''|*[!0-9]*) TS=0 ;; esac -fi -[ $((NOW - TS)) -ge "$TTL" ] && build_cache - -OUT=$(emit) -case "$OUT" in -*'#MISS') - # An interface the cached map has never seen showed up — a tunnel came up, - # a USB modem was plugged in, a guest bridge was created. Rebuild once and - # re-emit so it is classified immediately instead of sitting in "other" - # until the TTL expires. build_cache() enumerates /proc/net/dev itself, so - # the retry always resolves and this cannot spin. - build_cache - OUT=$(emit) - ;; -esac - -[ -z "$OUT" ] && OUT="[]" -printf '%s\n' "${OUT%\#MISS}" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-macfilter-add.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-macfilter-add.sh deleted file mode 100755 index d62ae04cd..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-macfilter-add.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Block device WiFi access by adding its MAC to deny maclist on all interfaces. -# The uci maclist is the durable half; hostapd is then programmed at runtime so -# only the target client is kicked, with no wifi reload. Reports how far that -# runtime half actually got — see the enforcement words in trafficctl-fw.sh. -# Usage: trafficctl-macfilter-add.sh - -. /usr/local/bin/trafficctl-fw.sh - -IP="$1" - -if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-macfilter-add.sh "}' - exit 1 -fi - -if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 -fi - -# Look up MAC from DHCP leases -MAC="" -if [ -f /tmp/dhcp.leases ]; then - MAC=$(awk -v ip="$IP" '$3 == ip {print toupper($2)}' /tmp/dhcp.leases | head -1) -fi - -if [ -z "$MAC" ]; then - MAC=$(ip neigh show "$IP" 2>/dev/null | grep -oE '[0-9a-fA-F:]{17}' | head -1 | tr 'a-f' 'A-F') -fi - -if [ -z "$MAC" ]; then - echo "{\"ok\":false,\"msg\":\"cannot find MAC for $IP\"}" - exit 1 -fi - -# Normalize MAC to lowercase (OpenWrt stores lowercase) -MAC=$(echo "$MAC" | tr 'A-F' 'a-f') - -# Add MAC to maclist on all wifi interfaces -IFACES=$(tctl_get_wifi_interfaces) -if [ -z "$IFACES" ]; then - echo '{"ok":false,"msg":"no wifi interfaces found"}' - exit 1 -fi - -CHANGED=0 -MODE="deny" -for iface in $IFACES; do - # Respect the ACL policy the administrator configured. Forcing macfilter to - # "deny" here used to invert an existing whitelist: the curated allow-list - # would start being read as a block-list, letting in every device it was - # meant to keep out and banning every device it listed. - iface_mode=$(tctl_get_wifi_filter_mode "$iface") - [ "$iface_mode" = "allow" ] && MODE="allow" - - existing=$(uci -q get "wireless.${iface}.maclist") - listed=0 - echo "$existing" | grep -qi "$MAC" && listed=1 - - if [ "$iface_mode" = "allow" ]; then - # Whitelist: blocking means dropping the MAC from the allow-list. - if [ "$listed" = "1" ]; then - uci del_list "wireless.${iface}.maclist=$MAC" - CHANGED=1 - fi - else - # Blacklist: blocking means adding the MAC, creating the list if needed. - if [ -z "$(uci -q get "wireless.${iface}.macfilter")" ]; then - uci set "wireless.${iface}.macfilter=deny" - CHANGED=1 - fi - if [ "$listed" = "0" ]; then - uci add_list "wireless.${iface}.maclist=$MAC" - CHANGED=1 - fi - fi -done - -[ "$CHANGED" = "1" ] && uci commit wireless - -# Applied unconditionally, not just when uci needed editing. Config and runtime -# are two pieces of state: a router whose maclist already names the MAC but -# whose radio never got the ACL entry used to make this a no-op that still -# reported success, so pressing Block again — the obvious reaction to "it did -# not work" — could never recover it. -ENFORCE=$(tctl_hostapd_block_mac "$MAC" "$MODE") -BAN_MIN=$(( TCTL_WIFI_BAN_MS / 60000 )) - -# The uci entry is kept even when the radio could not be programmed. It is the -# only durable record of the operator's intent and it does take effect at the -# next wifi restart, so discarding it would throw away the half that worked and -# leave the device unblocked forever. What made keeping it dangerous was the -# claim of success, not the entry — so the claim is what goes. A wifi reload -# would apply it now, but it disconnects every client on the radio, which is -# not something a per-device click should do behind the operator's back. -case "$ENFORCE" in - acl) - OK=true - MSG="MAC $MAC blocked on wifi for $IP" - ;; - no-radio) - OK=true - MSG="MAC $MAC added to the wifi deny list for $IP; no radio is running, it applies when wifi starts" - ;; - ban) - OK=false - MSG="MAC $MAC is NOT permanently blocked: hostapd_cli is missing, so the block is temporary ($BAN_MIN min). Install hostapd-utils, or restart wifi (drops all clients)" - ;; - *) - OK=false - MSG="MAC $MAC saved to the wifi deny list but NOT applied to the radio, so the device stays online. Install hostapd-utils, or restart wifi (drops all clients)" - ;; -esac - -tctl_log "wifi_block" "$IP" "MAC=$MAC enforce=$ENFORCE" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" -printf '{"ok":%s,"enforcement":"%s","msg":"%s"}\n' "$OK" "$ENFORCE" "$MSG" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-macfilter-remove.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-macfilter-remove.sh deleted file mode 100755 index 819f9a4c6..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-macfilter-remove.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Remove device WiFi MAC filter (unblock from wifi deny list). -# Updates the uci maclist and the running hostapd ACL, so the client can -# reassociate without a wifi reload and other clients stay connected. Reports -# how far the runtime half got — see the enforcement words in trafficctl-fw.sh. -# Usage: trafficctl-macfilter-remove.sh - -. /usr/local/bin/trafficctl-fw.sh - -IP="$1" - -if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-macfilter-remove.sh "}' - exit 1 -fi - -if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 -fi - -# Look up MAC from DHCP leases -MAC="" -if [ -f /tmp/dhcp.leases ]; then - MAC=$(awk -v ip="$IP" '$3 == ip {print toupper($2)}' /tmp/dhcp.leases | head -1) -fi - -if [ -z "$MAC" ]; then - MAC=$(ip neigh show "$IP" 2>/dev/null | grep -oE '[0-9a-fA-F:]{17}' | head -1 | tr 'a-f' 'A-F') -fi - -if [ -z "$MAC" ]; then - echo "{\"ok\":false,\"msg\":\"cannot find MAC for $IP\"}" - exit 1 -fi - -# Normalize MAC to lowercase -MAC=$(echo "$MAC" | tr 'A-F' 'a-f') - -# Remove MAC from maclist on all wifi interfaces -IFACES=$(tctl_get_wifi_interfaces) -if [ -z "$IFACES" ]; then - echo '{"ok":false,"msg":"no wifi interfaces found"}' - exit 1 -fi - -CHANGED=0 -MODE="deny" -for iface in $IFACES; do - iface_mode=$(tctl_get_wifi_filter_mode "$iface") - [ "$iface_mode" = "allow" ] && MODE="allow" - - existing=$(uci -q get "wireless.${iface}.maclist") - listed=0 - echo "$existing" | grep -qi "$MAC" && listed=1 - - if [ "$iface_mode" = "allow" ]; then - # Whitelist: unblocking means putting the MAC back on the allow-list. - if [ "$listed" = "0" ]; then - uci add_list "wireless.${iface}.maclist=$MAC" - CHANGED=1 - fi - else - # Blacklist: unblocking means removing the MAC from the block-list. - if [ "$listed" = "1" ]; then - uci del_list "wireless.${iface}.maclist=$MAC" - CHANGED=1 - fi - fi -done - -[ "$CHANGED" = "1" ] && uci commit wireless - -# Unconditional for the same reason as the add path, and the stakes are higher -# here: a MAC that uci no longer lists but the radio still denies leaves a real -# person off the network while the UI says they are not blocked. -ENFORCE=$(tctl_hostapd_unblock_mac "$MAC" "$MODE") -BAN_MIN=$(( TCTL_WIFI_BAN_MS / 60000 )) - -case "$ENFORCE" in - acl) - OK=true - MSG="MAC $MAC removed from wifi filter for $IP" - ;; - no-radio) - OK=true - MSG="MAC $MAC removed from the wifi filter for $IP; no radio is running" - ;; - ban) - OK=false - MSG="MAC $MAC removed from the wifi filter, but hostapd still bans it for up to $BAN_MIN min. Restart wifi (drops all clients) to clear it now" - ;; - *) - OK=false - MSG="MAC $MAC removed from the wifi filter, but the radio ACL could not be read back: it may still be blocked. Install hostapd-utils, or restart wifi" - ;; -esac - -tctl_log "wifi_unblock" "$IP" "MAC=$MAC enforce=$ENFORCE" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" -printf '{"ok":%s,"enforcement":"%s","msg":"%s"}\n' "$OK" "$ENFORCE" "$MSG" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-metrics.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-metrics.sh deleted file mode 100755 index 8132a75d5..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-metrics.sh +++ /dev/null @@ -1,239 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Prometheus / OpenMetrics exporter for trafficctl. -# -# Writes to stdout so one implementation serves both delivery paths: -# scrape endpoint : /www/cgi-bin/trafficctl-metrics (uhttpd) -# textfile : cron > /var/lib/node_exporter/textfile_collector/trafficctl.prom -# -# Memory discipline (this runs on 128–512 MB routers): -# * no large shell variables — every source is streamed straight into awk -# * one awk process holds the only in-memory table, bounded by device count -# -# Counter semantics: the raw byte sources are NOT monotonic — a device's -# conntrack total drops when its flows expire. Exporting that directly would -# look like a counter reset on every expiry and produce nonsense rate(). The -# accumulation that fixes it used to live here; it now lives in -# trafficctl-totals.sh, which the LuCI Bytes column reads too, so the column -# and this counter cannot drift apart. -# -# Usage: trafficctl-metrics.sh - -. /usr/local/bin/trafficctl-fw.sh - -metrics_enabled() { - [ "$(uci -q get trafficctl.metrics.enabled 2>/dev/null)" = "1" ] -} - -if ! metrics_enabled; then - echo "# trafficctl metrics are disabled (set trafficctl.metrics.enabled=1)" - exit 0 -fi - -opt_on() { - # default-on toggles: anything but an explicit 0 counts as enabled - [ "$(uci -q get "trafficctl.metrics.$1" 2>/dev/null)" != "0" ] -} - -# ── device byte counters ──────────────────────────────────────────────────── -# trafficctl-totals.sh owns both the accumulator and its state file. It also -# resolves the byte source (conntrack, or nft counters under uncountered flow -# offload) via trafficctl-bytes.sh, so none of that is duplicated here. -# -# --all, because a Prometheus series that vanished and came back every time a -# quiet device's last flow expired would be unusable: the exporter wants every -# device that still carries a total, not just the ones currently transmitting. -/usr/local/bin/trafficctl-totals.sh --all 2>/dev/null \ - | sed 's/},{/}\n{/g' \ - | awk ' -function num(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return -1 - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /^[0-9]+/)) return -1 - return substr(seg, RSTART, RLENGTH) + 0 -} -function str(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*\"" - if (!match(line, re)) return "" - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) -} -BEGIN { - print "# HELP trafficctl_device_bytes_total Bytes transferred per device since the counter started. The store is tmpfs, so this resets on reboot; it advances whenever anything samples (a scrape, or the LuCI page)." - print "# TYPE trafficctl_device_bytes_total counter" - print "# HELP trafficctl_device_bytes_degraded 1 when the counter above was built from byte counters the forwarding path does not update (uncountered flow offload with no usable nftables fallback). The counter is then a lower bound that stalls while traffic continues; alert on this rather than trusting a flat rate()." - print "# TYPE trafficctl_device_bytes_degraded gauge" -} -{ - ip = str($0, "ip") - if (ip == "") next - rx = num($0, "bytes_in_total"); if (rx < 0) rx = 0 - tx = num($0, "bytes_out_total"); if (tx < 0) tx = 0 - printf "trafficctl_device_bytes_total{ip=\"%s\",direction=\"rx\"} %.0f\n", ip, rx - printf "trafficctl_device_bytes_total{ip=\"%s\",direction=\"tx\"} %.0f\n", ip, tx - # A counter that stops moving is indistinguishable from an idle device on a - # dashboard, which is exactly how this failure hides. Exported alongside so - # the condition is alertable instead of being inferred from a flat line. - printf "trafficctl_device_bytes_degraded{ip=\"%s\"} %d\n", ip, \ - (index($0, "\"degraded\":true") ? 1 : 0) -}' - -# ── per-device state gauges ───────────────────────────────────────────────── -# Off by default for the leanest possible scrape: this calls the full summary, -# which dumps nft/tc state and is markedly heavier than the byte pass. -if opt_on state; then - /usr/local/bin/trafficctl-summary.sh 2>/dev/null \ - | sed 's/},{/}\n{/g' \ - | awk -v rdnsfile=/tmp/trafficctl_rdns_cache ' -function num(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return 0 - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /^[0-9]+/)) return 0 - return substr(seg, RSTART, RLENGTH) + 0 -} -function str(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*\"" - if (!match(line, re)) return "" - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) -} -function esc(v) { gsub(/\\/, "\\\\", v); gsub(/"/, "\\\"", v); return v } -BEGIN { - # Reverse-DNS names resolved in the background; "-" is a cached miss. - while ((getline l < rdnsfile) > 0) { - n = split(l, f, " ") - if (n >= 2 && f[2] != "-") rdns[f[1]] = f[2] - } - close(rdnsfile) - print "# HELP trafficctl_device_connections Active tracked connections per device." - print "# TYPE trafficctl_device_connections gauge" - print "# HELP trafficctl_device_blocked Whether the device is blocked from the internet." - print "# TYPE trafficctl_device_blocked gauge" - print "# HELP trafficctl_device_limit_kbit Applied throttle in kbit/s (0 = none)." - print "# TYPE trafficctl_device_limit_kbit gauge" - print "# HELP trafficctl_device_limit_up_kbit Applied upload throttle in kbit/s (0 = none); equals the download one unless split." - print "# TYPE trafficctl_device_limit_up_kbit gauge" - print "# HELP trafficctl_device_wifi_blocked Whether the device is denied on WiFi." - print "# TYPE trafficctl_device_wifi_blocked gauge" - print "# HELP trafficctl_device_conntrack_bytes Bytes currently accounted in conntrack (falls as flows expire)." - print "# TYPE trafficctl_device_conntrack_bytes gauge" - print "# HELP trafficctl_device_blocked_bytes Bytes dropped by the block rule." - print "# TYPE trafficctl_device_blocked_bytes gauge" - print "# HELP trafficctl_device_info Device metadata; the value is always 1." - print "# TYPE trafficctl_device_info gauge" -} -{ - ip = str($0, "ip") - if (ip == "") next - printf "trafficctl_device_connections{ip=\"%s\"} %d\n", ip, num($0, "conns") - printf "trafficctl_device_blocked{ip=\"%s\"} %d\n", ip, (index($0, "\"blocked\":true") ? 1 : 0) - printf "trafficctl_device_wifi_blocked{ip=\"%s\"} %d\n", ip, (index($0, "\"wifi_blocked\":true") ? 1 : 0) - printf "trafficctl_device_limit_kbit{ip=\"%s\",mode=\"limiter\"} %d\n", ip, num($0, "rate_limit_kbit") - printf "trafficctl_device_limit_kbit{ip=\"%s\",mode=\"shaper\"} %d\n", ip, num($0, "shape_kbit") - # Its own metric rather than a direction label on the one above: a new - # label would start new series for every existing dashboard and alert. - printf "trafficctl_device_limit_up_kbit{ip=\"%s\",mode=\"limiter\"} %d\n", ip, num($0, "rate_limit_kbit_up") - printf "trafficctl_device_limit_up_kbit{ip=\"%s\",mode=\"shaper\"} %d\n", ip, num($0, "shape_kbit_up") - # Conntrack view: current in-flight totals and the protocol split. - printf "trafficctl_device_conntrack_bytes{ip=\"%s\",proto=\"all\"} %.0f\n", ip, num($0, "total") - printf "trafficctl_device_conntrack_bytes{ip=\"%s\",proto=\"tcp\"} %.0f\n", ip, num($0, "tcp") - printf "trafficctl_device_conntrack_bytes{ip=\"%s\",proto=\"udp\"} %.0f\n", ip, num($0, "udp") - printf "trafficctl_device_blocked_bytes{ip=\"%s\"} %.0f\n", ip, num($0, "block_bytes") - # Names/MACs live on an info metric rather than on the counters: churn in a - # label would otherwise start a brand new time series for the same device. - # Hoisted rather than inlined as esc(ip in rdns ? ...): BusyBox awk parses - # an "in" test inside a call argument differently and silently drops the - # whole statement. - rd = "" - if (ip in rdns) rd = rdns[ip] - printf "trafficctl_device_info{ip=\"%s\",name=\"%s\",mac=\"%s\",link=\"%s\",app=\"%s\",rdns=\"%s\"} 1\n", \ - ip, esc(str($0, "name")), esc(str($0, "mac")), esc(str($0, "conn_type")), esc(str($0, "app")), esc(rd) -}' -fi - -# ── port forwards ─────────────────────────────────────────────────────────── -if opt_on portfw; then - /usr/local/bin/trafficctl-portfw.sh list 2>/dev/null \ - | sed 's/},{/}\n{/g' \ - | awk ' -function num(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return 0 - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /^[0-9]+/)) return 0 - return substr(seg, RSTART, RLENGTH) + 0 -} -function str(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*\"" - if (!match(line, re)) return "" - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) -} -function esc(v) { gsub(/\\/, "\\\\", v); gsub(/"/, "\\\"", v); return v } -BEGIN { - print "# HELP trafficctl_portfw_connections Active inbound connections per port forward." - print "# TYPE trafficctl_portfw_connections gauge" - print "# HELP trafficctl_portfw_clients Distinct remote clients per port forward." - print "# TYPE trafficctl_portfw_clients gauge" - print "# HELP trafficctl_portfw_paused Whether inbound traffic is paused." - print "# TYPE trafficctl_portfw_paused gauge" - print "# HELP trafficctl_portfw_enabled Whether the firewall rule itself is enabled." - print "# TYPE trafficctl_portfw_enabled gauge" - print "# HELP trafficctl_portfw_limit_kbit Inbound rate limit in kbit/s (0 = none)." - print "# TYPE trafficctl_portfw_limit_kbit gauge" - print "# HELP trafficctl_portfw_bytes Bytes currently accounted per port forward." - print "# TYPE trafficctl_portfw_bytes gauge" -} -{ - id = str($0, "id") - if (id == "") next - lbl = sprintf("name=\"%s\",proto=\"%s\",port=\"%s\"", \ - esc(str($0, "name")), esc(str($0, "proto")), esc(str($0, "ext_port"))) - printf "trafficctl_portfw_connections{%s} %d\n", lbl, num($0, "conns") - printf "trafficctl_portfw_clients{%s} %d\n", lbl, num($0, "clients") - printf "trafficctl_portfw_paused{%s} %d\n", lbl, (index($0, "\"paused\":true") ? 1 : 0) - printf "trafficctl_portfw_enabled{%s} %d\n", lbl, (index($0, "\"enabled\":true") ? 1 : 0) - printf "trafficctl_portfw_limit_kbit{%s} %d\n", lbl, num($0, "limit_kbit") - printf "trafficctl_portfw_bytes{%s,direction=\"rx\"} %.0f\n", lbl, num($0, "bytes_in") - printf "trafficctl_portfw_bytes{%s,direction=\"tx\"} %.0f\n", lbl, num($0, "bytes_out") -}' -fi - -# ── DPI application labels ────────────────────────────────────────────────── -# Off by default: device × application is a cardinality trap on a busy network. -if [ "$(uci -q get trafficctl.metrics.apps 2>/dev/null)" = "1" ]; then - /usr/local/bin/trafficctl-netify.sh list 2>/dev/null \ - | sed -e 's/\]},{/]}\n{/g' \ - | awk ' -BEGIN { - print "# HELP trafficctl_app_bytes Bytes per device per application in the last DPI sample." - print "# TYPE trafficctl_app_bytes gauge" -} -{ - if (!match($0, /"ip":"[^"]*"/)) next - ip = substr($0, RSTART + 6, RLENGTH - 7) - rest = $0 - # Match the whole app object, not just up to "bytes" — "flows" follows it. - while (match(rest, /\{"name":"[^"]*","bytes":[0-9]+[^}]*\}/)) { - rec = substr(rest, RSTART, RLENGTH) - rest = substr(rest, RSTART + RLENGTH) - if (!match(rec, /"name":"[^"]*"/)) continue - app = substr(rec, RSTART + 8, RLENGTH - 9) - if (!match(rec, /"bytes":[0-9]+/)) continue - b = substr(rec, RSTART + 8, RLENGTH - 8) + 0 - printf "trafficctl_app_bytes{ip=\"%s\",app=\"%s\"} %.0f\n", ip, app, b - if (match(rec, /"flows":[0-9]+/)) - printf "trafficctl_app_flows{ip=\"%s\",app=\"%s\"} %d\n", ip, app, \ - substr(rec, RSTART + 8, RLENGTH - 8) + 0 - } -}' -fi - -echo "# HELP trafficctl_up Always 1; presence indicates the exporter ran." -echo "# TYPE trafficctl_up gauge" -echo "trafficctl_up 1" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-names.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-names.sh deleted file mode 100755 index 567103da5..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-names.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Manual device names (aliases), keyed by IP. -# -# Aliases take precedence over DHCP lease names and reverse DNS, which is what -# makes routed devices nameable: they have no lease on this router, so without -# an alias (or a PTR record) they would only ever show as "*". -# -# Usage: trafficctl-names.sh list|set |remove -# Storage: /etc/trafficctl/names — one "IP NAME" line per device. - -. /usr/local/bin/trafficctl-fw.sh - -NAMES_FILE="/etc/trafficctl/names" - -# Strip anything that could break the line format or the JSON output, and cap -# the length so a pathological name can't bloat every poll response. -sanitize_name() { - printf '%s' "$1" | tr -d '\n\r\t' | tr -cd 'a-zA-Z0-9 _.()-' | cut -c1-32 -} - -do_list() { - printf '[' - [ -f "$NAMES_FILE" ] || { printf ']\n'; return 0; } - awk 'NF >= 2 { - ip = $1 - name = $0 - sub(/^[^ ]+ +/, "", name) - if (n++) printf "," - printf "{\"ip\":\"%s\",\"name\":\"%s\"}", ip, name - }' "$NAMES_FILE" - printf ']\n' -} - -do_set() { - local ip="$1" name="$2" tmp - tctl_validate_ip "$ip" || { echo '{"ok":false,"msg":"invalid IP address"}'; return 1; } - name=$(sanitize_name "$name") - [ -z "$name" ] && { echo '{"ok":false,"msg":"name is empty after sanitizing"}'; return 1; } - - mkdir -p "$(dirname "$NAMES_FILE")" - [ -f "$NAMES_FILE" ] || : > "$NAMES_FILE" - tmp="${NAMES_FILE}.tmp" - awk -v ip="$ip" '$1 != ip' "$NAMES_FILE" > "$tmp" - echo "$ip $name" >> "$tmp" - mv "$tmp" "$NAMES_FILE" - - tctl_log "config_change" "$ip" "name=$name" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - printf '{"ok":true,"msg":"named %s as %s"}\n' "$ip" "$name" -} - -do_remove() { - local ip="$1" tmp - tctl_validate_ip "$ip" || { echo '{"ok":false,"msg":"invalid IP address"}'; return 1; } - [ -f "$NAMES_FILE" ] || { echo '{"ok":true,"msg":"no aliases stored"}'; return 0; } - tmp="${NAMES_FILE}.tmp" - awk -v ip="$ip" '$1 != ip' "$NAMES_FILE" > "$tmp" - mv "$tmp" "$NAMES_FILE" - tctl_log "config_change" "$ip" "name cleared" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - printf '{"ok":true,"msg":"name cleared for %s"}\n' "$ip" -} - -case "$1" in - list) do_list ;; - set) do_set "$2" "$3" ;; - remove) do_remove "$2" ;; - *) echo '{"ok":false,"msg":"usage: trafficctl-names.sh list|set |remove "}'; exit 1 ;; -esac diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-netify.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-netify.sh deleted file mode 100755 index 089bc8709..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-netify.sh +++ /dev/null @@ -1,247 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Optional Netify Agent (netifyd) integration — DPI application labels per device. -# -# Entirely optional: every entry point degrades to an empty result when netifyd -# is not installed, not running, or no socket reader is available, so the rest -# of trafficctl behaves exactly as before. -# -# Usage: -# trafficctl-netify.sh status — availability probe (JSON object) -# trafficctl-netify.sh collect [secs] — sample the socket, refresh the cache -# trafficctl-netify.sh list — cached per-device app breakdown -# trafficctl-netify.sh raw [secs] — raw socket lines (debugging) -# -# Telemetry comes from the agent's socket SINK, not from netifyd.sock: in -# Agent v5 that unix socket is a request/response API which never pushes flow -# data, so connecting to it returns nothing at all. The sink's bind address is -# read from netify-sink-socket.json (typically tcp://127.0.0.1:1780). -# -# Two payload shapes are handled: the aggregator's {"stats":[...]} records -# (application_id/local_ip/download/upload) and raw per-flow records -# (detected_application_name/local_ip/total_bytes). Records are parsed by field -# extraction rather than strict JSON, which tolerates either framing. - -. /usr/local/bin/trafficctl-fw.sh - -CACHE="/tmp/trafficctl_netify.json" -LOCK="/tmp/trafficctl_netify.lock" -DEFAULT_SOCKET="/var/run/netifyd/netifyd.sock" - -netify_socket() { - local s - s=$(uci -q get trafficctl.main.netify_socket 2>/dev/null) - [ -n "$s" ] && { echo "$s"; return; } - echo "$DEFAULT_SOCKET" -} - -# Where flow telemetry is actually published: an explicit override, else the -# first enabled socket-sink channel, else the legacy unix socket (Agent v4). -netify_endpoint() { - local ep - ep=$(uci -q get trafficctl.main.netify_endpoint 2>/dev/null) - [ -n "$ep" ] && { echo "$ep"; return; } - ep=$(sed -n 's/.*"bind_address\"[ \t]*:[ \t]*"\(tcp:\/\/[^"]*\)".*/\1/p' \ - /etc/netifyd/netify-sink-socket.json 2>/dev/null | head -1) - [ -n "$ep" ] && { echo "$ep"; return; } - echo "unix://$(netify_socket)" -} - -netify_enabled() { - [ "$(uci -q get trafficctl.main.netify_enabled 2>/dev/null)" != "0" ] -} - -# Echo the command able to stream the socket, or nothing. -socket_reader() { - if command -v socat >/dev/null 2>&1; then - echo "socat" - elif command -v nc >/dev/null 2>&1; then - echo "nc" - fi -} - -read_socket() { - local secs="$1" ep reader hostport path - ep=$(netify_endpoint) - reader=$(socket_reader) - [ -n "$reader" ] || return 1 - - case "$ep" in - tcp://*) - hostport=${ep#tcp://} - case "$reader" in - socat) timeout "$secs" socat -u "TCP-CONNECT:$hostport" - 2>/dev/null ;; - nc) timeout "$secs" nc "${hostport%%:*}" "${hostport##*:}" 2>/dev/null ;; - esac - ;; - unix://*|/*) - path=${ep#unix://} - [ -S "$path" ] || return 1 - case "$reader" in - socat) timeout "$secs" socat -u "UNIX-CONNECT:$path" - 2>/dev/null ;; - nc) timeout "$secs" nc -U "$path" 2>/dev/null ;; - esac - ;; - *) return 1 ;; - esac - return 0 -} - -# Tests (and offline debugging) feed recorded agent output instead of a socket. -feed_lines() { - if [ -n "$TCTL_NETIFY_FEED" ] && [ -f "$TCTL_NETIFY_FEED" ]; then - cat "$TCTL_NETIFY_FEED" - else - read_socket "$1" - fi -} - -do_status() { - local sock reader installed=false running=false readable=false age=-1 now mtime - sock=$(netify_socket) - reader=$(socket_reader) - command -v netifyd >/dev/null 2>&1 && installed=true - [ -S "$sock" ] && running=true - [ -n "$reader" ] && readable=true - if [ -f "$CACHE" ]; then - now=$(date +%s) - mtime=$(date -r "$CACHE" +%s 2>/dev/null || echo 0) - age=$(( now - mtime )) - fi - printf '{"enabled":%s,"installed":%s,"running":%s,"socket":"%s","endpoint":"%s","reader":"%s","readable":%s,"cache_age":%d}\n' \ - "$(netify_enabled && echo true || echo false)" \ - "$installed" "$running" "$sock" "$(netify_endpoint)" "${reader:-none}" "$readable" "$age" -} - -# Aggregate flow records into "per local IP → per application" totals. -# -# The agent re-emits a flow as its byte counters grow (flow, flow_dpi_update, -# flow_dpi_complete), so totals are tracked per flow digest and only summed at -# the end — adding every sighting would multiply-count the same traffic. -parse_flows() { - # One JSON object per line so the field extractor sees one record at a - # time — the aggregator packs every device into a single "stats" array. - sed 's/},[ ]*{/}\n{/g' | awk ' - function field(line, key, re, seg, v) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return "" - seg = substr(line, RSTART + RLENGTH) - if (substr(seg, 1, 1) == "\"") { - seg = substr(seg, 2) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) - } - if (!match(seg, /^-?[0-9]+/)) return "" - return substr(seg, RSTART, RLENGTH) + 0 - } - { - # Only flow-bearing records carry local_ip; skip status/hello lines. - ip = field($0, "local_ip") - if (ip !~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) next - - # Aggregator records name the app as ".netify.". - app = field($0, "application_id") - sub(/^[0-9]+\./, "", app) - if (app == "") app = field($0, "detected_application_name") - # Agent prefixes catalogued apps with "netify."; the bare name reads - # better in a table. - sub(/^netify\./, "", app) - if (app == "" || app == "unknown") app = field($0, "detected_protocol_name") - if (app == "" || app == "Unknown") { - host = field($0, "host_server_name") - if (host != "") app = host; else app = "unclassified" - } - gsub(/[^a-zA-Z0-9._ -]/, "", app) - if (app == "") app = "unclassified" - - digest = field($0, "digest") - # Aggregator: per-interval byte deltas, already summed per device+app. - bytes = field($0, "download") + field($0, "upload") - if (bytes == 0) bytes = field($0, "total_bytes") - if (bytes == "" || bytes == 0) bytes = field($0, "local_bytes") + field($0, "other_bytes") - if (digest == "") digest = ip "|" app "|" NR - - key = ip SUBSEP app - # Last sighting of a digest carries its cumulative total. - if (!(digest in seen)) { seen[digest] = key; flows[key]++ } - dbytes[digest] = bytes + 0 - } - END { - for (d in seen) total[seen[d]] += dbytes[d] - for (k in total) { - split(k, p, SUBSEP) - printf "%s %s %.0f %d\n", p[1], p[2], total[k], flows[k] - } - }' -} - -do_collect() { - # The aggregator publishes on an interval (~15s), so a short sample window - # usually catches nothing at all — wait long enough to span one report. - local secs="${1:-18}" raw parsed tmp - case "$secs" in ''|*[!0-9]*) secs=18 ;; esac - [ "$secs" -lt 1 ] && secs=1 - [ "$secs" -gt 60 ] && secs=60 - - netify_enabled || { echo '{"ok":false,"msg":"netify integration disabled"}'; return 0; } - - # One collector at a time — overlapping samples would double the socket - # load and race on the cache file. - mkdir "$LOCK" 2>/dev/null || { echo '{"ok":false,"msg":"collection already running"}'; return 0; } - # shellcheck disable=SC2064 - trap "rmdir '$LOCK' 2>/dev/null" EXIT INT TERM - - raw=$(feed_lines "$secs") - if [ -z "$raw" ]; then - echo '{"ok":false,"msg":"no data from netifyd socket"}' - return 0 - fi - - parsed=$(printf '%s\n' "$raw" | parse_flows) - tmp="${CACHE}.tmp" - # Group by IP, apps sorted by bytes descending. - printf '%s\n' "$parsed" | sort -k1,1 -k3,3nr | awk ' - BEGIN { printf "[" } - NF >= 4 { - if ($1 != cur) { - if (cur != "") printf "]}," - printf "{\"ip\":\"%s\",\"top\":\"%s\",\"apps\":[", $1, $2 - cur = $1 - first = 1 - } - if (!first) printf "," - printf "{\"name\":\"%s\",\"bytes\":%.0f,\"flows\":%d}", $2, $3, $4 - first = 0 - } - END { - if (cur != "") printf "]}" - printf "]\n" - }' > "$tmp" - mv "$tmp" "$CACHE" - - printf '{"ok":true,"msg":"collected %s","devices":%d}\n' \ - "${secs}s" "$(printf '%s\n' "$parsed" | awk 'NF{print $1}' | sort -u | wc -l)" -} - -do_list() { - if [ -f "$CACHE" ]; then - cat "$CACHE" - else - echo '[]' - fi -} - -do_raw() { - local secs="${1:-18}" - case "$secs" in ''|*[!0-9]*) secs=18 ;; esac - [ "$secs" -gt 60 ] && secs=60 - feed_lines "$secs" -} - -case "$1" in - status) do_status ;; - collect) do_collect "$2" ;; - list) do_list ;; - raw) do_raw "$2" ;; - *) echo '{"ok":false,"msg":"usage: trafficctl-netify.sh status|collect [secs]|list|raw [secs]"}'; exit 1 ;; -esac diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-portfw.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-portfw.sh deleted file mode 100755 index 8a987c1fb..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-portfw.sh +++ /dev/null @@ -1,486 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Inbound traffic control for port forwards and WAN-open ports. -# -# Usage: -# trafficctl-portfw.sh list -# trafficctl-portfw.sh pause -# trafficctl-portfw.sh resume -# trafficctl-portfw.sh limit (0 removes) -# -# scope: "forward" for a DNAT port forward (ip = internal destination), -# "input" for a router-local open port (ip is ignored, pass "-"). -# proto: "tcp", "udp" or "tcpudp" (applies to both). -# -# Rules live in our own table (inet tctl_pfw) hooked at forward/input -# priority -190 — after DNAT (prerouting) so the internal address is -# matchable, and before the flowtable offload rule so drops/limits keep -# working with software offload enabled. - -. /usr/local/bin/trafficctl-fw.sh - -PFW_PRIO="-190" - -# ── validation helpers ────────────────────────────────────────────────────── - -# iptables spells a port range lo:hi. Truncating to the low port (as this did) -# left every other port in the range open while reporting the whole range paused. -iptables_dport() { - case "$1" in - *-*) echo "${1%%-*}:${1##*-}" ;; - *) echo "$1" ;; - esac -} - -# hashlimit names are capped at 15 characters, so a range cannot be spelled out -# in full: 8000-8100 as "pfw_8000_8100_tcp" would be silently truncated into a -# collision with a neighbouring range. -hashlimit_name() { - local proto="$1" port="$2" lo - lo="${port%%-*}" - case "$port" in - *-*) echo "pfwr${lo}_${proto}" ;; - *) echo "pfw${lo}_${proto}" ;; - esac -} - -valid_port() { - case "$1" in - [0-9]*-[0-9]*) - local lo="${1%%-*}" hi="${1##*-}" - case "$lo$hi" in *[!0-9]*) return 1 ;; esac - [ "$lo" -ge 1 ] && [ "$lo" -le 65535 ] && \ - [ "$hi" -ge 1 ] && [ "$hi" -le 65535 ] && [ "$lo" -le "$hi" ] - ;; - *) - case "$1" in ''|*[!0-9]*) return 1 ;; esac - [ "$1" -ge 1 ] && [ "$1" -le 65535 ] - ;; - esac -} - -# Expand "tcpudp" / "tcp udp" to individual proto tokens -proto_tokens() { - case "$1" in - tcpudp|"tcp udp"|"udp tcp"|all|"") echo "tcp udp" ;; - tcp) echo "tcp" ;; - udp) echo "udp" ;; - *) return 1 ;; - esac -} - -pfw_comment() { - # kind proto ip port -> stable rule comment - printf 'tctl_pfw_%s_%s_%s_%s' "$1" "$2" "$3" "$4" -} - -# ── nft/iptables plumbing ─────────────────────────────────────────────────── - -ensure_pfw_table() { - [ "$TCTL_FW" = "nft" ] || return 0 - nft add table inet tctl_pfw 2>/dev/null - nft add chain inet tctl_pfw pfw_forward \ - "{ type filter hook forward priority $PFW_PRIO; policy accept; }" 2>/dev/null - nft add chain inet tctl_pfw pfw_input \ - "{ type filter hook input priority $PFW_PRIO; policy accept; }" 2>/dev/null -} - -pfw_chain_for_scope() { - [ "$1" = "input" ] && echo "pfw_input" || echo "pfw_forward" -} - -# Delete every rule in our table/chains carrying the given comment -pfw_delete_by_comment() { - local cmt="$1" chain h - if [ "$TCTL_FW" = "nft" ]; then - for chain in pfw_forward pfw_input; do - for h in $(nft -a list chain inet tctl_pfw "$chain" 2>/dev/null | \ - grep "\"$cmt\"" | grep -o 'handle [0-9]*' | awk '{print $2}'); do - nft delete rule inet tctl_pfw "$chain" handle "$h" 2>/dev/null - done - done - else - for chain in FORWARD INPUT; do - # Re-evaluate the first matching rule spec each pass until none - # with the comment is left (empty spec makes iptables -D fail). - # shellcheck disable=SC2046 # rule spec is intentionally re-split - while iptables -D "$chain" $(iptables -S "$chain" 2>/dev/null | \ - grep -m1 -- "--comment $cmt " | sed 's/^-A [A-Z]* //') 2>/dev/null; do :; done - done - fi -} - -pfw_add_pause() { - local scope="$1" proto="$2" ip="$3" port="$4" - local cmt chain - cmt=$(pfw_comment "pause" "$proto" "${ip:-local}" "$port") - if [ "$TCTL_FW" = "nft" ]; then - ensure_pfw_table - chain=$(pfw_chain_for_scope "$scope") - if [ "$scope" = "input" ]; then - nft insert rule inet tctl_pfw "$chain" \ - "$proto" dport "$port" counter drop comment "\"$cmt\"" - else - nft insert rule inet tctl_pfw "$chain" \ - ip daddr "$ip" "$proto" dport "$port" counter drop comment "\"$cmt\"" - fi - else - if [ "$scope" = "input" ]; then - iptables -I INPUT -p "$proto" --dport "$(iptables_dport "$port")" -j DROP \ - -m comment --comment "$cmt" 2>/dev/null - else - iptables -I FORWARD -d "$ip" -p "$proto" --dport "$(iptables_dport "$port")" -j DROP \ - -m comment --comment "$cmt" 2>/dev/null - fi - fi -} - -pfw_add_limit() { - local scope="$1" proto="$2" ip="$3" port="$4" kbit="$5" - local cmt chain rate_b - rate_b=$(tctl_rate_bytes "$kbit") - cmt=$(pfw_comment "limit" "$proto" "${ip:-local}" "$port") - if [ "$TCTL_FW" = "nft" ]; then - ensure_pfw_table - chain=$(pfw_chain_for_scope "$scope") - if [ "$scope" = "input" ]; then - nft add rule inet tctl_pfw "$chain" \ - "$proto" dport "$port" limit rate over "$rate_b" bytes/second \ - counter drop comment "\"$cmt\"" - else - nft add rule inet tctl_pfw "$chain" \ - ip daddr "$ip" "$proto" dport "$port" limit rate over "$rate_b" bytes/second \ - counter drop comment "\"$cmt\"" - fi - else - if [ "$scope" = "input" ]; then - # shellcheck disable=SC2046 # deliberate split into the option words - iptables -I INPUT -p "$proto" --dport "$(iptables_dport "$port")" -m hashlimit \ - $(tctl_ipt_limit_args "$kbit") \ - --hashlimit-mode dstport --hashlimit-name "$(hashlimit_name "$proto" "$port")" \ - -j DROP -m comment --comment "$cmt" 2>/dev/null - else - # shellcheck disable=SC2046 # deliberate split into the option words - iptables -I FORWARD -d "$ip" -p "$proto" --dport "$(iptables_dport "$port")" -m hashlimit \ - $(tctl_ipt_limit_args "$kbit") \ - --hashlimit-mode dstip --hashlimit-name "$(hashlimit_name "$proto" "$port")" \ - -j DROP -m comment --comment "$cmt" 2>/dev/null - fi - fi -} - -# Flush established conntrack entries so a pause takes effect immediately, -# even for flows already offloaded to the flowtable. Best effort. -pfw_flush_conntrack() { - local proto="$1" ip="$2" port="$3" lo hi p - command -v conntrack >/dev/null 2>&1 || return 0 - if [ -n "$ip" ] && [ "$ip" != "-" ]; then - conntrack -D -p "$proto" --reply-src "$ip" 2>/dev/null - return 0 - fi - # conntrack takes one port at a time, so a range is walked. Wide ranges are - # left to expire on their own rather than spending thousands of calls here. - lo="${port%%-*}" - hi="${port##*-}" - if [ "$lo" = "$hi" ] || [ "$((hi - lo))" -gt 64 ] 2>/dev/null; then - conntrack -D -p "$proto" --dport "$lo" 2>/dev/null - return 0 - fi - p="$lo" - while [ "$p" -le "$hi" ]; do - conntrack -D -p "$proto" --dport "$p" 2>/dev/null - p=$((p + 1)) - done - return 0 -} - -# ── list ──────────────────────────────────────────────────────────────────── - -do_list() { - # Current control rules (one dump, grepped below): - # comments look like tctl_pfw____ - local CTL_DUMP="" - if [ "$TCTL_FW" = "nft" ]; then - CTL_DUMP=$(nft list table inet tctl_pfw 2>/dev/null) - else - CTL_DUMP=$(printf '%s\n%s' "$(iptables -S FORWARD 2>/dev/null)" "$(iptables -S INPUT 2>/dev/null)") - fi - - # Monitored subnets — used to keep router-local (input) stats to - # external clients only (LAN hits on router ports are not "inbound"). - local MATCH_SPEC - MATCH_SPEC=$(tctl_monitored_subnets | awk '{printf "%s%s:%s",(NR>1?" ":""),$2,$3}') - - # Enumerate rules first: "id|kind|protos|ip|port|extport|name|enabled|zone" - local entries="" - local i=0 name src dport dest_ip dest_port proto enabled target - while uci -q get "firewall.@redirect[$i]" >/dev/null 2>&1; do - name=$(uci -q get "firewall.@redirect[$i].name") - src=$(uci -q get "firewall.@redirect[$i].src") - dport=$(uci -q get "firewall.@redirect[$i].src_dport") - dest_ip=$(uci -q get "firewall.@redirect[$i].dest_ip") - dest_port=$(uci -q get "firewall.@redirect[$i].dest_port") - proto=$(uci -q get "firewall.@redirect[$i].proto") - enabled=$(uci -q get "firewall.@redirect[$i].enabled") - target=$(uci -q get "firewall.@redirect[$i].target") - i=$((i + 1)) - [ -n "$target" ] && [ "$target" != "DNAT" ] && continue - [ -n "$dest_ip" ] && [ -n "$dport" ] || continue - [ -z "$dest_port" ] && dest_port="$dport" - proto=$(proto_tokens "$proto") || proto="tcp udp" - name=$(printf '%s' "$name" | tr -cd 'a-zA-Z0-9 _.()-') - entries="${entries}r$((i-1))|forward|${proto}|${dest_ip}|${dest_port}|${dport}|${name:-forward $dport}|${enabled:-1}|${src:-wan} -" - done - - i=0 - local rsrc rdest - while uci -q get "firewall.@rule[$i]" >/dev/null 2>&1; do - name=$(uci -q get "firewall.@rule[$i].name") - rsrc=$(uci -q get "firewall.@rule[$i].src") - rdest=$(uci -q get "firewall.@rule[$i].dest") - dport=$(uci -q get "firewall.@rule[$i].dest_port") - proto=$(uci -q get "firewall.@rule[$i].proto") - enabled=$(uci -q get "firewall.@rule[$i].enabled") - target=$(uci -q get "firewall.@rule[$i].target") - i=$((i + 1)) - # Router-local open ports: accept rules from a wan zone with no dest zone - case "$rsrc" in *wan*) ;; *) continue ;; esac - [ -n "$rdest" ] && continue - [ "$target" = "ACCEPT" ] || continue - [ -n "$dport" ] || continue - proto=$(proto_tokens "$proto") || continue - name=$(printf '%s' "$name" | tr -cd 'a-zA-Z0-9 _.()-') - entries="${entries}a$((i-1))|open|${proto}|-|${dport}|${dport}|${name:-open $dport}|${enabled:-1}|${rsrc} -" - done - - if [ -z "$entries" ]; then - echo '[]' - return 0 - fi - - # Single conntrack pass: per-entry conns / distinct clients / bytes. - # forward: reply src == dest_ip && reply sport in dest_port && DNAT - # happened (orig dst != reply src) - # open: orig dport in port && no NAT (reply src == orig dst) && the - # client is not on a monitored subnet - local STATS - local ENTRY_FILE="/tmp/.trafficctl_pfw_entries.$$" - printf '%s' "$entries" > "$ENTRY_FILE" - STATS=$(awk -v ef="$ENTRY_FILE" -v spec="$MATCH_SPEC" ' - function ip2int(ip, a) { - split(ip, a, ".") - return a[1]*16777216 + a[2]*65536 + a[3]*256 + a[4] - } - function is_internal(ip, si, k) { - if (ip !~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) return 0 - si = ip2int(ip) - for (k = 1; k <= ns; k++) - if (si - (si % blk[k]) == base[k]) return 1 - return 0 - } - function port_in(p, range, lo, hi, sep) { - sep = index(range, "-") - if (sep == 0) return (p + 0) == (range + 0) - lo = substr(range, 1, sep - 1) + 0 - hi = substr(range, sep + 1) + 0 - return (p + 0) >= lo && (p + 0) <= hi - } - BEGIN { - ns = split(spec, sp, " ") - for (k = 1; k <= ns; k++) { - split(sp[k], kv, ":") - base[k] = kv[1] + 0; blk[k] = kv[2] + 0 - } - n = 0 - while ((getline line < ef) > 0) { - if (line == "") continue - n++ - split(line, f, "|") - eid[n] = f[1]; ekind[n] = f[2]; eproto[n] = f[3] - eip[n] = f[4]; eport[n] = f[5] - } - close(ef) - } - { - proto = "" - for (i = 1; i <= NF; i++) { - if ($i == "tcp") proto = "tcp" - else if ($i == "udp") proto = "udp" - } - if (proto == "") next - t = 0 - osrc = ""; odst = ""; odport = ""; ob = 0 - rsrc = ""; rsport = ""; rb = 0 - for (i = 1; i <= NF; i++) { - if (index($i, "src=") == 1) { - t++ - if (t == 1) osrc = substr($i, 5) - else if (t == 2) rsrc = substr($i, 5) - } else if (index($i, "dst=") == 1) { - if (t == 1 && odst == "") odst = substr($i, 5) - } else if (index($i, "dport=") == 1) { - if (t == 1 && odport == "") odport = substr($i, 7) - } else if (index($i, "sport=") == 1) { - if (t == 2 && rsport == "") rsport = substr($i, 7) - } else if (index($i, "bytes=") == 1) { - if (t == 1) ob = substr($i, 7) + 0 - else if (t == 2) rb = substr($i, 7) + 0 - } - } - if (osrc == "" || rsrc == "") next - for (k = 1; k <= n; k++) { - if (index(eproto[k], proto) == 0) continue - if (ekind[k] == "forward") { - if (rsrc != eip[k]) continue - if (!port_in(rsport, eport[k])) continue - if (odst == rsrc) continue # LAN-direct, not DNATed - } else { - if (rsrc != odst) continue # NATed => not router-local - if (!port_in(odport, eport[k])) continue - if (is_internal(osrc)) continue # LAN client, not inbound - } - conns[k]++ - bin[k] += ob - bout[k] += rb - if (!((k, osrc) in seen)) { seen[k, osrc] = 1; clients[k]++ } - break - } - } - END { - for (k = 1; k <= n; k++) - printf "%s %d %d %d %d\n", eid[k], conns[k]+0, clients[k]+0, bin[k]+0, bout[k]+0 - }' "${TCTL_CT_FILE:-/proc/net/nf_conntrack}" 2>/dev/null) - rm -f "$ENTRY_FILE" - - # Emit JSON - printf '[' - local first=1 id kind protos ip port extport ename en zone - local st conns clients b_in b_out paused limit_kbit cmt_ip p - printf '%s' "$entries" | while IFS='|' read -r id kind protos ip port extport ename en zone; do - [ -z "$id" ] && continue - # shellcheck disable=SC2046 # deliberate split of stats fields - set -- $(printf '%s\n' "$STATS" | awk -v id="$id" '$1==id{print $2,$3,$4,$5; exit}') - conns="${1:-0}"; clients="${2:-0}"; b_in="${3:-0}"; b_out="${4:-0}" - - cmt_ip="$ip" - [ "$kind" = "open" ] && cmt_ip="local" - paused=false - limit_kbit=0 - for p in $protos; do - printf '%s' "$CTL_DUMP" | grep -q "$(pfw_comment pause "$p" "$cmt_ip" "$port")" && paused=true - if [ "$limit_kbit" = "0" ]; then - st=$(printf '%s' "$CTL_DUMP" | grep "$(pfw_comment limit "$p" "$cmt_ip" "$port")" | \ - awk "$TCTL_NFT_RATE_AWK"'{ for (i = 1; i < NF - 1; i++) if ($i == "over") { printf "%.0f\n", tctl_rate_kbit($(i+1), $(i+2)); exit } }') - [ -z "$st" ] && st=$(printf '%s' "$CTL_DUMP" | grep "$(pfw_comment limit "$p" "$cmt_ip" "$port")" | \ - awk "$TCTL_NFT_RATE_AWK"'{ r = tctl_ipt_first_rate(); if (r >= 0) { print r; exit } }') - [ -n "$st" ] && limit_kbit="$st" - fi - done - - if [ "$first" = "1" ]; then first=0; else printf ','; fi - printf '{"id":"%s","kind":"%s","name":"%s","zone":"%s","proto":"%s","ext_port":"%s","ip":"%s","port":"%s","enabled":%s,"paused":%s,"limit_kbit":%d,"conns":%d,"clients":%d,"bytes_in":%.0f,"bytes_out":%.0f}' \ - "$id" "$kind" "$ename" "$zone" "$protos" "$extport" "$ip" "$port" \ - "$([ "$en" != "0" ] && echo true || echo false)" \ - "$paused" "$limit_kbit" "$conns" "$clients" "$b_in" "$b_out" - done - printf ']\n' -} - -# ── control actions ───────────────────────────────────────────────────────── - -check_args() { - # scope proto ip port - case "$1" in forward|input) ;; *) return 1 ;; esac - proto_tokens "$2" >/dev/null || return 1 - if [ "$1" = "forward" ]; then - tctl_validate_ip "$3" || return 1 - fi - valid_port "$4" || return 1 - return 0 -} - -do_pause() { - local scope="$1" proto="$2" ip="$3" port="$4" p cmt_ip - cmt_ip="$ip" - [ "$scope" = "input" ] && cmt_ip="local" - for p in $(proto_tokens "$proto"); do - pfw_delete_by_comment "$(pfw_comment pause "$p" "$cmt_ip" "$port")" - pfw_add_pause "$scope" "$p" "$ip" "$port" || { - echo "{\"ok\":false,\"msg\":\"failed to pause $p port $port\"}" - return 1 - } - pfw_flush_conntrack "$p" "$([ "$scope" = "input" ] && echo "-" || echo "$ip")" "$port" - done - tctl_persist_enabled && tctl_persist_save "pfw_pause" "${scope}/${proto}/${cmt_ip}/${port}" "1" - tctl_log "block" "pfw:${cmt_ip}:${port}" "pause ${proto}" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - echo "{\"ok\":true,\"msg\":\"paused ${proto} port ${port}\"}" -} - -do_resume() { - local scope="$1" proto="$2" ip="$3" port="$4" p cmt_ip - cmt_ip="$ip" - [ "$scope" = "input" ] && cmt_ip="local" - for p in $(proto_tokens "$proto"); do - pfw_delete_by_comment "$(pfw_comment pause "$p" "$cmt_ip" "$port")" - done - tctl_persist_enabled && tctl_persist_remove "pfw_pause" "${scope}/${proto}/${cmt_ip}/${port}" - tctl_log "unblock" "pfw:${cmt_ip}:${port}" "resume ${proto}" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - echo "{\"ok\":true,\"msg\":\"resumed ${proto} port ${port}\"}" -} - -do_limit() { - local scope="$1" proto="$2" ip="$3" port="$4" kbit="$5" p cmt_ip - case "$kbit" in ''|*[!0-9]*) - echo '{"ok":false,"msg":"invalid rate"}' - return 1 - esac - cmt_ip="$ip" - [ "$scope" = "input" ] && cmt_ip="local" - for p in $(proto_tokens "$proto"); do - pfw_delete_by_comment "$(pfw_comment limit "$p" "$cmt_ip" "$port")" - if [ "$kbit" != "0" ]; then - pfw_add_limit "$scope" "$p" "$ip" "$port" "$kbit" || { - echo "{\"ok\":false,\"msg\":\"failed to limit $p port $port\"}" - return 1 - } - fi - done - if [ "$kbit" = "0" ]; then - tctl_persist_enabled && tctl_persist_remove "pfw_limit" "${scope}/${proto}/${cmt_ip}/${port}" - tctl_log "ratelimit_remove" "pfw:${cmt_ip}:${port}" "" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - echo "{\"ok\":true,\"msg\":\"limit removed for port ${port}\"}" - else - tctl_persist_enabled && tctl_persist_save "pfw_limit" "${scope}/${proto}/${cmt_ip}/${port}" "$kbit" - tctl_log "ratelimit_set" "pfw:${cmt_ip}:${port}" "${kbit}kbit" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - echo "{\"ok\":true,\"msg\":\"limit ${kbit} kbit/s set for port ${port}\"}" - fi -} - -# ── main ──────────────────────────────────────────────────────────────────── - -ACTION="$1" -case "$ACTION" in - list) - do_list - ;; - pause|resume) - if ! check_args "$2" "$3" "$4" "$5"; then - echo '{"ok":false,"msg":"usage: trafficctl-portfw.sh pause|resume "}' - exit 1 - fi - "do_$ACTION" "$2" "$3" "$4" "$5" - ;; - limit) - if ! check_args "$2" "$3" "$4" "$5"; then - echo '{"ok":false,"msg":"usage: trafficctl-portfw.sh limit "}' - exit 1 - fi - do_limit "$2" "$3" "$4" "$5" "$6" - ;; - *) - echo '{"ok":false,"msg":"usage: trafficctl-portfw.sh ..."}' - exit 1 - ;; -esac diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-ratelimit-stats.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-ratelimit-stats.sh deleted file mode 100755 index de44c6dc5..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-ratelimit-stats.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Show active rate-limit statistics. -# Output: JSON array -# [{"ip":"...","mode":"each|shared","rate_kbit":N,"packets":N,"bytes":N, -# "pass_packets":0,"pass_bytes":0}] -# -# One entry per target, counters summed across chains: the download rule is -# installed on every LAN device's egress chain, so a router with three bridges -# holds three copies of the same limit. Only the chain on the device the target -# actually lives behind ever matches, but which copy that is cannot be known -# here — taking any single one at random reported zero drops for most targets. - -. /usr/local/bin/trafficctl-fw.sh - -if [ "$TCTL_FW" = "nft" ]; then - nft list table netdev tm_ratelimit 2>/dev/null | awk "$TCTL_NFT_RATE_AWK"' - /ip daddr/ && /limit rate/ && /counter/ { - ip = "" - rate = 0 - packets = 0 - bytes = 0 - for (i = 1; i <= NF; i++) { - # FIRST daddr only. In "each" mode the rule reads - # ip daddr meter m { ip daddr limit rate over ... } - # and the meter key is a bare "ip daddr" with no operand, so - # overwriting on every match reported the target as "limit" — - # every per-device subnet limit was invisible to this output, to - # the dashboard, and to tctl_has_limit. - if (ip == "" && $i == "daddr" && i < NF && $(i+1) ~ /^[0-9]/) ip = $(i+1) - if ($i == "rate" && $(i+1) == "over") { - val = $(i+2) - gsub(/[^0-9]/, "", val) - # nft lists the largest whole unit, stepping by 1024 - # (see tctl_rl_rate_kbit); back to SI kbit/s. - rate = tctl_rate_kbit(val, $(i+3)) - } - if ($i == "counter") { - # format: counter packets N bytes N - if ($(i+1) == "packets") packets = $(i+2) - if ($(i+3) == "bytes") bytes = $(i+4) - } - } - if (ip != "") { - if (!(ip in seen)) { seen[ip] = 1; order[++n] = ip } - # A meter keyed on the address is what makes the bucket per-device. - mode[ip] = (index($0, " meter ") > 0) ? "each" : "shared" - rate_of[ip] = rate - pkts[ip] += packets - byts[ip] += bytes - } - } - END { - printf "[" - for (i = 1; i <= n; i++) { - ip = order[i] - if (i > 1) printf "," - printf "{\"ip\":\"%s\",\"mode\":\"%s\",\"rate_kbit\":%d,\"packets\":%.0f,\"bytes\":%.0f,\"pass_packets\":0,\"pass_bytes\":0}", \ - ip, mode[ip], rate_of[ip], pkts[ip], byts[ip] - } - printf "]\n" - } - ' -else - # hashlimit is keyed on dstip whatever mode was asked for, so on this path - # every bucket is per-address — "each" is the honest answer, not the - # requested mode. Documented in docs/API.md: shared needs nftables. - iptables -t mangle -L FORWARD -nvx 2>/dev/null | grep "rl_ratelimit" | awk "$TCTL_NFT_RATE_AWK"' - { - packets = $1 - bytes = $2 - ip = "" - rate = 0 - for (i = 1; i <= NF; i++) { - if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ && ip == "") { - # skip source 0.0.0.0/0, take destination - } - if (i == 9) ip = $i - } - # the "above X" ceiling, in iptables units (see tctl_ipt_rate_kbit) - rate = tctl_ipt_first_rate() - if (rate < 0) rate = 0 - if (ip != "" && ip != "0.0.0.0/0") { - if (!(ip in seen)) { seen[ip] = 1; order[++n] = ip } - rate_of[ip] = rate - pkts[ip] += packets - byts[ip] += bytes - } - } - END { - printf "[" - for (i = 1; i <= n; i++) { - ip = order[i] - if (i > 1) printf "," - printf "{\"ip\":\"%s\",\"mode\":\"each\",\"rate_kbit\":%d,\"packets\":%.0f,\"bytes\":%.0f,\"pass_packets\":0,\"pass_bytes\":0}", \ - ip, rate_of[ip], pkts[ip], byts[ip] - } - printf "]\n" - } - ' -fi diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-ratelimit.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-ratelimit.sh deleted file mode 100755 index 0b3b8b048..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-ratelimit.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Rate-limit bandwidth in both directions (policer). -# -# Usage: trafficctl-ratelimit.sh [label] [mode] [rate_up] -# target a host (10.0.20.122), a CIDR (10.0.20.0/24), or "all" -# mode each — every address in the target gets its own bucket (default -# for CIDR/all, so "5 Mbit each" means per device) -# shared — the whole target shares one bucket (aggregate cap) -# rate_up upload ceiling in kbit/s; omitted means the same as rate_kbit, -# which is what this did before the directions could differ -# rate_kbit=0 removes the limit. - -. /usr/local/bin/trafficctl-fw.sh - -IP="$1" -RATE="$2" -MODE="$4" -# Fifth positional so every existing caller keeps working unchanged. Empty is -# "same as download", never zero — a zero ceiling policed every packet, which -# is a total block dressed up as a limit. -RATE_UP="$5" -[ -z "$RATE_UP" ] && RATE_UP="$RATE" - -if [ -z "$IP" ] || [ -z "$RATE" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-ratelimit.sh [label] [each|shared]"}' - exit 1 -fi - -TARGET=$(tctl_validate_target "$IP") || { - echo '{"ok":false,"msg":"invalid target — expected an IP, a CIDR, or \"all\""}' - exit 1 -} -IP="$TARGET" - -if [ -z "$MODE" ]; then - MODE=$(tctl_ratelimit_default_mode "$IP") -fi -case "$MODE" in - each|shared) ;; - *) echo '{"ok":false,"msg":"mode must be each or shared"}'; exit 1 ;; -esac - -LABEL="${3:-rl_$(tctl_target_slug "$IP")}" -COMMENT=$(tctl_ratelimit_comment "$IP") - -if [ "$RATE" = "0" ]; then - # Limits written before comments were derived from the target carry the - # caller's label, so one set from LuCI could not be removed from Telegram. - tctl_ratelimit_remove "$IP" "rl_ratelimit_${LABEL}" 2>/dev/null - if tctl_ratelimit_remove "$IP" "$COMMENT"; then - tctl_persist_enabled && tctl_persist_remove "ratelimit" "$IP" - tctl_log "ratelimit_remove" "$IP" "" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - echo "{\"ok\":true,\"msg\":\"rate limit removed for $IP\"}" - else - echo "{\"ok\":false,\"msg\":\"failed to remove rate limit for $IP\"}" - exit 1 - fi -else - # How the applied ceiling is spelled out. Naming one number when the - # operator gave two would hide exactly the thing they asked for. - rate_text() { - if [ "$RATE_UP" != "$RATE" ]; then - echo "${RATE} kbit/s down, ${RATE_UP} kbit/s up" - else - echo "${RATE} kbit/s" - fi - } - tctl_ratelimit_remove "$IP" "$COMMENT" 2>/dev/null - TCTL_RL_DOWNLOAD_FAILED=0 - TCTL_RL_UPLOAD_FAILED=0 - TCTL_RL_UPLOAD6_OK=0 - TCTL_RL_DOWNLOAD6_OK=0 - tctl_ratelimit_add "$IP" "$RATE" "$COMMENT" "$MODE" "$RATE_UP" - - # IPv6 coverage depends on whether the target has a MAC to key on, and - # each half can fail to load on its own. The operator has to know which - # part is live: claiming "both directions" without this note is how issue - # #67 stayed invisible. - if [ "$TCTL_RL_UPLOAD6_OK" = "1" ] && [ "$TCTL_RL_DOWNLOAD6_OK" = "1" ]; then - V6NOTE=" [IPv6: both directions]" - elif [ "$TCTL_RL_UPLOAD6_OK" = "1" ]; then - V6NOTE=" [IPv6: upload only]" - elif [ "$TCTL_RL_DOWNLOAD6_OK" = "1" ]; then - V6NOTE=" [IPv6: download only]" - else - V6NOTE=" [IPv4 only]" - fi - V6UP=$([ "$TCTL_RL_UPLOAD6_OK" = "1" ] && echo true || echo false) - V6DN=$([ "$TCTL_RL_DOWNLOAD6_OK" = "1" ] && echo true || echo false) - - # A half-applied limit is a silent trap: report exactly which direction - # is live rather than claiming success for both. - if [ "$TCTL_RL_DOWNLOAD_FAILED" = "1" ] && [ "$TCTL_RL_UPLOAD_FAILED" = "1" ]; then - echo "{\"ok\":false,\"msg\":\"failed to set rate limit for $IP (no usable WAN or LAN ingress device)\"}" - exit 1 - fi - # The mode is persisted with the rate. Without it the restore hook fell back - # to tctl_ratelimit_add's own default ("shared"), so a subnet limited - # "5 Mbit each" came back after a reboot as 5 Mbit for the entire subnet. - # The upload rate is persisted alongside, and only when it differs — a - # symmetric limit keeps producing exactly the record it always did. - tctl_persist_enabled && tctl_persist_save "ratelimit" "$IP" "$RATE" "$MODE" \ - "$([ "$RATE_UP" != "$RATE" ] && echo "$RATE_UP")" - tctl_log "ratelimit_set" "$IP" "$(rate_text)" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - # An already-accelerated flow is not re-evaluated against a rule that - # appeared afterwards, exactly as with flow offload — so the NSS flow - # table gets the same treatment the conntrack table does. - tctl_nss_defunct - # On a Qualcomm NSS router the rules above are installed and inert: the - # packets never reach the Linux stack. Reporting an unqualified success - # there is the defect in #81, so every message below carries the verdict - # and the result carries the status as a field. - NSSNOTE="$(tctl_nss_note)$(tctl_persist_note)" - NSS="$(tctl_nss_status)" - PERSIST=$(tctl_persist_enabled && echo true || echo false) - if [ "$TCTL_RL_DOWNLOAD_FAILED" = "1" ]; then - echo "{\"ok\":true,\"ipv6_upload\":$V6UP,\"ipv6_download\":$V6DN,\"nss\":\"$NSS\",\"persist\":$PERSIST,\"msg\":\"rate limit ${RATE_UP} kbit/s applied to $IP UPLOAD ONLY — WAN device not resolvable$V6NOTE$NSSNOTE\"}" - elif [ "$TCTL_RL_UPLOAD_FAILED" = "1" ]; then - # No ingress device means nothing feeds the v6 download set either, so - # tctl_ratelimit_add has already reported that half as not live. - echo "{\"ok\":true,\"ipv6_upload\":false,\"ipv6_download\":false,\"nss\":\"$NSS\",\"persist\":$PERSIST,\"msg\":\"rate limit ${RATE} kbit/s applied to $IP DOWNLOAD ONLY — no LAN ingress device [IPv4 only]$NSSNOTE\"}" - else - echo "{\"ok\":true,\"ipv6_upload\":$V6UP,\"ipv6_download\":$V6DN,\"nss\":\"$NSS\",\"persist\":$PERSIST,\"msg\":\"rate limit $(rate_text) for $IP (both directions, $MODE)$V6NOTE$NSSNOTE\"}" - fi -fi diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-rdns-refresh.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-rdns-refresh.sh deleted file mode 100755 index d5b330a29..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-rdns-refresh.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Populate the reverse-DNS name cache for the given IPs. -# -# Runs detached from the summary poll: resolving is slow and must never block -# the device table. The summary reads whatever the cache already holds and -# spawns this to fill in the gaps for the next poll. -# -# Names for devices behind a downstream router (MikroTik etc.) are not in this -# router's DHCP leases, so PTR is the only automatic source. trafficctl.main. -# rdns_server takes a space-separated list of resolvers tried in order — point -# it at the downstream router so its lease names get used. -# -# Usage: trafficctl-rdns-refresh.sh [ip ...] -# Cache: /tmp/trafficctl_rdns_cache — "IP HOST TIMESTAMP", HOST "-" = no record. - -. /usr/local/bin/trafficctl-fw.sh - -CACHE="/tmp/trafficctl_rdns_cache" -LOCK="/tmp/trafficctl_rdns.lock" - -# Only one refresher at a time: concurrent runs would fight over the cache file -# and hammer the resolvers with duplicate queries. -mkdir "$LOCK" 2>/dev/null || exit 0 -# shellcheck disable=SC2064 -trap "rmdir '$LOCK' 2>/dev/null" EXIT INT TERM - -SERVERS=$(uci -q get trafficctl.main.rdns_server 2>/dev/null) - -resolve_one() { - local ip="$1" host="" srv - - for srv in $SERVERS; do - host=$(nslookup "$ip" "$srv" 2>/dev/null | \ - sed -n -e 's/.*name = \([^ ]*\)\.$/\1/p' -e 's/^Name:[ ]*\(.*\)$/\1/p' | head -1) - [ -n "$host" ] && break - done - - # System resolver (dnsmasq knows this router's own leases and any - # PTR forwarding configured for downstream subnets). - if [ -z "$host" ] && command -v ubus >/dev/null 2>&1; then - host=$(ubus call network.rrdns lookup \ - "{\"addrs\":[\"$ip\"],\"timeout\":2000,\"limit\":1}" 2>/dev/null \ - | jsonfilter -e "@[\"$ip\"]" 2>/dev/null) - fi - if [ -z "$host" ] && command -v nslookup >/dev/null 2>&1; then - host=$(nslookup "$ip" 2>/dev/null | \ - sed -n -e 's/.*name = \([^ ]*\)\.$/\1/p' -e 's/^Name:[ ]*\(.*\)$/\1/p' | head -1) - fi - - # Reject anything that isn't a plain hostname, and drop the reverse-zone - # echo some resolvers return instead of NXDOMAIN. - case "$host" in - *in-addr.arpa*|*[!a-zA-Z0-9._-]*|"") host="" ;; - esac - # Bare hostname only — "phone.lan" is more useful than the full FQDN in a table. - printf '%s' "${host%%.*}" -} - -NOW=$(date +%s) -TMP="${CACHE}.tmp" - -for ip in "$@"; do - tctl_validate_ip "$ip" || continue - HOST=$(resolve_one "$ip") - [ -z "$HOST" ] && HOST="-" - # Rewrite this IP's entry, keeping every other line. - [ -f "$CACHE" ] || : > "$CACHE" - awk -v ip="$ip" '$1 != ip' "$CACHE" > "$TMP" - echo "$ip $HOST $NOW" >> "$TMP" - mv "$TMP" "$CACHE" -done diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-rdns.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-rdns.sh deleted file mode 100755 index f44be0e33..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-rdns.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Reverse DNS lookup for an IP address. -# Usage: trafficctl-rdns.sh -# Output: {"ip":"...","host":"..."} - -. /usr/local/bin/trafficctl-fw.sh - -IP="$1" - -if [ -z "$IP" ]; then - echo '{"ip":"","host":""}' - exit 1 -fi - -if ! tctl_validate_ip "$IP"; then - echo "{\"ip\":\"$IP\",\"host\":\"\"}" - exit 1 -fi - -HOST="" -# Try ubus network.rrdns (same resolver the LuCI frontend uses; always available via rpcd) -if command -v ubus >/dev/null 2>&1; then - HOST=$(ubus call network.rrdns lookup \ - "{\"addrs\":[\"$IP\"],\"timeout\":2000,\"limit\":1}" 2>/dev/null \ - | jsonfilter -e "@[\"$IP\"]" 2>/dev/null) -fi -# Fallback: BusyBox nslookup (always available on OpenWrt) -if [ -z "$HOST" ] && command -v nslookup >/dev/null 2>&1; then - HOST=$(nslookup "$IP" 2>/dev/null | sed -n 's/.*name = \(.*\)\.$/\1/p' | head -1) -fi - -# Validate hostname (only allow safe chars) -case "$HOST" in - *[!a-zA-Z0-9._-]*|"") HOST="" ;; -esac - -if [ -z "$HOST" ]; then - echo "{\"ip\":\"$IP\",\"host\":\"\"}" -else - echo "{\"ip\":\"$IP\",\"host\":\"$HOST\"}" -fi diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-shape-stats.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-shape-stats.sh deleted file mode 100755 index 509b47cbf..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-shape-stats.sh +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Show traffic shaping statistics for all shaped devices. -# Output: JSON array with extended stats per IP. -# Fields: ip, rate_kbit, bytes, packets, backlog, drops, overlimits, -# requeues, lended, borrowed, ecn_mark, new_flows, old_flows, -# target_us, memory_used - -. /usr/local/bin/trafficctl-fw.sh - -LAN_DEV=$(tctl_get_lan_device) - -if ! command -v tc >/dev/null 2>&1; then - echo '[]'; exit 0 -fi - -if ! tc qdisc show dev "$LAN_DEV" 2>/dev/null | grep -q "htb 1:"; then - echo '[]'; exit 0 -fi - -# Map classid → real IP from persisted shapes. Minors are allocated, not derived -# from the address, so this map is the only way back to an IP; classes missing -# from it belong to another tc user and are skipped rather than mislabelled. -# The pattern used to require the record to end at the classid, so every shape -# with its own upload ceiling ("rate_kbit_up") was dropped from this output, -# and with it from tctl_has_limit. -# -# Flattened to ONE "classid ip classid ip …" line: a multi-line value passed -# through `awk -v` is rejected by some awks ("newline in string"), which left -# this output empty. Neither field can contain a space. -CLASSMAP=$(tctl_shape_classmap | awk '{ printf "%s %s ", $2, $1 }') - -# Collect class stats into a temp file so we can merge with qdisc stats -CLASS_DATA=$(tc -s class show dev "$LAN_DEV" 2>/dev/null) -QDISC_DATA=$(tc -s qdisc show dev "$LAN_DEV" 2>/dev/null) - -# Parse class stats: emit lines "classid ip rate bytes pkts backlog drops overlimits requeues lended borrowed" -CLASS_PARSED=$(echo "$CLASS_DATA" | awk -v classmap="$CLASSMAP" ' -BEGIN { - n = split(classmap, cmf, " ") - for (ci = 1; ci + 1 <= n; ci += 2) - if (cmf[ci] != "" && cmf[ci + 1] != "") ipmap[cmf[ci]] = cmf[ci + 1] -} - -/class fq_codel/ { skip = 1; next } -/^class htb 1:/ { - # emit previous record if valid - if (have_record && current_rate > 0 && current_rate < 1000000 && (classid in ipmap)) { - printf "%s %s %d %d %d %d %d %d %d %d %d\n", \ - classid, ipmap[classid], current_rate, \ - bytes, pkts, backlog, drops, overlimits, requeues, lended, borrowed - } - minor = $3 - sub(/^1:/, "", minor) - if (minor == "1" || minor == "fffe") { skip = 1; next } - skip = 0 - classid = "1:" minor - current_rate = 0 - for (i = 1; i <= NF; i++) { - if ($i == "rate") { - v = $(i+1) - if (v ~ /Gbit/) { sub(/Gbit/, "", v); current_rate = (v+0) * 1000000 } - else if (v ~ /Mbit/) { sub(/Mbit/, "", v); current_rate = (v+0) * 1000 } - else if (v ~ /[Kk]bit/) { sub(/[Kk]bit/, "", v); current_rate = v+0 } - break - } - } - bytes = 0; pkts = 0; backlog = 0; drops = 0; overlimits = 0; requeues = 0 - lended = 0; borrowed = 0 - have_record = 1 -} -/Sent [0-9]+ bytes/ && !skip { - for (i = 1; i <= NF; i++) { - if ($i == "Sent") bytes = $(i+1) - if ($i ~ /^[0-9]+$/ && $(i+1) == "pkt") pkts = $i - } - # parse "(dropped N, overlimits N requeues N)" from same line - for (i = 1; i <= NF; i++) { - if ($i == "(dropped") { v = $(i+1); sub(/,/, "", v); drops = v + 0 } - if ($i == "overlimits") { v = $(i+1); sub(/[^0-9]/, "", v); overlimits = v + 0 } - } - # requeues at end of Sent line - for (i = 1; i <= NF; i++) { - if ($i == "requeues") { - v = $(i+1); sub(/[^0-9]/, "", v) - if (v != "") requeues = v + 0 - } - } -} -/backlog/ && !skip { - for (i = 1; i <= NF; i++) { - if ($i == "backlog") { - v = $(i+1); sub(/b$/, "", v) - backlog = v + 0 - } - } -} -/lended:/ && !skip { - for (i = 1; i <= NF; i++) { - if ($i == "lended:") lended = $(i+1) + 0 - if ($i == "borrowed:") borrowed = $(i+1) + 0 - } -} -END { - if (have_record && current_rate > 0 && current_rate < 1000000 && (classid in ipmap)) { - printf "%s %s %d %d %d %d %d %d %d %d %d\n", \ - classid, ipmap[classid], current_rate, \ - bytes, pkts, backlog, drops, overlimits, requeues, lended, borrowed - } -} -') - -# Parse fq_codel qdisc stats: emit lines "parent_classid ecn_mark new_flows old_flows target_us memory_used" -QDISC_PARSED=$(echo "$QDISC_DATA" | awk ' -/^qdisc fq_codel/ { - # emit previous fq_codel record if any - if (have_qdisc && parent_id != "") { - printf "%s %d %d %d %d %d\n", parent_id, ecn_mark, new_flows, old_flows, target_us, memory_used - } - # extract parent classid - parent_id = "" - target_us = 0 - for (i = 1; i <= NF; i++) { - if ($i == "parent") parent_id = $(i+1) - if ($i == "target") { - v = $(i+1) - if (v ~ /ms$/) { sub(/ms$/, "", v); target_us = (v + 0) * 1000 } - else if (v ~ /us$/) { sub(/us$/, "", v); target_us = v + 0 } - } - } - ecn_mark = 0; new_flows = 0; old_flows = 0; memory_used = 0 - have_qdisc = 1 - next -} -/^qdisc/ && !/fq_codel/ { - # different qdisc type, emit previous if valid - if (have_qdisc && parent_id != "") { - printf "%s %d %d %d %d %d\n", parent_id, ecn_mark, new_flows, old_flows, target_us, memory_used - } - have_qdisc = 0 - parent_id = "" - next -} -have_qdisc && /ecn_mark/ { - for (i = 1; i <= NF; i++) { - if ($i == "ecn_mark") ecn_mark = $(i+1) + 0 - } -} -have_qdisc && /new_flows/ && !/new_flow_count/ { - for (i = 1; i <= NF; i++) { - if ($i == "new_flows") new_flows = $(i+1) + 0 - if ($i == "old_flows") old_flows = $(i+1) + 0 - } -} -have_qdisc && /memory_used/ { - for (i = 1; i <= NF; i++) { - if ($i == "memory_used") memory_used = $(i+1) + 0 - } -} -END { - if (have_qdisc && parent_id != "") { - printf "%s %d %d %d %d %d\n", parent_id, ecn_mark, new_flows, old_flows, target_us, memory_used - } -} -') - -# If no classes found, output empty array -if [ -z "$CLASS_PARSED" ]; then - echo '[]' - exit 0 -fi - -# Write qdisc data to temp file for awk to read -QDISC_TMP=$(mktemp /tmp/tctl_qdisc.XXXXXX) -# shellcheck disable=SC2064 -trap "rm -f '$QDISC_TMP'" EXIT INT TERM -echo "$QDISC_PARSED" > "$QDISC_TMP" - -# Merge class and qdisc data, output JSON -# First file (QDISC_TMP) is loaded into arrays, second input (stdin) is class data -echo "$CLASS_PARSED" | awk ' -NR == FNR { - # Reading qdisc temp file - if (NF >= 6) { - qd_ecn[$1] = $2 + 0 - qd_new[$1] = $3 + 0 - qd_old[$1] = $4 + 0 - qd_target[$1] = $5 + 0 - qd_mem[$1] = $6 + 0 - } - next -} -{ - classid = $1 - ip = $2 - rate = $3 + 0 - bytes = $4 + 0 - pkts = $5 + 0 - backlog = $6 + 0 - drops = $7 + 0 - overlimits = $8 + 0 - requeues = $9 + 0 - lended = $10 + 0 - borrowed = $11 + 0 - - ecn = 0; nf = 0; of = 0; tgt = 0; mem = 0 - if (classid in qd_ecn) ecn = qd_ecn[classid] - if (classid in qd_new) nf = qd_new[classid] - if (classid in qd_old) of = qd_old[classid] - if (classid in qd_target) tgt = qd_target[classid] - if (classid in qd_mem) mem = qd_mem[classid] - - if (first) printf "," - printf "{\"ip\":\"%s\",\"rate_kbit\":%d,\"bytes\":%.0f,\"packets\":%.0f,\"backlog\":%d,\"drops\":%.0f,\"overlimits\":%.0f,\"requeues\":%.0f,\"lended\":%.0f,\"borrowed\":%.0f,\"ecn_mark\":%.0f,\"new_flows\":%d,\"old_flows\":%d,\"target_us\":%d,\"memory_used\":%d}", \ - ip, rate, bytes, pkts, backlog, drops, overlimits, requeues, lended, borrowed, ecn, nf, of, tgt, mem - first = 1 -} -BEGIN { printf "[" } -END { printf "]\n" } -' "$QDISC_TMP" - - -rm -f "$QDISC_TMP" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-shape.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-shape.sh deleted file mode 100755 index 00f5e522a..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-shape.sh +++ /dev/null @@ -1,395 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Traffic shaping (tc/HTB) for per-device bandwidth control. -# Usage: trafficctl-shape.sh [rate_kbit] [label] - -. /usr/local/bin/trafficctl-fw.sh - -SHAPES_FILE="/etc/trafficctl/shapes.json" -LAN_DEV=$(tctl_get_lan_device) -# Upload is shaped on the WAN device's egress — the only place LAN->WAN -# traffic can be queued. Shaping the LAN device alone (as this did originally) -# only ever touches the download direction. -# Upload is shaped on an IFB device fed from LAN-side ingress, NOT on the WAN -# device: by the time a packet reaches WAN egress, POSTROUTING has already -# masqueraded its source to the router's WAN address, so a per-client -# "match ip src" filter there matches nothing. Redirecting ingress into an IFB -# shapes it while the client's real source address is still intact — which is -# also what makes it work for routed/downstream clients. -IFB_DEV=$(uci -q get trafficctl.main.shape_ifb 2>/dev/null) -[ -z "$IFB_DEV" ] && IFB_DEV="tctl-ifb0" - -ACTION="$1" -IP="$2" -RATE="$3" -# shellcheck disable=SC2034 -LABEL="${4:-shape_$IP}" -# Upload ceiling. Appended as a fifth positional so every existing caller — -# the rpcd backend, the Telegram bot, the DHCP new-device hook and the boot -# restore — keeps working unchanged. Empty means "same as download", which is -# what shaping did before this existed; it is deliberately NOT treated as zero, -# since a zero ceiling is a total upload block that would report success. -RATE_UP="$5" -[ -z "$RATE_UP" ] && RATE_UP="$RATE" - -# A classid minor is 16 bit and two values are already taken — 1:1 is the root -# class and 1:fffe the default one — so a minor cannot be derived from the -# address: 192.168.0.1 would land on the root class (deleting it tears down -# every other device's shape) and any x.x.255.254 on the default one. Addresses -# from different subnets that share their last two octets would also collide, -# and the app supports routed/downstream clients from other subnets. Minors are -# therefore allocated once per address and persisted alongside the rate. -CLASSID_MIN=2 -CLASSID_MAX=65533 - -# Regex-quote a value used in a sed address or grep pattern: an unescaped dot -# matches any character, so 192.168.1.1 would also match 192.168.1x1. -re_quote() { - echo "$1" | sed 's/[].[^$*\/]/\\&/g' -} - -# Records are extracted by pattern, not parsed, so this expression decides what -# counts as a record at all. A record it does not match is not merely misread — -# it disappears from used_minors(), alloc_classid hands its minor to another -# device, and the two then share an HTB class: removing one tears down the -# other. The optional rate_kbit_up group is therefore at the TAIL, and every -# reader below tolerates both the old three-field form and the new one. -shapes_entries() { - grep -oE '\{"ip":"[^"]+","rate_kbit":[0-9]+(,"classid":"1:[0-9a-f]+")?(,"rate_kbit_up":[0-9]+)?\}' \ - "$SHAPES_FILE" 2>/dev/null -} - -# Minor of the classid recorded for this address, empty when not shaped yet. -lookup_classid() { - local ip esc - ip="$1" - esc=$(re_quote "$ip") - shapes_entries \ - | sed -n "s/^{\"ip\":\"$esc\",\"rate_kbit\":[0-9]*,\"classid\":\"\(1:[0-9a-f]*\)\"\(,\"rate_kbit_up\":[0-9]*\)\{0,1\}}$/\1/p" \ - | head -1 -} - -# Upload ceiling recorded for this address. Empty means the record predates -# asymmetric shaping, or was written symmetric — both mean "same as download", -# which is what every shape did before this existed. -lookup_rate_up() { - local ip esc - ip="$1" - esc=$(re_quote "$ip") - shapes_entries \ - | sed -n "s/^{\"ip\":\"$esc\",\"rate_kbit\":[0-9]*,\"classid\":\"1:[0-9a-f]*\",\"rate_kbit_up\":\([0-9]*\)}$/\1/p" \ - | head -1 -} - -used_minors() { - shapes_entries \ - | sed -n 's/.*"classid":"1:\([0-9a-f]*\)".*/\1/p' \ - | while read -r h; do [ -n "$h" ] && printf '%d\n' "$((0x$h))"; done - for dev in "$LAN_DEV" "$IFB_DEV"; do - tc class show dev "$dev" 2>/dev/null \ - | sed -n 's/^class htb 1:\([0-9a-f]*\) .*/\1/p' \ - | while read -r h; do [ -n "$h" ] && printf '%d\n' "$((0x$h))"; done - done -} - -alloc_classid() { - used_minors | sort -n -u | awk -v min="$CLASSID_MIN" -v max="$CLASSID_MAX" ' - BEGIN { free = min } - { if ($1 + 0 == free) free++ } - END { - if (free > max) exit 1 - printf "1:%x\n", free - }' -} - -# Shapes persisted before minors were allocated carry no classid, so their class -# is still the one derived from the address. Only used to clean those up on -# removal, and never for the two reserved minors the derivation could produce. -legacy_classid() { - local ip o3 o4 dec - ip="$1" - o3=$(echo "$ip" | cut -d. -f3) - o4=$(echo "$ip" | cut -d. -f4) - dec=$((o3 * 256 + o4)) - [ "$dec" -lt "$CLASSID_MIN" ] && return 1 - [ "$dec" -gt "$CLASSID_MAX" ] && return 1 - printf "1:%x\n" "$dec" -} - -# Existing shapes keep their minor; a new one gets the lowest free value. -resolve_classid() { - local ip cid - ip="$1" - cid=$(lookup_classid "$ip") - if [ -n "$cid" ]; then - echo "$cid" - return 0 - fi - alloc_classid -} - -# Root qdiscs that OpenWrt or the kernel put there by default carry no -# configuration worth preserving. Anything else (cake from SQM, an HFSC or -# foreign HTB hierarchy) is somebody's QoS setup and must not be torn down -# silently — the caller reports that shaping is unavailable instead. -root_qdisc_replaceable() { - local dev root kind - dev="$1" - root=$(tc qdisc show dev "$dev" 2>/dev/null | grep -m1 ' root ') - [ -n "$root" ] || return 0 - kind=$(echo "$root" | awk '{print $2}') - case "$kind" in - pfifo_fast|fq_codel|fq|noqueue|mq|pfifo|bfifo|sfq|codel|htb) return 0 ;; - *) return 1 ;; - esac -} - -ensure_root_qdisc() { - local dev="${1:-$LAN_DEV}" - # Set up root HTB hierarchy if not present - tc class show dev "$dev" 2>/dev/null | grep -q "class htb 1:1 " && return 0 - root_qdisc_replaceable "$dev" || return 1 - tc qdisc del dev "$dev" root 2>/dev/null - tc qdisc add dev "$dev" root handle 1: htb default fffe r2q 10 - tc class add dev "$dev" parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit burst 125000b cburst 125000b - tc class add dev "$dev" parent 1:1 classid 1:fffe htb rate 1000mbit ceil 1000mbit burst 125000b cburst 125000b prio 0 - tc qdisc add dev "$dev" parent 1:fffe fq_codel 2>/dev/null -} - -# Bring up the IFB device and mirror LAN-side ingress into it. Needs kmod-ifb -# and act_mirred; returns non-zero when either is missing so callers can report -# download-only shaping instead of pretending upload is limited. -ensure_ifb() { - local dev - if ! ip link show "$IFB_DEV" >/dev/null 2>&1; then - ip link add name "$IFB_DEV" type ifb 2>/dev/null || return 1 - fi - ip link set "$IFB_DEV" up 2>/dev/null || return 1 - ensure_root_qdisc "$IFB_DEV" || return 1 - - for dev in $(tctl_ingress_devices); do - tc qdisc show dev "$dev" ingress 2>/dev/null | grep -q 'qdisc ingress' || \ - tc qdisc add dev "$dev" handle ffff: ingress 2>/dev/null - tc filter show dev "$dev" parent ffff: 2>/dev/null | grep -q mirred || \ - tc filter add dev "$dev" parent ffff: protocol ip prio 1 u32 \ - match u32 0 0 action mirred egress redirect dev "$IFB_DEV" 2>/dev/null - done - # Useless unless at least the IFB root exists. - tc class show dev "$IFB_DEV" 2>/dev/null | grep -q "class htb 1:1 " -} - -# Attach one shaping class on a device, matching the given IP in the given -# direction ("dst" on the LAN side for download, "src" on the WAN side for -# upload). -shape_attach() { - local dev="$1" match="$2" ip="$3" classid="$4" rate="$5" burst="$6" - - tc filter del dev "$dev" parent 1:0 prio 10 protocol ip u32 match ip "$match" "$ip"/32 2>/dev/null - tc qdisc del dev "$dev" parent "$classid" 2>/dev/null - tc class del dev "$dev" classid "$classid" 2>/dev/null - - ensure_root_qdisc "$dev" || return 1 - tc class add dev "$dev" parent 1:1 classid "$classid" htb \ - rate "${rate}kbit" ceil "${rate}kbit" burst "${burst}b" cburst "${burst}b" 2>&1 || return 1 - tc qdisc add dev "$dev" parent "$classid" fq_codel 2>/dev/null - tc filter add dev "$dev" parent 1:0 prio 10 protocol ip u32 \ - match ip "$match" "$ip"/32 flowid "$classid" 2>&1 || return 1 -} - -shape_detach() { - local dev="$1" match="$2" ip="$3" classid="$4" - tc filter del dev "$dev" parent 1:0 prio 10 protocol ip u32 match ip "$match" "$ip"/32 2>/dev/null - tc qdisc del dev "$dev" parent "$classid" 2>/dev/null - tc class del dev "$dev" classid "$classid" 2>/dev/null -} - -save_shape() { - local ip="$1" rate="$2" classid="$3" rate_up="$4" - mkdir -p "$(dirname "$SHAPES_FILE")" - [ ! -f "$SHAPES_FILE" ] && echo "[]" > "$SHAPES_FILE" - - local lockd="/tmp/trafficctl_shapes.lock.d" - local tmpf="/tmp/shapes_rebuild.$$" - - # mkdir is atomic, so unlike a test-then-create lock file two writers cannot - # both believe they hold it and lose one another's entry. - local tries=0 - while ! mkdir "$lockd" 2>/dev/null; do - tries=$((tries + 1)) - if [ "$tries" -ge 50 ]; then - # A stale directory from a killed writer must not block shaping forever. - rmdir "$lockd" 2>/dev/null || true - mkdir "$lockd" 2>/dev/null || break - break - fi - sleep 0.1 2>/dev/null || sleep 1 - done - # shellcheck disable=SC2064 - trap "rm -f '$tmpf'; rmdir '$lockd' 2>/dev/null" EXIT - - # Portable: extract entries with grep, filter, rebuild JSON - local old_entries esc - old_entries=$(shapes_entries || true) - esc=$(re_quote "$ip") - local filtered - filtered=$(echo "$old_entries" | grep -v "^{\"ip\":\"$esc\"," || true) - if [ "$rate" -gt 0 ] 2>/dev/null; then - # rate_kbit_up is written only when the two directions differ, so a - # symmetric shape still produces exactly the record it always did. - # Downgrading the package then keeps working for the common case. - local up_field="" - [ -n "$rate_up" ] && [ "$rate_up" != "$rate" ] && up_field=",\"rate_kbit_up\":$rate_up" - local entry="{\"ip\":\"$ip\",\"rate_kbit\":$rate,\"classid\":\"$classid\"$up_field}" - if [ -n "$filtered" ]; then - filtered=$(printf "%s\n%s" "$filtered" "$entry") - else - filtered="$entry" - fi - fi - printf "[" > "$tmpf" - echo "$filtered" | awk 'NF{if(n++)printf ",";printf "%s",$0}' >> "$tmpf" - printf "]" >> "$tmpf" - - mv "$tmpf" "$SHAPES_FILE" - rmdir "$lockd" 2>/dev/null || true -} - -remove_shape() { - local ip="$1" - save_shape "$ip" "0" "" -} - -do_add() { - local classid - classid=$(resolve_classid "$IP") - if [ -z "$classid" ]; then - echo '{"ok":false,"msg":"no free shaping class available"}' - return 1 - fi - - # Calculate burst: 10ms of data, minimum 1600 bytes - local burst_bytes - burst_bytes=$(( RATE * 125 / 100 )) - [ "$burst_bytes" -lt 1600 ] && burst_bytes=1600 - - # Download: queue on the LAN device, matching traffic destined to the client. - if ! shape_attach "$LAN_DEV" dst "$IP" "$classid" "$RATE" "$burst_bytes"; then - # Naming the cause matters here: declining to replace a foreign root - # qdisc is deliberate (it is how an SQM/cake setup survives this app), - # but "tc setup failed" reads as a bug and gives no way to act on it. - # The rate limiter is a policer, owns no qdisc, and works alongside SQM. - if ! root_qdisc_replaceable "$LAN_DEV"; then - echo "{\"ok\":false,\"msg\":\"shaping declined on $LAN_DEV: another QoS setup (SQM/cake or a custom HTB tree) owns the root qdisc and will not be torn down. Use the limiter instead — it is a policer and coexists with SQM.\"}" - else - echo "{\"ok\":false,\"msg\":\"tc setup failed for $IP on $LAN_DEV\"}" - fi - return 1 - fi - - # Upload: shaped pre-NAT on the IFB device fed from LAN ingress. - # Reported separately so a missing kmod-ifb doesn't look like total failure. - # The two directions are already separate HTB classes on separate devices, - # so giving them separate rates costs nothing beyond its own burst. - local ul_burst - ul_burst=$(( RATE_UP * 125 / 100 )) - [ "$ul_burst" -lt 1600 ] && ul_burst=1600 - local ul_ok=1 - if ensure_ifb; then - shape_attach "$IFB_DEV" src "$IP" "$classid" "$RATE_UP" "$ul_burst" || ul_ok=0 - else - ul_ok=0 - fi - - save_shape "$IP" "$RATE" "$classid" "$RATE_UP" - local rates="${RATE} kbit/s" - [ "$RATE_UP" != "$RATE" ] && rates="${RATE} kbit/s down, ${RATE_UP} kbit/s up" - # Linux HTB never gets to queue a flow the NSS firmware is forwarding, so - # a shape on such a router is installed and inert (#81). NSS builds ship - # their own qdiscs (nsshtb/nsstbl) which this does not yet use; until it - # does, say so instead of reporting success. - tctl_nss_defunct - NSSNOTE="$(tctl_nss_note)" - NSS="$(tctl_nss_status)" - if [ "$ul_ok" = "1" ]; then - echo "{\"ok\":true,\"nss\":\"$NSS\",\"msg\":\"shape $rates applied to $IP both directions (class $classid)$NSSNOTE\"}" - elif [ "$RATE_UP" != "$RATE" ]; then - # Saying "applied" here would be a lie about the half the operator - # explicitly asked to differ. - echo "{\"ok\":true,\"nss\":\"$NSS\",\"msg\":\"shape ${RATE} kbit/s applied to $IP for download only — the ${RATE_UP} kbit/s upload ceiling was NOT applied, it needs kmod-ifb: opkg/apk install kmod-ifb kmod-sched$NSSNOTE\"}" - else - echo "{\"ok\":true,\"nss\":\"$NSS\",\"msg\":\"shape ${RATE} kbit/s applied to $IP (download only — upload needs kmod-ifb: opkg/apk install kmod-ifb kmod-sched)$NSSNOTE\"}" - fi -} - -do_remove() { - local classid - classid=$(lookup_classid "$IP") - [ -n "$classid" ] || classid=$(legacy_classid "$IP") - - if [ -n "$classid" ]; then - shape_detach "$LAN_DEV" dst "$IP" "$classid" - shape_detach "$IFB_DEV" src "$IP" "$classid" - fi - - remove_shape "$IP" - echo "{\"ok\":true,\"msg\":\"shape removed for $IP\"}" -} - -do_status() { - local classid - classid=$(lookup_classid "$IP") - if [ -z "$classid" ]; then - echo "{\"ok\":true,\"ip\":\"$IP\",\"classid\":\"\",\"info\":\"no shape active\"}" - return 0 - fi - local info - info=$(tc -s class show dev "$LAN_DEV" classid "$classid" 2>/dev/null) - if [ -n "$info" ]; then - local rate_val - rate_val=$(echo "$info" | grep -oE 'rate [0-9]+[a-zA-Z]+' | head -1 | awk '{print $2}') - echo "{\"ok\":true,\"ip\":\"$IP\",\"classid\":\"$classid\",\"info\":\"$rate_val\"}" - else - echo "{\"ok\":true,\"ip\":\"$IP\",\"classid\":\"$classid\",\"info\":\"no shape active\"}" - fi -} - -# Main -case "$ACTION" in - add) - if [ -z "$IP" ] || [ -z "$RATE" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-shape.sh add [label]"}' - exit 1 - fi - if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 - fi - do_add - ;; - remove) - if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-shape.sh remove "}' - exit 1 - fi - if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 - fi - do_remove - ;; - status) - if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-shape.sh status "}' - exit 1 - fi - if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 - fi - do_status - ;; - *) - echo '{"ok":false,"msg":"usage: trafficctl-shape.sh [rate_kbit] [label]"}' - exit 1 - ;; -esac diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-subnets.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-subnets.sh deleted file mode 100755 index 4243dbee9..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-subnets.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# List the subnets this router monitors, as CIDRs the dashboard can offer as -# rate-limit targets. -# -# Output: JSON array -# [{"cidr":"192.168.20.0/24","device":"br-guest","kind":"lan"}, -# {"cidr":"10.0.5.0/24","device":"br-lan","kind":"routed"}] -# -# kind is "lan" for a directly connected subnet and "routed" for one reached -# via a next-hop on a LAN device (or listed in trafficctl.main.extra_subnets). -# -# This list is exactly the set a limit can be ENFORCED on: the netdev hooks -# that police traffic are attached to the devices these subnets resolve to, so -# a subnet missing from here (a masquerading non-lan zone, for instance) would -# take a rule that never matches a packet. The dashboard warns off such a -# target instead of pretending it applied. - -. /usr/local/bin/trafficctl-fw.sh - -tctl_monitored_subnets | awk ' -# Octets are derived with arithmetic and printed individually: each is below -# 256, while the packed address is up to 2^32-1 and busybox awk formats "%d" -# through a 32-bit int. -function ip2s(v, o1, o2, o3, o4, rem) { - o1 = int(v / 16777216); rem = v - o1 * 16777216 - o2 = int(rem / 65536); rem = rem - o2 * 65536 - o3 = int(rem / 256) - o4 = rem - o3 * 256 - return sprintf("%d.%d.%d.%d", o1, o2, o3, o4) -} -{ - base = $2 + 0 - block = $3 + 0 - if (block < 1) next - # block is a power of two (1 << (32 - mask)); count it back down rather - # than calling log(), which awk only has in floating point. - mask = 32 - b = block - while (b > 1) { b = b / 2; mask-- } - # router_int is 0 for a subnet that has no local address inside it, which - # is what tells a routed subnet from a connected one. - # Written long-hand: the bashism linter reads the whole file, and - # `name = (...)` at the start of a line looks like a shell array to it. - kind = "lan" - if ($4 + 0 == 0) { kind = "routed" } - if (n++) printf "," - else printf "[" - printf "{\"cidr\":\"%s/%d\",\"device\":\"%s\",\"kind\":\"%s\"}", ip2s(base), mask, $1, kind -} -END { if (!n) printf "["; printf "]\n" } -' diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-summary.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-summary.sh deleted file mode 100755 index efaa25814..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-summary.sh +++ /dev/null @@ -1,475 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Summary of all active LAN devices with traffic control status. -# Output: JSON array with per-device info. -# -# Performance: all firewall/tc/conntrack state is fetched ONCE up front and -# reused per device, instead of re-dumping nft chains / re-reading conntrack -# inside the per-IP loop. On a router with many devices this turns O(N) heavy -# forks (one full conntrack read + two nft chain dumps + a tc call PER device) -# into a constant handful of calls. - -. /usr/local/bin/trafficctl-fw.sh - -CONN_CACHE="/tmp/trafficctl_conn_cache" -[ -f "$CONN_CACHE" ] || : > "$CONN_CACHE" - -PORT_MAP_FILE="/tmp/.trafficctl_portmap.$$" -# shellcheck disable=SC2064 -trap "rm -f '$PORT_MAP_FILE'" EXIT INT TERM - -# Enumerate every LAN subnet (multi-bridge / multi-VLAN aware), once. -LAN_SUBNETS=$(tctl_lan_subnets) -[ -z "$LAN_SUBNETS" ] && { echo '[]'; exit 0; } -LAN_DEVS=$(echo "$LAN_SUBNETS" | awk '{print $1}' | sort -u) -# Monitored = connected LANs + subnets routed via LAN next-hops (downstream -# routers) + trafficctl.main.extra_subnets. Membership spec for awk: -# "netbase:block:routerint ..." — routerint 0 marks a routed (not directly -# connected) subnet, no awk bit-ops needed. -ALL_SUBNETS=$(tctl_monitored_subnets) -MATCH_SPEC=$(echo "$ALL_SUBNETS" | awk '{printf "%s%s:%s:%s",(NR>1?" ":""),$2,$3,$4}') -# Device that carries the tc/HTB shaper (shaping is single-bridge by design). -PRIMARY_LAN_DEV=$(tctl_get_lan_device) - -# Get WiFi station→interface mapping: "mac iface_name band" -get_wifi_stations() { - iw dev 2>/dev/null | awk '/Interface/{print $2}' | while read -r iface; do - local band="" - local ch - ch=$(iw dev "$iface" info 2>/dev/null | awk '/channel/{print $2}') - if [ -n "$ch" ]; then - if [ "$ch" -le 14 ] 2>/dev/null; then - band="2.4G" - elif [ "$ch" -le 177 ] 2>/dev/null; then - band="5G" - else - band="6G" - fi - fi - iw dev "$iface" station dump 2>/dev/null | awk -v iface="$iface" -v band="$band" \ - '/Station/{print tolower($2), iface, band}' - done -} - -# Get bridge MAC→port interface mapping across all LAN bridges: "mac port_iface" -get_bridge_macs() { - local dev - for dev in $LAN_DEVS; do - [ -d "/sys/class/net/$dev/brif" ] || continue - for pdir in /sys/class/net/"$dev"/brif/*/; do - [ -d "$pdir" ] || continue - local iface pno - iface=$(basename "$pdir") - pno=$(cat "${pdir}port_no" 2>/dev/null) - [ -z "$pno" ] && continue - printf "%d %s\n" "$(( pno ))" "$iface" - done > "$PORT_MAP_FILE" - brctl showmacs "$dev" 2>/dev/null | awk -v pmf="$PORT_MAP_FILE" ' - BEGIN { while ((getline line < pmf) > 0) { split(line, p, " "); portname[p[1]] = p[2] } } - NR > 1 && $3 == "no" { - mac = tolower($2) - port = $1 + 0 - if (port in portname) print mac, portname[port] - }' - done - rm -f "$PORT_MAP_FILE" -} - -# All IPv4 addresses owned by the router itself (any interface) — excluded -# from the NAT-based device detection below so the router never shows up. -LOCAL_IPS=$(ip -4 addr show 2>/dev/null | awk '/inet /{split($2,a,"/");print a[1]}' | tr '\n' ' ') - -# ── Single conntrack pass ────────────────────────────────────────────────── -# Emit "ip total tcp udp conns kind" for every active source in one read. -# A source qualifies when it belongs to a monitored subnet (kind l=LAN, -# r=routed), or — regardless of subnet — when the flow was SNAT/masqueraded -# by this router (reply dst != original src), which catches every forwarded -# client behind downstream routers without any configuration (kind r). -CT_SUMMARY=$(awk -v spec="$MATCH_SPEC" -v localips="$LOCAL_IPS" ' -function ip2int(ip, a) { - split(ip, a, ".") - return a[1]*16777216 + a[2]*65536 + a[3]*256 + a[4] -} -# Return the index of the LAN subnet that contains ip, or 0. -function lan_idx(ip, si, k) { - si = ip2int(ip) - for (k = 1; k <= ns; k++) - if (si - (si % blk[k]) == base[k]) return k - return 0 -} -BEGIN { - ns = split(spec, parts, " ") - for (k = 1; k <= ns; k++) { - split(parts[k], kv, ":") - base[k] = kv[1] + 0; blk[k] = kv[2] + 0; rtr[k] = kv[3] + 0 - } - nl = split(localips, lp, " ") - for (k = 1; k <= nl; k++) if (lp[k] != "") islocal[lp[k]] = 1 -} -{ - proto="" - for (i=1; i<=NF; i++) { - if ($i == "tcp") proto="tcp" - else if ($i == "udp") proto="udp" - } - # first src= field that belongs to one of our monitored subnets - srcidx=0; src=""; sk=0 - for (i=1; i<=NF; i++) { - if (index($i, "src=") == 1) { - v=substr($i, 5) - k=lan_idx(v) - if (k > 0) { src=v; srcidx=i; sk=k; break } - } - } - if (src != "") { - si=ip2int(src) - # skip the router itself, the network address and the broadcast address - # (routed /31 and /32 entries have no network/broadcast hosts to skip) - if (rtr[sk] && si == rtr[sk]) next - if (blk[sk] > 2 && (si == base[sk] || si == base[sk] + blk[sk] - 1)) next - if (rtr[sk]) knd = "l"; else knd = "r" - } else { - # No subnet matched. NAT fallback: if the reply-direction dst differs - # from the original src, this router SNAT/masqueraded the flow, so the - # original src is an internal client (e.g. behind a downstream router - # on a subnet we have no route entry for). - osrc=""; oidx=0; nsrc=0; rdst="" - for (i=1; i<=NF; i++) { - if (index($i, "src=") == 1) { - nsrc++ - if (nsrc == 1) { osrc=substr($i, 5); oidx=i } - } else if (nsrc == 2 && rdst == "" && index($i, "dst=") == 1) { - rdst=substr($i, 5) - } - } - if (osrc == "" || rdst == "" || rdst == osrc) next - if (osrc !~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) next - if (osrc in islocal) next - src=osrc; srcidx=oidx; knd="r" - } - seen=0; got_dst=0; found=0; b=0 - for (i=srcidx; i<=NF; i++) { - if (i == srcidx) { seen=1; continue } - if (seen && !got_dst && index($i, "dst=") == 1) { - dst=substr($i, 5) - if (dst != src) { got_dst=1 } else next - } - if (seen && got_dst && index($i, "bytes=") == 1) { - b=substr($i, 7) + 0; found=1; break - } - } - if (got_dst) { - conns[src]++ - kind[src] = knd - if (found) { - total[src]+=b - if (proto == "tcp") tcp[src]+=b - else if (proto == "udp") udp[src]+=b - } - } -} -END { - for (ip in conns) - printf "%s %.0f %.0f %.0f %d %s\n", ip, total[ip]+0, tcp[ip]+0, udp[ip]+0, conns[ip], kind[ip] -}' /proc/net/nf_conntrack 2>/dev/null) - -ACTIVE_IPS=$(echo "$CT_SUMMARY" | awk 'NF{print $1}' | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n) -[ -z "$ACTIVE_IPS" ] && { echo '[]'; exit 0; } - -# ── Prefetch all shared state once ───────────────────────────────────────── -NOW=$(date +%s) -LEASES=$(cat /tmp/dhcp.leases 2>/dev/null) -NEIGH=$(ip neigh show 2>/dev/null) - -# Manual aliases (highest precedence) and the reverse-DNS name cache. Devices -# behind a downstream router have no lease here, so these two are the only way -# they get a name instead of "*". -ALIASES=$(cat /etc/trafficctl/names 2>/dev/null) -RDNS_CACHE_FILE="/tmp/trafficctl_rdns_cache" -RDNS_CACHE=$(cat "$RDNS_CACHE_FILE" 2>/dev/null) -RDNS_ENABLED=$(uci -q get trafficctl.main.resolve_names 2>/dev/null) -RDNS_TTL=$(uci -q get trafficctl.main.rdns_ttl 2>/dev/null) -[ "$RDNS_TTL" -gt 0 ] 2>/dev/null || RDNS_TTL=300 -# IPs needing a (re)lookup, filled in during the emit loop and handed to the -# detached refresher at the end so this poll never blocks on DNS. -RDNS_PENDING="" - -# Optional netifyd (DPI) application labels. Absent unless the agent is -# installed and running — the column simply stays empty otherwise. -NETIFY_CACHE_FILE="/tmp/trafficctl_netify.json" -NETIFY_APPS="" -if [ "$(uci -q get trafficctl.main.netify_enabled 2>/dev/null)" != "0" ] && [ -S "$(uci -q get trafficctl.main.netify_socket 2>/dev/null || echo /var/run/netifyd/netifyd.sock)" ]; then - # Flatten "ip top-app" pairs once so the per-device lookup stays a - # string match instead of a JSON parse per row. - NETIFY_APPS=$(sed 's/},{/}\n{/g' "$NETIFY_CACHE_FILE" 2>/dev/null | \ - sed -n 's/.*"ip":"\([^"]*\)","top":"\([^"]*\)".*/\1 \2/p') - NETIFY_AGE=$(( NOW - $(date -r "$NETIFY_CACHE_FILE" +%s 2>/dev/null || echo 0) )) - NETIFY_INTERVAL=$(uci -q get trafficctl.main.netify_interval 2>/dev/null) - [ "$NETIFY_INTERVAL" -gt 0 ] 2>/dev/null || NETIFY_INTERVAL=45 - if [ "$NETIFY_AGE" -ge "$NETIFY_INTERVAL" ]; then - /usr/local/bin/trafficctl-netify.sh collect >/dev/null 2>&1 & - fi -fi - -# Firewall dumps (IP-independent — fetched once, grepped per device below) -if [ "$TCTL_FW" = "nft" ]; then - FWD_DUMP=$(nft list chain inet fw4 forward 2>/dev/null) - RL_DUMP=$(nft list table netdev tm_ratelimit 2>/dev/null) -else - FWD_DUMP=$(iptables -L FORWARD -nvx 2>/dev/null) - RL_DUMP=$(iptables -t mangle -L FORWARD -nv 2>/dev/null) -fi - -# tc HTB classes → "classid rate_kbit" maps (one tc call per device, parsed -# once): download on the LAN device, upload on the IFB. -TC_MAP=$(tctl_tc_class_rates "$PRIMARY_LAN_DEV") -TC_MAP_UP=$(tctl_tc_class_rates "$(tctl_shape_ifb_dev)") - -# address → classid, from shapes.json (see tctl_shape_classmap). -SHAPE_MAP=$(tctl_shape_classmap) - -# Wifi ACL state, split by policy, because "listed" means opposite things in the -# two modes: on a deny (blacklist) radio a listed MAC is blocked, on an allow -# (whitelist) radio a listed MAC is the only kind permitted. Collected once here -# and matched fork-free per device below. -WIFI_DENY_MACS="" -WIFI_ALLOW_MACS="" -WIFI_HAS_ALLOW=0 -for _wif in $(tctl_get_wifi_interfaces); do - _wlist=$(uci -q get "wireless.${_wif}.maclist" 2>/dev/null) - if [ "$(tctl_get_wifi_filter_mode "$_wif")" = "allow" ]; then - WIFI_HAS_ALLOW=1 - WIFI_ALLOW_MACS="$WIFI_ALLOW_MACS $_wlist" - else - WIFI_DENY_MACS="$WIFI_DENY_MACS $_wlist" - fi -done -WIFI_DENY_MACS=" $(echo "$WIFI_DENY_MACS" | tr 'A-F' 'a-f') " -WIFI_ALLOW_MACS=" $(echo "$WIFI_ALLOW_MACS" | tr 'A-F' 'a-f') " - -WIFI_STATIONS=$(get_wifi_stations) -BRIDGE_MACS=$(get_bridge_macs) - -# ── Per-device helpers (operate on prefetched blobs, no new forks of nft/tc) ─ -# Name precedence: manual alias > DHCP lease > cached reverse DNS. -lookup_name() { - local ip="$1" name - name=$(echo "$ALIASES" | awk -v ip="$ip" '$1 == ip {sub(/^[^ ]+ +/, ""); print; exit}') - [ -n "$name" ] && { echo "$name"; return; } - name=$(echo "$LEASES" | awk -v ip="$ip" '$3 == ip && $4 != "*" {print $4; exit}') - [ -n "$name" ] && { echo "$name"; return; } - [ "$RDNS_ENABLED" = "0" ] && return - echo "$RDNS_CACHE" | awk -v ip="$ip" '$1 == ip && $2 != "-" {print $2; exit}' -} - -lookup_app() { - [ -z "$NETIFY_APPS" ] && return - echo "$NETIFY_APPS" | awk -v ip="$1" '$1 == ip {print $2; exit}' -} - -# True when the cache holds no fresh entry for this IP (hit or negative), so -# the caller should queue a background lookup. -rdns_stale() { - local ip="$1" ts - [ "$RDNS_ENABLED" = "0" ] && return 1 - ts=$(echo "$RDNS_CACHE" | awk -v ip="$ip" '$1 == ip {print $3; exit}') - [ -z "$ts" ] && return 0 - [ $(( NOW - ts )) -ge "$RDNS_TTL" ] -} - -lookup_mac() { - local ip="$1" mac - mac=$(echo "$LEASES" | awk -v ip="$ip" '$3 == ip {print $2; exit}') - [ -z "$mac" ] && mac=$(echo "$NEIGH" | awk -v ip="$ip" '$1 == ip {for(i=1;i<=NF;i++)if($i=="lladdr"){print $(i+1);exit}}') - echo "$mac" | tr 'A-F' 'a-f' -} - -# Addresses are matched as whole fields throughout: an unanchored match reports -# 192.168.1.10's block as belonging to 192.168.1.1. -lookup_blocked() { - local ip="$1" - if [ "$TCTL_FW" = "nft" ]; then - echo "$FWD_DUMP" | grep -q "ip saddr $ip .*drop" && { echo 1; return; } - # The IPv6 half of a block matches a MAC and carries no address, so it - # is found by its own full comment. Without this the table reports "not - # blocked" for a device whose v6 rule is the only one left standing. - echo "$FWD_DUMP" | grep -qF "comment \"$(tctl_block_comment "$ip")_mac\"" \ - && echo 1 || echo 0 - else - echo "$FWD_DUMP" | awk -v ip="$ip" ' - $3 == "DROP" { - for (i = 4; i <= NF; i++) { - src = $i - sub(/\/32$/, "", src) - if (src == ip) { found = 1; exit } - } - } - END { print (found ? 1 : 0) }' - fi -} - -lookup_block_bytes() { - local ip="$1" b - if [ "$TCTL_FW" = "nft" ]; then - # Both halves of the block, summed: the v4 rule keyed on the address - # and the v6 rule keyed on the MAC. Counting only the first would make - # a dual-stack device's dropped bytes read low for the same reason the - # traffic used to escape entirely. - b=$(echo "$FWD_DUMP" | grep -e "ip saddr $ip " \ - -e "comment \"$(tctl_block_comment "$ip")_mac\"" \ - | grep -oE 'bytes [0-9]+' | awk '{ t += $2 } END { printf "%.0f", t }') - else - b=$(echo "$FWD_DUMP" | awk -v ip="$ip" ' - $3 == "DROP" { - for (i = 4; i <= NF; i++) { - src = $i - sub(/\/32$/, "", src) - if (src == ip) { print $2; exit } - } - }' | head -1) - fi - echo "${b:-0}" -} - -# $2 "up" reads the upload ceiling instead of the download one. -lookup_rate_limit() { - local ip="$1" r fld=daddr pat='rl_ratelimit' - [ "$2" = "up" ] && { fld=saddr; pat='rl_ratelimit.*_ul'; } - if [ "$TCTL_FW" = "nft" ]; then - r=$(echo "$RL_DUMP" | tctl_rl_rate_kbit "$ip" "$fld") - else - # The address as a whole field, not a substring (see tctl_rl_rate_kbit). - # The download rule is listed first, so it is the first match either - # way; the upload one is the only "_ul" name. - r=$(echo "$RL_DUMP" | grep -E "$pat" \ - | awk -v ip="$ip" '{ for (i = 1; i <= NF; i++) if ($i == ip || $i == ip "/32") { print; next } }' \ - | awk "$TCTL_NFT_RATE_AWK"'{ r = tctl_ipt_first_rate(); if (r >= 0) { print r; exit } }') - fi - echo "${r:-0}" -} - -# The classid is looked up, never derived from the address: minors are -# allocated, so deriving put the first shaped device's rate on 192.168.x.2 and -# showed 0 for the device actually shaped — and the Telegram bot built its -# "Shape — Remove" button from this field. -# -# $2 "up" reads the upload class on the IFB. 0 there with a download shape set -# means upload is not shaped at all (no kmod-ifb), not that it matches. -lookup_shape_kbit() { - local ip="$1" classid r map="$TC_MAP" - [ "$2" = "up" ] && map="$TC_MAP_UP" - classid=$(echo "$SHAPE_MAP" | awk -v ip="$ip" '$1==ip{print $2; exit}') - [ -n "$classid" ] || { echo 0; return; } - r=$(echo "$map" | awk -v c="$classid" '$1==c{print $2; exit}') - echo "${r:-0}" -} - -lookup_wifi_blocked() { - local mac="$1" - [ -z "$mac" ] && { echo 0; return; } - # Listed on a deny radio -> blocked there. - case "$WIFI_DENY_MACS" in *" $mac "*) echo 1; return ;; esac - # Absent from a whitelist radio -> cannot associate there, so also blocked. - if [ "$WIFI_HAS_ALLOW" = "1" ]; then - case "$WIFI_ALLOW_MACS" in - *" $mac "*) ;; - *) echo 1; return ;; - esac - fi - echo 0 -} - -# ── Emit JSON ────────────────────────────────────────────────────────────── -printf "[" -FIRST=1 -for ip in $ACTIVE_IPS; do - # shellcheck disable=SC2046 # deliberate split into 5 positional fields - set -- $(echo "$CT_SUMMARY" | awk -v ip="$ip" '$1==ip{print $2,$3,$4,$5,$6; exit}') - TOTAL="${1:-0}"; TCP="${2:-0}"; UDP="${3:-0}"; CONNS="${4:-0}"; KIND="${5:-l}" - - NAME=$(lookup_name "$ip") - MAC=$(lookup_mac "$ip") - BLOCKED=$(lookup_blocked "$ip") - BLOCK_BYTES=$(lookup_block_bytes "$ip") - WIFI_BLK=$(lookup_wifi_blocked "$MAC") - RATE_LIM=$(lookup_rate_limit "$ip") - RATE_LIM_UP=$(lookup_rate_limit "$ip" up) - SHAPE=$(lookup_shape_kbit "$ip") - SHAPE_UP=$(lookup_shape_kbit "$ip" up) - APP=$(lookup_app "$ip") - if [ -z "$NAME" ]; then - NAME="*" - rdns_stale "$ip" && RDNS_PENDING="$RDNS_PENDING $ip" - fi - # A DHCP hostname is client-controlled: a quote or backslash in it would - # break this JSON document for every consumer (the LuCI table, the bot, - # the exporter). Keep only characters that are safe unquoted. - NAME=$(printf '%s' "$NAME" | tr -d '"\\' | tr -d '\n\r\t') - - CONN_TYPE="" - CONN_LAST="" - if [ "$KIND" = "r" ]; then - # Behind a downstream router — no local MAC / bridge port / ARP entry. - CONN_TYPE="routed" - else - if [ -n "$MAC" ]; then - _wl=$(echo "$WIFI_STATIONS" | grep -i "$MAC") - if [ -n "$_wl" ]; then - _band=$(echo "$_wl" | awk '{print $3}') - CONN_TYPE="${_band:-wifi}" - else - _bl=$(echo "$BRIDGE_MACS" | grep -i "$MAC") - if [ -n "$_bl" ]; then - _piface=$(echo "$_bl" | awk '{print $2}') - case "$_piface" in - phy*|wlan*) CONN_TYPE="wifi" ;; - *) CONN_TYPE="$_piface" ;; - esac - fi - fi - fi - if [ -n "$CONN_TYPE" ]; then - sed -i "/^$ip /d" "$CONN_CACHE" 2>/dev/null - echo "$ip $CONN_TYPE $NOW" >> "$CONN_CACHE" - else - _arp_state=$(echo "$NEIGH" | awk -v ip="$ip" '$1==ip{print $NF; exit}') - case "$_arp_state" in - REACHABLE|STALE|DELAY|PROBE) CONN_TYPE="ethernet" ;; - *) - CONN_TYPE="?" - _cached=$(grep "^$ip " "$CONN_CACHE" 2>/dev/null | tail -1) - if [ -n "$_cached" ]; then - CONN_LAST=$(echo "$_cached" | awk '{print $2 "@" $3}') - fi - ;; - esac - fi - fi - - # Needs CONN_TYPE, so it is decided here rather than next to WIFI_BLK. - WIFI_PENDING=0 - tctl_wifi_block_pending "$WIFI_BLK" "$CONN_TYPE" && WIFI_PENDING=1 - - if [ "$FIRST" = "1" ]; then - FIRST=0 - else - printf "," - fi - printf '{"ip":"%s","name":"%s","mac":"%s","conn_type":"%s","conn_last":"%s","app":"%s","conns":%d,"total":%.0f,"tcp":%.0f,"udp":%.0f,"blocked":%s,"block_bytes":%.0f,"wifi_blocked":%s,"wifi_block_pending":%s,"rate_limit_kbit":%.0f,"rate_limit_kbit_up":%.0f,"shape_kbit":%.0f,"shape_kbit_up":%.0f}' \ - "$ip" "$NAME" "$MAC" "$CONN_TYPE" "$CONN_LAST" "$APP" "$CONNS" "$TOTAL" "$TCP" "$UDP" \ - "$([ "$BLOCKED" = "1" ] && echo true || echo false)" \ - "$BLOCK_BYTES" \ - "$([ "$WIFI_BLK" = "1" ] && echo true || echo false)" \ - "$([ "$WIFI_PENDING" = "1" ] && echo true || echo false)" \ - "$RATE_LIM" "$RATE_LIM_UP" "$SHAPE" "$SHAPE_UP" -done -printf "]\n" - -# Kick off name resolution for whatever is still unnamed. Detached and capped: -# the results land in the cache and show up on the next poll. -if [ -n "$RDNS_PENDING" ]; then - # shellcheck disable=SC2086 # deliberate word-splitting into arguments - set -- $RDNS_PENDING - [ $# -gt 8 ] && shift $(( $# - 8 )) - /usr/local/bin/trafficctl-rdns-refresh.sh "$@" >/dev/null 2>&1 & -fi diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-telegram-test.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-telegram-test.sh deleted file mode 100755 index 0ad61af7a..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-telegram-test.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Test Telegram bot connection by sending a test message. -# Usage: trafficctl-telegram-test.sh [message] -# TCTL_TG_TOKEN= trafficctl-telegram-test.sh - [message] -# -# Prefer the environment form: an argument is visible in ps to every local user. - -CHAT_ID="$2" -CUSTOM_MSG="$3" -if [ -n "$TCTL_TG_TOKEN" ]; then - TOKEN="$TCTL_TG_TOKEN" -else - TOKEN="$1" -fi - -if [ -z "$TOKEN" ] || [ -z "$CHAT_ID" ]; then - echo '{"ok":false,"msg":"token and chat_id required"}' - exit 0 -fi - -echo "$CHAT_ID" | grep -qE '^-?[0-9]+$' || { - echo '{"ok":false,"msg":"chat_id must be numeric"}' - exit 0 -} - -echo "$TOKEN" | grep -qE '^[0-9]+:[A-Za-z0-9_-]+$' || { - echo '{"ok":false,"msg":"invalid token format"}' - exit 0 -} - -_fill_template() { - ROUTER=$(uci -q get system.@system[0].hostname 2>/dev/null || echo "OpenWrt") - DATE_NOW=$(date '+%Y-%m-%d') - TIME_NOW=$(date '+%H:%M') - _SEC=$(cut -d. -f1 /proc/uptime 2>/dev/null || echo "0") - UPTIME_STR="$((_SEC / 86400))d $(((_SEC % 86400) / 3600))h" - LOAD=$(cut -d' ' -f1 /proc/loadavg 2>/dev/null || echo "0.00") - WAN_IP=$(ubus call network.interface.wan status 2>/dev/null | jsonfilter -e '@.ipv4-address[0].address' 2>/dev/null) - [ -z "$WAN_IP" ] && WAN_IP=$(ip route get 1.1.1.1 2>/dev/null | grep -o 'src [0-9.]*' | cut -d' ' -f2) - [ -z "$WAN_IP" ] && WAN_IP="unknown" - SSID=$(uci -q get wireless.@wifi-iface[0].ssid 2>/dev/null || echo "WiFi") - - sed \ - -e "s|{{ *name *}}|TestDevice|g" \ - -e "s|{{ *ip *}}|192.168.0.100|g" \ - -e "s|{{ *mac *}}|aa:bb:cc:dd:ee:ff|g" \ - -e "s|{{ *link *}}|5G|g" \ - -e "s|{{ *router *}}|$ROUTER|g" \ - -e "s|{{ *date *}}|$DATE_NOW|g" \ - -e "s|{{ *time *}}|$TIME_NOW|g" \ - -e "s|{{ *datetime *}}|$DATE_NOW $TIME_NOW|g" \ - -e "s|{{ *ssid *}}|$SSID|g" \ - -e "s|{{ *signal *}}|-52|g" \ - -e "s|{{ *freq *}}|5GHz|g" \ - -e "s|{{ *iface *}}|wlan1|g" \ - -e "s|{{ *clients *}}|12|g" \ - -e "s|{{ *uptime *}}|$UPTIME_STR|g" \ - -e "s|{{ *wan_ip *}}|$WAN_IP|g" \ - -e "s|{{ *load *}}|$LOAD|g" \ - -e "s|{{ *conns *}}|5|g" -} - -_json_encode() { - # Escape backslashes, quotes, then fold real newlines back to \n for JSON - printf '%s' "$1" \ - | sed 's/\\/\\\\/g; s/"/\\"/g' \ - | awk 'NR==1{printf "%s",$0} NR>1{printf "\\n%s",$0} END{printf ""}' -} - -if [ -n "$CUSTOM_MSG" ]; then - # Convert literal \n escape sequences, then fill template variables - MSG=$(printf '%s' "$CUSTOM_MSG" | sed 's/\\n/\n/g' | _fill_template) -else - ROUTER=$(uci -q get system.@system[0].hostname 2>/dev/null || echo "OpenWrt") - MSG=$(printf '✅ TrafficCtl bot connected from %s' "$ROUTER") -fi - -MSG_JSON=$(_json_encode "$MSG") - -# The URL carries the bot token, so it goes through a curl config file on stdin -# rather than argv, which is world-readable via ps and /proc. -RESULT=$(printf 'url = "https://api.telegram.org/bot%s/sendMessage"\n' "$TOKEN" | \ - curl -s -m 10 -X POST \ - -H "Content-Type: application/json" \ - -d "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${MSG_JSON}\",\"parse_mode\":\"HTML\"}" \ - --config - 2>/dev/null) - -if echo "$RESULT" | jsonfilter -e '@.ok' 2>/dev/null | grep -q "true"; then - echo '{"ok":true,"msg":"test message sent"}' -else - ERR=$(echo "$RESULT" | jsonfilter -e '@.description' 2>/dev/null) - printf '{"ok":false,"msg":"API error: %s"}\n' "${ERR:-unknown}" -fi diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-telegram.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-telegram.sh deleted file mode 100755 index 6ea08c877..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-telegram.sh +++ /dev/null @@ -1,814 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Telegram bot daemon for trafficctl. -# Runs under procd. Uses curl + jsonfilter to talk to Telegram Bot API. -# Only responds to the authorized chat_id configured in UCI. - -. /lib/functions.sh - -SCRIPTS="/usr/local/bin" -KNOWN_FILE="/etc/trafficctl/telegram_known.json" -OFFSET_FILE="/tmp/trafficctl_tg_offset" -CACHE_FILE="/tmp/trafficctl_tg_devices.json" -CACHE_TTL=5 -# How often to scan for new devices. discover_macs forks ip/iw/awk, so running -# it on every short poll loop wastes CPU continuously; 30s is plenty for a -# "new device joined" alert. Real-time joins still arrive via DHCP hotplug -# triggers (process_dhcp_triggers), which stay on every loop. -NEWDEV_INTERVAL=30 - -TG_ENABLED=0 -TG_TOKEN="" -TG_CHAT_ID="" -TG_POLL=3 -TG_NOTIFY_NEW=1 -TG_NOTIFY_KNOWN=0 -TG_CONTROL=1 -TG_NOTIFY_TEMPLATE="" -TG_BTN_INET=1 -TG_BTN_WIFI=1 -TG_BTN_LIMIT=1 -TG_BTN_SHAPE=1 - -# ── config ────────────────────────────────────────────────────────────────── - -load_config() { - config_load trafficctl - config_get TG_ENABLED telegram enabled 0 - config_get TG_TOKEN telegram bot_token "" - config_get TG_CHAT_ID telegram chat_id "" - config_get TG_POLL telegram poll_interval 3 - config_get TG_NOTIFY_NEW telegram notify_new_device 1 - config_get TG_NOTIFY_KNOWN telegram notify_known_device 0 - config_get TG_CONTROL telegram control_enabled 1 - config_get TG_NOTIFY_TEMPLATE telegram notify_template "" - config_get TG_BTN_INET telegram btn_block_inet 1 - config_get TG_BTN_WIFI telegram btn_block_wifi 1 - config_get TG_BTN_LIMIT telegram btn_limiter 1 - config_get TG_BTN_SHAPE telegram btn_shaper 1 - [ "$TG_POLL" -ge 2 ] 2>/dev/null || TG_POLL=3 -} - -validate_config() { - if [ "$TG_ENABLED" != "1" ]; then - logger -t trafficctl-tg "Telegram bot disabled" - exit 0 - fi - if [ -z "$TG_TOKEN" ] || [ -z "$TG_CHAT_ID" ]; then - logger -t trafficctl-tg "Missing bot_token or chat_id" - exit 1 - fi -} - -# ── telegram API ──────────────────────────────────────────────────────────── - -# The URL carries the bot token, so it is fed through a curl config file on stdin -# instead of argv — a command line is world-readable via ps and /proc. -tg_api() { - local method="$1" body="$2" - printf 'url = "https://api.telegram.org/bot%s/%s"\n' "$TG_TOKEN" "$method" | \ - curl -s -m 30 -X POST \ - -H "Content-Type: application/json" \ - -d "$body" \ - --config - 2>/dev/null -} - -# Escape a string for embedding in a JSON body: backslashes, quotes, tabs, -# and real newlines (raw newlines are invalid inside JSON strings and make -# Telegram reject the whole request with a 400). -tg_json_escape() { - printf '%s' "$1" | sed 's/\\/\\\\/g;s/"/\\"/g;s/ /\\t/g' | \ - awk 'NR==1{printf "%s",$0} NR>1{printf "\\n%s",$0}' -} - -tg_send() { - local text="$1" markup="$2" - local body - text=$(tg_json_escape "$text") - if [ -n "$markup" ]; then - body=$(printf '{"chat_id":"%s","text":"%s","parse_mode":"HTML","reply_markup":%s}' \ - "$TG_CHAT_ID" "$text" "$markup") - else - body=$(printf '{"chat_id":"%s","text":"%s","parse_mode":"HTML"}' \ - "$TG_CHAT_ID" "$text") - fi - tg_api "sendMessage" "$body" >/dev/null -} - -tg_answer_cb() { - local cb_id="$1" text="$2" - # The Bot API caps a callback toast at 200 characters and rejects the whole - # call when it is longer — so an over-long message does not get trimmed, it - # vanishes. Backend results carrying remediation advice can reach that - # length, and a silently missing answer is exactly the failure mode this - # plugin is being fixed for. - if [ "${#text}" -gt 200 ]; then - text="$(printf '%.196s' "$text")..." - fi - text=$(tg_json_escape "$text") - tg_api "answerCallbackQuery" \ - "$(printf '{"callback_query_id":"%s","text":"%s"}' "$cb_id" "$text")" >/dev/null -} - -tg_edit_msg() { - local msg_id="$1" text="$2" markup="$3" - text=$(tg_json_escape "$text") - local body - if [ -n "$markup" ]; then - body=$(printf '{"chat_id":"%s","message_id":%s,"text":"%s","parse_mode":"HTML","reply_markup":%s}' \ - "$TG_CHAT_ID" "$msg_id" "$text" "$markup") - else - body=$(printf '{"chat_id":"%s","message_id":%s,"text":"%s","parse_mode":"HTML"}' \ - "$TG_CHAT_ID" "$msg_id" "$text") - fi - tg_api "editMessageText" "$body" >/dev/null -} - -# ── device helpers ────────────────────────────────────────────────────────── - -get_devices() { - local now mtime age - now=$(date +%s) - if [ -f "$CACHE_FILE" ]; then - mtime=$(date -r "$CACHE_FILE" +%s 2>/dev/null || echo 0) - age=$((now - mtime)) - if [ "$age" -lt "$CACHE_TTL" ]; then - cat "$CACHE_FILE" - return - fi - fi - "$SCRIPTS/trafficctl-summary.sh" > "$CACHE_FILE" 2>/dev/null - cat "$CACHE_FILE" -} - -invalidate_cache() { rm -f "$CACHE_FILE"; } - -get_device_field() { - local json="$1" ip="$2" field="$3" - echo "$json" | jsonfilter -e "@[@.ip='$ip'].$field" 2>/dev/null -} - -# ── known devices ─────────────────────────────────────────────────────────── - -seed_known() { - local mac info name ip - for mac in $(discover_macs); do - [ -z "$mac" ] && continue - info=$(resolve_mac_info "$mac") - name=$(printf '%s' "$info" | cut -f1) - ip=$(printf '%s' "$info" | cut -f2) - add_known_mac "$mac" "${name:-unknown}" "${ip:-?}" - done - logger -t trafficctl-tg "Seeded known devices from current state" -} - -load_known() { - if [ ! -f "$KNOWN_FILE" ] || [ "$(cat "$KNOWN_FILE" 2>/dev/null)" = "[]" ]; then - mkdir -p "$(dirname "$KNOWN_FILE")" - [ -f "$KNOWN_FILE" ] || echo '[]' > "$KNOWN_FILE" - seed_known - fi -} - -lock_known() { while ! mkdir /tmp/.trafficctl_known.lock 2>/dev/null; do sleep 0.1; done; } -unlock_known() { rmdir /tmp/.trafficctl_known.lock 2>/dev/null; } - -is_known_mac() { - grep -q "\"$1\"" "$KNOWN_FILE" 2>/dev/null -} - -add_known_mac() { - local mac="$1" name="$2" ip="$3" - local now - now=$(date +%s) - # Sanitize inputs: strip anything that could break JSON or sed - mac=$(printf '%s' "$mac" | tr -cd 'a-fA-F0-9:') - name=$(printf '%s' "$name" | tr -cd 'a-zA-Z0-9 _.-') - ip=$(printf '%s' "$ip" | tr -cd '0-9.') - local tmp="${KNOWN_FILE}.tmp" - local entry - entry=$(printf '{"mac":"%s","name":"%s","ip":"%s","first_seen":%d}' \ - "$mac" "$name" "$ip" "$now") - lock_known - if [ "$(cat "$KNOWN_FILE" 2>/dev/null)" = "[]" ]; then - printf '[%s]' "$entry" > "$tmp" - else - awk -v e="$entry" '{sub(/\]$/,","e"]")}1' "$KNOWN_FILE" > "$tmp" - fi - mv "$tmp" "$KNOWN_FILE" - unlock_known -} - -discover_macs() { - local seen_file="/tmp/trafficctl_tg_seen.tmp" - : > "$seen_file" - - # Source 1: ARP table (covers any device that communicated at L2) - ip neigh show 2>/dev/null | awk '/lladdr/ {print tolower($5)}' >> "$seen_file" - - # Source 2: DHCP leases (covers any device that requested an IP) - if [ -f /tmp/dhcp.leases ]; then - awk '{print tolower($2)}' /tmp/dhcp.leases >> "$seen_file" - fi - - # Source 3: Wi-Fi associated stations (covers connected Wi-Fi clients even without traffic) - for iface in $(iw dev 2>/dev/null | awk '/Interface/{print $2}'); do - iw dev "$iface" station dump 2>/dev/null | awk '/Station/{print tolower($2)}' - done >> "$seen_file" - - # Deduplicate, filter valid MACs - sort -u "$seen_file" | grep -E '^([0-9a-f]{2}:){5}[0-9a-f]{2}$' - rm -f "$seen_file" -} - -resolve_mac_info() { - local mac="$1" name="" ip="" conn_type="?" - - # Try DHCP leases first - if [ -f /tmp/dhcp.leases ]; then - ip=$(awk -v m="$mac" 'tolower($2)==m {print $3; exit}' /tmp/dhcp.leases) - name=$(awk -v m="$mac" 'tolower($2)==m {print $4; exit}' /tmp/dhcp.leases) - fi - - # Fallback: ARP for IP - if [ -z "$ip" ]; then - ip=$(ip neigh show 2>/dev/null | awk -v m="$mac" 'tolower($5)==m {print $1; exit}') - fi - - # Determine connection type - for iface in $(iw dev 2>/dev/null | awk '/Interface/{print $2}'); do - if iw dev "$iface" station get "$mac" >/dev/null 2>&1; then - conn_type="wifi" - break - fi - done - if [ "$conn_type" = "?" ] && [ -n "$ip" ]; then - conn_type="ethernet" - fi - - [ -z "$name" ] || [ "$name" = "*" ] && name="unknown" - printf '%s\t%s\t%s' "${name}" "${ip:-?}" "${conn_type}" -} - -ONLINE_STATE_FILE="/tmp/trafficctl_tg_online" -DHCP_TRIGGER_FILE="/tmp/trafficctl_tg_newdev" - -get_wifi_info() { - local mac="$1" iw_out="" iface="" cand="" ssid="" signal="" freq="" - # Iterate all wireless interfaces via iw (covers phy0-ap0 style names, - # not just wlan*). - for cand in $(iw dev 2>/dev/null | awk '/Interface/{print $2}'); do - iw_out=$(iw dev "$cand" station get "$mac" 2>/dev/null) - if [ -n "$iw_out" ]; then - iface="$cand" - break - fi - done - if [ -n "$iw_out" ]; then - signal=$(echo "$iw_out" | awk '/signal:/{print $2; exit}') - # channel line: "channel 36 (5180 MHz), width: 80 MHz, ..." — find the - # first field that parses to a plausible frequency in MHz (the channel - # number itself is < 2400, so it never matches) - freq=$(iw dev "$iface" info 2>/dev/null | \ - awk '/channel/{ - for (i = 2; i <= NF; i++) { - v = $i; gsub(/[^0-9]/, "", v) - if (v + 0 >= 2400 && v + 0 <= 7200) { f = v + 0; break } - } - if (f >= 5925) print "6GHz" - else if (f >= 5000) print "5GHz" - else if (f > 0) print "2.4GHz" - exit - }') - ssid=$(iw dev "$iface" info 2>/dev/null | awk '/ssid/{print $2; exit}') - fi - printf '%s\t%s\t%s\t%s' "$iface" "$ssid" "$signal" "$freq" -} - -get_device_conns() { - local ip="$1" n - # grep -c prints 0 itself on no match (with exit status 1), so an - # "|| echo 0" here would emit a second line and corrupt the value. - n=$(grep -c "src=$ip " /proc/net/nf_conntrack 2>/dev/null) - echo "${n:-0}" -} - -get_router_vars() { - local uptime_s up_d up_h up_m __ip - uptime_s=$(awk '{print int($1)}' /proc/uptime) - up_d=$((uptime_s / 86400)) - up_h=$(( (uptime_s % 86400) / 3600 )) - up_m=$(( (uptime_s % 3600) / 60 )) - if [ "$up_d" -gt 0 ]; then - TVAR_UPTIME="${up_d}d ${up_h}h" - elif [ "$up_h" -gt 0 ]; then - TVAR_UPTIME="${up_h}h ${up_m}m" - else - TVAR_UPTIME="${up_m}m" - fi - TVAR_DATE=$(date '+%Y-%m-%d') - TVAR_TIME=$(date '+%H:%M') - TVAR_DATETIME=$(date '+%Y-%m-%d %H:%M') - TVAR_ROUTER=$(uci -q get system.@system[0].hostname || cat /proc/sys/kernel/hostname) - . /lib/functions/network.sh - network_get_ipaddr __ip wan - TVAR_WAN_IP="$__ip" - TVAR_LOAD=$(awk '{print $1}' /proc/loadavg) - TVAR_CLIENTS=$(wc -l < /tmp/dhcp.leases 2>/dev/null || echo 0) -} - -format_new_device_msg() { - local name="$1" ip="$2" mac="$3" link="$4" - if [ -n "$TG_NOTIFY_TEMPLATE" ]; then - get_router_vars - local wifi_info iface ssid signal freq conns - wifi_info=$(get_wifi_info "$mac") - iface=$(printf '%s' "$wifi_info" | cut -f1) - ssid=$(printf '%s' "$wifi_info" | cut -f2) - signal=$(printf '%s' "$wifi_info" | cut -f3) - freq=$(printf '%s' "$wifi_info" | cut -f4) - conns=$(get_device_conns "$ip") - - printf '%s' "$TG_NOTIFY_TEMPLATE" | \ - awk -v n="$name" -v i="$ip" -v m="$mac" -v l="$link" \ - -v dt="$TVAR_DATE" -v tm="$TVAR_TIME" -v dtm="$TVAR_DATETIME" \ - -v rtr="$TVAR_ROUTER" -v ssid="$ssid" -v sig="$signal" \ - -v freq="$freq" -v iface="$iface" -v clients="$TVAR_CLIENTS" \ - -v up="$TVAR_UPTIME" -v wan="$TVAR_WAN_IP" -v ld="$TVAR_LOAD" \ - -v conns="$conns" '{ - # [ \t]* instead of \s* — BusyBox awk has no \s class - gsub(/\{\{[ \t]*name[ \t]*\}\}/, n) - gsub(/\{\{[ \t]*ip[ \t]*\}\}/, i) - gsub(/\{\{[ \t]*mac[ \t]*\}\}/, m) - gsub(/\{\{[ \t]*link[ \t]*\}\}/, l) - gsub(/\{\{[ \t]*date[ \t]*\}\}/, dt) - gsub(/\{\{[ \t]*time[ \t]*\}\}/, tm) - gsub(/\{\{[ \t]*datetime[ \t]*\}\}/, dtm) - gsub(/\{\{[ \t]*router[ \t]*\}\}/, rtr) - gsub(/\{\{[ \t]*ssid[ \t]*\}\}/, ssid) - gsub(/\{\{[ \t]*signal[ \t]*\}\}/, sig) - gsub(/\{\{[ \t]*freq[ \t]*\}\}/, freq) - gsub(/\{\{[ \t]*iface[ \t]*\}\}/, iface) - gsub(/\{\{[ \t]*clients[ \t]*\}\}/, clients) - gsub(/\{\{[ \t]*uptime[ \t]*\}\}/, up) - gsub(/\{\{[ \t]*wan_ip[ \t]*\}\}/, wan) - gsub(/\{\{[ \t]*load[ \t]*\}\}/, ld) - gsub(/\{\{[ \t]*conns[ \t]*\}\}/, conns) - gsub(/\\n/, "\n") - print - }' - else - printf '🆕 New device\n%s (%s)\nMAC: %s\nLink: %s' \ - "$name" "$ip" "$mac" "$link" - fi -} - -process_dhcp_triggers() { - [ -f "$DHCP_TRIGGER_FILE" ] || return 0 - local tmpf="${DHCP_TRIGGER_FILE}.proc" - mv "$DHCP_TRIGGER_FILE" "$tmpf" 2>/dev/null || return 0 - - local mac ip name - while IFS=' ' read -r mac ip name; do - [ -z "$mac" ] && continue - mac=$(printf '%s' "$mac" | tr 'A-F' 'a-f') - if ! is_known_mac "$mac"; then - add_known_mac "$mac" "${name:-unknown}" "${ip:-?}" - if [ "$TG_NOTIFY_NEW" = "1" ]; then - tg_send "$(format_new_device_msg "${name:-unknown}" "${ip:-?}" "$mac" "dhcp")" - fi - fi - done < "$tmpf" - rm -f "$tmpf" -} - -check_new_devices() { - local mac info name ip conn_type - local current_macs="/tmp/trafficctl_tg_cur.tmp" - - discover_macs > "$current_macs" - - while read -r mac; do - [ -z "$mac" ] && continue - if ! is_known_mac "$mac"; then - info=$(resolve_mac_info "$mac") - name=$(printf '%s' "$info" | cut -f1) - ip=$(printf '%s' "$info" | cut -f2) - conn_type=$(printf '%s' "$info" | cut -f3) - add_known_mac "$mac" "${name:-unknown}" "${ip:-?}" - if [ "$TG_NOTIFY_NEW" = "1" ]; then - tg_send "$(format_new_device_msg "${name:-unknown}" "${ip:-?}" "$mac" "${conn_type:-?}")" - fi - elif [ "$TG_NOTIFY_KNOWN" = "1" ]; then - if [ -f "$ONLINE_STATE_FILE" ] && ! grep -q "$mac" "$ONLINE_STATE_FILE" 2>/dev/null; then - info=$(resolve_mac_info "$mac") - name=$(printf '%s' "$info" | cut -f1) - ip=$(printf '%s' "$info" | cut -f2) - conn_type=$(printf '%s' "$info" | cut -f3) - tg_send "$(printf '📱 Device online\n%s (%s)\nLink: %s' \ - "${name:-unknown}" "${ip:-?}" "${conn_type:-?}")" - fi - fi - done < "$current_macs" - - mv "$current_macs" "$ONLINE_STATE_FILE" -} - -# ── keyboard builders ─────────────────────────────────────────────────────── - -build_device_keyboard() { - local devices="$1" - local tmpkb="/tmp/trafficctl_tg_kb.tmp" - local ip name btn col=0 first=1 - - printf '{"inline_keyboard":[' > "$tmpkb" - - for ip in $(echo "$devices" | jsonfilter -e '@[*].ip' 2>/dev/null); do - name=$(echo "$devices" | jsonfilter -e "@[@.ip='$ip'].name" 2>/dev/null) - # Keep button labels JSON-safe: drop quotes/backslashes and anything - # non-ASCII, then truncate. A %.12s cut through a multi-byte character - # would produce invalid UTF-8 and Telegram would reject the keyboard. - name=$(printf '%s' "$name" | tr -cd 'a-zA-Z0-9 _.()-') - btn=$(printf '{"text":"%.12s %s","callback_data":"act:menu:%s"}' \ - "${name:-$ip}" "$ip" "$ip") - if [ "$col" -eq 0 ]; then - if [ "$first" -eq 1 ]; then - first=0 - else - printf '],' >> "$tmpkb" - fi - printf '[%s' "$btn" >> "$tmpkb" - col=1 - else - printf ',%s' "$btn" >> "$tmpkb" - col=0 - fi - done - - printf ']]}' >> "$tmpkb" - cat "$tmpkb" - rm -f "$tmpkb" -} - -# A ceiling as "8000 kbit/s", or "8000↓ / 2000↑ kbit/s" when upload has its -# own (#66). An upload figure of 0 or equal to download is not a split. -tg_ceiling() { - if [ "${2:-0}" -gt 0 ] 2>/dev/null && [ "$2" != "$1" ]; then - printf '%s↓ / %s↑ kbit/s' "$1" "$2" - else - printf '%s kbit/s' "$1" - fi -} - -# The same, compact, for the /status flags: "8000k" or "8000/2000k". -tg_ceiling_short() { - if [ "${2:-0}" -gt 0 ] 2>/dev/null && [ "$2" != "$1" ]; then - printf '%s/%sk' "$1" "$2" - else - printf '%sk' "$1" - fi -} - -build_action_keyboard() { - local ip="$1" devices="$2" - local blocked wifi_blocked rl_kbit shape_kbit rl_up shape_up - blocked=$(get_device_field "$devices" "$ip" "blocked") - wifi_blocked=$(get_device_field "$devices" "$ip" "wifi_blocked") - rl_kbit=$(get_device_field "$devices" "$ip" "rate_limit_kbit") - shape_kbit=$(get_device_field "$devices" "$ip" "shape_kbit") - rl_up=$(get_device_field "$devices" "$ip" "rate_limit_kbit_up") - shape_up=$(get_device_field "$devices" "$ip" "shape_kbit_up") - conn_type=$(get_device_field "$devices" "$ip" "conn_type") - - local kb='{"inline_keyboard":[' - local rows="" - - # internet block/unblock - if [ "$TG_BTN_INET" = "1" ]; then - if [ "$blocked" = "true" ] || [ "$blocked" = "1" ]; then - rows="${rows}[{\"text\":\"▶️ Unblock Internet\",\"callback_data\":\"act:unblock:${ip}\"}]," - else - rows="${rows}[{\"text\":\"⏸ Block Internet\",\"callback_data\":\"act:block:${ip}\"}]," - fi - fi - - # wifi block/unblock (only for wifi devices) - if [ "$TG_BTN_WIFI" = "1" ]; then - case "$conn_type" in - *wifi*|*2.4G*|*5G*|*6G*|*WiFi*) - if [ "$wifi_blocked" = "true" ] || [ "$wifi_blocked" = "1" ]; then - rows="${rows}[{\"text\":\"📶 Unblock WiFi\",\"callback_data\":\"act:wunblock:${ip}\"}]," - else - rows="${rows}[{\"text\":\"📵 Block WiFi\",\"callback_data\":\"act:wblock:${ip}\"}]," - fi - ;; - esac - fi - - # limiter - if [ "$TG_BTN_LIMIT" = "1" ]; then - if [ "${rl_kbit:-0}" -gt 0 ] 2>/dev/null; then - rows="${rows}[{\"text\":\"⚡ Limit: $(tg_ceiling "$rl_kbit" "$rl_up") — Remove\",\"callback_data\":\"act:unlimit:${ip}\"}]," - else - rows="${rows}[{\"text\":\"⚡ 1M\",\"callback_data\":\"act:limit:${ip}:1000\"},{\"text\":\"⚡ 2M\",\"callback_data\":\"act:limit:${ip}:2000\"},{\"text\":\"⚡ 5M\",\"callback_data\":\"act:limit:${ip}:5000\"}]," - rows="${rows}[{\"text\":\"⚡ 10M\",\"callback_data\":\"act:limit:${ip}:10000\"},{\"text\":\"⚡ 25M\",\"callback_data\":\"act:limit:${ip}:25000\"},{\"text\":\"⚡ 50M\",\"callback_data\":\"act:limit:${ip}:50000\"},{\"text\":\"⚡ 100M\",\"callback_data\":\"act:limit:${ip}:100000\"}]," - fi - fi - - # shaper - if [ "$TG_BTN_SHAPE" = "1" ]; then - if [ "${shape_kbit:-0}" -gt 0 ] 2>/dev/null; then - rows="${rows}[{\"text\":\"🔧 Shape: $(tg_ceiling "$shape_kbit" "$shape_up") — Remove\",\"callback_data\":\"act:unshape:${ip}\"}]," - else - rows="${rows}[{\"text\":\"🔧 1M\",\"callback_data\":\"act:shape:${ip}:1000\"},{\"text\":\"🔧 2M\",\"callback_data\":\"act:shape:${ip}:2000\"},{\"text\":\"🔧 5M\",\"callback_data\":\"act:shape:${ip}:5000\"}]," - rows="${rows}[{\"text\":\"🔧 10M\",\"callback_data\":\"act:shape:${ip}:10000\"},{\"text\":\"🔧 25M\",\"callback_data\":\"act:shape:${ip}:25000\"},{\"text\":\"🔧 50M\",\"callback_data\":\"act:shape:${ip}:50000\"},{\"text\":\"🔧 100M\",\"callback_data\":\"act:shape:${ip}:100000\"}]," - fi - fi - - # back button - rows="${rows}[{\"text\":\"⬅️ Back\",\"callback_data\":\"act:back\"}]" - - printf '%s%s]}' "$kb" "$rows" -} - -# ── command handlers ──────────────────────────────────────────────────────── - -handle_help() { - if [ "$TG_CONTROL" = "1" ]; then - tg_send "$(printf 'TrafficCtl Bot\n\n/devices — active devices with action buttons\n/status — blocked/limited summary\n/help — this message')" - else - tg_send "$(printf 'TrafficCtl Bot (notifications only)\n\n/devices — active devices list\n/status — blocked/limited summary\n/help — this message\n\nControl disabled — enable in LuCI settings')" - fi -} - -handle_devices() { - local devices - devices=$(get_devices) - if [ -z "$devices" ] || [ "$devices" = "[]" ]; then - tg_send "No active devices" - return - fi - local count - count=$(echo "$devices" | jsonfilter -e '@[*].ip' 2>/dev/null | wc -l) - if [ "$TG_CONTROL" = "1" ]; then - local kb - kb=$(build_device_keyboard "$devices") - tg_send "$(printf 'Active devices: %d\nSelect a device:' "$count")" "$kb" - else - local list="" ip name - for ip in $(echo "$devices" | jsonfilter -e '@[*].ip' 2>/dev/null); do - name=$(get_device_field "$devices" "$ip" "name") - list="${list}• ${name:-?} (${ip})\n" - done - tg_send "$(printf 'Active devices: %d\n%b' "$count" "$list")" - fi -} - -handle_devices_edit() { - local msg_id="$1" - invalidate_cache - local devices - devices=$(get_devices) - local count - count=$(echo "$devices" | jsonfilter -e '@[*].ip' 2>/dev/null | wc -l) - local kb - kb=$(build_device_keyboard "$devices") - tg_edit_msg "$msg_id" "$(printf 'Active devices: %d\nSelect a device:' "$count")" "$kb" -} - -handle_status() { - local devices ip name rl_kbit shape_kbit rl_up shape_up blocked wifi_blocked - local result="" - devices=$(get_devices) - [ -z "$devices" ] || [ "$devices" = "[]" ] && { tg_send "No active devices"; return; } - - for ip in $(echo "$devices" | jsonfilter -e '@[*].ip' 2>/dev/null); do - blocked=$(get_device_field "$devices" "$ip" "blocked") - wifi_blocked=$(get_device_field "$devices" "$ip" "wifi_blocked") - rl_kbit=$(get_device_field "$devices" "$ip" "rate_limit_kbit") - shape_kbit=$(get_device_field "$devices" "$ip" "shape_kbit") - rl_up=$(get_device_field "$devices" "$ip" "rate_limit_kbit_up") - shape_up=$(get_device_field "$devices" "$ip" "shape_kbit_up") - name=$(get_device_field "$devices" "$ip" "name") - - local flags="" - [ "$blocked" = "true" ] || [ "$blocked" = "1" ] && flags="${flags} 🚫inet" - [ "$wifi_blocked" = "true" ] || [ "$wifi_blocked" = "1" ] && flags="${flags} 📵wifi" - [ "${rl_kbit:-0}" -gt 0 ] 2>/dev/null && flags="${flags} ⚡$(tg_ceiling_short "$rl_kbit" "$rl_up")" - [ "${shape_kbit:-0}" -gt 0 ] 2>/dev/null && flags="${flags} 🔧$(tg_ceiling_short "$shape_kbit" "$shape_up")" - - [ -n "$flags" ] && result="${result}${name:-?} (${ip}):${flags}\n" - done - - if [ -z "$result" ]; then - tg_send "All devices are clean — no blocks or limits" - else - tg_send "$(printf 'Active restrictions:\n%b' "$result")" - fi -} - -# ── callback handler ──────────────────────────────────────────────────────── - -handle_callback() { - local cb_id="$1" data="$2" msg_id="$3" - local verb ip param result msg devices name - - if [ "$TG_CONTROL" != "1" ]; then - tg_answer_cb "$cb_id" "Control disabled" - return - fi - - verb=$(echo "$data" | cut -d: -f2) - ip=$(echo "$data" | cut -d: -f3) - param=$(echo "$data" | cut -d: -f4) - - # Validate IP from callback data - if [ -n "$ip" ] && [ "$verb" != "back" ]; then - if ! echo "$ip" | grep -qE '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then - tg_answer_cb "$cb_id" "invalid IP" - return - fi - fi - # Validate rate param is numeric - if [ -n "$param" ]; then - case "$param" in *[!0-9]*) tg_answer_cb "$cb_id" "invalid param"; return ;; esac - fi - - case "$verb" in - menu) - invalidate_cache - devices=$(get_devices) - name=$(get_device_field "$devices" "$ip" "name") - local blocked wifi_blocked rl_kbit shape_kbit rl_up shape_up - blocked=$(get_device_field "$devices" "$ip" "blocked") - wifi_blocked=$(get_device_field "$devices" "$ip" "wifi_blocked") - rl_kbit=$(get_device_field "$devices" "$ip" "rate_limit_kbit") - shape_kbit=$(get_device_field "$devices" "$ip" "shape_kbit") - rl_up=$(get_device_field "$devices" "$ip" "rate_limit_kbit_up") - shape_up=$(get_device_field "$devices" "$ip" "shape_kbit_up") - - local status_line="" - [ "$blocked" = "true" ] || [ "$blocked" = "1" ] && status_line="${status_line}🚫 Internet blocked\n" - [ "$wifi_blocked" = "true" ] || [ "$wifi_blocked" = "1" ] && status_line="${status_line}📵 WiFi blocked\n" - [ "${rl_kbit:-0}" -gt 0 ] 2>/dev/null && status_line="${status_line}⚡ Limiter: $(tg_ceiling "$rl_kbit" "$rl_up")\n" - [ "${shape_kbit:-0}" -gt 0 ] 2>/dev/null && status_line="${status_line}🔧 Shaper: $(tg_ceiling "$shape_kbit" "$shape_up")\n" - [ -z "$status_line" ] && status_line="✅ No restrictions\n" - - local text - text=$(printf '%s (%s)\n%b' "${name:-?}" "$ip" "$status_line") - local kb - kb=$(build_action_keyboard "$ip" "$devices") - tg_edit_msg "$msg_id" "$text" "$kb" - tg_answer_cb "$cb_id" "" - ;; - block) - result=$("$SCRIPTS/trafficctl-block.sh" "$ip" "tg") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - unblock) - result=$("$SCRIPTS/trafficctl-unblock.sh" "$ip" "tg") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - wblock) - result=$("$SCRIPTS/trafficctl-macfilter-add.sh" "$ip") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - wunblock) - result=$("$SCRIPTS/trafficctl-macfilter-remove.sh" "$ip") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - limit) - result=$("$SCRIPTS/trafficctl-ratelimit.sh" "$ip" "$param" "tg") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - unlimit) - result=$("$SCRIPTS/trafficctl-ratelimit.sh" "$ip" "0" "tg") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - shape) - result=$("$SCRIPTS/trafficctl-shape.sh" add "$ip" "$param" "tg") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - unshape) - result=$("$SCRIPTS/trafficctl-shape.sh" remove "$ip") - msg=$(echo "$result" | jsonfilter -e '@.msg' 2>/dev/null) - tg_answer_cb "$cb_id" "${msg:-done}" - invalidate_cache - handle_callback "$cb_id" "act:menu:$ip" "$msg_id" - ;; - back) - handle_devices_edit "$msg_id" - tg_answer_cb "$cb_id" "" - ;; - *) - tg_answer_cb "$cb_id" "Unknown action" - ;; - esac -} - -# ── main loop ─────────────────────────────────────────────────────────────── - -main() { - load_config - validate_config - load_known - - export TCTL_VIA="telegram" - export TCTL_SRC="telegram:${TG_CHAT_ID}" - export TCTL_USER="telegram-bot" - - logger -t trafficctl-tg "Bot started, chat_id=$TG_CHAT_ID" - - local offset response ok i - local update update_id msg_chat_id msg_text cb_id cb_data cb_msg_id - local config_reload_at newdev_check_at - config_reload_at=$(($(date +%s) + 60)) - newdev_check_at=0 - - offset=$(cat "$OFFSET_FILE" 2>/dev/null || echo "0") - - while true; do - # Periodic full device scan (rate-limited); hotplug path stays real-time. - if [ "$(date +%s)" -ge "$newdev_check_at" ]; then - check_new_devices - newdev_check_at=$(($(date +%s) + NEWDEV_INTERVAL)) - fi - process_dhcp_triggers - - response=$(tg_api "getUpdates" \ - "$(printf '{"offset":%s,"timeout":%d,"allowed_updates":["message","callback_query"]}' \ - "$offset" "$TG_POLL")") - - ok=$(echo "$response" | jsonfilter -e '@.ok' 2>/dev/null) - [ "$ok" = "true" ] || { sleep 5; continue; } - - # Iterate results by index until one comes back empty. Do NOT use - # `jsonfilter -l '@.result'` to get a count: on newer jsonfilter - # (OpenWrt 25.12 / APK and snapshot) it returns an empty string, which - # left update_count empty and turned `[ "$i" -lt "$update_count" ]` into - # a BusyBox "sh: out of range" loop that never processed commands (#22). - i=0 - while update=$(echo "$response" | jsonfilter -e "@.result[$i]" 2>/dev/null); [ -n "$update" ]; do - update_id=$(echo "$update" | jsonfilter -e '@.update_id' 2>/dev/null) - [ -n "$update_id" ] && offset=$((update_id + 1)) - echo "$offset" > "$OFFSET_FILE" - - # try message first - msg_chat_id=$(echo "$update" | jsonfilter -e '@.message.chat.id' 2>/dev/null) - if [ -n "$msg_chat_id" ]; then - if [ "$msg_chat_id" = "$TG_CHAT_ID" ]; then - msg_text=$(echo "$update" | jsonfilter -e '@.message.text' 2>/dev/null) - case "$msg_text" in - /start*|/help*) handle_help ;; - /devices*) handle_devices ;; - /status*) handle_status ;; - esac - fi - i=$((i + 1)) - continue - fi - - # try callback_query - cb_id=$(echo "$update" | jsonfilter -e '@.callback_query.id' 2>/dev/null) - if [ -n "$cb_id" ]; then - msg_chat_id=$(echo "$update" | jsonfilter -e '@.callback_query.message.chat.id' 2>/dev/null) - if [ "$msg_chat_id" = "$TG_CHAT_ID" ]; then - cb_data=$(echo "$update" | jsonfilter -e '@.callback_query.data' 2>/dev/null) - cb_msg_id=$(echo "$update" | jsonfilter -e '@.callback_query.message.message_id' 2>/dev/null) - handle_callback "$cb_id" "$cb_data" "$cb_msg_id" - fi - fi - - i=$((i + 1)) - done - - # reload config periodically - if [ "$(date +%s)" -ge "$config_reload_at" ]; then - load_config - config_reload_at=$(($(date +%s) + 60)) - fi - done -} - -main diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-totals.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-totals.sh deleted file mode 100755 index f57d3a7f3..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-totals.sh +++ /dev/null @@ -1,276 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Monotonic per-device byte totals — the single accumulator behind both the -# LuCI "Bytes / TCP / UDP" columns and the trafficctl_device_bytes_total metric. -# -# WHY AN ACCUMULATOR AT ALL (issue #26) -# Neither byte source is a lifetime total. conntrack reports what its -# CURRENTLY TRACKED flows have carried, so a device's number collapses the -# moment its flows age out — which is why the columns were reported showing -# values like "2 bytes". The nft counter maps are cumulative, but only since -# the table was created, and that table is rebuilt on upgrade and gone after -# a reboot. A lifetime total has to be accumulated from deltas and persisted. -# -# ONE STORE, ONE IMPLEMENTATION -# This logic used to live inline in trafficctl-metrics.sh. It was lifted out -# rather than copied: a second accumulator with its own state file would let -# the UI column and the Prometheus counter report different totals for the -# same device, and that is a bug report nobody can reproduce. -# -# SOURCE SELECTION is delegated entirely to trafficctl-bytes.sh, which already -# switches to nft counters when flow offload stops conntrack from counting — -# so the total stays right on exactly the routers where the complaint arises. -# That switch can happen at RUNTIME (offload toggled in the firewall config, -# or trafficctl-bytes-nft.sh bouncing back to conntrack on a kernel without -# dynamic counter maps), and the two sources have unrelated magnitudes. The -# source is therefore recorded per device, and a change rebaselines instead -# of accumulating the difference as if it were traffic. -# -# STORE: /tmp, i.e. tmpfs, so totals reset on reboot. Deliberate: this file is -# rewritten on every LuCI poll (2–10 s) and every scrape, and that write -# volume into flash would wear out the router. Surviving a reboot would mean -# a periodic flush to /etc/trafficctl (kept across sysupgrade by -# lib/upgrade/keep.d) at a much coarser interval — a separate decision. -# -# Usage: trafficctl-totals.sh [--all] -# default : one element per device in the current sample (what the UI wants) -# --all : also emit devices that are no longer in the sample but still -# carry a total, so a Prometheus series does not vanish and -# reappear every time a quiet device's last flow expires. -# -# Output: the trafficctl-bytes.sh array, each element extended with -# bytes_in_total / bytes_out_total / bytes_tcp_total / bytes_udp_total, -# total_since (unix time accumulation began for that device) and live. -# The proto totals are -1 when the active source cannot split by protocol. -# -# TRUST: "degraded" is carried through from the sampler and is STICKY per -# device. It means the counters the total was built from are frozen for -# offloaded flows (uncountered offload with no usable nft fallback), so the -# total is a lower bound that stops growing while traffic continues. One -# tainted sample understates the total for the rest of its life, so the flag -# cannot be cleared just because the next sample looked healthy — that would -# re-present the same understated number as trustworthy. Consumers must -# refuse to show it as a total, exactly as they refuse to show -1 as 0. - -. /usr/local/bin/trafficctl-fw.sh - -STATE="/tmp/trafficctl_totals.state" -LOCKD="/tmp/trafficctl_totals.lock.d" - -ALL=0 -[ "$1" = "--all" ] && ALL=1 - -SAMPLE="/tmp/.trafficctl_totals.sample.$$" -# Per-process, NOT a shared "$STATE.tmp". The lock below can be stolen after a -# timeout, so two writers coexisting is a reachable state rather than an -# impossible one; with a shared scratch name they would interleave lines into -# it and the surviving state file would be garbage. With one name each, the -# worst outcome is the benign one the lock is really for — a lost delta. -TMPF="/tmp/.trafficctl_totals.write.$$" -# shellcheck disable=SC2064 # expand the paths now, not at trap time -trap "rm -f '$SAMPLE' '$TMPF'" EXIT INT TERM - -# Sample BEFORE taking the lock. Reading /proc/net/nf_conntrack on a busy -# router is by far the slowest thing here, and holding the lock across it would -# put every poll in a queue behind it: two browser tabs at a 2 s interval would -# then routinely hit the steal-on-timeout path below, which exists for a killed -# sampler, not for ordinary load. The file is in tmpfs and is streamed into -# awk, so this costs no more memory than the pipeline it replaces — and keeps -# the promise that no large value is ever held in a shell variable. -/usr/local/bin/trafficctl-bytes.sh 2>/dev/null | sed 's/},{/}\n{/g' > "$SAMPLE" - -# mkdir is atomic, so unlike a test-then-create lock file two samplers cannot -# both believe they hold it. Without this a LuCI poll and a metrics scrape -# landing together would read the same state, and the later writer would -# silently discard the earlier one's delta. -_tries=0 -while ! mkdir "$LOCKD" 2>/dev/null; do - _tries=$((_tries + 1)) - if [ "$_tries" -ge 30 ]; then - # A stale directory from a killed sampler must not freeze the counters - # for good; steal it rather than give up on accumulating. - rmdir "$LOCKD" 2>/dev/null || true - mkdir "$LOCKD" 2>/dev/null || break - break - fi - sleep 0.1 2>/dev/null || sleep 1 -done -# Re-armed only now that the lock is actually held: a signal arriving during -# the sample above must not make this process rmdir a lock it never took. -# shellcheck disable=SC2064 # expand the paths now, not at trap time -trap "rm -f '$SAMPLE' '$TMPF'; rmdir '$LOCKD' 2>/dev/null" EXIT INT TERM - -NOW=$(date +%s) - -# Everything from here to the end of awk is the critical section, and it is -# only a state-file read plus one pass over the sample — milliseconds. -awk -v state="$STATE" -v tmp="$TMPF" -v now="$NOW" -v all="$ALL" ' -# Returns -1 for a missing key, an unparseable value, or an explicit -1 in the -# JSON — all three mean the same thing to every caller here: "not available". -function num(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*" - if (!match(line, re)) return -1 - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /^[0-9]+/)) return -1 - return substr(seg, RSTART, RLENGTH) + 0 -} -function str(line, key, re, seg) { - re = "\"" key "\"[ \t]*:[ \t]*\"" - if (!match(line, re)) return "" - seg = substr(line, RSTART + RLENGTH) - if (!match(seg, /"/)) return "" - return substr(seg, 1, RSTART - 1) -} -BEGIN { - # State line: ip rx_acc tx_acc rx_last tx_last seen tcp_acc udp_acc - # tcp_last udp_last src since - # The first six fields are byte-for-byte the layout the exporter used - # before this script existed, so an old state file still loads. - while ((getline l < state) > 0) { - n = split(l, f, " ") - if (n < 5) continue - ip = f[1] - rxa[ip] = f[2] + 0; txa[ip] = f[3] + 0 - rxl[ip] = f[4] + 0; txl[ip] = f[5] + 0 - known[ip] = 1 - seenat[ip] = (n >= 6 ? f[6] + 0 : now) - if (n >= 10) { - tca[ip] = f[7] + 0; uda[ip] = f[8] + 0 - tcl[ip] = f[9] + 0; udl[ip] = f[10] + 0 - } else { - tcl[ip] = -1; udl[ip] = -1 - } - srcof[ip] = (n >= 11 ? f[11] : "?") - since[ip] = (n >= 12 ? f[12] + 0 : now) - degof[ip] = (n >= 13 ? f[13] : "false") - } - close(state) -} -{ - ip = str($0, "ip") - if (ip == "") next - rx = num($0, "bytes_in"); if (rx < 0) rx = 0 - tx = num($0, "bytes_out"); if (tx < 0) tx = 0 - tcv = num($0, "bytes_tcp") # -1 when the source cannot split by protocol - udv = num($0, "bytes_udp") - s = str($0, "src") - if (s == "") s = "?" - # Trust, not magnitude. Deliberately NOT folded into the source-switch test - # below: conntrack counters are continuous across a change in trust, so - # rebaselining on it would throw away a real delta for nothing. - dg = "false" - if (index($0, "\"degraded\":true") > 0) dg = "true" - - # A source switch swaps "bytes carried by live flows" for "bytes since the - # nft table was built", or the reverse. Either way the jump is not traffic, - # so this tick only re-establishes the baseline. - switched = 0 - if ((ip in known) && srcof[ip] != "?" && s != "?" && srcof[ip] != s) switched = 1 - - if ((ip in known) && !switched) { - # Only upward movement is new traffic. A drop means flows expired, and - # their bytes were already accumulated while they lived. - if (rx > rxl[ip]) rxa[ip] += rx - rxl[ip] - if (tx > txl[ip]) txa[ip] += tx - txl[ip] - } else if (!switched) { - # No baseline yet: the whole sample is the starting point, not a delta. - rxa[ip] += rx; txa[ip] += tx - since[ip] = now - } - rxl[ip] = rx; txl[ip] = tx - - if (tcv >= 0) { - if ((ip in tcl) && tcl[ip] >= 0 && !switched) { - if (tcv > tcl[ip]) tca[ip] += tcv - tcl[ip] - } else if (!switched) { - tca[ip] += tcv - } - tcl[ip] = tcv - } else { - # Gone unavailable (offload turned on mid-life). Forget the baseline so - # that when it returns the stale value is not differenced against the - # new one — hours of frozen counter would land as one fake delta. - tcl[ip] = -1 - } - if (udv >= 0) { - if ((ip in udl) && udl[ip] >= 0 && !switched) { - if (udv > udl[ip]) uda[ip] += udv - udl[ip] - } else if (!switched) { - uda[ip] += udv - } - udl[ip] = udv - } else { - udl[ip] = -1 - } - - known[ip] = 1 - srcof[ip] = s - # Sticky: a total accumulated from frozen counters stays understated for - # the rest of its life, so one degraded sample taints it until the counter - # is reset. Clearing the flag as soon as the next sample looked healthy - # would quietly re-present that same understated number as trustworthy. - if (dg == "true") degof[ip] = "true" - else if (!(ip in degof)) degof[ip] = "false" - seenat[ip] = now - live[ip] = 1 - srx[ip] = rx; stx[ip] = tx; stc[ip] = tcv; sud[ip] = udv -} -END { - for (ip in rxl) { - # Drop devices that have gone quiet AND carry no total, so the state - # file cannot grow without bound on a busy network. - if (!(ip in live) && rxa[ip] + txa[ip] + tca[ip] + uda[ip] == 0) continue - sv = srcof[ip]; if (sv == "") sv = "?" - dv = degof[ip]; if (dv == "") dv = "false" - printf "%s %.0f %.0f %.0f %.0f %d %.0f %.0f %.0f %.0f %s %d %s\n", \ - ip, rxa[ip], txa[ip], rxl[ip], txl[ip], seenat[ip], \ - tca[ip]+0, uda[ip]+0, tcl[ip], udl[ip], sv, since[ip], dv > tmp - } - close(tmp) - system("mv " tmp " " state " 2>/dev/null") - - printf "[" - n = 0 - for (ip in rxl) { - islive = 0 - if (ip in live) islive = 1 - if (!islive && !all) continue - - # A device absent from this sample has no CURRENT reading at all. - # Re-emitting its last one would hand a consumer a frozen number that - # looks live, with only the "live" flag to give it away — so the raw - # fields report -1, "not sampled", the same sentinel the protocol split - # uses. The accumulated totals below are unaffected: those are real - # history and stay exact. - crx = -1; ctx = -1; ctc = -1; cud = -1 - if (islive) { crx = srx[ip]; ctx = stx[ip]; ctc = stc[ip]; cud = sud[ip] } - - # -1, never 0, when the source cannot split by protocol: a UI that - # printed 0 would be claiming the device sent no TCP. Keyed off the - # stored baseline rather than this sample, so a quiet device under - # --all still reports the protocol history it does have. - # - # These MUST stay value tests. `(ip in tcl)` would be true for every - # device by the time control reaches here: the state-writing loop above - # reads tcl[ip] and tca[ip] by subscript, and merely referencing an awk - # array element creates it. A membership test would then report 0 bytes - # of TCP — a confident wrong answer — for devices that never had a - # protocol reading at all. - tt = -1; if (tcl[ip] >= 0) tt = tca[ip] + 0 - ut = -1; if (udl[ip] >= 0) ut = uda[ip] + 0 - # Hoisted out of the printf argument list rather than inlined as - # ternaries: BusyBox awk is the interpreter on the target and has been - # seen to mis-parse expressions in call arguments (see the note in - # trafficctl-metrics.sh), and a silently dropped statement here would - # corrupt the JSON for every consumer. - sv = srcof[ip]; if (sv == "") sv = "?" - lv = "false"; if (islive) lv = "true" - dv = degof[ip]; if (dv == "") dv = "false" - if (n > 0) printf "," - printf "{\"ip\":\"%s\",\"bytes_in\":%.0f,\"bytes_out\":%.0f,\"bytes_tcp\":%.0f,\"bytes_udp\":%.0f,\"src\":\"%s\",\"degraded\":%s,\"bytes_in_total\":%.0f,\"bytes_out_total\":%.0f,\"bytes_tcp_total\":%.0f,\"bytes_udp_total\":%.0f,\"total_since\":%d,\"live\":%s}", \ - ip, crx, ctx, ctc, cud, sv, dv, \ - rxa[ip], txa[ip], tt, ut, since[ip], lv - n++ - } - printf "]\n" -}' "$SAMPLE" diff --git a/luci-app-trafficctl/root/usr/local/bin/trafficctl-unblock.sh b/luci-app-trafficctl/root/usr/local/bin/trafficctl-unblock.sh deleted file mode 100755 index 23f3ca51b..000000000 --- a/luci-app-trafficctl/root/usr/local/bin/trafficctl-unblock.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -# shellcheck shell=dash -# Unblock internet access for a device. -# Usage: trafficctl-unblock.sh [label] - -. /usr/local/bin/trafficctl-fw.sh - -IP="$1" -LABEL="${2:-block_$IP}" - -if [ -z "$IP" ]; then - echo '{"ok":false,"msg":"usage: trafficctl-unblock.sh [label]"}' - exit 1 -fi - -if ! tctl_validate_ip "$IP"; then - echo '{"ok":false,"msg":"invalid IP address"}' - exit 1 -fi - -COMMENT=$(tctl_block_comment "$IP") - -# Rules written before comments were derived from the address carry the caller's -# label, so a block placed from LuCI could not be removed from Telegram. -tctl_block_remove "$IP" "tctl_block_${LABEL}" 2>/dev/null - -if tctl_block_remove "$IP" "$COMMENT"; then - tctl_persist_enabled && tctl_persist_remove "block" "$IP" - tctl_log "unblock" "$IP" "$LABEL" "${TCTL_VIA:-cli}" "${TCTL_SRC:-local}" - echo "{\"ok\":true,\"msg\":\"internet unblocked for $IP\"}" -else - echo "{\"ok\":false,\"msg\":\"failed to unblock $IP\"}" - exit 1 -fi diff --git a/luci-app-trafficctl/root/www/cgi-bin/trafficctl-metrics b/luci-app-trafficctl/root/www/cgi-bin/trafficctl-metrics deleted file mode 100755 index 71767d013..000000000 --- a/luci-app-trafficctl/root/www/cgi-bin/trafficctl-metrics +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -# Prometheus scrape endpoint. Inert unless trafficctl.metrics.enabled=1. -# -# This serves device names, addresses and traffic volumes with no LuCI session, -# so it stays disabled by default and supports an optional shared token: -# uci set trafficctl.metrics.token= -# scrape ... /cgi-bin/trafficctl-metrics?token= -# Prefer also restricting the port to the LAN in your firewall. - -TOKEN=$(uci -q get trafficctl.metrics.token 2>/dev/null) - -deny() { - printf 'Status: 403 Forbidden\r\n' - printf 'Content-Type: text/plain\r\n\r\n' - printf '%s\n' "$1" - exit 0 -} - -[ "$(uci -q get trafficctl.metrics.enabled 2>/dev/null)" = "1" ] \ - || deny "trafficctl metrics disabled" - -if [ -n "$TOKEN" ]; then - # QUERY_STRING is the only channel a stock Prometheus scrape config can use - # without custom headers. - case "&${QUERY_STRING}&" in - *"&token=${TOKEN}&"*) ;; - *) deny "invalid or missing token" ;; - esac -fi - -printf 'Content-Type: text/plain; version=0.0.4; charset=utf-8\r\n\r\n' -exec /usr/local/bin/trafficctl-metrics.sh diff --git a/smartdns/Makefile b/smartdns/Makefile index 1bb6c034d..1701bd8de 100644 --- a/smartdns/Makefile +++ b/smartdns/Makefile @@ -6,10 +6,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=smartdns -PKG_VERSION:=48.4 -PKG_RELEASE:=9 +PKG_VERSION:=48.5_rc1 +PKG_RELEASE:=10 -PKG_SOURCE_VERSION:=21c940edc65520849ba03544c5cf8d9cf326e680 +PKG_SOURCE_VERSION:=320061d07c3d559a2fa734b2b4bc2891c86f4422 PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/pymumu/smartdns/tar.gz PKG_SOURCE_URL_FILE:=$(PKG_SOURCE_VERSION) diff --git a/sunpanel/Makefile b/sunpanel/Makefile index cd9ee0a89..b1287eb0e 100644 --- a/sunpanel/Makefile +++ b/sunpanel/Makefile @@ -7,16 +7,22 @@ include $(TOPDIR)/rules.mk -PKG_ARCH_sunpanel:=$(ARCH) - PKG_NAME:=sunpanel -PKG_VERSION:=1.3.1 -PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/ +PKG_VERSION:=1.8.1 +PKG_RELEASE:=2 + +# v1.8.1 official release assets are per-arch (linux musl static binary) +ifeq ($(ARCH),x86_64) + GO_ARCH:=amd64 +else ifeq ($(ARCH),aarch64) + GO_ARCH:=arm64 +endif + +PKG_SOURCE:=sun-panel_v$(PKG_VERSION)_linux_musl_$(GO_ARCH).tar.gz +PKG_SOURCE_URL:=https://github.com/hslr-s/sun-panel/releases/download/v$(PKG_VERSION) PKG_HASH:=skip -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION) +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) PKG_BUILD_PARALLEL:=1 PKG_USE_MIPS16:=0 @@ -28,7 +34,7 @@ define Package/$(PKG_NAME) CATEGORY:=Network SUBMENU:=Web Servers/Proxies TITLE:=SunPanel, NAS navigation panel. - DEPENDS:=@(x86_64||aarch64||arm) +ubus +uci +bash + DEPENDS:=@(x86_64||aarch64) +ubus +uci +bash URL:=https://sun-panel-doc.enianteam.com/ endef @@ -48,6 +54,12 @@ if [ -z "$${IPKG_INSTROOT}" ]; then fi endef +# The official tarball has one top-level dir, strip it so files land in PKG_BUILD_DIR +#define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(TAR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) +endef + define Build/Configure endef @@ -55,8 +67,9 @@ define Build/Compile endef define Package/$(PKG_NAME)/install - $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/usr/libexec/istorec $(1)/usr/share/sunpanel $(1)/etc/uci-defaults - $(INSTALL_BIN) $(PKG_BUILD_DIR)/sunpanelbin.$(PKG_ARCH_sunpanel) $(1)/usr/sbin/sunpanelbin + $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/usr/libexec/istorec $(1)/usr/share/sunpanel $(1)/etc/uci-defaults $(1)/www/luci-static + $(INSTALL_BIN) $(PKG_BUILD_DIR)/sun-panel $(1)/usr/sbin/sunpanelbin + $(CP) $(PKG_BUILD_DIR)/web $(1)/www/luci-static/sunpanel $(INSTALL_BIN) ./files/sunpanel.init $(1)/etc/init.d/sunpanel $(CP) ./files/sunpanel_conf.lua $(1)/usr/libexec/istorec/ $(CP) ./files/conf.temp $(1)/usr/share/sunpanel/ diff --git a/sunpanel/files/conf.temp b/sunpanel/files/conf.temp index 255c1aeca..7338a23ae 100644 --- a/sunpanel/files/conf.temp +++ b/sunpanel/files/conf.temp @@ -4,19 +4,33 @@ [base] # Web run port. Default:3002 http_port=<%=port%> +# Web run https port. Default:3003 +https_port=3003 +# Web run address Default: 0.0.0.0 +http_address=0.0.0.0 # Database driver [mysql/sqlite(Default)] database_drive=sqlite # Cache driver [redis/memory(Default)] cache_drive=memory # Queue driver [redis/memory(Default)] queue_drive=memory -# Web Paths -web_path=/www/luci-static/sunpanel -# File cache path (Please start with the current path './') -# Warning: The files that have been uploaded after the modification cannot be accessed +# File cache path source_path=<%=config_path%>/uploads -# File cache path. +# File cache temp path source_temp_path=<%=config_path%>/runtime/temp +# Front -end path. +web_path=/www/luci-static/sunpanel +# Custom JS and CSS. +custom_style_path=<%=config_path%>/custom +# Token expires (hour). defalut 168 +token_expires=168 + +# ============================== +# SSL certificate configuration +# ============================== +[cert] +cert_path= +key_path= # ====================== # Mysql database driver diff --git a/sunpanel/files/sunpanel.init b/sunpanel/files/sunpanel.init old mode 100755 new mode 100644 index 5991f6b85..f863a2b7b --- a/sunpanel/files/sunpanel.init +++ b/sunpanel/files/sunpanel.init @@ -1,30 +1,26 @@ #!/bin/sh /etc/rc.common - START=99 USE_PROCD=1 NAME=sunpanel - + get_config() { config_get_bool enabled $1 enabled 0 config_get config_path $1 config_path } - -start_service() { +start_service() { config_load "$NAME" config_foreach get_config "$NAME" [ $enabled != 1 ] && return 1 mkdir -p "$config_path" lua /usr/libexec/istorec/sunpanel_conf.lua $NAME /usr/share/$NAME/conf.temp $config_path/conf.ini - procd_open_instance procd_set_param file $config_path/conf.ini - procd_set_param command /usr/sbin/sunpanelbin -cfgPath $config_path + # v1.8.1: startup flag changed from -cfgPath to -config-path + procd_set_param command /usr/sbin/sunpanelbin -config-path $config_path procd_set_param stderr 1 procd_set_param respawn procd_close_instance } - service_triggers() { procd_add_reload_trigger "$NAME" } - diff --git a/xray-core/Makefile b/xray-core/Makefile index 1fac315bd..21734cd1e 100644 --- a/xray-core/Makefile +++ b/xray-core/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=Xray-core -PKG_VERSION:=26.10.31 -PKG_RELEASE:=29 +PKG_VERSION:=26.11.9 +PKG_RELEASE:=30 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)?