From 5d0e3868cca7324a150f86170267c6c84607a231 Mon Sep 17 00:00:00 2001 From: actions-user Date: Thu, 20 Feb 2025 23:46:51 +0800 Subject: [PATCH] update 2025-02-20 23:46:51 --- daed/Makefile | 143 ++++++++++++++++++ daed/files/daed.config | 7 + daed/files/daed.init | 46 ++++++ luci-app-daed/PIC/1.jpg | Bin 0 -> 80036 bytes luci-app-daed/PIC/2.jpg | Bin 0 -> 97241 bytes luci-app-daed/README.md | 58 +++++++ luci-app-daed/luci-app-daed/Makefile | 15 ++ .../luci-app-daed/luasrc/controller/daed.lua | 34 +++++ .../luasrc/model/cbi/daed/basic.lua | 62 ++++++++ .../luasrc/model/cbi/daed/log.lua | 5 + .../luci-app-daed/luasrc/view/daed/daed.htm | 32 ++++ .../luasrc/view/daed/daed_log.htm | 33 ++++ .../luasrc/view/daed/daed_status.htm | 24 +++ .../luci-app-daed/po/zh_Hans/daed.po | 59 ++++++++ .../luci-app-daed/root/etc/daed/daed_sub.sh | 36 +++++ .../root/etc/hotplug.d/iface/98-daed | 22 +++ .../luci-app-daed/root/etc/init.d/luci_daed | 45 ++++++ .../usr/share/rpcd/acl.d/luci-app-daed.json | 11 ++ 18 files changed, 632 insertions(+) create mode 100644 daed/Makefile create mode 100644 daed/files/daed.config create mode 100755 daed/files/daed.init create mode 100644 luci-app-daed/PIC/1.jpg create mode 100644 luci-app-daed/PIC/2.jpg create mode 100644 luci-app-daed/README.md create mode 100644 luci-app-daed/luci-app-daed/Makefile create mode 100644 luci-app-daed/luci-app-daed/luasrc/controller/daed.lua create mode 100644 luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/basic.lua create mode 100644 luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/log.lua create mode 100644 luci-app-daed/luci-app-daed/luasrc/view/daed/daed.htm create mode 100644 luci-app-daed/luci-app-daed/luasrc/view/daed/daed_log.htm create mode 100644 luci-app-daed/luci-app-daed/luasrc/view/daed/daed_status.htm create mode 100644 luci-app-daed/luci-app-daed/po/zh_Hans/daed.po create mode 100755 luci-app-daed/luci-app-daed/root/etc/daed/daed_sub.sh create mode 100755 luci-app-daed/luci-app-daed/root/etc/hotplug.d/iface/98-daed create mode 100755 luci-app-daed/luci-app-daed/root/etc/init.d/luci_daed create mode 100644 luci-app-daed/luci-app-daed/root/usr/share/rpcd/acl.d/luci-app-daed.json diff --git a/daed/Makefile b/daed/Makefile new file mode 100644 index 00000000..22dc76e3 --- /dev/null +++ b/daed/Makefile @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2023 ImmortalWrt.org + +include $(TOPDIR)/rules.mk + +PKG_NAME:=daed +PKG_VERSION:=2025.02.20 +DAED_VERSION:=daed-1750dbe +WING_VERSION:=wing-742e185 +CORE_VERSION:=core-16825b5 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_PROTO:=git +PKG_SOURCE_VERSION:=1750dbeccbff7ce7ea0399ef509031e189d2e172 +PKG_SOURCE_URL:=https://github.com/daeuniverse/daed.git +PKG_MIRROR_HASH:=skip + +PKG_LICENSE:=AGPL-3.0-only MIT +PKG_LICENSE_FILES:=LICENSE wing/LICENSE +PKG_MAINTAINER:=Tianling Shen + +PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/wing +PKG_BUILD_DEPENDS:=golang/host bpf-headers node/host +PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=no-mips16 + +GO_PKG:=github.com/daeuniverse/dae-wing +GO_PKG_LDFLAGS:= \ + -s -w -X '$(GO_PKG)/db.AppDescription=$(PKG_NAME) is a integration solution of dae, API and UI.' +GO_PKG_LDFLAGS_X= \ + $(GO_PKG)/db.AppName=$(PKG_NAME) \ + $(GO_PKG)/db.AppVersion=$(DAED_VERSION)_$(WING_VERSION)_$(CORE_VERSION) +GO_PKG_TAGS:=embedallowed +GO_PKG_TARGET_VARS:=$(filter-out CGO_ENABLED=%,$(GO_PKG_TARGET_VARS)) CGO_ENABLED=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/bpf.mk +include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk + +TAR_CMD=$(HOST_TAR) -C $(BUILD_DIR)/ $(TAR_OPTIONS) + +define Package/daed/Default + SECTION:=net + CATEGORY:=Network + SUBMENU:=Web Servers/Proxies + URL:=https://github.com/daeuniverse/daed +endef + +define Package/daed + $(call Package/daed/Default) + TITLE:=A Modern Dashboard For dae + # You need enable KERNEL_DEBUG_INFO_BTF and KERNEL_BPF_EVENTS + DEPENDS:=$(GO_ARCH_DEPENDS) $(BPF_DEPENDS) \ + +ca-bundle +kmod-sched-core +kmod-sched-bpf +kmod-xdp-sockets-diag \ + +kmod-veth +v2ray-geoip +v2ray-geosite +endef + +define Package/daed/description + daed is a backend of dae, provides a method to bundle arbitrary + frontend, dae and geodata into one binary. +endef + +define Package/daed/conffiles +/etc/daed/wing.db +/etc/config/daed +endef + +define Build/Prepare + ( \ + $(TAR) --strip-components=1 -C $(PKG_BUILD_DIR)/../ -xzf $(DL_DIR)/$(PKG_NAME)-$(PKG_VERSION).tar.gz ; \ + rm -rf $(PKG_BUILD_DIR) && git clone https://github.com/daeuniverse/dae-wing $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/wing && git -C $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/wing checkout ${WING_VERSION: -7} ; \ + rm -rf $(PKG_BUILD_DIR)/dae-core && git clone https://github.com/daeuniverse/dae $(PKG_BUILD_DIR)/dae-core && git -C $(PKG_BUILD_DIR)/dae-core checkout ${CORE_VERSION: -7} ; \ + pushd $(PKG_BUILD_DIR)/dae-core ; \ + git submodule update --init ; \ + go mod tidy ; \ + popd ; \ + pushd $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/wing ; \ + wget -qO - https://github.com/daeuniverse/dae-wing/commit/ca02961.patch | patch -p1 ; \ + go mod tidy ; \ + popd ; \ + pushd $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) ; \ + npm install -g pnpm ; \ + pnpm install ; \ + pnpm build ; \ + popd ; \ + mkdir -p $(PKG_BUILD_DIR)/webrender/web ; \ + cp -rf $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/dist/* $(PKG_BUILD_DIR)/webrender/web ; \ + find $(PKG_BUILD_DIR)/webrender/web -type f -size +4k ! -name "*.gz" ! -name "*.woff" ! -name "*.woff2" -exec sh -c '\ + gzip -9 -k "{}"; \ + if [ "$$$$(stat -c %s {})" -lt "$$$$(stat -c %s {}.gz)" ]; then \ + rm {}.gz; \ + else \ + rm {}; \ + fi' \ + ";" ; \ + ) +endef + +DAE_CFLAGS:= \ + -O2 -Wall -Werror \ + -DMAX_MATCH_SET_LEN=1024 \ + -I$(BPF_HEADERS_DIR)/tools/lib \ + -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/asm/mach-generic + +ifneq ($(CONFIG_USE_MUSL),) + TARGET_CFLAGS += -D_LARGEFILE64_SOURCE +endif + +define Build/Compile + ( \ + pushd $(PKG_BUILD_DIR) ; \ + $(MAKE) deps ; \ + $(GO_GENERAL_BUILD_CONFIG_VARS) \ + $(GO_PKG_BUILD_CONFIG_VARS) \ + $(GO_PKG_BUILD_VARS); \ + go generate ./... ; \ + cd dae-core ; \ + BPF_CLANG="$(CLANG)" \ + BPF_STRIP_FLAG="-strip=$(LLVM_STRIP)" \ + BPF_CFLAGS="$(DAE_CFLAGS)" \ + BPF_TARGET="bpfel,bpfeb" \ + go generate control/control.go ; \ + popd ; \ + $(call GoPackage/Build/Compile) ; \ + ) +endef + +define Package/daed/install + $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dae-wing $(1)/usr/bin/daed + + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) $(CURDIR)/files/daed.config $(1)/etc/config/daed + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) $(CURDIR)/files/daed.init $(1)/etc/init.d/daed +endef + +$(eval $(call GoBinPackage,daed)) +$(eval $(call BuildPackage,daed)) diff --git a/daed/files/daed.config b/daed/files/daed.config new file mode 100644 index 00000000..ff61f363 --- /dev/null +++ b/daed/files/daed.config @@ -0,0 +1,7 @@ + +config daed 'config' + option enabled '0' + option listen_addr '0.0.0.0:2023' + option log_maxbackups '1' + option log_maxsize '5' + diff --git a/daed/files/daed.init b/daed/files/daed.init new file mode 100755 index 00000000..baa72884 --- /dev/null +++ b/daed/files/daed.init @@ -0,0 +1,46 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2023 Tianling Shen + +USE_PROCD=1 +START=99 + +CONF="daed" +PROG="/usr/bin/daed" +LOG="/var/log/daed/daed.log" + +start_service() { + config_load "$CONF" + + local enabled + config_get_bool enabled "config" "enabled" "0" + [ "$enabled" -eq "1" ] || return 1 + + local listen_addr log_maxbackups log_maxsize + config_get listen_addr "config" "listen_addr" "0.0.0.0:2023" + config_get log_maxbackups "config" "log_maxbackups" "1" + config_get log_maxsize "config" "log_maxsize" "5" + + procd_open_instance "$CONF" + procd_set_param command "$PROG" run + procd_append_param command --config "/etc/daed/" + procd_append_param command --listen "$listen_addr" + procd_append_param command --logfile "$LOG" + procd_append_param command --logfile-maxbackups "$log_maxbackups" + procd_append_param command --logfile-maxsize "$log_maxsize" + + procd_set_param limits core="unlimited" + procd_set_param limits nofile="1000000 1000000" + procd_set_param respawn + # procd_set_param stdout 1 + procd_set_param stderr 1 + + procd_close_instance +} + +stop_service() { + rm -f "$LOG" +} + +service_triggers() { + procd_add_reload_trigger "$CONF" +} diff --git a/luci-app-daed/PIC/1.jpg b/luci-app-daed/PIC/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b746fcddfdef74c3a34eaebc48323d86e61fd05 GIT binary patch literal 80036 zcmeFa1za6XvOauphd^)-?(Pl=9^Bpa1a}LP0Lj52K!UqVAi%*T1b26Lceg)z^R9k( z@9y1e`~5EP>(k6kGfWpf)zwu`J^e8Gun2f2BOxsTfPjDi7(RXj9%cY90r0S}aIi4& zaBy%42=Iu=m?+3dNXU2?&(Sc6@JWb?@CgY?DVV59$r#8932C@#8CY03I5p;}|M1sCGXNbPss+vu3W5v(i4FmU4)O2Qu|efC03-wy6eKhh3=A~%V{4zs>i}qU7>pOJqOi}E zjNr%|FxmX0(&5R)%383LhYl&&jU59J5V3J^@$f0BsA*{FI5@eud3gC=z7m&^l#-TF zQB_md(A3g4F*P%{u(Yyva&~cbbNBFk_dYNv_`^p~bj+vNxcJXs5;8KgvU76t@(aqp zRa91it7~e%xBh5r@96C69v>8=sh*nqFF7SzTM-*xcGaIzBl)JHNQRy8hWO2msWt zZvC-mf7LJa$9_RVLqkEs{p=S6q}yYGLWhQV!3v8Zssv}`@SKdzA0AUID!r@)ft+3W z5X;zc2oaltV~O(UXV-q~*+15?fPboIf9%+w`ZWzehJtwf=Ru(ZgaIdXG#P$~|72kk zXC%!|g9On$m48tgAYm&NO+;me=JS$ovg;g+5|-gkNz58L41YacxPlkId;pN^!FamU z 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
    -2B_%tw>MRtPp?rW{V2%4Gq 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 FzW}x0n4ACr literal 0 HcmV?d00001 diff --git a/luci-app-daed/PIC/2.jpg b/luci-app-daed/PIC/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..938aee10c3bd9926e5b7a095edad5365b975afea GIT binary patch literal 97241 zcmeFa1z26lwkN&`?twsX*Wm6N8V|wU-GVy=4w8`I79hC01@{o#g1ZNIcRS2UZg=0F z_vX&+*E8?E`=5W{EBWfw-e*_Us@h9_Yn_Mbhi|}R83}0#0165UFo6664|9MRfB**v z4+o0?4-b!sh=7EGg^GfVjDm;x1RaYApM;nQpOBE0l8J_toPmOnke2%y0}Cq$2L}la zuOJVb024b0+xMG5AtEB8Afw=-qT;fV5t6a}hyNbF02m0+t?<6kP~^ZP3@B&}sD}=K z1OT95Ay51Lfq(sjdISvv3kQ#Yh=dI3Q2iKq1O*NK2nHG!76t~=+Z*yZ0D}RGNyaJ) z_e9YUp4T#RnOWI6xq0~o zg%y=m)it$s^$l(99i3g>J-vOSW8)K(Q`0lE%PXsE>l>R}+dIc6r)TFEmsi&}-^T?7 zK>ux6zmM$Sj0*!Yu17F1&@k}d#|8Ds4U(WSU|`8u;V?xN;SC+0khA$AU_Fn@C~rli zU{^ZAHgX(6dP>Q$Om+NyXg@~w=LY8gmqzyc!2Uk2SpWqZ3bJ_67=SQvN=KXNi}V*0 zn>ZtBPWq!@+MnrPbPkZ8Di%*gWrY^-Qf#qnpNJBcx z-D&gWmg+(iX)~Kz-(o3>!2Xu7?c~Rpt2OUJ2sCXe4=|h}3bustC+m*5gKRP^O-8fn zvS|99ovxoz`||EQlcMX?cr4lqUrhyIDT@CssRhPlTH&u9qNUhUN8vaze=PEQ03MO2 zw|r_CJv6Codf(|l%uPnRN+BqT1*H|7xHG!a2cq7f4wlQP`LqdR;uBa+a}-x^lk)&r z%9&OSlY&_KQqW(rr{1%Q;8rOw2W=+u80(HowW^ro(fDccwY+oDMfk;qUY}G(N`8^v zoXBTes0u1x97_S}4+%~xCmX8@P!z}dnf^8B0Lo780f>B~A92DttS+4U0Q5X(?!Ly~ zqM!Kk0HEHy@68OR@5B9V0hOarqUmV+Spj9so(*2?@#PQxw9vCm>or%PZ);q`^n>v>%ZZ)W_VH~)(!EOY{v9jnEPAfI{%FHBXOd=b-f+I zm9Wla^>|~YbK-ouszi)k>~8D+Qn&?l>@kgBHR>a&M6O%ira=m640|_X-|(6J0lVqf z3?!z~oO1F#vE4Uyez?C~z^byncmk(~hnAYzJT6w$LVRRYB zhy-`7P?PWtBu6|)`-YH?&U(!3Tjop^?&TrAURfvC>RM6G14MwdmMX85ab}FUXOk!o zc%_C7<-b3Eyz;Sd5Ti@KE{@hlqcaMRWp+Rk(6mvE<}odc|zIc?0m+Li?+$=%*N3urdsz+tUjHF~@Jo-Q`Cs6-Z@Z5JdyO>GW-%1u2hUtt89H6KeqbGQo1Hw zjIMi{6?Z@_)0aV0UuS!Yd}UM_D?{dh_>I9t3XR@))iWw@uFW1x5wzFUul&Xip*6=9 zU~1Lb^>k&O>~A+>LmCZGVy67G0y;gnM(5=CLc^?jKV{LC&u!O*f~&)RWgC8DA0VYk zu$HJSgdPw!PGyVC)D}5OtI5^(uM)BWt z%j?N7rgX{Y<}LxG#U<;TE#?=ips28kH_o%1JcnUEsCXq!h7IhBU@9se*lB$#M0zBt zD1tGfw5Kn_#he3(i_1c82>AjiY;2~^vn-<<1sD~TMx4>GkZlnR#h=}NPRLIR`MC^H))d*YA0{>Y9XMHVL1Bqj{JpZOmI0Ppcx(>HqGZ0}CFA~n=Hkf* z25wAjoMR(ll++3DJ4V|2TXMZGwyPea8{B=@dJ2q<^>lqaJcP$$!%y>s#a*<7{p>iM zE93ZcG?HQ)oZltdT%$InAXPx_E5S7b6Qx@cg)@iF0I1N%Cb}<)@tZpDQOqJ-I)X%M)JWm=)3f z`*t7NZaH}zatxMeKsvVG&$RuGmB5r-OnU*@{U5(;If#>% zb?GS5B{3?Ja4N*9Pg<e!u4yk z^yi2<2*>i5?vh&bNWl`+ZMAUodnisN;J`Jg^!6}nIYO`y8dx29` z+R9}aSEhf`=e&~pBGr~~cW{4MC!JRBI`>RzIzcR=p3mr)pmu!T_@UlOvLsy z7U`6^%0Z_=C&dw&*?C_RGSozI z$Ppm)G?^?JEm=(CDNh^)J<-vo#EI$@S{d;higT!5GeyFECWyu!6Cs%SEVdiqVNMA=uAA+yhZbbr z1hYmTDCPw=r74sL6Mb6hxxKrfaUxucr69GTA%%(>a2!{%I#_){H|yPbqbgIA=HT<8 zL%@6ay!22XJON&8J^_6aXkpnu1-G}5?Au*eo^RCg(L&dcPr@FX-gmBDjC?F%Y%7q` z;jfTrq5DK9(#s3&%TrXlTR>}JGWxbTH-)luJ?({`QQYGhSlo{1JqtXz0wh|eiL{vF zDWV3t&q0+hY2MU7BaJW<-8}eaJO&-{lCBy{;V%>RpCSIAeZ+xZ9)Q5ZeKU&KFp$W~12*xuv`qXjqnCXSUYuI{-KbQo-nkg_A#xcK^!Ly z(D0a!Zmaq>Boh$bGr`do%>0` zi@P>pXFp!l7Rt%qo~&TPM_5Z#Np%Ba+Y(sPqb7WnQ`r;C3bNf!b?2wIT%9V}tBwzn z_8)Wk*z|5VLV-!SZdP*uN0onewyHe<0qd2zKKxz_Ec%_!0x3yuY)|fF1Y2a}akenr z-E_QonA9vj+KHwmK>y|xmmB;t&OLTC= zzyn}@p7kS7N2JZaTe<*g34G6h|LupGpb1XZqNtYzq~`CXvIIX{TTmltOy-{fnhD^pLX$07+=c<^d47 zYLP$6`ct2NKS5%x|9*YpDV!^vpC~U9zsgHiZJBR;|I?uIAIZ=ObKj>;MtskFDKoQ9 zK{NLjKeC@6{hW=TwDEI0{Hq=g=s5rdgj3Hd!SekRBKp_}=D>joP9RGX&nW>kZ;8Eg zzm3w&{#vd0?Cp#R?iOpRb!=uM?aF;JmWt|F^UZ-dt?uHc>p`anZ8*i)`U*U26zZD5;rZ1k@()*aXbseGKJA)c`YzB&9r|m+0W#5K>AH82 z>ai1VKXD!QiV#zwN!3nR^ni#EQ6c>0z0_HMGrIq3Ko1>;GWL@{0nOgie!|!Y9lMLT zXps^4p1DFLWN|=@wD)DB5#O^A;Oj^tC<;8aE%`kY_cgN^5bk*Ztk1H3w5@ba!n_I*Bhe9tuC%>MXg4AATnmSD+S{T$-&+0&oj z{d3NL(%R2G_VaA{Z#`4%i?(y@!nB9FzM*k}&bPIt4f0-nNqb(G4d;!;R>7-=YhW*q z^&bOF{05x(lOcsXldEggQ!1D4vn` zF6cU?{n!@ujt&lsl?I0R-5KXVa7R0;+<2nhn3Ih2g0y3nUuLtq?$P19S4_oc_uQi4 zmx@jCec{xfomI%(FlS!-)zS#dD{6S|e~ws|=9qDbKo(_6^9=2G%Uc>CPbLnjD|Mfn z!W+Ww7h_Z1zSVNhp1N;*0DAG|(R-ORrS&(#lBnWdHhF%pncd7$yDtQyJn{)CV|wsJ zH(_jd^{iKI;Fj8FAAlJf%}~saO7ikvooLpy!o<+0PVYJ=oDC9vT<;0!N->?YzU~_* zL(nRdyw8JYCSN}*x$>Eu-Bc;(I+_n{0~>K2u-{Q$oEKaDYRjnM5JtAvqq>#65Ra
    UtzyefD^>pln9%_HT>``LQD>VxO43~%QE&jAi4egGoMu14-7Ko5X` z@bUQrfIqfV{QyMWe`V<7_{W`uiuA8Z=G(qziOUJ*bk^Q%C3xTZxS$%-_A!mB89~fI zk-x*<{ta5=ueKAoMkT1>wv!(yp7I-@@h3Ke%(2UrVZSQ zbhAzOGXF+ZoMhXJytR;kmg6C8?e-QE@MOfkS7p??aqiu5qHC!O$^JE)*=a3!)7H~< zPG^FKTREC(R_BaXDGOg{GSjiKI%aNasQmdw+ot>naVO#~(|O)OakbL;&gbZ7#?+uH zF6M;rkDE7BoLY)W$yf=2OraK&_TfvDV6&Wvcju_G{ZIWT)gw)faU$OdA7Rdr#Ikum zvoSOl$}y^hN+YAR)VQ@3f0lNIGue=avZ$%OB~F>ziriB~j?9bOC%sG+o8aPoG4 z+(~{agB#!ZqQpB-qe+?HJA4u+aM36rswvZdb>TfPZl{$KVc`~jXieN$tLtx3T*{qF0^xpd`FgiabB9SuVpFAHJ03yM913a z>HP9Fbub4E=47s;!nagbhtVYALx=^WhuVh_cRc$*Imla~w@1hoiGDZPQm_;(Fi(y~6oHIPRXiU3`Q-#1qGPJ8*VY zb5a#WU4CM;sKZgc#4RjBnT-~0XJxcA)dg=-af6QjViNy;ZY^+tNOE1sk4UZ~YFCD4; zuNLXUWJFIW;RMXbY^8-?Oi3Rji{rPs(@WNyy*2wNNn_MP+H-TPrpQ5pdUg5YXfgKN zv`M^Gj|-emlUUkE%;#Xh_bz#BETXq~tfy^u=0MQ=FzI=cW*$}*;S z%ay7a-5_oOl%j~+HNuFm_w+@<8b(*Q_7&d*60P1>&R=#fE9&lga)qo0br8c(P)~A4 zGnK3^Y;0cn4Lzr=Bi3FP4s3{cUwykEv?FSYmO5vfL*a^^eqN@1<+benM8sQ5?ulN6 zO1M;qV?Lc07v7HO;aUD2O=0(noN$-pjCQ|`i$KY35PkX5`y=kGl>_DsFRd7S?DJQ1)vC<;ssJ-vLcd^^BqP$(nmza#rn71mI zWgD`yLwQj+I?t;*?@9YbV1j>+x9WDrh6(3YIoBkxQG3T;Hn$z8{?zS>oZW^LrDkT3 zi6Bd#=sD4?s`c(Yz4~~y?CwzYFDEFo42Jen-|U8lowH$WnAF2oHb~#yt?tC)GE)hamvrWb(Q8N6gOIRz1I;2qSl`Yj+Y4qb(x26|x@-M5$cl21Q z8%7Q&!Zs~S$uvF>j?hX)5PalT8-#;ZY&m`|yOJdLoGVeA-+|;n=iBS7WV94ZsPG%& zESO=ch00lmO+>05*1Q#Y8MBg{p)4zOQ~Tql_fU)&R4*kwBk7eDlO&rO(Kx-uqcs!N zPYrrPiKiEO_fvWD@6^5WthCbRAdeH{`PRhU)#eLy=}RXO!nxn9y$1i)W+`bDHXV7w z#~B_b2Jf>9D8C_{&4nP7z-rEAybnr`x7lCQ4$W1*R1R0e##7B1%;cfy)^r`Yo zxW)(~cRg=qm8QmWmw1(^tiYXxHQMm^a5L(W2-hC)6vxFR!JZXXpXuMgsz#3v@>{w( z&m(h_1RyW`t%1o#U(EiV!n{ky9*E9q>-ZQsW8DtJphN-5oPv~Xkn<+PI}n#x{rJSq~6 z1vlAgs>N!)d6J_hO>Kg_nN2od^BUQ5{gcJ?TX+WwTew9QIaBxOogszj$&1---GL?t zX}B&_JXK&VD&PtqXv++4u`BRkp{s6kl*73R(k}Mc?LPJlJ>&S2Ax`vC?gxS&YIv*>E7fr6N+u&<2ci9JeY_kG%H=|(=TII7xvQWi!gB}L8%+Jw82ua zJql=&Q`iN|E$HZ&S8PKsqSm5NS2?)3EH^kmgt91^@Lb~pt?|u97KuzT=CB8~g$p|U zHo1Dm^srSTcyrP9Mm`EMr(Kp%L%W_{mVEmcseLMQgU7z|2JZK)Ds&g+1^val+=(B0 z3aGx8JX77O7ZgUydhw_k{l#z-r2u#Sj(Xh9k;Xm+h|K~+glSn!Jh0uwpLah^=Cp7B zNw<*=^^jP6`(!-+E4p+Mvm~z;fdkakV*9!;Ls(FqBYMp%!mwCJ0&(`+mav1d_zMXW z6HO~K?4+AKinTE3b9!PB(4=Y!*X1oAn7^fBPS?ZZeqh{d^;M{2{e~}}9DQ4*zFfXg ztnq!N(a1+eTT=(?AdN=|DD6(n6c#=A^w0`pE1&#fyxxI_7swa11W*E}iwquhA3m81 zkDZv;o|etoUL-k&%bq2=2pxr2hJHz@sUal#+`e5PV1Ec(y)&^Ye#&jO$g|abBN?eXUG%!qowmrY(r7$P3D-7D zymc65-jK=V__Q#8ov;XoC`ON@K4?AwX8KjUvv%N-AmPQ68>8~-d$KAyBWq?((@?{e zNDw|tUs@?$$wrEIUPZ}%N@pccUr?qA<5^E>$gR1?gaD&ECo*Mod96w~eH=1g?W<*b z5!i;ajq1wW@$`e#OAzFH7~z~|ZQji0=GYnAvNJ$jWrn@d3@4lWrH-ima zuGi~D)+0U%ptm)>YmGnJ{>(g9T8f|%_dK*aeLlzO%ItGM88dI08ha@DUh#`0f!i(+ zT2=o7^~$bXwFXnx^9|ZAOa;EM=7?P3dwm}L+570@6}-6#r)_w}v;& zfH-RK`m_wI#hPt_PSEtr&aiV7*oQdLA&y4zN8sn_*j$ho)@PUaa&Joi@e6^Ei=z|!>CpW(_bXk+tfwi($gJH;ax{08>I011 z@qLK|UFLC%;$OWY?AaqF+(|bfm}q6nsfdn-XxO}>GV~RG&-uSVGXJAjok=k2qW}@~fFd7kPBD13J36bJ zPyWHQx&Jqo?`xNWT9ji~<(G679V#qb@;Z*B-Aji=5WwAQye7 zn-Tjt-JgEw>ycxZ;R0ug7>+(0F2DUNHG3%q~d z^!_+Wnd>6QSd*%UEhoXW^IX4yT=N>!%gG&;@NcVUWlVP1R{M=?bFbS`LwF=4TY445 z%Jj7dD@AG?`try|yB@b6&uELPE6PZ7??5Q%U9UH~K|sfi!nld=j+(wT+OC7AB84s5 zBh+r5)s``$UB9bjBO&t26CDAN;R_aeX5-FPR9nQmt5U|*q_joGWU~6* z!LO5Y>-&Ql&X?*=0%P_4{HbzIVyN%q7}X1?`r?9wuMkGY{d0P;3t-(6B|8tXEpC)7 zkL7Fx97?Cx>fTqT@3A2at)SXFt7kicMy|nqt^^z_8Ngr*xHix-3m5pa;_#; zt{H^BQdNc>M^sUgG~JxIZXT8KXZrHlICUo;G#AcTxp5<+E=2DK%DT)1BySdM)Gn=> zhs+N3U~1Cucc*@O{Q&4SI$f!!D2fo=aEG2RAZsV7S2Z)b@KQU`&R0ADP4s#3kSk1L zlkTAua+eql_w!70}^GP`7wVKL?t#j8;u6owd$ zx0R^7JO@103?6DIKb4$0$kp7?&DwBCCb7-SQT){b_BC6t9f#8|>y%*uS{8r}{ z7)g-bYC*;XqYI*obZKslk@2mx2LPYHS&q%svf6KB*XPel6qkn1s`WhV6YEa5U(D2& zFyZwCcHTwGOH(GP1rOmO-@S*mR6#jy76U)W z1e5frkmrsIuaPk?-@ScK`)Kj+E;*&3Ke!4O`GE<}F=8NZw+}3Tk)oj~6)dpu0q;7> z8u%Rf>SpwHmHbX63^!{}lD@E#Ef8IfIG{Vb`0ga@drN_$2##xQ#$EpRmO>Q;*oE(1 zxF9Wsu~<+)FZwwVKPlqp*7*O|8G)OQb_#*oMmpYu(o5*R4ujTkNFY|5^x&}qyiLz{ zcW)e30Rz}lk33i#`l&BB% z)kg@M0ymy&5&_<5X+`1!J181--FRJIQy$c1nb~^Ax>`};!D1vmPI{?uZ}D3DveZv` zS+VKFbFe(lCu6istoFbAewzm}*-Bsf*%xdd{8F_w* zDH#~EfzmNm`G%=o2Ds+bw+wS4oLx5ANJ-mR5~33-Qsb6-vfA=J0Iq4wK{hTt2m73~ z)WLmXcmaFUW&sAXS@2MS=mNn#6$wYp*G+-AYc+AtvMiOhDeoscZ@)_8;T}dM)@NVY zQcp6#Tt1DTWUqQJ*HqF@_aq>)m>)k{7<2n#q&>IY#_>j}m69!ZqER`rrX=5Brz+|d#7jyAxR>Rby_tPvi6?`Wwb<_aYYfH| zxARC}i}=FYba&j`SOXC`hR6eVpo}D}s{bBb;@?1&UtO8M9CNWz-}8)Joke{7URR_w z<`d-w*eA1S*OPH0pg=Ho$8ajv;ZoNNLrs7^f4kvj(ZzsF??H#u3)*Z0>FG!>5VM%- zd9&52-gxT8`N@7;`fYx*Z#v2jBt8n8IGmqoI-FZh_MxmC0>oJIU#`0RNAly(c5%Q> z3;oW2>&|BNlEe&Vu5mkD6y~rBa*|G`y=75P_g^V2jDaO)wr_) z%*S`PhY-&O^y93@4}kXraOel-B*KECCIjC-087w!79GM%pxbYtFiCMh`aS6L18@n6 zqJhtfez^p`B3V@&5yAX<-+!5T08T=xDp+}T5L$CpqV9V^3lNaWTS*b5LS6r0AMytv zHR8uwXOesdE!f?|j645a=>JCvo{IvyyqDA**5TfYFB-Dk^N{5phH*}RY5=cf|BOyb zcy&eivime0`juD!g^4FK$>7gp;s4#^kyIn-OO&5bQTJ)?W7YS9qOI8lG!Q6Mknoc5 zpfAN=RCat<`$0EAIP|A!@4)`_FDp4nu3_{3kC}BtalKKF`ty{R^aQTr(Jz*hzX5P^ zuKh>lHFvXLP`4N>gwN>IC91Z@^UJV27O-nqIocG4Q8i!UuGEPAD)M_HY^=4 zZdn=tqN=VM5#OlprpGdfSEaEqTSY?rW^$^$aHXwO&F#(=Q<52%kkJ?x>^DW<=%&Z# zl8&N9Z#LDIxIXVB)nGGjO(-E^;@1UEW+seDd~@Zd1H@!mk)mbKwm@)rrr58x;{)V$ z#rF1Wkg-oC5MT_P<{c%eqpIdQwOw!dYiAXjM1_p{*kk;LaD`(5)ql7)rP~d1;4+4& zX>EZ+d^|!X9>sI8>I?s3QJBZ}qWdCpV4_4VE8Law;za4q(E;f^_k%`)HxHHUz`Wi2^nCl;UB(=nsIC@5W@FAYADJ8pg z1;$WJu2aqd7|Y>4OXbEt)b}|l z5cFcoM^_?6D@;XQTE8sbu;gp^Sn+B?R*WL8Rk4wxIQDYF+kb);`-fmdd2?&d`}5|MhQP!X@nDvh zY+vnpZxa0*_2C|XHmduQ%=@BSyIb{r2TXHjdw(A&Y>KEtdw zDl-x~nJt;vCo{cts!RAN2xPUZZw{UVPu}X(p9+*wd_6@wNaI?pI~=Vm1b&c8%PmX( zjud#U1>yw0*OrxzNOrq~Pk~WVnIn;}2S+cgS zU^b131!d{sS9__l%$Uf#Iiv_rdxwcVu6w&lN<^0zOr7P#H{#H%wB?cK=EWLqucjT@ zuhmjtKk}eo5vTdY@|YG{wj-5rgh7C*HZI^*$T|WOY!9gBDGATBI|A!~(lmt;4(l+u zRrO)pGJJkb3?|YhakPvpHCXrE?(5Bu>Bz30uWQ@H2qZG#G#ZUUQutPe^FF2*CDRx5 zCD!JEdiWI|fKt$^l6dUV;UOD4&&lb%u+~{dU=E$N*X-r>Y`g69*sgd78%SW%R}0Jw zq{lBKr0e56vc6i8^SGI{1#jidxVhWRJ(9ws65C&_$ZdXlS^H_o*0d&CK8eua-rA~; z4=ZKutg*Jg z**m0frZ&|3z-hAK0eGKw^d8ivS$JP|>vSt`^__lF7M1pQPmOVhRz-+Sf2?!Zk9E#| zcbIlb@BoN%KoLp9-@TRuUx8hIuQ@{zS#JpuHB6i6jr+N>-(A~{2e4J{D&{ut( zYifB08^%UkPgSkqQRt8$6KOnro&-ODWP|=S0|j3no4V+DJ(?dulcRTba}k+YB-6a7 z%YaJ5Xd(j4wt&(vL)Bb0()aWkOauz{)MoCHED^39iU$q@$`janqlmgHY(3a8Y^LyA z^fM*?8GB1~b9eijmrqA4X=kr|)=RN;x|B#(OkD=V95NThHtIqypGD)=4bnTj&AYgX zp=`07YkL6DWs3dB`X+>iC`+ij7D>`~M=Mj2{NK@S4@~HbZ(li+&`odTX9gdAZTl;y z{f}$tWyQfAw=dG>T4qViXHLA|neERIxgCd^`I6Uh^-WLi(%A0}mRbZ{x>)B*JW38{gyy)X1s;G3J0bP7 zuv;(NZahdtENsdL;P{y4cJq4N<@YLtS^YOUn*WHd;y*>EpFXO1cZ^yQE78k?&Kg1k zpM@rRR;D=j8p{u@AsqxHF0@cH$ZuHpIL}>-*+p*~1>4la@y0uTqJY8BmAP8!RA9cN zShg41a|;cEh+%%gazr0JKZV-R*zFF#>yG+($jIF>(xVuHX#0A`GorZ{Nf6-K)d{n* z*6Nv9kLWM2tqf$?3&-x(F^QQ!)^w&wE&h-@D=5@I=*>3~#}hhi2~lB~H>JG32&>4N zqGOLxcoyBpSS6cNTO;+O0nthLNK=l_!5Bz&S>Z+Gf)a+2#r3X`5v^{p|1 zy$G~}pqoAKUBTq+*+m?;+DI#gSB`0-s|WJugY2+dr(V3dRLg{vl%jbnwL~jzE12iY z#&z|zpG?gix!y3Yzkw2+C7?V_CXR(27znS-U7YE41D+mx3{hoCnZ@)gr1yWO#7w>| zaj3cJ+`~_)Nk8T6xLEV>@xlSn0?OpADg>lGDHQaHams@>x9U z*wXcN-d7BPsG(9kdk)} z$(M=&^9yC}o{xMT+JLalAUhFfGOcT zt%$C~)TF|zVCyh8C_-Ig(eA{BIii*lr|};_YvH8+6FI==Qxc)IQL?7k>&^2FHYUIdmGM#x`f0 zk_U4!h9;-VHycBY;ufNX9#5rh88c$6pCm{eeD<&0DtR`M!ZlA+3Rgcl(vQe6k>x&t z2fa_|sZ?4M;>sk{#r7VPg;JRIuD;ll9#po%>;*=?Ynnb7XxWFrhBo^j0EpJ(ys$K@ zpxY-TNjI7q>aNZGtc#v6Se3PUM>5)WcLWsa1Tpv0e-Qnvh$dw%T{&Yf*o8)$RK%wm zbHMV4H9`^xg%Ob_i@F0KZwC+i*4(5&T_`Kqbg**y;+Q(e^#-A-BIOiD-@<~+GcA6qlwX})9B}5#3t}wg z$jaH~d*NxC9F1tE$S!ljvK?pJK3cy+n~ux{ffH!o1ww;#N-gR?*EhOYW;50vgc_i? z6)9?YStS<|4)&)%eE_OTeWsZ%BY05Ei3*N)E~5lOiKHSAOif|T@<&w4u`>^{AAsd< zSB=Kz)C-Z*&-N?;?xUg+anonKLYDmH5T;b>FUcL>-$bQ54JC`!1+w}2Qk3=awiie^ zJPKKU-6C|cSb$38{V8}Av_+j&@SU&h`p#DZl1icv00{;}zbTyZ$2uUX%N!^mnrCri zTVh$DA-Lz3Dy^SHYD|zmG1HfyVzsl0#AJd)7V)gSLv4g6&VXc(WeYTf zZKrYd)^_%7=fT^Yoa+5HKdSvNsI=G5mnF&Ep?9}+u(1HuW}(|XHYu=7f3xdy1h!Ie zgA3J5og+`biiT@TO3M->n;sQdBA?IIs9i;b7g23By-#PvmU*xf#GM6PT#J{!HO{-4 zjejQpFt8zR^XLW#rgpQFWw-Q5o-l4WfG&0ccW!E`)S5h)nE&yihuuxYcVR&1&0m%X zAd&=*t&4VJGh6q|M3Ko!J@d#$5&EX}`oo?>m3#=QB^q>f6?1=jx5M{aZR-)=U*Rf$ zy@tO89xQ5k1==F7+GU5VQKXg+$qhmYUsS5w@3uUZ+20L(|IA&fxZ7edBcW!qhJN5J zuZn9ho>p+}1@n#N0}wv)YdP7XQZje)CCxTY1 zynii}YVCTEKB%^ogU00VTqAxh3f1 z8mtW6(savq9++S9*J6U+_0G3IT>BR19^#bWZSh-qlViISiA`GsGI{`V)2{YOek=b= z9^RzNM5%ACd=6WyB86AkHTrJ=mj7e>!w=>2{14^xA1n}1L@yZU2pbB{cp)~?z|wv& z#Pe>E0}6enWxLR)Wm)pqQV9}4^*#xln70eY^8Q`0Xgblf-Vdpu>8Lp6)^uU!T*r#Ai|j_ClMg?iJjJ{uYNmu z?DGI*V<ERjB(>0jbpBgp^}drM~%!um&9zm^5G=?LK8y9xbXiw^$T^}l}x$|!B{ z@LJ(Bus;3zqRp;*08~kC2kz;3d?50(L(AC{5sdLjPNAfUitCS@6;y|b+8CnO60AFi z)`!8X&GPb`Vee_VwGAQ7ZyER3#T`hi)4z^hg`bh^k1#?kZK%$YUBS^NCK9)~if=Dj zzP$+M&p)(rs%A2TxAiIzbHAxK+`)kKwn5NH2CEk8hf%D#7O^ky?g{mjW6~?&56)->@WEz zHy zsF=fFZr}>6GewK#Ek>pXZz-bQ6NIymm7<{wO$dz4elwetvsRO{HwF(4o#92(av-64 zd}D8Br18|UfQV4ae+dj;Kye%W0MtJKl}O>gnHy*y@ij8vOg#YZ6Lh~;hM_G-x=wn^ zyFw4TkqX(Q&mPs>Jxix~?_ySyXcml+#nz)>`kv@r3+J>YA9LVx)!4a>5dAg2?A3DE zfeBPpfJ@tvBuNRs74@0Gtc7W9Y-TD=usDy23!UUR{ws%Gjv_*-Aqqme{9c-A^>iyC z;_8Xlsw+fdigj^BLcIY}M$lfES$>J8Y43^|Ifc=!wZuC+YPh*&-r53-q3Ew2rbokT zTC{yA;^NC&`>{UBjK~pmlP9zBMT%a+CFsSLT-ixZae6!LsmFt6C%+Al^Ob$@R&hw{ z=1fa>mz9_-DT%SIt9>FNUH2HuwwT|xTQ~)A0d;GTL2I5st>NiOl8a5Q!aD<@gzdz@ z#!6_dJLd8IY5x%`ZA79Y6?H`Mb8sVU6-4>_(f?2D{SNLZY^;rL7zS`=O~z9lIMfj$ zpu$a_M^9k06yvzrnuBAt{gsDwVS*51@{acSU1jPN+v(Y-eo?v9{kP?U%&R^4& zY4c>bW@N`Jq7dLPwRn&wLvd#dm_)SGj91PObvAL*7#A$v(O!4fm~C z5}l0@ITzT0Xa?&VX8i8@ieTr zph_^3XOZsiLlZi%9@uITorXZ)zDLXW6F(YOTGsw_^5P=yCh1-Dimn7dRhU1AIIihs z(X)j}hdCk(=nt8VMfqno>K*Ko1)5gK?DJJplgeUPteqPlhha{7akoR)Ryn(Np0*7s zHB_rHkR`05Na|p+Lw*j%leRQ#C-xNIQ?@~B&B^4xyn!jEEu#{KAHWJ7~O&9$0 z2ifFh4$oQ;w!3yt+~2&*lzd~<9Y~M_9eTC{wOOUMSeZTBYHD3% z={P{0mos>c1hG`%|s;2fqwv}eYFp>f6 zd+361>Uj{e%Se;(iX8Rg%EA750>$a`e0@q2VsyOo!`T8dE{~9`uD$Ra-IsV81_82I zO7e7_D0Y;g_W2>v@}Ei%gpstZaPSAq^1bW#M=zvS1G`v8>lYx3QeMbTK)teld2|_+ zJtx@TPgRh(S~;GE5tPG zD)U&+@=g{MB=8}DOsO1Qjo%%Qx-#oXw_-<+v?_7K_&y0f=?OL50UNi&U4Dywt#Nob zcbs@Qhq)_{s$#T!I@WeZ+@e~rd+IZ+EC_^;Ga=7y>WXD*Ho>Wl5WCXlB_0^>z7vD;8g$m#fUl z^mT)dXG&-pR-Ao*7=Ldqvp`ZU`#PF5@*bSv7PMbxjevNb=Jus)?w6qp>m-c>40D6Q z#>!Swz|#|{8xqlHZsaV)Yk@@hbFz-q#XiboF=#+f)6J%r^oYxuF!{W+`#JAE@1GW{%fXs&b zC+)7FVpCC8KAK#D9wl_%YT4zi{0R=pBg_i2PRQw>(d@oEt? zNq9l!@4{a|-^s=rpbK^R^4t*Izi2s#*r3g58Se*gfsK6WRAL~SkdCy&G>Gi*dsPZy z>o5K~1LSl84yyhRLMa~jUFEbR;jx(UyZ5NF70Jot?>?m&|2+0piB)fjRX^0lXZ`%a zrDfIgl8DfW(mW|O4Pr`j9@rpUygT}dY8&!CNVNBm^$Kx!Gj2tRz4Cc%5z#2ocH_m* zjwOwDIJ*~7+TCb*EZPQbm|s{$+F>4v3JNn#G+UuLZibAf$V*=JT?}vCs3uELntrHg z`$(X|#OI2=T1|QRMEB+Cyd32iZ@)CfQ!}BpahDtpe?HwVAlyFgD@BG0k-w9?mGgt}y;u`cc{9c^aq|BlOq_G(+CYd)&U+HAd@vlP+} zF%xD8xkt~)IaUuo6j1ho*mAg{Ue{do`DjetqAmDV z)YGFmZ#hsRQ?h){Cy3T@__;{Uq`!lTyZ3wV-MhP=y`SIi=dph@axl=fCS1Kf4A;<&+J(FJVdgb$5pxr+F9FuR#tDB5`$|)IR<1ix#kIU#ty)oS= z_~Y$+ukUBVcVgOi$J)LG|)=i!AqE!><`0KTYVV$e(o zm7lkSFM+zuRf_l&AlIewxrfqU(J2wEDa(0bu;s~gb)G<147Ew{(I94K#>5(D%I0>x zK=-S(cm*~D)Qm(=IbKwN28c`2rS=6hex8!_eO}7u_FKYin*2A3tA*e&5CQxEr3fS4oLNBvVDNeOPM|erz(Zk%{p3b)dCN0ya#rM z+>`Yu!;M(Nnl3nSMYBW`Oa~G%wNtXZtSwe{j-X%zoqP8P+z?2s*6;w{bWXxpF$!^&ad z86lT*MmJowOe7NF=3L2ukFEse1JBsk8mj{2OJ0d}H@c;BQE>0gALgxX+ql<-RI1c0Nfd7=Ru~lKZ@i z465B^erzX7&S*lf7q*iVP1&n~a8evDq{F|hZ1i;%^3})%$WQ`$C;$HM=3canG}EH^ z1MdeBcRZ9rBo+LI;*qDGkCrpaYIe__;DqA!nD}92Xz-YDbjCgF+Pb0l+^b8Z`J+X@ z9FkXVrc{aLr#t2_%xOb5vp}bY@v!0W;o*c7;%~TA=+WiC>bo?5POR-S#+71*yhf@-X~IL*vL+NUl`I*kipA4&b8btF<$^6 zHn~W{vj}NGms2wD%Q+f+vZUatv*h{F1w!llmbIJzuMRByvvMTn+Ru`H7regjsNp2T z=+(>F*l$tz=<%QBl#>EEc|dr)rxPD5#XM&_9R^bV3Fp=h`2eO%^mL8Id--^;0xos2 z=?jSe=5As~z`5hyCH1%R`zy8xvfuW^Bgszpo^%$_B(C+YBgKB(3*ZnuTCRyUkQX0H z9>x&-wnzF5w%Y^aX-^2qmC7S@{kF&V?IUf%MadqAY5$8m5U66RH9q=wL(98BJ|)KI zXiy)=#Zk+x@B41g_xsCgrTMSjE{mp^w}iH=Hin_RsMTODU9Q|$PFj|bp`(V(UST&7 zGWva*AwQ+}a7iS|#>39K&fdu(+StnO`#RkSQcACr#CfV`L)vZx-+}w2EAre)5}+9o z@*UMI6~-R+#G&CR!vxHZHmJ|`jCL1++UbQ&iMcVzE1!NpBk@NWP`;?@k5d9J3&DT< z-@Gg?OuA2c+rWUH@RP)2P1`(!3%u&uywKBx)c~$vgK)Yqp-oLDY z-Ijm(_Mf3*{`F&2vJ-SbHm?k5=y$cA+8vZVS?=Rq1nlzwJo(p9+YcDbGQ7k^Ldgb5 zC;?d{AltNd0qclEdl@1!oOZ4hqONC+ud07ctZ?+b#)a@`GR~c+c1MA0_ACK;Lw*2* zQtby)OUS%DMLd@C^x)0;F&mtYckWN8kbW=KeZ`xu=JJ%w2l>BzS>u%hMi*wSF=a8e zLBCFq*Jy0m-1-Fdx)EJH?934J6$=UnOSoO;&a2rKRXV+BwnmGRWMp*dUF;jv%QIA7 zmTCKg=b}m3>FxjO_p*KUFVR{~ ziga>-%JK?eE0T34{%qTgBGb72deHDS7^^aE>t?J?xa&(CI0K+9NMAOWKT})yO)WS0 zs>ZC|Yk^&2)YP9^wpxBQpo2#nJrN>Hp3i5UncBMe_Mke>n(R}+#|0pv?{Z#>pT#`` zafqQlX*GwWo)6~jRCX0M`C4}ghFFFT^=dtCW8uxnpGKna4_RGQ%IkiiMf9XC-%={> zXOHGbf4trN7i(W~r^2`RYY}#FpZsWE5MDus_Thc*IK-d$P>DZn{`sg;-;A!2A6DZR zIgl4h11-6by7=bxhQVQxkckp|-A=eA+}C#^VYmqsE&7(B9exFDkFG7HcKE6crq3E5 zfIp;aCe$$`dWoswKH)WQtISz<<;oV^(88pb`U1MMffCU!Lh#glHxy)k5)gV%9G~n} z93~)grr@b#Y<-fX{_1+Dr`L`nT$7-uMoBl*M9y5fzmw!lG314}(Zg`~IdVgi>MHs~ z7du(Zf@o!denWAvkCQQO9vor^K^^nP&isDHM%GI4acIbG=^Kc~*lX*VbafQ2nAeYx z0kcnUP-|GdVpFnlSb}zk3wc267@(%sY87MkTzRXIz76bCQ}Dsc%GiwJR=FDftxqC8QZ z^Ir1r?!}?=#$vg|N(CQofQ!LnT?K88&b?x+F~e(9qxtmdRRik=-3G<}&h3M?L05*S z9MDV&nx1(tr2SIZ>EhUT{h$Boq)J9?Se5`$+ZzZuob|xEIDw(9>9c(G-6LRzbO_8i zQT@F^Z=9d(0^{CR{y9!0u;Py~1Ljo$pHk$7uqJMv?!r#iVV*>PzyFu22d3qkrAS~L z(>yMA1`O!>Ryg`4z{k7Wvq;>M<+rz#1shjznJJg&V2-X26P?S?Ye(3!O`By1*sS3{M zcr-w?!sH%2{-RVkpq=eEZ;14c1p)D~AB{-~5PgW8{n240{oM>My2`)sZ{TMG!9TPP zEc|(~kuMAL2zMU>|m}3{VP{;zuRsC#9eS zi2JL^`)R<0F7_IdjF>sfsh6?y5o{?F7zf1MZYLyvjWp$6#;X2)`~O;W%rL<`CH6FaS`GTyH{*ryCon^3!`k$ND-*0~HF#puG zWUb`kVAWQDb>EVfO74BRzxyj3Q0spJ?)<{>KbX_xz4ODx{aM>g+bc%&_gW(;FK%0z z=--xm8MW7F(a9Q-n6|RB66Q5(AZDI1a$lmJh9d1SCtkWR0)loXE?b=kellLM0WOUt zCP!GDsj_5N)Pg`PGM;Gg?@6adbDA_QVlgIN_jSUX_`K~6n#mXlc~Md~-_R`3g&=eC zdO?gez!g#f_Ty$?dRpEey4eC%Y*VfBfdmzv2GT9yTXJ&??4yVE>Vl2;ooKB`pwUpq z-Wk^Cei`Xe@dzIGShs|Tui#EfrU7mT?KZqB-PN5B@O)S{k`*zp_^ZvEw&O6RWP9{#3Y}6a3JXir5${Wd(GfIvBEel)AJ~{4 zgei=*DpfvH_P+P@^Yy`sEB%DWo5xc8Vzr`6FHSJya31u~jAo%(L}3oIy_Yp3R+Y0i zlq-23sI_SealiR4QjDYGdI&~^?{1R@Xx3!Rcqiv=#B05s$GTTFqennwGEqZX7A}Y$ zN7hnn5G~PU-!`rg?He>gM7qHsq8*E%h?pV8Jg+NSVmpJg+qtpO2433-i|p_Ur9^K0 z+y1E$pxxsMQoK@qKZWCuIeKoIRB3kDEI}2%IlUHR?A;oVgOaPVH&ab0(C!7>-&G23 z5_G-O6(PB-WX*3}Gdjqia24aN>YTJ6bSoUNpK@-N|F>!3)T};k>Bvn)f~seV(7UBk7;$uweb%7gM&4kK^+pfq)R+}pn&$W2u+tL z<7YW!5>d!!AGxA_8{@^I5>E;yiBLgS7N@|5xli!#|3M@C4~mlfo77W5lD(|v5ENh^ z=NZSVjB1w0brl01cq;66TM018XM}nolL&n`--#OsV*&K-cOH)u&k>)Ag7jf^rQ3#Q z@HIO+chBhxieRXa2;B0nbTz(v1yD>9O~dXGYBE1tQrb^|4}3ms)+K)Ih*0U;`T4G4 zc!^zSrDZA~VJ7M8vw&%`8-_}KcPqQz2OSUva2imZGa<3Y2za@1p~|5wV=YK(3Hak1 zQ>KoV3D%e7IE=*(u@AhcchNEBEDB5Ot;p|q=8{}o+-)wyg;T9mF~CiSO8fm0CaZ87Lv4Ihkd!$Cuu2|7`{e;#-wqpJ%q ztQhnGKhA^4gFZ8$&8u}9taSu7sF%Kjk5}6vH>4iX*b<@tE_x(L3_*oG4>g2Z05Up} zow;8#O`L*@Bmdaq)^D7c|1^=u?fwj@*9c9_T9G;CUq7}Ul1HJ$+tf8Wbep<|-^ki& zgbz1nyv#)N{5Wf)iR{=viK)~>OesSvT zosu=&Psr@mpE5_?aH7_PcfIDS^8oBvnn>!(YnoThM|W=#=ZPY`3D_MhH05)$FtqMA zQV9)>(A3K^XD`nWa?y+mmUV>*6v8#hYrTB!EJ!sFo%_l$GZJ;#=z9%L%4MOkJzpe~Z7o3_Js;OU zLFZ*Ye9zYzQ?&YYXI}*sTIKBha0y=+83^q;ic-3Ji?!qEd;3m14W=X&NZMg!4IX@A zEf#rDIUQxCvVqqn5j;zKS3XG_$LrO!i;LqR+b6q71zYdl%{H*@Gsg7J9`JG0%aeN# z{h*YV#S<-X3W85eYO|PeTzrr2!qyh=WC8FPZE_$i`Ae(1|MwWYeb#2G^rtcD+e<`2 zD7a|!6mMpwa!zMQq|vz|~`1SAe7M|3=Hj;2*V&~p<=8t5V(w|8pP zAenkySi{07)+rIZjBksA{m2ueWxTEMw7vw=_K*8c#2Y*&SC0}U z8Lcgt(d{e=pJBa)E}2@|Bjf4}cD6NX=pP$LpsQ$1yw$PqZ72z|Af3)i#*ex;jw!CG z+v~=qaVc%rD~(>f%g5TdEk%TD4cxD|oba;o(_g^~7sc&0;&~j(2I;WUxQS(qo@s`D z@17#V3%wl|WWl9C)CfaQ_6dWj4LrhU@9U#bP*78s)qDq`3n7ECmV-l~JHjmck~q)5 zfL0H)8SNVE90yh-cMcQ=U9M&*RR%=yYh=Yj%yxwE^pMKxJcHxd|FeO`AQCwD9QXH%XeaqJA6NJx? z5{KHas=JLKVPE+)TS`~wc3#mvWM(lut~RlE#1_GlbE^=40MksL(#^+urK3=zvCIkA z-5NHRN+Ogqr zK;<$DVx1wXL`!t>{;(gQgZ}U&aARDl*}3MkeJ)mxy0kZSbXD{-;MT5n#j%uZrbeEC zOsZ{i z2x1JRXxC45G7kZJp#6FTZ&1&6&1qZg0RrHIIFi;~`U%+wWtzDFfxj!l2;i^<%yu24 zegVx_J~@>(G&yG&Vjr_9={FlSQZ7Nfn#Q_Shziy^6KuMV(Hhsp_iq8}j*l0Y}+JVS+81E=mz>}7oh0}3Y0XSiyUhwt%E!~U?}MU0$lW~DvlvZ-1WB;1so1&{3ssSsTx4gvQL`pL zq)1&MJH17=&t?z#0z&u#Iw4#z0u=Xty$xbGAHO7TrvVVP_Yy&EDa(I_mfvwTO`;ZvAr;RfU* z%b0jh1LM=F1<6nk<9woP%cWc(HyIfVO?^r9ov~Ib4^?lWtLVN;)4rtQX_RtTI?TsO z4CXd8-a5V=A=;b`iq@O9Bygi9;jzsy|BjUSbuua7QPK*C;Zv*R)lg}>R85{{70%)9 z(rK2MXkNk(+5BV;gemTn?~TL6kltQ_1%b(}Pini7p@2YKzze~pVgNHup1WaIb@MoP z^K7bWqi-@(vwlYK>cmRI zDkd-SAQf)Ue%j8+{f@%Ps@%RsjxDR?vi`)pm~|AbWC!Gy5>I>r?o8QYiTO&*4x;;? zb!+7;+%;cnXh!K$n}!yZrQ;3nd)LU*ddh3x??e`^kyKw@AhlmEAFi^FP}HfY4rz=uJ)*p zXq6`nkB&{6QfGldK`>Fau`m@dT8-Znzm#}fhQj`TDO%Dse@`3o7030 zw_cG%yTvt=}2u9{BUQcg*l zQo32A!(%80R*+j>lNi3093teD^p5TyL6-IP<@x=6GABeX8KO+D%gk4iEQz=%mQ9ju zZz_DWxPAX4)cds~d{T6rZu*ixeQ_V2G&kD@&qCAKjQ6I3ySouiQ(Z6*v4@3RR=$Y< zQNN9mfj?S$#3XN=Jqk^r>+Z6+pd2vas`_-Eo(d-N$YUjtduS;<#~9L7n#1xRNuU4CIg2Q+wWpu=6-@+xB|=cL zsAks*%7qg8r$oVZYCsde&W*N5mG!(11}NUsTpo)$>MW2{BH{b{MyCIZ#eI_2$|w2rwyo3@hXK9 zQ2HKz1Vo&349{Kwc}3*U^05au0N;ceA)MvR@GqdJf`I%y&gDV5D?D_IuwhxiZo!k_ z@*tdyciHzsV&9K}6#u^9A6bWrddf!cHsn+Tg_@k@u4r89o&8Cb&wiFA_%-yWpP%#1 zEfjrAN^&wZ;=+XQpWF|B%^ZgAtD-Xu5On^TYzN5yyPg;O!%JZ=&?tSvCzUY6Ec@5c zyK^i;I<|E9>CMEJ^j0TW_Xn)o`0v-%Nr`HSLJeN08t&o*vcBow9gPLUv^=`; zkv%(;)9Xp2c|InI^>&>cv^No;a!+GAtSR3R`?OGJG#ateCvKQl0p`yOA8$MhmsM=u zk~F~*=}OC$61dULXk%2#&w$+mV=N429OI>#IweP+{)AzrvFK-DvfV0VoC{hyt%6avLKx;%gjNA19BrH(Yq2q6(tmR+DqRJ$0W~S2co5fN06;$WIHWYaVQ_r{e(3A8?U#@7KhsTdmwU_tX zUaP+rDq7^Pumv^A4`-WY(SQg$XSDL=j+aMrbI1os=(n17_1p|eL%He(k}k}o-J zaaTb3wdpVDcy=YPPDg~6yui(A^m33~Iqq4YPF<5tC|uC;Vr`X`9Sor57u0aUvCOIc z)w_11{;|eSXCOpr*3mp7R1qx<1&6i)HO*Fb5@{Uf-Guw<70e%e8X#!S&^l1%?i*kw4RGQ3lO0`^1%gtRpA3(Z45ky_?yz8KqhN;1 z6Oe1LCP*ff1W*g$VZws^x}(eQ{MbJNqp*B5yVJ)Qqe8ud(h{u67W7ETygr6m9&Dtc z)zY^g`#!EOOxD3v2XVSN>iXwk+7nzLG@u1*wmq-j+T}a^QD1u)Ph<*Ze^llBr>~ZWl@YhQG*xbMqtfRM z@v-YA%Aa@ngCP^_DpHx^Z#sM%hU=T|z@1aI<{`)GYPtY!U|LPDY@T4P+>8-_$(E_= z=R+_gUt}1B>AF01C`4@0mCgoN-vcIGI?!7&gry{aBVU*mswakClSoB2br`PoV3ENT zv(It_(PT5iw@xW+BgN|4>Rr?9%*%i6kvDFBmGXMO|GgvwcBl@uq8k? z$VCPv-_B8_%H+kR1NxV_S=qy`-L%yon{f}U|7@DsKL(UsnZiPj(817jebVh`S*ssN zn;qy34{q=mLUD6u^WEK&J+s2+25L~VA*L<4mEzJR*BPUHccf6B8z{e|6h{(n zGIu1t-T`tLz+JmP_;G#St52#dw88i!9tA?5osdn&gPUdzWo;>x$Bk-E&Kwyk^OOeyZ)M&kcL=o zCy!!or6EJYAR52GVDI4Qv?hK+C#AV#tjR)J>fp4soPFIU*0skb9+Sx6ZWSj(#6;Q+ zRlym)XeMnZ7nWXpsIGpIyH)WW)7(u+P(qj#+{lUmMWk|hpKiZtHgrlhu)U=3MpYPJ zYBelb|8u>jG^~MTLL|0;{Ca&*z+1bfvX(4V8l&Gm?^t7WR(&=K9oI;%>gd>S_H{|t zxOeS=61ut?l{LIUYl1VB-B-1bubfawE>=>j2q1)KMV9d| zr51ki*w>&hK=J+-^!;Y^^g|5jKgt4y;;k03E2Seg*brpLvxU6dlob_S0wl4Hd%nI7 zoJe@K7^PKy0Uf|J_`bgKC*7YfRC)|M5zHq2`qF#LQiJZU;92Zoz}FY!Yh{eqmi8(1 z(E_7`TVjQ!5Tggot?e^zWFne1vFBZD;ukMUnN$U6(VErlHQ`&FA8&?n$ucoVf#04a z3%r$`L*Q>vH5Bg~+}D@XD^-SeDlHB99_A=^0oq#oiCQ* zcPs^!RZdTc=!-Sg<{aGj$)b=Y!xdqS_b>+E}vC+c2=C69$9?jU=>|!5y#CtSPfcs7L3*7Jeg!k90GCwD{hz&~dLX6h4sVo>){W}ja zdDw!v8HQVGJCRc$NEa#up)RT-gOwG2I*j*;_Wg82!O}Se8~ErVL0+{4KsHqRy8~;O4buSE3SFk$rqa^a25lLE#Yq57&lBdS5h!pXf&nDmf1QHQLe1|KxP!Z z@L`pcS#U7p`*0^O0!t4&>pA_1$nvj9>3`ak9S_yEX5jFM@RcYCRY^!#Pzmx*+coA! zZnMYz9pVjBqvi~(YK@4`NbiW%(|-Y7=fWpH*49NJ;l5C$K&!#7cOdp*3Nqt331>o% zW_W3OYR-YXw+efxvdw_OVCl!%W|S4t%jRvBZ;6jr4=+2p5;Fmb0gA%Sx&>xIl18eb z*uCN*3k<8J=WA&s$ilIXV8QF^U~nPXaNY|$Y{4*EE{nQAN=#-Cd+qV4d2LmGKr#Nw zry#JyZr8$U2j#ND6IMBKRZZP1kGRMU-N%aQqklz=y9MWuu&?}g^3g^TFIt!A4+FMQ zyE5N@0cFDu{XnE($K10$nw_x$*jBuB!aK}wTjHUU!1UJz6`)XUF;=ObALBScS8EQt z0m+uX&-iuqfs4^yFUEBe9Z>ey9_yMXLa)~46O+Ci?}nF`+0{EgakX}M4|A#E(dO{B zi=;jr1Ee9|oNOF*BN(NAJHR(0SUnXD`up(rYPppC{a!tiBoQbG%zT)s<3PyrpTlJ< zf7(77l|HdTn)<%cv!%W(XDxn|F_L$zQPmKN;Dfraw{-PJTg|)(bJ>U<=QxIq%$0VG zMa5Z)O@+wJq6XD2d4m?yvU5L+nKp!T;??M1JNg28HtC!l-souBY2U~iGjQ8pWo1y^ zbwsZ?{c4nE7}WR09K}MX@Em>zNV`Xiq}m-LsI;;_+Vt6UiDch;r%syTp@wcG4BYOu7?KmJ&Sb`{gItWHVf*XD zl@GyaQNE-TD2F+YznG5sZ>C~Y^}m2L0B#Lo@{cVL6hI4dK6*c3Q{r)cC-_Q9@coRB zGD7>f{q-|j7*pbU`NjqHcj65xm#2&kuDvD8aapOlxxaKSRK&OA#G7dpAL`^l;cqi> zgC~&KF+jtkim>fLUNs@QUEQqx6X{R`vFJ|JIUewp6?sjtFh0|+R;2x0%c>eY40ZKx<&ESn#*WZP zBF28p4>SVCPZtCcvE(pij6J*96RKqT>Ly7djPI26Ne{fAWUoxlX=N-=TPR<6@3NYm zJsAs&xA*Stk}WJQ@eF#9=kds`#drRoHVHXW{&9NNi&EL^%R9o@YAb_5EhdQC4p85D z(#oNb9*Z%d1aI0`KbF$JVjTYYxjz;vm!UmlQ1cH@zHcGiZyLC6lot+d;IBIVKOsqe zQ(pV$pZiPObYD@M7XtF%^gb?ZTz*N(0dk&l_fU41UEznCJe=sWZD_*~Guj^AW??A^5;a(XJn`l#TJYpF9BxUhf)S+%n{jppT za(ru#*7`YW@1A_xW0RqqmcwJMuTjT5F=yP!qqZAi50{)3OV@SewR{C|dXqmz4<_QJ3~_cRFiVvBvov622L;3EYB)U#EvP!*;C@^g*w_&0 z?Y;Mes`MnzCVrVJeQ8f+$+M8As6$MtEMyjdW2c0_Au9H-=Ufu|b-R*3%cncsf=w;wE@;dtBx8)z51OZT-^uzktSa@djs}N<4dOcFXNn zr%S+!x?`?~>GZ(enLaBkh|#r*3L5>1;p3nU2}~95txZ1M#Lddy>>R)-vY26`VRNgb z)fA2##0v14x70^#JohrOP;ycY)A`qDEzrtAw>w#c@LQUQ7k%8DdwxqA<8mNN@B(yk z@17(cd4tk_!Xx|)nn3=ibH)7@T0&YnmM$kx(x}!C#wMY=c>~~ zj9Y9SPq$`XHMW`IaOAfwgorY_y;w?p{BpAFAq_&x^N(95b!ZS{?R+&pPk;L0V1GN) zUC_yhz`G4^uib_XJE#qu_e`k00u{ukID81BG+1Iuzzt6G3|kuM<2uLX6_WopPzOqoZDm$YLb(Y5sd0pbsC|rh1g3)7Sd6mlJdOfjC*No-@4qPr% z*&@gLDTAhiH-=kZK$%B}j#ew9?|*@hbAgup-yXV3QcS`$MB6kqShD;39^0tu>=vZjOKVic#Bh@9Qut{gwZ&T0CUf-`U zHqB;~%Pzk^%aRlo6|?_b6l6p8>5ck|HsH`Is85ymR%eFk-J@X4@$3DBZuUc9!q@}1 z7-q|-I|L06Ihm}Q0py*xkR2(>woG)YvHS-MD<>QudMQ2#x)tTo-b8DZMI$}@+G7iW zj0kHfsD7G&21(+AoF!=Ql%CKVpD3)FY4Gk|&HB-j$aOe9eP852O!vrYdQ5Lxx8DnO zyeOx1X(1DwShhxX65HSVe;})bS@3~2zTWCie8yxw@h7r9BYk9Jvn^tqresJ?eCouV zqNJ&{PpzZ=Ex~(Y4@{=ddU?&SI4s~y#uf74d;D4FP_+P@Eq1547aB@qmyW_0QzPuI z-sc1Ex-OkYhF_1n4HqANOW#kNJjbf>iuqePWUE;+0x3vVQaQ#a7Bp+`#pU}oHTqj# zNU{1^qxO+PP8bknDR4u@O#$oIoB``4yN5~rJZ$-H#W3D+X9g@QY4(R?~V2ii&-QoUwy=3wf^v7 z32`V|UfO+msJziVYo(kqp_OffugNyVz!stz6(hr1(Z83LwOOboE>YN*Q}ououwpPo zKL~4UZd^vZELR}G&u#zKY_y=#c{c}7p`+-0*u&XbwJ)H-hBy%G8HV1P>L^Eih6!PG zO7=V-3c>X(ebISuOBuntOPVA&#Rz>lHXWEm9a0VECQ_7#p{|c?pJMJ?g18T6%K|ot zWIwBtjZ8Y86>LlzhIHD_Wn1CMo2@OGpVy!Pk=bAGs{Lcop}8D~{*8}H@1MzP?dO04 zRe3=VGpO~L(@6WUfjk@Y7%!hwxo$!Ui32{LO?vVtB`FJHDVRCJ1Y@4VvpV{D;`h!= z=J+30goyocd)sEzo>m;~-@x?{%VzKIhVD#wJ#Z2s>F^~+sO3%rk`-vuHtFLd;}YBW zPgyA*c*t^Ff@nkKgu9U0;JSLW*j({Tg26_oXVR{H1fd)d{8~CBN$SoygeaSpRoc*V zd@o7%TO9EVR3Wv`ZHI?kt-7`-g#@-9MSzxQa{QO-Rq|I#?Bq;bA>cU6*iz_-w%|fk zr}&eHZ61tN@ro8sPQcU*y&{!tsWtVLs;sxAHyq8N;EfAzc!`mNkv@xtLJ`<|4 zdfRdemr6n}TT-IFX#?$PwzxUMNa@mGvnY&TI~ULID2F79Tao-(XHF%blVi6QC0yr$ zp;iO&juLi#>LYAN|B$RNAWVSNXPR1CW)Mt1Mp0Z8e1G0{{;snn>k$7Hki}b-sngq| z>3QDPc{QwTo`iUX7Vhp|6TZ4@-UZap&1Q$fWP|CGi&(M@wzJjl$Z+rRZ4Uu12g^By zp9R{5c1hF+O$1Y?( zkhKB_uA>J$Ucmu!m&ziu(H>p{FTbQk9g=`K)SDPy)mDWX}4=~-cM^A zlQgrS%)%&Oc!qbihuG3p1r>zMzugyQn{J(GU3?xJxsKNzZq?ODaL&gG*~o#@Ub}>PJ80Gn?ZxnvyZX}*rBT|PFk5V zQiV$TO|;cfc5U{kC(*29vif>BT4!}|kjS3Ee_ffgQ}vFJ>!;vrwyK*zY=mk zruYzND~z4&;Z8XXLUsS+&AT_o?^VAw?jEC#>bqBVq$Nz_aeq3L!u`!>cX`c;HZ#Md zu~l;s-6b|)Zf3pAdXqli8~@mG8vPu%9;n3U$zxT~iQrY9N9aR@Z<(8Ss5g_5?U+65 z+>m%2&v8qrI^GU$m=ZQBU|V*Z`qkF9p2j#~a%}GuGxtE6m*cP=c+_n$WPhxF_xQZE z!#OgFvxQgSA*QW)mSl7DK7P7$>6k|ElYTk|1%rSlT(HGTL@Im3wN-5X+SeNj?G87NY(H1h z)q>m->D*(>6Df#y0q0$~mGZ2-s)c!#!A9^{XfWBGky}Bvtt1=y2x)8eH%3d%u&+5w zrC$>!Gjfg9X#0sO_rJYRgi0bBfL|r3O{&@Y!B(Ci;uoxJeVG#FNzBSfpc#&i5DFY%G}WW0VOnq-yB- zz&PLeV8?U}5aYKek)+-uEy{M8rH6{w4|`t?PzCSxK? zp%3Kecgl`e?iPWKH})$^-+A>LNX)&?FO!$BY(Sq2jB^zT>F8Bm1)w&+&uT8AknN;R z&u`=IG>b;_SV6PrZ2iemfT-bRwpeBzfjq+fsW{*X)ShCuXREoBVa`t3*G=YXK055j;;Y*5}UwXWJLf&EK~G=jP&? zRh=&&>n|WyWxCNXpmd+JzS9l>0QW21i~d8<;MqUdG6EPOuJz(o z{qdm?y;n`wQMV{p@DY~~7Ad;>x9!aoBRhse7j(@17dOc(UNyt{Xm76w5wIyouAyaf zEM(`B8|fqPf=l<2<4I>T<^B_b?Be+UB8m(H$UFRx0zf}16$l3XpA87Xd(%xuIv%^M zcD~mV1Ksk=I+qGsCPF3)xp$kR1Z~j(MLaZqipEu$>w|#XysJ*4Kkc0m-PeSY_%q64 zk^*&A$R|4L><};~@=9HHI2^O`^<8=Xav`2D8)>-|#Q(+F|dtPdPT;JF!nGH>Omd zSC^-(VD^YNzZwge0j56kuDR|_@>sI@ZF0_Q;?Tz12mv81N^{S51-a(ljD|@8$YD(Y z@N3KU!I)K@eKbW|{CWXAmktU6i4&Rz{1EP^JDE<%}jo0+i_unV10D){s8XaX~{-^(FtV*ivfR2l?W1NoTos7y4U_hD#$ zO%(2Pho_NrFZ`zs{YL<#CLqA@pa0NK8}Z>#3zl^RIsXQ~`JeNf{-|x-uku0{2AgT$3raa!)E#=1LZDF9MAi5u;wPC&ob@t`r5)1f_ol{vOQC-dlO|!;w2-Hk}fZF zlT5KZxYwRCux6AByMqE-tGN@7I&D58RTRe!NWW|Uo(jQbFBA@TqPpBz4@~$s~66Nq%Kbu563$F1lU$~h>DU9K7L{e z2p&-F-U9TL$vz(?elMPo5CFM*w+t5euRcq>C@gHerWwV#8MgHDT)^nEa9Ud8Xj|Ln zlX=8yJ;7ao%1*}S@cmBvmEF(qV?tsawZK@JzM=G-TM38 zzf3)(jXdNS#J`>WBk>FREvAOQr@Q)3Wqxm8P7#D|k~Q{lyLn9rE8#+8djv-DRe#;- z?mVpS9h&H!&oxW$&&5w^02%g!C(VGO5r`4ztFn6A5!t82%MzeM1wfYjYoQAfcKy?U z&vNiRl7KA#dQA{8jp6(VxY2~|2+j!oeaYWdm)%pV0HV+u#{5&AJ_{!I3jtf0auH+h zx#j*#e9xa&dIU4>!L2^V`HFrv+k$Y^462xxD9o!^^Vpd76Kj)&MbSKUi#rGQ8^hxx zK1K%XMp3`qFdb>exu`0sK5~~AukS)5cq$q+tH8QTr;`=aR;eq8$ zn_i~aFkeuh@Ueu3QTr-#p^LHMhNMVCrn*Rl_l4Q!4qt@ zi^%20Q&)-Lp1NICkacz(kjk{{W3b6=Ec6@jYS}6W?lv%CfTZ z(AC~n`<#abV=Y7uPv2_atJeb@NU>gN?C^^*3bT^*Ll&~=K(G5YwPAL|E*JnPSPLvV zE5R1dmWjf!sHS_1F@%z6!16;sQm2eb)n0m>aVYZ#!>8PwH<_Cc@zQUZ2e`KotSp=O z*uS6eIC!^ra&-$H@un0J!A%5^U%L<&iG|#U*_+<2XvT$WMEMB3Vuz^fwfQZb_y}Eq zSXhYl1|dCog}O*0dyAsjhJj@;MQA*oZ~7WmZw8}Zs1IIfc~KTP81go#9sGfusZkp+ z80+Mxk1ZR@HM>>mKNBolRL+~Pi8~SvDq@PtmSJGs! z@UfiQ?JJq{9a4T)^2u0(P2+^uL^_k!?a@ip9fzepfRQ3In!A?m=|Z;O3vjuO9X*q7 zLn6`Abg1FxJwvQkf@xD_s_}F_jcB4N_Uhhv21tVBd+%#KdQuOW4I3PlT^}J3O=vwL zu^;BO%`8u9gyZ|9zIxNqI+W;s6B|q)#XnvKb2W0sGCMoqmKK?!ePw@N&M1Gy;VXQ< z>ar$TM`(3e+T#cM#d+m1?5o@N+mUClI41jTv^&PWV8nL78wKC)eL#e|WJo}=!pEFi zRmd@P4*+WfPqvlgQ;%Sjq6;%r9b0EWz%cM|X-z0`W$0@I!1HG0{bFz}Cnxqdh z!T4~kpr77QGUVPnKJM8D+Jf^t4}}`JD6c<;Nb;VO1xbUqFQNdyHoJ*YgEL6ENX`DaRV`jk&?j9sU< zdxQb}5Q|n)Aic-x!%$>1P2HM@KK1w5qXx@;k7Hu5L^M@4*gRlD4y_HKx3yGz?yG10 zk(|o}xIH}5#vLy0@C`$?9F%KizV3Ipcx7RACHqehR(UvI4k=ZJQbLK1HtM1X%*bF-i*du!fYRlQtB@$oDoJQKk$#TzmVj!+vul(Y#292N#ebuirf;K-X?k@kolCgit{#Tl8;}=l3wD?a_ zJ0Sn0=jQ?xKy(1c^RrEmzc*cjMVy~{n1!hWwKphNQk4Vnc;yS*6`T{haAXZWH$1(F z%Uc01tt~Ltb2ezexx?K>SmTAx)8D85|62oe@+t?HPfI$Ojk$nsgT4!KR|q%bhmgU~ zH4UyV{|ZRXzvCKg7LpxZNd=bjao&Ad9mwax#-Cx!w+mOr946zxfNr6{u;%HmE1Fyy z5aYm^0hW4!FP;SKuy?BprT`kQ_wP0x5iZjY03k<=<5w;Jm@4|7)%bt29RFq?E|`W5 z6$8Xt#YpX_VI=%}GnhY9-SNMa0-%BCsknPQ1SoP2(0$+NhKE=3KtUw-;8k8@)Ns<$ z8Ili=S(I|Xtqp3SCV6kAM3WNjo*6+{ookWxq|1t)Cn=Z!k7Pc>us6dc1y*nt+x4cU z)46KNY@s(HAy`EPUfANE-cz=4VNc$GR{knlg~eH}Nwyee@srgYA+xkCdHF{uq_YkP z$Pr?bmSgXtVjTgy=-<*cz%RyTtP(y7mQ0EN#*G`OEa0k}Y z9T^0z_KWqwgyy-pIr-SW$4+3;l>Xo@ky1xgz&phHrM7l`$eaE>X$Yz0;dm&fi|8X? zZsce+6%H0{&2|R|I!V?dwW%J-Thp1DaZwXCw)tD`t(VIOY!qKT|LOPtT35*{v&`^= z@8w@X5Nrx!;{7!rS`z$Q$BI?;#Kq1$=qGe*rn@RbLr;}<#a_0Z#~rY`(XE+3pk9d7 zB?F%CUnngopw5cn^NnoRQ4ouHm7ARzA$|xgK;b1t_~0}-CX|b86#m=WlyG(Vq}bpg z7VuBL?%sf910{x)=gPWCgW{%t>T82{tFd~xEL;o4BWCV@cVnPNxE z`y!Zwrk7ZfPb*{PlU8`M7zf)5-Rtj_h>FjTG_e)APDC8dX(#Z!D`jYl?1H_%d(`cG0%)t3|N>H z7q0dV9$z~}<(3*f14OkCtJa@D`VFF_G@7hY;(5qnV%qQUk%KTJ1+QWHhzt%Yj}+}6 zr8F@bsn$0=JB)3bC*z%Oa1NSyOD4fSt<{=vXw_(b*}-$PJ+ZXC$8C*gx87n7z-0nr zYL=gVh07>i*hoi8jBK;6Y@xiFc%aXmcxX))&?4h`^aABFSLaA<52M|@r}@FZIyzU- z|Eyqa?gkE_it3MpNpd{}_AyeXLYxSM%uItzCuM053e9GhhbkvHd^I#G#DGi?*3BSA zBRDc^Y~0P10gfkCINQYwmC1ACJ(HpZrWN2fFRlyW!=yU2x-0Ln>JLbo7V%b((*-|u z8ylxEve^RSB7Dq2Ixkmi`I88yChgYjC&gExvm>GcHH|`W^zH2;X!9!|BPMRFXO4q2 zK@3MItj$@{c2Tw(shkT-&y0%h6Q(#`+-uWTf6OcfmSLDPcyFQm(F>l9dmU_d0^V7L zPxkDGUwHJ;v*q<9P7RSOk)?+$bnC2Sfq~h`VdusZv=l}cNW3CGzGqDvRR(T`C!OOa z8PWuab^P4&=Cx5WQE6s=&1Jr_WHnw1qC>@6qpFb5;f&or)`>(W+paEKX6ZgAzlS#H zCKBudM(d^wE+?rmHdA5VIO(wbxV5ONQ|d@Upp>aCn>%`(L~rZ3a9Sn@Wr9i`g{jXC zTPdRpOdvs?%BG-BRHQP6ohj7`U`v|WV3xmS76!kW8b=Die~hfk{F3O7b|UFBj?inJ z-I(1C?+z92l~p=uvvkIBArtt$Zr`XrOo#4$8$a;Ydv6V#Rt>%-yu-ts62&}vPjDHh ziK`W-#HF#=YQjR9y+V`TT@K4(!VT?4HBT?`)}1gDvT{GwJX}s3+!!w@{&)K&svWgPlwaKTUc3$jx;V$fhIe-#805w4@bbgSpAvEU4rl5g|%J)7?@X$ zr$gh^P-Bs2#emZ7bCBN!Ot8<^fwiL)K-KfM)2<)#ZacH456_pHC*Fh+$l*uBZHdQ9c080~3sryS5&Yz0FC|Fl9$nbya{xy# zJe&qpnkAl3ARU*J@24O7Z9mM<{0?#tU14_8yH^CbAH_&Z2`?2JQeqCQTv7#%+i8aU2V z>~n&r*Y7Xl?`5corb-kh!-heq0{h#wd2?;{@;WF2HC{)Ls+aFs&suvXJQ5c<3F7=N z<0hXZ!s@q~s|$>JFDD&l5_O)bq&=^5pAS<>>6ahw3_FpmZ65!y?s61zWX)*!)Gh)y zBuZc7t2)e%Sj3AD3Ab+&v0fTFH8ftFoUohWlK7~{m^`c8Pc6v!)0{JzYC7+|H9g?9rE_Rfp|O}l zpm2+)SMRJ!@?FMvDruB?e_N?l<%`vvlCndH5pOOm>2k;Sd^@S^)t%Fw;?Gm)rfbiPrARA&u+%^&(Fh6Lhr^c5 z63cmrum{&Msq19{^Nv}j5C~@4D5Y2&jnLsNVCFmt;&3@%aTi$cJr8OuZCYd~+Oi>M z8lRBj@rx-VF*reV1Y<{$xD``{!)(y+M8UXwc@-9Y)Cv%y*iWDY=JUe5iMMBqVbAvx zW_DheyqepV8e*#p=ignM*oYCiHffI#_p}`UZjXBulT`3-{=Sy7nmYAg??9PA%VfDjc_eJFb<^bu*5x?)0zx1PCWg`KfYyrF{gf0`qeMN38%h@@fls@>@r+VqtWdDj5s`nk<@wAc6=_myHN8Wf37X0IKo3 zG`{0B(_glz_wf3Cwxb16GM_JT04ehyNF$jVurE(AK!5M?3*&LsJ##g1F`^8xzVqoT zARvgbs<2`Quii0g)ipr>hoE^N_%|iPbZyi@_g+|^TK5R zu7n9<{V0dX;q+TvLW3sS#}D~o03i8$9}R(3UZ7=(Q!hmcr4(1O!E=hXse~rE6oYLd z>ETpf9x}7&^1^2)jM*Uuj4%Aih*)mA>mE^IoOlZ7y%`yIG$WlBBSvGtj%+STOt6dO z?O&?xn)dM32uZ32#~HImd7x?B;lpJI{x{Aq+gGGOCS$J3hf8zfxvsiM)`M9|Sw>OF z^A^^x@$H2;x0UohZWZuKk}I#ghPWB@2o6}S$vGqtuAx{9gj7~gqR& z$buleD%DyU;QI%`IdhPq2~J3zyh9!Ys3NL=(ZGz|wJKgvAXt z_`O*Bf|ahCNw^xEoRNJsR<+sil3limNgy^Gg7mn z@Y;9r(I{amut^RLegZNrWe0Ude)u%U`hc%s8Fv_kE@)fiB*e;zjJm#%W9 zZULpnfowN=#%zcSo@$F-wBkxS(rHjt!P<)_J|1juS|sGiOmJUd$cdvg@H8jCN-ze; z?}_S%#Rp3u)`X?5iO-c=TN~Hc#LUf!#+cz$)H#t4DJty!7RB)=_x)$l?|)*xe+{!D zb5-4FU%tD*f@zfWu96IO+m=i^LBqP?G1>;?=*=gPytv~TtJ>{VeR@?6L2N!Vzm|S2 ztJZ)G$Fl)86n7j;b&6z!M--_>HX?`HBQfi5*l$~B_M3C>%c|qVn;P9<;e9b3%I)pw zyRcFmiM}G0Zcbx!7+4*u8n2pz1hG$(8wC(KZ?TR}HP+nYv*{Ul`(dpXu^E>~9Wh4I z_ql560Q~qP3^fTa%F=@3oVcPVI7#}9hV;yL;iNNPp5M=uNH-7aUQ&xnkKt0(c?m|_ah7vTSGCb1=3X-%Xo;P1%5Z`GZr|+c z9ZVIy?wSFh=;JbLkLz!M=T5bBK|(=dhI8+Q{1<@MJ^@8=85-YBacEXf|MS}DE5 zK(dz`LPEkmU$Go}>6$rXulQT+JpT(;oj-N`1;#WJ$aWk?mt?`e21A~#OMy{T6w$V( z^mNAmu26w)Wlb$71QKugQf4Z{CUF@iVi_*dK=4Mt$`-4X`oQ(nWyyvh%(DRr>$R*k z@fUAKj4M1|rd5lfCy=8h`U?`)qYgo#U~-I6oncR~8>6vw(8JG`rJxVlok!-}|Ib0g z|6`Qnbx-t+u{CUYoez_Oq*cT@^)Z3Wjk2gdLA6vK;qn9?;;&wnX^9?nCZog#5cYY` z*vP`IYwL+{kjO?RaiCQZwb!62H5CbW7dL-D>ltNGN+f_=9iFq8kpJKu2{lfN#l-%NM!x$Ww;Q zD|uWkm0eu_4OFj)&Vv=S-~^ezoFO)&L7ysX24UHYl&xezv1>a=Vkd{CbeTaVNcRgr z5-iqp$8F|xwZk`5x!x4xlx@wGa*Q@lwh7puB7G~b=i*?!`>@me^?A8Hb^%OH>D|m{ zNQ60Vc1HQ5ruW5%mcXyvj9iVYId22Jn~{RZM5Dc zz*U#BWd^1b0>7yae*wqil8x@YseGr}Si~J#zc@GmvUpHPq!yQ^JZ!VyU*%Kv(!fpc4D5jCW91Bw~!O1r^zAKT#|B^U^Ol z?y!2Xzrhh6k9%DkKSik;(}#HyBskT0&@6xXcGwTJ>e9$=cNuX$Uur%yTrX&>p<$s$ z?BP@y%7vt!q1&VvG*{P1wqI;vCFewRYaK%4Lp#A1=FjD86YVV*#mOrRM>?*YnP6dh zh%IS9Plpf~@bVC+`@Wr(of%Wm5`ykiCkfd?w5IneW`$~_>T08mMKR27&0Dvprf=Xw zEk-r54~E6S4V0aWI2buNSzAtWienn?cAf~;%)*?%_R5DL{FMu#|6&6fo^)_}9P*29 z9K9Mja14*Ht*zHbvq}Y+h6pVksh#5D#);Cvr-LYdORdS!z7jA{4J;AjeA4E3kh?F^ zUv?IVzh~~{eOZ}+IA{&cMl3-56mID?F|u(@_RjU}1pBFz{)VpXTl7()8`U^?67njM zTXQdRGh8rZ$69SytvA&ArD05Pd-G@P21AtxURzl^pEf+N=O?U99%vFmQf=W~4Cs*X zi(%J<-ct1)Wk{`eF2btyKto$`mt# zPA*^DsSb-s%0(IzO&Oswd(=UJi(hB}Mhwc?6E)XJ|$aFjd zS=Y4Eh?TER?vXSjXC!~t6FnNUdlv^UWIe)%MTv&ONcVGB*uNV7A(;W>cIK zGZrtAxmeu#f#zb7U6ROv9oMt$!bR^Tk$(Mi`RJQg^S?wVLrV63&X`3X{jLc^YMHjX zMR10isxe2crq9~S%COo6j|>#0AIBZVIqB4s45RJxwM1el+w_!F*G;XyENlr5Y!89;-P?DY<7#B3^Gun! zF%u%s?GwQ)QY>Po#V(bGmFP7@`EdKie&mHHU71L3dZF~Vm#sJMQ_jA5p12)xvM!eZ zj+vg5P{lJ=9i>Olyw%^@TRvoiOd; ziQbMZ<^fV_JztZL*wy;LOtm0ztsd20*s0Vv*OxUkoRP<$gpoMHwg?)vAgnZ@CM}Ow z9%gFqRv03Z+kE)jB-H;phvT;p+kVY0=Wi^;zg5Mr zB&q2?$+4t?leYt1x96Rn;*oDyL4~mGih^ zhLqCn0jr= z6t%ZC?)6Gm+6Qry^8NXyv4zo)p7==jwb%qgMF&fr#8kgmAKO<|YlnL-cw{0@x9A$A z$n|%#Gv&*60!?6pxZ2n31Tk&Sc}H%^z^u7DbVFD0T9CoCaN<3MmUe|MD|{J$*ma!t zj)m==6fC%$mbs0I(%CkzW@aR!uwaa@csqe!URB~|aivr~i6XBR4Sb~i-R&5jg=FBT zq|4axE@jUu))Z!ZH)1Do7AJZQjzE-id8B6T7xB=4Yza<-xnz-(|No7W3SfAX?V266TFC;X9uQzaeM?Rn`W`zd zc=P^I@8>odphWfsb@Kz7{4=%Y|NQIs+62Fb4t}wvJ5 zn2S4ELoEa1?{>@5!QX&9>?IuRd5(+9*NZ$4XVjLG@13T+0*3YwGj)t0)~=XhGi+t z%L4gpbm`#w8py|~i3Iay!(BBHkGVF$}|}c=XVcp%$fFi?wsD_DL5dCwDgtBEYVrr&f~R{A@xcx zF$|P`D0Wsn;R3Nf-%(uotDDrnO%cDE)_>`HT+#r+^gbA#fdQAC+(*Dj-~GjV^3}ch z$B!|eYu0JsYSuu;t1nrhF?C-YHBJNq`S63Q)^Zrc8ko!>))&w6GZ2`I$fVY z;efCL7C2dG1hS5Ae{&ruh?zLCyb!Tsjp(dVl8q6|Kg@T>zYY5K`j3w3ivpAddMVC( zkNdwJhdLeRpKTpLqxrW};u!#De94ov9iUa@??e9NSProei{iQ8?ct*}|Jt`8e*G^M zuzi*A`XbKCXQ=sd_0srr3q>M!PgOx;mxYgQbfx4ia%(v?3@ebIuj_oWzIj6ai$Zox z5>rg)Fj&hioL0|N_hD{o=&7DOH|O%AJ)4`gb&F#3S*Cp4GnafTUJq8YDxvR{nj$vS z-o!^!Vi0yBJWu zpnVXO(#r3y+C%4pYpctjn^dKW8*4}6VUq1&qF{is0Rl&i8~MQJo8MRc@mn++NU?wl zz*U3@d=Ti#`o0;34qSJ?aJN3o9l!Als$avWwMby=&TfG@oz3yV>g8P^E zZe9|#DU#+62`rG@nLQ7@M-4sw46xI{Hxeyaq?h>o$U{@;cZqj^4iukNp56s48$VQB z>%7c&=XiKH4R)X);YB3Z+uUkAOZl*E_?OZXg!;&aw>R#ai&$Dso9VcFj!rb;d7bvb z5y^z&nmiRlwjmGimy@9Sh*^+tc4#009@_BS4^>mg4s}NE=zwa|y)KHDCOGtm%9oI?2Ay$>#}6+iYt*}Je^t~W2jV!S}bM8{%mA5Njy z1db6ufo8QHvR4S7K1^U5t$eH)*->5T&#Fd7Ms^Lu(1gzoR{7B>MciaG{o#!kYa=ro zihD2`KDLL5B~WdA6RU!RPEJNH2GpUuBNlG(ZE9K6;s>vD+iiH|MCha1qB{`6$HdVh zs`=LYd5>eYf{>on?7QYv=*o}HKMF6eL1+j@8pL-xRT`a5dCi{1UYMT~qJ#uK5%V;{ zpJHC-?AeGE5+qbmXf|+Rt4v^0@1>~MS*H+hS3FJiuLHb2TU(5IBPP+;)~v6O>D**~ zUQ!HO({mm5jR0X>VF_bG{*%&xN#`9v`xT?aPbLT0=CtYV(RYO!LOTeG0I)BdZp`!mWE2Ut|uAY7SE-CR+;K^XksI1 zjIbIzpuS_pDD`~mb#-K0nqf2~S4^&1$ZGD4B25lbGq@Zp*`TC=UUP@kYUMu1Zcgzl z5i^Gp3#T;Yj|=Kvo5S@2W92xDvaj?skzt}l9J~oWh6mMI-!>e9-DL@|Elc+kr^2O* zJ(iCoP!lOMd(VDqSvE1I!B_jv2sX+Ue||hcdS@}NDn6CbaXo~Qo|$xac?=I`>Ty1X z(`8+m<7FMb(o{`lL+V(taggXeF;9F&HXDVS&^@KvT0dN}WMwB6E;1@M`9KeI4vQ6F zlECy!(~7It2|hfsDz?-SNykx-4oWzcB5pi%qp7)K+*h0d)WWpwaGSU81JIoI*YQ9E`=K}2EZu^2XT3C1+AgtD};O;1w2JIO5AG(!lh zoJu>WWVIzw$@ZLo({i>l&Wd3!8b>%o$xS|lhavJ zrba{m9Ir8q^VcMjzOyF@S9)fq%|&1ewf`@?6a^^L>~D}2yg6Wc_nEMge(hheEWTKw zQePn}a^DCmAa$B=kd>y!E=?gR;axaEN__O{NV^TC%R2}*iE8Si=j83TKd;#TcNBW{o1#l9BzW6| zLr|C)+q5!U9E)OcR7ZHbxu0V><$dfLX?Y6-sz1bij^+IFLRLrYS@?FIgkOmPeb=~Ym;P04 z04Zety)U4;{3*skF|&B{D|O=;xv7D%(zr@0!jdnYVk|&Ue3!PJwk$XFZBy`1x>Bu8 z@?^0vgI>e7?@2ZVhquGp#G7btNHZNr+0s^B2Eg)Tl@AxED#zSE+t-H|RP&E+x?IKh z99Hzi^Xr%l_~% z#23^sjG_A;cTiRa#{r=`{Vjb9PD*Aw`=N2j#L_Z;9L|KAiZ_u;86#Rx>8BTsD*lig*-ZsDjeOFxS)kV`$I;v>s{xL62cIR2|hDDqTd`G#4CXBCuE7KB6 z9v^cnA4Db996a}4xz3Ly24_Hd3_rBvwZrZL2OrZ209E<-^1>f$#{C!Q1<-T}U{B@a zh@pi*yUg4JzpkL#&&Q^H9Sooe>KuHD(b^sH79_)dZ?~6e30T2-)-e|=#@Z@ zndsw&3RUPRuX0)IlStvS{{B3I>>GLFS92(S2?jximT|sz6P}aJIy2E0ZB~wxP75Kb zU&L`-ATVZ;fqW=8mGV{Z=%&>?3hNA^&Ju|n_ik$n;aj%g2;dt$f1x>o|B*$-P>MoSH zEq?7X!SvA>%o=d2>*nSOumuk!hUM}-3!d4D{lK>t;8T!r(SP2|tX@$jpPhEe4_H9~ z#~6TI`o0Y-cJ)E{9glD#R-ZtGF98!;V@FQ@_xU{8T_>~?c*$cQ64}savY*L2jgNOR z;nR`azgdrJE;uglp?eFoy%*9hfjhPt5|zS`)0TbnwKD@X=Uf3}SIEM?qBF-UoFV6t zUz`z<7gvkW!fmI>5KD%@@cNH3d@0JC$SaD_%Uz6*97g94O5{U9tK{!DZ05jP(&J`3 z^xNzs6Ok-9)DG=9E3PlbTMEn^a>rEF*(Td9yQZD`piWvlKvalK>#9H;W7ha_f)8ZL>72wz?RdehR3D49ROAPp;NvW}Ga*r$2qjX@byn4}IMX1s-2)y~ z)VvZ~E?R1s;smWw(_1p&+CjY_N;AT_Whuc5uKC4qGOKEWw)X9ar{Lt4CvYKbcp7J`^nZoK{kE_qX*TXjU)})5PH>d(o(?3@n`tQv4zk?ITK9+=Am6&f@ zIMJ60zpM|;YVnra)*^Lf5vmQH*no`t#vG0L{1u66cVKSSjuapqasibPR!x(3hy zo`{-8-hnCW=3&?LW|zN)|Df0PiAWhB(o9^iTRg665GAn&P3K7S*vV_Swg4_x4J$nX z!zvG>&xc)}jzLk88K$SN+%%T3D&CNLB(FiaWZz1~m9e(}!|7z!`vTtHX65eQD3iK& z-VsuVrN@lwkw6Tkg_<>k;x{6UN8zNJ#L)%&mx-DvY#xm?4W< zdSF__0r^?5z@#A=7eR!@GeC`gUGry`YC^j!YEGW)}dH30nw^BW2u`y3f{}o zOP-na6^W3Q%GVSV8u=N!0N@oOT#uk1&&$r z9r_8h8B45{0h(cykr(WpSGzq@;ZU@8ONM^0l7Wm>PJ%`chbkQi1E%_V@Pc6(mkS?p z#_yyDgPOfzUL0UYVTy;p*Z?N)MCRHBMx)^RGHsg>@K)v|LX)ds|Q z;9Bwx_tGxJ+Jh7EEsNyLGW5Z9e%gpNq-xd`%J97$?1|{h zGhXnLaH`&oFim92k#U4plH+9v?@l*RWz*{48hNWZxJ|@kwPo;h##tHeRK=cA7ySuI z0RXAeJ4-bg5B9mUsqO8&xgNo!?I0ql!pO47xQ=b%Q~Y6?YO1;>My`d^nCf(x@+xfn zTTV&teHYrl)ItcXAv7_ECq=c%btV>f_TkRfHfX<>v$t4H26ePZId@wr2A9z|2ItNA zwq}-9JI^jl^k^R(kBC|K?4~-+a=7DJfiQi?fCv(E%1s1V)RfzG7PDtG#g$8GiZMvx z_esgI>Y@lH1R3gh)67B3D+P?i9u`Tuv3PU#;Q=i|uk%-a(yIBbp!h>!@sFj||D7tj zcRBB~Lg`CZKn&EHg8|n+5m0RYz74dBSX}1bIg;69lP?i%)(t~;>w`E`FY~hQf_xCQpYFxf0fnE)v1Wx5mn23OM znCf)I?@X5;;a&c-aB1%Ey#PO+)ED3e_(*a5@%bZ)bAhOQ5s=29&jJbd zJkW`T*=zO=={STxYoD#}CWt%*s=ZVJ=A2`Vj5d_IlwR-ajUP@2D#i)gYPNESw zLV$U&U4LW8_xi|LH79|1vvR__J)s=c;zwmU9i6-}0nimD*$k(WeJc0=z@ z4}2Rh3CxPLP#fzR8VY*`W2Z-HWsq0?NIwf)QzwW>4;czB1*W$<1sbpyJ0?F4jBj~k z@i^v^hAhxTb*pHEZ%y-#9N7&aKKK{P;~e9xoo=2@5NrkJH-sX>s(nUdA*YdT2kFS6 zbmr^#&lqwui-|3|`Hj?^@w3S6;${f(h>rS-)K!3s^nVr?_dn^#fesz(cPwT;r7<3= zO58xlq0M`0=t9+pI(<;?33sS*HtSPB&h3>#|Z(0JLe|^a9wR$_K z0hyiQW;g7co4w4C%rlpD38z^+6b?DlDgt+E24qQA=3v}ZB^wa}0d7HiN9ESweab#I z49MBNNfCNUdilVK8kzhJ^QDm4Cmt6J2Yiz9SXim1{_ML?5*#+T5iMlh@ux5WCH)N| zefFzZm7$S=juDZthh^BzShzSad2*`WB>m)lZ1;`#=-Xr^@L${|khvc*RKkO+sG`Vw zi~8fxczyCCLVZ$B@Do(qRv0_DfRo{ZdN_Q$Zp-9y{?coWowurq-vPDZEMBOk9a~P;}EQM>e(@k(M$+}3PN|_K0M=&;7?InZZm92uy z=;+t-)P~ov^I|N`eGB&r-9?FJOz^-q!HAfEkdM)lP!Ty!?rYEPToZ$ z%SAOuYM|U|E`GNTj}61bErXYZJikpt?677E9fw);3U7#zDq6icD-v(i{Kk!%)!4?+ z;)?`F8~!$bT;ow4bm@p{Q0yKJSvs$=FO8f6L(#Sg#dxl6_%LocClx2o`sfh&w$^0< zWhWlj7CbQ#0|HWN5+B@9-?ay{7fT^8R#$elRw1^c;Z@nLs+8_t8~XXbsQdmGJDO1P zM98B$V%}}y2fvOUnkgWF=L=^K)pg#*!>u>3eTv;zZzuI?NzEi2J5LyP%lk38Nos0t z!s99)DUOE{)<%ADj1+gQSC?2{7|8iHa2;54AMmQsiO`wpf+0K>Q_?-#Z{9PL7vQng z3dgU#6vl+K=$MmC+ABRHhYEdL<5c^xBvm$iM4=tyNviF!k$^OgH|7%&eh5tA&>dY@ z-uqq{ezUKVh<#`LM|C%B-I_o?AMVvWpw5o_-3el*W}ABSHfEm4JQGY))a_xXcenEP z2pXt|Zoi=(7-)0LWl3V}5sGWTa2A^2P0b^??)5($4vGqSeVZUP!-?YJ;vF=dJfcQB zwF2D%X!+P8)1`Wtxf48_$~bF;1pUxUK64An&Rr3t zCnVzl@k-%D1i?MS%M~gJ{xDJpN|t^mu?*9 z@>6+rA8i-73vaO^iK3F6(lzCsS4sR&ZiGou%!g+@^;*0dng%!aYijx9GK zcX|R=HOr#Y>KG|iCEC~Fyf7s53Dmfm`Xl*cv3I*1W5qd1^M*n6#Q6J4`z5}|A&wV_ zTKAQ;IL?&khD6ZDdRDVxZFPtoebUTwk=+g7 zOJEh`9t%hf(6douyRdJQcY%wDI;lw9qj-|{5NTePt*InnsfPzWVhxwJuvm^)39<-L zpox(@N!;?#FMJJp?`VO?QlS2h(xAbN{uB=ZQKyWQPNK!knQvL*z9MP3@ji+jOBo)mQk-=Bpx~gpD zK9ITf{N8X;$;KmFKT6dakZz=<5*@XM_{WkAvx2qTmbD5KL={z)0bS9(WO-C+>U*>R ze1PDf8tBOV^{$9NUC;05B{_`pj~tSyM-uFG9@#8v-FT7)K!d;iw7O3bN}z3P6weKo z9u#HB6h%+Dv#drzxl0jSh#rH(|`KM1?3P`ipZAos>vb;;-6uxO- zEZ%dMb5-rORSM+rc0qZ>a%W9VgoT^Q%jkY^JUzUK-D}R*Jr;>xI%L z@;YCl`U%dU=`|}?r%FBx0XUIKB$E?2sC)ZBaI=C0uky0p+>Q2~!Tn>bGctFhG_UF5 zkO#kQO1F3LZ>fIpsvqGz1Z!%n6T!1?5`NLw zH9D)q+i+V&^xcyyGBtUzZ@S5oim%;(qp!IZWUJ)Y3wB$oEZwHE;L=YPraqAklF&*i zoB`dw|K5fQ@?awn=Rq3VLB(YwNfw4#0&;o?0~hYn7Re`2g_2u_DLGTky|=a8)#tBC z!R+H?lcJ|i1+IG2XSX%!3{e`_xmvtx3NlHjc|u6yEcJ{;)rz~4oZ2^3Qx01M+s@6n z5f2*=N@F&#?otGa8}2S>vO~2v3>kU{l`w|9C}%<8UPokhK!^JX+<6d(p2=VKfg2p_ zYLFJG?@E!_RvSV2tscw^sMkC0*WBn`Y^Fa3{tk3v`zYn!OqXeIC^un?csquQz~ zjoH4`)?xG)qu{GQ9B^~F(SB>5$51|x=)T-Yd^NIr$fI_oV6k{u>JDt!kM~`cc?})Z zs#;mID5KbPGec>Gf1lCptEceKf0>2;(IxlSZ2y5gl%Y3^WgTQh3TZp}rs)W;27H#E z`jj5`9|CWA-k}gNqBe8;i0LIk!Sim z1$-7IN%16;?M$sR}c6!{tOGGofI2G6*P%$*`(&gD04*(-aV|{ zH=y)Qlo+=jv%Mn=Wyzj ze{NQ=T3Z^NTRljO-rT={?^ZljHUZe=_<$+aA1H0CT!}&d$B$o($A3Lo_SbsX=SDA$ zLF=322Zqsc2CtD@#u%CQ#bz!Yn+inSZ+*yGLohlVt)IF#O_04}YlV0(uKmLXGd!^~ zKC*$Sq$#X=UABS_#UMxQ;V}ccAfnJ{XB#=>Au2UYd|stIxdff)8xC?Z^tT2jXr3x! zb6h0cPLKqGY&P&Qs!OVY#i`MFV)SJpWFbk4+tdzq z^a}=Xv4f%9s2|?Ep`Dlq8tc<}lgSccsDuDR1T4~I7=-?P3U zYAnMfo0fP-Ura7Fi%*P?w&73cZvD2>MLJc^xk$3zJ<&E^oCqJijMHQ52DceBUXb~%95pl8jJ2HC&V|iYM7Z91C_ibZ~21_4OW(;!am_uo4730L*m^d7y zkF* zr>3X~<^4gmAwU5ql!hiT?13Ms3iTRloiXc*0wRsCaJe2EEg5+CF21anD3RraID9dUPW9w?ehlx9atm56bo8UkTp$sR`{LD7XC6FZNpo;pg^+ z{vJ{BL%L)gAQ&J<_>w=~PCNR6y7Of+4*5J8|3%`{w~Enkm?Y4OdjqUjyT<)nazme2 z7{9vHq)3buXIKp!Hy=IXOC&=1mHR~f%`bZQZ%gR$pT-M&wYG`9LUN6f3*pg%=O%4A z309%Bf7EXNRlG1e$-Z24q!U2U3jVD|tzZI!y?gQ`p(}%22q> zbgZFE$ujnHA31Pf4XTTirLu>I27!*?qReSmJ=NyKod&J&vD%&>`Wuohkw*xA0vW2X zNrbJihEqun-?1Xq2x)gUG@GSIj~kX~vq#+Izu-9?+FNlZ8hw9c*RmsFncoRf@Lyn8 zMHM!OUmt<6jxxjYvSYCYu5?r{R^gkb#u8((@_N;@GwB~HXZF%M0y4>Zi;En}bDve`8@1aK znZoWwc2pIY+^JmufHGcrxcB;QsQ9~hJFH;Vlze@Jb9-8~JEeCR&*jYdTk$3EyP7Tg zwfx%$?KioOfKxF3%0K8IC|&)GW$DMQKEHMQF9kB|7g3F1MK5IDV(2B`5yV{m+fxaE zrv7@~(g(EDS6*1Na?v1mBdr{_nN(Bgs-Ng8f%=bvTz}-h|M8S6?DaPi5UtfWJkXbE zG@B_f34rJoXstRV6)o*97>!H!HAOzWA)=kotUlCNF9WpGJOGax$P2BvX^yacX#{}E z=M{P3ebiMg5ig3|&PziJeH{uBs0Oxzj-upa#H>D$`TaRQv-D&HHpv?OBxHN?fg~unv5Lt2rSe}7W%~Ql^P3rq|1m=m z6zit|?YR8)vYX)zk=FHN^O^jErJm zo=l|v0J%XCk&Ou1>`?hA{-x?#f{Su=0K=q+XHG2MOHuwUf!h!vx)W#>PMyE=sQ;pQ z)W7pG_IuVfpWpMx5^(>6h3Zc&Uay|J`Bw)5{?~j~$GkGRtF=x;?%GLw4c$Z9iqEzr zTN*b(VpQt`MeXw%R2p@q8||VwF4nq9j{voU3ug*K;95fT)oE2c(kLta?pxR{+m{U8 zU+ty($LQUEc$=aEA?Vzc#T~6DgFH4?j;l}&A<(f_AY>LCG=d^J?P77yyVJ#rSSsB)X3H>{DCxAs#GdI6ezAU`OP`sc zYj^PO@4y!N@aJ75xvpI6va#%mm@%-&z_)H9M}N=z{*DO9@fFQ5E5SV^oJtF{icV`o zi6wOS=B77RR_Q7BL=heiy#U!u_SzKTrX^c9|IQwGdWlOK&PdlM$AxqW3a9*beB>cf z&5~FCUqp%R>dm&d4Bn=GH1x?)Ww|F#FHcne1jl;pJMrc6_X4(?0>4Y z_W#Qy==WYdIluci-app-daed +

    + +

    +

    + A Linux high-performance transparent proxy solution based on eBPF. +

    + +----------- + + +## Build on OpenWrt official 24.10/SnapShots + +### 1. Get Source +```bash +git clone https://github.com/QiuSimons/luci-app-daed package/dae +``` +- get the libcron +```bash +mkdir -p Package/libcron && wget -O Package/libcron/Makefile https://raw.githubusercontent.com/immortalwrt/packages/refs/heads/master/libs/libcron/Makefile +``` + +### 2. Install dependencies, refer to https://apt.llvm.org + +```bash +apt-get update +apt-get install -y clang-15 llvm-15 npm +``` + +### 3. Change OpenWrt Source (Requirements for DAE to work) + +- Enable eBPF support, add content to: `.config` + ``` + CONFIG_DEVEL=y + CONFIG_KERNEL_DEBUG_INFO=y + CONFIG_KERNEL_DEBUG_INFO_REDUCED=n + CONFIG_KERNEL_DEBUG_INFO_BTF=y + CONFIG_KERNEL_CGROUPS=y + CONFIG_KERNEL_CGROUP_BPF=y + CONFIG_KERNEL_BPF_EVENTS=y + CONFIG_BPF_TOOLCHAIN_HOST=y + CONFIG_KERNEL_XDP_SOCKETS=y + CONFIG_PACKAGE_kmod-xdp-sockets-diag=y + ``` + +### 4. Build luci-app-daed + +```bash +make menuconfig # choose LUCI -> Applications -> luci-app-daed +make package/dae/luci-app-daed/compile V=s # build luci-app-daed +``` + + +## Preview +

    + + +

    diff --git a/luci-app-daed/luci-app-daed/Makefile b/luci-app-daed/luci-app-daed/Makefile new file mode 100644 index 00000000..d83938c0 --- /dev/null +++ b/luci-app-daed/luci-app-daed/Makefile @@ -0,0 +1,15 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-daed +PKG_VERSION:=1.2 +PKG_RELEASE:=1 + +LUCI_TITLE:=LuCI Support for DAED +LUCI_DEPENDS:=+daed +curl +libcron +zoneinfo-asia +luci-compat +LUCI_PKGARCH:=all + +define Package/$(PKG_NAME)/conffiles +endef + +include $(TOPDIR)/feeds/luci/luci.mk +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-daed/luci-app-daed/luasrc/controller/daed.lua b/luci-app-daed/luci-app-daed/luasrc/controller/daed.lua new file mode 100644 index 00000000..29e9e1f6 --- /dev/null +++ b/luci-app-daed/luci-app-daed/luasrc/controller/daed.lua @@ -0,0 +1,34 @@ +local sys = require "luci.sys" +local http = require "luci.http" + +module("luci.controller.daed", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/daed") then + return + end + + entry({"admin", "services", "daed"}, alias("admin", "services", "daed", "setting"),_("DAED"), 58).dependent = true + entry({"admin", "services", "daed", "setting"}, cbi("daed/basic"), _("Base Setting"), 1).leaf=true + entry({"admin", "services", "daed", "daed"}, template("daed/daed"), _("Dashboard"), 2).leaf = true + entry({"admin", "services", "daed", "log"}, cbi("daed/log"), _("Logs"), 3).leaf = true + entry({"admin", "services", "daed_status"}, call("act_status")) + entry({"admin", "services", "daed", "get_log"}, call("get_log")).leaf = true + entry({"admin", "services", "daed", "clear_log"}, call("clear_log")).leaf = true +end + +function act_status() + local sys = require "luci.sys" + local e = { } + e.running = sys.call("pidof daed >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function get_log() + http.write(sys.exec("cat /var/log/daed/daed.log")) +end + +function clear_log() + sys.call("true > /var/log/daed/daed.log") +end diff --git a/luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/basic.lua b/luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/basic.lua new file mode 100644 index 00000000..29ef2d17 --- /dev/null +++ b/luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/basic.lua @@ -0,0 +1,62 @@ +local m, s ,o + +m = Map("daed") +m.title = translate("DAED") +m.description = translate("DAE is a Linux high-performance transparent proxy solution based on eBPF, And DAED is a modern dashboard for dae.") + +m:section(SimpleSection).template = "daed/daed_status" + +s = m:section(TypedSection, "daed", translate("Global Settings")) +s.addremove = false +s.anonymous = true + +o = s:option(Flag,"enabled",translate("Enable")) +o.default = 0 + +enable = s:option(Flag, "subscribe_auto_update", translate("Enable Auto Subscribe Update")) +enable.rmempty = false + +o = s:option(Value, "daed_username", translate("Username")) +o.default = Username +o.password = true +o:depends('subscribe_auto_update', '1') + +o = s:option(Value, "daed_password", translate("Password")) +o.default = Password +o.password = true +o:depends('subscribe_auto_update', '1') + +o = s:option(ListValue, "subscribe_update_week_time", translate("Update Cycle")) +o:value("*", translate("Every Day")) +o:value("1", translate("Every Monday")) +o:value("2", translate("Every Tuesday")) +o:value("3", translate("Every Wednesday")) +o:value("4", translate("Every Thursday")) +o:value("5", translate("Every Friday")) +o:value("6", translate("Every Saturday")) +o:value("7", translate("Every Sunday")) +o.default = "*" +o:depends('subscribe_auto_update', '1') + +update_time = s:option(ListValue, "subscribe_update_day_time", translate("Update Time (Every Day)")) +for t = 0, 23 do + update_time:value(t, t..":00") +end +update_time.default = 0 +update_time:depends('subscribe_auto_update', '1') + +o = s:option(Value, "log_maxbackups", translate("Logfile retention count")) +o.default = 1 + +o = s:option(Value, "log_maxsize", translate("Logfile Max Size (MB)")) +o.default = 5 + +o = s:option(Value, "listen_addr",translate("Set the DAED listen address")) +o.default = '0.0.0.0:2023' + +m.apply_on_parse = true +m.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/daed restart") +end + +return m diff --git a/luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/log.lua b/luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/log.lua new file mode 100644 index 00000000..fca66fc4 --- /dev/null +++ b/luci-app-daed/luci-app-daed/luasrc/model/cbi/daed/log.lua @@ -0,0 +1,5 @@ +m = Map("daed") + +m:append(Template("daed/daed_log")) + +return m diff --git a/luci-app-daed/luci-app-daed/luasrc/view/daed/daed.htm b/luci-app-daed/luci-app-daed/luasrc/view/daed/daed.htm new file mode 100644 index 00000000..ce8e363f --- /dev/null +++ b/luci-app-daed/luci-app-daed/luasrc/view/daed/daed.htm @@ -0,0 +1,32 @@ +<%+header%> +<% + local running = luci.sys.exec("pgrep -x /usr/bin/daed") +%> +<% if tonumber(running) ~= nil then %> +
    + +
    + +<% else %> + +
    + +

    <%:DAED is not running%>

    +

    <%:Please start the DAED service first and try again%>

    +
    +<% end -%> + +<%+footer%> diff --git a/luci-app-daed/luci-app-daed/luasrc/view/daed/daed_log.htm b/luci-app-daed/luci-app-daed/luasrc/view/daed/daed_log.htm new file mode 100644 index 00000000..7016dc32 --- /dev/null +++ b/luci-app-daed/luci-app-daed/luasrc/view/daed/daed_log.htm @@ -0,0 +1,33 @@ + +
    + + +
    diff --git a/luci-app-daed/luci-app-daed/luasrc/view/daed/daed_status.htm b/luci-app-daed/luci-app-daed/luasrc/view/daed/daed_status.htm new file mode 100644 index 00000000..457efedc --- /dev/null +++ b/luci-app-daed/luci-app-daed/luasrc/view/daed/daed_status.htm @@ -0,0 +1,24 @@ + + +
    +

    + <%:Collecting data...%> +

    +
    diff --git a/luci-app-daed/luci-app-daed/po/zh_Hans/daed.po b/luci-app-daed/luci-app-daed/po/zh_Hans/daed.po new file mode 100644 index 00000000..22745510 --- /dev/null +++ b/luci-app-daed/luci-app-daed/po/zh_Hans/daed.po @@ -0,0 +1,59 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "DAED" +msgstr "DAED" + +msgid "DAE is a Linux high-performance transparent proxy solution based on eBPF, And DAED is a modern dashboard for dae." +msgstr "DAE是一个基于eBPF的Linux高性能透明代理解决方案,而DAED是DAE的管理面板。" + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Dashboard" +msgstr "仪表板" + +msgid "Logs" +msgstr "日志" + +msgid "Clear logs" +msgstr "清空日志" + +msgid "RUNNING" +msgstr "运行中" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "Collecting data..." +msgstr "收集数据..." + +msgid "Logfile retention count" +msgstr "日志文件保留数量" + +msgid "Logfile Max Size (MB)" +msgstr "日志文件大小(MB)" + +msgid "Set the DAED listen address" +msgstr "设置监听地址" + +msgid "DAED is not running" +msgstr "DAED 未运行" + +msgid "Please start the DAED service first and try again" +msgstr "请先启动 DAED 服务后重试" + +msgid "Enable Auto Subscribe Update" +msgstr "启用订阅自动更新" + +msgid "Update Cycle" +msgstr "更新周期" + +msgid "Update Time (Every Day)" +msgstr "更新时间(每天)" + +msgid "Username" +msgstr "用户名" + +msgid "Password" +msgstr "密码" diff --git a/luci-app-daed/luci-app-daed/root/etc/daed/daed_sub.sh b/luci-app-daed/luci-app-daed/root/etc/daed/daed_sub.sh new file mode 100755 index 00000000..1ce9e540 --- /dev/null +++ b/luci-app-daed/luci-app-daed/root/etc/daed/daed_sub.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +USERNAME=$(uci -q get daed.config.daed_username) +PASSWORD=$(uci -q get daed.config.daed_password) +PORT=$(echo "$(uci -q get daed.config.listen_addr)" | grep -oE '[0-9]+$' | sed -n '1p') +GRAPHQL_URL="http://127.0.0.1:"$PORT"/graphql" +CRON_FILE="/etc/crontabs/root" +RANDOM_SEED=$RANDOM +RANDOM_NUM=$((RANDOM_SEED % 10 + 1)) + +login() { + LOGIN=$(curl -s -X POST -H "Content-Type: application/json" -d '{"query":"query Token($username: String!, $password: String!) {\n token(username: $username, password: $password)\n}","variables":{"username":"'"$USERNAME"'","password":"'"$PASSWORD"'"}}' $GRAPHQL_URL) + JSON=${LOGIN#\"} + JSON=${LOGIN%\"} + TOKEN=$(echo $JSON | sed -n 's/.*"token":"\([^"]*\)".*/\1/p') +} + +update_subscription() { + SUBSCRIPTION_ID_LIST=$(curl -s -X POST -H "Authorization: $TOKEN" -d '{"query": "query Subscriptions {\n subscriptions {\nid\ntag\nstatus\nlink\ninfo\nupdatedAt\nnodes {\nedges {\nid\nname\nprotocol\nlink\n}\n}\n}\n}", "operationName": "Subscriptions"}' $GRAPHQL_URL | grep -o '"id":"[^"]*","tag"' | grep -o 'id":"[^"]*' | grep -o '[^"]*$') + echo "$SUBSCRIPTION_ID_LIST" | while read -r id; do + curl -X POST -H "Authorization: $TOKEN" -d '{"query":"mutation UpdateSubscription($id: ID!) {\n updateSubscription(id: $id) {\n id\n }\n}","variables":{"id":"'"$id"'"},"operationName":"UpdateSubscription"}' $GRAPHQL_URL + done +} + +reload() { + curl -X POST -H "Authorization: $TOKEN" -d '{"query":"mutation Run($dry: Boolean!) {\n run(dry: $dry)\n}","variables":{"dry":false},"operationName":"Run"}' $GRAPHQL_URL +} + +resetcron() { + touch $CRON_FILE + sed -i '/daed_sub.sh/d' $CRON_FILE 2>/dev/null + [ "$(uci -q get daed.config.subscribe_auto_update)" -eq 1 ] && echo "${RANDOM_NUM} $(uci -q get daed.config.subscribe_update_day_time) * * $(uci -q get daed.config.subscribe_update_week_time) /etc/daed/daed_sub.sh >/dev/null 2>&1" >>$CRON_FILE + crontab $CRON_FILE +} + +login && update_subscription && reload && resetcron diff --git a/luci-app-daed/luci-app-daed/root/etc/hotplug.d/iface/98-daed b/luci-app-daed/luci-app-daed/root/etc/hotplug.d/iface/98-daed new file mode 100755 index 00000000..3489a39b --- /dev/null +++ b/luci-app-daed/luci-app-daed/root/etc/hotplug.d/iface/98-daed @@ -0,0 +1,22 @@ +#!/bin/sh + +[ "${ACTION}" = "ifup" ] || exit 0 + +DEVICE=$(logread | grep "link is up" | tail -n 1 | awk -F "'" '{print $2}') +DEVICE_TYPE=$(ip link show dev "$DEVICE") + +case "$DEVICE_TYPE" in + *"link/ether"*) + ( + LOCK_FILE="/tmp/lock/daed_hotplug_lock" + if [ -f "$LOCK_FILE" ]; then + exit 1 + else + echo $$ > "$LOCK_FILE" 2>/dev/null + trap 'rm -f "$LOCK_FILE"' EXIT + sleep 60 + /etc/init.d/daed restart 2>&1 + fi + ) & + ;; +esac diff --git a/luci-app-daed/luci-app-daed/root/etc/init.d/luci_daed b/luci-app-daed/luci-app-daed/root/etc/init.d/luci_daed new file mode 100755 index 00000000..cfba863c --- /dev/null +++ b/luci-app-daed/luci-app-daed/root/etc/init.d/luci_daed @@ -0,0 +1,45 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2023 Tianling Shen + +USE_PROCD=0 +START=98 + +CONF="daed" +PROG="/usr/bin/daed" +LOG="/var/log/daed/daed.log" +CRON_FILE="/etc/crontabs/root" +RANDOM_SEED=$RANDOM +RANDOM_NUM=$((RANDOM_SEED % 10 + 1)) + +setcron() { + touch $CRON_FILE + sed -i '/daed_sub.sh/d' $CRON_FILE 2>/dev/null + [ "$(uci -q get daed.config.subscribe_auto_update)" -eq 1 ] && echo "${RANDOM_NUM} $(uci -q get daed.config.subscribe_update_day_time) * * $(uci -q get daed.config.subscribe_update_week_time) /etc/daed/daed_sub.sh >/dev/null 2>&1" >>$CRON_FILE + crontab $CRON_FILE +} + +delcron() { + sed -i '/daed_sub.sh/d' $CRON_FILE 2>/dev/null + crontab $CRON_FILE +} + +start_service() { + [ -f "/etc/init.d/daed" ] && grep -q "DAE_LOCATION_ASSET" "/etc/init.d/daed" || sed -i '/run/i\ procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray"' "/etc/init.d/daed" + config_load "$CONF" + + local enabled + config_get_bool enabled "config" "enabled" "0" + if [ "$enabled" -eq 0 ]; then + delcron + return 1 + fi + setcron +} + +stop_service() { + delcron +} + +service_triggers() { + procd_add_reload_trigger "$CONF" +} diff --git a/luci-app-daed/luci-app-daed/root/usr/share/rpcd/acl.d/luci-app-daed.json b/luci-app-daed/luci-app-daed/root/usr/share/rpcd/acl.d/luci-app-daed.json new file mode 100644 index 00000000..8fc50b82 --- /dev/null +++ b/luci-app-daed/luci-app-daed/root/usr/share/rpcd/acl.d/luci-app-daed.json @@ -0,0 +1,11 @@ +{ + "luci-app-daed": { + "description": "Grant UCI access for luci-app-daed", + "read": { + "uci": [ "daed" ] + }, + "write": { + "uci": [ "daed" ] + } + } +}