From 1689d582e1376965115f64a38586dddca03facb4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 12:20:17 +0800 Subject: [PATCH] update 2024-02-29 12:20:17 --- .../Makefile | 0 .../README.md | 0 .../luasrc/controller/chatgpt-web.lua | 0 .../luasrc/model/cbi/chatgpt-web.lua | 0 .../luasrc/model/cbi/chatgpt.lua | 0 .../luasrc/view/chatgpt-web.htm | 0 .../po/zh-cn/chatgpt-web.po | 0 .../po/zh_Hans/chatgpt-web.po | 0 .../root/etc/config/chatgpt-web | 0 .../rpcd/acl.d/luci-app-chatgpt-web.json | 0 .../luci-static/chatgpt-web/chatgpt-web.css | 0 .../chatgpt-web/github-markdown-light.min.css | 0 .../luci-static/chatgpt-web/github.min.css | 0 .../luci-static/chatgpt-web/highlight.min.js | 0 .../www/luci-static/chatgpt-web/katex.min.css | 0 .../www/luci-static/chatgpt-web/katex.min.js | 0 .../markdown-it-link-attributes.min.js | 0 .../chatgpt-web/markdown-it.min.js | 0 .../mobile-drag-drop3.0.0-rc.0.min.js | 0 .../mobile-drag-drop3.0.0-rc.0default.css | 0 .../www/luci-static/chatgpt-web/notyf.min.css | 0 .../www/luci-static/chatgpt-web/notyf.min.js | 0 .../chatgpt-web/prompts-zh-TW.json | 0 .../luci-static/chatgpt-web/prompts-zh.json | 0 .../www/luci-static/chatgpt-web/texmath.css | 0 .../www/luci-static/chatgpt-web/texmath.js | 0 .../www/luci-static/chatgpt-web/user/boy.jpg | Bin .../www/luci-static/chatgpt-web/user/boy2.jpg | Bin .../www/luci-static/chatgpt-web/user/boy3.jpg | Bin .../luci-static/chatgpt-web/user/cartoon.jpg | Bin .../chatgpt-web/user/cartoonboy.jpg | Bin .../chatgpt-web/user/cartoonboy2.jpg | Bin .../chatgpt-web/user/cartoongirl.jpg | Bin .../chatgpt-web/user/cartoongirl2.jpg | Bin .../chatgpt-web/user/cartoongirl3.jpg | Bin .../www/luci-static/chatgpt-web/user/dog.jpg | Bin .../www/luci-static/chatgpt-web/user/girl.jpg | Bin .../luci-static/chatgpt-web/user/girl2.jpg | Bin .../luci-static/chatgpt-web/user/girl3.jpg | Bin luci-app-eqosplus/Makefile | 26 + luci-app-eqosplus/README.md | 107 + .../luasrc/controller/eqosplus.lua | 16 + .../luasrc/model/cbi/eqosplus.lua | 105 + .../luasrc/view/eqosplus/eqosplus.htm | 3 + .../luasrc/view/eqosplus/index.htm | 12 + luci-app-eqosplus/po/zh-cn/eqosplus.po | 61 + luci-app-eqosplus/po/zh_Hans | 1 + luci-app-eqosplus/root/etc/config/eqosplus | 27 + luci-app-eqosplus/root/etc/init.d/eqosplus | 54 + .../root/etc/uci-defaults/luci-eqosplus | 13 + luci-app-eqosplus/root/usr/bin/eqosplus | 242 + luci-app-eqosplus/root/usr/sbin/eqosplusctrl | 56 + .../share/rpcd/acl.d/luci-app-eqosplus.json | 11 + luci-app-eqosplus/界面.png | Bin 0 -> 598653 bytes luci-app-netdata/Makefile | 12 +- luci-app-netdata/README.md | 108 +- .../luasrc/controller/netdata.lua | 22 +- .../luasrc/model/cbi/netdata/netdata.lua | 25 + luci-app-netdata/luasrc/model/cgi/netdate.lua | 25 - luci-app-netdata/luasrc/view/netdata.htm | 33 + .../luasrc/view/netdata/netdata.htm | 16 - .../luasrc/view/netdata_status.htm | 25 + luci-app-netdata/po/zh-cn/netdata.po | 27 + luci-app-netdata/po/zh_Hans | 1 - luci-app-netdata/po/zh_Hans/netdata.po | 32 + luci-app-netdata/root/etc/config/netdata | 6 + .../root/etc/netdata/apps_groups.conf | 314 - luci-app-netdata/root/etc/netdata/ebpf.conf | 7 - .../root/etc/netdata/exporting.conf | 88 - .../root/etc/netdata/netdata.conf | 32 - luci-app-netdata/root/etc/netdata/stream.conf | 205 - .../root/etc/uci-defaults/40_luci-app-netdata | 5 +- .../root/usr/share/netdata/webcn/dashboard.js | 24 +- .../usr/share/netdata/webcn/dashboard_info.js | 1996 ++- .../root/usr/share/netdata/webcn/index.html | 4 +- .../root/usr/share/netdata/webcn/main.js | 59 +- .../root/usr/share/netdata/webcn/netdata | 6 + .../root/usr/share/netdata/webcn/netdata.conf | 52 + .../root/usr/share/netdata/webcn/netdata.init | 46 + luci-app-netdata/web/dashboard.js | 10377 ---------------- luci-app-netdata/web/dashboard_info.js | 6409 ---------- luci-app-netdata/web/index.html | 16 - luci-app-netdata/web/main.js | 5159 -------- 83 files changed, 2104 insertions(+), 23761 deletions(-) rename {chatgpt-web => luci-app-chatgpt-web}/Makefile (100%) rename {chatgpt-web => luci-app-chatgpt-web}/README.md (100%) rename {chatgpt-web => luci-app-chatgpt-web}/luasrc/controller/chatgpt-web.lua (100%) rename {chatgpt-web => luci-app-chatgpt-web}/luasrc/model/cbi/chatgpt-web.lua (100%) rename {chatgpt-web => luci-app-chatgpt-web}/luasrc/model/cbi/chatgpt.lua (100%) rename {chatgpt-web => luci-app-chatgpt-web}/luasrc/view/chatgpt-web.htm (100%) rename {chatgpt-web => luci-app-chatgpt-web}/po/zh-cn/chatgpt-web.po (100%) rename {chatgpt-web => luci-app-chatgpt-web}/po/zh_Hans/chatgpt-web.po (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/etc/config/chatgpt-web (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/usr/share/rpcd/acl.d/luci-app-chatgpt-web.json (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/chatgpt-web.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/github-markdown-light.min.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/github.min.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/highlight.min.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/katex.min.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/katex.min.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/markdown-it-link-attributes.min.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/markdown-it.min.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0.min.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0default.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/notyf.min.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/notyf.min.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/prompts-zh-TW.json (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/prompts-zh.json (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/texmath.css (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/texmath.js (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/boy.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/boy2.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/boy3.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/cartoon.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/cartoonboy.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/cartoonboy2.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/cartoongirl.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/cartoongirl2.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/cartoongirl3.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/dog.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/girl.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/girl2.jpg (100%) rename {chatgpt-web => luci-app-chatgpt-web}/root/www/luci-static/chatgpt-web/user/girl3.jpg (100%) create mode 100644 luci-app-eqosplus/Makefile create mode 100644 luci-app-eqosplus/README.md create mode 100644 luci-app-eqosplus/luasrc/controller/eqosplus.lua create mode 100644 luci-app-eqosplus/luasrc/model/cbi/eqosplus.lua create mode 100644 luci-app-eqosplus/luasrc/view/eqosplus/eqosplus.htm create mode 100644 luci-app-eqosplus/luasrc/view/eqosplus/index.htm create mode 100644 luci-app-eqosplus/po/zh-cn/eqosplus.po create mode 100644 luci-app-eqosplus/po/zh_Hans create mode 100644 luci-app-eqosplus/root/etc/config/eqosplus create mode 100644 luci-app-eqosplus/root/etc/init.d/eqosplus create mode 100644 luci-app-eqosplus/root/etc/uci-defaults/luci-eqosplus create mode 100644 luci-app-eqosplus/root/usr/bin/eqosplus create mode 100644 luci-app-eqosplus/root/usr/sbin/eqosplusctrl create mode 100644 luci-app-eqosplus/root/usr/share/rpcd/acl.d/luci-app-eqosplus.json create mode 100644 luci-app-eqosplus/界面.png create mode 100644 luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua delete mode 100644 luci-app-netdata/luasrc/model/cgi/netdate.lua create mode 100644 luci-app-netdata/luasrc/view/netdata.htm delete mode 100644 luci-app-netdata/luasrc/view/netdata/netdata.htm create mode 100644 luci-app-netdata/luasrc/view/netdata_status.htm delete mode 120000 luci-app-netdata/po/zh_Hans create mode 100644 luci-app-netdata/po/zh_Hans/netdata.po create mode 100644 luci-app-netdata/root/etc/config/netdata delete mode 100644 luci-app-netdata/root/etc/netdata/apps_groups.conf delete mode 100644 luci-app-netdata/root/etc/netdata/ebpf.conf delete mode 100644 luci-app-netdata/root/etc/netdata/exporting.conf delete mode 100644 luci-app-netdata/root/etc/netdata/netdata.conf delete mode 100644 luci-app-netdata/root/etc/netdata/stream.conf create mode 100644 luci-app-netdata/root/usr/share/netdata/webcn/netdata create mode 100644 luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf create mode 100755 luci-app-netdata/root/usr/share/netdata/webcn/netdata.init delete mode 100644 luci-app-netdata/web/dashboard.js delete mode 100644 luci-app-netdata/web/dashboard_info.js delete mode 100644 luci-app-netdata/web/index.html delete mode 100644 luci-app-netdata/web/main.js diff --git a/chatgpt-web/Makefile b/luci-app-chatgpt-web/Makefile similarity index 100% rename from chatgpt-web/Makefile rename to luci-app-chatgpt-web/Makefile diff --git a/chatgpt-web/README.md b/luci-app-chatgpt-web/README.md similarity index 100% rename from chatgpt-web/README.md rename to luci-app-chatgpt-web/README.md diff --git a/chatgpt-web/luasrc/controller/chatgpt-web.lua b/luci-app-chatgpt-web/luasrc/controller/chatgpt-web.lua similarity index 100% rename from chatgpt-web/luasrc/controller/chatgpt-web.lua rename to luci-app-chatgpt-web/luasrc/controller/chatgpt-web.lua diff --git a/chatgpt-web/luasrc/model/cbi/chatgpt-web.lua b/luci-app-chatgpt-web/luasrc/model/cbi/chatgpt-web.lua similarity index 100% rename from chatgpt-web/luasrc/model/cbi/chatgpt-web.lua rename to luci-app-chatgpt-web/luasrc/model/cbi/chatgpt-web.lua diff --git a/chatgpt-web/luasrc/model/cbi/chatgpt.lua b/luci-app-chatgpt-web/luasrc/model/cbi/chatgpt.lua similarity index 100% rename from chatgpt-web/luasrc/model/cbi/chatgpt.lua rename to luci-app-chatgpt-web/luasrc/model/cbi/chatgpt.lua diff --git a/chatgpt-web/luasrc/view/chatgpt-web.htm b/luci-app-chatgpt-web/luasrc/view/chatgpt-web.htm similarity index 100% rename from chatgpt-web/luasrc/view/chatgpt-web.htm rename to luci-app-chatgpt-web/luasrc/view/chatgpt-web.htm diff --git a/chatgpt-web/po/zh-cn/chatgpt-web.po b/luci-app-chatgpt-web/po/zh-cn/chatgpt-web.po similarity index 100% rename from chatgpt-web/po/zh-cn/chatgpt-web.po rename to luci-app-chatgpt-web/po/zh-cn/chatgpt-web.po diff --git a/chatgpt-web/po/zh_Hans/chatgpt-web.po b/luci-app-chatgpt-web/po/zh_Hans/chatgpt-web.po similarity index 100% rename from chatgpt-web/po/zh_Hans/chatgpt-web.po rename to luci-app-chatgpt-web/po/zh_Hans/chatgpt-web.po diff --git a/chatgpt-web/root/etc/config/chatgpt-web b/luci-app-chatgpt-web/root/etc/config/chatgpt-web similarity index 100% rename from chatgpt-web/root/etc/config/chatgpt-web rename to luci-app-chatgpt-web/root/etc/config/chatgpt-web diff --git a/chatgpt-web/root/usr/share/rpcd/acl.d/luci-app-chatgpt-web.json b/luci-app-chatgpt-web/root/usr/share/rpcd/acl.d/luci-app-chatgpt-web.json similarity index 100% rename from chatgpt-web/root/usr/share/rpcd/acl.d/luci-app-chatgpt-web.json rename to luci-app-chatgpt-web/root/usr/share/rpcd/acl.d/luci-app-chatgpt-web.json diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/chatgpt-web.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/chatgpt-web.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/chatgpt-web.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/chatgpt-web.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/github-markdown-light.min.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/github-markdown-light.min.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/github-markdown-light.min.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/github-markdown-light.min.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/github.min.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/github.min.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/github.min.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/github.min.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/highlight.min.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/highlight.min.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/highlight.min.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/highlight.min.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/katex.min.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it-link-attributes.min.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it-link-attributes.min.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it-link-attributes.min.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it-link-attributes.min.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it.min.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it.min.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it.min.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/markdown-it.min.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0.min.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0.min.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0.min.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0.min.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0default.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0default.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0default.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/mobile-drag-drop3.0.0-rc.0default.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/notyf.min.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh-TW.json b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh-TW.json similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh-TW.json rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh-TW.json diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh.json b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh.json similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh.json rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/prompts-zh.json diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/texmath.css b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/texmath.css similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/texmath.css rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/texmath.css diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/texmath.js b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/texmath.js similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/texmath.js rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/texmath.js diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/boy.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/boy.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/boy.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/boy.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/boy2.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/boy2.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/boy2.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/boy2.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/boy3.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/boy3.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/boy3.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/boy3.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoon.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoon.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoon.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoon.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy2.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy2.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy2.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoonboy2.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl2.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl2.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl2.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl2.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl3.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl3.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl3.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/cartoongirl3.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/dog.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/dog.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/dog.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/dog.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/girl.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/girl.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/girl.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/girl.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/girl2.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/girl2.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/girl2.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/girl2.jpg diff --git a/chatgpt-web/root/www/luci-static/chatgpt-web/user/girl3.jpg b/luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/girl3.jpg similarity index 100% rename from chatgpt-web/root/www/luci-static/chatgpt-web/user/girl3.jpg rename to luci-app-chatgpt-web/root/www/luci-static/chatgpt-web/user/girl3.jpg diff --git a/luci-app-eqosplus/Makefile b/luci-app-eqosplus/Makefile new file mode 100644 index 000000000..01a62966f --- /dev/null +++ b/luci-app-eqosplus/Makefile @@ -0,0 +1,26 @@ +# +# Copyright (C) 2006-2017 OpenWrt.org +# Copyright (C) 2022-2023 sirpdboy +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for eqosplus. +LUCI_DESCRIPTION:=LuCI support for Easy eqosplus(Support speed limit based on IP address). +LUCI_DEPENDS:=+bash +tc +kmod-sched-core +kmod-ifb +kmod-sched +iptables-mod-filter +iptables-mod-nat-extra +LUCI_PKGARCH:=all + +PKG_VERSION:=1.2.2 +PKG_RELEASE:=20230719 +PKG_MAINTAINER:=sirpdboy + +define Package/$(PKG_NAME)/conffiles +/etc/config/eqosplus +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-eqosplus/README.md b/luci-app-eqosplus/README.md new file mode 100644 index 000000000..f31c4bb59 --- /dev/null +++ b/luci-app-eqosplus/README.md @@ -0,0 +1,107 @@ +## 访问数:![hello](https://views.whatilearened.today/views/github/sirpdboy/deplives.svg)[![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +[eqosplus 定时限速插件](https://github.com/sirpdboy/luci-app-eqosplus) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + +请 **认真阅读完毕** 本页面,本页面包含注意事项和如何使用。 + +## 功能说明: + +### 定时限速1.2.2版 +#### 2023.7.19 定时限速1.2.2:增加更多日期:工作日和休息日,自定义日期1,2,3中间用逗号分隔;加入MAC地址限速,从此不用担心IPV6和IPV4的限速问题。 + +### 定时限速1.0版 +#### 2022.12.24 定时限速在eqos的加强版,加入定时限制等功能。 + +## 编译使用方法 [![](https://img.shields.io/badge/-编译使用方法-F5F5F5.svg)](#编译使用方法-) + +将luci-app-eqosplus添加至 LEDE/OpenWRT 源码的方法。 + +### 下载源码方法一: +编辑源码文件夹根目录feeds.conf.default并加入如下内容: + +```Brach + # feeds获取源码: + src-git eqosplus https://github.com/sirpdboy/luci-app-eqosplus + ``` + ```Brach + # 更新feeds,并安装主题: + scripts/feeds update eqosplus + scripts/feeds install luci-app-eqosplus + ``` + +### 下载源码方法: + ```Brach + # 下载源码 + git clone https://github.com/sirpdboy/luci-app-eqosplus package/luci-app-eqosplus + make menuconfig + ``` +### 配置菜单 + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-eqosplus, 保存后退出。 + ``` +### 编译 + ```Brach + # 编译固件 + make package/luci-app-eqosplus/compile V=s + ``` + +## 说明 [![](https://img.shields.io/badge/-说明-F5F5F5.svg)](#说明-) + +源码来源:https://github.com/sirpdboy/luci-app-eqosplus + + +- 你可以随意使用其中的源码,但请注明出处。 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + +## 界面 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/eqosplus.png) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/eqosplus2.png) + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 任务设置(定时和开机二合一)插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-eqosplus/luasrc/controller/eqosplus.lua b/luci-app-eqosplus/luasrc/controller/eqosplus.lua new file mode 100644 index 000000000..3a5b418dd --- /dev/null +++ b/luci-app-eqosplus/luasrc/controller/eqosplus.lua @@ -0,0 +1,16 @@ +module("luci.controller.eqosplus", package.seeall) +-- Copyright 2022-2023 sirpdboy +function index() + if not nixio.fs.access("/etc/config/eqosplus") then return end + entry({"admin", "control"}, firstchild(), "Control", 44).dependent = false + entry({"admin", "control", "eqosplus"}, cbi("eqosplus"), _("Eqosplus"), 10).dependent =true + entry({"admin", "control", "eqosplus", "status"}, call("act_status")).leaf = true +end + +function act_status() + local sys = require "luci.sys" + local e = {} + e.status = sys.call(" tc qdisc show | grep 'default' >/dev/null ") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-eqosplus/luasrc/model/cbi/eqosplus.lua b/luci-app-eqosplus/luasrc/model/cbi/eqosplus.lua new file mode 100644 index 000000000..4eb89e62b --- /dev/null +++ b/luci-app-eqosplus/luasrc/model/cbi/eqosplus.lua @@ -0,0 +1,105 @@ +-- Copyright 2022-2023 sirpdboy +-- Licensed to the public under the Apache License 2.0. +local sys = require "luci.sys" +local ifaces = sys.net:devices() +local WADM = require "luci.tools.webadmin" +local ipc = require "luci.ip" +local a, t, e + +a = Map("eqosplus", translate("Network speed limit")) +a.description = translate("Users can limit the network speed for uploading/downloading through MAC, IP.The speed unit is MB/second.")..translate("Suggested feedback:")..translate("GitHub @sirpdboy/luci-app-eqosplus ") +a.template = "eqosplus/index" + +t = a:section(TypedSection, "eqosplus") +t.anonymous = true + +e = t:option(DummyValue, "eqosplus_status", translate("Status")) +e.template = "eqosplus/eqosplus" +e.value = translate("Collecting data...") + + +ipi = t:option(ListValue, "ifname", translate("Interface"), translate("Set the interface used for restriction, use pppoe-wan for dialing, use WAN hardware interface for DHCP mode (such as eth1), and use br-lan for bypass mode")) +ipi.default = "1" +ipi:value(1,translate("Automatic settings")) +ipi.rmempty = false +for _, v in pairs(ifaces) do + net = WADM.iface_get_network(v) + if net and net ~= "loopback" then + ipi:value(v) + end +end + +t = a:section(TypedSection, "device") +t.template = "cbi/tblsection" +t.anonymous = true +t.addremove = true + +e = t:option(Flag, "enable", translate("Enabled")) +e.rmempty = false +e.size = 4 + +ip = t:option(Value, "mac", translate("IP/MAC")) + +ipc.neighbors({family = 4, dev = "br-lan"}, function(n) + if n.mac and n.dest then + ip:value(n.dest:string(), "%s (%s)" %{ n.dest:string(), n.mac }) + end +end) +ipc.neighbors({family = 4, dev = "br-lan"}, function(n) + if n.mac and n.dest then + ip:value(n.mac, "%s (%s)" %{n.mac, n.dest:string() }) + end +end) + +e.size = 8 +dl = t:option(Value, "download", translate("Downloads")) +dl.default = '0.1' +dl.size = 4 + +ul = t:option(Value, "upload", translate("Uploads")) +ul.default = '0.1' +ul.size = 4 +function validate_time(self, value, section) + local hh, mm, ss + hh, mm, ss = string.match (value, "^(%d?%d):(%d%d)$") + hh = tonumber (hh) + mm = tonumber (mm) + if hh and mm and hh <= 23 and mm <= 59 then + return value + else + return nil, "Time HH:MM or space" + end +end + +e = t:option(Value, "timestart", translate("Start control time")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true +e.size = 4 + +e = t:option(Value, "timeend", translate("Stop control time")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true +e.size = 4 + +week=t:option(Value,"week",translate("Week Day(1~7)")) +week.rmempty = true +week:value('0',translate("Everyday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week:value(7,translate("Sunday")) +week:value('1,2,3,4,5',translate("Workday")) +week:value('6,7',translate("Rest Day")) +week.default='0' +week.size = 6 +comment = t:option(Value, "comment", translate("Comment")) +comment.size = 8 + +return a diff --git a/luci-app-eqosplus/luasrc/view/eqosplus/eqosplus.htm b/luci-app-eqosplus/luasrc/view/eqosplus/eqosplus.htm new file mode 100644 index 000000000..4445143fc --- /dev/null +++ b/luci-app-eqosplus/luasrc/view/eqosplus/eqosplus.htm @@ -0,0 +1,3 @@ +<%+cbi/valueheader%> +<%=pcdata(self:cfgvalue(section) or self.default or "")%> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-eqosplus/luasrc/view/eqosplus/index.htm b/luci-app-eqosplus/luasrc/view/eqosplus/index.htm new file mode 100644 index 000000000..c4b8a072c --- /dev/null +++ b/luci-app-eqosplus/luasrc/view/eqosplus/index.htm @@ -0,0 +1,12 @@ +<% include("cbi/map") %> + \ No newline at end of file diff --git a/luci-app-eqosplus/po/zh-cn/eqosplus.po b/luci-app-eqosplus/po/zh-cn/eqosplus.po new file mode 100644 index 000000000..0fa563938 --- /dev/null +++ b/luci-app-eqosplus/po/zh-cn/eqosplus.po @@ -0,0 +1,61 @@ + +msgid "Eqosplus" +msgstr "定时限速" + +msgid "Network speed limit" +msgstr "定时网速限制" + +msgid "Running state" +msgstr "运行状态" + +msgid "Not running" +msgstr "未运行" + +msgid "Running" +msgstr "已运行" + +msgid "Users can limit the network speed for uploading/downloading through MAC, IP.The speed unit is MB/second." +msgstr "可以通过MAC,IP限制用户上传/下载的网速。速度单位为 MB/秒 。" + +msgid "MAC/IP" +msgstr "MAC/IP" + +msgid "Downloads" +msgstr "下载速度" + +msgid "Uploads" +msgstr "上传速度" + +msgid "Comment" +msgstr "备注" + +msgid "Upload bandwidth(Mbit/s)" +msgstr "上传总带宽(Mbit/s)" + +msgid "Download bandwidth(Mbit/s)" +msgstr "下载总带宽(Mbit/s)" + +msgid "Start control time" +msgstr "起控时间" + +msgid "Stop control time" +msgstr "停控时间" + +msgid "Week Day(1~7)" +msgstr "星期(1~7)" + +msgid "Suggested feedback:" +msgstr "建议反馈:" + +msgid "Set the interface used for restriction, use pppoe-wan for dialing, use WAN hardware interface for DHCP mode (such as eth1), and use br-lan for bypass mode" +msgstr "设定用来限制网络速度的接口,拨号使用pppoe-wan,DHCP模式使用WAN口的硬件接口(如:eth1),通用使用br-lan接口" + +msgid "Rest Day" +msgstr "休息日" + +msgid "Workday" +msgstr "工作日" + +msgid "Automatic settings" +msgstr "自动设置" + diff --git a/luci-app-eqosplus/po/zh_Hans b/luci-app-eqosplus/po/zh_Hans new file mode 100644 index 000000000..41451e4a1 --- /dev/null +++ b/luci-app-eqosplus/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-eqosplus/root/etc/config/eqosplus b/luci-app-eqosplus/root/etc/config/eqosplus new file mode 100644 index 000000000..2fc743957 --- /dev/null +++ b/luci-app-eqosplus/root/etc/config/eqosplus @@ -0,0 +1,27 @@ + +config eqosplus + option enabled '0' + option download '1000' + option upload '30' + option ifname '1' + +config device + option timestart '00:00' + + option week '0' + option download '1' + option timeend '23:55' + option upload '1' + option mac '' + option enable '0' + +config device + option mac '192.168.10.10/24' + option timestart '00:00' + option timeend '00:00' + + option week '0' + option download '0.1' + option upload '0.1' + option enable '0' + diff --git a/luci-app-eqosplus/root/etc/init.d/eqosplus b/luci-app-eqosplus/root/etc/init.d/eqosplus new file mode 100644 index 000000000..4e8c6896b --- /dev/null +++ b/luci-app-eqosplus/root/etc/init.d/eqosplus @@ -0,0 +1,54 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2023 sirpdboy herboy2008@gmail.com +# + +START=99 +USE_PROCD=1 + +NAME=eqosplus +LOCK="/var/lock/$NAME.lock" +CR=/etc/crontabs/root + +start_instance() { + procd_open_instance + procd_set_param command /usr/sbin/eqosplusctrl + procd_set_param respawn + procd_set_param stderr 1 + procd_close_instance +} + +_eqosplus_start() { + if [ "$(grep -c 'option enable .1.' /etc/config/$NAME 2>/dev/null)" -gt "0" ]; then + if [ x$(uci -q get turboacc.config.sw_flow) = 'x1' ] || [ x$(uci -q get turboacc.config.sfe_flow) = 'x1' ] ;then + uci -q set turboacc.config.sw_flow='0' + uci -q set turboacc.config.sfe_flow='0' + uci -q set turboacc.config.hw_flow='0' + uci commit turboacc + /etc/init.d/turboacc restart + fi + touch $LOCK + eqosplus start + start_instance + (crontab -l ; echo "00 1 * * * /etc/init.d/eqosplus start") | sort - | uniq - | crontab - + fi +} + +start_service(){ + [ -f $LOCK ] && exit + stop_service + _eqosplus_start + rm -f $LOCK +} + +service_triggers() { + procd_add_reload_trigger 'eqosplus' +} + +stop_service(){ + kill -9 $(busybox ps -w | grep 'eqosplusctrl' | grep -v 'grep' | awk '{print $1}') >/dev/null 2>&1 + sed -i '/eqosplus/d' $CR >/dev/null 2>&1 + rm -f $LOCK 2>/dev/null + eqosplus stop +} + diff --git a/luci-app-eqosplus/root/etc/uci-defaults/luci-eqosplus b/luci-app-eqosplus/root/etc/uci-defaults/luci-eqosplus new file mode 100644 index 000000000..07ff40ea5 --- /dev/null +++ b/luci-app-eqosplus/root/etc/uci-defaults/luci-eqosplus @@ -0,0 +1,13 @@ +#!/bin/sh +chmod +x /etc/init.d/eqosplus /usr/bin/eqosplus +uci -q batch <<-EOF >/dev/null + delete ucitrack.@eqosplus[-1] + add ucitrack eqosplus + set ucitrack.@eqosplus[-1].init=eqosplus + commit ucitrack +EOF + +[ -s /etc/config/eqosplus ] || echo "config eqosplus" > /etc/config/eqosplus + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-eqosplus/root/usr/bin/eqosplus b/luci-app-eqosplus/root/usr/bin/eqosplus new file mode 100644 index 000000000..f859e5933 --- /dev/null +++ b/luci-app-eqosplus/root/usr/bin/eqosplus @@ -0,0 +1,242 @@ +#!/bin/bash + +# Copyright (C) 2006 OpenWrt.org +# Copyright 2022-2023 sirpdboy + +crrun=$1 +crid=$2 +NAME=eqosplus +IDLIST="/var/$NAME.idlist" +LOCK="/var/lock/$NAME.lock" +TMPID="/var/$NAME.tmpid" +if [ x$(uci get $NAME.@$NAME[0].ifname) = 'x1' ] ;then + dev=`ifconfig | grep "Point-to-Point" | cut -d " " -f1` + # [ ! ${dev} ] && dev=` uci -q get network.wan.ifname ` || dev=` uci -q get network.wan.device ` + [ ! ${dev} ] && dev=br-lan +else + dev=`uci -q get $NAME.@$NAME[0].ifname ` +fi +# [ x$(uci get eqosplus.@eqosplus[0].forced) = 'x1' ] && forced="default $id" || forced='default 999' +bin_iptables=$(which iptables) +bin_ip6tables=$(which ip6tables) +bin_tc=$(which tc) +bin_ebtables=$(which ebtables) +bin_ip=$(which ip) +# Uncomment this to debug commands +DEBUG=1 +## End +# Debug functions - echo + run +dbg_iptables() { + [ "${DEBUG:-0}" -eq 0 ] || echo "D: iptables $@" + $bin_iptables "$@" +} +dbg_ip6tables() { + [ "${DEBUG:-0}" -eq 0 ] || echo "D: ip6tables $@" + $bin_ip6tables "$@" +} + +dbg_tc() { + [ "${DEBUG:-0}" -eq 0 ] || echo "D: tc $@" + $bin_tc "$@" +} +dbg_ebtables() { + [ "${DEBUG:-0}" -eq 0 ] || echo "D: ebtables $@" + $bin_ebtables "$@" +} +dbg_ip() { + [ "${DEBUG:-0}" -eq 0 ] || echo "D: ip $@" + $bin_ip "$@" +} +is_macaddr() { + ret=1 + if echo "$1" | grep -qE '^([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2}$'; then + ret=0 + fi + return $ret +} + +# Default commands +iptables="dbg_iptables" +ip6tables="dbg_ip6tables" +tc="dbg_tc" +ip="dbg_ip" +ebt="dbg_ebtables" +ipt=$iptables +ipt6=$ip6tables +ipt(){ + $iptables $@ + $ip6tables $@ +} + +iptm(){ + $iptables "-t mangle $@" + $ip6tables "-t mangle $@" +} + +stop_qos() { + + + for face in $( tc qdisc show | grep htb | awk '{print $5}');do + $tc qdisc del dev $face root + done + + $tc qdisc del dev ${dev} root 2>/dev/null + $tc qdisc del dev ${dev}_ifb root 2>/dev/null + $tc qdisc del dev ${dev} ingress 2>/dev/null + $ip link del dev ${dev}_ifb 2>/dev/null + +} + +init_qosplus() { + + $ip link add dev ${dev}_ifb name ${dev}_ifb type ifb + $ip link set dev ${dev}_ifb up + $tc qdisc add dev ${dev} root handle 1:0 htb default 1 + $tc class add dev ${dev} parent 1:0 classid 1:1 htb rate 80gbit prio 0 quantum 1500 + + $tc qdisc add dev ${dev}_ifb root handle 1:0 htb default 1 + $tc class add dev ${dev}_ifb parent 1:0 classid 1:1 htb rate 80gbit prio 0 quantum 1500 + + lanipaddr=$(uci -q get network.lan.ipaddr 2>/dev/null | awk -F '.' '{print $1"."$2"."$3".0/24"}') + $tc filter add dev $dev parent 1:0 protocol ipv4 prio 1 u32 match ip src "$lanipaddr" match ip dst "$lanipaddr" flowid 1:1 + $tc filter add dev ${dev}_ifb parent 1:0 protocol ipv4 prio 1 u32 match ip src "$lanipaddr" match ip dst "$lanipaddr" flowid 1:1 + + $tc qdisc add dev ${dev} ingress + $tc filter add dev ${dev} parent ffff: protocol all prio 2 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ${dev}_ifb +} +del_id() { + id=`expr $1 + 11 ` + [ "${DEBUG:-0}" -eq 0 ] || echo "D: del_id $@" "--$id --$mac" + $tc qd del dev ${dev} parent 1:$id + $tc qd del dev ${dev}_ifb parent 1:$id + + $tc class del dev ${dev} parent 1:1 classid 1:$id + $tc class del dev ${dev}_ifb parent 1:1 classid 1:$id + + $tc filter del dev ${dev}_ifb pref $id + $tc filter del dev ${dev} pref $id + + $tc filter del dev ${dev}_ifb pref 6 + $tc filter del dev ${dev} pref 6 + $tc filter del dev ${dev}_ifb pref 5 + $tc filter del dev ${dev} pref 5 + +} +add_mac() { + id=`expr $1 + 11 ` + A=`echo $mac | awk -F '[-:]' '{print $1$2}'` + B=`echo $mac | awk -F '[-:]' '{print $3$4$5$6}'` + C=`echo $mac | awk -F '[-:]' '{print $1$2$3$4}'` + D=`echo $mac | awk -F '[-:]' '{print $5$6}'` + [ "${DEBUG:-0}" -eq 0 ] || echo "D: add_mac $@ --id:$id --mac:$mac ABCD--$A-$B-$C-$D" + if [ "$UL" -gt 0 ]; then + $tc class add dev ${dev}_ifb parent 1:1 classid 1:$id htb rate "$UL"kbit ceil "$UL"kbit prio $id quantum 1500 + $tc qdisc add dev ${dev}_ifb parent 1:"$id" handle "$id": sfq perturb 1 + # $tc filter add dev ${dev}_ifb parent 1:0 protocol ip prio $id u32 match u16 0x0800 0xffff at -2 match u16 0x"$D" 0xffff at -4 match u32 0x"$C" 0xffffffff at -8 flowid 1:$id + # $tc filter add dev ${dev}_ifb parent 1: protocol ip prio $id u32 match u16 0x0800 0xFFFF at -2 match u32 0x"$C" 0xFFFFFFFF at -12 flowid 1:$id + $tc filter add dev ${dev}_ifb parent 1: protocol ip prio 1 u32 match u16 0xAAAA at 6 match u32 0x"$C" 0x"$B" police rate "$UL"kbit burst 10k drop flowid 1:$id + elif [ "$UL" == 0 ]; then + $tc filter add dev ${dev}_ifb parent 1:0 protocol ip prio 5 u32 match u16 0x0800 0xffff at -2 match u16 0x"$D" 0xffff at -4 match u32 0x"$C" 0xffffffff at -8 flowid 1:1 + fi + if [ "$DL" -gt 0 ]; then + $tc class add dev ${dev} parent 1:1 classid 1:$id htb rate "$DL"kbit ceil "$DL"kbit prio $id quantum 1500 + $tc qdisc add dev ${dev} parent 1:"$id" handle "$id": sfq perturb 1 + #$tc filter add dev ${dev} parent 1:0 protocol ip prio $id u32 match u16 0x0800 0xffff at -2 match u32 0x"$B" 0xffffffff at -12 match u16 0x"$A" 0xffff at -14 flowid 1:$id + # $tc filter add dev ${dev} parent 1: protocol ip prio $id u32 match u16 0x0800 0xFFFF at -2 match u32 0x"$C" 0xFFFFFFFF at -12 flowid 1:$id + $tc filter add dev ${dev} parent 1: protocol ip prio 1 u32 match u16 0xAAAA at 6 match u32 0x"$C" 0x"$B" police rate "$DL"kbit burst 10k drop flowid 1:$id + elif [ "$DL" == 0 ]; then + $tc filter add dev ${dev} parent 1:0 protocol ip prio 5 u32 match u16 0x0800 0xffff at -2 match u32 0x"$B" 0xffffffff at -12 match u16 0x"$A" 0xffff at -14 flowid 1:1 + fi +} + +add_ip() { + id=`expr $1 + 11 ` + # id=printf "%x\n" "$1" + [ "${DEBUG:-0}" -eq 0 ] || echo "D: add_ip $@ --$id --$mac" + Z=`echo $mac |awk -F '[/]' '{print $2}' ` + [ -n "$Z" ] && mac=`echo $mac |awk -F '[/]' '{print $1}' `|| Z=32 + if [ "$UL" -gt 0 ]; then + $tc class add dev ${dev}_ifb parent 1:1 classid 1:$id htb rate "$UL"kbit ceil "$UL"kbit prio $id quantum 1500 + $tc qdisc add dev ${dev}_ifb parent 1:"$id" handle "$id": sfq perturb 1 + $tc filter add dev ${dev}_ifb parent 1:0 prio $id protocol ip u32 match ip src "$mac"/"$Z" classid 1:$id + elif [ "$UL" == 0 ]; then + $tc filter add dev ${dev}_ifb parent 1:0 prio 6 protocol ip u32 match ip src "$mac"/"$Z" classid 1:1 + fi + if [ "$DL" -gt 0 ]; then + $tc class add dev ${dev} parent 1:1 classid 1:$id htb rate "$DL"kbit ceil "$DL"kbit prio $id quantum 1500 + $tc qdisc add dev ${dev} parent 1:"$id" handle "$id": sfq perturb 1 + $tc filter add dev ${dev} parent 1:0 prio $id protocol ip u32 match ip dst "$mac"/"$Z" classid 1:$id + elif [ "$DL" == 0 ]; then + $tc filter add dev ${dev} parent 1:0 prio 6 protocol ip u32 match ip dst "$mac"/"$Z" classid 1:1 + fi + + +} + +check_list() { + i=$1 + checki='0' + start_time=$(uci -q get $NAME.@device[$i].timestart 2>/dev/null) + end_time=$(uci -q get $NAME.@device[$i].timeend 2>/dev/null) + wweek=`uci -q get $NAME.@device[$i].week ` + current_time=$(date +%H:%M) + current_weekday=$(date +%u) + [ "$start_time" = "$end_time" ] || { + [[ "$start_time" < "$end_time" ]] && { [[ "$current_time" > "$start_time" ]] && [[ "$current_time" < "$end_time" ]] || return ; } + [[ "$start_time" > "$end_time" ]] && { [[ "$current_time" < "$start_time" ]] && [[ "$current_time" > "$end_time" ]] || return ; } + } + for ww in `echo $wweek | sed 's/,/ /g' `; do + if [ $current_weekday = $ww ] || [ "x0" = "x$ww" ] ; then + checki='1' + fi + done + return +} + +case "$crrun" in + "stop") + stop_qos + echo '' >$IDLIST + ;; + "start") + idlist=`uci show $NAME | grep "enable='1'" | grep "device" | grep -oE '\[.*?\]' | grep -o '[0-9]' | sed -e 's/^/!/g' -e 's/$/!/g' > $IDLIST ;cat $IDLIST | sed -e 's/!//g' ` + # [ $idlist ] || /etc/init.d/eqosplus stop + cat $IDLIST + init_qosplus + checki='0' + for list in `echo $idlist | sed -e 's/!//g' ` ;do + check_list $list + if [ $checki == '1' ] ; then + mac=$(uci -q get $NAME.@device[$list].mac ) + DL=$(uci -q get $NAME.@device[$list].download 2>/dev/null | awk '{print $1*10^3/2}') + UL=$(uci -q get $NAME.@device[$list].upload 2>/dev/null | awk '{print $1*10^3/2}') + if is_macaddr $mac; then + add_mac $list + else + add_ip $list + fi + else + [ `cat $IDLIST 2>/dev/null | grep "!${list}!" | wc -l ` -gt 0 ] && { + del_id $list + sed -i "/!$list!/d" $IDLIST >/dev/null 2>&1 + } + fi + done + ;; + "add") + for list in `echo $crid | sed -e 's/!//g' | sed 's/,/ /g' ` ;do + mac=$(uci -q get $NAME.@device[$list].mac ) + DL=$(uci -q get $NAME.@device[$list].download 2>/dev/null | awk '{print $1*10^3/2}') + UL=$(uci -q get $NAME.@device[$list].upload 2>/dev/null | awk '{print $1*10^3/2}') + if is_macaddr $mac; then + add_mac $list + else + add_ip $list + fi + done + ;; + "del") + for list in `echo $crid | sed -e 's/!//g' | sed 's/,/ /g' ` ;do del_id $list; sed -i "/!$list!/d" $IDLIST >/dev/null 2>&1; done + ;; + +esac diff --git a/luci-app-eqosplus/root/usr/sbin/eqosplusctrl b/luci-app-eqosplus/root/usr/sbin/eqosplusctrl new file mode 100644 index 000000000..931fbf0fe --- /dev/null +++ b/luci-app-eqosplus/root/usr/sbin/eqosplusctrl @@ -0,0 +1,56 @@ +#!/bin/sh + +# Copyright (C) 2006 OpenWrt.org +# Copyright 2022-2023 sirpdboy +NAME=eqosplus +IDLIST="/var/$NAME.idlist" +TMPID="/var/$NAME.tmpid" + +idlist=`uci show $NAME | grep "enable='1'" | grep "device" | grep -oE '\[.*?\]' | grep -o '[0-9]' ` + +check_list() { + i=$1 + checki='0' + start_time=$(uci -q get $NAME.@device[$i].timestart 2>/dev/null) + end_time=$(uci -q get $NAME.@device[$i].timeend 2>/dev/null) + wweek=`uci -q get $NAME.@device[$i].week ` + current_time=$(date +%H:%M) + current_weekday=$(date +%u) + [ "$start_time" = "$end_time" ] || { + [[ "$start_time" < "$end_time" ]] && { [[ "$current_time" > "$start_time" ]] && [[ "$current_time" < "$end_time" ]] || return ; } + [[ "$start_time" > "$end_time" ]] && { [[ "$current_time" < "$start_time" ]] && [[ "$current_time" > "$end_time" ]] || return ; } + } + for ww in `echo $wweek | sed 's/,/ /g' `; do + if [ $current_weekday = $ww ] || [ 'x0' = x$ww ] ;then + checki='1' + fi + done + return $re +} + +idlistusr(){ + + checki='0' + [ -s $IDLIST ] || return + for list in $idlist ;do + check_list $list + if [ $checki == '1' ] ; then + [ `cat $IDLIST 2>/dev/null | grep "!${list}!" | wc -l ` -gt 0 ] || { + eqosplus add $list + echo "!${list}!" >> $IDLIST ; cat $IDLIST | sort | uniq > $TMPID ;cat $TMPID >$IDLIST ;rm -rf $TMPID + } + else + [ `cat $IDLIST 2>/dev/null | grep "!${list}!" | wc -l ` -gt 0 ] && { + eqosplus del $list + sed -i "/!$list!/d" $IDLIST >/dev/null 2>&1 + } + fi + done +} + + +while :;do + sleep 30 + idlistusr + sleep 30 +done \ No newline at end of file diff --git a/luci-app-eqosplus/root/usr/share/rpcd/acl.d/luci-app-eqosplus.json b/luci-app-eqosplus/root/usr/share/rpcd/acl.d/luci-app-eqosplus.json new file mode 100644 index 000000000..b879f4de9 --- /dev/null +++ b/luci-app-eqosplus/root/usr/share/rpcd/acl.d/luci-app-eqosplus.json @@ -0,0 +1,11 @@ +{ + "luci-app-eqosplus": { + "description": "Grant UCI access for luci-app-eqosplus", + "read": { + "uci": [ "eqosplus" ] + }, + "write": { + "uci": [ "eqosplus" ] + } + } +} diff --git a/luci-app-eqosplus/界面.png b/luci-app-eqosplus/界面.png new file mode 100644 index 0000000000000000000000000000000000000000..d346c698b1e8575c549d4d903ac1e122eefad958 GIT binary patch literal 598653 zcmZ^~WmpsL8#X*jN+l#L8blfs>5vixq?@6Lh?Fz~wh=0+6DbQY2mxXA1jYs`f=pUP zi4B134uC-@00C4!z-w#J$ z#JigSz<$LQb5oZDzcprXi&9@KPH?VsD*clG0lvde7_`f9zb=|BWz`Q}d*cp?6Q8`#dLrv2%J1@8Kxs_gk*k~k6`#HE8Bym$ z@64{hI<28mx5mWj$9;a(Ujib(Od9GUU?=12aM`)J{r&xaUgqbaJI@U#{Ge0fwl-G$ zv!)Hx+>I|8-W|&DHG&f6d}naX)cr0x?>@u5gG9|TUh|8kDtEg3g4`)JzDbO@#n}tC z-K)*y=l+I~j{+KQBAG@HCM<>5Ot8u0a&!LWd6vh6%k#qN-{~cSY5r&Y1mlRyLyALP zi4pOCV(FbZ_2{b3r4I17)g#X*Ko=uMX>fFS#Ftu~FRSVk0+K_sY2UEY1mJvh=^r1H zDWRb=FYR8&{+RjpjGLs@yr1U(_9}HI=lqzp&KYJegeGC5)sDYL`ROeb8}W9VSb$;{ zr9V+EKhE!-yCmqdnR5;BTLB$51H(Y5pM}I*048vxdCu zmssmUjH?t1bfLJDeY^T*0NxXQx{pkSxoaz>zn{(n+Cw~v=B${0^nLON(6y&p=rxu( zWR%e~nZ=L?k>WM^(t1Uxo%&yKNgWePRB!We;7H<@nD64D38I~U$1D7W$Dcp9zS4qL zUGeYt0|L^oa2`EMt>xScRY)2BY!tG4UHD*g#*icz7^@ytmx0p_+@olb^I(iy3oocw zI0Mv+c(iZAx$bG*3=?^jaisOy$+v}tBld< ziJ2}~On%Z80P=&KZ9u6|Ww;CAirU=T^8{}yUD^uZeNh$KBdCQO0dM92V@!Xiaqg{W zC14JiUb}5{u5&S+XCvu7fMqV)-ANA{<_GeP=^bdqbB+6z75W(ex|E1aE6Ixg*0(Xq zmv*62`t$pUny6a4DovT-@~!gAgsHeIRpCM9dFw6zMO%RN0%^vQH6+npG~vvg7>^n_ zk*RZ*-l2nSfG3R~qFh>Yh`pzC%~vh6l}J_G@cWXF{&qnwC4JEJ&1VX^J!;W4DT*6} z>D7^uKO7@D9x?45u4gif2xr7=k6A0s+;dTY+DXrA^ZEDV5Wx#tc&$#2EL?%vQItXs zj=De+RtIOrEC0c8J`KDr+Fj6OULlqyKCbTZLM%`{t(GbuX|Zl^8{7VR=UaXgw>?u! zr27hM5jipdnByPUNEjfg&8px(`YBJa@XtuGc3*HdoeT*4n1P ze;Ptmlg>g3gYGd<%8bk!i)Bp5uO~qmkJepDbaP6L+WLxLEI!=1OmicxI;&BcH~#<1cT$O@4;Ql6-`@FRulYlMV$Mng7sr$IZw^ z{T#r_$AdZ4VR4mWb45JshBGH3gk8vxh+fu5-m5j^_cW`BfR>zCZ4gsbh0$>@8z-R# zDRcu+6gPhGsHF^Zx)X^*in6<29O@t8r9lLtLSB8o<4JQzFVjjbX3Gu?$qjWK-}jf> zzZqG|0ecKy)!^m7qSZz9kLQ;=dui0>-M2kbV1X5=z~S`7usiFe)Cx-^TDwY51~YpO zq+$igVRYp>@%5@WIm-NgpAaj+TY)7WCklQA0V$=x4m3UW>Jzl8%@K9C)V$iKx5gNH zU1cKet5w-0T4P6p?}RjfKbhzX`kR1?x?Q*7i#!f27U1(GVr?ASi~n1w3Fmy?a4Cc5 zv>=B;ekb8`NPuU;s&nN}ndj)!M7_RA%F4P6l32#!n|sK)93JQ`=s&qQd;XKYP|-sK zR@UPpwjFWWk6y*EcP)!utrQ-fA0w6~qN7dk>WybxTpN&siZ9eLS~(MhtXfKis4wt$ z9tzAJ2f?-8#3>CRtZ}G4;uiSgK1YVjttoELgUvCTuN>TbC~xoQi=irudJI*Pcd+Y7 z?we96-THLZJhUf3nSXj9#vjJxFrHBUv4B^f_oQ zxKvyf%K|s-RL*`-PF;1m*|;!&Ln5fO!% zK(!-vvnBTnb1uk3sWT`UO>*<&wF#XcFgBGWoE7)=(ibuTG_I%WeHmIlK(9lSd;C z79+@#%pYNmQ>%jh=4Q4xw>xj6msyu<`glfvt3vY<`vx`LolI9ja}%PR38L}CsR+i| z&7b^>)ty%tJ>l;0wVSl|DwmhO{UBfZ;~FXyCFXKX9+_ zOf7txnDZbuZP)bf^FJlLn9trp!tXgr3~wzd-L0)FsDf?}@uGYMu_BMR2@{&#b9ePO&m?uqfYP zecYi}LyznFL_22}7)yumzf(aL1pG?)m8p`M=! ziD*og;_%txdW>!!{#zEo`|Bw%WF{7Nv2TQVv(*-e{X&=lDO@ zthPz}kTt@y8*_kr<8On)CK>%=rpr+A>#oL;R+JTtG5e+mI^TuH@6W*|e~V5+xY_Nh z>H@RJ_J7TO_`mY&cbwX3izoR(NLqp;tM3_wd^q)F4qKo|y)e8K$wbM$E6tcV5P%V_ z+mlkT5`d+K$+<|J)5$cbU(gQg%={ytE|=E0-ykCww+i;zjkV3hm2gWXv6QpLc0v|N z)N^=JYTkJck*iy>X}a=zMVC*4`HuNOlnXa;qwEZed9*FLsTrP!O0Ys0kg3|>!$Mnx z&9l!R0NnVeZDuU4je0CZY&`-NmOLNcvh~9~%Q47t&ad&fAG+h5wIKd`%Aplm-aP58 z9?1Wa7D68$MYjlXhX!QjK45@#NNC7HeIc45Wjk)2!)={d7bz7&L>mp zD{7YkyzI-G%Gor1D2m5u$UK+9J4)mA5y`h91zOG1|1gr@9l5V#cP7FiSBdv0h?pnN z_u=4{v&PtG19DgE{G|%JE{{aj11g)Oy%zoHj_H{<(`YYWGfsFX82zXsa=IO$+|$m( z8DD*O@RrEc+0l`chmaw#cAa?)&YvLbh)z;mDLy@iFqmtFspM4Hr&_kGU zV>;9DQa$ojYox$3DkS2q!GHrLstA?v?VMfErY-Uinc|i;K%lUi#MDR8r6ay#MbFWS zW;$FP0-L{wDArLf_s=Gsy)b6r(qwlpxy8zBAK? z`+Mon|5Z-%FB2v#?geG6nrL}^xyI=)46+ZRjlNZl)2R5CWL0ObECe{YY3OiG{-MU9E z=GibH0V-qP8-|tX9D%b@0C$hmJKl3P3p&c^_i^$v)c%OFzpxTnOo0&6W@D62L zT@?7`#P4q%ZKjZ#B>!}m^sH0(P$&*nINt#dl9XazV+(Z+d z;-y`FHvPJqx!q#T9r`Hk2Tk3~S(@|GCKuwZU9co3=k|Se8V{&AFGPG9d=XfKFU}95 z*2>~u(O+Z3#k=vF!|KtIFHZ+<3f^5iAGk7KE&8kN_4r3qcbbs5 zZs2v@t5XtYTrwk)`B9O67@TmoTF~-fmUnUp7+C(4;l)pKw zJF!L_>Wl-%8*S=k4hpT2u;vL-t-~lAY~sg>PnzfWT1j8Auc_VQ9Y?C=Uj`e0dxCyN zxpZ40mAd(xzkgQn_Wqn>chDbZLucH0V|UVxsd=}Nd3+(yi@t*SSFv}fwIrJBvLJ_# zt-r&i8mct-PQj$UYyi*inHR0G7|rJU3&5iT9j)yvAp@599vy z<2tZ+#?_&DV;47KY>2FeHz%gDm~bb*Kusri*4(eCJCBqr;&hApxe+g%9R9n@bLwJ|&>$O!!pJ4wM(2$O2r7SL zQC66iR>S9C=*))G&9}W2fA|%lB=45j@Y$NPnixu|qcjdKvR7qOQ9~L<<|0+)SKCqF zK7boT)om$pLmy1Iznf#F0X=ku)7|W8<%P3*1`uQIH>nn!=m)_tU|zPLX9MV}?qTv? z3^gO$i)B*)S57gE)ECUUs^$|{tAU=lD)`R%O{!cLXFpgDH01WXK3o!C);s#FlLueO zu$a6Sk))A=D}2PIs4XLDQ`={(R?rvuJ>WJBKGc~z*|Fx9HhvcOFPWzfD+oDoAq8KQ zm|(y7-bWQ&g)KVPi^a774yVcT#U0%7KlLA+v_?d%Fo$?duPq6xTCq^Tg$Ol>oRXZf z+*!FRu9aRQAv|}Bnu90v+vnHf7x_UY0zc>dE8rF4C=Iu@Hmd1u^uqURg0oCZ&YbN* z5>I8YodqZE6PTFhDB+;n@UJtEhb14$fZLW5=AI4&l&!`y+P=S$7)2f* ztsRH>^=hR@+1ToX6|?OWzf|bVOI7lAAnqz^L%cH-@3OOmwg^;*frs+Y+qzBUVrN=z zwc<@j>m3g<(Th$o5dMSI5G?aWe_p-K070*y*ku83<5!3}&T%ltXyr0%k{tr@)hAXf zHvTKdPBSt{W^kw6uqUAEw7Yv&IxW+SN`O;)P#CK#Zvlu`B!9g|vBjy9$^z(TC zjY7>Lx)vrZ(M-MG&fA-(Z-}GeopBNIBAZ`UDUBv|c37MdiZ{?4NfN;_i{Q5*4L3v1U_`MUs#II5LCMC=`i6*p@2ml!q2+OAXO+IbA??^l_jeW> z_b1jwHUTQNu<#++UAIVmHJ*g;(TUUN%*86y%ildJXVQE!QofsfK5qWN`XKG$uxP?= ztO=W8*gFrFmfe+wa>yHRo{lX_W9aG^7)4m;Us~9{I|Q^;F^+obVa{0`zb}ebbVRD_ zy>Q_PFBBD}u37*v23PX=?1|Mr_hWqf&SQXf96R2-83O*zU6z0lF>Ta2PtNhp>-;`a z#=59WLnraJDxbBax$4IdhCr4`iPnDR->Mo{3Bb0RBX|3rhIj&>41Ec~q_2$i?lMN2 z){{GaX)hmjLZh@ruGy;;KXf33nPex2yTAMSbw^;_Vx)l%3JxZ{pDc z{t?W72+Mrh^e-QPnps>f0p`ur2Ei>^0z2Y&h*s~{%;?30=OHT-30yfJ|-VL4Z9s`?SB#;br7HMB`C%> zFW}z%IER5+mH7Mhsk5 z`qm+BQiGnjj1RzIqCVkckF)>JZ#-Fd#L75mGsORTzaqbZ3Fu%9h`TXE9R0kQZ&nd{ z0P6A6QIS9Un(kgnAPW7_5UNSU zUi_95hH0A_)70UTxE~|ZBs^9Fk#?5v=OL0_=xQTb_^gOyg?xo3GA@Fm_h@&f72#u8cg78Rb`gBytlUD24M2laU z*ZVb)Cyv7I|BUD2YPa9ogbY`N#;q{1uphAVV|CWLG|DY%@x+S+7M!;2mdrbf+QrWLRH<&4%DmQ#b8brN zf^&>|f4eC%M9&YhZvq-Oa_rhF9@t`8{~{g`UjBF;i}qx#MBd-N00W^eF`W;}_b|6U z_5JI>&37ksO(f!lbM-W~W@xJqmbb*FFN%H;KK9&L92?;wNxs$P{1e_1X5)Ry=-0lL;(x6L-Avv+<$t}3eHvPRHt~XJ+EAY`al<={ zm~U{=V?pbUjV_r&lLxyp%nZ!T%;I*r@AjH=9AraRW0THlVIs|>sCy~;vPjqEqhD8x zPK*jRtq}tP!+Qk$dut~oyE6s8%)i>qTyL)bxS2oyOM1#bWMmi&Rv*~Z&3U{8G+?z$ zbTfu9;h=<7pHo;p-n&Yr-{Mz;))H?y6w5GNUq`jTwgV0lBRInD zbohLsxx%5h+abRtMqi#Y(@2?GV&n9`bB^9M;Jtq;M7`0E7jb!(9c$mQw}sM(58_MO ze!r3lT5lpTx-t~5(m6feLdW$X5le#Z*Eu-8t&!3b2crU7R&S0Be|`r*VXeIfh9CN3 zM+TAMhx^i;AY$7)^v-Db?}-wSxRkBlgViYelJ&i^$o8@Zb-nKm>e`9_RY0EWR(Kt?#Rs?J^*Qe@wP_A?p4Rl+QF-;?j!b z2tmOL;5?9~Q>DUrlsfe-xf`US1xsINms38B9_NRCZ*!!?vs!#*xEVgYB%6&b+1*?} zMJ`2G=`lpnu1ZWaPR;qtu2zLQ)UIYqaC>u@^nqzKiJ-(5i#$e?eKY1Ck#uc%6(Cg= z>|%8fP@07p;#lIWHWv!<^M7p>3s||c0*}sZVyrZzwailb-b}e{OqFG>>%e>>-1b9f zSZA3{8Xu>={CCsO&q2=Am{SuA|G{{iH2$b!2)C8-Lo#*Is$B!2^E=(YbIunYc4~=B zTInFw8%@&r3gol4k&}_Lsp6kyCFiw}HGv|?a|>D~Gsv~`H9K!$4{TUtah@F0`G}`F zg>k>lHIg;hytyfkCv+->`^#p>MhA07*PS#^;edal#&iT2Pwi|zrayb?j^0PG3+83o zS>8U2x}pefxbJ~L8{aQCvin8%Bt(27lr&!(m~VJL;XaTk<#7%dJGT)PMrXG@Z|B1* zd>pw;z+?#z*72t4z$c8I4|PLZZ(miT3cD|#^-xH09m)nsq)u6JN8}-yE>%iEE5NEj z|F|Ewc1p6{FY9Sl*F{yCEJm2KJmz+WD92TL`e|6Z1QtXG&*+Dv%N~6N#~c)LCmBu5 z`;8lGF{l;O|4Pld&7ZpW5C+<@vb(1Pdol_d&7uyD+rMdP45h775OuQ%XW;wUGbUU9 z#o#a{D`z^@aVP+6KGT7{Q65{L7B}_uzgM80g@_zqZgOh(9K|A^qLRy3OWOJ_kn@0U zY%%GjCiTwrG49lyctelJR=o3(Ed*bMvzzi?_-0oFrMb25Rrdpd8xptp{l$?d#JlD5 z4atcS!YImt6`gakN&F5-iT58gMB@^$>Y-E3o7~#nk$G08r1^JF)9Ek3)9IkbvTD%g zWE#K-F4FxNo!LO-_b>5tMJW{@Di~+TrwPT7t#7CBS(|g`oK_L(A$Mv_j9xwnj4#$J z^4w8)=;B18MXDRO`o2IZ8M2-!q%222evK6GIF<~Fp|za~8?fN4vi7%;OETmSmEoup z=~Ru%*{f5DaxYd3wyPFW9Q(lc{iLU$OULnJImp819Q>d@bdc6EU5~IyB?1TB+4OW1 z*pfw_FSS_7VeAa$7j15p+p(tv-M8Y|?7uU0)b9kFE+#Z>{M30c@nCHK^{vFQ2yVYh zTzGJj_}Ey;xgOG3g(FP7vk^*Q@V@De^uXMCC6Tg zT-%Q^X*wucuuQb8lcd)5BmO;vJ*pJ_ZR=+Uw39&GJG(UR%bWYBRb=fTay|@1q*Dqg ztTu9SDnp!~AEdXPKzM$JR!j&g9@KV~2i6^pfCbt%`^@F6Ja7P;S#}^bC(T zoLBL^NYl7VRJ;Hj4S|Yw12FU8Z`>49>8U|j8ukM51Mk)-q<-;rm>|X4l|6pXe40a; z@24qVcehiDJJKHd>g6oU%*pfiF_BZe56|~RAmq_F;!c*mL(t~xYc^B<8}xE2fV9u! zxi&P{_QxQ{e?W*mMdviYQXaf>ZCrL#Y#f}xsD=4`<@896v3vJ^Fn3Wdelr|+4jv3s zcvxMUf*jJR9$N@Aj`bR~3T$TdDwOfB1u>ijA1OatRf z^AFWiQp~zs$aU|8q&vK$KD; z75sJTy_Ko%PI^_l@#oKCOx{cy*gcyTNVTOO>pybH1(34_T%>wvAq^XbC*OufH^1~1di_y+ z|IlqZugmn$gtQ65OI08uemTzoTfXF;+V_-tgbU zHIL3eTEYp!#Z#a5p1K~WT>h4CRz6y?N5D%h*8NmUKEq-`OHl(e6B072|DX`1aUvi6 zN&@M8o9FH$&dT85e^s;Pgwpm9I#TdgX}$z}-ED3sQaV&WXwGQGRX(Me!Q(B$)&;-I ztl-XHHP`-d;Yx$|;n;}3+NFxQ0JCUo-UTXxCUI9WadgiKu73K2p-q7mbp;bCT>}`J zD;A;V6ez8$hubd2c$dx&D-~X*HE~yhRMT*U+ztIcb~#He)QjS;r;3plyLbGG-x}Pk z$@*4@9i6Hium%BX&(GH>SaH@Sobp(?xImFjDkmObKiouEM(}Mu+nig2ji@%9jiQPLx2qz-Nz!;|OTl=>O<+Dl z8ush!Xpi}F=i1vE=(*Dv0R!XK7l@q2-^4pgb^c1>GS+_LT>;}>=r3(rtK&>LdimOZ z96gzOr+4kv=&oGeZnWHg$!63d`E0f5#s;=h?*oh+yu}t6-X;@@;34R?nrZA+A-0=i z?GJQpB7WbCis9T#%qr?VkEX|eUQ+wpYk67}X|gEFe3Psh~V!YyxZa6CHbCM=h`J;+#}eWHrp`B)HnE6K1ioBSGL z-qE`JeZGoXO}vwhzhwzfJCC*@G8AQe`KQ(U%5=)Nf8S&LD0rJQ zQRdX8culmN4m{$PFQKB?WE zxO{oXGO|eIn9pR;@|9TNr}NUVsn$+L5*Om(Ovzy0v+S=Y0v{ z*%IwU)1K=SMi{p?nrkonzf4v8k|r(llEd`27qdg*#x{puQUu zG%wOJVY=Nmiat+DWcT@8@;dI}c=n{LfPeoT(Du2ufW+@?ZV^4OC^*}6*t1GGwL0Rw z5Q+1Pq1DNNT;73AET(0ir{cS}5Yi}I$xo)QhouRcIG zCNiNwwVV0^5UIRw;T!V3E(MKZi%YZV%Z{UuyLo(sZkqbYP4Hq9#{G<2CXUn&Ozj|; zYz_}kFf83_fn(?*-2&iK@4rcL?G&UUQG!QF(?5eBRN~K!WO)3lX>oO|eG(ssDnc0y z_kYj*S+y*mn*WQZV0iqN%wq_bv65BgT(k6XjZ97K~G}5dKUc51B$N zXaZD%zwVcty#qin-TEn*_H#_+D3V{-xPdO&dsD9Y3^2X}u#i?%#imTJl4U|OUC{w9BE z-0zi_N~g$|$>u;k!|un7K#pk`>k!9Db^~LM_R#g-rWgMc#@L>e^=gW~B)7g4>9|-z zY}JTnPLdYEuNjdvv!gVI5bu5pQK%qm`WDt$EOoqEPtgvyAgXdV)C)52F~H2&1RPvo zHt8VO8%fxwMXMV^w*G1CnW{GEx)6C)@M zjrZ{R4`4t>Ps~;h7amasUHB38bv#HcumB|}dWqks+--Hj3zdzhlT8jf@-Ln@#17Jz^0ZKu zC$~%&9rT6%!NMX}X>x#bCE=6J&%w_mTcB*xjzC3tEAz^TXNH51~&9`8F2NJjWoY_KPH`|IdyZuUPNh4bCs3m25`Jm=04791O zx=9+(%n1lwnxn@2laRd~*Gnd1nVa~DRwUXtkj|hwq9)lKUX^?M-)LA(iI?hlmHqFa zL3H%v?#CtargaIuEvdbaZj`_OSvR1=2S1nPIY8-VNUKIofiz;JW**!@A%?v3tpm&t z6Z)(bZX7kcM0DtaECKgdF7)p0SQc36IvGM2J^d6?sG~hUbiKL5O@~(7Q%+X4Jn6P6 zg=%*R?a5;7in)b{eo3~VJTr_*eLh3M;b1qk`Q zK^-aCyHc;Oc49M=7cQVjKJXD_Z9gfB@E4)a!+w6hqhZhyEu5_`LHYh9>c_90V_&Op{=Q-|T_kv*r|`uUy*Krin5I3uu=ieo zsU>VtV;J%Js?HLmk$%AX=Eeu%QV44*v3cdN@Zah0fE1%nAflv70gKWtX_PFyzcXCS z(cyE@3K9xgn2rq*sfsatZ1KZbL}Ck_4eJ^LZNo(MFt1`{T7*fBaRB<}bl-AlI${F~`|@L<#1Tz--62Rl(O$G45H} z;+roPB8p(Nr;GAZ?rGvBpqY!n9D9+M!TMttTRD$P3K#D2w5Z#LKiAyjjDNfRSu4z{ zHKNJ{!(o0MQNT>MiYaD(Di3SU>-i-Ux4#5(E>pwmo{N&Uvw*oOLD`<1p5CVg|TBh>KBnc)7ybJ|`4wY*WT> zZLel2cU#V??tNGV5vj6pwo*y_4~^?yOA-*|u4PRw9;Lp-0xMLL^P+IohJ`5MDZtbt z;=HxroUez@N~O_vMUG@|k#5qfV90heXf4`-WyUyl_hsa_jN$y=zY3PUK8L}>F`0*l z@1Im>%jKt46J#Pd-$WL=tlDi&o?X!~G0x$}I)}Mqjoyf&%{9OpU{I&yg9XxAo(+)8 z;Tmw^C0Ltng?5{xbcx1y`hdQJ!P;5Df7$mSZUiBK+^H9Z3-u(X~XSZOUg7rz>ui@-{_IS~mHR=zaaeH#I)jk?rk;oV-SoUmPwD(dY3i6REdA zIspmgk5qT3eDBE@?=+5x`aWcaD5P1;7BG!h6BP&EB8LRApnH6?IpYC;%QCs${)RgN zS46((N@i%qp~;_t@z9x8D0Cc*Z@$8EG8E~C<`0bFfZ!_nT9u3#e{!cKM-KNo2AJ2X z9;a-&bL_c2kxZUs5&5T#eu(p{J9Zt*586z^M8w0GIKPS5pqFRztFT%(_M{LY=kLBQ zM3Wvclw4Rv@hs_e!`$t>K&}a0R*x8w+ z;QI@L|9S)|)UAf2hEx6+gP#^RH|_3kMwcz4sNV$JrT2ajO4qJTL$|zvE00PNl_sbk z-}cqU6~yU2XsdgIK0n<1GjgR}{^{)5n&Ds6YANv^^+8iCFc5uc{HJe0JmlD%Ie{QQroGSQr@1$G1hwZB~fh| z$8=r~qnlL0>gurz6@`y03~VP0P)C--uB^!8srEH^k1v(&Cxe40D&uCP-N+px=mLq; z4y&sbdWI=2=PW(ZV4aQLll-}>hdN0-Ny!)KiOK^A@Ai?>%Zbw0L51DNEe77`RH#Cm z4}J+kJ?T32BdT;)aRV0vq+ZQKTSK?kt2&Iq3oaC*JL}?)JaqoB(Ks_hjQ^mc8i^H# z*E%h#lYbxn)p>?u#=3E=#NnO)P~I2Bgy@IzNqd_ks(GYj5~ZVQf{Sxcs)Z?f?4^9_ zxy8I;Vf1Nsl*teYbPvYdhZaY4LN3AvXdhH6c|witqr|r)@@ns)lQ)JtI`PS|oxZi%- zj{q%I!93it|JzqQwEHcIZSocd+uC&#aHYhU9JWf#YmK_W;bR3fR<>+shY!Nq8?jX`-W*T*$6gH9J6 zYCmgyj0>E0s|+h|xN*NO)4j}#rCNuSvcg{yjB3Un4}LN6V#SO*05`dMXohrQ%NNex zJ{gvr+~Oa*_BMssnNp~pa7@oZ4lHgI(R!6!%*Mx~U18h}Pm1VY9b|~oU?tZIbg^7& zgqG-s!X~pPO%e*X3n@;%Yy^`!-lUo$I0ms0{Ro)4W zir~GB~euNFDyj6B}Xl$S#YCb1xV0l37Qd( zp!Zbeyt;bU5l<=-^dDEQ=no#Zs>xv4DmIuSN-g@HXwC9l{|5eYF4x#wK{$}<_U}J1 z3ytY+lww?6FZGBOaEb9fq9RkaOG!NZvSsIH+_xT#bRL5n)nX{Ik?HE{Ea=81a}fXo>2;|`_loQ;hFWyLq~itEmw&) zyq4EqTuE8%Grl}_*cRxp*S1~UEcz>ZM!>6RbKor9lZDD^;{i)jy#;5SYRTSB02U$M35p*b z0!#_C3ue`l)_(+ln?RPcrAs9abrG~EQSkgELKGc?bYaasl`jD^it`i4CZa6Cn}}vA z@iMIWyDNzA4^>&n;0JRa$TBG2&)=uDua5(h>T9A`@T8c1(C~zXfSI+ZThq_8jo&?` z+?p`NV@7S+Fn)Gc2euH^djy#&@H5JMdCpib z6r`5Y*Y>toyxS{$>g!VDGXahK31yPgB1Pp$CifSUe!txNfWvKSy9S3jNhg1+B3V4O zT#`9>W4%rym;)?@0p7B~W4|$@FkR zNk23^$(Qqq*w}`hOt*eC54Wh;?iqFH!*|3SABWw<1dK#E(`_yB_Gj&KxH%Idqmje9 z?5|*hP=*$YaIEp;iiqkd^m_n5r9IyOxtOi%5?xr5G@0?igS|RO^{4z4<516Q%kXFr z;O&S%=FuN6rwXkoi}gA^7pE($I>!6tTZscEi`%Gwj91iNnrlWnqiA!rknPy?#3z>i zDLd@J;?(2yWQYnsW3*p?U7c4O`<%KrYM&0>r+pq>$KiH+*WIa+BcdGdF|%j-!&II2 zLT1WJN36`Ch)$A&dDBm_d*hRMfxu^?JGK3KsttaZ**ipX?D{rgGn;FJ^CqoAwsHFq zin0#Y-GW9oP92H-aL=iz>yRoq@9a?I&iKRPB=*=YpHla0lEuK_l2dS`+BxAHl*>sn z_W14j4qJr)(mG_HrCeh@0XGCU(Pj3>%Z{D-Wp#7o)?-Dyu$S^z+*MV=?OQbg_ut>> z4O5HT1m1)h#Ajn#M^2fXv9xY+i; z)d1;%mjTa;hGF+AK}yGel?Gu6w>iuJaB-qV0^5&Z-{W_F1$x*L614bt_2hqE!>NB0 zz3H|5K7_kxWbqp?9M!2$dfs*Ncaq%ekCZpLA|=A<)}8^8Y%Qqv@G{V z%{wSTTLV;RrrYIt^PV|hP0Llz9f`d6s=hc2stsp!`}O=S>P)w*AFUo#paOoa&#@+S zpYWA6%7=5Zq(35Cu(J1hJM)_Xw+>fOIOcyX?PU7H@)uf@eYc)!hN4*!u6{?c&{Jg= z{xg2mlL4ibv`4`z1n9~uF~SK9kn?OCves=ZK6R>)yzZrT8M@l87_q;oKT~C-iRs#E z(~3dUKC8`uEdj+Y_m=b{=uz=ht21_6Q0B9B$HM+$qaI>S!ORD4&9Mn1zvI8+4@FC_ zUU)SfuGYOP$&oBcr~|Z-DNQdcPyY=W78Sk!Y#oob#h^F)I+GwhCzXv#=a*lo{FtAX zrnoNtCHlg+H=z1^<~vJ-Bs8eJbLj!o#SP*wM-f)a(SjD1%zn1TEr;)Yf;Vu7R^Tt= zjGnC;LfDYVc)yt50i-rtd0Y$tXP$zPmvUw@D8@dv78(0&lhzFLXKLREl%*Vcj}2Xb zATo8GONJg@|4F3lT?B2!X4C;n^rUT^Tv<=rSUmM^ z=w<_OjCGyN_#O^xasU}S3;cfc?rLG|PUM|uq{PZ$%VL?7`-SQ5@dY3{qMQ{Wjx{>* z(Yv(G9baFVE%DO3m@^rbzi07X%l6lltXBRu4?<=IYnWfv5pgOqiJXO=4UD12W7$;= z$~-hK-3sTVmLR}go%Ev`dpc|+v0RpUo=JfvyB}ZiTVB8VMB=0Sc)QZwM8)&>;FUbV z2;Loy%R92U-uwo(08COchMtVy91?;#0g!?0S&QEfp)wTumN*l%1pSM;TMSrJ zN2XwzKy%g|-xFPQZ(f;UaQa5qYEMfscQxtxv|yn4?Ocj#!sHp9>$9mQ^W$i&3FCo4$geWu73dc3##5_Qq-^5y0PuPtbZ#RD3@u7wb2(PbKVm%K&33K$W7|l&!tXip40v%vb(e9 zTUxO6JD!d8^%4ZG*l|-$1l&?jo#`xpiB8 zhdr1bgcJ}pX|EecV2_le?$DmZ9*v*|p6O)fEXjY*_R9PW-I@|2$IWpbARoEmfY&OQ zm3ON1zbEYW=MHFTN;#^e7`;{O2}wK&{)1mOaVpLUkwaf0h#c znmN?9e%SoTWq`7ZZJ58ztg+VnOO^#%(#%}F-OUjh`gDHbQY$Q{?Zz)n_?&w%kG6bC z?C}PG^zSbcBHg%m7WJN`X95EXnBKPjrwSYSDud10`yP#imp<1tW7gSvy&Eenl7nIR z&qWJmyJ#;IL(K->p}I1CxZzMg!`@n))ouuL&ZH)H(yC40ZYArO# zK4D4IaUW&09;Q}ZQ)$!CN2x|#?(+*g=r&-m)`29ag@t@D4D@>OV%PxeH4!Gfs4q?K z4?+?oNqgd(Aw0K=x>VJO$Ok&Y3875}Htiy4{u9g)9^(1R?-P0#riff3O@gT<{j|(Aa`*zjs0XDY-Dc^!Y+$ir7@<|PLzC^deX)BV zs>y>XriFybXQC{XrEC?lCA-jK8~ZM@Z!uF6k|o(0gOV*o*6jOk z?6MA0mdP$;8(|1B3}(z={NC>S{@%a)^B0)Qb*|U@oacEyALrIyU_Id9xqk0`VIq}> zn1}p(t5AlzWWoMa)SuuzpF-1t@hR2g+iJ(WTF1s5F{|$lR5uER1%`;=p- zrtTUjny2^#2XbD+%+)J|jyP(-{o@Xbq|^_jycTO#%^rC|MxEuc+s#EIc5mvC*7EmF!Y3499{WZgAx*g=J9 zGfV44p?l0A8tjU`JSiB%(zP^k2lNPq<`0pbWy2m8t=t|vAz7uY6!#G$0-3)iZM?xx z3`v|%h99TxblzPGcaY5G&UtV57hiVi+BZLx_~+kSer#DX=C4)x$w%%=UAUds!a$sH zg0){=P(CosRc`t0;Gq$(eRBuz%`Xu-Gl zy%Jgx$3;r8ufoUdDTucktEcPFlCVDkDa+zKMvtftvOR8e0#=00 zS-U^<>Jw@mAt2O|?iPmVH{ud7Ei%%l$YtRCo0V%~>SzljS8Vdy>hVS!q_gO0^6p@g z>H7T;TxPLzGx@r42Fv3tq2ukJug(Zq*@i=h?0!i5mc`<}NZ7cpt)X#rmp)U)V;Bt- zcF98oehl(^Yef06S!wvD8;n1d6G(U&OpWvx}klx@vygG6@0Su4M z73wl)P@#-fG$amd*=Roo?bzqVQcRVin}c`XEua`%V|Gt1ynL^!gAhCI8Rk1W5IwOF zF$KolnBFUTQ1_N0YWZ)vPguJAK1x7(nauk^3b@~zWB6W|9=fH^0P5qoOo^oX%Rt1J z0k*GgcGV}N@9_%fS0%CyqA&#wL!>Fql7yM@fs0|zKQiQOW2AMzlq*EN zDPaJ4!C4m-2x7Qz9k3rm)UG>SM2=H zE7N->=7;L4Vf=aSG-#C%2|M40DeeQW>P93de1N?&K}P0-!nIMq##TaTzb593RBWWy zP3i$ebWa`o{+&A0Y&Du>auu7&anYf5d#jk8t*`%Vvz(IN%Xm|_RI%*=MVfRhC$}sE z<5&Oyn<2uGY>n}L!^X`ky(iEstK2LZR-2EKbBf;D74e6K>Hv0c95Y$^GW)vnZ4UXY%8PonNhw9{f zw45uHSaCRr|4sVTJFb)-%=QdT`SEn{tU=`|j{D)A5G?68>1*?Pw>buwh&WigLN3w^ zhe;psB}?dwD2z3}Y7e&5UAV+8QOCTzrxu7zxTMUOX#N#+eAk|4402lUZYK4l7R2s( za0$NQ0o0$U5z_S=-J;bDMgwRw7N;vOj12;!N_9NAKR$TMleJ3*;!p{cv7^M|LWTF< zSI0Jqe}SQM1d6kg1#~}(OX*OT(20iKo~CXESGKWqsfBeoh)~zu9?#+nk(GG2LV|VS zZynaGmwtP|)@5h)Ulp~K@9|fO`kb!;$ZlTpML;bLYkjwS%mu0Yl-zowr6Q4TELybe zk?tN>Lhv-!{Zn6iG~;JNcRn~pt&ne(eN~d{LLlp#m!PeryOT}GEv@^DKA!?w-M1W) z$x_B}ze;pUEVkkSXf9%N*|KCsQNKex_>iMJ9`?ik(_h*JesYj0>$q1rB0dD@PY2Oe z*8vmsndBkmX~4C^YtK!>MZxrutSIPt;XuQ6 zJoW7#L>+p`_109jj zoGLzePH-i`&xxrr-kTv^OF8w>vR3{>mC33EPPQ)9Z4IxDmzlBA!RPLwqOfX>TR(=Erc*2jATzTUXJi`xCKXC_l8DrK`A| zB}F!D8akIoy=mPduR+m_VeCqacXg$fT>S0Qd>Yypzusr5_MT7GGQ2wW@`s~^)2<2G z0Cv=g(%FP#-N6u!ZM4;fQo(E$*u@yclh^uPW}Dl^aE4Uu`j1n)@R{B-cR(}Sfjt!x z@mEdSalp_5{k`nhjxWOllL75to?9gQmDlU2fKTrbMQ?=Fue@Mg zv?>q7UU>)v!5T(8J!(yddf+lb7dz1Sh~fOQ}5$?>hBx>8bzNCl`*SgF!dyObPKUWh|x= zSR3Vig?R^yFnkM3mlVS~ZPQ!4EbC80PGSsNKK3Ns)KrJxsN|CxiezKE&sd}ZE9o{r@L22ak((`Wl`(0>xg*$(QLZ1yU4gYz({ z0wHk1=u5gK&?@4&fCo|ZXgv=)Vij?prOOTCxYT$J$kV^RiqC&?CM}68aXjaTfpH0F zFtC@Z7YC4GI|sLQO1Z4FdwG78F&Yc!C-!Shu4H%$$M-b;4Pwy#!yC2=D-jJtr1WVx zas(wuL+7wnn)uJ0?~V^|ADh;U;~!ZPXW6R1tpv7Rg<{00c$E_3@Z7y5z!9N22<}|6 zj_Mh{Z3qQ#X2v`Cp;Lo((4;LY#&k~4m8^z9P6;{dbHDuM-KzTJ?SGrv~2~9w$YQHGx44nGhQuQ~PBpiB- z;c#Q9o1}pb-<*<#DE3&R9YlHA$5TzpAyLpl3n|~~AgfLq=q-sz!-Sk$Do*bcHCcy; zC%mt&3vdpV?5huFTv@#|%O=~j=e0&^cJ54^a}LzvgR3yNlMFf2lcwRg{sd&w%RQI; zAeW7b=cc?b70ay09ozaWXMGk11Ur8vJ;a_g;s_6sy}%dZ&^=JqRO;8i9hv=vt44?s zL$Mo_uQl8=9QQKvVLUJ<*`ejsPlO`waw?#0zMs4g242gj1L%ijzvhvCw8n78P(L7c zd;Unb*x8|=+D*3@XE?qbO=bRfnRS$5<`I55(CVjM#A#^9dY)qifust8pX?iYxp!<( z#OSmK5*FPRreW(6F*O=5wl0D3>xz`64P$K(*rqz60Ewq&{So;|(WktB@O)rjs3IuL zyIhD*ZR#Oz8D{;f?pQ%t$(;f7OAsLhJ*d`PP<T-nr?5ccu!DtrT@0SiqzP;3q8xM zJg;ZwuFuB`l!(*wNA~_qOb^g0j{Ik*hy%Xv2H|~=WvYKpTvTwg>dO#inqWVecTwL_ znTb4LvHnfpiO3U2r}|$rS!L;EoSpV9#uugQE|Iu?PUS5d2sz9|gb*OJ7n5t$a-TN+ z8icli;}!4Ju@S5p!!uq;a7wVWBig_n@u_}_7_F-;WTxo=PF|MD1O+NWd+#*%fXcMxqGLA|GQzoFl7+_h3vR4mAsX!cZ5THr?o>U*7gM zNA(7C;cw~Zs?hS?o;Ap~qMwYp;swoQ`Fq%U?kW1DB`Ay-0>%j!PKG(n0kxN&{E`@s zI2!Y^)+}w%Oe|H(UB^P+P_w_oyxaDLa#@5H8fb9I-BoVRHoF(4sTO0VDj2&(o8WY! z4{T5w#*|fBFfNTLsdl&B-^TwOoWMPra^S*jDBJ}c3>OWT*$PMYC65&F7_4O>LVJRg zfRcmXJ)0v9qmlkaZTk=BJQKPEx8>mpi-C24!b2-3+}zvQy46RBoWLGYGz6k2lnQp? za?Y_n0xhtSN*$x{$)_JqBe2qKkXkfhT}ycylorp&*}U1VwV27Kbb=+D_$~*MaLqNe z#3s1(xohtQrD)_TX94$>%E`JC==bS54v0nPXi4XvFwEKMe$F;mP!Q?ZhX>rptIu<` z<{z~GFdO{))KKXxUG!=rr^16-&5^6!@$g}gWiOv)G(|DJRdVauT63pqlnZr2x3yNc zeAryTNS6BbeYQXx+usKg!XfZ~NLc7x^VS6?de;C{B^{XcGNu;Rz#u^9XDG*gy#69q z(f6hTWjhcF>J_Hmorh&#aEF~IP(8ae3dn;03&UIoKrwSstF_FrLi>JE#d=wamv>wu z-x~ui0Ea923_Q)&0~Mar!!BcT<`g!xncvM4)!9_+>J&cr(Wyn2DWeiT%lL@GAPkl- z{&Z^1!aw<~1AS!a+}3JBmuhtTcbO&@3>C^;l`Gs<3mxY9kqUN6dg`6FZbAnrE?q!R zIU`OLW!tQTf~sF~WYXViJnb%MmFNm^YDvcyX+YSAMC6b{NH>YBYo6JaZ4^^?p$FWc zG;UXeVno}SW5DIh+K9H9Tb-yz zIrEI>Ofl~8@#mArOkLhBk&xBeEXM9S$Pl>c^3X#lGMNS{7yOWOY30#AXP3^@fr+sD zM6FM|S8102L@3_uOXJ3qQ~!xP{Iqxx8Mkh}->gg?Ur#j-3KqawkY$zmg75R1@g2X} zsc9&@4!X9U3829|2;wYR+^o0N9kq@Ow0YdWFZjS=I444P)4U#5@mGiHp~mI8K8-U6 z!iJJ{A%wR|Am5^y!N2UCX_KM`@#Tii+S^_UtTZoHYhgsdfie@A$A4t-xrqnOa{gG6_c?`D?c?EIA|ZQ^UZ`VdeUeJbUQcUrR~GUZyY7EcI;s9COaB`<`8)@*uiz2)*+qowV&!yWi{xIIrU$UEdvu z3_TCb@=p%_!%c@521q?V!U~%CwJ%t^lA6S7bHPe5(4SlS@h{N{poy4gUr% zPH8iqdXCy-M`MfLD17FxNnt5#%qe17%~5|6rw!dXyCYQtX0bFssp~CprT7%e%2L!d zY$01IWtktgXSmeH(P^l<)fE)CE8zE=f3oi1kaCkN#U?=Ea`RQHa#4zT`8sDlH8*%n z_AS>?8>4rrgw?^-XU8e)zlmj{1Qm7O;n-)CLGdC^7PN)ZqhL$Q%T~v&TYuSY`Hb0) z_3}eD(xiC9iElNR6xR29+yZAMJ{4CTRe?=HrWP`^W*q8h436LK*8o$JV$LoDHR($| zRJH->8+l8EF3O4fl8sKk&F9K24d%~QI|k}gZxQ}aaozl(30$Qb9)~j+SE@rB0S^|Y zkFIOm51()@p0Rjm$${8GmT`Ri`Yj*I5RRV2+t$_Fk5FyS`L^Ja!CqVf-gYB-s{wT% zH6qOI1hJa)l)F@UQuPAJa|fj}Z^ZPms69_1oT#3Zvx_Nz5w6nb{Gwz|?nazB1h9Eb zci`sh3z*Y%KxtcN$>2LA_qLKwviClC@ek(SLPqNa%OlV?1`t8T| z;|-mv0!J!vr^{P&(h4eny@a?d-?j zLd8D@6LG$+$6Vm?(~&bwXZugaqd&j*mnKBR8V$9XVvoxZ;OW!92$%VKEN1@w+>#wOZa17m~?| z5$%S%d!LB{be6TuW_Q=iFYnk+sZtQe&R%AREmqc`w(!6G|NE8x?r@y*Az%z}|3w1R z+<7uB|6J|&KBs5od18It)}Qr7y#&V!nUO&ABOys)rb&@zOvaz?SDjF!-HSCgSvOv6 zIdBwVtfwcNEv>#Yrz!KlNa*4X+g{0SRtIHxm!G(PN6>U!{K;2$r0-8pZwqqG6-(&m zT`h8r-CZz@^fG(h#*yNoni6yEkHgn1vaFWeQ&owi`3i#MtYF))g6ln33-3n~TZ~?I zLRt-vaxA=dEQ$0@x)g9Fn0Nz&aLJxkXpP3f4)wIQIwI0eoeH%#S&E%zdgOML`KF<| z8!)_`?5#^yMXWXE+{-p_SX|c!TQrDQ#!t7TU#F~GXBy_XIX`+FN4Hjdx?tk$H!#Gk zGbr_rx-bDL!|k8Y`bAZll_T9qX8=?`V0hPpNtpR7Q>pU#hS3!Lc)F^6AciW%^+yvf z_{pcfd!sA4&Z_YmoIooW!58pG@tf)$OjZNLU_DI7Z1b`Psj4nW`<2G5A(Iguk-nug z9^S-k$p-@#pniti&r&)*GG+Kx)~feJ-!db{Y+#BZo580WxK8v=vPG-m89{BX)~!&j&knQ^}l&+*&=@t&w{rC!WXj$EApMOYMcdkcNX=o(y0@nUa2{L zMm{YV+OuazIM35DQC4n9Dl%R65jx{ zsLhmhNss21b1$T;^RF(NeQN+6ai5JpOR2U7JG5#s_lUPFa=p56eQZk=)zB|jGt}mv zlR3l>r2l_LY&JBY?kMb49N_B*Dvr#`18lAwO4CDk-tvW*C}z5x(qq1OR8gJ+BT>SGUsP>kGF#WkMzG$NFGOo; z`++HFCK2DpbuAX~*iZWQ;P#5HPeiXJkVgIgtfFwdzArIz7}v!LKy7vixKF%tz|fa7 zd?5kJ%V|Yk3@8nhUo?!-hTPH7=aV*bQ+?klNDEcq;^;ZJ6kJBRf8*<-DpA50dD;tE z*M^>)9ztNv$7|R6+T_oUQ_D#(%9Cbb%!{UQLqDFE(!+0(|0WCQWN(dn#hnzL5+8he zfyl?DmQ1`kS|PMYQSV;QZqL89viQbMr&Ir!NSp)KSPma3rZ!lG-cn1>m@y_4Jx5)2 zBVE7ObZ-|}?>k};EdEwiEy->HP# zykA#A<$;kl=@CDJ*t!EvC#~}KfP7-jRg#<26bGOyh+e&z;mU6Ypxpio>fU$W$F?Zf z-IX$5K4zD3d+wb69ib_(vn}50hAllYlRdm6U3IW(g1W-k1>nYnwK4#CQ~82|0o(XB z<{7#r-cX0v8}4Ux+FNzUdnYae`9@T(2`SVf4^`w1H_IgJF|);*j4?6`8KXgJZUvee z^D-w7zCs$REE#xpcs36AddxW4Y$E<1PM7t0|II9P&J;8c5k6yNmu<6Ff51Qo1?6xC z#aVuuz$=qg190GiZAMy`_lWM`;4~Qt#HFpFttJ`N{eC4#|N743hG50%2bUD9J;5u- z7Yz-Q;H!O(x>$$w5i3a!tnXDE+rw>?JUn)ENSPGvF{xnOZ=Hc#`B;&ZCgPeZu`N2a zh}ZL$_g5l}H=LOag3^ou5kZLts+fIp6`FES*g=<$#MIsJPr2OK@l|W3&y@5wc4W_M z)3bg`KC$k^mHRBS7h4rk5eWog)I3z(qECtrzJ03J0i7i#blJUH3NQ%PC6Uj9+XFWd ziPMkakvolti`(kw)4{R3)BcieGk3o0RG)2XpWPfRQRnz4FIMLVfgc7LuM-WpPu+ml zI2lxO_`COYRqd=QaP=%84{%uC4iV%e6cyGFqrMLt0;20hDvualh)5{?3UgZUf%Q?u z=(XoJHRd!|vDtCx1beD%@UT@ebxQ1)y8gK=s?GO*t)IW4RH!;tagt}fG^c<3Ya?iiC|PbtY^y=9JP6=Twv0L*8CpzPY|U>Tf+x z>4awSp+Degz!C0SEVkUD)ZZGV#QpYqgXro*P`0@@q7L)iS(RJ448#D-8A9&m237#z)`#Y zda~}=GoZuV`tvI*wz{An%?qgt`3@d~70&hcq^{j-;0);8k}_F3T=nKdW8aNK?7$NN z?WVIf?J)7bviIIs2~ON{(4Rx>W4Jk1ImeHH#jy_f?U18n=@?c>vlDqe_TU%#(a;K@ zuCQMZ=8U1UTlAJVx{d<3(t*AjBj1-2b@_V#(R{d}j{G<()y(mjJmm424 zMY9z2(Vg`}p#icz=ZyiDwiu=-NGW zy@dLgM4;L|YN^6aN24_~1~Z3#~oWGgzVoE*1Ugqu*giTK)9FU;9$3+)cp zUtT*L4N51s^kj9vdjaF(K)3%{hRpdNH_O6tzAy~(Uk zO!T#`| zae$rGX#Hl>?PzD}O45QK`Q1Mt1j=42Rzr>X@BRSrh5L>K(&<8YFTk~38OaWkC>pVS z%k4~egNR=KMQyjBu{+E4&Bfks7JHXSp5-&%eR-NCZ;C=^FsWFtx<^rTHV0k`b!JM? z!5J?O4&LgXm8w`&2BSuz{C|Azy0G2s@9O^Q)NFkppMJpEJoqMr3czFFMB$WxQl$k; zm8QDP8>lh(GlOI-IBr%Hv*T-JFc1&xJbV&;lH8~0NTfFnyK%34d6EvAg4F3$#dQ)= zceWPw_CJ{~Pa8a(^z@Y#TJj|pcg}WN0{U9FW>mZClvECd-A5u- zjW&8;nDQxqjjjcaUIG#oOR+Nm`I2%M{hQfxlcmnf%;VO?-mRX&-$S<%86?N!&^}vK zczt#T{+7jWdC>Ml3#ti6fK&-M`Qeg6=Qa43?c#t>Naed1F@l~pmZaj0Yd&(*-3`xs zrKTbd3%KRF0MaH+vAugXkka&*_`ewE-(^oF!4P(C9$oEGZvw@FD27JMXutFS{ zMU-jgjj=XK;ZA1rqku>%*3e?3uD{53hDVBYB;i<4iuTfC@a~#G-HYyqJayuDTH=r7 z88`)&NFAB|k{HuRGS0DfzVlk&&mfGnGz&vuZy!=dVe6Yct9#Sf+2zo#4*RizgIT;s`aSHMw<*x~ha zjsMelPeK^J?Q5EX40>xP+rQ5v2=tBp0PQXz&Rn%v8xn_4_ODQ$Zg$E}=i{BR4USzR zkKu1q3ox@s(o7M~><0Tx<6UH@(#&73Yb>e<*W(6SIF#V&UHLK2+>{?g_|sb zD1YKC;tfgU#=b4DbG^P!6U6?P`omI;9XEOJPC0?BI@ke!_!zsRuty(ip|vXhZb7e) zr7NUq2+)K8BfE!KJlw8{qFPARH-%!#vkDopc7K%Yjd95rgFM(K{kRMA1FMsT9PWva#8$Za*KwKco7-)pXYD#|U>{DioKJ|s<4MB$xx&agg-s@Lnu2u@kd);lydY zxk%eMR#IaSXJi6e_Lao>4mjIk^Myja77rg+AvYUlv-#n&kN3CV7*qblvWLI#-ZPLY zR;SPdkBezftdAHT9{tpP9B3wtVT=_H(Jp z!KxIhS%De@Lox_p)Rj^73#czXuZ+-ALD}aL2JrSjQwi}Guxh^@6;g`)G2Cf-UWf>= zw{Ag+A~B|ug=mxN%G%gqLtU5UC)0fLEhIUOSKeyM0_VGus|YqM+vcII#Dc_2uZv&S zgCZ;4^v2E0XTiJj0V=|%C&&r~6TIy&%`emAQ_uEdz&w~BWL%M(VH^v*>1bb|udx_D zUy{3yR3}HDC~lp$1riVk@{hsw8^@L1!PU)ztygZoN7myX;PN!N^a5%EU7~rb7Pn() zX75Cs7rhcUB$^pjjTF93w(!HJbeWO_9AFH`bbTSIyXo z>^YPwa%sv{5Esn;sZ|J5 zm**KqaHZewYhI)?JsI4q>C=kO8CR;7Z$4j^7tt?8+cwUW=f%)4yv_SVyTto}VyJ}M zCTRskeL<)n!t#OF!Pj>M$5zU-TRZ|_x(FQ3Ia&fhI@?Yv z04d}t`l{Au)omj_BFW_@6=z9RZ!!{^3uoVbUQ-^Q|LRYuC{MgdL}k&)MumbF2)D2gk~N7^yz5GcRHv7nJrOQorNE-C^I|($N#zuZG&HSM(=_118!{u zdPn2FKT5%Chy}*%iY;5*#Wgb}MNI(S@U(u}3AV0B#X*@)kO8n2Xp(idH-MNquyx(k zll2+BI;p84(Kj;KCh3beaVy39uYwKYHg=D*0I9$5lIJkKSS;99Wmd0G7}ohfIAm)@ z0LNx{YpEYyv1=%Vfz2LW#uen=tUUU@-Xw<3UJ7)k9rc|~J8_VGGeH^bD7vZ{cl6jZ zfzOCXVB#bbxMo3bTL0A! z9?YR_=aIhI`1DkX&+A_7k$iAO+{#7*ko2oFrc@wnJGF-FYO|en(LpbN*$h&w8bhv! z5^m-N{&M>wc+e|kyZYi@s|f9)2zGNg>+`-7@;b-s*_Sd(6r1Y~U;KNi>4tJ{QNMOd zHTu)~ic)k8+3J4ni(n;?2be;rOXkAb(*2fG*9+W}HupN0HrwbGXp%z}7}oZ37BW-( zNjZxY@2sANsNGsQ{q^bVr*6k_S-drhWyxR-+lhfKpy4C%e|CVh?czIi=A-31oSc)? zX>^kp78;H2P^^`wAsILeyuOw_W1B>eXvvs<=h{cX{SJ1_30T<}Y4B_QJh+6M#Qz(> zsk{SFU$$wg6HT#3krXM;G%O!|fhSTJ2JyAMaTBAUV$b)}zU+tU<3d}JO!K%wg~F>= z$k2YBeN~lWj8yrhm{cVZ`F=%r{(X2Fu`mJ#Ta>PM)voZhsb|;NB8)w5@L@se7D7W zaF2#?>r`(^`pWNt9GA~8DKq)Y=q7Z@!rUJ`9!vS=(Lk-Pj++}rwIu{GO!y`v^_jaw z;k2=5J(^t2yKVmI6N$NpVrFr}=jL?9dpJ@l8@Q zDD8VmLhi?C4MURMJ;4UZuzjNXqQG`NqdGiI#_+gsf_37d10QI{W_WP=Eyba?74IW0 za#+LF-+i=0C3RLaq@L^>k;9MgpdbgAjz1R@kL+w$vEj7InF^(XlI+x9MliG@;crx` z$62M=`{<63MCCLc$NYV!l6|G%XUih3799k~R_U|v629x?)jlUBxN+Ql(uIUMNgdEc zYsAH0x!Z&vxiAf(i?|c+Wva7gAx<>uEf$cKA;Xb@w=s!7=p&?~jR! zXun(YedGx*`3H?p)sJiY#q*M%n^RQW&WN^cdV+ALvzv<uA*aGE3AC5gq4z<`?n-cgJ>~NfhEKK z>02}M9u*;gQS!E7<>wLZop0L06YEdtI4VnN@VxJ07|nTJmH2|)ThfEkZpG;4q_vFw zgTM%QaO->HxRVad6W`xrm*m^$repONE;>srH|sF*(06C>WtzxM4vz+ye_6Z(`&l<# zyyHnQe#IMNMRAk%s~}6f05JuKhZd++cuOo5V z^i!lu+|hS-Uha7OSM21Z5<|qfC-Q+71z{DT%67)(MVVK6upI*l#YiMz5I8cgqD$fB zd>^%O-^fX>StU4IRXi!h;o$mcpG+1;BA0kmWiI^dYmJKNxyzi6f5fF1)?bIGsFb7T zn(Et&h*eYJxtAM5Q0_7~ABe&q!Y!~xo8==|V(MDXo;~KvH zxAqqr#O3;&VY6)ia6(*ld-%StK7eM3>m2dRTA?= z{ha6R9o(5i|)YOt#H-4@M|PmZnl{V z-h^uwlh{2<#AoQ%SVsz(XAj2(kBjoid5cIfp*^02{e2mNLAT34^`DL znWI9!#e8(Kw8*$B@hwM*c$rkn$g1mAbF!i-1`pLWlJBS=%fPxj8?&&c8gntf=YzW| z&UAd%@qCj}kkD=?JfBgDYQ7a|XGorv`w-B^53=OF{&_y%K8yR(f#_npOvDqSnpfQhB4?9rq?uOR8aJHD9%btpURYa5`l3 zkV z`0wjD3i7ud5MRh4XWLtq)7@1>^z1L*cL6Q3$~o>qN~3$f{=3FLbof^%m;kp-dH(~+ zQTJc2v3CwMv5+J1cQa-y-)?W2A384v^j5O0Nzb!C(qe4Ob#h_3G*A}P3|(NDKWZxd zXRo4h3eeN~uhpo}KhG>F-Th8x+7t19@h|E$Z~uejirFH(G4eX4`Pu-`GR2Gy-goD$ z-<`F+{M#V@9;N7WrnEj~2_`$Z9QVVSsiKj46aG0ym00uVT2?l$$kLKKMis!Xew_t`-o}50rGw##b95X~pFIyW_FNWOBHE1I~zhM7vNZ=NHm2e9V6xITZh_#0G7R;S~8b%LY?w;$-SDe{|Z*70dEwz(J~1xJ{oC^ z82NT|oLh;efp%?Gj0Nw?zp0<0))*h|ZIFIH={hIAY(_AdLpUThXW%vN4DD~)G}w_d zpPh}9o7O>iBn#4t7#_ol081yW9S?sp; zg++$2s~6sVPxIoBL-P&V*5sK;i=rxN+Sr$@_k<^m&0W`B?>;2D(!@YCG47$%lF1wP zuX#evz?l8#FFWG0!HAg~uV_VKIL0^fl#>}Mb4_$h zx`pMHMfMq(M+N(g+ct&n^m)jy@Q!A> z<5qvWf+aS2;4y^)-HnG&j-=y5-xE*V-{bFT__3MAJe?^4h~xh^VMcvYID$5doAf5=F(fR7J1ebBQf=Pt@&_{xRp4&9dgnLz;C;msVkW+d37ZW zdMXqRUzW7aw{K{sqIaA-xZhk>|Eo&kTD#uEYHUnh^w?|@CnaYD8JN>}yFOc-z9SRjE{!<2@r%FCsYUjf%85oX2J( zKZ1JQwmNM=zmkfJxm(mdVHk9HLs$OBpoh$vh`etF=5F8gSl&?)>*0REuJ5n^x~ zEskP-R24C`k*Dgr83ZgRHTkPLW)xGKZ13(j#A(}F50@2qSiRytHtKcH6ATucp10Mr zV`xot!?-7OQ8gOrKwq(yQe9;1a_nrD2r<&?-C5KelQY!ZFMK zDn3V@EBr@tdj8x?)s}F^l=K6{V%GBUA>$!RmHK(Ak*v;2ran{3HZ8)mJd6@_e{s9p<7UHRu$PRbJIe8uKL|BE-TlWW>WrG9sq~H z_$9d^AaAsXV*UuNwU3*WE$uoS{Nb@GaXS1bD@l~?ZukkNPZ7;41vp=0 zWRd{ggjbb^qdC!>Y_L7iemET^1RTX1WF9-YI;^)Uf!u$nW2gSM`8wt0+g*QyptK+0 zbX~HZAtOv8MT?1rSGp9kuti1l2#divj9xkf>_YSwGxQI-I?>S1XMRSj*6S8GjxpUo zolJ3bB6fBq9lkj(;{py;MWKD4ENW6X(q6WD)$1$}62(k?IYDFsm`o(cc@lxExRt2k z(CQJrWM6b}&KY-6tp;|=%)m?-T5PXi&8KjBy;0l@eL9wC;S!)AM1DGpT@m7XdiKNMDHVV`YD zHB@PknkGHj_Dv~Jp5Fefy=AtUdi6!_>76v7H1RkG$;l9+bPaIpRI)LhTJkU=@ARQ~ z2v6L`a+XObTJYz;s!}S+Wa+U(`|W44WWbr&5vR{%WhJmVT1Nkn#2pk^8(dXexyx$LyB(riYfcgBLoTn~ z`nB}`S|wplHV}$t zRZlqKj&7|!(24!S9Z)nNhzW}dJ`V|^<$<)GN-9{Eb}lIABlI=*_F#8`up*>)PTzY( z{<_G!CYqn?nAej4`z`==r?7ITuY8a6Ov&A^@?qRHyvWY_64!^toPKl!aB{VlPmaw9 z$+oLh)bBeX)z2*3m_se|Okfv($uMvfHro%G_tVl<-c>n?{uj+RE+qb|X6t{oqQW4{4Lv)NfQYsD8dQlOoU$+)d{K^X|K4uT5*?6G8kkG% zq+7-A#BrYnh1bpLy91UcbC5+{3N#^*CHWm8L)$LN{|U_QL$QBb!k3L~{$E3!qSYpTbfFj z0g+(4&Ef%d+o?bJim*gGo{P&=c_~|GJ)WgHpuR{m-%Iut+dHoCOLwFmafEM%wLg8Q z3*~g$qlh@>h0%rGp7|fS5u*7Y?gh(5z~Oaw@o@lRQNLzh{pbg>UKF7et0MW}QTz`- zfM#*?Q2wU2OfVLEg|YBh124nuBr-5=p(8c89JQDyCqVaATQ52GCUaNshFAzHD6ZOp zQnb(G>4W8aqmQ^I(XY;cKs(rg9kF$KLGJ7jtg6?72npn)PVTm%x>m2g%kB^uIr$-_ z1vHan0aWX25-Bx&nk~ehKZjfP;!z(HjpfNT`A&GH-*=fEnRcL2AH2V$|pwBYrPG-~X-uz1`$7uASF;o#$~JPk-6B(=&b`FFJQl1T-$? zi*Xg0zLpA3Lz<&L-bF)dF^2ursRi8|`RG>h6Hy@uk0rSP5Bia!h?4m za*FFez$OkV!lNxaZ-ncZdrzd}kWarfBRSS>-0^sW7zl*9bn#wDe$V{nOw%+~%NZO3 zQ0E0454Syo=6#j8h1nX?h$K%I>1cqg?1b>__5a`8aiq9wuKRvWkINETnmQI->^pWY z#?adeN?rfHb3Q5<_VDs$NiKc)&e4UPu;vXI({aYWpH6=z6+&w9X4Q~%cNoQo*Xc9F z(6gE<(uJQ@<{{vnZ;|$xW|k$}X+2MIU+%|%Oi);_28_B_iMn^n&x~>8KBoL^4)tEH zU0~Z3fRALAx>9#w>OW+-5n6?XhbA6idqw)WHXgt{Y6;HOM_=0xpiWFp-wK2)IzG{a z6`jj1yTk?0pu<3%yTiW9o=R64z!Ut8_4PR7?`R3tcb03iHg#SyHEl(Hu4w%+ApqD~ z>CC=WKW}QJah*C~^|8z|yC_~IgcE_<@E1xQEG~S|w+67lm+DwnkDvEqOKHlrn>w}a z()Xttm-fv5#~@c0%2T=;l#ar(eix&}v?zENkyH1Wf(-_fRCFd=$N2 zAgoVf$xJHqq;$P{D3_;c|MCye9{+?i|4_Z^&TZ~kbUO{z$4ZA@aay`=KZnLK1FdS& z%t*trT6mAoW*qb#k!|b~yu0=84<00Wy#wh)9)HE-*ymub?QGx&cv^gqW3;(f;Iiav7Osc!--{|MN zWqz9Ho*I+?T!cwdmyOv>=3Mspz?$NaIH3HtX)lOU=iws199z7GoUesb5@ z-@O?8@&?!V0U@Y{AXyfKp@jXz!CCArX%$sT!!c@VL)kCW4f+)^C5l__8UWvvxZG&w09 zfNHp$@WAlMf0JOABMT2_WhS;OvTR^Hrf|9 zr!->uu>PZs17*O87u0#8^S{)dtH+y`O$+oZUnZ|bL0jlS)Ccac|A07es&XI7l@scV z?=808@C~1m(@Kylx3K-My?aabe`My9td#dI=oy4Ufn~N4-j$;S z;O_C4fS4=qiw*XW@2G`sfUZ$gwn&jpEf>!9a|UbSX9w1m0eQVZsHP!Si9aOzfLr(r zSELgu3nx$-D`vCLn4Z#O2WmP0KXDi2fo_z~!a$&xhT5^gywh>x!mM^=LW%YD*&5`F zTe};3>+MBXvr_mG6-!K=6FXLbI<-mQzLE-$a-zCWN*Nz|`klaZYZ9AJqpej<1@Qx3 z6FiGJtwgc^aD7NOYuJ52Prhf|&i5{TM};aW;<#$@jA2p!Q)B#J!3NW`&?yx0k*OoMJ8-ox z5l(2_lpPt3X~1H^OQc|v?KG4;wGU@72bKzt*x@mC_fsQ05=ltio087-q@m=uxt{}P zPqkd^9uvC2`{&&d5+b#p5^86OYgm8owbqKObRYrh#gfzfofXmmS2Ym~UgPh-T4mJt zgL!l90L-8dBg#Ac_Gv971mTlal7%jH=>iyMzS}orn^1;&fd>Wz!u!@Ksc~rPYktmq z0hYQ}(7!G%zok$*TQ-I>cVOu~rbN$bXle*-@yy9!u>`K%d*pcJRckH=;XWRprx!E3 zPjWN#vE7=y`;1_uHt$*79`i2Qq6B~nev)KYg3$VxpppPGeot68!u)DR4A?Cna~O^g zovg-f%6H;2RZvFBUU{JRSEW)&bRnu7KqZ=O>Nt1?Ngv zuaQP_*ngA2kO6aZJ|K>V=LqppXrDj%>i7hxEW$@%|Zr?c5bBi%g^A=z-(F)(X0bSO5&MM{0x7BhcrEPd+ z)V-!}L~m1JJTpw!5e1l}(6U`Lale`Tle31Nzl>tXFC$b5o`Lh#aJLpxsypn27H{0J z#Ox~Db*%*`rxGeA0a?TM3W*Dx6O2lF>$Tt4fj3uj61{OAU))->{m!siS+zW&d05_h zhE_*d^pU#LNiN)Th|i<)m?2{HZecEToixWF=JCD?;c=UUx2$nlIp9C>QAVO&gu5cRP~9bAZQO{jvVT)*>p1{goKB7JUrVzZ{Rl1mgBMw-Q2w z%Z&I00y+DVJ;#4B;qhAyB!F=bbPZ|%JsK$`GobJJk29=c_e6QEUGZ8u3{ntkmy(^* zFL{oZKAPd6X#kMHdzSn#`dZ!RYk>e?B$S!LyF1NCGruv+xI3_Z=7&&&H`OO?G%doI z)muxM_>pXzG$HGh*z6gap{FxgdVr~H09x?cS7l6m=6JW=oFk$%%nELPi9epv1z2OS z@4E^5I?X^cG$uEuDn;SXz{HBeYSB7lcTcEu9HK&zdFH zGJy#8`(r*`o%@-6_%lnBaaZYnSiT>B^;e|s;VhvDD1&jr$(+V}uCV@fNZqN?W%CzM zhMHpBkYPk6&SScJ>Lt-DCLdi0RvP%1(f~%W7}Sn(TK&Zz9GO@Gj#a?1R$~m^Z!MP;u zU5U1NK>PiQ8OoA>&*y3BEdAkfI`Ss?Uoo{y9d!?xwblWT*Y~sam9I3sYd$4e@0Z%P z@s)bY-F%)1wi?|$GT{MAAC>3Q+`#h6PW`iDY%XoY97>43hbmd!RHNo`(@w8UwnoqVEFz@zku+eBmzCJY~I!oiCezVkTvZU$Y*LiNq zQ%~8_S>HwW$gAQZ_qAF!_@$(3`@;X$ILbE+A3)7|J)*iLdq)Iy^xYX6H=++OTWEUH zUg8ZgCO>AU%if7q#TzAbbAu9`+muoNWvDWre1GV7&F8~fo6B@kh#@|8GXxp1J_&2+ z#ikK6dxa~iKlDKt-5=t1#x3wjZFrHwz7LKoYK53elxrE7BZgiD z?xv^Bp8}U>*{R3aGn&?cye?ZQlE_I`^#~g3>Hke2MFEyQ(9@}5H4p(WYV5n&s`xQi z2^qj%Oto!MC>@RjrYbhPx~mR2D{X3^k}1hd+_Sa9(^BwPTKn?&Pt34SAx%$!l*(tZYldv7&C2aOQg%K+*L7H-z!w-*WhgRzd}`W z^2G4QLuoW*a59)Ezx1T-Kwh4?*rnkExZ76x&a!^r-^frn))LMq%dz?R-4|;;aKx8| zqDeE`6j2hjf&LH1d7MTY03mEY9l*}_Z}oy*K4w#-A$+;==gmag^N~~hjBAqL!XKJk zJ@U4qZl-9?dpBruGtpRdeC&xivh6;>OVwtR7J7Ym=1pM8bXj26beT)r8q&KXeaE*l z_-)ME^?%8Hh{we3R#tvZp#gS4fRP+Udk9Zms?7n0FJd1tMco@>cn{w)lsv{Nqublc zbPn;I@dXNb;*uunfb_;;LLcLlO58%@1NK{+D#9%6SkE8lTLOW1akO|<-&+zv)7VO? zo@xTQ?C=ZO%!msWtDi9XYfY?YMAn;f9`>N)>6m}IuJTa3HUzoaEk(+@4a3)2c5UUx zGA$ z0+IPssl-Gt?yLtKlw>JRY3+J`EOg0xZV99jxn*K-Bq1x(_>LX65Q8|_15KC`K^;d@ zr11(ZfP4bu=@%qW8JG&wDKf0xJW=e7J%*IQj#75Sf{gSCAF~<4q z?HzR_+T$Q87yT-@Cvr9KN@rN)o9H78@23OzGrT44na-2sSC^!>Dy71c9Sv`;Z++pA zuS24Im5wJKV~v!LldkJx2&S<#*D>pL!GcPi;+rYib%uQ3WzCq8?sE0d7Dtli+ zc?8>z%=qey8{KgmDKzWdc`6yzNX^yYll-wD{QKSV<0P=T6*cgUi53_vBZbwIaR!TmHq*ojwNL$>YeOK$9q&W{_`778ah$sUlysI zMvg!CVF9TLX?D~Vy!X;-c2XY&IK8QHj^04{8XdQFr}Ws5B15xLuz*EM4TAtTxzfk9 zYm!@sHiw_}pYA2YT}oUv(rwb7-OQ(LR1(y13K=zzV|nYfM_zUd6^pjXRhA|Xwwlg( zAqBhM4$z2W*cWyAcq^}H2ICH@6z}T~pjr;4W3JU)SF~8YTpM zz4$_={qB2xUMkH&omM)0cZHvil3uTF$Ln{@EKaR4a*P%=4QzYwBW z2iJpbWU=aqsxDA>!>SsE!EOHmJFVcGSdD|#Jd9XLWy=zt**A0i!^$a}&d&6XPgBt! z^fPdY7>+WMW&QHyKjw71lL3SWD&a&dc?+ycCAEZ6^z?azYy%~y0~{`~;H7V#2V6kXOP!e0Wv%x3mBo58Lc4WX~Eyb4KVM!0in*%*b5J=P;7xFoNjhbYLVv zl=}*lCWfJY75n9nRy~^+Ts`SzwPnU@W<`G{fpJ9$4!7;B#F{Su8D8^gE*R={Dpr*L zczJ(fG+vemVfS@Pv5h~XqWhY~g|4w;U#0&e%|TZz?m^f7bW`DN2ghGd*&}QQx0b86 zr$n)S%h1luH(*tQHF;%IS#J+aFH5$X;VN0vN*&P^Jiux;!lvET3!COMa7kum)qD2l zzNX51?Ga}Lt+!4+`J*-JaZbhcOXum+h0d9%om}Fx!%;pbr_`yOaMiu(G+$?2 z^_8I^6>>e!TbsJ~&U!UTDDj_3HBm;b0HsVdAS43Ge%%iuW8=!hWo;u}#vRmAf${~N zC7sTW(K9NI{cp}Z1SV7S_gmFMegAK)7rlg61)ytt5p+GDTYx&h2C+P_8MlLgj|n+B zErE*G^>;+W)|HGSyf)`SxM}KkPzYI*eOIM)e=<5~hoz9d<3B(`Skpkv+L3pqeQX2* z6c2+W(o~yKM+~(~SIfZ@y(#IP)(ZB4sea_?p9%TZ$gps42iXY-bq|aloHdhu$+>R? z&SEQv%W62(>RP^>nHhnM!^5XDmtDpHHUi!XiJ2Q8+OCS=e{0wSxo!tKy&eE$qaIVJ z-t<4y$fR7UBEKv7$wUQWRNW`J6I($si1gk*%Fd-YZPD4uMk8a5!Q={Xq}|GAxvqT) zP1*s9c+DZ}XroX=pPYaX0?(`!HBjDBo%!j{Bl|zfXUCrX(6CS>6yDbU2v@L~x@QWa z+Voh7g-$k5S}ES*vJFEcPrem2oRW2_^fNSa%Z2o{2kgE$DNJ@w)M?s zDtG?%Y=k9cJ%cmVItK8@{CT(RdCVuCb)RtGE(L&l>Ui6)kI8gRl1=o{h|f4r!c|>* zm3rR<@M=E&%RM@0jpnreNhBSUEmb?smWMWGV?}~XfxZ~-2&FQ~${TCzQcdIuDY+$9r zN`@bmdWI1HH}eF6^xl+V7OLG*`M-AU9cMWG%L}vk1)~oqrR-KuZmZ4_*7-oYMyQ`$ z#~7Ig4|ibm>b(03PYc;olv(yPb?%3$uZMm9eX~Moi0tpU0JdTA*r75^->*>Hj3Je_ z=$C$>!mXPK)S`BGLDBTb&W6oco#c4~e=39O2KpZPhAfZ{zMRSq+9xQ4t97YK&?T4C zF@SBI|MTUO=ZH37klbv?;5#O1ypdufT>ZbdHxpqz-aDSCNDj#m7`A|>D3cGMaAlkR z50w%eH#oU$q+e>OV^9iB?5!0Qla#Xrdb?3`E0i+SZ&y3CO^Eo&bx`!SNsF%-Sx?_lzaD=E% z0yI!6TODFXS^?>N252rL&o?zPWdRJB=HI~`Ra!gZ<{G(ElvPMMHl{5ZcjnSAzW?l( z%D~ft$Oo^D*1zJ}#QGu`e>JyJP1VxS2Y(6TpD^cORhg%MUOwX`Reg-~>>8O2=4H-? z+9Rux?0JxQOSkFNdR66z&2SFfGyT$BXeN7EaB8=a;|_^$K*7#vh!S+N@k}!#-FMvq ztnj8Ly~Aa&KGPrRa{l{Bta`^esdjIsaMk!AlUYt~b$wkDyN(GCvT#|F-qY*;_758O z2!KzItFhmWgngu1aUc-xfxW*^+mpXbx?E92cUpf%sM=}lzUE4{ku>IH?WW7bm~%Gi zSq;i-b6M()_5VAgPv9OvF7_;nHNEHFiNBIPN$8rz69`EpCN7=!DUBd-TSor7Ew3mB zCl$Vh*kKm1-_CM7DfG+BqA=PPaue%i*V&spIw_rj4XDbGgu>UZ4OhSXxkwY%BYgos zlES>gMqQP|n^D^o8$sBsDUvy@fR@K=?y;cv0zwGNS4b7ZN0URN`efV{^h3{5gT*rX zE@lSDID@LM1drR6jFfa6!F>75W+U_+aW7(FNfUm~Wcs`KIcgyfG|@Mp(*Put!Ng-H z-R`pwa{W^Bx^Og2rzM{Y8&48=C6WN}%+CRzj(cch{qzP}1wPpccu!g-JjHX(cZ9+Z zJBXg+wMDA!*qZtwB539u(8IZmCQ^X8_W7gVqZ*f-gog6E<$-2lDUFWN&yO;vi$%Tt zrNuu>ys%OcxGZ(pgQRE5Wys7J40(1nR=6E2OhYdLqp+=1x)*n=P*kT5gcqu5B@bmI z3<)1K8b0p$$~#JvHL@0sm)gS(5-=bXACYLZkLT+`xCR2x}?U7cc>WGmL_A|-yRqM_>b?P1_?S;6NGmoH)NFkVM&SAO|e6eBfwiCLanB+rD5mpm)G2Y+dCht`ew6S@-=+&?5 ztESsI#u~7+`sO?b*rRfVAE^a(jxGPWUu+p_U652uvbI$oV<$W<8SquwQ>n+_ku8y% zJ86AfNBZ{N-o5HoETfJOPjjTfvPzyR`@QW^k7#S2@fk*csTplUgj=$2*E1Mgkk*YA z@!cH7w{o1+-^Ii7CO-IW8Q~LK@zcCvSiIBm@!^oj!PSI+#(YqQ0olgGI;$rMhw_Pd zBh}jr`HFHp-vn~cmw%FR6$JBj#>1CP*FvfL@lJJn>^>F*{6KUL_?)tQdLQg}cNJ2M z@){kxLE|_Wf=3;<$ETrmwJyt3Km2Ycfw75XAZl~q_ylW`j3!c;8~^!Ddj*T9!HS^_ zW9L}pY-G=VS0lmB9t=J3dmo+0Xl2^P%22yk@81kY3w0lF&OeMezMn6fgA7hw&3hv? zdZX|Z>DQz~b^>Sx?eOq*oKO(4Hck-06ruY3lK6Fssd((Bn&tdnSmg~eDrHI-hG<|P zICo8^|Hl17-o~PJMRbiiXJvijY|nnEx>zS!eE&!FoTo#VwP;h)L$1GP%Ng zlR+aivsLB*yXUyNg&FTk`5a>hn1|!MpkT&4Yxi$tn|~L%ptD@4J62Vd6~&DRAq^yZ z(PH9*!FNbQ?|jKIM%TMU{i60gN#ffFlurw3Ov1v^T@DUz-b9LZT2>^H%VGuc_bBMx z!hrLTD-E`o3GnynKbXG<@J*;YoAKu*JQowPU0O*2I#8S`i2a@L9El7AKbDKffgIo7 znafjyyNYD)^T*=Otb@V#1wQxdTr-|eQD$^b@o362NPj{%I4e1pr--U((PO!hPnjza zo=zl_-M=(m)CTuI!<9k8Qy7lqHSn|Dwq5Ah7}*W*WaQhOGujLaT}F5jEYv;Kbh%0) zdzU`q%t-eAV~%Sr6i*Jr$&)g4>{xJLirwJ(AB)X%maym#L*WD-aIYCKc7zejf9~!+ zk~SI(IqUm|I7hy~`wc$(>6~aF`-?wct7AmW#b(pE7`O5GGJW9MRdJ50B5@DBP@_1r z_1h?-8^P2!N*Xj|2ZV5-%0F|4;g<6u?pAiO19W;%As^pP<;e9EZdoMHQK7B2aFXj>50swa>-z*-C_;7j&o zVn8+ToRXZ@7U6jVmT4k*Lo}`1&!~IgP}1e%#fEeck=Q+g6a3XePlMw>u%1ZK_5x79 znY%SdY3p+iF$9EcFB;Zj&9y0)MRp1HMbidSABuG+AF8;leO$6<>W3FH0g-)Mi*!7l zKzd&lMIdIwPVZEE1-@mD}RII7}1Xrv=ExLF}cCJWn$S6YP}d zW8#fI%v#> zY(tb1ndGJ!I~u;c*%L@zW5vJjZJYTpg^38(5xgEHV)eVW7#G{v@{76F86TCIK;uF3 zN0`l;NmjVu9d;>9E}c)$UNw`~zuk|h;uXjv8K_5Zc6?d+WY#L6K7Xd+wiciAf=-C zbt>X|9XWbxV2IifT=D~Lc*xtgv0O`0nv4kGa-z}-6Q}u$`;Oo zApFTBMZ91j4qu61Hu^C_EXse3;_qE79Nx7avvilJ2x@%Z);C>w*levQQz$L(c^FPc zaPvw!qlm&`erbrPvRj0iVCREh#J~7w0IeXUGydN|MNWT$`oe6~h2X@?a!lthN%1iX z&1`OaGrbOHLjuLC6V6-V#QHHwqDCK+BMwVC2F+7R(T@biL?K4I!A0sTm`LY*XtTg( zPEiQC-WV;ucjyx_!G7a+N>8UdbEc0KuykL9)+*E6$w;lnNEYV?+W%95x{ow_o&w$U z`w>B`^T|&9GXzLrCnMX(-4af*s=Se;7e;Z?N%Nux`NjeHqLsD8!EBVPgwH#=4rT3Q zimmzK_jPF@Kd>0O;{x0&cqrTiBt|fXbpXZ1bMj;*yq5GKE?4mtf%f%I>iyO>ZimqeJst z9R|JUIOUuk$dCo!_+JK)ChKiovV^$FsG%5hIOXvz6EkzetKkBCctg0N>%33w9ksSC zFKeLbzF4F2ni;ijJDfW9wTn)%OAsrdiB^VQm|Y&7SI|P*0QTSm@azbe$yuVc%D$5+ z$qaZlXumccE_)bv#E(vn-%(EOdRBGB+B5GMZBD~{rZyHQkou^DxEN!fgt!|b+H#$1?u}nOSE&3{451ePG9|1DLGgV zeb0bsdmY{+0xOJomLv)#dZeF8OmmN_K#&uqJa%^Mo!^YIw)x=9*bH$=D)X8|K|Vl& z%{RdjV`K!u5kX*Q^6S6ngOM74s6dox}>MNHrAYNBau6IR0HBKb*K8`{SJd zl$=g9`MX(t?i-d~7?W1AW~6USzGwW#K9t5jy3qG=lg$F##$j;Uq{-Hl=Hl}*Y6-|A z{To6=9K_=@LSHs7KjTNE5Tu@Xm4`JtcUSWJ%YM!KPu`0Th>G6OcwcQOu6I&uhYZ_& zVdJv?$tDvzb;uoYWA1!kk9%{A?Cc@Cu2hYvvC(~4IiYk}^)|ciTKlz)ogTM)%!E{k4L^w`*zWHCe_lXKNi@~w^%CSeg>G8VZ8px7tAcC8Nc}C zI-|N(?bZJmfqF{lj-yyMz9|c4=%P84P8$VFmJX#qzoGfK2HCcJeq1Xs@lE{~X%e#) zu@Jl3ud0q+qVZ;a;V{z|K~FDd8ZoD(05cTuV@7wc{R*6H53&(Wc)V;3vZD^F2Kt=A z_k;)537|6eapPn@Q;>Nbd8sHzzY1If%0vfZ<*@HoK?pj8vX#6*%Bc4Qnl(BXSm2g6 zWEU{m#FwvGX?p0lUdI%6s<6|ivf~fS2ZA{%ZC~vW?8<&KEg@gyIkd&`fuRM>v2 z_w5(V+#X8$nG&QaHSZTJu$4oE$ue~4ue0_+_h;6b$C502%15d^)<&m|G^aOR5iawv13%4})lP<9oDj8-rnw9}Tb8r_|937S3Kv)9UoSQ{C8{5S1!I5`WTf2G|@F(TR!xK(#>BBo@CC* zA+P%zZDiN-KW?9Hi6c98TGB+3`wk~9)+CsZFE>Q2;EO~rnv3%!=o=QEW3L_yyxn?2 zDDt`Z?Uq*=jBPLW!wLQ6U%wodhvZ`!-;Xa{wq?vSamf=*GT#&`cK!h`bfd0v^}AQU zI%z$-+4~fQ&G;dgDaU&$XOmQKIa!Cu@EQ2edoEPN!}6{qd)0gHP~x?HBCc>^;Z#2c z)2ql6`_1mFcf0Q{0PTwp)1f&+WdP;E5e~^u_+aXXy<31eQ<$r-!+bjHx)Ju4xmHu4 zBwHqX#Ccl5TIPyR_dCvqZ(t`FVJV9jOzpnrmW?7wzcOMXU63PcCs`f^pvqXtkXa(% zwPGk!{Ny`nB3j=U%amHSuZS6KUI5N|V|&Y^%}p@EvV^t{`S(?eTd_Z8r#Okv9#{h~ zQnYS55FXrnaQ*KE#bNSPENge=Pxdd-`NMe<9rG(@_PCW6EEqK;b@W|RfIpl^H1Y08 zK4W8X8aA1qN-VD@H#^g+tT{Zsi9?^-0SV`Iaa}7DiHl}E_Ft`2`L-(eNE2F`p)F%e z&{!KOm+UoL8!WTcsk%)zuk`dR6kFs^<6Eg9_GHATt9%7jnMK)Fu6M94pekrfZ<#b; zb$d}sVm#*rr}bW<<4Cr&XEnaVZa3(6uLo^dwl1AWc<_9o#1-z>@|m+(aw2&o$vCH) zh9Olz$Rl5fbWTuVop?vCcu_n5OIasG;K z=WJONnrENOv861=fIm7V^UIRi*x*O~6Dyy>>Y3DEuHP%I9d`IH(D01$K!GqqlI8Mn z9BV^h{o7JGlc!|$Rm~x82h9z{O(})JrlAVtQB#oGQNXIP?+}^zJNYVPdyN}U=7eH7 z!h3lU{>&kzry~d$P#1;JfAtbt+ox9*`l>LrOAh30<+Qt)lubQwmZa|PA!-$HbBtvm&O8I=D!9QQVUJw3>PiZ2DW+^G%QiIzAx-*%Dc z#LQb*4NbN_vcm)EDXu14bHv6eHZHxf7f@g+w@LrXI)ca|J5nJK@^AZ_hS2=v3l!?^ zA#2|B>b+K5o!wd0J_X-k>BsR9P@Vf5j z_jhi1H+FUo_SB|?9CIx7`3kg2SwcLLd)ckp=9j`=ktbstop@h=?`KmH*fc5n`wAj0-jQ8p~Se{jEQ$B=p`-$-lcoVoPE z>YdnQRM$>8cCR0BAVxa>^7o`jow%d9j@8o{i4d?x8aGl}L1)-5wa(9rld4}5*hg*z zwC-3K?4I#PA#2B)A#Yu*se;Q0x+DhSx(;T)k6MbZp5zhg+W#K&8|1JcK4tz=MU#Ek zpybOmFF31PHykHhJi9Zh(oJmBCJ;oLQawS;AJ8SITi8O$+^Ex$6Ma@1b7V$7gHt+e zmUb@;*)~9+V!{4C)IE3BAoo7P(J!6?%xX^k*dwDh$t2LCXCs{Ug~uSa0@HX(WBNTY zBCs-iKEn?W^*f+8Y>2^fZgTfxf=lS zIXq}~5j`O^TRiA_M>b5{eiM0CjZ!m@CRPwjVAr|2x1H2-v)L37w;&84Scv{L)l>vK zZ>3?BcmCXsyYG*1qjSmBUnu!L{GHRO7ZG6gv+wn+xLvvvYs@|RHmc6giTHRHKyY1! zVEpqpSE;T)%RKJB$!A@Cvm0D)!3{}pN|PDUD~nwS==C*(A!!1t)N$GYd41_0a@_(# zK>+w|_Vj$KcCxkw)X45mv0`E~E{#wBBmJW3n6=Yaz!bD9GM4j5CSvE+w(OHfVRp$a zJQ04c|B7rHJAWObA9s>B(72vE8WV5Tp1+lCtSU5fjhRxF8-3zkLoFFL*p@k1$8z}} z^%O=CbGP`Ke`n)3YuW{lN<2Q_L@ero^~3j_X7|sk-(E(l{i(kw^-}6yb%$$BJV^O3 zH}ccq#r8| zF3`S%4E7&R#bt8&+g^NbEwXzXv&G$wPf$|P-!S&_Yxx}~6$EE~=E>M20=#x2QU9Zv zzk`cU?cbG#V;SHh4S;eJ=rKB-bS_=!^sUe>KJ?XUn}H@}6YZsx-`$~v{2mfff!7o8 z&QXQ=#Lj)yX6dXC)Ns`sIiDk&|C{5ihv(aVGgrIJXcUBJmhWt$7MnmzP1)?{!DsZz zv0@=lsVXFmLTl));N`+TbG{+50s-ZbHUb9Q@yUe3rB=6T0LrUJ1EvegcOrDBsbj*k zP!=3i9x#jTpyu0hIxGsW{q!JwtN(r2i>){Xl`pk3>@QkZ$*a?!mB$ox6#0OTHsf&0ISvKGTel$TP&*a1mlvlBIApT+RL< zOl2JOvxsxHNIqssyYGLEQ6!9F^U{e;xaVvm=!AHq*GviBJLxSO`nF~+?k)W*JP*BR zGY9lmxetJ0IPMUngeVOeLK z3O!}Z2K>|sL-L)K3086T)Q0VH_!mJxaiOLoev6Y+6g7GQmJVGi7t`0^CEw}JRx#&B zUwEfgEyg;LyzIt0JFmIha%!8?`#^E2Rd(OiOadG|m zZ}8&%mSDoRx0QETN+HCo7dzp3#N$NLoA&JNYj@v>1CEYDR(q4i+F;u7W-?^q#PsWy zmt!GgBaHq}9r@!>jT9YWj$@3PmNkgucX!X^LpdB+IU_|5YE%xMj50pG5_8pms6+%< z+5xv4Efcv;pSjiH_GA;nv(9C!(Q;Jm3hziNm1v9JstbtuB(hqZBn`?VY0c{!F6Z*@ z+9N|%KU=^1W{(QOXP8uKIQVP~HdJW+z%BR*1keL08TYFanv0W}K1zy9)?MX_%NTvz zmux_|rGv&YLJLFAMcG@py!Xh;Xywkd(2k0JdH~h+X(>nP5oVNJ@kDS`Zbzzl{Jiv z%xe4NRk3;@KuuD|c=Dg-ws%#w)Pkd+Yq&xP2{gc`7kSo3JBW0DTd`hzXCO5*aMZ?8af|CTPdlddr{DAIMbYfDpx+yW z*P&la-1gKG7W-68m5VBa-43^#0my5L&cO|LXUN|tjZnen#Oj%mmf3YcrXd2c>iF<7 z474j>HUQkl7fak>DH_~$14|K&jEB;BR#$Q7zQ9QiZxhp8UVM7=63Dx}i1cF!`PN!$ z(ajVH_N^>*v9WJw=qV$|MHQ|RkZR?W_gBS&-xFl0TctF259Hp>a7qzXhiW4oBDkVR z>3h)7hk8AX;;&l>_esv&ckWZmXy^jPg9r#6e*u_tayY~Di}7fP?2Kr8$Vm|ob{UuOZpF*HSI3OpbA789N z60C*$#t!eguJNUf9-He2#3j;Jcd`(0n z%81`1-O4KZZ)8sgSGA)xz)nHU+Qig7tA>%&cb41SFA{JX@J2W4?E zr5oo-z?ee@TvBa|rO(fb!NgpP+P{3WW4IuoM6fw8x<%`I4P{#Qzp6be(mbZ%xDciHPsszYuI`U_@uVoDI4}dM+h@dWJiP~g$r2pY^8IVDlel&}I zbmaHIP_%|L6OymdSwq%XEhYOXe0>%yWlYs05XtLCD69uaGUm({bQHH+j{F>@jc**4 zg*TqvjL`HTdhV>o)!b+JWqJet3JCWB1wNjZe9pN7hcn^Z`<@ZtjvUfpNH@s*STgx z)_hwn72T3yxvj$MivIYn`VMB#VUcdG?+O6nJh0Yd{!8H)bz0g!mwd48!Vq;`xU=eL z)qY>erZu$hZdbAQFolRm4lmev40}A*ED{&W9JBmWTX%qtL9#ZuJSgS4C@JqzR+;Cg zvOvT9env>lmtS|0o|BNpO`T&K7Q>B%SN$q{em>+4ZE1%&A0GZnoV>Ri_cqm>IA;7btJZ^XbCYuXyEqeW|1zU}iu4ohV*UaD1xAK=&wOqM63sJ=^ zU153Q<|=aEU`6{}-C?S{Wg@yNY1h>a{+L?!^@}#o8J$rOnq~f*{tUF7)5rfh{i1aL zOWxQ+tIyF#A^j+>tdW48jrubi{E9;elf&$_H%09fgjp>d z^N%!NY!_>ce{~bn9WkG0Q@CdSo?dTGdWsAcT5m9QW8b${nAxhAcOTx{hZK_NjOfZS z*nY}+Nf>hgZy*44OPJW4li`&=`K9h$^0}tMDihPBFRLC#FLNt z@fp*b^M1OZb$f-(>!ON3i&0*48aCeXWxhkhDj*?pBEP(@q5RPXQbHog{q_C?q&Sp#eYq|U5ev(VwO+sk?YNjZ(0TU!`5@&Z+>qB zQ-2su`Y@kqFxXkIb@HULQ@@0d6>=^IUSZt{7y#cxQ45+igJemEf}`QJIumVQcV>(<-*&3WaK%l++IG zqx!3VBP7;PP2M4I!}31%55^JHsJN%}R@2dA`O)vbe;0X$erXf9SF)ofn|Xp$=`P>+ zC6u&Z(oR{;LWnstsk*XqvX>q#ZYS(W@I}dAf9JOi)5gP1X2Zz`59cj9yN8m1I;jeZ zih8H9F+#b73p&)k-b86S$PpYolvqO2zU8Dua1{!M99E{Sx3FyAivF(mc~XdRN4LD_ zGQI)C&871%6A7mM@J1nF>Bcu2LDs-njs{*0lB0Avv@Vd4zvIs^U!LvO(G^N8OdxzW z*aS4m=q4B;k~M?p{lr~?O}_Eu$H)sy62wPCc8U9j?XKd+B_sGKx`OVVyI}G}Q}8M$ z5xx>3?rn1R-Pw)$_?a5fg??}9v>v%e82l(G&Vgy?R|4aGf%4nPvMpZ){sHTPQ@ydv zdz(C;GXFQLnRUp?!gm8?eHf~|q0{Yzl_qL}>{vNlN{P?Ppw&l3SG2b8H>$~E3JhY4 zso#D`82I7;&TVN@(pLR49a}!+ZP{P6?%D8iew5Rn#%oIL)-JifIEs$fB6h|5*dOsN z5AHQv+h@$(tT04s+*h3GT zN1NIeLELE<%HOAWrigj&f5|D{k|~utz^X6f81!1M-VoggS=~L7g`yGX@>F;O;H(jR zoIQ#cz`ID95G1`&2~1oT+*vt&#eaC#@ecLU>1aJ=|Z zyGt>qE$CpckJ%`@s2S$0C@rU@^LnJ&9d`lNdaz|4vfM@9SD)?E=w`6$uVc-Vr?n3I zAtRc|ywLnPl*GQ?m}$(!sih#J(beAtb-m`F_3Td;Ru9aG~^RtEk<=06a8eSNp=4U-BE4_&ZV9D8f2|j6~sfG!xhN*oYI?- zHW_}o2UP~a(+Ll{7E2owHRVrC|AG(->d!LrUS1r{)PE$X8#HuV%1}hEjQC}}1UcQ` zujD67CkVY&B@oWYWxEDInABV5&zA+MdVr*_b3(n}yrNh@m9rmuo0#MWm=c2nh=FsO zIFXsZv@jqcy@_DJ-!Q&8N)os(SnaK6&6K99+F_$9|XWm~}zzcSw=v=p30pPpR5o$4NvHeLh zs1V#{>>e-EjLfhM{FlAFnSHR5jM{2l@lTNr!2|QyRz49P%zrz<)nSpl zQP%qQh;@_a_Y={y1S2BdkiO+sd0qG|>E}>_wc}@dg|ZnVqym(AVmkt9Ud1`=r=6zi za7?$+pg5L%#x1GT?<(4VdMv{sNSF1gezmUTBRI1EtsO>o#FQnUWTt$-?rmr}-gR!! zhsy((tLgt_D#n`fjtCAVM=1Y_b)`gwz)XkVDuwA9D%*ysP;I&Uq|CV zW2qTKkau@YXxiwDittAQVR@p@bHf!pwrE9_+Fv7XJ3(JaTnUAV!bjO!_CXAI@rJkN zpV>2QBz=$QZvP)$Umgx++x|ZWWh)_DS+XS|l_Gl)LLsupC|k0OCB`<3O0p**36-s~ z?=qO7Q1*QrW9+-J8^g@_-97L3eUJBfpMJ;Tm}CAL*L~gBbuORtbAC>&`fh}gKl@>L z2C<$jN3$ZWv)8NqMLPQzc=Ugt!yv*Q?_vHyGjeZ{IH^HnICQ`!v>17dKZ)a&(cV5j zsRuCt6y9%$W?Rh!#n<(<0^E>WQx?5dqS=5779o|PIO{~HHqRi?4VZpw?D2(+JJKe) z-i~W0h?~+sem~CErN$>QXhNaPN#-$q+z3Y z=PO@({9H_s+k#jM(?U!7$~u9dMt6JS?)Ou4GIz1ynKe_$p)+ayXdw*q_Ai(5_s5CZ z+BsdgR=+a<^$)1al=Pc#0ECH@!Pl6_VlMJgSv`NCfp+(*H!!fxFO}H%m&@4MGFR=T zbFm9)Y_bHdva$~zUh}6%{nc78^)G^V6LPq9z&0H1oJrdGCO18WZMsaBUQ!rG0s3N6 zx#w3KX8W|Ws&~;W=QnU(eFehA-&{f1Q6j+gD`uIP2L_}>4H?ys2`Z6a<5Hq}&5f z+m;82_bL|E^io9use!+*{R~r5i(=tuQ(Ty*@S>_5(6#x7X`s( zyXHg=*5e|l_MO%+_{`v`y>>!RsE{?et2yDTR`o-eC-G!=dZk+qF!MY$tksTvMe>gH zDS%6KP0x~}q~fRTb5SH$;htGO(EO-Dy2S|)0M`8Hm^0%7>d!uyvl_w8djg7@bsG7M z>+&s-g>*RWWE5fEu=cHMCMqud+JM?-IC23&$M`P@{J%fj=1;>y+`r$&{_ZusYcNI* zkk1Y0yv)8i6a}hhco=YQpZDRO4%1X{;AnE45Nt<#%G{fLMYTlvx!jX^07(-I4PW24 z2c$rY8><)(^!r$hK+hzYCzO{gN*WbIgH#Kax#`C0j|RMBvWvFf-2Ha_qn{XfFB2A0 zd$2Ou1tSD(M-U@iV*QK+)qVjze}v>3G0EAx-7QwM`bN>cMKOT6c^{c}F#9h~%wGZT zzn3qQQDlq6zsN)ZecG46!*L5~X%=)LAJBZCNI6=1`$FfyZ(DD!N3L*h0K!oJB?Qim5bUr-Oi0Z#M2|IHfy(S#-2J7(3fUigk1IYfF!DDNP#d5wLk^$5)c#Io7hbI2 zo!KC&RS7I4-kF_O-!StOb}gc8l8Z~Lrr>?WpOUxA-L*|!I6Y2_ecmpZExP4sv|suA zVNo7{J0E@;X~%9;^z;5l?mDghWf=}E*Q1$L9b+Xs5}mL?9O4B?-G4Ki*dv+YjS2X}Qw?nFNTx5=!>1%Hh=#ze<^eoE>wP@}fN!p+ zB`x`!q8=n*wyu-Ny0QMchV{eLp81T0akz~jFcm7W`2dld1sqM8^QcS5MwQDfCF$7i zjXhM7cHuWw=Pyd53!#$q_y>Lt48e zW)QwSl7Npem2*0d*!o6<&_;QEw%1fSu#u7o8{l_`s5E+f3lRy#D|=rWYP2Xzxxz_K zk5YqXle=_{DCgHwVS|z6|)&9N-#mYiK+c31ax>-h#P0x*6f2Gr zhJOmCSc##GG(nhaXHbxp`ker#iGP^Yryb5*05y|xXIs0-=i1%58x&xE9(fC&D-`su zNzSoPmtAAf)~7F&*qh4!zYSLY3`Rti0A$1gH*S zKM79y_R^?i(NLR>yZ}GC#Kjs(<_U*BhIKI!)bF`rfB#cR3m1Za4c-h?1@Eh{{&v7z zbnkCoWF1!kR~vGWgTJ>3E!FRPL~O!mM!4`X!I*|Ak_pp9DslGY8i=+>HG0yeb||Xb zg4mZff*o#S#t63iBIjL7R3J-w_O~D}t(Zp5nC+$C#p{0U<4zv>JnXUctQM*c+=&r$ ztocLOc{>&Q_LErDZiFrrV->UsgEb`9Cs~8!w7^whzUoi@=L_~KW`fWiR|civZ)H#! z84@U?FwpV;c?>{J3@jA1@`b2ZOTX6-YX%(tIzVDOJZ?V+m?i9|q4`}6Y7`OIVpu|< zQp9x88I-i6XalJ7+iS0GUc6%({BotvyK4yDk{%qod`O;dL6Z(U>Gf8WA6;3$e$Pu9 zwVL_f3`97na0!lc7NTF<^>Y#rB~d@!k&ZKCvd|=Nswa-^1Z3#(Hk1#rSX!)iHoCc> zE|K%R2#*N2IWael_AWd4ofeR4=d6maDT|+dBO014^Xyoqnw3!pxm{?<;5D|tZ!#*0*X=s?*UT|tPO7x>+pqyK-8?9 z_&Tq!(&$Uu7(ikKDp9O6b6gvQZuAE~Vt>l#A=+9Uv#htp*zJ=a3VcM5+$3*g?*ZTG#=|;w<%=5bb99~QR)|_ed z#7H$bKX@PLO&FOs^3y#*7qY2sC{1_!7K7KHZ`3S!Z|XF=zpNF@=@m)_d1mNZ}+1tvX&BWIEX5bzD0`nD5q-ky1AzYvu&b9kmd>r=~ykudy-MrZA+6A|4 zjFt?uUqZ5NlSRRNRG>qsOM)(6K*9@XU8NMf{L?vnqHqI5z}bdO(>)B@$7oGC(}h4u zgAmnjY98cJHR^7Am8##$JyJMHt&;;Qio%RC*~hHd%2dSh3UOgyc87fkW6%<`alX6J z<|jb@Tsjo&Sf2DC@Qsa<%FhFZm#%q|kS`&gwf;xmo=4G$VV?ZssxdtsC}9TknN&?`g&D9Z$1xV` z-~Zb6P*Iz4dZSa;guQXsP8S3fkVcABTY?U)Wl?5q(|BxVT&UrcarR>gF4^%?p0Al6 zY@6!gAIVy8cY~(>?_~rsTu`w=h}k4+?h$$)e0`HVt-x|k5!Y( zds!O>qAkW929oxC<;0mO13BZK>EW0AZ`h(kYydq4@HNpt7`n>m9WfxOUM5o;wd{PC zE#=WDe`K)7lJ%9 z14RNPSoTCXLa%g1n&Vz@V@K1uTdiYVV@?PqV9#rsbq4tzDFF|>!fkz+9XzsRL{yyh zLmKA9SG55xw{};&WKp@9oR-@8a>#IFewjr8)e(Ifm)&w*3#7sMr|s+;VF0wnRIo8m zb+*r&gD?Xr^8?d?!qx}|ueLe}@p!&;8Yok2kB(kr7AA- zZ6V!1sIO-|vT->nX6&LrUUIpy9y2sGV0)@R!|xa7-Gt%dp1TC{YH8J(Kqg=qFVN8Lug#(o->3#;qUfh-cB<@j(Yqp^ zW}RQ7D=zm$+Rd1i(w1@~FY3_nQeQ2?yrN=wJlpOwk9J>>e^Esd4VZ$l6~%;ETF|+V z61C|q8iDR>uOBNX5$n6pqAe7{wr&h$kQs}0=)(VGzD_CJ1(NPhu(zVYYILf>LJS^& zNQo%S;WOav=hN-uagjFCCwFWyT0Rz`Cw2N~PMo5$-rrE7M;BhIby8D}K;I2o4$P2; z@+_Z6oxTa4j_=Yg7u~F4vNwSA7e+dm+an3@4`+DO z-RIOs;7{lN^5tB)c1!Bi#N4(ZtMRW)N*=fB| zv*{g&H{x(VyzW1?CA;LJI3|80e80 zB5Gz;mzH$-*J0k_G%LP~vZ00Vf={^#=t%>az3L{}MMG~2kZ$!B^{T$7< z9|g4E-X3yv>wrw*Yk!VLQqQ2++Xbm;wwvw8LpNvXM}}JQmx45XMg2#l`nIO@Mhcpj zf!R%o6viuZtizXHzp-WRM@R&>{OrNL!dAR50Gd>)Pm5IGSqMonOcNNUKRy1U`wie# z&8)rdW53&4Iuyn5qPS^$)AVIaOfOej#C=KTPOCn<(_0e}!v&v)G~6LitI%Of+m1yo z+m0HkO>lC&zgZv&#RZmiSF#nX>{#9caV?9WG`iISF2eZ*DbI*`o`T`RHJ=Vz z1v8fF%jd=LLv@=KGrBcJlyM?4v}=q2-$0Cxs~|?d{3GRWSj6V&fTBR-H`N)=INO|Y zw+JoIkXT_-2=Y5$o1gezetq;UuTirn_czF}!n3N?VT;0bk8cmJRzDqbf=%jM58kqm zVe0HvV8w68+DiwtbkCkvoy3*aiJ^G8uH1`6YDwhE%=AP2x}g=fg>XtajnDpL-7 zluygicM9Di6ljWW{$F&P|IW>drM4N@fw2XCV1Smr z2ISW|D}~oGn(}o(d7#02Ryy_ePDQ#rZ{Hb3-;p=>>1>q2aH#U5&1MiiyBhqp+ePmjn3EB2%bB;~M`62mf~ zCakyh8D41QarmacO|;S?ycitdESzJ!{|!jT?p~3vToZ}?-<-wX$^8?E=dm6-u>5Hy z`;t3@>pW+lb5f-P+t0R!ApfA~^7jDybwY30?+mF2=O5N;AsSd=o9hAD?u-x%y}^BK zB|fa^CX?1m`@tFUr3V^4 z@Y(RC%NK;-)LOjpIOvD^LCTyIDW0V4@qI*Lu(4Q{2AMURD1%rT^0o1enEtx~1cH^h zhg=Nnq2egU_)?qjpSYM$n?rQV#oek#CwU^OQ+rP(Cd+U9$PHVvOhI#~GNT8)2=6@# zb0V@?CgLmar=Xc)wq?gss-@L*28j4(wSR)sFdZe*+6tAW6uyVr`-Ike08XJU9hZio_ zhjcX%4PX>aQibp-4y=abr}6ZF5Aq5;5|0F|C|4`IHo z5~ui{4(hCk7CowuU68%9Rks`OlSW^7@nk+FJ4ADKRy-e6k+o?)cj2j|ebp)AX%82P zP}lU^gp?}e0JxgF+QG@UhYQQY(J*f&8o=JCKlaXb$|8k)++G@atPAigW7OUe)g*Bg zav>6Uabp?v{m1>;X(2(9UKb7*iESBDkf2xD>|^Jgv}-({D^Kw)2OAH;x?0dj+o#`R zXnAO~9AXKE4)?4sXqT+t4jxLJweh6fEF6k@(fN9GyW!?0VzH{|^K#rDf*}R^LqTlc zUFgLhquQY0lXq2)x+)c^8COLt(lG;L#aP;oJ#hNW(sNVVZ@wu3=wey5si=FCUdKYW zQa&4jvzkp<)FW`52~A+KJFAEXaK#>tTi`taQIyQM1m62$fajRg&f&z~a{<)DGzg~1 z&_pH+RnC2T5*B)Y2wrC8{D3C{G>7;cO}kB+&A5zX`m!%3yg;MGx!>HR;*${v&+tR) zlnA21QH=pO*#-F-khN0(vU-;sH{g^VcW?L5Wz7gD`|Ya=q(9@+%GY3{tp_rvPPgtB zY<>~T$PMUh$~7d99%;K=8RanjsrZ(yinT}!IK8G{^ z(<`-2U{ANCR$VAmlq|e&u=hzZH~I6?1qY{kI#mT37vdDjL4YL0((*=bX;S&3mgTaq zxECk(y!8CjR%7l@N2Kq#G;o#Rw0jiLbtg+fhHWYkkj5hf?pk&vCYxP9Bl2jfiaH#& zRRKky16MY3-zCQhc*Lf+7om8_sS-dK46%9v8lNH|xw%u|;DC22wYE}^#aGMkJ=~kc zP;cl5zaHGeefQHKPtS!J-AzB-CcK;99_T(tf(a{d9u#f5Wx74W6Wua3{2-BS@@XxX zmh&?I*8rb+`$7U>Kz2vp>ctz0#P_k;H?e5yG>LxvG}t`gYWnfvm0!kiCm#_b7c5sP z?gs8GI_>Hk;*O;0T9n9<)@m^9NNtVeX7Kl7K7U52=GHwjjoTZ|feiLBu$mV4I`4qu-jS8X^=E^BbitP$M7=fEAp&$1#{)cpSJ=`m zJ$M3hRSv#{;qN(c+@j2@V|VH{zftz*kB5PTCR&gLf%BuoEiFDaTK~N1jSDOjiwo5# z7BLj*9@x^Q{X(#nR$7luE)@O^KduQ%7OhT%nd@+#_goH0Rp8QjVI8j`ogQ6rI~8d@ z>epSlqi?TI+D|AE_2V?-mv(oHSCO^uYNw1p6Wnm)PZzxHdK?bk+Z&1M_+<_{uuobC z#6yIITM1u00yi7xn%I>BRRX}fNVns7gz!LwRndSV>ae3=?le~8kzGC{Q?-R3t8sum z#0%{2L9QNP{E%Ce%>5;2#-h)(wz=-3CgX&?w%YNdw8;JEm2R>fEOYzn!?k-_rs*xxjQnfvoACJ13Wn;?G09HR z-)e0+tPiZOLbM)W@l@PFI5NXU{|_0MZNo8jddrQ?4jpuXOaQkGsU%lg;^;X?V*d5W z975Q2+Xt%TymGSgl*L`Tm0J^6vU zhKrlQl4)TZA2Gl;|U1)w;fN*sxCVqL)L1G~@PJgc(qF6*pJuFb#D=3e) zsz4r0&Sf9nWE-8Y?~%Mcf0aIfGiU6iNhQ3)R~LkoKfGWG>_s0x5Ekv_-JerIUVV7h z|G(qOzrL3hACpIMa~JtlFFbjU?PRE2jO-xXDXNkVj~M62MqV(e*VI4Wtv{ypP<#37 zR0PC$#&@=;SDtk^;j`F!R$;ispwknZBQr(4k@!>6NN!0Z6|ubrA-a$+N`bUi6ex$Q z^)=&q8*-y!PAL)n3WJHW5V8Q&;p;XxpmY318Z>8LY+8w%_&NHKJVFO`b*@QxkT5PG zl)WDuR_fYP9ssURi(un$>)U7aq9w`g#6-yT0-kCvao9nkBIU+vh1fq}7;^D8u<*n$ zZH%H-Np%Sul@A0?eAkb3V=NYJ3wyirF{vtn@4V^HzO>FYmU;>|B2?lcHHY$H)q*=$ zq44bNhImor&hA( z*4+&DjsRDvI&jfOqf;_X64||SXtZC4D+KAN+AWUhPq+-dn?EFGcC=Xw@5RXRZMe>^ zL9ZOeP@bKH#*bj}(8Ke->2$T{=_!8U=-G$wc;Oeh~#fTmx=326A1CmtOrmQc zv>RJvahO4YM@@OXawvY9^F?P6%wqi!L;y6JL#}k4n&bb8w`%Ar zF&=*auHIsKB<5eRE*nr9NZT#_=Rzx!C0OjmuJ`#!S(ms^*KV&`5#0`-v?7m6$`A|m~{2~<(&qTd`|Q2!uNY-0v}am zxfs3J+qke=w@+Xl$m~d20-Cx(?VuUqt?MsXld%OIp>l*F)x(7Z88?g7oo1~flu)>2 z8E}*^EPBM*f3-9I*WtHE4_ESI^)sH>O4Rxr#c?#Qt`JQ22Lm*FS;o|x=SU1ohAj#8 z35#R}ubB9}%;!)u=f!K9Fl+zHeRzxGCN+N?mgG$7R z3kWht8Q1$$T}8m)1a>FdI`OOC^UZe4tOsX{J4}}= zNO1;IMay;m{r7kR=)!lk?4Qq30(!QF8;*;fS;L+HGhkAS;8bm-)=;xl{Tjx^G;xJK zVD-z~dY*2oVr+&-Y)1X?d)44?N&~>84~9SZt24tw$7{W71DB_Qe5YC~Qh>6XgfoZ~ z|Ge-gzT^#ObrLWi6x=`Ys~3N(1P`c^YMt+bFEJ0AwItR)Pfp%T22eJQv4hpQo{HRe zT6!R16?lmfV%Nualfpf9-uFC*{GYJ= zdOfQoVJ(`oI7Gqo#n$OxkXOATA#SR4lq8l3Ur}Tt*L?PE{sKI?lV=gtbmc6Vu2>&K;=>(`j`r+Q5cdQLMF>5bM6 zMH2z7w(ly>WJ28LBv1}V{;&Z5GA}yHxC%*pl4Zk9!b_=4F`UKjSx9l<><>nsy71UE zXnp-!%-j#MbjNsd*A-;I8f(XL?uDyz!kBK=?MCl(cvOg+T!trN%b@G+{`-9^+VL!l z4N=dlw>e46a#w(Lc3!U3?`p$u&aOZrp)T7d%Au>x%NZhJ$V0cT)F&No$>A>Gvf}5% zeS{-M(c|a5gae+!*uDTWs{1i2p}@+USto|#c3ACc$1jGiTmI?wdOTnT2S78+MX&vu z;N&h!afy5HRKiNmE3#0BZ#>?b)s4G?*-xpME71ycCZ^`fZApLZvbA%$yE33C`>NuU zHEk+XOO=%$yf;|1wsxnbeNy?(kBw~q=3>OMh255n4=FoyKITl055ttZ5WB_x4fDsA zlMy|q!9XFDet_;KO?`NA%S?im@Xi~&H_>&LX+k{opBdGS6Yj#Syx6sGzDAr_r*oow zPX`X?*48K_m%!b%JV`l)D$4h*4v4x}F}X8AHx(zOdVBF)Rk*~u3v&H3(t)H%n~Rt` zeK77wM@h?#&8ZQGaFmAlPvsRukH}?Ra4ZiQ8p<-QV=^0mnjDt_r9B;8O-5F9$Pt)x zW^udaWzRT@2n>>c;2E53Azq?_NUv7 zYvyEFA3w4nGtq7>D!a8}|9v(1op4=1?Kdx{OmYKlTCY9m43wt6zTs=}?rg~vfa+P?I>}>uvDq3}`*^raI$l;zl{ zCG=s)H46AHlYI#N-X9q=X3i1d;Z_0yu~=9!S9S;p0sLYeiGb1&8}UQeR#W3JBkyys zG1(SO;o(+zps%=QiXqk6+bY6Q}ito89ZgE%4A z*z|Ahy~BBshI|N6b*Iwl_KcHev7+B z*_HZx#E1N=$+MU}&vcI3`PsfV?13b&y@{=sfU_5S_iTO?Jn9q?ztk%BquoBnr6lA) zXdIEoA3cJ7%iUgvaOMBB*CC&r3efs|IO|{4nOu;gC!h6_-j4p9?*#aIu@JXcF4iVi z(kM7{ZGg~+68IF5sAGCJCbQ|YMA$d2OH`6HL2GGtAmKmOTAn1GL5bXv-;Z?RC_Ivc z4Ng5=OHQ8}K||B)$HsQMC*SK#hE{d@QZhmgwC!l&6^eUi-GtDEJG037ysoPxwVksq zNT3+!VTF!O`lRNhqP+y9>h?KuGZ(t{vS*LOCj2_()?p~C6VnIvG69UK&Y?1uPGul< zfNT`;mLJrycuDN>a&A$S`l|){GIYg*JCgnP*?TxD_&UW84~GI$G03 zTNFz}|40(zNxDMMXJXc9UR^2bZ^Un+-agjEX7}=L?G!n7O?Yk_8Kg4>QAgC1H$u5& z-dz-XtL?2HzNf8J`-03x5^mqA{P;8lV=1iZYGeTt8~cudQjh#tnbjPPWz^&)?1h1v z^C9gg28T4}q4aIH?WyAzqo#3ad6fLU*s!8o;{r=iD+F)Ynm*?+S2mi%qJJ>DV?MN$ z>vPzO=t2V4CJ}Q2)A|9FGcETg@A`uE_gtG_tUcQ?aHtneV}CH}xAVFL$-OpHu zZsk7S>noZw>cKNIT`Lu?3US(uB`gFxy0O-A#2JKax(wc7S8^tF)u`?D zA*_DieXBJhN>ywRgIF^@t)Y}vSwguZQXyq9?zz`%GtUnIpz4-P_DqlzeDFm*{L*QR z6s0$_sDi+9WdG|UDy<~Rh0gu?dI2Q3UdiWjo#?*8*CKiP>i1-uaC73S4$A|#8`d$& zP^O|-4ohY<(>-uTHa$OE7X{uOI`t*Z4p|8fkp0u67}{@u`5x|cM&GgkelBLY^svKM zCV?2TchP_lcQ_q-rHpsVV((cnN%1gc3a}Ul?~1ZU$_Pji_yJ7RBs`6ZOQE~HF(FqU z{I*HPadlclr9&PWZ`TE?KR7B^)~>CdR4xOTf2noKP7=PXxSJbbeU$E3)Rm+NQn|xHoEX-3XW^ zN_+8#^lVrixaekuIsDk|)E<6p0pMtS{P>FyFYZ%&3?%nb>tAKQGRQdmmG^$0<}&^m z!yP?>F`}$ok()lLf*D(wvp_uqrJQNr|>AP2^a?>!aDpw{h+I8T{=xfXXE^%TjoEFUrrJZ z_qRISfN&1_zW&F?zU>6>_%+-i6{0f)smObU;jbm~FaKb(k3p|3Rt4BbW;y7rkH1!# zN$h@wg@nv7MM1dhTP0t2!&hgr=aP!*jI$z`I(@2bg=fQ==AMZ8RUSPT!oaLyw1Mpc+v4fFY<6%F01r2p{S@xO~#$0ce7oD)sZEzaxMJ|&Z05ZlaTPE z@P&PcOqWn(_s;j!+X1GLx}P`9_ew0OUhMBYH#T?HS(!|g(CTQK$f)0`+K@sD<1L)% z_`Yh+FAW2#f!LqUb*#fA*mCAk#7m1CGx<$XZ6V|yF&V@qE*{an*fq@Ujmw!;Kjff8 z9vh=dS6z>IAH19YaR(rwRm|~niK0A!q3aDcqNT96=3h(m;oUd-az5q?*(NstAdH;G z`lfYC4O6Y(d1|2W?cwTGhlh|}_14=wSo3}Bf1=euOv(N`rmS&;ZWW>jnbM@BpSUnM zyzrFu^7t$tcu9IMWp4U#&twZ3LX%1;{AkiVza!;3Cl}V6Qwk@t5kjBf>tPk(0HfC! z|7JiY3UkX_G}J>`GdnipGQNFV_WMnOYTc5W=ts7$-@?7fk z0a0F}*vF*$BoVrm2#Ca=wraOHfG%Xde$Eyqbs}4n=Zkr(zf^W1i*1vE+{RM*^7wiG zR6ZW8+vR1L{ch1uf>IY~T(rJCO;S%;Q|Gwxtu`Tdp(d`{g!Lu5z8OYppc#n%G$w=s ze+|^$GeGJ*e~LsTtg1ovzhkEy^ezX0J2f!*9q~{Tt3JNWUzgBWsyh7r0ZeCYS$O zlA{8QK*E0{pOnhjfe7D<9$3=OziN1ubK;A-D3m+#+tZhJ!l_0l=wznMXIBS-uDY@~ z7k~uu;vV;UjSIET?=!I{U{=z!t$|F(Y!x|XwZV`p`B3tbhngLYyg3o@SuVGMAo;oF zsOz8T%KkjS3BUx**T4AY7IXa^<`P%+8-Oixrw#VBt|Rzlr0EwNcO9*?zd~|oq`*CdYH#%}d%0b|epda8 z@Z-QGW}L{^|Yd&cDmd zmAm@eOc=h0tj!k4Co5rKevBAD%p_nnjBcf{@3SW7vDb@J7EwKuW~9kL`45+@l=)3_HI*=On+|n-qoz~ zPlt7I1%|{8Mz8iicoIu9z?1Yv6YS0yn&q>IIwnWi9$tJ^$G!hCO6!Ti0Qn?=cX4qHV>61P1*mVY8JLkYK^wie`rXsIo!tjWi(=GK;T z2n0{v^qq_d9xH#kCiwV5T0pIm^OW&!Z?=J;@{aduG&$(Y;I#Kr_uCMHN2k(G#zDF; zyUtFN<$LwEvA*|8p_KuyETdLLn{lER;cB2iU0-Zm1TGGt((|5tTCU)EiSW~Y*`hR)w;oD!Cw%*Mf_uAO(1CL!1FYe4Y+jkx>bgq$R%KexapZGH^k)7FA zYDr$)cez~MJtgcq?kac1UN((;BT8MLy1E)A1&~|nb5rSy1U+KkUmFro13)8xqQ37` zV~`v)t*)J1m(bZCFy-iepB<GLmroT3f&J?q=QU^z#q6U0JUc zXnpEIG)WI{coe;g^fmHjfxC~YN1d?=9NSo0E4y3T1tf^Y>7_>K=?}Uq9;9j=!Ae8k zT;XpRkNe7%%LqSGl%Bz|kg{h`*U`Fp$q`{wK#O&i|I?^kXT6|&^WHU?N)giJrBg^h znnGQf(ScNRD$d2`nht2lb!c%l;YmpOlc5%PkNoj(vULZ*ptb)3{FA=3w1dpg+$%tF z>${@)miz`C7j34XN3-!#Iqe}@u)cD7yB!u9;HF=E*%9n2TN=@$jG9G)*fW+P?* zX{())vphzZ|FG?6s5P5-$&*RumoHB$UY9C3D{}ez(CV)=#H52nBg5mnb3emO!-Jm3 zN$S@sD|_2=ToDe@lkeEi@Af``&HlXHZd5egk zz<%jcSuURKRY<1lFXuPQ?vJY#GI<(w@%_E4+`wS_lY*SA*rYxnPVEa0sdy0$x( ztK{Jx*MJ#dMKm5S6|UhIk-P*&Em)7pXI#Q}>l2!wxFoF1S;2TTw`xhv^(CtYc~*zV z2LT~H%RSr}_Ny9512D#R>2gZq2`r07tr7b`0pG-)Na#K0NM^QQEP=%Y+o78reV1cS z+}+4;oJIrfqQz=~R2h+=tni_nLh+OwwXz0}{QYX@>b0zx>3x_=yuaZa<5r&8!G%jh zVz#oSaZ8oA$z$_jDg9X*<-M4 zN;FwGhJ(fGW`Cm?DZ-szR`{#-4@-Jim$JP52`8lZ@-s5Qkf|Loj$ia%@Y@Y zYTTvHgWIv)D5*-zFQ(w{MNXbyoIut1m7rZ`sb9=@8OO4G?ub130B#juSnuVf?>@Fj z7`1hHm$!`~YtLc@Uh_bdyvnceDwthXO_KG0vDUq53=jNv0xh=3D4Zilf z5dZ*UhJvHxJdn9gO(Imx+l)r^q8pQDb2}q;HbN21zM%W7%ymd3K7NPWM=~N=@{IS* zCyxR-j+M*4lF`w*RXgKkVr?Pwkw}hWu{FvStYdqbPuJ7L>D)_mCTo))TP4hx^a$I% z*PnW*W_SO!tyr`0_vNn#6dgc`s|=QSBM|;efDo88T+36F*f@s?qaK6Pi|>ABRc(5eD(2LsSNXGbnX(x z+<8$9%kOxKgfe6VbU`=B4D~oSCK?}%9HWm_5VmJ;Jy?p7T0GP$PfuUH)M6=l$F)f`w3ch%3juz+KhID> zW!QX-998G3agd2|$@NJ1>9JPma=tPkx_TI~hI8?U?5u44YJqfF{+&B5QSy)gBEHzg zp+&v?&aUN)oLk<}w8OC6m%CXrcbY{>V<4rTkrJiamy~2PQuFh~Li>1$2p)Gx$ zauKpiT&wDWg{J-3V(|5}(*mr4!t35M+V!e~H3^?yV>F4!P2|*@Y_;7}fiR_+D*RqCV)VkB@u}>%%)XZNA9xlFsav0AqVs!@w8@by z7UL38lbQ6`M~hSW3ED3Mt1}qlq&cFm^EJ1E9}kgUj9xjCXtsTNHTBH$SCwD%w z?+o4UIPA9HF1laIT5}_4h41b4yU?zZi>Guy z4IDJCDyGhrmwbQUa&<6u|3=)TVS3Wz(}JN9aJPeEA&A7>+sj@m#|1w*u$8%^7i9+m zpAB90&kwkU>(j-cCmsIST~~)y76~ab2C5~*4S1$D$CdqHqyB2Csl-S7VtR{vF>YWOtr0;qAv@{&h0V%LFe>g?Sp3aIT>&D)VE3ne$ED|VZUrE1Xg;iQ=DqK64&1b7kbjkNmZ5Mr%KRo?>bff6S{b>sFPfKkWP}Ctxu_ z%7w<6j>Vrx>w~l|IMOxro}~%}y@C!|{S@Wll6)sm;9?$@RyZ>I^3&^_$fD;Q(*yH` z-}@ti&QVVqM2PFl^h25|JLvj{c9}_uWp>#`$bbX%>cel1PL2dN0|`x1BDcX!0-|dt z)d_m&Ri|J#DsQgoU6)oH%OF-0NDZ0p*?i<%n2R4Q?+R*pt}^$S=VBp8@;;qMVoHIt z41XuQ$Qr|uQ@bW*bjiOr0DYZ0*{0$W{KV$Or-B@~VB{)MDf!N`5g|oE<8dCBNCx+d$`UX*LuTC&G$f+*q>V+mV^j1k=kHyr&v^(GXr~$enY~v%(|Wcpx)| zMph8nhixg}*ei$kO8WiKACAdpSEq%2>WWnN%UXS(Vg{6rff9A~8DO%!kd80~#t@yf z*cz*;Q_Qf=!07m_uw^hFclq2^lez?N#~UKioI0P`nyswDg7z7XIUHD?2)(g-N@ggo zHQhAa@QO?N`e?Ej?syg7Vaajb?Q(|?d=`j<7g@#;<#lNIXISaj z)GR;gSVCnPI3)F+QV&`@pqTQ02c%oe%cG;lac<*7In?p$ zshT{hS#ntb*)RHA%gw*lR%K8CA5N9apW|cNFO{w zf6h6iC=a{ZXkzS4V{Ei`KKlUe*BWH?-rPjN;QmWUQ?tub>9g+rD1xAVii&JgWd(Jy zZB*L}m#cvb*-0f`)qqnL=dkga9q|d$*XW0hZvmpL^-tD?Hr+x*l+XVXT?}|xw41_3uCRvib^5VaNOb7(^68?h!|89TMoIcY4#S3~(7J-F zW*RQ7fUQ~1wJWNEn;me@Uh35)UE6JaGP>lRp^?r&R(Wu6t%~23tIOkW2lwJp&uV_G zonYHj+$(4B;Z)kI8XoRO<|ORZ69sv3+!)4+Zb~u0CCs*gN*fn^zGF$(?tQQ2(bpQ5 zT1vEQ*PC+Oz3oi7$GlA*8MOPH*sd!_V`~QllmhFOf_6=OS15^d3~AR?$*eqLsNh>q zHTlJwa}Z1feQDiC64tI>3uryij6zHcmk^g1V|2V(;``P`=Q{JJ_dY$ojZC`tG^elL z2k)ox8bnM zy&$}$KSHok)-jJAbB2xmm;Ed@wj&=>mH~nM+7e}G(mB)+3x81Ng**mly8E~6e-B`_ z$~pcEk`{=5*Opy=+w#k=08QAbT4i||6O~ebH*hs9r#Ly|mnKZ6$=?`51!on7i@DEt z+@#BwxeYpsyCIzx)MO7F`in`FF0ScWXC5PDDu~f3p&Z z)Ovz~ic8CFT_kJ{7>eU-{Bw%3J1mk5h8niBlX0Qf%KcOzJ7eL8EDP2kSm5#)cjsE# zKl*^}PpL}f1ekRATw^k4f<{}{UMdV|(Gd=L6C2fdxkod1uo zw~ULj``*5XPC-FHL_`opNd=`tK}0|SMLGuL0z|qQVh9P95|J*EmKbuVff*V}$)Sgk z9J+@Ip3~pwzMp@1J)h?t?>Nsn*Is+?bsX!vY^PhxPucX<34(u@54YM`EiPl zpj*Vp<)uDLul72{cRQQCqkM!PgG|=zi60!ocJr2%PjBBaF+vQacyZe`nWusBte@l9 zX)PbO!&>Mk*mA#C07j)Jy`=iJe<{5}|9-mKx?YHs$=M#kf9cXSnHZfMxn`I=lws~j841gO? z{LHTHmrGIdJ3pWE-vggdui(Jgn3FS~-5Ac^vShNEflO`+O}%e#*uJp8(Q8$`$s%Pr zbt4z9=eV+!>!V)a`{*Uw+_=nQy+K1KZNxdQq~@OLOuFkW>{lIyn%&ZMldR?`8RX)m zi{|&!EzJqw^PqsD)XX)dz#18dYtG*#_IqOQCaqPI2fh+k0#CQ}sRc(w{aBo8Eo*CG zO8Hy0ddA0aNWlU6{0u$I*>dE%z%AFqLbYown zl>SU2uJqf$^zCV@qysNnzTkE5NVCozg}cwICEOFJL~F5q!ltAU;|8ZV@@Ma7S1A6F^+6qSxhr{1mzisVp+ufXe7?&5u zZ}u{3g6%E7{K6dkk|U2Hq$F2X?*RvPlF5{gU?CIlb=~l%Y`2Q;d_q>J0rNul_$z7? z1fsWv1C^9&wF-M6AX;{^KVILPj*TRc{0 zQhj|+a_2Sab2;V$K$i?i_vsoQZYDGJpH6I*SMhErFY5|#THdDI-!e;ymNh$_SQzQ= z5W-%I`Kgpto^h!p8yS!Rokv_{DN@XEm3M85WSUNCVG(tpE*G*=xSmQ5Bk&`9Y1QCo z`#_aFN#*b5Vq{p9SE)%=o`C$O%`|Y;m(NM+KAgwPZO!pSOSP*$0d<^Q-u1~_Sj3vz zg@;dE6XAcp&7dunh2JagS5ojx#{r_R)cI;smdO6$SYA~iTU^}8OZs`IGr$4p-mpBa z&Fy&*^OUL#E*FMSu)!N6CXpHi(1glqvfs`h|6>rg5@GHSG8p{-c}`BlY^t;0JHep| zfj#<33YTir)}~2zc)Nt8rmeY;YtlRMsH44CJlcSb)L#A7yTWca@2B=!5vRmChOV>` z4wx4uc2d(IO^q3_mEn2J@ATMn8?y5@B;9&@F6D-G@jnx|E>9W^en3>y)~C4za<#mb^;~8Png1(b~c~F##zUR7z0TE#9%u!yr_&JGX9k9=B;R0WV=^5rt+kjHS^g zM|X`ZQn|=UuvJ#_2syW$Qv(bd@#N9* z-2icyaS!e8t=k)01{=`AgRNW-=SFXqD@%gGo&UHO1gnxsKH>3%-pNV$oHVrgJUqhYv-ycCk zDGUJ+iOo|ORHd#H51hMd`wONMe4^mo>lo-+>9JJpYGcH-{Askb3C}(nJ1aT7362!< zDCl6T?CnhYLDWg9pC41;`a6tNt#0Xy1S#Me&kdmUp96XjNecICr+49gQX+oS2v*b; zU@2Hp?k-5hN(qRTN)^D&)98TCb*R=8jQJaFmX<{RFq5LYadToEM^jjX^NvW=zX!r&DDkRg&(VV&r&)8uEhffc=%^@&ubMRL>z?M@ucueTz4 z`lw*rlYe`kgi{r9(*i-@(*&^7EzEZn?SU=H&ci<|!_nOHUS~lDl|yV1K$c^JvPTaB zBZO)LW78W(2`y4!aq>EbL2}aOQvZ9gYtEU02l9d59I()EdD3tW4&P|9+-wZOFdf4& zM|wp)7;;ILkvB*(!fNt;hmj&Bjg%+@jot>&{0afbQo|LarqXMowxp?QZTTB}!k+~C zOw9%1N-Smb8KFXNfP6{@%j7MLx~YfH78f<2TmIX%X2>rHlP8;z!k^&YQJ05*5+JMn zvQ5`88$N5Ew;hp@zU_D*`2K!#f)Of`12raPF7wZVZPMM}&hr|li$e$EOJh)zT4Lgs z@j*Qga%wXG=i%PlBqrG*6}mG67}|DwS5(hdp1+QTyX9zAck(b5$2XZ*iE^AFE?~{wA^fkgMZnuEz_j`=$xgy_QS%L6i37hoMET zR`rX4C-qANvw0-guT4ZL^}$H(Wt0}4HLLDi$9*5s*P!~r`bFciz1Ra-2BLj0&}p%S zgXdC9@8X1AM212XC*mrM-0+E$QRe{D_WRlb!P>24=u6W{?1IKbY6Lv|raJKmB(THu zx7ninSqWi_6?L?UStT8bvAJm*9aai#cyY~n?c`fKrx{#|+8Yp__jo=^KA~ZuPzJZ8 zE`Qav>OpIO=)sw2Uvq4bP+d+#2nX@Vv|?DwMm#%(_aV!@)~vS|OlpfysmtTd!~LcS zUblBe0PhnEs@{}0Xej)L8DCJ5!`{@2Jm7))DHO$lf+)cKrJx_zRRcBF=)qK#dTlS| zAKWxIqmWkiEV%TS3Biy*6Lf5It{k$y3GTk1;LE@ecxLRrKAhKAMC@n2bKPw_?tN0K zE}m3Ye^jL{Ss=>obiL@eS?{AWsgsPiqTB?i0BQUr00|i@LkFWBdk)bFkJH4s11oX) z@riqA;)?dk183>I`NM;g8shO`G4%RE&C2dULBn1VxE`}Ji%BmViTGB@oO5k&biM%( zIUVB zDM8ZZv0gqyO-_d<`0}vW!?IKENc=nN)?PU=AMR$u*}H$!0N8&Tl9j*$!>^3|>85F) zeI-k|TkQ7_ZjRW`d6TP)exCRK^!P&VUDLS)cpw_#BA+BSet@zx@Ly;B< zm-n?!DW0u<9qe3nG<)HZuI+o_P?CP$?e=Q>y#R(&u2^Kt@PR#k_o{7NISlAM2iEg~ zJ}7WK?q)y5U^7sw@T|b~?tGFawmEM*o99_0l+Tm^N88+)A9^P=50rSSggn2|YnnTT zyC2ViYvM%Nirsc~+`l<0zEvBkOUP1sgsr~;OIY!&5g#7_Z4Y>m7IR>(JQa5UOu4Rn zBp6414@M(C**?8L&67yX$rdv1(uoAlDro|U>)?{@%dbI7`==xQEjK+FGv(E~#`9LB zqlxhxXg@&A7GJFmZ2uqX3m^=Cvxx$gfzJuT3qPCd!`03A#d|w-`%^TNQl+4R5@z;* z3L`uS-+HFMI3F+UG+V7HkjkNG&wm45>YBHkaVLn|j?mrm1KJTkQ52(`dfTYj?Rdas z+ny=w3u*0;=Zs+yt>KYYmVF83C{yd~duM7XLa?am@H>w_W0Y%@C;sXhw-SXRzr|1R z`KcazcGrN}9~alBj+GI$f&Jp|%-0(yX7)W(?C=Dx)zpI|bXs70AG%?V^Db3+`?@f= z-OooNKyP0Vt_T!DS(>g3#~Vf2XpouaPkO|9N$$Ot2&p9-3H&5vVi0!`)xop(-<0tG zsN#hw{6S4Euif0R{14bJ8v>KBL20*vK_BI>j$jgvRiC!e|K?mB$}0(c47Ou zl}PMG>t>96CCuTb=EkL}_!_X!ZAV^rRS*)VJL2q_Wt5%*P_gtDy@omafHsZObuWna zL4K`MEPp1}5zKb4QxC)e3)brDqz6#7KV{yey^vuXu(J*qYA?lgM zp^DtitHid-hsfKhOS)N}HXv*zP~?yQu#8qhPs>t^3?98XPewnf-P3!E*8J@V=6(%& z&r4Rq;=@I?%UDkN`U#~mUHYI*qtwS@u zL(UX*PW~@B^|Byfc?q9*2aG>3KgJ_{9y%#d7^>vOU^HZHnkzS7xPA*Ly{FlWZoq&f zVS2~5tBE0=^2T0|KpYZbx}*SHBTBZ|@SnqvE0;sdQ=*0Uo|fl7KpZ!0(sYlbQw!F; zr@?~$x)aS$xrn*hrCfl&ngs2Z2qJoLefk;>a$4feD)#yTf@2d%X59BWj~@QIfOil=)4^m09~q*zz!NbAm~-=+M0VCUokF=c2mP&$?!I}M zB36ZA^ltO)Tyxvbyv8BGJxeELY4vNlAPlf`g89RN5+!kyo zX-PO3R9v1W_c@rdcZlnQFJ7R<&0EXoNQ}XoILu+Tms+^Q${WM>`Pinu; zf-*X@Ua5~tK{^v&E7NMV|Fr*nvg(YvU4QyOQ`7eLy`i|Ou;iM;TsB_pDp{LEkO{72 zIN6pG?HOcD&-!+{rLDg>1~e}3sl+Dn-UK4##@B zF^!nLG0ylM_3-5HWx|-O15q{5;U>Vj4**g-um&sM*_KT$8;!IWk7V2}9^Gr?Z<-@% z73MAvJO}5+@WgG8DcKQ6@|jDKFC==4Ooajz{9LyRsEmJ!L_}}I#v#; z)LI~eF(F9$tFe&(z4Gqp8@~_=(whZVDDDxn!ytv7q3sf@9AK!>2rt4pTjthP3AxEySL13r5qZ6V1Qw41jFx z2J!vBCCKZ9#jy9QOnSwTy&yUj5tzgFHdvTpgY zO%cn)vys_QHWW<^0LG{z_sNlg6j83z{N18NVQ4o79P2kPp+0+l64-;M#-t!GqK>&x z=>s9d11_cJV$TiZ&;#96G0&Gh1e&cA4IUkoVBUqp3}Q{Z4M0k7YFqYy0G455`?M0j z^IfsQ{{B#sCy?}#{mD}8iSBLg^xL} zp}ntd&-U?Wd@vl0&lcOvP?xi+TRT$=!>6Wgf5&+1@phaOb^^0>g6sJ&nW_VCML(aV zNO}$woJ{)TbXU`IY{jIy2Eci&Y6b*BzMxo7Qu6;0g@Mc%{3dVAkc`lWPm-ZHZC?3x zm+eEcQEDQuMBLy2==Kej`w~|yd6i1j!#wh&Nh_k~UgjMRuD2Y2ey4K5H0(5}p1lW0 zM3aIHYs3xOf;mwgjBnbR)qj&aQBCj#+uowfA}JPQ3l6)(hAJ(M1lYFiJRIU1waKl`D37 zlAt{3e28((!kHe7Ia^ZiO33G&909Kh1fNq3xNeFKnIvTr^V0Y4QW33CX+9fDf9|fk z$x2Go#gKhj%NGXf-Bp1ffzOFx$l$ z!(jko&NFES_thm#4&|2scR4w$s{!FVcMq`D4+r`{<8|B6FPx|?=smmrt8a~LHa zYaNAqBdZ79l5KB~z{5btxO!m`PipM7L?i!UH{PgP9gLQlC}la(G0_B~(Hr)B)~@#n zuOB{1kDPS!M4oPG|Tz6<4bu5h`@wRCD2F-vf#|miB7Lt>f>p;Wi*Nk?PB4zXWh^ z@9SGx7Iu}}D(BtN#y6~y?m6T4QCBd$V|d?OF_r~WGt#9ww|9*Vw~EXV6RTvw6sp(kho0{S&4*!T6h44P=h;LbgnMn zil{l9rkhTwzS#yDlYsr%MZ(L4f~;*^BH1#--Oo5!P&xi-p3kgzAlZ(W*MID&?tLTi2Qt6ejiq z0Ixc(5t;aREr-9Pda8%f!g?%8Vd%eVAhcfdj23w@+Ll7zc9Y?71ef!0wccexi6mD%e&3!f)#|9sIApOa&0B+rxou9t^aY3K2}$nDJDw~#cT zXB`B#ivgQ@cfkI?gU1{Aj~5gs|La0LXA#xKIM2m7%@GFDs($4e;erMn>mP;PSKkXr zE0pk?T@n08ZN4V%vGEJA{I>@sjfGa^0H!vca<^jTXoTbM!kc@GMzI}$N=P3T!0JDo zWra3gXl&A$1+L$-(<_il3Q8A+_nyjzgM=fSv+;G6qgh(ZX&(FalSdPB2VQK-AB@ie zI4H|QXE~cq7!-ciI~ca!zH1-o-VpxK9FfSSX$GbIJFZkM|C85*E8>AfyQYqu?fgG- z#R0k1HLCzms(X=YG>J(}=5y*kM>B6-z$F*jzI&3J%girl2ngFHsoZB6XUz+kaEnBl ztb*iKl6#^%imhlz|7Ncm0$ckL-F%WSWqE>YkCw@CI}pRu+q2c1jtBC)l=ou7*e;`F zbsr85Sm+JAfl1lcCe39#PmP=aB)|tvq){c14$S-#oAyn+y7xy!Yu}8M%n9NQLyCfz zrWTjEfzjD9KqETe9f@22{+89`hPP(4m=$pU^#zMJZ;&A#mC!c5Txd4r%D-4Hgfff7 zjqeziTr-0sGAMsze>t;Pj}8?5a?|~nLePKCDvbFlWF^^)>J55YCzSL5eN_qp5MbYQ zha6C6-|Oz5RN=ypop(Ru-;^pj*v^+dOSbvF_($WkhNSS0V?Pe7^BFF$C1d0={$2v# z%ZGokqvRQY-XxAF5Ojrz92Hvidbg&I`hUMxRmlA^@+(#tdW#HVWB;EmBPW*M}7dM6+-e zk0O`m<`N9FCoAb1lk5YTYmV;Sb;!Fd;>Wv6r6&{WXrz;1-!_{<5}hJ>zf`(BL$_cO zzO#byly6xcY0f?+aUx8fN$uAJ+H3=gCrERR{ucza*KkArryOO{!PErJGV}j5sRA4U zVHN-{E)0zM{qv|@&Br{@#?Q`;w+=(+ovfZKZT|i>y<&HYJvpD&2U+zo(^)7uC5i>< z87dF^B5mi*=3^cvrt<|}(3?wGk`!=?d=^N%L+x$+*usY@Qi(h%#aBr6VBUqTWxZMKpy zvzx>`Zz(_Mx>=vq4%_ux*C9JEM3e%wFA86mTe(N=DZg>rZrG9BG0}0Q)37rcs5Uqt z&l`Ouf($4#MNHZs=i0m$j#cZ;l{Ey}2Y4y4eQq~NzEFa-UH4P-ehT|wp3r3W8561d z`{E`uVemzmj=zz(luX1)Sogx4=x{(9{G} z4K3X8F$d+r_v^Mbr&NN0_ia>3%@JMVoz)pc69kDf*UBmkK$<_Pt(zIB*6U0NRpeZDzddRpHifxdSHGx+uQYizw)Fa#5eKQJJ44enkSh zB|cmV3V)(cC*19p*f^R`*PBNWQFY0zFYdFgcMbrwSnlr37oshK!PzT%a1} zZ_&a&32r9h^+b(=Z8-t5pT(oSS66x01FC`}IgvpfcY~f}aK|-piVarowy#Ai|9$oz zI;5Ldq;s$(E2bPrKSuLS^jHXm0>9-%MZr=9JJM?f)`L;Ukd7$J74m_KwM$|uRNA^B z1y{V7wBStO+pge$aq@cjbrRMkcwN76xblOAV{ISh`0*-$cr2EHCN!8|U=wRjY&zqz z1VdgFNa`ftx>pmeOd5xY*6tewKPpwRw$1Z%JA8WM@5p=m+5*B-=ghv#PnWJ*-u<5k zOIbS|*(+Rfe@1e$J{Ft6VL&#xG)ucw8{&pHwCaJ`;~V;S|KTjz67X4Zd+1m1ZBiK1 z@qJNxkg~Hld)f#Yq`IzOzVG>Pk8<5f;9ve@N&63~-D;MJPZnTmKSOm6%Bsa^kroZG z5VRlxDa0Ryx7iov3l&aCK|(rV7ZPNlTq+VH`sU0ctp@Edhu9Ao^<@t35P7T9*~?;8 zK;>E3h2xSkV)0}nG?Ra}|L>fg_*f*Ulro%<${$=xtIx^!Gr!QM_~m^d9iX_ZP%)}P z0l_gCUR*H%Spd)f1m7zLDOQR8@m`*CqD1&YAaG&cFQb(L3wfpV_KcD9)!gqT0v`+6 zCWWP3=zHZ6_XtsTJ@d|NsRJ;H>wCOrKEi%Onu5*7()x0az*D+;2`t(Sa0lH7Xp0-7Z#a?n z576`@#>d;O%gTMCt~gOu{&Ij4Q(rv6i3nKt;w=29H0hy}Vy{%d)#q_YV``u=J=y{A zeUeV3y#IDd=~!8_m$O{iFV-fXoW{d@>eibshj^)%pHkV22nP3ZwiqR@ z)G0d5r8<$)e0TR7JfX4+d1K|miRD4V@|F$L6Q4j(Txoni2^h64{g>n7F^~S+qP2Z~ z7om`N;VQm~_?AySwKoiJA4yja*WQE%bFO9rSZBkc*c^@po0yCZHk1*`+^z zItl=b14OuT{{w?&d}HlT3F}o3=<0gTALj)XK%e=?k^y2;Ft#b^R=B&RL+U;dF|Lpt$WeRB$~r7C$9?hd5D=;fVna2tT;X@skF-z?GXZ|OzuT4zq zM9IAbH#No8?@T;dbvtwXj65D2JfI;@wq1jo*{ms#Z$!;zPc{bbp|V$ghY3C1PV{*L z`2fg@l3?G%4_}e)KWFrSOM%cbo>($J z^l^ayXxAV^;3-YN1P$13PTsGA1(mi{0?xqsL33hn^?^ujK)*i?ra|Y!uMv(vkNEqc zR-gfX3!|W3GN5#s%>OIZWsAGJus1f3G`P z=#w$VWFlv-`7D*%VA_-%%yCCxYZ3v?fV|I zacDn4;+Y4f0uPo9(xe7WonkT?hyC}1RT#2}3^o~LQEnY2v!TtBsbNk%wn=QG9~&4R z`>%ef*Su?sr=P9ft_@N{wbq8*Dvh9@!RZV#vENN!fV;@?2J`yk_W;tI?Nzdy-%aZ7`UCib;SJ+Rp&HW;ZA8mn{QtSfr)V zG5>~^jS%^jYdHwmb){K(@6)lBJr48l@q-8b+F3pgxSvbf50xfQek%S<8Bz> z{T0!-q%9fyDj@cvQXXa-${dnG*}12`w=rw?ywS{@WXEa545pFUYpKk}S^(0$`0f-- z3BA&->)F_FwG@H%tF3Bf0UDhx-lQB^{&wis02_$>%P#b{O@0rBt%tDa;*oa<1mFq+Py$*b)FyLZ z7l=<*f2xrY$L&wZHSAR=094$P<{h6dpNpH)hbiXDU9u#tt$>Xbo9GEO`DXHO+^r+z znLIilRsrN`c5i08)kiflM+p-9`Q>CsOu$z>`x;60gRSz!;FQ#qf!~@lTlrw{*-&$$ zwFq|4P#GPJOgJ`P8|un>dwuf6$7XA9rNACf8yYL6G}#Elsh{=t>U|)@Zu@<)m z5RCHavtoG`$W=J2bo&={QmjEl`+?GTN#l22yeB8?h8>WNpSGz@gU!F>_ZEX!!m^s? zfISZ`1HC&)8rval^vxNcnm@00O$!0G9g|eRnsUPPPAd~REbn#daVa(hDKMap$ROg; zN@qq@$NP5PlH2+^cJ`bS6h2pV%x&?4bDImw!=m(w^%kX&9op9fT^^`?{?&gP0TPgAOGl?1gR0>>~WvJ zcO-Bmv?ol2QoA7i@CvkEpa-7P(@+WTw?Zmw(hK*4R`d)g&NQR zSJDszsoi~Yv7Kt4BSCZ0EW@^n7dgCiaJZ(;J<3$hXYDA03N0#jU3LcHkzAG_d(DaI zA`KXtB2)eTm!xyT%cGazyEML!z-Ix%7CaW@wm<}~AKySP&n@6&VrcXe6&)`h~$J4=wS+KA5+&by1pJn12J zy%R?hmB-#-XjR|V(<~h&g@eVGm5&@uQS*6;0w+9gGx;*}EAO0dYNo8NnZJTS1(_0c zxQPC@yaMJYDKpcu9p5hLw#Vb`1_0fiQ=NCVj7GP8b| z)CZ}LIUch?SgIiVh^wZ$KIzhaWipU$fA=44^(zltR|t@mO(x}Ogx=FJwSc_zZL)yL zEpS8l3k#lk%iZg5@N(1C#h{M(Nl!DRy(?rqNw3_`2&ya3={W|e z1Vr6G4clvF_NG6(rX+ODYRx>uCsLZeuOcvqX9PEs2+WR-d5*qYG&uKNF`Y>y=`4Mt zwW{FQnYWaNS4kz?!zKM!K*28Q2_pDl()ve%AE^Kt5q`Y$?W5J&PAmLXt(x7)V7@hE z#pCPQR`*Yd{$ha-@wRtM)a}C2EO$<1_d1It`qMmk=wiql1fDb@v_DvxJi-<}CaSGB zUtVj#JnNRwu)|y$ncIdRIxiIqXz8Ym*x?JI#ys;!;t;umou3G!Hb=GdWkrWtieK;v z+aR?&G1;eR78S*tJdr8DDe7%ZW@G#IQ!pMty>a5U#gO})Z_upG$F+av4vX}IsLu}% zO@#gSW-$?9Y2YCGTNp{g?N%`K?+}Ow^7xbE2qr0JVDcVhV@#r7riUT!4B#qCBF{Y& zDos=0OXQaQ!L%$*eU+R_GB)=VvS&{0C+GND<)?b=_0!F;8#vRDZ}(B# z>@nOh;Lv180U!_K^XgnLfU)rHa?3|EzTnkcL2T*%pdOmX_r63X7Hi&st@68mnsP}c z!8552PgZ9VqF4Mos9ZdgBTa1FFP1FHe}jLE)|ee1BPZS^`i7rz5dACX&Re1>w$2k; z?X7ssaa-;7OMnU6OR!o&;I6!9%D}?q%!Px#r|yXZajVJw+p8?rLrIzP{nV z(r=RABd`}fsm$ynLpx-OX0CaNsK3*D^>@p|n>(5z=m;0`ZaKQqNiu9|Sh0ber{(m} zF}s+PYMo2iR4iudsqzVPj2w=uZYX^i8F^US?e-~VNO7}*o3fEwmg&@&wTsS7(|o3G z+;px^%QWXe04f&QADVRA^t(rFq(wmdz*t&81cmPOZ4yQg*alrcX?Ie}7jVo{sHMZr zeWN1&bLQ~i^>~OazYkN#pr?nG3Q_pS3(Y`G zE!A|))q$MA^IJ@V-2)3o^0ORo*zcHA_!Ib`LWbKBSv0RwbWxkk%}gE8$IpJ-I^%YV z0#*`6G*9OqWDmA#>6$j*X#iegZA%jY8PGV1$=L zuNU7}+o1hxpQlvpGFC5B{}zg=dE&=71YJ#O_9#iO_ig%u^oYq>3SV~axTTUo{eQcH z5Lq$K=g^Z$tNx;c{Q%SMd0TV2X~LY6d{XmyV*zBPds08jxS9An?S=PB>8q}jf+WDB z;tUE5z;N{sNhIOqP{vwFI@5v8t#MfPc%DRb@t>0T3GG3_ep8dJt`8LH#>+5Thdg$Bi`Tq~lndtRH3dx9a-D|&L`@!Pc8p2D+2 z*w`k8IBQsO_e5L0Nn7OEYJj?_U2rbEH%0i#Sp`cj2%CB}>LEkNt}lRNl;9mJL&Okd5h3=~nKyGFh3>U3iT#sbZ(`SPOnClsMWNHBoz{H! zdTP8=i_vrW?gcJKQ=aDL@`i)IJ||Ss_oFL>lry)p^MiKo(#=Y_aSNu?NI$(IYjeeP=g!rnZ(hK_M^o*S zI6EaQRE%`#Mol*Cg@zO}TyMSi=I;ka;5kwE9ZkoYLG~_`r}SG4UFDW}ND^4xY|G%6vKAgu*C`6>CgNVZ_nO-4b><;O`DOYh|47!Zhu0l1-J$WxBj`_o&6OvsHM&?PEW~Z zO;;im%w!$4M)%?`$>{4Udi3}}3M|c!D3{9d+fQ$wgvsy5(KzovdO*4Be?^byXzVkA z%7gc%YW$nYGF8J7`rsyInVaYLqRzFT3pjNior2 zbh!B*zT?%l+-w#kYy3nC;IwyR90f5d?4`OEz0objZHozHj@SJh`Rq<3z)@yE{TIXSw1kvC3YcJx}V(Ajn_(Bwh6>bt&tZ0v_zi>EKuE`3$b+~749FabV$%OuM44YBw zl@!q+X(-*n$ts_v>_qFPZB}%4(e}JkaKt3;D!nr~g=S1WMgld=9(*9t_KE@rJpe&> zz;U5Yw*9K=&r_`0O)_@3c@V>do>{+m!-SLuTTwGd(sluCzp~T$;bCa$$ps4nwXxRl ze(n2+@f_@5{={Ec12M3-f<-?e(KAu< z;ae#Cf<-!q=C`?u>~zA!!TDNuOMez#(Ti%}i!_O6`QMuE&nq77^+aVG*6Qx`eBUaq z&CVC)=!-snT26D_>TY}VO(${Jn-T8CC!qH{F+O{t0XnbdXcr03r9RLlpnP?mZJ$o0 zq2Z3}oi!uJ0Tm>q6rt2EBz-U6RS1z<__f+Up9232Q%vYQ4z=RYjrKq8Tqvk1n1{f zFMQTd?w!+`f0T3doSggt!&sd3QMHcmT?2^>U*FxH0d7a3BV=s~)Lf z{(im_a1adFeAAGj9baacw+j}oBCiO&Wz|6H@N^b}xnyYi1XP#|Q0Y3;oT+fK1vVK! zy@Ou0YRLu~dXA8Y(>j|oEj+p|Hm&|5h; z>q+>&{KvC;nwdfSwV{<4U5FUgYpnE|KSQHekr{BN_qAnAujit(P!mUQ8&*{Pma{}v zQx|zMk8rj;`p3o&S$7;Uxr$$*UsD=zJU^D}J~!td=T-u~BONZ|-*Yn|ZXeJ~8nLAV zP0+}d5e&IKr(sLkaH=ioIdC z=%jf735`M`Xpc)Gme=kQc^}C!Y#VeZQnvbf46=%!VIDF7GRJ1%vh}q6-3(`3(iwz^hNB$Tk^n>(R zQ5M|)46Q43+|YMQ>{bo!ru^CKb9CkPJ&E;NktCkng@qR}VEQ5vhz+cI@Qtl#?XQmd zxzIvNHHEsMwl-4))P$t@s(EV&xAROxDW!ZbUev>zaiXlK(3-pha-@@P{@Wyc{HIib z9?32_Ak9m_w@Qf`Mu-MEBV)1zOP^^YUEdd+ci8h7?oveAhsZxscV*hbbqAkoN@vs_ zJ!NHncg47NW^`C4vUPDm>$|jQ4N=6Cw0&&jVCE?k>uVNbV4!p-9(y=kVCBFau%|M5 zH16rMUi^M*^+x$814qeP}BFX%>r;(-A}FlFQTyEM8S3E zU4F9k<^BtlXa6v!^N<_1RGP+PYt@G^pLKz7{=EINT$|nl?0CUh*w91%#4UhpZ>p`^ zlXEK8vHg@St`Kj5Eie4XQYJ{(NdVP#-;u{=;FC*&;%Hzf{Kj0)O-qGB=p`g>=KJc! zZ)k$FsEz<8qVe}?gs0qqBpw#!cy*8dS?Mz|DC1?`JDocJ(`Q$YCp_i79y4)%bw^QpJ-BDeUFU^g z)yD(r_*>;90|}*T6!{s$P6__YlFxhfdlIE^GUn5xY;o|Ce(>tSno#3gw`p+|yW%iR z5?PE8`ZYQ_f^UlHA=5Hv*$U`Ciq?0xD~P1hjl8Jvt#| z>JGAs&{5HTKJjE#d#8?(+=6FHyHyCOJNbhAisAia*hg#0Yh@7E43kZj=JB!Si443C z?;|Fb(|)TD0~J0GO9N&ldcjQn3L3%N1*Hqo6q>|bgnRUY#QIZXZu zMsZ-49__3ZFsFm(yo%R);DhRsG~TK@4hfi`#*6-$ zl>1o2?!5w2&2#SWPC;dca=+J@hxGi1b+7+niv>l=VDX3}rj)WXOxEmMo%rQk8Za)K zK5<0#QeIY*vgb(s?*}AE*f_7}2o?K=SMWUBP%-wRW%^<c$v==85B)D);q3UKi+?ThrPwl|Cd{Er$OQK{oQ@-T=N~tMMqtR z;R_}h_79)bkp($UR^{>t;(cet(eY3cvTTPjgWQON#0aI^t&% zY{Y=}UCuMW--Yj5E~5$T#qB`uh4zHp_gVH96x`W;_tI3&*wW_KlvXyvi@NT1qMxhj ziE_`QUz>1ZokR8cJ*W%j+kPz@N?k|9m_+V;%}}FaWB%i$^+HX-Ey`W}A$NE}rLYb6 z14r6~=IcI+pX3W8k@cGRQWD8i!OQ+N{egnqhPn%)KP^U#4fSabd!j%A4C%4XcLu3= zHGA#9aqmT&yNo;xO>YxQ)C~S1p|r|MYLUvc-J@SG-V2ZbTB?75o*ILj3MpXaY*)GdU9jL1iDKa#1Qr%!%9CTo0QcGoc9nXNIfI*T8gdNhp5G2h*Na;Nug6LCV4 zu_B>zWWH3uFyP+tZf#cfl6@4V{vIuvEmir4R^cFpA>*4NuWb@(ucAAIl*AB6{cIb| z35D^6w}j3N!)z0qAMyo4vJT(ao*3_?outKLv_4O#{BwUy4-iQo3&9@4TfHvdQF@Y~ z1lEMnjy}DFLeb90t>O}bw$+|4B-m~I;5d5){>n=gh2igJ_&{$eXKa~I z?pW{=%uLbE3S1}|AptCm@nH8zY_h#SPh1CV#_xACY{#UBC@zL@{r2_MSPN@aZ!5e7 z{xJ?OcPMlw-MM-AHtS~-&y!tGsAp9|1ChVT{;jImH+eT^k?w$+blXiOl_>6l)H2AC zp8TQeC`Z8dC<*J{uYg+KvYj-mKPt!t5IZEr*zMza)~{7))i>N2$N2 z+^IHv`aNQwZC`3EaN|oTNaB4d?e-EP!ZEg$*;TlvdzSuH*2&Z=FV5tH`6t+8bI2pL z^~;Nv-*wER7L?9*Q3lPI{vQBNL9xCJXnfE%*JG*`m}9WzM^H+T`Qoi_8EAiP6|Zi^ z+umS%@%GaYULEtLdn20HEkg1f9#rF80bz0d8r}E-I&X9yl4u+r1|WZ4mN>gCWk$~e zrt?rOfFY*Nw!h`ZS+{H6eQ4|RL?_67SeBI=dSE3l{S9K)D>Pn^ytW9O+!a5>BosR0N6`oGgG#LAv_|a4k;z(0)|-T8;Zzt~qW0xBG!m zA!@~|0MV;qDSfT5-zvGy`n!_BvkKrT$=BxN@apKpD?bt1b}NCgzi|J8W6V1qry)N` z?qbvHax+8i9>go7c=@*ruYJqFYm3DzGZwEt;N@L$@b^dr@H>3%2mzr2%F2nIguOn_ z*U=(KAVF~5i*4>6v-(ZjV3>3rLw$(8M4!scMe6SaKksP!U-yMBFAi@!lv359ma@yl zw!yZE(6>8<0Gxku{+{o7%n)Xh;I+`Tx4e#7@0;<@B=Qd>K<}?*+{-?jG%hFM zm6Q6q$J00gJktzdrEg~M-sT%?Z!`}+cdYvMZ?`-I@LdnT-2C*w$>u{}eXf*$cQ`Xb zXGn+a)tS5qRmkd$U>gUyTbGCY&9i~K^>@Q1q_YU6WjE}miwM?G>6&UNa!h3!QY9zZw#dz@U=Ao`BtMLI4NB3b76H7pR!k z8M>YXE@UuW~3SyFpD45a}| zR}owb;I8-ubP+{Z`73cLT^}48@&mdOdqIYaMwY-=A%K<5F0}0|Dd;zY-@A>z?W(sq zEo+~&Adbm>iE-aTdD@v*fchOb0UV|{emJk?>9?*|*Ws>r&e-(@<7mgm6nOQ_6In-n z1FG?mj~jfR#q3{5T?k;2z$$e0Mlav+NgAC;I9qqOoD(D};>U`6uS z*%EoXPEotZ^<%yLT?)BL$D>`AJY}7Hj4~o}m2=E`%X#LiaOG-FqkBGZ7NoM+A6ma` z7yV6R@^*IVw!gDI3qt!Y*m=kUC>g^lfA#N>mB6(KmTNMIt?o63%1loJdvbI;1+cfC zF-%+DO5P#LYcpYM^4E%AD}C#AXPLX6uyNza^~p9=5}5GB>bz;?>j=E^z)QE~MnT)F z;#YrTpUE{gsE@g$8@>kME;#BCm5OdG#8J1T#z z1hzAQKjI76?Ir|p5G;>E)_Gi}d)?IR?whncXLP&0w7{nvFXQm)SqygEN}Rm@Sp+c75fBzE zI3R)Bn?*WLv^RG-u1^5x{F%O4z{QvcX56d%)&F3YZxOxC#}gk9fZ9D8>@}HQtD#Tr%+Xr>f?EEHaCK(;5`D5(QSm#8vYwh;pKMPlfwjH)mCzGr z1=}*S;MHmADWl))t@E`~cSckI%Rl(ZgI|7qDQJ(yisG1@Kkho2)V>NncTl;E{JrTb zQ=fBgSc*PNRC$U%Tfd&b?+Iv`F-)6(iRf{F>$~0i3h4T}SgvVt-OKmf+y|*obpM+^ z3c6s-$i0H}CGIn<{AIYWg>ru^9&b!ovFf4{cDqUK(RO2daBO0Rs<$tK3E+6Hj%hvb z13Ys(2PhBE{^k2&xi{AP~g~nZ5x$HWUF|&j5|khVQ-OF#~qLReC{bX{f2`sbX%&lLIw?y#IIuI>?Aa=N>}@P61E=TieP{nz?zgtX8tBp zJ+=7F(D@~iWiWAZfRv|@!?X^O!|N%WjdKtMb~~@o1s+}KsZ_p5zgq!JH#2?I@|OiL zUrbT@2<*eg?hTTN7F^(~l;j&zT5nfE5?868DQ>q@$Q9amiahj^2YT|5T%=XLV9))? z7w4&e3wYlps(8J~M_srPz&cp|P~Xe!;IdtO9?<1E(AoB26!rL-gjdHr$?LE;o-~&5 zFq&^P<>55O-1_zFEPppRl$m+?<}UxXamr8{uwz=0n_3aQ7bw*Ka#jJ1JocvY^0jw3 zFGQ%!mIbmcvONNhMR}km$ETvlY{oorqh(9ZL+5Zn$DEbDn7zxgm!+?jyP1oIOW>+< zRajpqk_=&SBO=~AN6UGF`UL$#UnnDUn57wePXp4c5rZo93!pZ=M^0|FR%7&#|)v3Ultb=AKas;m7y89SSI zG^PypA&woEJO+ELEe?BZTfDpk|J^Iw$#DEQyz|Ws3-w)rNo&u+iAnkUnAq=A)U{op z{rFpRqX=NWrcL*VDuFv=!1T|JKz%$YeR=VG0)2;jY;X22gMLnw`(yEVV?xof?UDrB zQnBl%ux>B52mOq3>g|tU1m?Kbb2g~uFUEA|84``I`7O(w4_p51eOhG7!D?x5r&F3wTu}@M_Hfey+La14%0W`aR7*z2)Vpd87IE zA8DB`A9>&nr_6u=K5~Eak*bcVu@d*KhntVxEb$-s^yAGDjjtFjfP35bmFBTl-VRgu z$$|UsZa(;1_cWhgqxcZOvq2XKtuUbF8syQiHz_xKolxjSKH&F^-kfm?I#f&R{4P*071-0SyrK>4Sf|>gu$zcMsfM*uKNYe+1 z74`vRz9FiY6LbN`7iI|Q0uJCt92b}@XlPw{6^)7posC+L&vu;d258$fa@>O*KG-Mj5D;3^Nfhz3(QqBtG5)rkh_;D?aKOkb9H0AS>M=b);EQX zYn#oca{XF!4ZMAwcsoP=ZP`?)4*>6*M84_PKFv}X{iFXZ(%tt#kl_ccH0~{>5R&EM zxJc-$>F`=QIiAaF50-^2NHJcMD4hXM~+k7KRt#-T3_FK8t#qZN;ao3&J zzlxyE7+Vk?xZbk@!b*vqL@PvE>~*nT)5>)!{+@RBTh&Lq9shVJ)ATpap}3|;-=Pof zjKlm~!`lbT#~T~K3bq23Ys;i+gKa0@XHbZ~M!(DcikZMe$at;#i2F|dKJxjF(0kAF znG*Us-@oep@(}IVPx}kVy}0g2`c3zfEk&A-js;KtDmr$MzZmzXO%`phCw(nO0PD=% ztt~^qvygaF2DPMy)I#4^Gxe|2WA;xA`GO6AS+P<{y|zs7mx?Q)T>?QMS}ejxw6 zmU%r1T7Mydd2A)&%Q(x(*9u?zJ1rNow`Uo%fLQ`lxPlUR`2zT<=F>(-&c;`o$J+W< zTmTa<+aEs0yIX= zILsHiGIn<)*p62Eieys3)Lw{FUx;LqerfxthoY}*(C45pPA{Z+eR5NPn}jTZiPUyI zXDk%%9|tdQuwvxnGYeoD(|ohXH*z8uYYD8vQKX~Zn(2=TubEiI?r|Lcdmn}#4yzl zSZq-`?;}F{9DR%a;fMJug84k5`#%UW{Gf`?2l{|jAH)~5aamr8FiQV`p~qvQl)!pU zsHEvgYLPn&UcFm}wrxJMenlGA($}I=(TYwhe6#p1+vN%08c*B`{xi-(IT!ECw-;wi#9xvTvXlK!$6BJxeFmmq5(D{Y7b2P~B z;pN?-o8njS^>e=b~})Kt*q!Z zu`Kg7X}bQzKO^G2fPQHARo!2^9PgL_n%3sSKW$Qfq2J_w0`~{#ON3<~Z!gjoZ)_+! z#tZm9X36lnaj(~HBenr!759rcNAZ5ZYs$?&2})$_;(N(;Kgqcn$GZFjv;1>%`F-Dv zj_*l$W53*wdL1tJi*~#f`DiTY3}H>jYoAs4ZW^ov*7EJxH*K2^GYjk zZT~2?PmBOQzo+?RiXVixDFkp!Y70NKw{24(btlo0qzWB-eON)+NuN-*rCwi6&SS-{ zPgQT*zEqcOFVQDjYc$`Oyz_w9Q*R4GPP@vpfaN>DbYVncEq;|=`RhR!Sku#AE?>Z9 zX;R#<(zwi`X?3v2m6u+_4?YdgLinbB(1)6~Z|XkFXx{$*Es=}o4%`NjS9~Kz zZM6M9b{l7b>&CjKrK%@bA~cSHydqg{JQa*{7Qi&FFm~l84>x=GEz}ZNZywtlJO;}- zE$7jAy(!Fb_Bhg;LA}|H@8=BNRe)i(^O9jKQNNI zq#Yt-be7oV^>yY7L~oM4V10AFmAx!{F`KuQwbz=rl~(Ag@aSY2_D9;8?BA7zH zW})Btyl{<<(VESKmnL{ZcUru98ERjPm)?ghNBE*t&pj48pAjkvd1fi$Nnb@}W0s>r zDSm;hvus-_dp)wS?Y6%kTh1rX{sprAg#>1~nn+SMZ(mp3&J*qbUToXaKB#8_yX9K2 z4xtpldJG}VQgtWOo)Z!(1M~UBoM$NBo^#qbFJ95~Rm5vAaProD0z~*qzv-Ju^cDMK zDffk-*L+H+9Rt|BHC}#;+ZO{svP%uUCiAdurU%VgI8a zyz8_Zf%^DRG)=>^G+xf9e#5o9+z;TISFY#fe%9{BKACUEacv_14VT0X|dL6F& z*rUv!;%RI^0ITq=<*(dtztfg!*KgWo(KdV1*E01tfb&etvEgIApcWYSA z{9Swqkygp{xRMlgl64iUUGwpsk< zWj9O`_}z1v3H-2wmv1uLDuAaHhk54gas=>4KYxF7`yYL>xg9fOk#>GhbNg@J*4%RI zoy|udcsZ?WfAjed-QC>t&o4I*emd3VyvF&!Ltkm`!7G-lcxC!mKtllM*}ETo=$M(k zJ6-_4^~e`fnF*|t0Pce>dKQXVmnTwO$qQH}4x>UOk_AakL-WH2J>p1-dA_L>GkmjmKL4UZymUt^`hTbb&P!xY+mNiF^^KH(qklikkx5 zxa&+acYG(Zgcyfg9>;|KPH;Mo6EB`Fy0v_ft~28Zd61oiZ^B-*mf&Hg-$$cBA1hv5 zou=s&ioBw}C(u?r?2*}hd3)t|-sX0D)3O)eqUW0)G<|Bkbp;C`%Q*X8Tz)86<;6os zj3JC^-010l`N|EVph8jpV^|+zU_9a`FO5qRpKmY|)s3PD^2mQ2=lTH40vv1CuBE#3 z4JqfXjzf{ZB7gzv*Rt;Oh-UFki>$F-pgs9K+XmOlFdZ?8Jk79;qd6EqEtUO3{oj zH~qZ4ZVJ8pDmZK8941mz<)F$$Pxh9`tAkZG)^fCzzvxHX&MbH*A?5w;>L;()kIPsA z%)iaHK(OMQ#j;J^ZCo~1+-CB=^YO}T(0}bCeF6sr7DAM)_%~wl758vrE@3!u8;pN zWxVc(c7GW7+ApoI?r)3Trk1Mh9W>qIWq zZ=(F>`#Jg>83I_xK!3a(KRRnt`pvypr~U(6CL9dp?eyavH5DMa&^0O zdt{8t_kVf+%y6vFiX9Vq9N2S4SF#SF<#?ITTdAyW6UPn3n>fZ_cYSWdxaEKF!Pw>T zoB#3IK6jc09rrrMW*KMQ{O11s?RT2ZxBc0_imij&fcBWSDcWXF`dT_OfJK@Kby}T1 z23rQgP9$DQI}29h?o80{WwWa*yP}>{?1IWa$UK(L9d)&wr!&0G4n5 zV)Mz{QraYmJK?p}HN{M1D}Z0t*}Lg`$uqnH`pCRM{?tCacZ*sDbBqR{W&c0k$`cy;d-WE-ybZU^GeT*fyh@t}_`jP${2 z2fBFbA&D4ej48f}7iRCNOVLg11k$b97&8*=69ZKN!uJ{i*vM0{Gkp z9;nHK!TbwJs z@j~Z|bvi$;U+3RCeiRv3@=(KK&#PQVuzRo%x(I!U<&)1V5FVJxW+kvbppw5`dd^7a z7Y{ln1v%$rOdi4$y&i2@sx!;Vk}N1IsQoHh8Ixv(rImpy{z|g2aiOyE)&nJ#OZD1y zK~!pcRI++vcPvte-!IdX+f;%+L;p#;+ijt3Y_ajQjjKZ5w_VUy?DH~z62P=gS^oNx zw-$DbzzX1*BrwXf(Dt-Q`$vQPgbGP}JyKGhU)=K((DPIM03HwS2jJPJ1+*TAvQAU4 ziLcx0A#KEO*=8$#FHk>Tpx;2>22h?ih7lQDV*9+_e{G*reBIY}yO^R6%I#*jPb%s> z6OeV&K4_QGX8M~!*J>&;^!&dQ1#peZneu*4u1RqpEi)`r|IE;zI~{i%5;9KG@k9N> z*B8`ZDwFgYqlNla1aOVr2g|}=e?2y=jOzvWJwwczm#EtV(9U*-I>B#vz&@FAY|4J@ z;^hV1yf{~MDb7z$+vE)cxt=;?Zx z`+BA^1n|obH=p>U zZ;7x?j1j<}UVE;&hhN?N$>yHtk2U}FClY`2%@Tg{k+aR?pZ_HP{=ny-Ykt!A3g`~= z5x`%)HwkGvSH6X`83b^L9V&qJ!TMP02dI;1%VJ%2-Ie(Dg>ET(J<9xa>?xIuTox*J z$Kus739p{*!xzA<45#qi72MF{fhk=a(M@12fbk%*juZKdG=v7axSAQgQSs6e<;9%b z9Oy-?z7|@>GmW=2wsoAl;LjAs(8sZSJp-m8&3v`?9`+*Ek&2 zg=3Uw>`{nuj0XbtW==$^5iMAzF{cmXkcV#qSe`ER8&~(i4!>V*l>cf01bSEJ)xBI)7LQH0|#8sgyVzLyFC7%4l>{U<7 zjGNs%8PtRI)NK(FEmAeha^MTzNvNQm4_aRr?PrzO?KV-LEkpooy&hiv0XqBMfcC2N zWvG6P1Cen;D^s@t6|cZcw}_}sg4eVk)MIlZ)GsY5j?2?B&I^U41k^rU$0{NyE#32u zMbA_DT(niX^)tA?QR;ZRoY3;TU1?jf-L^l=KCRCu{nYYT(Z22UF~PHfTjX5L(%ZDv z+l~&{-Wo680J6R$aJam*3x6+EW{6mzzZZ0ECx17xXxM3}{L}k5LGC@v`)6W?{@m&G zjXfDBGB#xPZ&#WX_vX~EJ3|2HYoU6qSXx;}_cfy!%4_ROc@1#>^1)`F=e1@06ZHfxN~)BhnYgwt#-LW44ChM#bTHbX@U%qy4M<&)d&qkn;JS zTK)kW_u4*szpdj-%j>Ugqa%Eoz=A{eOjoj?-6HG{&|6}^3=@>8&M0c-^8R>)Fx zf&l*fSDTNf-yi$uV<~;40H$@kaNnK$`{rBkY<>svH-EAD!6RR3ZpQCFxu^LU%U}p% z?;F6i=+$*;d|r3=70|h?ZYw{SHv;&hDx|5*L8O^iK=0A~El)L{;WQDz5;vWQ#_P1T zj?Yk=_S}=w?sX*(1n(TF0N*VFD9$FiuyuME?(v078kj=Ig?ifVLa2A>j(yn`z&*( zXGl1tb(rG`g5wN@xLD8sJuK~QX9fbZP4k5NP5X6f>KjOb>rL&}nZVrNEv7FlsZZL! zNog7T=#)Y8bxHekFwY3QwgqzoV*wBT@LgLThZr-2K4ek}j0b`^-{8irmAXv2`MV~v zg=H)ul2!z)m9bXzg0~qXeD$|3TdJ}OUT4g&HBKT^>ddtHC`}MitT(H;f#nA))CUkf zg{aurBvkrdY1ScrHz9u4%bC7}6}F{p6|CHCp?oZM+p;5|axTt#v5q#rrp>3{7B(W7 z(nSVie@p-10lkV~eZbK@uLd_Z-E)i}>3E=4=fya}16!W`K<5}0!Sc6DA9~{WL`cVE zLjTD`C2lEpHxsgK%L%D2D%TagLMa+m;Pqn#R{mX!n6A*-3Rs7(pW8_55OFEnV$Ws1 z0JiZNPs|Esom-<@e=C0#Y=^ULf=JiZLfa|R*K{ABkS@M*t$SF`<>4bGX4v3No}$Z-1Tpihs_5%+d6<1qKv7hTu*hr zTZg~2eiVs zhVqoMucU1s_ho*r!(%g@6SjQ3TePl8Oem}8r~3RQvv6hX;969!M`gCXg6Ah&g8Hha zl)geSMitxVhR*&laUSlzwjj?4q&~R@=YOg;_tcCo+c-i#A@xqXK5bV!_Gw$~^FvSi zT7Isc$y?9(Ekc&Mly8a<;`4 zKGUy#<4NQDLXp230*GD;S@=5PU68=#w}5+R0=LXZ^!Bk+1uz7pJg6R)m>+rI<>rU_ zYUU4oqj`eMY&Hig0o*?HHtpkey!CJ^kO5};p1PtlgA*V6PV)klomBuA?NOO)%C_4| ze;`l4o(1r?4?N!7p4#y{_rBbme%c6N!z-_N`L~L{j;qZX+8>w&%o3O`P{+$( zKo?e)bfGm9)y0~|;exG*V{kz$*c&muVZenk9x$A_O5;$4VH)!)aea`U^Ol&4f5yv` zZvgng7WF6E!mrpyd+DN7+MO>(b(?J5+|WLq3A%u$ItmbgN4-3fy1l^!$}xY6_BpU|*blhj#jIb95&K`kI6h@2u>6yTyaIiL^N9e4 z=+!VuUjm}l6SoELyxqK0#lHhMUeZb=-saD!yv!m~zNxF^d?Ghh2xmF1G8i|pEQ>Zb zo2wfeS^Qpw_`T9>Y+P-wUE64`6A-Z+rr+Qlrj)Bz_O`+`<)0R*-^2~pr}3J{EGt^R zCZ%B(GrnOgGMM^@!2ZX>cq@Xt=USi-x4pDr_fnl>TueTklgxPu;|b>^`FkwqCVgm| z|E|gTN|xz&LdBv;Oc9)=aLjoX{jPUMK+(FDR_eCYf<@!Xe66^l`dV!K3|L8{aX21x zyG24mo|fA#g0&RA5;q;T&Uw&XM@Iq!+9sB&*goFIodWiY%=WFv7sd=EoX(`(b^$zr zR{YX$9(N3ldu(4H*zQSq?XC+&9N!G1~yd>nE4AyVBQ zT;DaS8^}7cAhp7wK34(=&FlQ?QF#Su)h;Fr+kDQM9b2Db`=ds;siu{|w4Ew^Jc{k5 zKI)Y;V`$4u|DqkZSG#ikopkNG08zG0SfQiz3gE5u=?WeU^iLAm;-eoAqn+hiJ$1Rxs<%VUAbxYf>ILm#dVO z=TfDZHDieSPu~W|zirwGFdi*ZzdmcS`_S|`_EDmcwbMZLFeXlCtZ9n(_OS@dl`^;py8npOnsj9(8(U>3k5W&$sPReJ@r zH#66LDBUti0Kd_ke)&5M&)y|I`p_{hH(CH+xsV02X_LPC8Q@jWi0caAgqgKl3gB@- zw(1|yLIA(M+5GJL={v<>kM-*Xc&2RY*ln5_^xdpb`9UZT?;rY& zZACvw-_UWNglzk_;<9kM0C~0o)&=V2k)XZ7XygG&UTy_2;B+|_^wrM%pS*k%1_>%- zAMyp?1?C5S{E&K`;_;eiy1`TEW>2Lm#IDHQBy7!ZhVpc%^9;ddYQZaX#jhe|RSruV zOF=EOld&zB$-LQI#cQ7R`@a0D=c~=;=G9jGX3FLIHO=G1Z(V1JN?%Kz)-Ln<5GJbh z612y(joVkV*}l%&&Irah!T7+#X%@k0Jmm*1AOvtQ0y_WH59x}()kOa1EO|w}elIv9 z=dk>(ZUKU^6uqEFBGFiGg;x7}3#58k9?`M|>2=%?S;o-$m}n&o&dI60ygl?=kEJ|_YBi+mJs1-np+T3}`FRw(N=Z7;}UQ}M=#h+wl#75(S?DKTaBZv>=Mo*k$1 zw=2hX8Y~ult?PtHbblmf&kCj1O*i61}ud9>sX6(D9^wpv!fh z5?sILe{58Af1|HkDLQAY=AIqzhPFb#P`0M*+Cvq8=3mKr&3(~y5nQb{poedItzHb0N!k#Xl1Xw>Y4McW!d_v zM=o$&D@6bJ{^lV4!D}A^SJHOcnYTj%7|XZtGPUgsGYH_ezDZzK@$M49uE^4H;KlWb zUn_uxb@SWC_0uPSIW5UZPfYg3uL^bhR>MsEfc zUN5y7cxQPi>w?Q^rN>%|Qai`dIFrXY9Qa|-pPmAYJg~zUz;S>vgBv=z5tH9|Jt`im>H|T9SjJ5mZrp0= zt8}F8R-tudJi(iI$Ant0uB)XIz*J6OeT;AVvi!YzS;X%KUiB=qe)D&IJ+84tRq0#f zml;L{ZjF~Vm|xr9B2qW6OWLmBTgKOD|BL)Z+tc@r5s&}&roO@rJjMdV8Xf@ic^cym z=M{qgQ747^5J(=>Bqi^wB;T;_2%Y^~%mQX;zt>Rt0w;cwsB`J7pQweTj$7THEMp;O zQ;0YX_4g2(&%y5NZo0N1q5WK;ZSH_H#Y+c6dA#@(XN7QQpHQFTT$Z^;@pL|;-`dX^ z6|@;Eakq+BzlSG++wDm}t}wJcB7^nZ?VsPL0)IO!6sPrL-FzKO*QI(Nw9^H!%Aoe1 zE-gd6VOv80S8?r_kTHno2jc~>?eA4Y$H25qTee`TG{~WLViT=e~)6myAkG1~@ zvej`}mFGHL%(;}$L+PA^b3-~m*y}}ZZ`=O24QYH(U$kIZ`7ls?+oB9eoIQpJDL7+kidIb0zwX8|j{Gl5$HoUyZjvFwT3MX`MX`0?iU zBolAB@3l5Q3*df=Z{m&;z!dlVH<}NmILrbr1hAdyYJ@0@*GiCn;0w=DzO!al@Sis~ z)4Avvl^rjD4X5`v_x@?F>(~GIJI%MhaA)(8Pe0r|aqLQ&7u0nf_*U~DQ`yhlV_yON za&zy8B>tn{KbF>Ykk)l4ZP!_+zDev(0o<9d@tWs6 z6E;iJt~dpr{KahCvRsA*Z4b4`ofVm7ELaijty5%g`lj+V2;VG!MF1=KM*tc(1pa{r zq6$(<{=op_P2bj##$h}Dve46IAwTE|b~v=}N8y#V6!~e4P^e?4Mjrsm!#+=>j6}r^ z@X`&1_}L;}{n!qDpow!fQ*ATyKsez%jlb_*xw?}WBY}++#P4a*vKB92!jru&ZGG!* zy(%qB0XMwwTdPQ{KGbki5>a5lQQ~)cU^tE)p0o;bgjNL_r#O;sqI^PZMfQ-|bnOh7oLzE@q zgnUa1-%Fv$%iR--)SWIIQ}39N>l@MU(}W^_b12f6#%diFGk__M<*$Sq@5$Olux$dk z6|yp`R^t~YfUjgBdh?$=-0T@8fV1fRz#re;@N1+ogZP#7O6i-aF3x*TbN{g^1@N(h z&4XXKyZHd>_^q!t-~MuH&u`w{d^EKa{LXFPY4*HsL~vWzoy|x8G{1)W*KhuO^WcxH z0H(au#~;M<2forg`1JkFCw^1&ns(G}t6u@#rtdBR?8@JoG{*QfttwZN$W`GxUi>QS zE?W`6!Lq?jV7w0cDt{CBB3&$BTBi$4x&XE!n8C#+po`@~25bDB$QR4~@fnqoA|&kv zGA`Kl0$wld@gJQ0fPsz)eelH(O=x?Vls{kim-MeYw_%ak{%FC?nimi34V{-hktBU} zpJN*-WGEedf(KD&Ab)XuTY0;x0vOnHV=xZd&+^;IU)ukAoZto+H=%r!r(%!4g-cKf z$p`T(H+?F9Ax#kqR;W(L^@6vnWncC>xOD^jEnzEvH6*A!#OLPbdb6>9rPwGm6^0=ZGP?-WR z4gQPh~6mF@+Rg9{WkK(%;RCfb(VPs%ZSYsOuj?NB$;?@k8UP zl)!WN`<~8y_^tH`vJU){46bLbP*It>RpwdOSXw#P-UrGugcY_Ef7{wVHGOlVp!=Vf zb^FmL1gUL>=Od){xCh=Rrl6DzD0xNrEMlc~#ZY_m7 zo83737l_y$k5|W5@cMeIu>7UE-+kv=3yWWVEp+0p{Q75$&Hz?CVLQyjQ^NxI+uvy( zed?L!(9vVf8)q*x$1YxJPF!9uB-t#u50Ml5@4YRF#!oh%c}iZP40>P9?16RI*D1Fm zvJ$`?x7qycM_*|^@xcD(b^1MK2Jolu`Kk!io9}5JJa(+PKh4y=`DO|K>_<rcPaJagK#hs#o)eP3;EN$Y{^z1I=8U%mH>oc_T-{YrEHfwM;5 zCIL+KJn;qX=fusowSCZS8!d+b7TR&P!83kYthhpVT9Wjsm?VIiiz0tR0BqXn)jwG>#;8J9v3Zihl~=2aR;&23gb20tR$`my3-gCz_dSD%+k4K6q*;I#imbyB`)RdirpG&D=_UY+D_Z1Mcs^aZ$wRPoE#@s<2- z_m%D&8#e)aAAm9LNnaMKv>oz|Ub78p`|PpQ3Pq19Z@bU6z7}1NrOxB$>&V|Urnqf@ z+EGi;j*unlJX^(E2SfMAdcQv;eHBmqT5{egX8{B1A5Z#Pey%$+*N9m+oHqTj^t&(J z$;T2{Uk_c*)Rfto5-(}>OirbaUw%4^UxX|yHB{>OotG|Rw+@wVdR^WR$EQ!~|5?)8 z@kQ$p0gPn`U>c)V0Jjpj4i#DUMQgFXIKUWsCq;w2s$*bWe`|(07{sww~YmPV?1? z0{FJ(3kNWp_iVH0p1TVXTMA$;`$qGVFWlXH^uE{9vaQSMA0vQ&^7`Y=7e0PlbMvo% zzPbI=X{PXpzSTT)p(-;;0Kf8`^or@-C4fP%`~^vR==XkonL7(~T=mc|fK9oJA%M4= zR>G(KAtG454SbHq%mo@hcr`R$iK7y@BYo}fEzu_+C0;I!>xWw!Z*MZ>ftTh%+42JZ zodjJx14_&F&!4;4Q)>G$k*EJSeFNE&3&5d^EFJ}8f*7~nV&NF>$Cd*%dI>+P5+^yoRhfxVkzgYsC z*Ir*^Xk0)BQ>gOSN?;MeB7t#UgFqAEi{J9Fs74;<{AV2EC-*Cv&_03I2 z%aW_GN;v~G}_lH zfmH;z5}3#WcXq7!1sKOVo3$%TXUO7eb)Z0*x4~!XC>dx zLa5Z)D)X#sEUlSNZE6=V`yR%Tv(qOYB2xtDWsD69US1>weN>C_gvq3P#1| zDUUs=uU^MEv~T@BM!noV!fO*KglxjgHx|2{8rNNi%HC4aTG^|3qPGtzBhL`<+tzK@ z-`8GG`dWUjl(LH;NnJP1L-UIWRk$cNWl>foz&;IzU&4aI;Y<|)sfPeO*FSg$w<{7y6 zJ=N?#oyt$kfB??hWPx0Ns`<=s$+Gq{zFF+nX9V!4ZZoro@#<@{F0g9_a1tIWe^)~Q zr?M&^gKdJw1BD`hX`d8n>nwuL(0*bWOyfpo25&Z(>0%lWl3MYL5X<`^J2YiebbZc>B4!a&se5&9M&c9cFqy| z>gG`t`O9_#+jfTXVLkj%5jR0{(G8^H#)ZD=01tK^(+%G z16XeQ-j?tC5-NXN`AXFC*UqZda*E2>q>3t2w?krGN|V|X0~o_G@Bdi z45X(gZu87rD|%~0{B{Mfk*rhV3EV}{UFUl9_B9~0fmr}2`D;-DjO~&;op(@J17o`YQsoqzI!!o0urVPb*i>m!}-+K0eYw_;^V7Ajp- z0DEbDwDqR4eMno-wk%0R{G#pkwp?%fL4IGCJ|NB!IEUkJJ4BWWV3EL{=-LTbX{XpU zo7ct-dFW#&w~t z(`y&-wtYLX$3Q+7fH!VHov$C>W*$ExznOI_h9P__xF36H%RmAfXt|WOX}>U~)SU(^ za;Hbu?~NG`JN{S<5qjRzbNft~dRkCFja3LD%m#$KvG;}ZV4ih(v|`SM&hd;al{erO5H(Q|S_Z6gQC$>LyGX>Tl+$hdnROY zn3vm`x^=!8LanD0_ReTsp>U}EPAFn`ayWYZQ-)*q$Jnrc{7{}d*LYiWMlcItEb}a2 z3VF6K*w?)KGZcOX;x{d)@L#d8^`!4O{#6f47r+pXDt+nr{Mjq_Hy>?Zbvz!ta#`w} zMF79t+}oDEAkrYEg|1Y<~n-?aDGKKxcLKj zH@83VRI~p=`hM`~=bC$NP3dF50sN!%o#vbGY(Dj)x*uO|zN+6U-k}1x7sw7PQbx$z zrBjK=V8t-|>MWg0A%W{xLSN>4@MFP#ut)*EZJ^GV3)jIVB?S;yf zlybEXD`U5dx;=K8mD%vzK2rw^6%cb-vzhdmH> z*V>0l@*22J{{E}{LxYZO9qW>w!Sa-F9l^HJvk&Y8MN6AU%kh{(ysl(IN4%eA=F$6_j!=H zE0BA^EOQoz+;f(A={By5wp*b4wFJuAG=2Ru`WN?V_1_TuU16wC^zYsnRN&>mOB|hd zAXWeW$FGa*gsiL-D(jM>j7x-UN%qRj$G9Qez1Ik3OIB90Dtli0UdhM~xwyDy#x*al zaj)xlzrX*_pXa>K`}KM~Uyp~pzOkbE3|$;4%A~DgQ{MjE3nxBK9Jo66eQ-)+UzPUS zX{>r4Z3Q|v)KIHvLrWtJ6rBym|^ z+DYJ@Bsz;U|ZUo|GzV!j~^R$8Q6h0J*+C^KjF{Qbt&_C`R)F^gAb6PmIoONIbWClNE)QF-W%_Ew&Zj6(p>^k5tjj^3qux_@=0%1zMWqG$uAJL6J`+%D_`Lug@v{~Pgkt%Ha`Pmi7aKXifMUFPIi`az> zYo570e?e)p?w|e3_<%7_wNn`OConoJr|&%w>hfHrzB725kv5zUGOzwr_1&Jzwz$Ak zkkssMzRaPzWsSZ1RFtk*M*{Zb-mzJvu43=dqE|0Qn<4B@7LrY$dnzSd{Jt=p({5pi z6~5h5t-Y?U@OOuClu-f}q3o%P&z$}e?;PKo`7A8d>FHW1Mm}7s?Bb`Fi#sC2De}y4dAU=lgALILM5#4L(|FBZg^HlBM)q*<8pn($`%Cp#hO8{JQ)Q5 z_pCJj4dy9x4RdVM94$40xAQfD=*=_~Ptyv|bvdYeF!N59*UETH zE~=4(Jhfs~`ROG)Lh*GQMRag6={Uk2;8f$%w}e0zn9Nxnoez---v(U<(CSY7V_DS7 zySlILL?VjwB0d|R(a&0ryW1`_N%2A8`pF7cT{U`(ux1W!Ng9mhLoZvbk%m^tLP;b? z>72+1j|oJiIU+ehimd}bN^3^4vSQF*S1|(OuqV&oWaEyM7#ymSr!>}|*dTt?ymI#w zc*Tq0!9&+&EIZG}F0!e2qo3Pl`V_?BM9$hGJ4=wVZ}&>;Mbgby*~CXZZF+4&MH|3# zpbf0yS(_+Y^=$9?N2Fk`_m@X)*m>o9SRS#z(S!qR*lbJ_oSv8*YY99FC(A?kUY+=a z77V)wApc#=38+R6-~P0w)+Wed$V83^FN9XF0HG+SS5duJZ$nEiO22@3cg@?sYbR+6 z@5J)f5KXF+Yp%{QZNS8Ps)fB+n+%9$Miog;GbcLiidlJ zGXLvfLbIczY@-Eb?M#!Y!|Xb{sY+e@JNnnH@frDCC$J0)Q{x9J-Zu z=D-h|{uSB7swhC6)tQN~e-oj)zuO0x85f6LFFXD{cJIMm}d9=0{BRIIx29XJt8H?g$=Rp zewkke9lp#n7$iintoL-^*PWmf4%09qem*q5fzQQEujY8oy|FFJQQ-PuAaUAO<@-SI zZn|l?`n~@9b_+0FHUwvj+n^Om8HS0i{n_-idUP9-+-j3)2IL61La_#(#pduAsM*oN z_b7U}iL}0wra!&wP3vgQOkZ=_8p#)}w*MYkm7ZDwL)E8r=PDQf?%ZBiPHn$UEAxlZ z!C}OsXz9Ks;PzE@Ml^GZn%TD{&YB+lxXekRcWci-fm@lcmNYRE<5xve^$s$tI=ZV- zW~N87t-0f~Z=Q|meMt;jfjl8bT zsIBL)75WALmVMgXE-Z0dTeVVX=48TT&nY1qF9a+WV%*g0;~w)UxgkjXD`U0#UfM~C zjZmR?Ls1*N_#*x~N=@^7I;x%Z8%vL$Xq?3BiQ>G-MD1XAxvjs)lem+28`u1UlLK<} z`NtGZdjq0(9#I10?d@h{V4GB&*X{qI&HUW}p}2g$&{^J}DWN6P*BQ?gXru2o{`9rn zXpNmUUe8W7ISueZtAJ|AY!=@Ki!Z7!>BqDYRS&Ho%TO4N^4&`f$FuM$>szpb^edI{DJW*r7Pkg5JB7?)edhGwH_YMpV)L&g+S3T|JHcHmw^)#$#CaTejUdI;d)Xeg?JY`5WkU zc*P6vMFptd%qQ~uh}n0jD&92uDs^Xi$K;4gn5L$a@y5zik(!Sq+SVnvLn!|{b=J_4 zb~cMqPg+xv@9qTZJ?I#c(S=!A(r~=e$H#4qZ!x z$8i>2YhX}0!ddvD6;p+UE%(fD{;%3=9!1c(oLhAy~F3Bk37oUlkl=ye) z$eT3#o^LTWNw!BNN450xK#HOl!?jUJG@31YN4GA(R>SVDk5F0~7b;wzbbvg_ z=iKBZ4YMDn?k#pw5T$?QhS+mh)2Ewz4}#=ao65OD#XY@j?tOV6@@?Uj$$}{>+F*_M zoJDvD?K*j4MnipOodXXfXJo%sNbXH^s1a1}(i_y;FX7*PC&DZBDtOv-8Q5Wo$>LP}Uq~t44mJdtAeP=pd|oyB+WvXy z7&sjnfc>UuaSW1zBp{K;(&RUdT1UOGqEGNc~ngr@&+68Z7 zxhMhUNC@~97fQ_8y#-YR=}=k9+NpU3QE7nf} zVp{xsUYZRl{VvFfLRn+mzaawU#}K08YoRB!8ZJ`a^B4Q&>#vavbt71HkzZvvUPc|n&bM3v*jjsCwf1f&v>>P{cey(kf2Ue zV4Vpe{h)D&G&dRoS=XhPg+*c)>zJxcyVHV+5K+|%?(oNUalISzdUY__9| zAN0@Y%rOVaKO#T1fyJE%PhlVaTha5irErmMenZ-{x8MG~Gm7cI1@+5|pm&wc zeOfcZ7(>DF*1kLVweI@NK@svH#aI}Z>XxUrf$uJT;2IzM>`}~H{TG5=}HYZ zJ`A0X)TCheTieW`{7k1puvy&ka@O~iNY36}qeudXP^-Lp{c&oECRZEu{iBgd)}K=C zuz|Ec=*%Q-!3Nzn|6ab{8XN9UUpK`C{Ce<=FZ3F$KL7m`ye@j;sd6zH31PP!n;OHq z^^)^rT03owgu^%YI&Y%=cNzucZo&;Z76QEJ7RXtG5G*LB?qZGSU*{T`>kp-8Cjn2t z4kGH|LzV;VD1AhytH2;GO0M;|zr|Q2Q#bwZt@-2|N8rB$EL=j@gc;7juC5$5@Yuuu zRK%}X;t#Nql9{F-T~=G;-3PB4uf9wb#ns(n1G4=bBNEXUZFhX~l;xJEoTf^gw4z1H zQ-|1q|LQ-A$~YH|c}t}2Avrg>wT8r{r?*>Mw(*64B{zBL)?oyggK*jMpDrc{b|*1I>*( z_WiJ6Drc%K6|VVhE2I^-z<4Zg6hG4LP0T9Hp;hxjL%$FU=SzVwOoM$tj9nzm$NolOGy~*1Lv}S6A8uiC!7CeNrn)|{1bZ0qiV*{%WHWNl2Hc+i;4d}>n<8( zv$VTkqskSLNxX+*1-UD`GHl0N!BEepDTp!Z;e?L>RJO$bY(n&3<5&uG848Z8Dl<%XtxL8;5n0iw9wma z=dM+~vYp;EXG(4}{r;ZvYJO!=!CdvqA7qcMb3rZz=OF%)M}mu6Cr$S6Z@! zF+TmjU}6eRAl;<$tahLspbb^Zszp*|oy)R6G>o`q`NOx-{ldxH`^x6-83Bkn&@f8SN7!_IYV2d^gAlNO52YiUJ?j}zk8KP6{C$k zs&>5Kacgs!6&=MAyxxpAFT5{G2zwciO;EuaaH00Ddr<8( zL2{xEQ#g6hnr~z04B>6sDaT-A{B#3n`|2_XwKpA+eC+*YXG(=*hzkG?&5J^kvKvJr z9-0bQ0D~&oyNpCuPcDzNRUK|dLC=`p%GY#~Ei*I#bWbAJdbRH92Ydxw$Hn8`l>JW9hJkB;vQN_X1yZg-b?nkNN_Z`(N#DJ<}*_Yb;dlXw4FRpG^5I;e|7vJ4fA%leJdk?5PSYP+xdCiOGEE$OHh zs3=DX&ZY*(8)e?-Sc^xbpd=$@Z%?cF@bSA+gwfOpxxeB^q*6z&`&_L1GP_29g51U- zu<)n-5(S%c*#m&!ECm$;75~;M-IRrSJU=|Rg>{(QQ>lSf#fr`54>U+TC^!^7!L7>C zAgyjsA$a{jv*QsqGsVdHfZ&Jw&K5#;!6idVthHs75bMF~mEN!Lz_xy{1l&l^wycr~ zj$@JJo$$YNxqAz;_eYVmGh?_-&K7`Nf(m@~^^k~hbicixM8vVepF7@Oq=xB`n3)A$ zl=6!=wq!Gn3XAV`Qa05qb*C;7RNqtYioWN(llJGnxQ?*`w)(khe{H<+?)(wigw|5Z zSFWET(8>6ejJ^#8-9HqV1dj&6-g`jhu#-_k~-v(o8iLR96Cu0zkmTb#!ql1!_<`p z5dey%POOVk=cpszr+?N6a#;^Yc%|JPFu_QAW7ZR^Fk=JrYz;0U12Z8iV^{L1m}_%- zsx?JqYJjKEA&y}pnE3Q?@WbUS%&7@!^L>rTNwhz5DMqAA;qLcK0sbiBt`NKlZ4(DSP9a?G{DrLz+*BWfb7YLJ+QJxX#i0v#{?0;3{69Mn-T| zkv(htW-#Sb`9k8Bf5Tio5j0!O_gpcfDicppsEEz~@)|d=%P7AXpL+iSR26C8m^%=N zyTO2vO4`T&X7>)79yY>Z~O^yy!Nq_B)1hr8wJuSiav#}K#r~Wbl*35*$@~LijI{}pqeU}6u!Lm(= z@@1Y;UoxeBv{PPsC}r0XmkC$=kN4Z)%D0~4FFS|hG-o*#8{|4)n(&Wy!ia8xNj9#%7QLYgI?DL0$YS8iL32-@Ts^`Hw?9GGYYG$&g*m6rFoz z|HPu2%}2EYP5-z8KAJQS-n;SYy7fKWbA*TFOM#8s+c~vBo}cM`LKj>NHiCf~jxTG0 zlX`Sb(ke~IkKSO?Dd8v#p|rKbpBmE(Zuf;wAI~VZuHVue(V+n2Ck4dNshSWd`Ljs) zU=xKlV=@9TG%=;A`C#wbuO9HU(^8`n$wI+iX46W_sdVs`$`8r?hu|TMysiAnaD3D_ z!PGc6O|qM=%ACEkoSBh%oolBHTy*h6F3dkzW)iP)_G3p%y`d=Z%D!4ZJ`;uzekyZ8 z-sTv-JnvKWBy)@XcHrv5y0Oh&e%`o-dV*S9`pPL5O`^RO9dJGW3o}%(IAHhQ zkKUehQ_>h@yK^Mf-3PbRf@`#@{~XY8uq>PJ^~T`ql;4iSN^>H9?9u$1VA0)DwbgE6 zb*ES^gDcsyW`BHZZuIe=H7!1LOjLnL183a?+QSZiS>H*6WO>10q6$7_@!lS>M5S4D z(6@dyGGkE6Y_GlE801&^>3nzIL@mxW*^ZsBJt^N_39vtWPqyR%3I$ z-CUJA`$A$TyFm&QfdHM?5(79ln*QLNC_}`Y%<#p^Ocmu+C5g`M<7tY$4k?V=SFoi_ z@KF?Q(xaoEQEE-V==7p>1%w_Pe&s}R z{bINkaU!O}xU^ohX&qBinrxeCi|7qLaGKGz9IL{*pZt`;xxI$R9X+fM>~k16aYV0# z?*Y~!faEWE7q~C%r^&D}QZ-ysjph>6z|5P#+a(@Fxtc{#zl$CCsNQ+cl75Fr`3bM& zmFi2Spp^lWwOU{`PiD)A8O;RGl=;)pTg}inmJv+d@HARe4UaTP#ik{ z7r{6s87?OdvpiQns$2Dc3L2aM>lesf*LJy?Dtzy>Hxl!;5G@}eq?irEpO1_agwiW< zSHvSI>rM|jrt>Mczk(aN9HBMq!`4bI*J+}GQR|}WY)Eqsw%1QI`JK-J2_dfO!(&!zw{H_Xz9vCmmUa;4SEc62EQ(5-97DME6AkD&B0@Z zF07q1UlRVak-l?Ta~qf?y8oB-#b{KoY@@k8K?$@Jfu?y4?Fc#xys;3l^Y(RHJ6$_e ze}a|AkD|X>;c!w;^dl?fjvR`U_Z0-kb!aB=n*-IG2U{-(+Rc9abhV{g>iaY{~nz6k60$}#+q@w`M7y0dcZdqGwCW_x&NG=S?Y-U%a|xI%G6T0NS24Q&;)MWD6Z z)A|?g8!T`8IAd^?XcI)BNlxq{esfON3{YONBaQy#f;&u48I1Y>%sT)5|1+hNPha2O zk-}2-t|FAROgE!x7AABJU&#(yif=K$&_N7F4jKPzDj}qA&XZi`ib>Y?|91Y1mXfj# zR>IXyWp9C|jEDvdNbNzSc%~xaT2SGjepCiG?c!&8ZC* zlo;#CMZE+#Y1NpFFv?fQUZwQ3fr2vX85UILH`!nJE$a+Az=EK=%ZZh7R*QfA8xB79 z%9(D4N!_v#EY4(Ih_(^~wxn>MS?Dc*|8r-Eq1kV*jcnvXk_7Cx==!a)*C;6$-HBTU zGp`MKXGuCD8m&K8_h+xn5)Qh>kVqTP%bD|Uf*13Z5{J!bR+g%ipUr={U^-}fqF~9VjNu-? zuAWKzgR}VxSGQ}n<`=d`U`ffjqtOARZb(Yn+TieomTl4Q3a7%(93hdAXm z&w5r-lf>@M-87|H={liJ*gP`2`e@W)N~yR)*NVO_{_T(q57EMK8mW?2LxIP?2?;mA zIWpvq82Jv(I2rQEd#RcnGns+8W_r75W~s zav}RL*S)45cEAIIf0z9MlUg4P+Y^<4`7kIvFPoqz1N_s>D3dro^0w6AwxZjO8a8$y zg9wEm9bPQ4>1gbiGf@y~!2J;EH?n8tSDD48L;w>XocvcH3%(stA#GM+QF|*OY$UGZ zV`r|~rA*ckzjO)Gvr7UW4Y^ji;|vdGSJO6s{n9_W%Ij#U>A*D)6~y0roph^ zntqoKkL~t-7hfTgOPq?;Uhc#N0I$83=iosygo&RR_|E0dcnGaz)`=ULz_yL9w}?kF zjU$U89b#yU3;x%?swK78AW;^VSDRiPSmG_7e||xb}FFlxeZ+3`4FSS&0znbF-3Ik%Ga@rPqj3YvOk1kXMIYe&#WBn z>O}0ZH`yKslHvvvOG!UEQrPON(N3s3jF0ZF8S+DRXsY~XhmwzkluP#61 zg2Rr8=Fz)X-nu-*e01W9-s>3!!~kGJG;c(nVf(8i?uHA6g`N7Z@jU_ZT{@+rUS7fA z3NLdm&E9Z!DN(gM#j3p;A8ZDSjHwukNe6nyR&>0m>*UnI8}C1aemc-5=)S(?ZlCrb zi>mxq(3JsA-2r`q)(y*46B$h|g9It+KuuYZq z{wV4Wtn2Vw+h_m1#W5?EW+YZp41bi%matOF%4d|c)@)9tFI#Ss?2Epqo>_1&IQp~T zE5Tit)W6Hz&Fw5tXOuK^`VhB?G*mM~WX_v#|0W0sE=xR_cDvNFdEIpD6K)+ao95NZ zrDJJbBv^D1(Df*p;cXPK`AgqBwSkrC(^f|Nek|19jCW3N5#xJxj{Q;RkK%OMZv%E| zNX>w|V8hC;XMn*bGloT1o49BB{K}-Ql$}bE!9dR6ThhPiYDDx9FN?upZyul3_(f(x zl0MQE$elM=k$8F=xbB>=ZKV0;{f#Zcw+z^;MQ9f~o60_>rM2clfPFA-!V*eF+-|&$ zLoQ1>U5YL~T9g?~Zo=tVSPk#8Sny!bUEH=@akY69Yo?C!RQY%4CjR#p_vVBpu^eD` zH$pD8jiF^DZy8S`6P{2GwCF6S7k|ee_xZ37DYvvPX=9N^s;n#0O*KnM*qmsx2!38_ zdNM}gJ?BGLT_RMEvv_I4`UJQ&DYGWMYL-LO!@Vt9)np2 ze+5im&Wuvw)bCSO;LVp>Zo9;UoM4ohDj=*YE1iCx-&YL4Bc@q*`g+S<&ZZYsTvQvN zhA%ex+~L$gz8|o(u%{`bj4tjL_b*IIii7FLmW?8o%C6*PIX6Jy5;+GYZtarC-Z-+D zh+9ncww#c%{&)7HJ-uXdbQMx51h3~=61BAijsQlMMgObp@cjg6?5*wH@ z#Ng|hvKLx|-o$U{>Q27uh*Fw=3E1Ya_KI>!3`>#Y6ek^S0K7bpVz0V2osoiaV)NX< z71H)Ess`;}bQd%O$VBe@R0;9XwlZ6I0`;|nJy=Ig4EB2BU-$$e!?qZ{` zje8gES#HP&?K{H-Je{9=5`$iyuI}kvp1HCRw_<0HHNy@$es>Q4`MZ~~jawJu5hTSx z|D9vNmyy!&!;{VjB&ldOwUsfj#Lv&o4PdALY}*sn=f#b5R6jyn{BIUS=UBLIW<(MC zV96`Stea7)+drL@0$yJ}!KBwz6i^A(=O=DDTb`Q~EOhzwJ^HtXj3kS!{2_J*7uUbS zRX9-TE#ZWMar@*u26qMdFJGU|T^>v=Q5!Y>M3k{*P{j?}IW)0PWHH)v@AmCflSX9P zmsq;@3CJ6!g8jkp^_@C$OdxZhGuBJ2ri_P7s=Ih+Vwa@D@yy|jox86En+b~vX_e{9 zI$h-O@7T{hx_6Wfwn?q^yP8zJ-m?@Ec2d7509&~*D)xEoTRHkOC*+w@cro;A`2B0r z7q0fb0+!^b=X4@6g8K(u(so3CI1bTo$l0ou`tfS_y|8My9pNy_s9EIQJE-I7BBVX= zl%!{&sw9@|cc#QXm~}>+?2Eyk?u;^{@A1&)&BV_j#o>_O>}uqJaX69NeK()xjLFos z$@kDP++zNU<;+OlJITC{=~Ax?c*@+`5=GvyA+af7JVj&=Y6egQgHPQ6PNe~yDD5}~ z2VDm;ct1b)wj#Oz^yzYUrnnq4r!d$~^Xrl5CbPq1)*^tn=$qu+dfv6Ld~KnMS2kmN zR7pu3hRBhcaxMG5!Bxp)9R8T~$#GBw82S;h=q{z26dX9G$1ezWB7g)FbT8kU0`ycL zcDa2iK!+9t3qQWHIjWUz>GyQ=G zDh&)mx}YM-nLqhr3hTTpS`(H;VQ)5H7G$*hn+QCsj839rKVeY|-H`dR;HPiI!J4Cbh%xdi= z)=1V|)Io0tpEu>w%y8M$v9!dlc%MA-p|~V?~Q1s0UB<%dOjemX(;;2+d0N8cUK&1y?0K9Q?_!(xMXUPyc|pdOT7LaZcn# zT`!4@oAoQ6*`?Xj{mB(^VUaYT!3j@+sib^Tv24Bf@6a*lrK2u1PK2()KKi)ba{&Bp z%vP-c{3$gZ;y6`9urwH|XR{SBR^ULTAd}*-^fWbv_{{c`gC%stAQoN&N+XQ!Sbc4bI&f|EsMRy{yZ z*PXr62P|!9Hb38oy$_jfy7^lB*em?n)nN1$q6@Lc%0e&iu9vw$cg)kRAHTGNnM41~ z;&X%zVhQfQGRdKj+P@yxgv{Uyz070;t5%*6D?RK57o-nZk>PynLM#R8hg*K2Gj1I3 zkrv{O*Xc~oP3uH^7-?3Gs)AKJnH+N3(#HY`n%J*j-*;es)~PTRmX75mKVRX z6$kg(vmy#EPWR(Kt{Ze46|msd2({d(EZT}{9alJdbit06)%^UC2Cd9S@_}}zoH9AJ zM(|9v^S-hWX1k=Cc`qdZ-2~I^EmJ*DiV+I42J1a0X#P{`CLT|}yMR;mN!$|(Tjhn0 zIn{@EkWVGUj=RU{@(=x=VI@_=9}$$-TCs<7ZZYr+KBN*!Yssk_9mfAMUz-#ft9p1~ zS?w1D_;a}0C%Jcb_rsEk$!@3&IC;60m&u{UF!q$c_~0!aI!2Ya(`>Is(7+fhb2b@x z72Sm&bB>LJA>_o9XW+-!{U7@pq2bN&1T0x4W5x3p53>75-3ym5VF6!BiPxz}(Rafm z7#2aEI)JE`cyrMsYp|S6-w+l8f53?<(+)e9qpjh96A^Sf2jgxrhz+u7S1|b*A0)cM z^G=-o#}aBwE6t|D{&i_1Py|)7_U&-JtS40bZh#yBnCB`r$=2bS!v&on_)S-{=-`!i z{!5}A#)5YRmI~bd(bU{rp`+a|_pN#ki0T1mIY@r~wR^0+aVn#c;f8U>%=?J#V*-!c z%3_J*f=Qnr)uL4cpQ*k)i!Xs|A)7iotNM%d=M!p=2Ht-yPaGVuNp7W_Up_)0rgA4~ z8=_2P^N#U(?0BZ?f@>!$w;o2jxic+bd2jvH-HNycDNuNP_LiNqL7ELQB7LUw=O72$$1`Jt$UKu_XI1!pZSUcEr z0~qN!Y`RGsd8pR=8~+WX_QZw3S+0UGe9txW6)Ah$>W`_8h>=q-+BbY7yo0AwHvdL5 zS4qp5i?otBTWK93!DSV!>6w^I?PyBd#m9yve=SPx9CT-Sg+MzQ_<*`O6}7|caE-Qx zvQo`J^5;ZdZbR`DC4!78jouAQdAxbap8eg+?i?0Q6rAvVsrF9iL(*b2u3N8qj)%O| zyRh#xRJ=mH*WYb5-&OYMd~k4 znyOD*21n`bEomzBd=@$q#wpqFqXqV4G{`+U-e&Iho(I-1Fn?BE2Fk7|_2@UL%iw(pmv zZAwb@963?QJHd}NcpMRIgYrcuX&nGA-{2u$l&mL{gQ`}2RvItLlP`Sb`78#wVh!yo98?;TNv*GE(p-65+85(6DB|u=^X^ zFD-X{0;=L?{{k(7R{COJ7)#NFUTx$eM&Ymqih0IhiumKw#&-Ti8z&VNLa4Y0K> zYz1oc&E`iP`tC9VR6XNbr$W^e05b4&@}aU!16}(8m4u+QAbsC8RN`V~K^e~|;EEn? zO-EfY?*#s2WV3OJ334{SBvpWP{aVX`QY3OaKBpXTarTrp)C`Kf%02R%q?#+mq4P*W zLFQwNdd5{}cg~rlTLr`;@?%|xoHah0{dgy;gc-`jf%ONCA?-fZ7l0PBiuEDA-K*qU zsTczt2V)`W9-j(I&s!qg$1cXN8g-bq?hPE>Q70N#P_6tlsUu-TF#nR|*l6FlJK4`h z{c*Z5RFnvhfH#4?e%6)rAs z0dD*Reu}m?C68WWxMKs6C(v&AIjDeNkXXvFh^wCa1V$<>zWh;r8nw$78g%N#+I^rD zPxv9NKiu>jJ6hTKXgXl{=b4Km@YG8P_N|ip&pFg`!Wr}5yTjM2HqxUzSYC@;;guIZ za^=tdGr|14DR?gb>CHOqa`Z}rr{_1oqR#G3Wdc@!XDh@n|+y8F) zOP=r1_Z$;Mqrf)L8s@*`JcdOhW>#tU7hZj{>o;23VqsD{U9fuz<3XLX=Ajja!w?!J z@km-y{*J-pSeX@5`zHxGOX|=XRp3(Jbrj?VY;&+c1%7}3xaV?XoRBFVDjdF6YEnh} z9B@gJu*f{p)N(D)^00<8tm*tAor?K)cPPySn?RI6R0O}dIXhY@F zLD4>Ab?9;9&Ulhh#m7DW0DmUC3)0v=i~FFsj&p%e#|v4ZSz(GDdG&*hDy=eL{NlQ) zscy#tL30yC1PwIbgSt=fq7)C&YoMvY>9)`1cf*g#YUAx+ftcuHSQag*GdX)YqbX<= zDi#ZuBpNI|Wf%fS$Ro@ng>clN-Lj7DMb(lcUyc7;tLTeDs&-Zk~X zOq1etRXvcWkC8pd5Fo@uhqtt+le(B*jZ3r)J1y!D;m4jgEB5jpEDf2LB_CHnlCbed)w&uxd>LhGQl@^|aQM|A)v zo4&nx?xUZGJ84Ls(I0@T%ZNfgy4x^YQz}WU+|9VVj$02GH2a%;gsBEjOt`tk`8g^orC7h?FdmD(VE?;Mo!vEf?75eztEhy&fM^dQn!ci&~}Jvalg zshC#`J*s;8_4-R?g9;6Z$DMa z-2?^bRP9p*qb<;GLaPPS*9ErK^Ib68CEoYC&kRNTs9WtkHKh zxNbMtWo0)Jx$|>cC@Yh#+KW|qydfbZ>{orjaU?$ipF zcq#dD)%jQfPS{^$aiFAq_<}cm#Pn+u&eX0Ii7Te<$bw@aADB2$qk0&6F7CsR|EnkS z0LgOUl|n(V&F)Vcm8O1{lds$#GF1BRM5XT0cz{;(oP`+h^vEegs5)qu zcKt)&1xcb#+9~vG9{bKd?C4B9e2vt3C{GM)g`lO<5dg35QIE*`o$*b*)60FFXtlI( zdCEyP4h~8`q=Q{bbo(s?j9w}TuEfSbLik`Sx4}5`iGtS{l_abi+02XDWtVe|sw4l2 zA>;YETf43@u>+fp1x&&3{%qa`u6gX$XV<`F}M=HaP*~i2`u+49y&QXjl9zi8|PAees)p2#Kxd-CecUykUX{1-@)ZN zxnk$G7abdm&A7PS);sOMrY)VW{$8TCfNw1=A=(W`h4lDgN+(jRtmuN?fOh_wUb&8K z+%i(;UU;o@D^>t}dVS>{w7_%u`P78?7tvvX!SebLy_Q#{5C$gT4c`L`dZ5MHUVMSz z0&pg%l5vq+2$o!YHn~5( z{z}fN1pJf5`_nIStHwJWZ7xN3L%C6-ECo{4PvN8cGae~j1Q$Cu-XrrgX*K){(^4aI83NX4I8*P9@e^pJJ980`0ebrA8asZzkL zFR9v=`tu5IDM%)6Fa5NNw+FNtEmUHk?)Kv8pI*P$k6Ze!k}KwhEd%Wx&kw)M+ez4k z_5!((e{uvc2K|UW3d@HWDmdws&M+<;tlD<&Omy@zhS5#8hy$B5J52 zTN{hf$n>hUxDGbvI!0Yj9bfT%l1bw4rWSuG(%#jbtxX#@kYE<%%zh&ItIqm|#l7a! zL}P#(dlr!S##9?uO?MAKsGqKiRfBTtiKwS=ZWI6rSjfy zrt#PxG=$K=9gnH?&)C*(FD9Ic*?wV51NKGu6vXcPb1^z3+0N1ByYWXc zP6u$yThc*t;-W3XRMwwsdESoOUvnS{`yF@%dBVL5-l)!8ZBlI#qMX5=%G5j`xz$e^ zRX8eAP?x)YSiTZsBjx%>Uaj@$PWI0F(!-9U-<$Aeq}_+Z4|?zJ-hOfwQK^sy}COh`Dre6N0@fMufy9@hA z8zz7E{n?MrYUnRlHot!|!K>X|Ni&Q0sRR&Q^Q-#E)VYC=R^@gyCKBo z8CrcT-^O-Jz-*9re0YiuWCRt?uBAdQt5xwi=1+cF z{Q!`)$yy-$rR|S|Od+C2W(S2D$P%o-Y26}EGMylgyx~SCY7Eu=`iKO1%7rIC<~xn; zO9XTtQ0LH+>Oua%Q+b3I`jIJ2iXxiBd~W6b|8P z>S*g#DsfEbi0|VGgeTo}6ZrJgsB|LG0$l`H(4(p8AfN5N5F1rJ{j~a|GYxXp{*-iR zLjDs1v>+U^mPr2}P3IlY=KH?=NNp-DRg_Y-_pCjuHnnQi2vt-`t=bZ*MeV(nwnnQ) z>`m-lyMiFLs=X5to_xN)*Yi*Q&;7dZ^E$8NJdXES|Bm*_kde;f11DoEl!877WT~+8 zl4ViqVD|F;msU5*`9~o!GWYe)Nwv%HUn_3@p5&K=NuP6o1n{3-tN|hRPXTLB#zjg1 z*VBhxM8t>JheB6teK>@X1rbv} zF@1+PY&Iu+J{lN21htL_DrH3%mXWg{0_0J)@CB6(aR%pv)H2*He%}Rds zxk7y~?=Mf*_=AXZl@}G|6j_J28Y7T9!O!pMTVAm^MAa!-HZg!MLZSu7E?;2fNY;Nr zN8`6F8Qr&bYjMa1OU`1eWF_M%O))wBrLhX7HK;xFU(`$M>vtxAi=&g;V?QX7TNn?e z9rKOZ2N@<6nw1Gt-Q zH~7@~FImR)X~Xx6fs7u(l_wuio9E>;0!8iyDd=S^0c?M|_jEV@lRJoD_1;jE{mr;p zxHi}~(3lcy1jYS;2ugmpIp;`eCn)#qbl3nG9*I7gJuKg{HLVK3*Wp)gfx8Z_Mz?PA zl`wHDR0d#VR)_RCP2>&c%vJwN4t0R^CR!-gWcgR>@*>Zxuk0gJZFZ!n?eP!VObKIs zt$%tGk0|)my@_IF@?`}A>ZnH-xL&foYgufc_ygXa(w(c8Y`%;y+{3~fs{K@95azJU zejijq(T>CK9Az>gU z1iyM1atTI^6V7tn6ivU501iFU;^y=Xxz`c9j`#y-@g z)_`p?fR!RV@yC$)F5SGw@f#)!&@r=Pk&kmbW5nJl`EvVnK8K0)A3HLofa^`37bBj1 zr4cUeudSYPJRqSDjnmW9DukG&531*

`RU}9+h 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⁡YR8c$XzEp_RFCCwfA;eglNVv!dJ>;1 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 CGjLevIOjm3QcSgq={Ns`z!rdm7k z^Tb`YpLtI$r!pFbW!*5-B+-L5Y?9WX}M3;^cM=JHop zMI6ts)d#&?2rw)<`hNOx%v@{R^rB<=M;;vH9Q?H~H_|tdtv=w|u)29!XLd`wcJ_cM zv8h!}0>D5{?!-ytWOIX~x+0BsDHV(wCM^V6MQUs&?nT;hZ<)d(*e*NWeFby1=+|Fn zL-U*bK2_+O9{%;P(M<@Zsx)fi-Pzh9x>ewkA3Vh;IC^ai9x5=@w;9~YERXuL2VFom zdo%|HBwuNxI(@^6e_Dvk{JB$eg3Taax_Akc-cNPpgna$Wk5rUqjB0N=4V&G&&Gr3creP?*|YvexenqTtxvNG@eMY5TA| z;LP_z4IaiSq+?2%c4Le?9T2z z`vS#$L;vc0d8td;&L959?d8NqKf}PjxujY77u;pY*s|j@ciPYPFNNKd!d_}89*lo` z9U76S^r@8+f1VEX6s0msEmIS&BctQOAeHnNt}3{~rKCCD7$h%W#_Gl34<2M4)B~fI zS4P*VaJmQR7f&IVLdV!$L@EJ6N}u=x^nhla>4{nyrf#ShW(Ab+PqpUwifI&9dfW+45~4ifGr&6Pj% z7}tmF%b2WtK>%9+tZ#<#(Z>R$m)qW){deHM9ug6(Zk6m&Fzc>PAD9Qo5b?x`pA(aXINN)OjHnm5-icHs6)hGR* zJ06%Wk2HD#>W~sG)gTudghV&Cdg8m7@pPif+_Pl`T=FPaACJEIoqXJM0_=JaMV8Ak zN!h|!PQE`t89ef-gN!Mn+}tmgaOCc~_a$(hZ(0btO5yq1J^6Re)zjjMhg7^m@Fgh$ zRYKM(cB8xc$WAgZsqB{q0?+Vwc6eZ6A6@FzRedvzbAwsvOrzjt4S|tfz?>I*I_x18`cDAzMJE_(3W=1FQ7$wp8Ybrlx;N}$cY+5XCf~WZ%M3utHrlUaSwW=cTDm9_<7e6nCZ)I z)=I$JM06c_gte1ke4I{ZBiXu^$h7X_jkp))X1%?YG;R8vHKASpS4-Gj>_H?3ui{b~vFwhC@Bj8+1+^_Ll(pyoYpCNbZ4kvx zpxwJ*a_TT8nf64XPj&Zu^w}ps$TKS2OPQ+3dytH(z(UnN>%-=K!T;Fdd)|!-WjwAv zZWq@dx12yFYHW8kThiwV{5|`eZ6P1)MUr4#*@9o9Ukf{vS)SkD5~FIq0h+mlm@Xd} z{Lsq9;#M0&EFZ!bYEKK3EHILrZL1H`0+s1eiatQuUZq?I1^9{0t_D6&abua6xmY{+ zq&gP$k~LSe8d4hDWwY;wq}b()|1`N%(dJ}fP{;mc)*wL%|lL9ZFaniZ$$9=?q zVpDs-DPw^Z(S3Wy!8XGU%DqHa8^?ym*fGB30#jK2gYrnsW|tZM6vD#?j!SWIcH5V& zTvN=HUw!R(@IQU6XFVb73+~CJZ$b&wg~4G)>X+Omdc}J82=_*lBvJs?&b%t)eNl>D zlMGTqADlEn@Ep$#w8=(P!xiFqQP`ZwhWGZBZm2m_h3bpm*OA^UqPA6Ay38GnoRbJC zc&DdUL1J*cRPD>fkGSZFSgAGr$kzoxP9GT%$v6@VT!Ss_cJ7%(0XL4eo&hccIK_@`Dk#d$Hl1xf1Qj-h7BuW_AQ#5Q( zQ?x%{M#!DV{$q615?5Z>OjzId6twX<*IOGK{KnIbrz zCM{yA7$Wy9+h4Q%WM^YWR7BbKpB*y{)O&`{K0z|dRI;0KdC=cRwszLKUcQMRl6(u? zDiQVjw4AN_IYTxM$$a0~h;MEj$_B^HF`7^S?L-OTMtJIqb}a!;CDj?^~8#E${~}^yNy2UZdD4 zibEz}W68450#oMj&uM>u6t7EBZ$j0Hm0K|)XcCXPI@J3H9~lm`RO7@+*!FQ0m2HND zb96^rh)U=pYwt9^%upZb86F!Wz~^6SXMGMj+27L}Yc?54_dGr-nS%d268$unv>}}w zv*xt*AA#|&OMB4HER|R0!1Lo!X4&OhJCJNE}HDhl@`RobOp*m=KJ?ubXi5l8eQ;)Fz$(s01roVG*HJ2ZIYD&3?^m*z} zgu7G?tP(Fz$4&Z7=iF=wdhD6kSDsCHE6*6iq^N^8%?Y^B~4X=>dB)7rCKN-@{l)g?qM>n9k)rUU$ z{S4~L2jcw(bb)_Vu4H5(1vL{GKf&;u18C=B_pq%?sl4w2kq52iCWx{aI#!XpUiL{g z_?(`2yS559D1Tkse znL$_R;$D}+n>42zl`YPxO`B94>PQ0|=UyWE_Ivlw?`1y(3s!1n`|#$}xOZLntXHOZ z2g(q9-kOrzclV?K5k@aM-zxhk2YLBi`!Ya&92y9pHkbxb5r74B=&;4IG;TdBR#|K_F{Nd z1LXa?X4`4WTR_YjXr!aXq{tUOJiQ1x?E=wx$hF*lO5>QsrXy4Kn{9X$aOk!+`)5s$ z_kR<<W!LY7spW(7?{>ywPbtwt4Pro54BL za_kji{%lDM1Bn^-?%#~*cKU^$PT!Xv{heoD4fYqxt%xWXbDr?G2E1Z1tCm`zSkSgr z4sb!Q#6@oHL{cknM(hUx7kr^nHUnC?4AmUAP(-iGpvT~U;-zw%6@kC+3RgosZmSl^ z7#Hv*Z5%dxhCXO2#nlDV1_S;J9lLX|dhZ4)b$Dg!xEQAg@{VQV+L*8+>KPc#8t2SnEgsHm23#{ddv$&^LWd=0ebo+!)NxZ)Gfq(Hx3eP%v>~Ovtl6Z z0c5DjE2WZ!#^)ylyDjn8SBVe*An)0Fzxw|Zl<5Bz)Y}L5*s}*&>Fh$g?gcWL5xo*r zN&o|j!{@pod{nox1Z zzU1b39<*}C`167eO{8aZryyjCB0g?;dbk+n#-X|%!yK1oew)!g8GFMC(OjP5;=Rog>sStVE#nd5Jem~ zZP93r0;fl*=+xtG;j=Qe=eheAh5Q5A%Q@#K_lx|KBuPP~No3oP3Y7iRrc2LL8T_00 zRu45pv)Rl8#KcFTZy1rC7LH4FFBBAZiO<0^m>96%dTqiA7IoR8!i2wnyi{v8t8rY# z#8;~@Nv#=1k{N}_iGsN`g9jJ3*$%u|;~GBdbqVXM(M)AJ!~s-^U4Msg0I7QQ1nr`3 z1|+j3zpW~(kue!9G}RHrcoh|Ho2-P_g|49Ce>vaDL^@^1>7Q8S>}BwL zJQBF!2@0G)$wKPDs*{gb^e9=(E{vnDfvRd5%%Ida9#RC5ozy8W@3@7L(O*^1VpkU2 zEcj)wkeCL5Y!FQrWd$BRKX`h$-K%lqVDo?YxPu z9=SZ}60|efv}T80U>HEA5d{vcMjOtWZqnZ(t9lQ$&RsTlCJ}OPl{hAnE+d{EHz!6B zRr~7%VxF&Za_Ii(e-PJoiPvS3pPC8?`srdsd`P|up7}TQ0U4jasaiE5B~*S{Eqh8a zu9iE&{MvJ|+xM_&YVTw|h@bYBHk#J#`DDhb^xjRGymW}~O$M`qSCC%=MJ}K8Mrw3> zo>-$}khWZQvS8p1jIOKxOxF?c0-74=b^QR0zkBD=47AR}G^PP0IL$peo&5aMnRU73&cXV)y-n^4>_<17v*eg>^LGN?o!N>9$`I|c)#P>pMVTx`+%=Pwt}vTib{)vO|bBRZ%YwOxa`G!j?6u z29|g(^*PuBFaH~w|*wCpj@yots_92`;{&eI%*$c!1+jQdFR>!kA+ z;k4K9Tce}P_)_JI_*P>JGOT-e)ee2{TG${yRR3N?4~(fn@Q*@rKV5ShdQ5GrC@&6B zOLJi+QM@(+^mjU5j_r3RZU-3R6 zf>i{?yFZ#bqlzG5VKMrCyVJ2V@w@T8$_KC5yS6%-YR32J-Oii-rrrB@qJUpBuuRhf zy~@HzSMtNOc%b5@M{avOYZ0fxt43|NJwihw+F)s0`5MRY)~ez%AHBIfiE7Rr#~$^I zV?dgFF(Lq6Fd8ez>Y!ySM_hANsJ?B@pML5tTpK$gZLr#OY-yO-73*pJ>Ti|EaopIM z0toRH5SIVUOGgirbTxi23Jh}Zf#>XE1gx{UK1#gy>woOt(DUCy(qX;RT`h}9FT`D} z95c%7uspgvQZ?~<$-`SgT}7meIs)2$%ry_-;L#GVphLIHl1ZeF?>e)jPQ%31c7t<4 z44xk!#1|3n%X^2;wo-5R&aKzCyA9eHYt*?ZuO+Cg)P+Qhu9gK&Ov%v!XTaRu(78t& zoUGYUpZVFrgea!pfImvM0) zzxg0*d)f}IU8kCQuYs+g6yfLDRdC56w1K&p=aJcePtG7&L@Cr=lVK%C>|K-Pw4)Q? zexQXRpre+)d7rJ1ti^A|P_YX3KeD(#mzTlT0ni8gaQ3)eiC8spFCcm%rm&;B40Xn8DMKd27AVR z_PZ)s-d_-jcYmnVJi5szMbR%*xT8>DpWlSV^I3-Y7)C*p<#Cr_VcLhDO;h*hGFecv zGKmE&$Ph7SmpgR8C|2amY3V9B_?-4D((s0PQqcdV;CfwRcZqG(TCG5cBE;%lx3qU`2TbYqp0eKaf`BsPj7W{Sz|wM**EDuoK(u-Jt}GSn-DZL^bT!^5Gof* zyXJi1U}S(%+jKB9q7-G13kFs-^s}I9dsMiEV}N}OK!2{N`Rsp(K>v?^&j0eRek@fn zS4UgZH6am$)&8w~q1;W%&b52VIwGjq+i;#&)1yh%x@Ti=+OYUjHy-bkuUfj2AF&1T+#he8y$WcvKfTMR!noE*^WJx=_Zc5H zevY_63v@?R`}W?XPkcue`M!9y9{s#17n>^KI8Ysb|H@Iqqaa^ zL&TfL^~%<#CT%jy=3^<-5I^6+`qK3%ZQV9FC4Ze>p7Yo#pc~CLXgJ_@C3Cvoj8Z1g zOps3R$OsR-Y#}!NA9GE7>XTNE%kW&ew+$UhQ7T3QFMWp|Z(Q2o$DAmgQ`8TJrsFmd z3=y+Mij>f2#Fk1)5KPN~1%*l}!{j;po34^68QI13D_+0Hr7hoRO4&8{FUt=QaND79 zf|td*r5dBQ8Ti*3O_uoekrCP$0v)NMC-&~}jt)v-uRu8>r&cQXBSKA2G@TiSd!{7C zy2jrMc-j;nU>Tg_a5C3$x$Zo$C{Va4Lo$LV^6Rq3x(mA1$L0ooT?_d$E%eJ6^ry- zjWe%(k#7JzCZ#S9Jd_^?P_-*8G%gNg7i;-%_Ra?p+xQqnesZ%P< zU@nAcj4Yth?_3{HEK}MgA0qJiJZc}P)C*yy(e)U)5T$^!Rs`EP=UPymW6n2(?4cat zjsd2lCk{|1QPt%4;4)c6$!M7=eW3Jn3Nw2(n?!a}nE9<7&{UzW?E;+XXHqKg;!5%5 z%Y&=4G#6CXE}dR=3HBZGmLYx6=9o@ zsMHg`b!HKBgY+^7ap)EFyGt;1E|K5&L@&;{*&IX>W_ZLIzW`=0W-2kfuopRF+$#K~k4P+*-G$8FIC?o36T0T)krZrLO#{ z=Kmph>;m_E&=Is)4Zyl!-$~?NavIUKq(KqCKa1Hg#`^uSj=E;Krl22C!>{xcAQM6- z;3ZU1e?$CG6BTwnTkcvsE(tu*_p9&s$=7Nzj)yKUB_7``NLx2j^R>&i#C{x0Z;d7@ znmL7sUt2g~Bqey+l^FyzR#FxD>88h;V~j&9zE4ZWR6g8gu!{`7gz?k&21U|!%N*Rj zm1}L;DG0kz>T6K|wf5v(T`oAS)(`?#<4u=3uv!oOAD6}kY< z?~x0Z{&bn0``s}$_xa!t_i?rcnM}V{k5_w6KO^?lEi$QZ3GBTP9XJ=N3VVySfwau% zGDyf!P#Y+`p?E{CH=T{uiFVClEeiBF60;-Uyf;^X{3*zG8}tglOp@b;!RYFRs(TAY9Gv(e3rI-ynzQcw-0+?CPsGfy-kwbB;?c+P?5GXE);gU;KOjCEeG zQHIt)5jvT+=k;oteZlD}sz!gLJoupZ?~OekoF>c5vyPvgJ)c52=!Xv>|90!?q)7J{ zr3p(8YnID5mAA1cIm}~6YtG2OvitvLPasEG%J@n)z)wQ;@?QnX688oD_T_x?xuTG? zO{LEF@yvo~4`k&qqg}$u$c2vPxsm3>U!`T-4I9mpPG8R@RQ~b7)Gva@5SN!6j;Pf7 zwr}a(uP!$CFR?9|sOmV@irF4Cj--6E0_1-N#Td+`UDEz0`sNOUSj`R1Vrd00;ozY5lWGHID%`N4h8uSThSz~3wVRm5eA)uFbB%VevH){%QEng@ zyTIkijeKbLLTB^Wt(o$b2Jb!yeM~N;T9~2sFP+>U+ot2@*Y}Gi6qsWd`=!yR^LqzF z#MHf$i1RJ96&-OPrP6nawEu1h16f*HXoC3#VoRCY6V;fL1|!xtyUjIzM#?;~M3s$l zt}{i<2+A;^8My3HWOj^Z)eDVj3Q2Ir`s3?C1P`C&L&^e?6-IFpB$puh0~;mzBf`b@ zt+~~>L;IN?K9zg`qH)XGpT=y$imUNdg}1w4Or@n{FhgiZiW)p`!B+6Ag`H+68dkZGRUZ6I^NF$Pf4 zJ>z4_EwHu>Vbo$paUr0f$fRU1*}GxMC}~PjA(+7>Vz7BRZkaldGBZuRb)E@bq?8(G zC#Poml_nGoZOz|69mlJ9h6V+d;R2Mrx#ePlWo+gr1>&qX=w;wfLygF7G7-W?Hc8V* zjN7P};co55ucu?Q<)6G-7c>D@`Ry5l$&bi1=K`ETwG_~OT66fay*~ss&+eb52T%#2 z;w)PGZv?pCKU{}ZnT%8=Pv8U6fv@8KT*x+4uz%Uh)Qh3vW~QmyR-=@C`1HoHu;P z>4E1kv)<*gJEJ{Aq-!&@fN^|;_GQ==$3ZgQ{8#9DWdb)s;qX7b?#IK^0{!lObt^FW zT?9@W!WdVhy)U8P!-l+;qMGvFs@LhgMpWNvOA_D$SBT}cQ1b*0&_BU!C1 z@F$qf$8qv-+H+QNeP!6ZW@+(*=z<;Dpv67(W4JMx663e|sVHP%?b7aQKY4iE2`leg z8eUeJ)GoV2=c2R5AMHi3;2Db7z0Ne}cQG&<;aHMsFhNlA4lqCZ<%->(Zu6!)k6 zqT!$0j87Cw5`W5G@awj@>4BFXJ&+s{T(OA@sHT)w6*=|P2X3MD%Qrnn`2& zMPBS+rHM$0?Y(pzduu4_Ho%ynE5PuL$PbG?QK0bRf@Dl&DC7*c`$(l>zr*3#d#wQ4ebgLMqOlG9GJ zcziHbW9f_P|Ggjd4=?crw_h4M*K`=fPZqF7q!rPx&997qsFN8P7{Ui#wbT51_+vwK zz#KdAOn;B3nOLfU=(YZ*+1b1r1$aIE193D;4aLXj_6P4RLpQ@h{PYBLq>uPVHoB)p~hRFw&*ueqIQDD2)kYSu-uT@===98hl%g-F9WuBT(_&R?_ax`*o( z!cL~ySj;TNP7R>3Pqz5(_*bH%jtM;l=uts!3Y z+yAB=`02oI!tZPq`^M9!ZUXW zYBMVe9dsDxTc|)IeK8y>nSVmFfAU@Zl#VSc7|HjJXcW)68F?-1k&K=UH^0%$dTl#{A-VB3H?MMG`nU;eM%g)AjZ6S$D+|M+eJDT}m zZR=rYma!v@`Qo*L72ZF|@-qUSq8?*elq!NA-|rr@&t?9+tg>!C%vC$bH@&xi>INwO z60O^ysUw>OW{9rT6)QvHaT#msS>(q4W|x8QYb$O@)xL&fa{4*K`@gtsPI%>nVtMH2poJz1zy$b&U08;}sR{pJRh|wK+>oKB`(RUxO_?KR^20(4E@C9wbjZ z4pB-I`N+w8WN_u){gUlIL}c-IR7NGHSMOr z(!TpsPGd?~@5acf1pjIA?}P0A%Gu1&2;X1x=eQ@$iveXj@UJJ>=~Jo?y+_k-Q{aVt za`G;Bu3u`1;;=-}!IQ8E&E$@+%kx#YBWbP?b(g7X;iDp3y|ui?&5waqEP~fqeYMLh zrr)K!H0=+wQC0#;C#FjigDbyGPR~W2^#-Wz`BSgt*edorYuHQRArn*uWS9H|uI(3|s$JPUla#7_THHEiKD6cY zYa`L~tgXuHq|pel(X7IM;eVZ~5x{P$ww^Xe@HE?$+bucU-%Dy`<7~ibuBQz%nsoB` z+P2(ml|sUN7Jp-L`t5fHUtRlWGk~WY8kYb4%>em3R+iMY(XfbCgjc6f)LiFPVb{-g zea$xWYPsO+wu~(Hq0No%9594M)TM@6FRr!$Y$)m=rP7a zZ1uEpjA7Yg5>wo2W=-j)+|dCJ7i=}i`ScnHcEn`8S}G<-$!6;q$FSUX9G{xL6@G2+ z@NVa0KEwszOVA!uwwbV4S0LzIux z%Hwas?Sy;$VmDKUy~kYHvaT|txLj}6G$j;gUQK!aTr>@qr`7N)*!?Ep;qt4%urq(c z=F0E8M%}VhczvjRgaZ7dO!$;8;4Xy*BW7QU96~#@l+zHp(ly5=Mucyu{FU_?RZY=zK5AiV0f1{x6CTxZlPc5q2=S!Q-wFaQ(s~ORI{O6pB|`3;WE0Wn3bgYAQqo>vMmALJFU zya$Wh0^F<}@6-aUHjE6qE|hUhX zb-Fuvo559kr_zVJgeBm=pJJbEVPXS z^q;84nLn@fy8R+cn_-vf%*9bO-NOdb#h$%aQAp0YG$8a$u&l&jwGMH7<4aa6qLj;# zY-b)rdHUpT1O#)qruT{K3Fj@G_>Upp;jFvhpQ&(VZ=srqe4cU&_Wz3NRrRmA`grAZ zmAj5>ssa2nZRv;6IPuFPos-6}4@nUL!l-)vO4z#d5_;a#3&4xu1zij~NZ9q-WUOcT z_D2Rt^8eeZvwY(E*)Ksl@#Sj&t&TKVU5~EV1U#!YMbI8*0{f;2H&q1Yns`Qmv(_&6 zD;Uw1FrjX>v|I-P(X>hXVSRw_iI^E6e)BtWvZ*hr7wYc`u^~HsIZU953OW>#Y>Gn+ z5sI(TEDN4@NcBnr`@I>WGNF#|Y{=zJ#z!q;;jc zeE7#7`J=?CK$2qBSS;#F;t#IZ8Az6tR9VIG7kMG3s(5PZC!3?e@erNv>95IXZ~hHV z0(+?Yz1rvox_?&P3g#NY@K5Qz2?dkQNAE;)9>|`B-Hp0El<;IV_d8C`=UPPv4?-)k zvj4W@D#wxHQBu>{QM8{051bA{DYK@%gN@Rz18BySzWch+@ihmORHD9Ea44?$ET zMCUI&XYN$(>@o$$v*#o_FQjm(&~gi3h`W|(vl=E|9}~bEK6Imk6!WWR(sXC63vgMz7zYONkW0(ti;3BJLzSev|hY={VK43tZ0 z)sTcZY8W#krQy1j($PyJgD~wqY%A$Jnjd0jDInUm7sK*gF5|!}FIm*+HB}tJ##C*_ zN|yBHT~9`?&rU1zN=hVR5<}(3wiS*t!u(AYF9kV;TP&e4^>e^{Zd#iVmcbOMKWl@++7+H;Rrw+JC<1Yk_! zqTLR9A6+Y7UH*y>8V!@D%2s3&xdgAb{EQU14)lnL{;__0d3;W;xLi?0ZjhAK_8^p5 zl)>e<9KUgqlkU9K=u{iqYjA^C37a1bb08?QrpAn90G8ScPe|1KTz;VQyZeJpKd>r- zX^}mJsN}_V(Ad&&Bm68>O#$e+3jVxbx>`x!`mY`E8e!Tw&ti&-wY4=|1_sm5r@1tz zXA#&dz5BE(7gH1p3VP5cD^#9y(;r=|y~(>xEbm(rKg7(m0uxbO53Ec-z?XGy9UZ#S z^n804;sQZ1C)obH!s+AXp$uwvM&hfW$8+^b=!JCxb2>}?TC)cxKd<0%K(VXf zRXHg1ANfNd?`QeHpy@Q3J02%w?qn9JwmE}C;y%nlW;m>Kl4SM>s~opJF$tkW>!jTe zxXB3_`R~myUB`qGcZD+P?X~{RLfwF4dHg!5dibm{O1W>iKcFqXnn#taju7-|o2q&M zQ1r3wYW(;N@vGSkpEY8Kzv%Bce`t@Xtmk%S!;`e*oTceh`|3zh>LIC4W!>s`=Vg!X zg&!8gGJs&X=7yy9ugh$oma+AhM+X6b^TYdwdjDPSR}#WHE#Iyg-U2QzSwPPZW*{TO z^iEo&GfxkU(_PvH`z0Mw^&Gd^_}1AYFWxPO1_?aXoJ`a(x+xRPVcfzECg%y8{aMT^ zGeh+Tz}_59H|uUMWb|^+6qi|W8i9`$Khwm32%%%vO(zByLOAZLM$WW0kINw5LZ=D$ zS*QX3!f^Z|T))8lK#v+{|8)7tKM@S~<*;HdjlYf>qmh~EXTKnt;;jI7dNxz%U z=?g-w#jY>>xY|;oOM$)Z!ZoT_fw6WKP$6C8L0iFtmVyV`7sxkSxts?Q<{e5c*dCvM z8m33Cjx;U3HHamJ*_d>&t(eFcp`|nlS%f1;{N!uNC7K26$X-PATOt0)|0~-5^oqq9 z&2ZetMl&=OlaAtDi97N2agI1Y-Y}Z^AU4FdCte=F_@2z?N;Y`2j+B!`mK8|YcsRP0 z^l!xXoW2ZP-{#Me^Mkd7;>#^wH|i|5MI6-*$?ZingdWXdEOKqGfZ4#T;5NeP#%XDR zUw&!C7`|-(UFo!{4jgl~agUZ3J&crD4#}NpT^{)@^8U0eS7_7oPdh)lwL0{ENb`R3 zLD9jBY7;S$%L{w(FR%&1EXw3Yu?S&rLcEeawmnw!!6%!F&PqCH|C|0J{Y%#4RU94c z1rQr+<3V?`^yB9u<*?iE^|KADeG%;XHs;{!ZBgh>=>7drn>XjWH!Ak{+aP*`v6l|B zNaDYZ4SvxWp&ZBn9=x7?tWe!U3NLl-rA$dT{v$Tb%ul}EtUR93_yCboS>sPD7^Kuh zy9XiaLm$IS&^$=hWY}Y}KZJTSK-Fu-5B2s^8i^F_Cx62KQgg{KL}ST9Tx*KXUgV3$ zoZv1NQ}!9l5>OKSM2%qJFeaU$ddVaLCJzz+r<1wYl{`NsI&|aDfhsB9Rw1iFXRIKwjbW86{tw2>q2HRzKy^gdI(p4%=3MaPFWuRY!;rrvH zM%j;$_$f*JUUftS#UU?GCoQQ@+1c7&3v%irnTXvFEsHy<3~FThMDGM8$k zPCECV^rgFRrmEUx|DZo~*CdW$q~C%MD%StA;5@T#{<)6j*}6yfS52L(gq58*HUwNf7Db`Tvu_cjIZ z&8!~*a0%BQq);J^U1DBM7pFI-GO4|p(rFH?x{|e6S_ymA%AC_^mi-}x zJH!f?H+;ORxY!F<6HbemOwP%6ST()_inZe$-)1DW%sBrmns>09*~GUE9h6X>vz-4p z$%=~;8Puomr*yLuvxrr3HobYXieyl=X!l(AHHRx*UFd}|d*UWK&ScTWi}LqDUhh=G zjoupzB)`6R;;n2bos{@fv?~h<9y3fDBLxGCpEC@HH{XY z7I(|;{Le~%-?%%S^TKq;f+pwKVY!7WIE0RvH=@GjcvJ7VY`+Vv`~{cd%m8m)rfnU- zs-cGfM8O1$>CeYsQBHrkgPq%!3nda+v1`{|tL49J zeC;30`@l^&@)hTfqX^6slaW0~>)eN9VC|NSWYj)k6}+I_MmYbM*+UbvE3hO$YLVY^ z@Y=VPo9vR?nQwX(R@ye}T%dVt`W{bI9?qm7bwG$j`pVxhmAy$TGFNGI9MOQQobS1b z8uj@E{JdmWb-AzllmIUQ*<`n$?ZC-lE!PCwE=e;(pj4*{LuWH~u1#gsPPUMP##fYt>$HxU*c#*ZLbOU>?W zt68TvMK3~6Q;$r@j8mL}R|s%T@Z6~{27z!Ac;lrIa&_)fT3d*)D;yR|vdc#fp$GJ4 zXJKTMD8cx86iLc9NPh~%6Nx>G?eB$LKk^Hb3t;=9lP3HJd!GeW1}P&M6_&G&WPVXB z((yVUAQC(Bc_O*}621POK7JPXLfBIgz^}&#EMv`n!N}`qHcDoZ@wyIDl@uPo@l zoAUvSlD{Oq0WxyqjW^Na2~ho{0ea$TcU_QX4PDH%E;Oa1TDSYmM)n|+I@0%qTbOi1 zHMsyO6{ARHRr4faEfG$H8FkBHCg+j-TlLQFFb%w_IE@=aqc5u`(~u<7c@EHv>1rSH zz+*2IG&<@114VoUSESBtM8Mkd#ztOv&OB69t#g_M$=K1+wEHq>)f@C2v$gvD*F3r8 zK)HJQdqAG(W$03c5uf^iz}*0w3`Tl>3PVckf=|GZnY<&vK=r$oo4$W-(r{nm?O>zge|s-o_ldX$tVwdr?`3K$l%~ zS4j^vn+rU&Sg6E==%<%dEfjaz=a=Tf@G7+BCLOhIPpMGXd&Dg@H7vWdto9W zqU8p=7qrwwD|khldaK%W%MXL@v(~k}E~hUpDzQ5v{*RA)W^dlUJUn6XkA|S4hMqr)dEf|JJph#l9~`S$mD} z#g{e%ts39<4z3KK3$=?DIrx>yp zui!Gg)>cDU$RliT1dYc2Rb5}W>9ss(e?8hSy$9O1GJX^CHVfIB6GUx(&qmgY;JN(% za3NR_}G|Y5>_xGMg{U-v))N_Cr6KXvP`8C zTOd4hpZ0%qVY@s2oXz*3-C0oO-XqG4F2{Pjh|YS4mb;I{33Y>zv zNWpx)DVUYBHMTe15FhN7yJ_ai|DCyf24CxD_BnppixP9EbeSZ=U~i$#=K$*KXcgga zAqE<2XUC{``oQ}`b6qhg^-GandF-uR$ZMqJ5*fK z+qvgf%>_#7fG~3VDLeIOt2bOes?q`uDunfxwte8*W^oQEmr8({QgRjODLN3;|v)<_o zF#dSEvOgQ?|{ngc1TBgq`hdd$kSvHsx7s=sw4ZsccZFOzV zDy&F3%MbHkAJz(N#Hiz+m=}~*Cf$KIp6e^g4>Y`V&8S>(CElp?f1^3@*IV^TYp@X)!&tnts3or{#q`aO5OxUdP%>vK2_AqX%M^ zy*2MWoSAl*igspJQHGvb4WU+#S4`1{&YFa0uw^{OB{11t%5V%?pnTPJCn1!!<)M31 z-?ynT)rOK;$%P1fZQ#oMH2}#k2(gIpbod|Pt&$9ZlSWh!r;XHCgwlJLqBI^J18zlu zIV&|M3HK@^+CtCI+K15OcGY;LujnJv&Lmh>C(B5zNAE0D8DBsqQil3fcYUZ?I-%hN zEE@SpshTt8FXmc%Qemo&Vh~Z`M+{4B{#)w-!@10JhueQ*G~e(a{OQt@N90Q^i2%0{ z>7unajpm+Q>)PXFt(B-cGMQ?er;)OaXYq1}K)-9OsEw?4;8`E7;W|J?y>}N7w!O|p zJ7-12aO_fdYWsm5pBy77bX~yhN1)BQ@K~K}k9my00)p7PV}i8y15Q6XfZLIF|gfBkFYP5&KDgD~5d`CX}ZRCK#q z@-D7EwKV||q9hYI_9!^lt#|Q9RS5#^8f^Xe*>@}|@%&+#zs3s~?VNP^PWH2j^8mQQ1DxoB3(sY)T6ou~ve5hr6lm!r8qT z=G;8F!*q`o?L|#l6_eAE2j}_>7dHLE6r%6*vgE=oSZy+RyC3r3vWQv7-~K1>_xayFx@^%`mPle0BRuN&4s6w+iLdoNAI}0=r*MTRim3E*A-us?t(c*$6 z(d55uqR zSR7@o1>{#|pM1GM>k;1OU~hqOQQUFBvbw=m z4(;8#tKh^xl=_M*3%&mYX8mRj!rX3q8|-MbFSf)6%KKc!2cu(|uuXOJmX?|Y)h7XLFJsYlXN6rgeiZCb82KfZkR*lXv+{E*dEL`MZ)5v76< znkCu`TFr-aTza&C_CZ-rWA0c`+T>6 z{D?qzzOUmvPj1%6qEu4T_HQ=?x@~TbqJlJSs!8J7S-AEP2{0~^8nsR9UD3#bz^Gr zofMJJ7p=3n&~ok{NDxtbD3kxPANO!UGPT-bgG(s|%I=M7tSp6Iv_y}H-;a3FuJ1}5JhfzydZq(e$$iI+ zGEe-k@t@wqnslt;-5pkbs1SXM=$B_(gGw{nT-~v6!Q(Z5tgU0WBJwXLmt^i4E}RH9 zkg}BE_vbqof4|&WD~~%hM7ohWAYG{!-{3nrTz0mHI#_aBDZ^-q4ePPSMjnKFSgb3I z=6};bn0Cf5EL=<(QS&nn+a<44{%aNe*aDU{{vv z$mJ1Jl^_I5k9`qyW14K8?|o@mHfM(T$riwmtmMuj_*b9vZ!xbP`p0jQQbuU-v8zLv zYnRTqf~&;_&Ox{gaqR0T`TT$N`ETzY=%3nY$%+1Xmn;ArKbD9uIjsfPJ6rj;sC~nB zy`PVgAKtY^hdvN4f~Zg1BOTD;;!T`h&(A{F^pFj&-cd=zoD!EgN8MC_AG{|4L$14H*`{qVePbVQ|s^8c2 zCz^G2W@xmc0Jl)!DQmXZk4@&cyc&=e{-W)leFNvHmM&jr#^lh=#EyS>RUg_E2`R5K+@yE$wq+|DK=kHrCI=I)-TM3H(eO zcz)YNjwUy8!D;V^wxR%2T9^ybt2HtQ5Mksa5AJem3k-O8kGY%X*xZO_)rd6voGbA+ z$gg3@W_4gD`*WD#w<}*?e|>E*RGREDeDq! zR4n}UTBA69WeE3ux0%?f;L{mUUJ&Sx|DK}JWi$bFw9F8+KD)??YB`XV+jdA#nJ<}E zj$X&p{T?9rPWfHWJ%V7Ro|7shC6nf=pEE+X#qoxXZA8>OQy6ylV8?FvJ!VQA#8|r}O0v zH?cPxaqq!FsdHZW?X*qA(zJ;_8@=D#{vMeg&Fr?U+Iq!A4bja#g1!emaShYK?4^fj zt|&e~qFO8jpWE2Ja=4QT>HPv6*j!v|S?AiV&^ii9B>_H1=tE!E8k*JCz)6|35YR?< z*v3NZjSS8{Buy#15RgCI+E{Rcwrb4ZTipn)#B?-G5Z=0o1o=WWSKww-1wp2gS{3iO z9%)f3mNu7CX}_YaN-w%eq~iVQ>Vz_a7k-~Baykj+?2!$+s`(o8d-cdeKS=`n`hE>@ z-ts{2^y8={zK|hJ*tse3Rp_(JA_PC!GJ_tvj}6tNs2Oe#8%5j~&FnDJ@j^r0Jv2ns zrTha;y&JIz6;)HA^5riZ(#)7~?ToCsGQFkzCs=!{p-?jahr$$)y#Ifi(QHy_ymXL{z5PsD? zt}4!>f$)PCD)g*QYokt5cfH|jOe0WqNF1pVaXvIen%?uJ4#^d4?m~L{l^GV{OiIBY z1kC`x8j&kH6f^WQnA$duVz%rN{&LX0c%&;Ffd%h=m-I>S@w17)sxu_ikeYA+6Z7@- z!GPr>H|1R8wx@{tSp{IGskwD1Etoy`IZNE!v)`^=$V%Y8XbylJ0E+Zm()v*u+F=z; ziWWMWiFMiiyEp)sY1nDf$~wMUEt=E|OiU@3cEOK+Kc7-4Q<&p;{?Hlrtk>wVqvjBb z(Z+9)b~oqzQU;mLKMnh#;O1?{M0$wdlP6z>iM`$|7Ivk3$qfh#Wih`j60 zo9oKVT_9bBByGa+yD6gMwn*wd;;y5dVAS zNgY%nBp1Ay-u8gSn$bPU6TSa|GKlY?&lR74PH)_i(uRnk{99w@nh<#$UN)! zf+2^TgaEkt2->7I-3LQyD=+k~4iX7~|HkJUIsS`zS-r&2QfuQ)>GR{Z;=C^fpjSZJ zI-O^RrBePhHtCjGro8I7GZMi|Sr~kdpWWhG{e@3d?0Sy>jDaV-dMyRz=?XS&gI=MpuuSP zUj%G zZ7)PB*u5&T(k%ViMCC&o8*fGLvNHgF^3_7MV6jOdkY;?}XT$k(bAAm9+-ssIb_XUa zR$O$t#=DtzJi2nEbJXguZVfH9sW)8su_$rnw0?T}gApjnmxJ*A_<<(z2HkJiaAwtpXE1Z+H!LU-^h8wm-l6Eg-03vV~j7>k;hBM{=J<1rPyr_kLMOl$WHlNAG;KPB%;7@oUQ ztgowzoZy`t&U?syJOt^H6B}aa;K)-8=X-z0gBX@4Y)gJ{I=wHuiIoBx5b6C8PrE8D z##`aSw|cxHMg%MwruOIpJ4BoSyU@$$#sl;nj!ojgwE{`!|2lSJmyaK8 z>T}bK0ce&vAgOy9Ri`=ozckH4b{Jhi;tnk%-*n7ea``2E*zLn0=K2yXFXg>HW<%|F zZTVK3pr_1yid*%=sdsGZGz+ArB&!+!EuLWblnPiH*L`r-*lk~**PZ__OKWVxW|I$%D{nKr>Ich?A`GB0#RwolP= zWll5{sd;faX({vPyChOn(f)$y)b0?jqq)&)L0mj{3q$anp~1vXUa*@cZ~coW4?)M8 zv1>D+?)Ds%7i+p7W7T$LtWmgwEuJ_=Uy?Felm20ijC486MWOg+ADW9>B2-!y9pH^#;W z3+lQELw`+4kF2z*XrR`iFK6fAXL;u<0};l2QHj>N?4Pzx zXjk$vCwkFnvce%?kBmO2DSTKDy{Zki`rP(Uy-jh+;lza2DR^!aDIZ0=8?y%OowX=qf3ZN0j$Llo%r*)-crucGH47R! zh2l&*Q-*n$B-aeoTWjjKnXZqyBJ!$d;|GxN(_qg}P{qX4sIyz>1Dz;2TK;u?-)v@t z5;P;FxtCZ(MMqS&2)fS&Hpz~*foiu~pC{RM(+kB=kcNR(*B>@9 zRbC`TT$L>bH+3zzbi;px9$LbH!?9K`W>U(UY}wP!o~>lP%O*%c2o047N|b{FjhuZIPV@UK@(7@tV29&f+4DOMAR>ko0Sc7y|y84XJbSV`^T6T3?f`R>0Ra2(S{3d%>txW3InMsaI z+%{NN2gBL5`#^%SV@@CSViklL)4z7rQ{zl;H;JL@_?pfRz~#`K*W-Vhfhpsn@+{z^ zOx~hY6;#b;iUg14W_#P;XE1blO5kzYyD3Sl(7B0C5;StVN3ZnZ;AVCjTegR6*`_9f z|3P|X;=xdy#ox~34$a?=Q=o&Y{kw>Mqy{+n09wX!{9Ns{>+(V62JISjd~zoq=q#%e zXU89%JE`FT#|Ve85X^vmB^%WEcrtujhAt=H9?T%P#^kz5Ro%f;RX0m8iAu<5@KMQ` zsb=RX9keM7@q3z+WfizSal|{AKs`C=#5j$RABz)JVN*}cOm$qW<8hJWkFpbl!~N7U zw0FciKeeJipNCyCItkF^7n@>+?|kuv`5tW{vi7KPJ~)1mtuXB@AI{uhPZ2DqXZpsHEv8wyP=KNCDT%-Pjr|3D~jvZz%{P` zom|MpoTO%xH?GV~%&_%oE^{{DT$TKQFX{^qpy2+{R7K>yYE8D*!IU%rZV>_Jc*HH& z?0gINu66k6>sp_k_zHWyCynu)`L3I0h_t<8$+C}2l~ty*rcxIoiM}E)TxM)1MeGu} zH+>DoS3g&mPrI~Ct|dcY0@=%JItm%-=#fGsNz6a&H!2XCnyJm2b?5ZnpDx@YRt%Ae zoAI+&z&lgvxgji4k0eZG#-Ns7o(%*?4G?o|I^!# z2oKhlP^TY^#e9tWtZ4Pp*$)iuCto|LSXh(i7#y1gO&K$rt4!3(WQW85Bm7WT_Fd~! z$N^>r$@~`M{CMztj24K>I;W)F9cm^2TFm9tQKn(C2C^D2sMGj6PWz(%F>4KsoYHY~ zbFA{duN6c1sEfnhc3=N_3T)aPDQotKPuF_^;Jq>DX@9;z=dzS8p29X-qnUlWPZMVQ zs=K{_I{Z!SB4ys+w8nY1U=mLRR|Gr7w^o!n`A0UV&M#vzs*y0yIe|n-86^AtZ=?CZ zv##Uc-SCyepasd;Xy%FmNGX+bZ4lMC#mSUYgEJ@%c3&C#{6tXpy#MR44p%hIF^Ie#j&+2t~4%i4K4bU#9t0az#@ z-^TGZOUfU0O5;1r*5tOChJGWz)PP0MV{DSy=TK~Is^Zq-S!$hJLyRVi{10qbHc6S{ zaVBhS5`x;vNOOH0aMVDT4;l>R>wg>6Ka^NU8F!<1(b!;kp{;rPj;zsGryQ?LwO>t`PWbFZ zDPuR8&>hq|M4D`M{;b?o-Fei&2XhHlV(kJgnR3Y|ZkrtW`i4Z(g+O8-xQO^&a1mN? zX&I_JV{0ze;E11+nqY%ygCU1_Z#%tT;mqE*Ea2tXm(CsG_YZzx%`aG}Oh=s%%R#-1}DT%Fl7JxhiY7dALf6ThTk zWM!66$sa4><%6*J*gv|(w&r!vz4V4+ezlui=X4{_)lmj|bprf{Le@rZ$ekhsE6C$+ zIuAu;QMYtHa%umzUvr|=#My>wX!}U4qw6Dv6PEKjaP~b26E4UBHAV@C+B(_0spFaD zEM_~YTzmhZoFlDc)h@f0waSq31r%5Cv3+gL?$(ar6RIfFY=_%5+R&cB-llhy>%7i( z=vuYO=7heD5e#b>%knQlj%X{2iR%kg(-)>pDV{C21@%W3zZqnKsi&6}`H0Pg8f58Kh0D?hIv4dYT!iRr!@ zuGXQUi@~S@eqxb2sVm9{nL9|Sd&GGXWrC8`1m=KgZcLy$$nn%kpt;s5C!CJDx+pqL z9~q%QPfmu89mQts6r38b8=(mWmI92PAXF(nzWR4Npo308p`lI`@yIr*MFyW;9}9*Y zk4)fo*jpXi3@z)blVYL>fF7{^-uI37um6Y_X_pF8euAqXMR=?ahY0DU7TT`FrnRz7 zoZ!e2Hkn8P2=Eu7Z%TdYvi}-;YUl7d!+bW&m&DGebXE$-6FW0SXFP(O^j0`h=a222 z$+{IzpAS2vQ7NROV*IC?Zgz7M+HN3D7hpsR(t$`JQmLYRz8Bsl4j*)l_He6a`i zdW^o3yp~!5Ljnb=t%6>h21oZ_a`t_R+6aC6oSVE#<6YgAB#+T1DyR)JXSRT|P-`d1 zN#THxUkf_yG;7Q0_0Rv+qR_s4QSyUTg`Ktxt=(^|C|d#%xgGG3puQ=_Lr?LngK*o} z`APdq{lc6Hcu&i6)8nH{l7EH!44a(o8_b@V#Z7xl@I}ZmEa}C%=)qHz#8?y(oqPKj zzdC*N@xuJ}QRVfH6pmztHF3k${eCE!lWs|A< zRTiE4+PH^n^7)s~5D0pF`(md5@48}d5(1*zGc?pL_Hm3@=NH^Bx(|0zHtj?HZrQix zg`!g3!`zx{I))l1Dg(p@I>DYU_o&)|{E?pW-d!)2R$aXHUYcbVbFXRtGZ&g+EwgXi zS4FVJ&2BroWTH5=0Votznzj;Z@p{a2f_yt60D7{u>}=UrdMD25 zJb$7(jdt(?7Bb5R1x}ouDDpf*fATkmJ#!GpmJ(0{^zYFbt$_lr7}ET}p}fLytWe~4 zq2ko)yy+V5F8h4F;g8zBw6z=VnorM_(yNVBChpEOt*_Ph)GjOr_ z{NG|-2+|LF!x_KUH(HtH(Ttj%V7^eD6nPeFpR>fKesNpYIyEU%@*vdWSEOyIA^H3E zR3iE=5*8Y`M`6~|;l=h;3=C<%E+ug!9~BjB2!AofMV=EoRXF^Y7 z*NPsqx@i_)`K6a#`1fck0vObMHWR$V46(g9X2>NI9EOz$+Yar&u>`QVd~cbqmh#)jfpYQ=(tWKxeUx>Wr8pb(k6pbJ>}LeS0Ij0y_{b zdjS9jUfaT=iTDU^p*3}g(*vEiX~F6Uqsh;KTCc^zeo=HHlvP|ADmTxV-UAsuhIz!z zXeiXMEV)3PcdQ(yZFeq9o;_9nwe9NoP_~yf_ub<6d7kCIL*K64mupw&WJZs2M^^cM z&BRO?nUcp^^$?*cFy3qFVwuC!OQubkwXclsfYb>T@AnfEJo20G z!!E0!`S0PMCWO8=`|qTX&S7nCdFUTCQVT$?kCKOV`13z+X}jv&%b%O;5%;Ptvc`sugG^^7pbNAZ`NnEj+&q46bya2=Dq(kVPW|MnxbrhEE1Mmf{nrHkp0U60|EfbnU@vaHo!*22VQ zEB5yzm>wP8?_$UT4;EC5;!E z5nZ@f-K_P7`77ouu~zY{I$q_}C}mlm9sRsYi?J6by+Pk)JLlA*1lj(gXgA(*IvCsl zJB1-uarNZ@6V@Xp2oe9hg67ugNxL51Rl=y##%<7u~i_SHnqROiAJF&^AjsIcl>nD63copqaqs zJEW(clQHAd+h@RQ|v-y9O6IFX$9+jrdaI(5gVo28E1lSxCe^0~kQlfo2)j}|(jhtAE z*~~$orp_G>bqusRO^_U7*Cl;~NTy z?~gB#(}riQP^@M`Rsootv@ajTD6}dzq*3AKy5+Y)y3*tyDF!As+arVOOAV63zNrJySoVRym6DSK{bYW}r z*Z=mftN>z{Kr7D{Yu&t301}vBoQ+8V3tUW}GSG}|(xDX>p=H2yooNBw%mL{aeGw!P z87u88uE#R-JV|BtyFrW{TkM;4Lq<_jH6OPK?{Dt6aFb$F+nJK;y-4 z9EZ7gxjLkZrnM?I*1(K?m@nPR7T^1vt4}#kzf4`1^_@i>#g6Fs;dr z77tY1y(wtPA`t1=xDd#Jd%r*d1su6|AZ2;4g$NJ%4|x$dnK5NqflOS&F~ zueoI59c0{KoPFCiErY_=9F7v)Ns+V8r&~94o@R~YAbqX#TW#H+;joR%;d*>48Z4_V z=kD^LBM*@2p~g)vCaz5rn=iH>bz0En3B<6gzrdDaY^a%~-m|S98gNUS;&|B4XD5Hk zlT+tkWDf7r`I+}$gx$!jPmm6#K~NW? z)$Q9}SF7aDJtakrw{Umj^YwhWqsMttT4FX1LB5?}2K&e)ELU{I9BsnlL)WSsf{oO}kQ32n%YA-z;BT|WzUI$CIsd-w1}ZcL^uz9!DrPRFj<-BVB=75Mk7zko zBK>^W2Q`*5_j3uNWf3eue;oO?Z<+l%z7tckTizdrK8yWt$w_L_vvvpLb9CLeMGy~b z(ICmM;}Z|5u6$91`+=g7&^i3>YG&}+e&9uIlXnNo>D6l#yeOydH^Dwn?i-sOyP-UQ z{TFi_Y_eA@-+lU;9H1_?0yg~xL9qs3?7C%dG-;o5qgwfUQq#t8|7J_k8`el61EsP( zQ0#_+O->-aOkwf3=8^20hCdSqTuM0p`WBUIt4+A|an1QtAQ^T^rZd#r)@j(|cn8yd z81nC91O4NDRTV#s*{KC;O+N7E(?$2x4BYX{K!JnXHlFh*AM*$9%c|f)%Rh##QEOrE zHNi!K(3`kEO(e8Ka#3rqxAfoL-Mt~VB|jONO-@6TPM~;2{~JYwNNu;crwTPgl+pI- zUhlRm4MLv1srWOV^zd-X^M6M^c!vJV2IF99Q;ht@bJPDhYL29~_fl!!z}jClqH?MT z9dilqe&x1rpW}3(<_ix|w7+#1qstV>ki8MyQ2;Uzqr-GZdZBjEl<_69m3BHIylC9Zw`EfGkhnvaUzDoe` zlD1!mA3v-FyelT>(D%@ha^^)oR9ou|Y|<7v2DMxuLpeicv;*uzrjj$_*}?cf1@Uk} zT}7;SXLmnJ$&f^w)fA+_W$m3? z1wQxtKXmUAZ!4V6>7ILGA4TkAGd;u}T-scWw_|ykEk1J2RlokRC?mYQCUfTOW`5m; z1!Hc^Tl7F;%0AQf9!)PAyCx1d3J`)vCYfcLVFGWtl!}@wDNtJ3I2pN?%iWna^#O|=)-haKWf51>I>Do(-T7!BNH_h zw|sHr{N>Q!i6S05Y3DNMBjdt3Sgx}V`y7-LBWq+C3-!x3gMss@%y!9`Ml@4Wn?=SF~pV3O}=+qJrY(<}16(-tRJz|dc(0v*~X zKi2oZOT!Yf{w?BQPQ8qwO^>%|j z{sUSVQ_jFvyge2O;q^&#vv0bTYQ!Ja8SXcAs1fDepuIl?NUD?_AJqayYYn{%eC)M3 za|0t2RJ+9ZiLU=(%lVU2>hT+0Lwg%BWW2YgvS!NF>->HqE$W{0=|HR;rDbnQ(Yw#q1}a)eHzvzb9^ z;Gyh&+{k9kZ_%oO313^;GSKpucgMxEHp7AG&{fiK0DIUv!!Byq;U3$mXsdRmayo_b z;=cv&u>E5ds1kZI)KRKGcJuLLO-+dC!yQ5QmCXN;8VsGlfR0xwf_|LQe^=H*tQ6VX z3>i1$fIA8_5QHaMwC((vBs<($wrUbf)i`g@p1kt7dK#NA_%y8f5|hiV^?uXsrbPPP z-g(1!YV-PBXR;qPVQq(`8=mITH944&cz zt3~$jQq_Nv3l54WrAibKv;aXXCQz*2$(Q!&xc2PqdND9X{8O5EJg`9OS}Htgxf{39 z8`n>J6-dC@X;>r~1$?La&FL@sIk?-d4x=R&l~?#+14;qOT_Y%kg;LI!e`RI_whmY8 z@~WN3{f7pEX|seRTB-duJk#V6x8sAobX}&0tnI2l0qNtH9i6P+2iB;dhGlB6J4? z_^4Bo&x{3WKTt9`8G!%_*thFzMgHUO5&T|SBIu_A8$3y}D{@lLsI^oR=uLoi0&Qm3 zbr2jJe1s(2#lAm#;-$4T0yZ5^?(~Y7^Ne9@VGE%gS}{5Qn^;_3`b3Th;of9OaArU; z&a;S3>i=B>fBcanaHd6+cL1KOkLqgf&-)D|No(TW*Y+f~{`+%u*nfZhI1e35A zCfdqazGMVVFh}0(d7>S&aDJ z7&W4~lz+O^nz!_k#_-^jRYFCyH~8A2^+UAw4Nw)>RY@;rWIiN}uXxufHbcWyI0yQr zz_|%vx-A-VBF3h3PHD&oob5bR2m1g**Ts*xKmAyiOqwC`DRcGE?sQAZvE6|9#!8#n@SGHm^iM*ucQH zb-{xsK=19sxPxE~jnCwhgE%_s0WVh+XFu}n5aA0wK%bp1!nh<@&NE8#1bh7GbGDn@ z+xIp@m8r&7@r^Zg3uX?R>W*1wTz3_)w)6}ue+NlS!eFY^i9X#;@Jrn072Apr<0kRW z-lY0df$0XOr)H=zhV7q=i!IL*d7++Qx)0xT8zbU1BpEg4<(`L)9BfY*IN0&?cvch@ zzCCui86VFk@cgvEo)lz!!u4rouZhQa3Y?zPEZq;4S zDxDu0+HI(m_Uy4zgh)*u>g?IZ)3rgMGzCvyS8Fu#Dc{1c1pIvE2006ybGrv2KcyV| z1E^LKDFYpj#k}+1D6pKLQ<{dEP;tF8J{UZw;02>b?9Qou1jgC*6(1~GSzGmTI);$X zKJBr~e7$dfrLU9YyR5*@5Sz^`LD|b2-T%+YdFVSNXxv~{@COSu*`k{?MDU#r(YBOe zh;Rv6$=;OyOsBbdn9DGq*TP1D`^x$gxFaEZyAi+}X9vR;zoq$txN*2X1K_Q{7EkDH z+I;diB)d5(aAjMthGY5Fii1RTuRC*U+%cBMaVlXxV;eIEuCMq-`fiST+a<(G1)0t7 zzKd))!EEY*vk_hC7)zmv*QY|CLjOEl<^S#>n~#(Tr9}RIdrJt{eI%i@_H63+D&qEG zV&cY|vwNVB9iC^W|Kth)U%A$4dB*Ha|%0 z{xJh4)xREM3PJJl9&=23`KYJzmIaLZo8U*6tU9F!gvlij{Y zuc#8&DU?1fuYk^azvYMNAANbNK4(udD*3S*+DzY5#FbksV#m!p?hs#zh)?kD#UA__ zNH|P>E0z04{#?4rrx65_PdrEivmkm);re}9R9`81x^wllhE?=acl5> z-h6&__fF%XfL!DAzfiSK_{S6?=U#S9!3^L6fBR+hZQd2j=VMe!Wr9!9ZC#}c!TnS2 z`>xN;1z>6~vC{iKQe}I@`^BvgV;8Iq%;w8G;Klj!sM9ZVeZJW?1Qp%i%S&C#?t2SA zM_K{>l&_Gw4G%@l3O^6X^#!gWtepSh{H(F2XHy+GYN>n>WNJS;)ZScpB0&z%*Rnk+ z`59+me&e+=N~V>T>$gnQ6F^IOysM?UN&P!ISh&2Dlvbl-N>vS~pM+e%T8_wkv}2g&I8w@a-+tNvZEgaE7YnHa@$h?g{;>T)J2L z45eDm1x=gp`9n-%nTT56IkOak!21c=8&N#6^A&E|t%LmSXN8~LhF1+I#T9}!^e9kdqUsfohhJX&PU)*9by%e7FcRo zByQQHtA!)`%N*jU}8h2tn9o0xJ^9b>;=FOJ!)l8iWT<)CUtmlnt|3Y`^Ib)An zj64H2WK4ik?Od+s#|`q-ZDx|Afaj6hJfY`{i_)i7sNYAY!a4YD(S;+Vprks9o)~-h zG<)B*9Ag<7Y#g~Jj+)VNGX{>9!nhtn!u0rI+}KRk$5n4MtUzi$->u^hzUa>T%f6CL z=xLT26X3R4BcSCA4~*W6e^Pjc+Lxg_Y3>I>tbfHK7V(tS-?`YfBai%z!=h!MQk6?1 z=uvpnRE?~IZb&+DDM>ZGicak(@ip>}FjP_Pm$WUpo+c7q=MlG>51Cg= zueulV26=>VwUoFpUx{Ndxb?=wumc@%TSv(})h8mL{O)0*#%13LJRX@6UpBpIW5c5( zKVK1oURa>v^S=^@Qw@)vhKGDYYkx`+>lt|wdem9Touml#T*AH{X96R^c69p+D)%|TH#B_r%QC5pr@q# z^Q%_hKC~iu!7t(;eVtJd98pM#O-oX6`m$6ocN}E zH8+7&a5$u8XD<`9j7&5teWJDmQ(XiWPp?&IP7L&5jXKK6KF*1+z6g^pP8Q#wON1Vs zvZ);2H=ju)v--H}d8P`+n1rjP1w*}U>+klU224I0J!*7oJ2bUe8(zItACT%`eBJ3) zg?o&ryL>ArDYks@innMg>#z0Icgff`+#iHD{bU!(n|tzq$+!mIsEy!}!_UiGr*z11 z)w5qml9ce9li-VL>Em1516?z>U&9bdO=9LvIaNy`p-xZGDNS8Xri`GNWr58Sj*}ih zIjszYS@~Xx?}VU6W>bCLSx%04esWt?7t#E5J4Ee#m-8%iZ~cFfmE+~H0a-N}##sX@ z(~8-&zRmRU3yo!o))lk+4PO(<^r-JOuWQUvhr?Ee68-KMPlVaa39xVVtdTQ=qpIurpm};?vAQB6>pS;utdO*SBb&eIiZPRQPg2P`5{vIMYpJ6Nrloyu?LET31*WWjoSWU@u%Yb z^10Seb#lcA?M@^5pg&II!vMG`Ki9fb*M-Y}TF)=LxSa)pO`$#;pLZ`m+oYNJHkjSw z;*rU19%?EAjiRRIswlODp)rBs-q?C>@$koqd%6$z_BfwZg`WS%4Y}$0r|0pcBm9ut zV73hSDzAxhyl9xzdV?Wn@?>5EA4>!D!Jq!qdt;|E@Oawr7e7#IF8;ol-|4D z_@LC}nFzkB_xgOBq<1#pU4oYTj|10Rak%N5=yms^` z9C6Y>k_><4qqlGd28E5t9J5YwhASRH=aEN!t_M(y@)qcyO;HWul@1*KZbX@D#>X*x z3bK|#sVV~EgL7@t=mVSNbW6d?Jh>07?7w0v@?=KmCgH)?Q!4uEzqz%lo(KB6K?K(Z zz;}I4?@hIm(m;Yez~wbsA5ppzx7s2tL+K&c2P@fD|fBsHFry1#)${<_65Kj z3-Yuf-R78GYs>J&>Q3`-^O5OxP@>A#Ua*qX!I9J-lm)l%#SMFj;A@bUw^R5sZz=cS ztSZIxVDbU)p7OE{mppE+o8;F-x84nGYu#I5S2;9I%2?1-4pMHBe+z!*|1EeYY7reRf0!nAw8<_-H>58~##eo) z*3-qTU%qHwCrVTO%y+1NB!Z_drbG#5OkL(z#naIT(O>bT2@X;7t4u~rE>EU%W|w;T zme2S3heI|&t<5JA{E^qV(1-Ka+=wpT1>aLz$9XXSv0H!rjw#E?f!gt$;i&Cf5 z9&HsHJA_;wW2=|*n;1-UWu-i$?nkbat2l^fI!6{CZ1!*VIh?sG&-gmfnCDOxv&QWV zCb4Z!b?Rl(MJk?KaOBF4uAwsB?NpoZ!oZzNRY^z4&_ht4!8FLl$&zsq9Ys2G-I{+~uy)aSv=#^1iXQy?MrDn1o7U zO)>TALM5JE?()3PhEPTtquDVj`5ub2%1eo-F?Yd_g-cz3=yzWCGxeKCE+)DyW)xlE zNeK7WBvs0D3w^Ab7`)Wil(Er~J;>XUc*`QM%9O zwn51Xz>)068jqYEF|HfNvfE(OX9ZU9#DKH8DT)=%2*xjb8YGUICWLqZXoe@ zq-pbyO-aqkt4^c*HkI{;UK?%^aOrXE7V}~au~lfM!$t@2(hSlRTpOmoyFd3#>Lmx~ z*-3)=u{fX^Qv_V8hl(nlviZ(R z@-@i+ZIR-hFfzyNb26>qE0&Ikks#4I%}3BCm@LFU;+jB1mn2uBJkfyG0Y<#}YEDKd zt=>FqvhjAH1_9ikSI0DJ4F`jugD*)rAPs0sM&vM@d0&A;(ng5MVznt+yRr?bc z5H{H~gbpbXWnT8KFSm)W74z(^|58rFz|;K-D*+mNUxMrvi3;>hF?i6oMs$nZn%H%Z zraSub)^$@m6Rx7{{`w{weVsEalCiGWeDChMjuU9-!n%$NBvixcbs5(UcX*C|jTPNt zfwDkjZC4`A-L=x`z#=g0%Zw{OOzW52w}6P=TDrFQX?6)4AKzVTGtg)Iv5-W~h==h; zl}sg8^}H8ej^**xatl99Pk*Z$2Y)rFQHw+4%MbL4@|yCOeMo?o3S(`M4o*v=SKO2wcc86s>EN`Ll97~q(^Cc z@qs_@j!@Z%^h)a_ClvBPa10&QY(;p_<7c72QVdHJfCBzF@Ed($sl?t z^YDI|o6>0ouG=gP_w`i{w#JGk7kv7G?dnq;#T{nnEOB?nHf7?-;QsK1yz7-3Efs5j z!Xt4+p21-G>8nQNu*wIRG4NaA6*LXZT4YwKZ6e@J2>(6t{laM0jm1X@4)-1YIMX;E zCVv^~H$b??^Bs}#i+S(7nF7b(z_Z=&JnX|TsFN}%f%13pPH z$gP@jV=cTY_Q2 z-oTLtP9e48Ouwc-S_V2F%BQx(WRYNGC(?I2?b%W#CM|K?B~JhmY(FF?^&|9C@@GO@ zWby9qTsmmpB>Q~A&#>cumtXH*cD}EpD9x!yRzKnG1_la7XU!u^Sg!`9k`+=_b=J zioNRPUz78hSiaSg9!A=G_AcE`Z~dU1Ku3*$k#RXoPSD`MjRo49d8WCh;cWbL;BAC# zjyd%4$)i>)i(#9$8zQV8vlA}B$vo3(=4?ym z*|~6ou8f?s7a5a~u^+fE_$x6hje&*`O>&IrfNB)H0QXT@HM(%yt@7#Nk zifq2n`sDNWNrT2kL%N<#Qe4(`AVgKw(Ak@P>Vjl;httCoF_kVOJ)P*70#7Tlv=S&j z#*5p~r`ax#HSKL=`PEXN$Iq6h7TyJ!8VID&y^5*&`>BZjGoWMo^2#^U3;%`6&Qrkn zU5C)bp+eCJEcbtE`xVJ81Jg-+g>221>n%RLr^%vdf3`M1cA59Iw|5j?t4zpPTMcEd zG@`Nv#+4EOgVy+lH2;Epp+4W{+t=RNJ7E%GzOHSk*yu*q_H9`T@=bB}AzA_Yh8Wc& zrfWCoUeJzuUSE=UrnT-Wp=ml`wVsmin{Ys?)sR?OBJvrfZD>E&)@X8T%GDT*jTE`O zk-C>3;<=|ep_6d*zfaOCK044nEu*{SzVRE`^mrXaT$w0@WIq|*YtV}*_IIcbzP>!g zpndmiwr`h)_CM_Rl)*t}FsNC@^W zi8lnW=zklVt|-clRd0&PH2~7>m@nfMWiGiwJ{F;ZKUm;zKOpF-SkWhcV6QU0j#yRb z9G##_V?XjFdW2D4V<8;?UD(%_bzU7a5&Ov-XTO^F^t@$!ePxr(x=YT5Qty=?Cf{R1~l~rXsXFb)sAUWhVIv#z{o3wLSm`v*}SHdNeeUQ+z;`cNi zj2(3$J95h#aOQOLL?5N2SRZE@U2Yer8Zf#gBo?xMcs6OFDcJfEittaW*!R=$W1Sw^ zyy6t^5D+3@b1v_TQw9+l*k_?Gw>KkcC`}DMr;`$NY+KHhK;LrL z6bKR5t=m8Aj2=$V2L2ciseDCuchtL-Mjl+#wKsm5$9(We=@wmdJJU#|Kr?G?v-{lb z*{I&YD=rNB+ZDTMzX0tF zRM$`{Q8xQ)u~F?anl5#xxqH_F+A4;%)vz--pW{m~AswZFR zZ4XR`q1Q!dHHNUF^2fBAX!gB8B{plA zT#=HDB^`j#(qZ`4Ia@DtDaPRmR)zulL(iW(8qW1fBPIu99k0U{7yD$=z=)r>$@&43 zTl_@*lkrOi>0ip^@c5fAKW^K34t<2VNRe*P;Ulj}EA8zRyy6Pwr+AP<^#=O>i7u2& z9zx=et4T83frSAz$=H`0Ij!Hx3Ie3#?o=Q@w0lAn`_N|<1^-y8j&%g!HUyv5Rc$VAa;(QRu z`2)J1FDq-RmRnv-Tgt94cvTArbcOp5S8~oL;?KcG(w+^~nLE=q0T-$d={MV=6T<^-vMdSxayEkQfQ5*ed2n{vR$;ZQT6tfY(O`m*CCJi^;7(@rUi^&bVQ7~dsAj{@e~zj zF5W#YA3hRtR1M%+7Z;`N&X!ar52DKA>7c#H(){8bTWY$@s47Ysj%Tk)`LRtS#dw_RHreZy$* zmm!?D04<`s{q{keg^R%9HD2BOXfeSMPdr)hx;X!HrX;;!?oMH7W0}%Cx2_#3lNqGH z2MD$d;m~&|vwp$<(|USbs-MW;*j+u-sPfKj*ua^bBQAJ(yaM`A909*(zdh;7I+41f ztyrGZ9-pS8{gFg50Xnk(@;Ow?mX=Uulb>g)h=%^2IYll0pkbRk+8;(3~=onHsd;fnq*03Db<(ROTw zymx^|+dKJ)l%@Z#=GroQJG@ma#XV0R)(LO3B};q8r+mSG&T)IGSCw2%MxIdoza=%E z*Z= z!WCh&x7l5LDk)HYW+3 z%I$QVobo3pcbi!!d2xMZF;q=?%C*uz3hR)WyYcux?Hdod8_R-SI_@6l46F$PFHBGA zxcFd*$dqm^KP&8N<=uMZagCYd`6JlpB8`M4aF%~HpV-dMMAyMip=d`Dthr*Y9mZl# zsnDN4It41;3snbZ_##b8bXHvsP&>#2!H^dab;8IWdA-mwe5liRIz=C8dmxjE`?T}g z80H#AVn;(^GBBR}DjIt2&6d(1Y0c3tp!3G=fxA<{bfd=48itkg`V;G43RTch87>-c zgZdtRosO671D6Tv!vuRf-^TqNLB(|eU!Tu0-+uOvKHbi}W|H_isO8%6;XIOcny*=R zf|JnE9G;FJn|EKqR^+$vMKSLPenkCZoV6e_I#J)a??g~?KWp8r6fEF0rRDp}TO`t! z47*~J3;KO-=!lE`k!g*q;D_lxj=1wE%##UM&Dz$&@+P;nHULjEa6+^M&FC)5>^j+c zA_Pu?YGl@ZU8Kc%H)YDZe5AzI_oP8pmi})wd;;NqYoDVCgyW#1FXfRaD_r$$>oiA= zm{SfE7s#b%+oUORW6`9hY_YJ$SdFC(-8$ufJ#h|PIHMI;g;f81t5lJaUuF2QZSW3@ zn!oi(@tz+I*}Ayrrs)jNsAln3qgmJJ)QB${dVhk50ln3)JW=Ci<72CyzBUQ=O_8Bl zPP>-p@3G^o2a8fgw#rxU3uQ*#l}eo&U6f`ohm~_SOOId^Omdd%?;E#PR-P8HbO4fF z?(v0>SFrz>LC~thN4$Q%#_+0()>oMbgp699Kk`bc&o-J8cO8)(c-<=HKxym(R`W&C zuWCA;6IbW4wMFPlTMH2cuhXyj%Ik@s2lj0D%^fswP&O(5s&KRRguOxV=-sJQ8_X5o zot7r_+ssyU&D>M9!tp+Pj#v+B*QTh`DxDgWo*S`Yty8|S9f5mG3+DN}2kKqTlAzkS z{}X**{`g(@w7^dzrone5slemI+hWGQ&s(?RW}|?b5!d_S&EGcm>zE}X{rQ(tOH!&! zLnPs9Mgwl_@61jLS=vCdDh9KFprtjqA57+BZd-m*OA8B;iau4|)}}%0h@XLcu-kG} zv!0A?N{ZJ#=nBn;&I{e4ykJ3dMUEHGZ}J!_W@;)9t=Xlrjc?Wsr;uH&{UIFw+^mIM zr7?c|yrxf{!_c?0=RMvomCil;sBT&6pv2Imp6hH9vZKIIA^0-!wU7=*UP$5n!2Z)T-K}wY5s^(b}VwqE>a-#4Kv0_Do{drmA*PYP26-um#m016Lf7k!X{pfyjU)Sf{=X}olocC)$$7$#Mr8=MIJBMobO@RxY@DqAc zkt48I|gqo8e~`n*x}r;ClM7d!J8=kI5S5##Wi zO8e!t5KH*G>o`ays>u}dFlaIr9F5Iw40ypZf{Z=Lu5KQnQGW~j5?dqQ(a=7kuH5t< z=%4RX#&+!#p1*N2ezQ`?9Uwt?JG(k8y+AQKZ1n+gk=FO67E^=X z8s6vWNfaCfj8*uk9IF)9x7gA&Xe~aYt5;}IQ$ z8UG1Qt*%d6WLI9#GSV`~RtY7} zI@pz5l$<-Hz4l-&1-spkzqIKCNUjLt^nS+OD?2#oRjK+y5e$zO~yhlXB=PhiWi?hTSNFw`6;**<&l( zPk6nZsU1T>i=FU+0j!g^9r~vGpS40$=vDoM= z8_%``YGEb{H!am?v%Khxr|5UgdDnNp>dGg;4ZH4%6vV4jw17{6dcKCMTF(g)V%0CS zN9vz#`@OD{(O?S{moAJ~IS0!}nD*I)Q?l2+cyLwpVE{g5(YHk1oz<)4^covjymZeK z=1jJ)lG(qBNbDl&(yS5CXN+gl8svL(s~Ho@)Lq2+kYMh1M-+D-(!wNAf2WbCExx5{ zkR;Zp3}9efa`B!V3u*Si;H%ojE+`we8OC(C0|J_c(6U7qAxXJn`skTSTcmp5m^4I( zP9lCCh?v*$+)sMd*Jsi_Te|;*o6Joyj`L%SO=t8E?yg>P2UPW15A0;XGb?}@K+LLBN>p`Q}#<#DPKGr?_ zcR&3zHR)UbwQacfqfb-3jdkpQYn48zuJUbPyVFc#!sm@}wD$y0 z@700_*+IXrh6#>CRiOJ#v$gBZ>l_N0V_eQ2K)DDB9a2m}PuvhC;ZP&OHu+SLwnSkhs@k6duqMoZw_(P}~%-c3+)_C`#mR;>hHr8w;W z15@$H6Fpsg?J4X?NL!fSVZ2wbidx}jD`U%U&GE3BW&G-cg-Jb$#jHJw=8=ki`-O9w zuC^#6FOP3A!bQcg=AnXKjQ-0Xj=iF@&KA;Q^F1D9FG$EA1;~0PhPMoI6v3NGf*-rn z#!jl&zLe)mZE7q}P^~Fd^{db&x4HmapEYgJmTe;|8@Uq`S_Z#=RxsGas5)C*`afqfLH~_oL0#V?3+Qu3RtQ zUNZH+S`AKYxof=WXwfKPiR!p=JO`=NQ%zGEzXK6e)WlYWVLUfzSJmcUA6)ju(ptc~ zw;vbPUk3N#278UI&(zKEA32L_J2s=?UufvAbxOato8?l; zX!00fY79YS6$`E5JDy&}m=J$#A;8>>ixtEwJL8#%wq5A4w-53T!{!7lV0(O`D9J-la+{IS}C?Zxg7ftn+_ zpyPS=2UpLzJE?B*-8AifL182$7AbH$k0duPjfGd)NAdLUp`Da3ov9lccg41d=COT#+rq}AK)wjr*!XcskcdQ?6sVi zlc>u-Xd!HgBPo)Amoy>Q{HMYMi_b)xcH@;~RMFpF42p*$YPisKS0c=7?(|3mvej#C}iFfmy-bT5FIfuFy0Nz=2cIqAE>Lf zw!tJ+tx5O^>?bAT0+yQa1;?)%Fo7hgnHbr6=S`?N9s3bJzJXJ-JU)MwQvZ~61xI12 zLO(^&a!@8OynW04&y6+Au+qPJzFKo+H%#QDn6}GTIdhcWotF8K&w5_HR8IOaGeDLD zUUuV?1P$DFA-PvYW26~&shcu=!0IP(P!vv;o7Ttr%>K@iW{ptFVlb({qw-|4_k|Ma z87QH|i>-@dmOWSd1fi>H+yuVWhxa|T=KKe;$RRH@Ux@b-AZ zVi9UUvh<4l?R+%sw!Xi^S-{a6jfcUTGjSCD&FiB^N6Dke^k|~Hnzbt_2l1=PQ1{dg z4psz>n8Slr2*mMg#dY2X;H)pIGUWl34nQN;Z~)jpmAfl&Tf&x#i^2WHTu6q|p3yCwU^;+PB&v-Xlbc9zj|>ugBu z7X?iskq|5qCR7^(RTE=q{>zoTf0+LZVf^se#p*K10`eIzdFK77SNu{NLMGo6TSs0M z+eFzy7++mmsHdcJGdB`7w&T7zbi-WHwxkKZFZmU8^ErG5a=S?Ug-YoRCdHE30nyzu z=|w%P(@9giv=;0bfqxP5Be=q0si&>gdNA#nSb{=;LDOfYy=-$qj7tqg%|)FrN9u zu4j^Dc??{Ac6CQKcAzg3K*?9k)$a&mn2PB0$RD(S&#)_7MZl11LV}bJ0QbTCNppn4(qZ=2`c?1WgkD(_or9*YrzSaqpLj3% z=X<%s#JSg4Ma_dt)%s>bnDkJ{sRA+Uv?GT!b=&lXZHMBQ^%U`W^SX2>nM>G8G`j7u zO1+9V&sAYseTfE!$`ik0Uh%%NyD(23Bbw|l{VKmO`+)G(S@>btQw6aqjBNGRzociW zcBX{P#`-(*&V}6y7=k1oR01l9N3x)#Qh8O$sYb#Y@piKRpf0oin9CJ2r~Q6$>1Nh! zmKA2*KGa$j6tbRGZ9-3uN%Fy~R8%p03LO}uIpmmOFuJ6kn#*qw)y-Z}*dOdwRUJfP z_-IVM0;H;&k6YqkJR8iHp<*b(I=PZFwXG-SnuhEL!6El|ENX38JB=&gQz&)$ogCd~8*6VPt)AH$G5a-_qO-VxQP5PO)N&#{cMSAVV|S51A=Vl_1o<#;@T@Ht~kd=z3!2qZhMiWX;9>(dJWT^a(8Zl>)W?% zYx&;GkFwIGhrI)PdrzJNJ#+S>JrgN!(9)<%ToI8_Ypaf9DFP-|f4+hSnVTfU4&Fx$ z$o>J}d&z@AwClGLJ1@8C(l9?c23=Z?3Y)HIA{+)3KgV9u@>&f2(d@X3Li>Dw6H`#{{YEC z8PC#1h>!tETV_vaf*fNDdt|LFhZuEN7j0Y{^AxSM$imgihPsXHN|si{>9|nzoCsG| z*p*7jH>wNX$CvvaSCfghB*a$$inXVG*9X6dvNGp*$D0M9=hYLTQSq zq9!bQ9(Bw`i&(x@j-Y+;R^S>OW?IxErqTKQ@(bW}cS%BwU-YT{mycP@U{wocjai*= z`$TV(w|5dn<`Ie=f-*v?wr5p;4kYEFFqifr0K<{3-k$zNiV-VhMJUsua8E0}Mr4e& z;`DLfNip@Jd)3Ezws9>kBo+a4e%I7y6E>STi)c^CCN{IaYEETG-YnaC@qI`?6#10a?Ae=@BARPCwO$hguf3byaLy^$@f+~zTy&v)-(X!H z;8kf)+f*H8Ls~s7`dv9eFxejcj=Sr{xOe`{_NFlYt@{kf4yJy-USI;hB(h)L$};Y> zKV!M0Bg~U0Y;M6~A4=-Y-mij4OQ;!Gw=BXntL18)*Op)ou2>ROZJ!XW@Yo3|g`$pC z%Aiv5H#=1e5(@BB9hut7a`q>xCP`KfBT>OwgqkI$w+$g7VQrVcw=?XqZ*CoHmPPyT z*=VSxi4}ZZ-DCOWmHXhITwT!p#QlI9p(P&9L+~2wfy(`IY~-F4a40M{gjSQ)m-i0+ zI!91iV9NjePa)@&@J8${WkrFElrou+a7_MHI=gC|G?A(+X~V6}mRh-@+0;P9al(5|pV8r0Kn$R7S{;+g>{0R03{PkX-!TKsT#b{mJjz zkArvFblY;Av_}|{Tp92-y(OmK#1QE9KshC2U@kF}o>fz~zUq1JtVyzg`HH>!4{`~A zUT}@6Ke_u)y`KA*?M^;ZIIazSkqkLW9Q6f)-Vvj$ix*gML!Fp`FC^9HJA^Nj7Jn~L zR6;3Dy|Ei*%>H@ovhX06(G&H8+C6 z3%1*QB=lH6GymU(x~eB^VAB44KX8+BM|{`Zv8b;pz~ZWJgQ8ZlBlHz7_&W*t`c>H; z;Z5^`OW19L?8$RMMN@n7W$<_3VbHj(S0LAd$ds-P-_!NqRL0A(|BrGGe>^gk^+Q>jW>9Vmi)DZmGC?2r+wZ(lg z+9PZ{D)b0Au(2eE3NQ#n0oOW`vEvn11Evcc2sz0`ERWZivpN*fMiha2+SVAntfmKB zX8bF;^V+$MBOCbcql_orf5W$?Y@VOihz zwx8C7vb%N`raFQ_$a~VT(mS;^KSG|hh1`heJrB&Tu(E4k0^XkEynX1-7DPgX2(+Y8 z!_tUx$7MtUW>WZXW$u7eyCpf(gLf$rOzi%9Duln#)h~wseW3fYCiz6>!hA*UCiz-c zGV{X~xR7a|C2@c z5}72(N(y3|ruGCATV6FKbUAFL`u&S4goq^SH&Tdwk2s~R*>73aC~)6Sv#`<4AZQQg zr_O+#1WfCj#j9JYK;o!5btSdFNJVK5%@Q>}=HkW7nJp8qT8sQHDU@~Se21r$iseT% z@1#<22{;%&7e!Lm-dduQLZ_F5woHG z+5|Y!Ybh zf#oU?MRBG1SC8asRDI!sfkwP=y;_Z#mX9ul#e)8?qYxdE}nue z>tWS@iHtRpFOm81m(38t;E?OAX!Z%X21&KR`@eKy=&ID+ypbtHn<$5J(VGK`pktgk zYb^gwhi0jmLE*Q=RYwzkKNdMzVGly>R%^jwh-#)n)L1eO21{-dEIz`;w z_}YHv`H;l;gZ4@@)d3|VIAY`t4P2>uX*{AP3*8Z-F(yml%SNx|WE9T6loc`zqUjab zqiW!WN1C&~U2kF5`B{1mGu8E^W)~)mS;j*hjP=S-0ewFQ@8e(kZO<#uP4JEh&>tmJ zr=8Ha{y|v98CBAYZT|}KbdGNsRZ`#Q@z_C?9-3co@Zuh)H6HVNASA~iW_c%p?5S%U z1JesRjbS4a84$O^%9-N~^N(ZW+q{*y&9E5ItG&N~;8WVps}Kkf(C3f4%nL}?@39X= zk#fyGeq}mwoL3J9$vP)DZ9MJ|QUf@bEj1bKc+yD*_XMEN8Z9*23jBM|2D8v#!)!zo zO6Qbae6cvDE}P;e*@lC?HZv)gp1~$3yqCU&56=xuUc$btG27nZ@A>5)m$;=}3WkC2 zD2tmC(1#zdTX5_OjBgfRIiQpd&kXsjjYobV2BK}ufH7D1)ONv6$3rz|9z-)Uu82>8 z3DNR_EKcPISS!w^Z^s(LK*8_z2TTm|6IjlTiqSQL!DMI!D#hnEStkF4Br{l&!j6gD z?maeuBy{q9j%`WDx|oH!mxL{=N9r#LviHmp#^{@7Y-Eeg;5EZbt~eCxNz}>%tJSkL z6-oLv3u`ex*VKfC-oROWd17WHd#j(l;F+A+!Ta#un#hx)bu?1>vsGm#b+2J!A5~u! z%>or?C253P!)+pDE&0h|;x6#g6c#V$rJhoo%)oc7F>WH9xVbt@>0R)Gy+;iJ&I$+$ z{8pG6y<0j;eqb&UGpCEn6xRq@zc*m9bO&aX{#Dgkten`8nBoy>2>zScrIht21$Ud) zm8v|nJ50n+c4P>*88f>wc3yCiUSn`k>Ur2K%4$Ukvp0I9wiiTY?7u$@bC;mq3edalz{OqfV7n9QFD zz|(kBN-bO$x{SVL=-(qEO#Z7@*-O$Jj%3e&muIhc#7op(duOj0U)XA|=Iv^4u`OMc_jEenx$)A- zr2?`8sDFhw-pj7sqNv?@dZhFAH-FFH{Z}hFqdhn*=bE(V1{`?y`Pw;%H^n_=Oul== zUj5p;0O_66Jo5<*Ba3T?pYDU}@GjRI*Ap0-OX@wd*p8bb0Zl3qjap@SE;e6E4k zwld)gcB}u}L|$5A$k%wEX@db{3OI!Wj~aye=H%@JxVD&e#JEf7|MF|X59na$F@HSh zF+E0FJM%;DN!09EEBF+<;ksrf?2C;#-RQL$aTA(rB>P^5f4&J$LWal^qK4&=5g~4c4HUo@M;z|}{b%pOh2NnZ%2ZwQ`;{!=#(f1p zTM(!hr}C$`&yUa#EP>U1+YwJ!|M zpY+^y4C*w^a14zLKUt-tt-5UrHy{7;evU(ppX}*J+DB8@&zYlJLB&(+n7&f7Rymvi!|e_N#s8JBfDxbyJgx_medPE9T|^+N|bIq zT7h`tb*rlj0)w2AGm3oYFOzWR>H8(Jjzzk-8b z-z@)*kS}G#Ds?+DfsbZmR|YWh)91(c9+qD&cVf}insl8PGgsR^GXfD zBz|!z8F_gakTmM8JD=WZ+Z*^44-;m@U*vCxur-Ld@9vv{L?hi>U|Ub&&GwKvN!YjK zWEeT9Nv{GTsb&z=Q`gUWk9qZ2o%)2M?AzzIgy!+P`)Apf5^tO=&bvHLBibxc?&av# zk-bE;czi`3*irxwg|M8oe+pR=J;!jgS zA=v5q*!&S-Xh?2!?ZwfY;Jo{wD*fZ{W(~4Lod)5W+3C02q;X96h!EQIVA%HxSBXND zxdR&i*-$Ot)gif&)>JPztZL_s;+XJ~(Nd5wSA2c(^Fllg=QQ>>aUL)8oJ0tmK`y1{ zfr)j|P@AK_*EC80M>;>65iKn@zTSL-(7Y^ld~~!Dmg`4&`K|X6#GCZUnUc@AUu-SI zWj%oQzBcmr)zR=Br;HI1Nz*YZs1rCniK$QZiqv$UnulG6CgEM!CHSi~Z{wBlCKK=HqY;N1@n1OIw_@0B2m zeHTtT)|7Oi)Zv(Dho08zgFXwveXaMrY)2KKO_fFU{yv1OQ_IDhju5hOlcc#=E;zRi zkFjr(%{rld9Od#l(z!Ks{Dr=4_xN~^zZhDLT`X?GUy=P^$YQ*EVeww9_5ohm9wpTL zi;4ETmACf$&s{B#{XTb^k|7^m&xQPDhd=)m#Ncl7XT$2ru!x=QOelY(XCTGF--AQM zb?{lUl?RbF65__%)k1f)Q8>{glz#7ewS1GN_MC{LN4OspX7<=;bUg|*rx@vxuiN}g zMk@B?=DvF9J+5M0*SJVZ#gpUANlNcw&$|$&STPZP;$)tsFlum2PAlwL{JU{u&2=yS zci+zX6b+a-O4?dg5wcq=|FSLnOUdSDIfcXPr3PwsR>4{qQwviqE+P=`B`VIeal}rH zaz`7_CtjbmdtU+Y<1dY0!@YSn zRWsy}F2NoYu{7VYDnsg#mzo3RvHg3iRQF-p;^@&t%^GbF@K5*tZf8B1v!Viz=uOp< zk)giYb&zl?M795>Fh)BSg^cavG3MR%JPvxm)>R97M&XqY{RhTzMAsE;(3NICmEGJ@ zazA)dtqQw3S3NAeP6)c+xP}+z*{XJP}n8o zCI*lhX({oO{CJ{O>)Z!!LIy}@jS;Zh8h)1a(QcS?En%4hozpEd76N|H#mB9lk^x&d zq}M*18kQa!={7;~2Ox|mz&6-;=^SiCzke~_zY^0&^^RJFT)E%&r{mqo=5eDl!YHDy zc;Lq-q5ud|oy#tP`l_xZ%0m4FgV64P5*Xo|?zBwdi4HO-f7^d(GcBb)?7HXiJHWTx zra6M(Jnu(d)}zZJMV>oC#iRR)Qz?Do`gZXmzHbiX1os;rp(S18;1skQdi+s1@uJ$Q z@taGjE;k$>OQoCL*ktV%Y;pcCRP}oKoGi;p9^{Ubd?0zi_xm-;4P%n>4$unfsva1V zMX#?$zTb9zH2&)vSMCx@abUlFzKmC1d8%u-z?7S!K5W}caRmSS2@R!Lwxp3?wlb2e zC34(NOi6LusQaLpMIk8Lcd8HMvv0nVRK)N{@JC_4*j3W>KR5AM3pz-$8?>`vy;b|e z=T%HO)nv!&OxJPold3Ueb%8L7Jm{q%>9DmS5=QsK8uQ}OOT=@O--Vl3+?=V|c^NBw zIspJHt&eQ5&a5 zwG*s_wTQ)U7dH?9i5DC-s?3mad}az%s#~~WdXn7zd=dM3%Dek;>H$QyuT>&? zH;h9vJdF}BD#O7$b^Nq8p<<;sz$73@ri2}8JcOX%x{KrRCEQnUH}97m%wisVC|L|K z#0A)le|8sxjR-%0f3zNP978B}gL4PWi+$7PU&r0bTysalck;e=boA7vFn{(fly(4w z4?SXAGckbWkM~PYXIWp7(f|T-#-Dxl6m!nkIAot#nD_nDBJmT8kvsG>KtHf~zC1n} zARo|C)xgDjK=?vcz}a@2u7yo;`+~s-ru}mRbMLubkF6O)&Rwi_P6X9%6vmhm@QX#- zNHO*B?hT)j7CCX-f(^vF%vKgb$PawvZ<+Ft2a<+}`J;Mwx{irswSr8>pwu(XwE0Rrg^H_(ncJTt*hQCwov34B~{WX0~ z+M)J*Dde1k*52aI!h`U~Rb*%1a4tRifa}c_l!qy4m_%6C)W?>_1#TD_hiKBiG^Oj9 z-;89UE!A?mA!+3kHeLmxLv}{8?9u}~GAz-R%1)~?(co$@K-4L{fsW(#dg zc2OLzZvalYQy242w0^kg^X&aLK|xuq;$VJcJDWW$E*1_|qlty)ZaPnG-qmFaZC`%< zcG}+neWW;%SY}Ni?i=;vqX%surNCEYw665Q@konAr=c{#Jk9fT4xH6+MfT97q=t!; zTM~I{(GUVF9AJHXc7Io=Z(}&f;q}jeHeNx!W|3`ay9Mj!Z5_80b@(CSY}<#E6{<3t zY>1fr+qS__Z7$0*PPy>T(TQ ztH&2GfM#Eib{zeoS~hT0PwCBxV+4g3yFX4Nw`BsqVoib z&QF22{xl2jLl<1s{gFwk5~6{rPfkLzm6|+xmtZj`(z64F2O9|o)j#-ypcyNl$A=3z zlP@#H$luc!991z!b_e6V%N9pWi zHSY)QJ*VKA)P~=OPGsLZ2j!0h9lHbY_O>u5zMn@`>O1mNA=Z}ajahRU60ko;qK*) z`j^-k$qQ+l#wPldP$lTgY@C3dVK=5VR%30rU|8XZG zHg~>LEJwOzSsu~U&8uegU33;MrMuiHY-c@z_#|pSK;5+zl$vDe3jCnI>^U9-A(RJD zNX3bUlbT)&$eEI4Re(K%FE0QSO#)|9+gCGcF!Y|z<|#G-1;I`WrojOKUOBTvGm3*6 z)-Hi??3b0xN5*}gh05!arX-U2t=;NDp=9RwrM&3G(Qz%08)jn-w0KOZ)-rQ=>u-to zNvh*aYl|ECU!Q+R14|mmNgJA~PKq84Ida|u?b4u94d*jDbImqyv;}Yo?a%co-&%)y z(fTBp&A?0uhrapKa`}=AhnzB}G8!gmAY0d9D$;~tiKo4-Ln_9Ut+rW9?)H3n&##hK zgZHHb{vmg*+ftzh?)6?~o!Pnj9{nRUbg(R)#T{>&<$f3K56a67L4!Z7d&c`;hJ;OP zLBbYI2KovCicDXiXr{c~^AsJTx265%R)YJVy!Er~Ie#^m$!h^4HhgN@!^2Y@tw_N1 z=M98^lH=4uYJB-W9Ko%4Y(HVRk<1(prKk*>aVFzD60f7(IL<_&@^CZuAb%Hn&~5!%U^|^vL9@GCmXj?DNPw(r@JM^* zMcv1SRfGfP?9srhsfXb|I`dF8+d5l!eh;keL%7hj7Ole*E(c_<-Xf3F2CQGD2#w}P zDlU6+g&J_~H2$)-{*VECyo3qk2|AbiUtAp=GsG)%3!JcIG=jbsR8?$wX^BXfyR&Q- zXzzyIxfjk0e&{9|j@7u!`=NfF(Y|Q4IB%}(BOmjN{k*37xg_2R?{i1O;e8~bsMFw7 zb^0xj+YUSL(VcnqCp`TUQ?p|kM3xfq*p|tdAhBwjRH(WC~ES zOypPDWSKZSklcYMTenCAKd1lWnszet)?0e6+V5Ec#KIBs6jBZ>E{)6DcSXVc=Fe3sv>T_BK3%!bKCO(*yG&6V6VNuj!hh&CUy#rDJ3 zwq;wgH~OsMUMPdC-8{5&NZ9poj!~U_so7~zxiMk@ku`>NoJwyB4VXgLe@Q1VVEuz? z*t#FS)&Bfb^_R@?OE=}R=|Cwd0ddr{!JU74xKl-~(&rWA`DRL~^1};af!sk?7xT4%mMLuudFCwIU_d!JE<1aXWM-W>RJ3LTgXPephzA0NxoR%&ra zpN8-Z-M^fZGHb>NH$We~VMABcT94iP zO3X1$DMKDZI@HTFY+Z=egc)Jzr-q;FF{uqXmL$ycS#g4w6Gpsa{K|Z))xYb3vCmY} z<+N>c&UMvxUKOz8>fIl2NK$*6AaSu_$qnj*@BX;aEXy?*@iuw=H5$)jC+&CqCcddV z5S6`c5;FfCx2|JBo%HBL^yTa5Je%M14`VvpJ`nEuJ{)@ryV_O2CrXZqR?{&Io0x5i z>ulZ25dC8`G;AJ)ooh7@_=&aK;abCPdH=<0{6Uz6aPz(725mrlF9_=yRi6=e8kcU} zo4^fhc1TkyolcL!g~EfcTnl9Y#%FiT+KQV&3&Qf_R1c)!VdBN=^Ykczf&;ZDJS|6j zJLN4}j50y{eR7OD@ry-4m&Yr|(;pD9{QIPo_e6E`g8bPl6*k@fSxYNIZ69_Bsc~{J zafn9XcE94@EnAWdzgt#rpc78ju3-#h=qgb0Hz5`KWQOAp@ z4`d(`ULluH#FotyFZjLM0qxBui<9fv6n!u&O5{ zYq8vewwbWc{l14MCU?}KiBmjb=Pm-&cB`)UhZnFWB_8@E8>^LPH1&1GQvbz;(bInWW+&OJ9Nd-6tUUp2GO*>bf4ZD;K)S3F+mBVmLCCAa;MQJQ_rokOGhgMdNtAfc|VJ%;5Kzb*e+B zw1&n=lu5#cYPsM^BlP??UdD(!b}TVWat4)3Wms{6_Nz|KKF22!Sg9A}3-rDT=@tge z7La&BV9=9e6V4->a|@w(LnF*{2MhiYe1@1uIa`vU)^p3r3ZxuRVM&dJG0Sw8$;6db zI8X}5?>nUi@VA24epu!O@P|ONcO%yEu6xs*kYY8X;sVOAaI0Wv$KUV>x^Ua}DCyk; zWNv9El=9|t_eCByvKC6?qX3iVOWsbc^3h_xF-;c_EM)%6JBTOz9-B{@x?;bPfDc;u z!`s7?OmaxDB22exS=iNHOa8u1=ux9E?W(ma_Ds@KQ^900G1KK%J6b9J68$Ier9Ug; zC5_O(U+tXK4bvw-fMkxwxL-)=(YXdMtNFury}GgWV0^NV5|8A(Ps8tKV2X(z`px~F ztmcnyYg4{MZbEFm;KN|iR4agxjL?Zc-ylXDZp)aXkX1FO)U*7(TFONtFzU`4zg_A`s{>A z1m1L_jjV;i)4WKp=5^vDFVfu?i-a5?uF|3Tox8Tw(Df)~^REcwt)MX!9pzR~{UAuK z>DqV&HPH4APq12fn#-$eSGf~I{^9%ax@7pE^WWhL5I^Wg)eu0}iOT6GrOARIu~hu8 zBbhIF59M=qVFEZ0@kuP4R}ddMqH9OBDDfAQ@pSK<6XOl9H+7l!Kmkc{ zeq!Hr?RK9wW6U$%Lv@V?QRLOAc)*KRopn zi)BEqyss3w9q(X#)Ne~bPpx+0hDObq&FIt5@+s{@5W?_rTb#+X|LYC&l=1t7R(Q&D zNN}|f)8l8QW2tG#USea@veHh>QJC^{GkCrZ|$7TlN~*J zlD-G=Xcf{cv|VrCm~W%-W9!o9J+gRaF^CGV6yzOc+^lEW$&8PzdUX#i@WB1Avh9Us z?zzbCp5|vMqI$-(Dafz5?q>O$Z(2Q(U$X3j2IQ#GSbbDL7`1XhsMv?q5UGFruOHhk zN(X`1CKUhmxg+8)cf})7Yb;~9`NtLkq&s@k<#de1+!x;N=-UV6j!5XbI`e-gRH5Uk z1%vnefu@=xraPJl^>IsQ1&hL)ug4{;DHHT&UxwVSttC6_PJe&;J8R`?^C|fOG|2gm zR@=;W4331Nl)S=Jik9z~@)+Eqwz((yl@i8iD?7 zgo}4vTf=Qkj+7==Z91aq=ht!N_}t8^A;N>H>~?`M%I$gFnl_XRCw1RJokJ8FnT*gL z4fYDKKTLMS-oPx$l@@?K6ge0^D*@Np+K_E zJw$~-Xe8G=hI#V=@XGv?uK-}|@ry}7(F&nxObLVk{nKxY@yXwfy1#8l} zg{o@?(HZSQOOhpzlJ$Y-NpCtuQu)J=b9xM^xwPMRJbrW%-$ZkNogb!pF&0 z+=i-0i6;y(qpV$@GJV>~%rJj_kYE$F>%%a$66^6qRb&5P*$s>fn~BzPLv04^FwO3^ zhsUt-TEOo%ORiWfOH+~7TTh0P&H!QaIzJPHx@@(h_e3{jVBYILtqPt1mwzY8(v znumloh<@;=@P;S@GS#?u-o7vYaqGSmlx$Q(7q+v?-+26rMK3F)-c9DB%FQ zZ2K9$`f&83F+!?at&S^x>LD4mO!_0j0|oBpoF>2RZ#&S?FquLzTi_JCQo*Z{^bt=Z zq>5w}lI{2S=F`JBha#X&sA%%;eQli*@4ZhY3FzD`Cs%z-v$i3Q_n>umM~ClFKYjF{ zK$U0n5T)7dCPzmT8oo74JARrLaHik9&V0c1VaQX?4^wzT5$5+!c}9hiEwAghUX|8N z@n9}Rac6A+?&f)(pvt%p46pRn-KmL8VU60(4!|4)Nvq`-krQ7#S%>bXn%&iTO@{N7 zzjOKIA+J&u`5r{>pu?PMnZmb>37$}WbBUJvVvC!xyfA^78;dKCSV_Z#zC6jrIlwg0 zB9Z=rF0HF|mJ}+E<|NFqV<>0R4)SiA$%HpujT79ooow19C}+GC)v~Nexc>}rX~}<; zX4tCoD(0e*$=r+q(VUt&(`Cq5IZkQBl>LG8Df zve_K0Nlq&eo4WF)_6)>d zsfuMo$&$BMh6}@=tIP;P{L(SE=T@{6*f=AB9%bxaD$whVMTtfD_sLy{>)^^G1CvP9 zw4RVyVcjWebeDZffzMHzmS&eflSc3Vtzg-z_+A1X`Y~Wkd z>y8w@17d7tB5PT25r2xr_5*&uS|06w@!fd0y!Coe@X7hjw_JuE!8`49sd}f&`KRc& zgP5A*#~uKbXTwZ0e%kK5l2A=i)5i>Z{9o6-o{Zzkm1eJ(ny>nL2JCrYn>99XT5_+g z=jG{ghR|m=d<7ZDAsbTU9ZJz#X!cTUJ)=>;v=PjfRQ~Tq@1}|^RL$XGxVuKX?zr+| z3lELAa^VrG-v@e*mjH8}Zxg+Lsk=l3GL)NZ-%le9QcyLcJ&`l<7i!rwncZyUdO zt(dVM$-ecg(onR3%G;ZqSL;VyvjR^TX_54gTX_~G-mAmO$tskN4m+v$N;xn4u#Pc!S&Rx<2s{ z-22M=%0C7iygTxYGr zS$O{Sh@j$t9qaqd#!Sl%qsSwFNv^kgqGUmO6jI#fq5-jyCy!is?~vY#uNWs~i?>R! zrVtH6|Lt@Ys(?&NGNjRAHFXp$+$KitxhlQVQAKSO?cKfqT`Uu*nljl3K zHfw`LQtRYDRnuiIDKv?-*U}w?0pd_MvhU@JlGM8Y{=~ky{4Q+_FQ_0H`!Cm?Gz`Bo zLjFFvbJRDbFs8owCu>);)|CMKW0z`eD^XsEu3E1u-WYH_k68YcQFH_ed_H|WuH9B$ zj+UD}&Xf&Vv%u8u2E{f3dhKgH3(8YP3S$Sv-niV2*FgJwQ~>(i%t-EOcFCC?O`RqS z+^#~fpA)k7mD5v^sh+!?VZBWOt*HN_>OAAw{G&D=N-0`<)Tml5Vzs35qr{g5#>%@@BFQpa^^H6dS=Zm3^ zCkb4C-uAN}Yv(^X)wE9k@Vy-Fqk+j;QZO3cDGC{3nt~qQU+&0jSZTChJ(oL_y{(Hk z%MBp9ya~8)_PeaOakVgzz2r0^vrQFyx36Zb5Z8+1j6>C*0k`Z)4+sYh@%dY>Fz*XK zgXWZ&T)-%fC3^_Pb@PV$;^&2#nE9@EH$$%vYt0<9`0({Qj`=s+&f-0-{~g|><^zvZ z{0{!Ne%^2Jx14S0YBuDtxky8!AuTR ztb{qY&|@x1bvLd^e}g9rD-9`h1fOWVII77<+ZKz$W)qdvB7Z0*jRe@W#W&?}LU3=# zo*>3SieJ75qg}Mordb~@f-dt6av%8mTU5DSXxmz_@(7{%li)m-aWu(yhHSSlna<5_ zPl1C2?G|)96UirihzgG7pS|mJ&qcSzW}Fpd7GANrVYa+sM~bTn%y9mVT77WPh-yRL zlq+8-?aOSED8MM4$+aeux$(F#rQOm`-?b;AfS2g+k#S)fMj=%41@S%)p=Q*7Y0R{~+KFvf1l-$XL^29f11w{$!|k!M;!0a2Sf zblo(qCRLOxvGzAV8%SwBf!GN51jQX!TFpn8khn4ZqUoUN;zuC0JcHA|ar38_St#%8 zM1A59mjhu~!`}>iu<2BJ8n-H2r*&`7I#%g4xlG zAF+wcE#bmu9l*ziqcfkh?#vbnmidSjJ}K6J6%KRC>dY!@w6w$ZmyK81L72~DSiy>i z{rYdWgQ}o}*$W6tRCjAjtgS-0=%lcTTfz$Gx6}lV?j)!LJ|3-T7rx2lca;@=RNdOFj%BB@CRRXdJw*whRy=;3Oi%U+^L+%`Nt#&prK(p z7GfzaE8~bat$B*lMx93(w_x(f ztt=e{$D5jQ(NY5g6w7%AmpD1ppOy~R)h~yyX)AEmMIHB!CmW`r zu0qjlGy0lvw_b^;msA&G^YWz-u;UzusQ_ydsK4yoNIq-@~6@Jiy_ zjb&ATY@Va0cYg2Kvl|@=n~dG9W=`!o`~6yVNSSyE&1s%w(F%^1^1tUM9PS#I;ThgA zjOl476?18%!VMFj8_1FQMG>E0axitz-G$friAx+u+@AI|Ek&pNfmyOrsayS-0I#P0RXc4pgAhf*&e+=9CDo)l|zw zsh=jxY?}91$c1K9laX6k7=LLK^g-2!`J-!Ev2Gk&ns%)n^_A-*@PpJRRuWMCMAM_A zCu%RXmuE(eHU$ModgwSrM=x?STwWmyM6TgRL>6%%tqQ;+xh->Bv};;7x9u^7m9i<( z_cdqT24EOhQq9-#)b5n(B1BT939ro*<5xld-Pi#YyrV8+BlLR9^z`_olosR9HW@Op z6A?YW4>kh4qT7yrdktFtu@!hLIP{Bna1#Gea`kYj4v$ZQePbz%eP0M`KXI}^z4Xcy z0299!8~>ybC#;BPU$QnCr<@}^tkOL}aS<$DPi2$GkltQ|J{z)6>u(W+}F{ygyVcv0+A1v-G^^YYWF9_#bvoHwvU^ zdjNuxo;n5H_S@%s077QXA^g5JQxcA+G+lsV^It#P%@?kiT|J6rgP>uDVyGP6@NFaJ z=G`>G@Y{MmGKJs;h6&Sjn#9bX?o)1ux>SUIdsvl^;`oG6yR`tGw=e1thC0Nzl9`8+ z2wqT{%wUhbf9L7{`s=t32PBLf-Cf0{6KJW9V;3o}U6dPUCg))J&&JB1bnqv57vB4L zS zZ0RO|n~G+=dp&}jx!%YhzMWT?1JN4~t=WJ2B3J!h^Y4Fpf&IZ(+&V~Z&s?z#r;aP3 z-~OW(K5r0t{#omq$M-c$F=<{3oli%owCkfuWkOTnh+AtMt{X>n!I>^>uGOM?XRr1(l`3N=VhqZvfTa0 zUB+)3Fb1KiyQdRjXwl%zCb|};?%zg4)a8?(uWGG5vc3||uSYG@o^;)J%Y+v1u_`t_ zXuEvKZg)q!4=FW#92QP)mDbJdLdoo!-A>-bbx}At+-p?B?W_M4@aSG{7Z1=YCX;+w zohuCf=UEWfCH|dAF*MekwzZbZ#<&^Dzn#&PYzDaHY-=diS2aT`onuX_{bKd#ID*T; zG~dSX*-#0G)g1~y+0rvUUe4qKtd9ibt`SnHMQP?Il~FCw!2XQ<#Y2_eqZeiPidbfWhcKi|xRz+S9y|hBJ=G zwq26{_VpIA-(&L9kDp_Z{Zobx-_NUClT2(1X&zx8?@js|#044WFkMw6Ka;a2lzee7 zFaG+t@cpL+So>L{^BDX4@iTSa;^ePN%`GIImyB7bkkAJZZ}CtEMKA3%ukZDx5EnKe zbaGZJ>d(@2cwpu2;GBj+=)(Ocs@sVLUXu3`PZ|mM;8QlDc|MDTl&jx;;dZFL5z#^l zjvMOL=2l`U%H<$Rht$y09D6{XjdYn3a~(6<u zgo(%*eZJ1PV!HD~$qFCR&)^x6% zH{`wYu3Rf2|5u?ec^LO>CA;g(`Q6y1wFd634KUutswGF?2GDzyzs8O)Tb@iJZTE1MicYn7G+fH>bTQ(UwG(`s)c2B z&oM?W9X((5H540-;rg8a5b)i_I;Y+o^YL7*VvK*ksFu{C=xEn&Gp0Q$?oc#1ZWd8p zt=O<&z`n&kBC|TTvh$+A6ONF6@{E>!Nz0&XR(F18N9-o~R*ro3tuE?9_ERE9SQH=m8y zaunnJ(nLdcf2u%Bn7RSPCigq&&W#$0Gi(IxhZ)gm3#ErPrwXg@l|rCqSp-KNTz8T46Mbp3=9-p z?8Ln~GgiI1&}Tabp&-r4U6kIoJ4h_36Jm^-?t(2nI}1Nws84~`7wrYowTJw2s0QUm z>J#h4GlC43?=<;;RVKJQ{QUMwqRu-3PjAcSw!L0>;0@e$A0c<$v)D8n!%Qh~#Py_s z1KwB<8|AK^3r;kecRf%Yd*lV_bV=X52wSQi2)(kGvq#;6PxgK5O#4Gplia3~TmFrA z*Ei_e>iw?oA=dQPOZ?8wCHObkwKZelqO0BgXOEg{=eAfHe1cS`q|1r)S(2H?QtrF_sPul1nySfMbP< z)Bzc$uvBO}0iF^oIs4wizBALy0?X8+oqw_8iS$?sJJUI>d)PT-!(?kkF!@Y!QNzFh z_z)!9^xDHL*I&rnj<2TacPywg=b6#gqoWWZ0{p0aP0{{AW(Y~rXh1}@MM*>@NA$f9 zs=7^$pa4m}a=8U5Cv`I*Q55Wh_E(d|#2{+1=FcpLaC#B6KhU!f(35j#qucrz-lBLSQaM zObVbJbm4>HzOg6Fe#aBBCp}#TZht34DGk*?MkX(JQmHYeFP}UZf%%X%jgU-5c^2+I!N~f)&L8a_aWl22-sb14h%SKxBb?8Q26%W47zSJc`g7~4 zTq^bX{F!TWW_9lByu6A#JrY``msBhj-`*7^b^Ckk=IHcWUkrm{+ht@4MpvP&=f91n zRW;)WkMC2NUapR633(@r661K)7`shyF_5XASex>TNaU-<>yzcXX&;+9)nCOt=Y-&0 zh!U>B^Zq5{@Sm|lTG@IfA9(8g5^9A*TWwj@E)Hi=149IQzqIg@vEV{SGj2IyT+2y5 zmH@+6fNKw`2!E+CGro{I*tGoEL@LNACV87_jAVPaKXzfC!}`9*Zr}O=wDS~mFa$G= zRc{vyAwBTc1V2NoJH>yEF(v_(_!$-wysqa%wfaeTA?&k<54v28Yc%@~C5>w6G6EBV z9yp91X%eDlzVF4hQu|kL+9#B)1#QWu?zET{sn76QOWTC}m813fM36B5zLl!NJrcAX zio4QV^0@YvyTaHTBnIso5AzATt6$tt-8qeG0KsY#j1?QrM?K_k9tqY9!FI+vM^9v4 zL!Z$s6%C!$h8$$kpPZIMf3@eGz{nYJ@?kdkI5$?#E>4=cTw8|L1h04rkUvxR3D>vo z^rb^$mRZqL+XH--V(vqW11|%L<-o1hF1yU)LtEhR&+~o`Iw=i)H(ZERz!vB$l&03v zTU2XNHpYxZE2L7EZoxRmnA|GlwJ5I`$wAH*L3x3uI+7lUPaUO`9%#&M+;JDPtIDc&ct z(DF*alz2kvGIk7$v0k8ilQ#l>3uW^hf?+*ey%bi#R~)TB$L z2cOI3m|%HoPg~15w=Qnu*%b`?G#hex)S)p{5-Pgx0Wluv#BmsjTnxi9izGYi7Evd- z6Gzo9G8>7S*yZ)u<%_5`XIwe@@55DJXJ+U%@ei6I#@rKIk#&eJ%j>w^BD%@LUxjd? zKEW^c+uODN3={Qy&_`FvAOE1P##-pVOHzgI9{016)xiFYH9pZjtO%7WJkGq%;9dWB z!lH037YJt}3Y#Hoy1KpTG(QUyz8=;Is&*CS5l-$PmDD zmy2>7-h+>9%AxMuNQx~$NcU8uy|#^_HO{toS?eE7n0^maJdumczV!Nc|(gr!Ozr- zl7gqm&NMDGfMEi8q}9n?LAm8YF#{w-?Mc<)mO`;A0MFohVaIUSTfu0(fV<_(jgHj7 zaB9mEM3$1{!20wXe=|&A+%;!sj$ZlK4DKAX%RF<5A#rK2N9&tra53|iofcsNlt`UP zZGLYDab-<*yU6yPW7B5X=!6>Df&i~ep#+VQ>D(%4V% zh4a^g+){N(3LnihY2^}wUx(g(1Dm2>ak@C1Sn$*L?AbjeaZh+m{)@kFRYm8CY57S*~RbJ^><7u7sCuN zUD#9VL#K_3_na+&cOj3_f1n}H2<6!r&)hu?$s1(RT{J>R7V2pd5KD!XQz~em1 zf0RV?SZd&>8@rUGM!@w!1Nl6)?h@tAQ6oJ&myO^ zwklS}_bFhm9qy^A{+iI|P91MiQvq>hZ#3VB$g?50lVU(!$MZ|vKQ=*%$1y=26W*>j zvo9CFDHHP~oIO#u4%V%&L;OzfYOCuCx>{*0geu~+JXo2hRi+LHuW7fg=&mL&gz#&Z z{9Z_2H%k{DN-I3~N72gjRUjOYt32@`yTC8_Z=Tt?ut~+BaQ0{J<{%O1ON>@%B(V_y zQNd*Rn(w7IF1*sK-Ak0c(=T0v`@A=25aTAqMQn1U_jra+uGQ(jaF}Ap2;FGvuP6~h zw&it+0wqxpUS^5a#0cJ`R!+F0Sk}|tsMnry;29q-?CvMW<Fn|L)g>bx0h{ok?6hD<%U|3kC1TqZe(b8kKBUP|nZ!;= zA7NSye}TPMLZJUD2Th~r{FBe7!`1=$ug$I~?`R`KbJtwhjBf8>O^7OwB(;_ezL1j? zeqB?FJ+X77u~Ur6&ij=b%s@zS z4kx1~Oxp4wz6a5JbnAXauVK#xm}t6w-%(_};|;Pzp5!(=xFkNIIXo=Hyc|L-&JIvbWGtn(Yw$0iGo(wv!ajWOU?XN!bXf=5r$e z!p*n)gk0e_yT{S{aIE+Mc0-+uK_Ox-KusyEnDvWP&qGwEf484TQXCO@vl2 z87auxPbmpt7xUKEBm@UctA=0H71u^&Pq^Rs$rq<~3#_O9Vm(|e z+fTy7o?wIDmLnUhE~gRJ1oIGMLfvc!zZf2mwIJGuf;t}pKbMOZH_8*-Ij z1z6(V9a{cXRR(xXH=70vV(OlPt8H+Fxv~<;^+56oQ6c9q0R$*np`1jF*DlhSh^=Q( ziPr9st4Nt#PBf6<1+{h@>7=DTV}qvtvR%ez49n$ZsKwVabaT66j*|=lTK*}mwbXIK zo&{Ismv)D2|KhG}Rd6L_){2(&S{ts%Lsq%~Pgc~Aok-|S#Yt8)ls>iI2s=u-t5(8f zG-3M3ZjzhPn{;Pe-8aFvF{#V7y+S(2?oqH2YsPzPwY;Lr_G}Ryftv}JnwR_zq#0)My-7pZ~?YJZ#YzdE1$==NRVo0SAVRH$TM z;4^v5GtJ2}s_21QjDN|8ITu}KjKAWe1c$SvXfNZd#*`V<3Mxa+a(Jdzo7*crn>T{z zT+XHImYIOz@T1|*56B;~1@KPpa83pWVu+w%rgmQGP`ibZR=dc+44J<+-zPT?$~hpY zm7onq@eY3$+iDRq49R+?)L;9U7xQz8H>@>;vbMT^&zEXz9`r^}0LppMmL-Ap{s}eQ z%|;7w$i^9GF*7yDG5hDv4boYZ@wp60`{ZBv)^Imd|F>B#sN?Unj+QGlF3lq&Xo&d& z!8`4A1n=%q={)Y}K(x+KYHvu6by?rYixYy--;aN`f=4aYgsJ2bwoY#J zE(NpUa#jM_#(*8+e6BD%G&Dkn|Cr!c;(y5fbRrd-d%38zsx-?DcDbU;G^xHfpg1*N zC!#Dfn%=HB2p4f);5sFmF2ZF2i(qe8PXC3^6XU(kZyOO+0N&q`qcI4*6wcQ&xvl)w z!a>7+bGV)?*wJw+VfE$OZ}h>pu1mxU)ORwS%`&rXhtaf3%Uha5MReOO>*$kK2O$d} zn#2fDf6_r0;|O%Iza6{@h1CmAxW6`;5P21_ZUthNyYkxzsa_69Kve!y1WA5r5Q3!U zio3uozs>-4k0e*2mnCHtp*;Mk4G&bux29A1)aFAF+o2IQ%`uqzIl7iJo*D)OQ)Sh8 zO0C~=?X4hdZ?p6Zu4HeNBB&W|%iq{m1|J)5QErjn36e&|S*3PIL|d8O5qc^Ww~Tu0 zg07}mR06Q^DpmvD69xUUAkv13cK|x4Er_Td2HXLWQkihasz<&NA}t;o5t1^#r~cN| zdU!%SG5Eb-gfIDPFiRf!^3LTYc)s&KYDvp>pf#*J3ZTjnk}JC2was&95wsR$Rsgiv zAPjJTP-TP!?|}lyeV#jvr-kVdW=KdLfG9E`@7YWY4atmfi~X3ya_3A4$qKoUbQ$tC$(8-CKeJ7sV9t4sp<(0m z+LugO&8_1zHzXI{a9?6Xn#vJGc0nXDn0GNKB|)b*AGKHe=Z@3TU#8tG@9w??l5 zdc>N7J({foIrFL^KD>oAMw|8JXE~MBm+tk~;q@-*@2t^(mX-JuxZ@T`g45`TrmHZyTN8rXprTw=7Q^Nilth?v(1+M9KsdHdY&N&}V#W_}cs$;of^>6O@H5 ztU|G?ncuv>$#~{}o1lP|^Lt4MK3OoqRjB(5hjA+4go3bW(cjGAE5XYnM3;u&5p$V| zLtK%1A=fQjcXL4Jbz~IINp7o~J43FdetUA&!J`qj=0K?8d5fY; zem8x2O_W+`&W;LTzlCDuf`4e~QhTY1JXzMg?{ErbdRK4bPh2pXUgd&nxuy4M$>aE` zGj4@j?whA#P<7OpJu!;)y)}~l+ir=Ir5!ZEJJ=O1%ALE_55JZ`y;L|;*)NFpOVZhg ze`)EfDcgrh-;lgmYS8_6!-IcO0j7CWfVcYVcN%8gObJbLdAoi0AE@RI)mEULWUj^b0xlzv6S(fwl-KPj=Wx3g{?_a(E{z zs!4ZGh`z*m54Lk_9`j|=mselD$Hn|-5YK1dM}^KYM|^*5sPXa8C0gX0@gi=iVXFi_ zqn1X`rR7v}XG`<0(PlfImbWkcb4|3~KO?%n6m1) z$U*uWyhow!y?)mAKLyKjS*AH~1$jq`ao6_jxlI4*Fv3H%+I9ad^`DKMKv$xm*mDji zl;7<_NMjxe-i5YTFf=v5;sLrgWuKm^qZAMvIxc(Px%8~a)NNxJ%=mwxMF5Fghvl7R zrFOGA0Cu>3UZ;WF3JQ@d0YvrnABXZ`rV}on7ByIncEMk+%58^sXx zrj;JF&AzW~q+($1mw%pqIV-hw{XN5>&-q6F?;nqqL~D`+g>2LfeXk{v97BhpIHc=f zLd*I}c0ZDbo?=-^@U1&b-W@$G(?t4^VMNWr*mMU?w_Xr{Jju7Sl-tCvCdJWTAdc({ z$${HLkH@!<_#b>5@VFdl5kh~dQDW@ z856V{^3nJrBqHR%dB)rto|$cpDBrP0Y_VBOLiP*fb}6m8EO%>>Q%igG%`HheQ%i~T zh+b?GG!g<6WptK*=^9nu7GTyE5Py zPVhb1=$ywQpD`Jp2G!n8hyMJ>!Vb2FMoas6#`LhxiPE zJ&7HZ;8h9ZO_#y%;Q-^`{jJNK_6L)fI#|FSHaVL;e`}^FBYsfw|`atr5Oh_d%&k^3|b#GwN1^ zZND@=Y$7af`mp$#Kd)IrQ-RXz=Y{>3Zg)O65YhLdE~S=ulnask_5E)2Gm#GdQ=Cyr zG@|zI78mfPe~G9{r|`33)8tydiC?>^5V! z%G*oEZbGuhX4)~!yZ+qxP(~Hj>`{X(u+CX(pt}`LPcsl0mMYU#{~bS3Hie5j+8RP0 zZRqb2g6rF}Tb`mlI3z*F*nrXizfjO>@NCRoVTl~%Hde6)<@y6hG4E5N=Qr!rl4sVnbWK*cPkm$7>aHfn(AO{6#e zjYTB_Zo@=A2?L004FSN47nj70RgFQy`L*0L5T~+xeNcVulZe@+_2?g5MqFV;#UIi) zN7g)vKaB671sVbCo|lJ=X`Nf%Zr3ie8VDGZpc8#}%RTHHj!Ls`@2+oim>06nviU;R zA(acSw{8#G@4fZ&_w9YI^eKhW;L}@)@$2Pk#W6%Jf9Z434d{Azm{X5|_Ct~Wy4HmR zC0vq2OX(;JmRWx6{ov>l=dRwm7uq_u19{(v(mOe4fnGm+8)B#=wE9PCB}D4Q;S0w4 z?<2LsOF%V6*3Ve5YJtLS*TAO^)vASc4fnU^5{nsIPGrKvrcJcw{0D5<+3hMJC|6jv zWKV8UW4y03#JL1+Zw_B@RLWbBYi(oIGu@%I>!~R6H~6OTD&=6~9zMSITQdC7<>z;Y z^}2Yu{d}OX(+7==!xDp6az0j{?7s2$up)U{r-)NAzK5isS2nL>C+)u$FbUdkizkea zTAOWI=5X#?%=jSyb4RTjo~bbDyXYrts4qK@l3E{3denR#5K9?2y(b0^un4GxFnEe3 zHhA1b^qpugHCQH&B>rMr3E0Iib}zX{W5O1nQHY1~`gY~1Wu66lv2jy(n0-^}eQDy}&f|0fZV#Rond2p$L`nw;Cf!<&NieK zg*Z=wuBGmjDAUzP`Y-OYG$iTuT{S;|dlaL-yUVyh(;6y?XE1kaHvD?#V6w1^EWAwh zWRuH4a88!E;xVG>bEKg*>!}^%!8hKpZ&L|WTA>3bIOII%(K~JI?<+H9#T3zuyFRb& zrMs}-t5l9^|BEhbC=mT96wy=a`+HHhi2Ry_Kms%m!+mt-H3`2SmeY3IyVf-r64omy z3uLz_tWJ_i570^nrsL_PHN{+Xh6-u#1pdW7Rtq=w6{_WAYJB2qfSC;Z1l-OzZrH!gU%ysocG47nHT~2V83VL_YzdZ)f4iW8m^W$@dE-JV7WqVN z+aB@9X$26%zrty}UlTozrLuIg%)fp&52;B#a{6bdvT`{VJVL|-;r7-1(xvM5DT#Px zJRLlgjP9eC&WF1A3;DfoOiRTb_a@r0moPML=~p)ui#Detu38;GfQxmc&-BuLr#RC@ z4o7!(58;_Md_RX4i36?>F9sh8n3s45woZs7ppFt3vVjE(lBfQGth9IJD6_cz*}8AK z40tA*2I%Wt6t24N;^z_{VUZNU&qa;MCpWO8@DoNOn!N(JqFn&H;HmOKss|z6Jw{Oc znX2FYud|RbhWFo>zPQzP{#fvdD#XMeU|-pO7=8IYPuVl^7aUw&RI8B|{sOsqJ$adR z*n9_+aQgfeEFL~IPEW6b&qsuy&qr%V~1wyYr@y~ zeVc%`1hHkfjQHKk%2clbjY%nn2T2+mjP+?hgOg_t9ZZ+}%(2ZDjt`O&EhnR&!+}X| zp>NapFK*~HZv+}s4ZCSN+g6RoQ+p!7A&=zFR<%}`UAyS-J&=D;J>Sl;r*JJKcfOjw zLfdhk7j(+Diim-w*uTtah^TtJt+`0Rs)ljgPaZOw@hFpTI~E7+RS1%`Kc!CYlzP$a z!KydOpt6~mmx7^ygWa(nV~YAgM#VABTI zzkF-kiAm5wL94mf7cOH8Fry>%S{Blr)Ldk_U@`CNN!2$wS-AsPo;GxDbwM^&5OFNMX;*mE zvlGa7Use@*-B-qIDUr;-I_Bfe+qN1h4krV_gJ%QUAQzjj=6Q?gNPpC!Rg)caf}B@@U`Z6~Wv<$gB3IICKHV9Q9W4O`|Y{VWZVe=Qw_pL5vj%4x$qeFZIG zFmFW;YHiRVIi@hIV@@(EzpHQi8vKQ`!Wn!8^#5M`**wc*atS>gwhr1tX@KK+!j3&d zepwMw#hZ)}Hb~T04V%-G2Uy;};0pfb*U>v%K|@>qRqy4Z_|%o%wQ{rfk~_N$lk9V? zpRV}r+umeW7a$iuszpDHyB|7via8Y-a@Pasz!PptqUJ1fFSInYU%X;}&^}WKw$7{e3wOP=OHN6w zb%5hqAKcm^-lSA}sntooa5!~Er3#}>dX)rCyrYA7GJ)tE+|O7lWcOq(KTfZh2Puxs zejGiFXpHfF&0G_tbdpzES#xvw^UmFjL7 z>~HdZTNEE_%p6}Xd$(!H-&OJM>_#|trE#AGBG=wVvfiX@bZ=il7ra}(0K!ke^v~w2 z_#?6(f{g*kLn}&vVMx9y;MgSZswQC+Atzq%@9DO%y>1uR-VZ#@w?Krl+d#jnI z%{E^_&Py@F-jpcl6Z{qG`Iz`d?unu1I5O(HtS-Q{AlRjJM?h;{_VOd_URzVscw@K| z098kqQP7FaE!p{2?V1KNkV(UkruZquJ zM-@WYcW;)y@#K-RPPCG?(rfV96`rhYkeB+2?tbSwfAG~sUY_*)!7BP=!IE(b?=lNx zGM`c3jNj=q?;9oCc=~QwY-jYkuPA5WyaXs%ORtMHZk3~=qzV#zkMZg^$u){(1m-<; zhon?gQnmmQ2D=wfb)Nqhwxia~5%s~Log(4Z@~F~_$vXy*8=r`uAzl+whUH%_@sPKJ z-|lnPFVAd%U;j57&{Hl$bsmO&i~l6oxMdd!)6)w^%p3%U3Okqs_c~^9L9B+7nw@e(oI2$0l9UnRvve`BW3|Aq! z`Ir6J6w9p%3cNIkT_R*5o;$R>Azy}?90W`tdKIx?L@GoOb?L=*JWyPu?U4G-J8L=B zo#j@(D1H0t%#RL_*gD}Y{R3=iWAMV#rg*}iL~0lhuyDlPBSfnW()lPM_`;mj(UP`Y z-E4?Y*t48rBQ*Izj>~YKd7Bgz{zj&{1})zI-pt1I0rcXh0tntR9b$Hu%H%wR=|J1Z zjhh1ea{C4Qap0S2PHYh{K7*CFh_ggIuD*392-qXdTeXV2BBD|qwlO8E;r z->|@M8i`rzs0nGb0Jg;UhbF^=8hWO4U!dReucl@_%)64>@@V~5nP;!Lg1i~U;J-3$ zqb48(?tM{Vtn_=A(kh+b%>E2voM`fF{>{|(h$uvz(CR}47;Ifmwl~TyPKPcAT77I8 z@ZRF@{z-*ao=-tE(j&yH4yMJEjphgHe#Be;Yv4=Z>^t14P1*7Yd3xCP_9SRDZgI!K z;k#RZ0M9zse01WbqT(L@1~~%0YvsJ)OuBwdtZ+fj{r>HFCCEjTrw-2XOz8r$4wc`w zWr;(SQU<%$bJq>*m>+I86IMJOmQ2s*F#pCG8qPs_lpwr|CD-YPtSkSEN{yql?<(s9 zvB*Cy$XTZ3i(#eh#Q)mwC;+y2i-z^9hvi6qvql$MREs6J7@(hP^+!X%UeY1 zU!T7xiG>Vs6+SH$26fK3mOQylbGAbVL!UOX7yEDB^5$q)hzY2^UOP2#JF!e6mg0QTr8yj}s9}AwFK?HA8GF)&P?Ztu7ixKFDLwy6-N|WmA^!q^Hi-Wl{ z>k^mbrB9CE@`I2Mnm;ko2F0n=06!LytlIB^rOf^1~L-YQGtn%9j@@Mj>ZT(w-Eohje=oBPo^ zUspO5Cr2rS+me}8MSNnczx>E=>12-LBzL%~yGpHzbjo}Y*iawQOnt$#TPZ-&`?QD{ zWjc_ZZn_#{Ua)W4`2H84<*w7e$<*R^txjWJsiK$$P93%xWtqgB$@jl9m;-|#r^(Ne zuO@EGLgku;r%tn?cPne3dXZ~f3mVr485%v;K^;e%Gh`M%lu|AIV{59`F{*OF0X`n&(D&VxOY|ZsidM!=$?Cnj@zMqAx zDE_jJY}aMm*N%8OHHTcvQ`4c<(&Qif9L9^P;Ep!klB!CVuCIP5bGCOH*#dh{l@V7~ z`sR7rdBLWK{rrT+*O9_X&E-*Nz2fC{b9(Q7sC~JB5rSgTeI#1xyr~+H*ic2a{#2v> z;k(STuj50ig1)FRk2j}rSA1m(1FH$}k#v)0SJl$*uzbCjZJ|LQ@p%pHi;9G3)LT;s z$TycQ&g0aht)OGgWnN!-qDo+>ry1!196@M%#Yx0mh%ARd^K^5CaKHfdWt&G;qFHX< zmbqFoUD

a9fOV|V<)l2d=}#g{1a&9sjcxvTZm~$Ja?Rx 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 )Y!H_tZ%?+Gg#85SbqH>Aw&EqBh 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�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

s83>W9>l@ZWpvL)^eg~&|J_-P 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 literal 0 HcmV?d00001 diff --git a/luci-app-netdata/Makefile b/luci-app-netdata/Makefile index de3b86671..b82a794bb 100644 --- a/luci-app-netdata/Makefile +++ b/luci-app-netdata/Makefile @@ -1,5 +1,6 @@ # Copyright (C) 2016 Openwrt.org -# +# Copyright (C) 2020-2021 sirpdboy +# https://github.com/sirpdboy/luci-app-netdata for v 1.33.1 cn # This is free software, licensed under the Apache License, Version 2.0 . # @@ -10,9 +11,14 @@ LUCI_DEPENDS:=+netdata LUCI_PKGARCH:=all PKG_NAME:=luci-app-netdata -PKG_VERSION:=1.0 -PKG_RELEASE:=3 +PKG_VERSION:=1.2 +PKG_RELEASE:=20240227 + +define Build/Compile +endef + include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-netdata/README.md b/luci-app-netdata/README.md index e76afbe9a..550bb08ed 100644 --- a/luci-app-netdata/README.md +++ b/luci-app-netdata/README.md @@ -1,31 +1,83 @@ -# luci-app-netdata -1.33.1 汉化(部分) -## 食用方法 -``` -rm -rf ./feeds/luci/applications/luci-app-netdata/ -git clone https://github.com/Jason6111/luci-app-netdata ./feeds/luci/applications/luci-app-netdata/ -``` -也可以用web里文件,覆盖至路径 `/usr/share/netdata/web/` ,请先备份 +### 访问数:[![](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)] [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) - - dashboard_info.js - - dashboard.js - - main.js - - index.html - -已经开启了远程查看权,不需要的手动关闭 -`/root/etc/netdata/netdata.conf` -allow connections from = * -allow dashboard from = * -把这两行第一个*删除即可 -# 如发现luci进不去netdata请尝试 连接ssh进入openwrt输入以下指令 -``` -mkdir /usr/lib/lua/luci/view/netdata -mv -f /usr/lib/lua/luci/view/netdata.htm /usr/lib/lua/luci/view/netdata/netdata.htm +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) -``` +[luci-app-netdata可控制的实时监控 ](https://github.com/sirpdboy/luci-app-netdata) +====================== -# 还原1.33.1(留作以后用) -``` -rm -rf ./feeds/packages/admin/netdata -git clone -b 1.33.1 https://github.com/Jason6111/luci-app-netdata ./feeds/packages/admin/netdata -``` +### 下载源码方法: + + ```Brach + + # 下载源码 + + git clone https://github.com/sirpdboy/luci-app-netdata package/luci-app-netdata + make menuconfig + + ``` +### 配置菜单 + + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-netdata, 保存后退出。 + ``` + +### 编译 + + ```Brach + # 编译固件 + make package/luci-app-netdata/compile V=s + ``` + + +## 界面 +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/netdata1.jpg) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/netdata2.jpg) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-netdata/luasrc/controller/netdata.lua b/luci-app-netdata/luasrc/controller/netdata.lua index 3661c9654..0d89cd333 100644 --- a/luci-app-netdata/luasrc/controller/netdata.lua +++ b/luci-app-netdata/luasrc/controller/netdata.lua @@ -1,10 +1,24 @@ +-- Copyright (C) 2018-2022 sirpdboy https://github.com/sirpdboy/luci-app-netdata +-- Licensed to the public under the Apache License 2.0. + module("luci.controller.netdata", package.seeall) function index() - if not (luci.sys.call("pidof netdata > /dev/null") == 0) then + if not nixio.fs.access("/etc/config/netdata") then return end - local fs = require "nixio.fs" - - entry({"admin", "status", "netdata"}, template("netdata/netdata"), _("NetData"), 10).leaf = true + local e = entry({"admin", "status", "netdata"}, alias("admin", "status", "netdata", "setting"),_("NetData"), 10) + e.dependent = false + e.acl_depends = { "luci-app-netdata" } + entry({"admin", "status", "netdata", "setting"}, cbi("netdata/netdata"), _("Base Setting"), 20).leaf=true + entry({"admin", "status", "netdata", "netdata"}, template("netdata"), _("NetData"), 30).leaf = true + entry({"admin", "status", "netdata_status"}, call("act_status")) +end + +function act_status() + local sys = require "luci.sys" + local e = { } + e.running = sys.call("pidof netdata >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) end diff --git a/luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua b/luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua new file mode 100644 index 000000000..12469e9ae --- /dev/null +++ b/luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua @@ -0,0 +1,25 @@ +-- Copyright 2018-2022 sirpdboy (herboy2008@gmail.com) +-- https://github.com/sirpdboy/luci-app-netdata +require("luci.util") + +local m, s ,o + +m = Map("netdata", translate("NetData"), translate("Netdata is high-fidelity infrastructure monitoring and troubleshooting.Open-source, free, preconfigured, opinionated, and always real-time.")..translate("
For specific usage, see:")..translate("GitHub @sirpdboy/luci-app-netdata ") ) +m:section(SimpleSection).template = "netdata_status" +s = m:section(TypedSection, "netdata", translate("Global Settings")) +s.addremove=false +s.anonymous=true + +o=s:option(Flag,"enabled",translate("Enable")) +o.default=0 + +o=s:option(Value, "port",translate("Set the netdata access port")) +o.datatype="uinteger" +o.default=19999 + +m.apply_on_parse = true +m.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/netdata start") +end + +return m diff --git a/luci-app-netdata/luasrc/model/cgi/netdate.lua b/luci-app-netdata/luasrc/model/cgi/netdate.lua deleted file mode 100644 index 7a7f47d65..000000000 --- a/luci-app-netdata/luasrc/model/cgi/netdate.lua +++ /dev/null @@ -1,25 +0,0 @@ --- Copyright 2022 Jason - -function index() - - -o = Map("netdate", "" .. translate("实时监控") .."", "" .. translate( "强大的实时监控数据,需要中文版请点击:【升级中文版】") .."") - -t = o:section(TypedSection, "netdate") -t.anonymous = true -t.description = translate(string.format("%s

", status)) - -t:tab("base",translate("Basic Settings")) - -e = t:taboption("base", Button, "restart", translate("手动更新")) -e.inputtitle = translate("升级中文版") -e.inputstyle = "reload" -e.write = function() - luci.sys.call("/usr/share/netdata/netdatacn 2>&1 >/dev/null") - luci.http.redirect(luci.dispatcher.build_url("admin","status","netdata")) -end - -t=o:section(TypedSection,"rss_rules",translate("技术支持")) -t.anonymous = true -t:append(Template("feedback")) -return o diff --git a/luci-app-netdata/luasrc/view/netdata.htm b/luci-app-netdata/luasrc/view/netdata.htm new file mode 100644 index 000000000..9fc5496eb --- /dev/null +++ b/luci-app-netdata/luasrc/view/netdata.htm @@ -0,0 +1,33 @@ +<%# + Copyright 2008-2024 by sirpdboy + https://github.com/sirpdboy/luci-app-netdata + Licensed to the public under the Apache License 2.0. +-%> +<% + local running = luci.sys.exec("pidof netdata | awk -F ' ' '{print $1}'") +%> +<%+header%> + +

+ +<% if tonumber(running) ~= nil then %> + + +
+ +<% else %> + +
+ +

<%:The Netdata service is not running.%>

+

<%:Please enable the NetData service%>

+
+<% end -%> + +<%+footer%> diff --git a/luci-app-netdata/luasrc/view/netdata/netdata.htm b/luci-app-netdata/luasrc/view/netdata/netdata.htm deleted file mode 100644 index 47bedac54..000000000 --- a/luci-app-netdata/luasrc/view/netdata/netdata.htm +++ /dev/null @@ -1,16 +0,0 @@ -<%+header%> -
-

<%=translate("NetData")%>

- - - -
- -<%+footer%> diff --git a/luci-app-netdata/luasrc/view/netdata_status.htm b/luci-app-netdata/luasrc/view/netdata_status.htm new file mode 100644 index 000000000..318a02820 --- /dev/null +++ b/luci-app-netdata/luasrc/view/netdata_status.htm @@ -0,0 +1,25 @@ + + +
+ <%:NetData Status%> +

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

+
\ No newline at end of file diff --git a/luci-app-netdata/po/zh-cn/netdata.po b/luci-app-netdata/po/zh-cn/netdata.po index e8966b815..52e2cc894 100644 --- a/luci-app-netdata/po/zh-cn/netdata.po +++ b/luci-app-netdata/po/zh-cn/netdata.po @@ -1,5 +1,32 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" +msgid "Running state" +msgstr "运行状态" + +msgid "The Netdata service is running." +msgstr "NetData服务已启动" + +msgid "The Netdata service is not running." +msgstr "NetData服务未启动" + +msgid "NetData Status" +msgstr "NetData服务状态" + +msgid "Please enable the NetData service" +msgstr "请将NetData服务启用" + msgid "NetData" msgstr "实时监控" + +msgid "Set the netdata access port" +msgstr "设置访问端口" + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Netdata is high-fidelity infrastructure monitoring and troubleshooting.Open-source, free, preconfigured, opinionated, and always real-time." +msgstr "Netdata是高保真的基础设施监控和故障排除。开源、免费、预配置、始终实时." + +msgid "
For specific usage, see:" +msgstr "
具体使用方法参见:" diff --git a/luci-app-netdata/po/zh_Hans b/luci-app-netdata/po/zh_Hans deleted file mode 120000 index 41451e4a1..000000000 --- a/luci-app-netdata/po/zh_Hans +++ /dev/null @@ -1 +0,0 @@ -zh-cn \ No newline at end of file diff --git a/luci-app-netdata/po/zh_Hans/netdata.po b/luci-app-netdata/po/zh_Hans/netdata.po new file mode 100644 index 000000000..52e2cc894 --- /dev/null +++ b/luci-app-netdata/po/zh_Hans/netdata.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "Running state" +msgstr "运行状态" + +msgid "The Netdata service is running." +msgstr "NetData服务已启动" + +msgid "The Netdata service is not running." +msgstr "NetData服务未启动" + +msgid "NetData Status" +msgstr "NetData服务状态" + +msgid "Please enable the NetData service" +msgstr "请将NetData服务启用" + +msgid "NetData" +msgstr "实时监控" + +msgid "Set the netdata access port" +msgstr "设置访问端口" + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Netdata is high-fidelity infrastructure monitoring and troubleshooting.Open-source, free, preconfigured, opinionated, and always real-time." +msgstr "Netdata是高保真的基础设施监控和故障排除。开源、免费、预配置、始终实时." + +msgid "
For specific usage, see:" +msgstr "
具体使用方法参见:" diff --git a/luci-app-netdata/root/etc/config/netdata b/luci-app-netdata/root/etc/config/netdata new file mode 100644 index 000000000..83f9eda99 --- /dev/null +++ b/luci-app-netdata/root/etc/config/netdata @@ -0,0 +1,6 @@ + +config netdata 'netdata' + option logger '1' + option enabled '0' + option port '19990' + diff --git a/luci-app-netdata/root/etc/netdata/apps_groups.conf b/luci-app-netdata/root/etc/netdata/apps_groups.conf deleted file mode 100644 index d326be78f..000000000 --- a/luci-app-netdata/root/etc/netdata/apps_groups.conf +++ /dev/null @@ -1,314 +0,0 @@ -# -# apps.plugin process grouping -# -# The apps.plugin displays charts with information about the processes running. -# This config allows grouping processes together, so that several processes -# will be reported as one. -# -# Only groups in this file are reported. All other processes will be reported -# as 'other'. -# -# For each process given, its whole process tree will be grouped, not just -# the process matched. The plugin will include both parents and childs. -# -# The format is: -# -# group: process1 process2 process3 ... -# -# Each group can be given multiple times, to add more processes to it. -# -# The process names are the ones returned by: -# -# - ps -e or /proc/PID/stat -# - in case of substring mode (see below): /proc/PID/cmdline -# -# To add process names with spaces, enclose them in quotes (single or double) -# example: 'Plex Media Serv' "my other process". -# -# Wildcard support: -# You can add an asterisk (*) at the beginning and/or the end of a process: -# -# *name suffix mode: will search for processes ending with 'name' -# (/proc/PID/stat) -# -# name* prefix mode: will search for processes beginning with 'name' -# (/proc/PID/stat) -# -# *name* substring mode: will search for 'name' in the whole command line -# (/proc/PID/cmdline) -# -# If you enter even just one *name* (substring), apps.plugin will process -# /proc/PID/cmdline for all processes, just once (when they are first seen). -# -# To add processes with single quotes, enclose them in double quotes -# example: "process with this ' single quote" -# -# To add processes with double quotes, enclose them in single quotes: -# example: 'process with this " double quote' -# -# If a group or process name starts with a -, the dimension will be hidden -# (cpu chart only). -# -# If a process starts with a +, debugging will be enabled for it -# (debugging produces a lot of output - do not enable it in production systems) -# -# You can add any number of groups you like. Only the ones found running will -# affect the charts generated. However, producing charts with hundreds of -# dimensions may slow down your web browser. -# -# The order of the entries in this list is important: the first that matches -# a process is used, so put important ones at the top. Processes not matched -# by any row, will inherit it from their parents or children. -# -# The order also controls the order of the dimensions on the generated charts -# (although applications started after apps.plugin is started, will be appended -# to the existing list of dimensions the netdata daemon maintains). - -# ----------------------------------------------------------------------------- -# NETDATA processes accounting - -# netdata main process -netdata: netdata - -# netdata known plugins -# plugins not defined here will be accumulated in netdata, above -apps.plugin: apps.plugin -freeipmi.plugin: freeipmi.plugin -nfacct.plugin: nfacct.plugin -cups.plugin: cups.plugin -xenstat.plugin: xenstat.plugin -perf.plugin: perf.plugin -charts.d.plugin: *charts.d.plugin* -node.d.plugin: *node.d.plugin* -python.d.plugin: *python.d.plugin* -tc-qos-helper: *tc-qos-helper.sh* -fping: fping -ioping: ioping -go.d.plugin: *go.d.plugin* -slabinfo.plugin: slabinfo.plugin -ebpf.plugin: *ebpf.plugin* - -# agent-service-discovery -agent_sd: agent_sd - -# ----------------------------------------------------------------------------- -# authentication/authorization related servers - -auth: radius* openldap* ldap* slapd authelia -fail2ban: fail2ban* - -# ----------------------------------------------------------------------------- -# web/ftp servers - -httpd: apache* httpd nginx* lighttpd hiawatha -proxy: squid* c-icap squidGuard varnish* -php: php* lsphp* -ftpd: proftpd in.tftpd vsftpd -uwsgi: uwsgi -unicorn: *unicorn* -puma: *puma* - -# ----------------------------------------------------------------------------- -# database servers - -sql: mysqld* mariad* postgres* postmaster* oracle_* ora_* sqlservr -nosql: mongod redis* memcached *couchdb* -timedb: prometheus *carbon-cache.py* *carbon-aggregator.py* *graphite/manage.py* *net.opentsdb.tools.TSDMain* influxd* -columndb: clickhouse-server* - -# ----------------------------------------------------------------------------- -# email servers - -email: dovecot imapd pop3d amavis* master zmstat* zmmailboxdmgr qmgr oqmgr saslauthd opendkim clamd freshclam tlsmgr postfwd2 postscreen postfix smtp* lmtp* sendmail - -# ----------------------------------------------------------------------------- -# network, routing, VPN - -ppp: ppp* -vpn: openvpn pptp* cjdroute gvpe tincd -wifi: hostapd wpa_supplicant NetworkManager -routing: ospfd* ospf6d* bgpd bfdd fabricd isisd eigrpd sharpd staticd ripd ripngd pimd pbrd nhrpd ldpd zebra vrrpd vtysh bird* -modem: ModemManager -tor: tor - -# ----------------------------------------------------------------------------- -# high availability and balancers - -camo: *camo* -balancer: ipvs_* haproxy -ha: corosync hs_logd ha_logd stonithd pacemakerd lrmd crmd - -# ----------------------------------------------------------------------------- -# telephony - -pbx: asterisk safe_asterisk *vicidial* -sip: opensips* stund - -# ----------------------------------------------------------------------------- -# chat - -chat: irssi *vines* *prosody* murmurd - -# ----------------------------------------------------------------------------- -# monitoring - -logs: ulogd* syslog* rsyslog* logrotate systemd-journald rotatelogs -nms: snmpd vnstatd smokeping zabbix* monit munin* mon openhpid watchdog tailon nrpe -splunk: splunkd -azure: mdsd *waagent* *omiserver* *omiagent* hv_kvp_daemon hv_vss_daemon *auoms* *omsagent* - -# ----------------------------------------------------------------------------- -# storage, file systems and file servers - -ceph: ceph-* ceph_* radosgw* rbd-* cephfs-* osdmaptool crushtool -samba: smbd nmbd winbindd ctdbd ctdb-* ctdb_* -nfs: rpcbind rpc.* nfs* -zfs: spl_* z_* txg_* zil_* arc_* l2arc* -btrfs: btrfs* -iscsi: iscsid iscsi_eh - -# ----------------------------------------------------------------------------- -# kubernetes - -kubelet: kubelet -kube-dns: kube-dns -kube-proxy: kube-proxy -metrics-server: metrics-server -heapster: heapster - -# ----------------------------------------------------------------------------- -# containers & virtual machines - -containers: lxc* docker* balena* -VMs: vbox* VBox* qemu* - -# ----------------------------------------------------------------------------- -# ssh servers and clients - -ssh: ssh* scp dropbear - -# ----------------------------------------------------------------------------- -# print servers and clients - -print: cups* lpd lpq - -# ----------------------------------------------------------------------------- -# time servers and clients - -time: ntp* systemd-timesyn* chronyd - -# ----------------------------------------------------------------------------- -# dhcp servers and clients - -dhcp: *dhcp* - -# ----------------------------------------------------------------------------- -# name servers and clients - -dns: named unbound nsd pdns_server knotd gdnsd yadifad dnsmasq systemd-resolve* -dnsdist: dnsdist - -# ----------------------------------------------------------------------------- -# installation / compilation / debugging - -build: cc1 cc1plus as gcc* cppcheck ld make cmake automake autoconf autoreconf -build: git gdb valgrind* - -# ----------------------------------------------------------------------------- -# antivirus - -antivirus: clam* *clam imunify360* - -# ----------------------------------------------------------------------------- -# torrent clients - -torrents: *deluge* transmission* *SickBeard* *CouchPotato* *rtorrent* - -# ----------------------------------------------------------------------------- -# backup servers and clients - -backup: rsync lsyncd bacula* borg rclone - -# ----------------------------------------------------------------------------- -# cron - -cron: cron* atd anacron systemd-cron* - -# ----------------------------------------------------------------------------- -# UPS - -ups: upsmon upsd */nut/* - -# ----------------------------------------------------------------------------- -# media players, servers, clients - -media: mplayer vlc xine mediatomb omxplayer* kodi* xbmc* mediacenter eventlircd -media: mpd minidlnad mt-daapd avahi* Plex* jellyfin squeeze* jackett Ombi - -# ----------------------------------------------------------------------------- -# java applications - -hdfsdatanode: *org.apache.hadoop.hdfs.server.datanode.DataNode* -hdfsnamenode: *org.apache.hadoop.hdfs.server.namenode.NameNode* -hdfsjournalnode: *org.apache.hadoop.hdfs.qjournal.server.JournalNode* -hdfszkfc: *org.apache.hadoop.hdfs.tools.DFSZKFailoverController* - -yarnnode: *org.apache.hadoop.yarn.server.nodemanager.NodeManager* -yarnmgr: *org.apache.hadoop.yarn.server.resourcemanager.ResourceManager* -yarnproxy: *org.apache.hadoop.yarn.server.webproxy.WebAppProxyServer* - -sparkworker: *org.apache.spark.deploy.worker.Worker* -sparkmaster: *org.apache.spark.deploy.master.Master* - -hbaseregion: *org.apache.hadoop.hbase.regionserver.HRegionServer* -hbaserest: *org.apache.hadoop.hbase.rest.RESTServer* -hbasethrift: *org.apache.hadoop.hbase.thrift.ThriftServer* -hbasemaster: *org.apache.hadoop.hbase.master.HMaster* - -zookeeper: *org.apache.zookeeper.server.quorum.QuorumPeerMain* - -hive2: *org.apache.hive.service.server.HiveServer2* -hivemetastore: *org.apache.hadoop.hive.metastore.HiveMetaStore* - -solr: *solr.install.dir* - -airflow: *airflow* - -# ----------------------------------------------------------------------------- -# X - -X: X Xorg xinit lightdm xdm pulseaudio gkrellm xfwm4 xfdesktop xfce* Thunar -X: xfsettingsd xfconfd gnome-* gdm gconf* dconf* xfconf* *gvfs gvfs* slim -X: kdeinit* kdm plasmashell -X: evolution-* firefox chromium opera vivaldi-bin epiphany WebKit* -X: '*systemd --user*' chrome *chrome-sandbox* *google-chrome* *chromium* *firefox* - -# ----------------------------------------------------------------------------- -# Kernel / System - -ksmd: ksmd - -system: systemd-* udisks* udevd* *udevd connmand ipv6_addrconf dbus-* rtkit* -system: inetd xinetd mdadm polkitd acpid uuidd packagekitd upowerd colord -system: accounts-daemon rngd haveged - -kernel: kthreadd kauditd lockd khelper kdevtmpfs khungtaskd rpciod -kernel: fsnotify_mark kthrotld deferwq scsi_* - -# ----------------------------------------------------------------------------- -# other application servers - -kafka: *kafka.Kafka* - -rabbitmq: *rabbitmq* - -sidekiq: *sidekiq* -java: java -ipfs: ipfs - -node: node* -factorio: factorio - -p4: p4* - -git-services: gitea gitlab-runner diff --git a/luci-app-netdata/root/etc/netdata/ebpf.conf b/luci-app-netdata/root/etc/netdata/ebpf.conf deleted file mode 100644 index d9b6b9393..000000000 --- a/luci-app-netdata/root/etc/netdata/ebpf.conf +++ /dev/null @@ -1,7 +0,0 @@ -[global] - ebpf load mode = entry - disable apps = no - -[ebpf programs] - process = yes - network viewer = yes diff --git a/luci-app-netdata/root/etc/netdata/exporting.conf b/luci-app-netdata/root/etc/netdata/exporting.conf deleted file mode 100644 index 9c1e7ffb7..000000000 --- a/luci-app-netdata/root/etc/netdata/exporting.conf +++ /dev/null @@ -1,88 +0,0 @@ -[exporting:global] - enabled = no - # send configured labels = yes - # send automatic labels = no - # update every = 10 - -[prometheus:exporter] - # send names instead of ids = yes - # send configured labels = yes - # send automatic labels = no - # send charts matching = * - # send hosts matching = localhost * - # prefix = netdata - -# An example configuration for graphite, json, opentsdb exporting connectors -# [graphite:my_graphite_instance] - # enabled = no - # destination = localhost - # data source = average - # prefix = netdata - # hostname = my_hostname - # update every = 10 - # buffer on failures = 10 - # timeout ms = 20000 - # send names instead of ids = yes - # send charts matching = * - # send hosts matching = localhost * - -# [prometheus_remote_write:my_prometheus_remote_write_instance] - # enabled = no - # destination = localhost - # remote write URL path = /receive - # data source = average - # prefix = netdata - # hostname = my_hostname - # update every = 10 - # buffer on failures = 10 - # timeout ms = 20000 - # send names instead of ids = yes - # send charts matching = * - # send hosts matching = localhost * - -# [kinesis:my_kinesis_instance] - # enabled = no - # destination = us-east-1 - # stream name = netdata - # aws_access_key_id = my_access_key_id - # aws_secret_access_key = my_aws_secret_access_key - # data source = average - # prefix = netdata - # hostname = my_hostname - # update every = 10 - # buffer on failures = 10 - # timeout ms = 20000 - # send names instead of ids = yes - # send charts matching = * - # send hosts matching = localhost * - -# [pubsub:my_pubsub_instance] - # enabled = no - # destination = pubsub.googleapis.com - # credentials file = /etc/netdata/pubsub_credentials.json - # project id = my_project - # topic id = my_topic - # data source = average - # prefix = netdata - # hostname = my_hostname - # update every = 10 - # buffer on failures = 10 - # timeout ms = 20000 - # send names instead of ids = yes - # send charts matching = * - # send hosts matching = localhost * - -# [mongodb:my_mongodb_instance] - # enabled = no - # destination = localhost - # database = my_database - # collection = my_collection - # data source = average - # prefix = netdata - # hostname = my_hostname - # update every = 10 - # buffer on failures = 10 - # timeout ms = 20000 - # send names instead of ids = yes - # send charts matching = * - # send hosts matching = localhost * diff --git a/luci-app-netdata/root/etc/netdata/netdata.conf b/luci-app-netdata/root/etc/netdata/netdata.conf deleted file mode 100644 index 30028497f..000000000 --- a/luci-app-netdata/root/etc/netdata/netdata.conf +++ /dev/null @@ -1,32 +0,0 @@ -# Full configuration can be retrieved from the running -# server at http://localhost:19999/netdata.conf -# -# Example: -# curl -o /etc/netdata/netdata.conf http://localhost:19999/netdata.conf -# - -[global] - update every = 2 - memory deduplication (ksm) = no - debug log = syslog - error log = syslog - access log = none - run as user = root - -[web] - allow connections from = * localhost 10.* 192.168.* 172.16.* 172.17.* 172.18.* 172.19.* 172.20.* 172.21.* 172.22.* 172.23.* 172.24.* 172.25.* 172.26.* 172.27.* 172.28.* 172.29.* 172.30.* 172.31.* - allow dashboard from = * localhost 10.* 192.168.* 172.16.* 172.17.* 172.18.* 172.19.* 172.20.* 172.21.* 172.22.* 172.23.* 172.24.* 172.25.* 172.26.* 172.27.* 172.28.* 172.29.* 172.30.* 172.31.* - -[plugins] - cgroups = no - apps = no - charts.d = no - fping = no - node.d = no - python.d = no - -[health] - enabled = no - -[plugin:proc:ipc] - shared memory totals = no diff --git a/luci-app-netdata/root/etc/netdata/stream.conf b/luci-app-netdata/root/etc/netdata/stream.conf deleted file mode 100644 index b5142632d..000000000 --- a/luci-app-netdata/root/etc/netdata/stream.conf +++ /dev/null @@ -1,205 +0,0 @@ -# netdata configuration for aggregating data from remote hosts -# -# API keys authorize a pair of sending-receiving netdata servers. -# Once their communication is authorized, they can exchange metrics for any -# number of hosts. -# -# You can generate API keys, with the linux command: uuidgen - - -# ----------------------------------------------------------------------------- -# 1. ON CHILD NETDATA - THE ONE THAT WILL BE SENDING METRICS - -[stream] - # Enable this on child nodes, to have them send metrics. - enabled = no - - # Where is the receiving netdata? - # A space separated list of: - # - # [PROTOCOL:]HOST[%INTERFACE][:PORT][:SSL] - # - # If many are given, the first available will get the metrics. - # - # PROTOCOL = tcp, udp, or unix (only tcp and unix are supported by parent nodes) - # HOST = an IPv4, IPv6 IP, or a hostname, or a unix domain socket path. - # IPv6 IPs should be given with brackets [ip:address] - # INTERFACE = the network interface to use (only for IPv6) - # PORT = the port number or service name (/etc/services) - # SSL = when this word appear at the end of the destination string - # the Netdata will encrypt the connection with the parent. - # - # This communication is not HTTP (it cannot be proxied by web proxies). - destination = - - # Skip Certificate verification? - # - # The netdata child is configurated to avoid invalid SSL/TLS certificate, - # so certificates that are self-signed or expired will stop the streaming. - # Case the server certificate is not valid, you can enable the use of - # 'bad' certificates setting the next option as 'yes'. - # - #ssl skip certificate verification = yes - - # Certificate Authority Path - # - # OpenSSL has a default directory where the known certificates are stored, - # case it is necessary it is possible to change this rule using the variable - # "CApath" - # - #CApath = /etc/ssl/certs/ - - # Certificate Authority file - # - # When the Netdata parent has certificate, that is not recognized as valid, - # we can add this certificate in the list of known certificates in CApath - # and give for Netdata as argument. - # - #CAfile = /etc/ssl/certs/cert.pem - - # The API_KEY to use (as the sender) - api key = - - # The timeout to connect and send metrics - timeout seconds = 60 - - # If the destination line above does not specify a port, use this - default port = 19999 - - # filter the charts to be streamed - # netdata SIMPLE PATTERN: - # - space separated list of patterns (use \ to include spaces in patterns) - # - use * as wildcard, any number of times within each pattern - # - prefix a pattern with ! for a negative match (ie not stream the charts it matches) - # - the order of patterns is important (left to right) - # To send all except a few, use: !this !that * (ie append a wildcard pattern) - send charts matching = * - - # The buffer to use for sending metrics. - # 1MB is good for 10-20 seconds of data, so increase this if you expect latencies. - # The buffer is flushed on reconnects (this will not prevent gaps at the charts). - buffer size bytes = 1048576 - - # If the connection fails, or it disconnects, - # retry after that many seconds. - reconnect delay seconds = 5 - - # Sync the clock of the charts for that many iterations, when starting. - initial clock resync iterations = 60 - -# ----------------------------------------------------------------------------- -# 2. ON PARENT NETDATA - THE ONE THAT WILL BE RECEIVING METRICS - -# You can have one API key per child, -# or the same API key for all child nodes. -# -# netdata searches for options in this order: -# -# a) parent netdata settings (netdata.conf) -# b) [stream] section (above) -# c) [API_KEY] section (below, settings for the API key) -# d) [MACHINE_GUID] section (below, settings for each machine) -# -# You can combine the above (the more specific setting will be used). - -# API key authentication -# If the key is not listed here, it will not be able to push metrics. - -# [API_KEY] is [YOUR-API-KEY], i.e [11111111-2222-3333-4444-555555555555] -[API_KEY] - # Default settings for this API key - - # You can disable the API key, by setting this to: no - # The default (for unknown API keys) is: no - enabled = no - - # A list of simple patterns matching the IPs of the servers that - # will be pushing metrics using this API key. - # The metrics are received via the API port, so the same IPs - # should also be matched at netdata.conf [web].allow connections from - allow from = * - - # The default history in entries, for all hosts using this API key. - # You can also set it per host below. - # If you don't set it here, the history size of the central netdata - # will be used. - default history = 3600 - - # The default memory mode to be used for all hosts using this API key. - # You can also set it per host below. - # If you don't set it here, the memory mode of netdata.conf will be used. - # Valid modes: - # save save on exit, load on start - # map like swap (continuously syncing to disks - you need SSD) - # ram keep it in RAM, don't touch the disk - # none no database at all (use this on headless proxies) - # dbengine like a traditional database - default memory mode = ram - - # Shall we enable health monitoring for the hosts using this API key? - # 3 possible values: - # yes enable alarms - # no do not enable alarms - # auto enable alarms, only when the sending netdata is connected. For ephemeral child nodes or child system restarts, - # ensure that the netdata process on the child is gracefully stopped, to prevent invalid last_collected alarms - # You can also set it per host, below. - # The default is taken from [health].enabled of netdata.conf - health enabled by default = auto - - # postpone alarms for a short period after the sender is connected - default postpone alarms on connect seconds = 60 - - # need to route metrics differently? set these. - # the defaults are the ones at the [stream] section (above) - #default proxy enabled = yes | no - #default proxy destination = IP:PORT IP:PORT ... - #default proxy api key = API_KEY - #default proxy send charts matching = * - - -# ----------------------------------------------------------------------------- -# 3. PER SENDING HOST SETTINGS, ON PARENT NETDATA -# THIS IS OPTIONAL - YOU DON'T HAVE TO CONFIGURE IT - -# This section exists to give you finer control of the parent settings for each -# child host, when the same API key is used by many netdata child nodes / proxies. -# -# Each netdata has a unique GUID - generated the first time netdata starts. -# You can find it at /var/lib/netdata/registry/netdata.public.unique.id -# (at the child). -# -# The host sending data will have one. If the host is not ephemeral, -# you can give settings for each sending host here. - -[MACHINE_GUID] - # enable this host: yes | no - # When disabled, the parent will not receive metrics for this host. - # THIS IS NOT A SECURITY MECHANISM - AN ATTACKER CAN SET ANY OTHER GUID. - # Use only the API key for security. - enabled = no - - # A list of simple patterns matching the IPs of the servers that - # will be pushing metrics using this MACHINE GUID. - # The metrics are received via the API port, so the same IPs - # should also be matched at netdata.conf [web].allow connections from - # and at stream.conf [API_KEY].allow from - allow from = * - - # The number of entries in the database - history = 3600 - - # The memory mode of the database: save | map | ram | none | dbengine - memory mode = save - - # Health / alarms control: yes | no | auto - health enabled = yes - - # postpone alarms when the sender connects - postpone alarms on connect seconds = 60 - - # need to route metrics differently? - # the defaults are the ones at the [API KEY] section - #proxy enabled = yes | no - #proxy destination = IP:PORT IP:PORT ... - #proxy api key = API_KEY - #proxy send charts matching = * diff --git a/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata b/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata index 83bf1cd80..6c86c538a 100644 --- a/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata +++ b/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata @@ -1,8 +1,11 @@ #!/bin/sh +[ -f /usr/share/netdata/webcn/netdata.conf ] && mv -f /usr/share/netdata/webcn/netdata.conf /etc/netdata/netdata.conf +[ -f /usr/share/netdata/webcn/netdata ] && mv -f /usr/share/netdata/webcn/netdata /etc/config/netdata [ -f /usr/share/netdata/webcn/dashboard.js ] && mv -f /usr/share/netdata/webcn/dashboard.js /usr/share/netdata/web/dashboard.js [ -f /usr/share/netdata/webcn/dashboard_info.js ] && mv -f /usr/share/netdata/webcn/dashboard_info.js /usr/share/netdata/web/dashboard_info.js [ -f /usr/share/netdata/webcn/main.js ] && mv -f /usr/share/netdata/webcn/main.js /usr/share/netdata/web/main.js [ -f /usr/share/netdata/webcn/index.html ] && mv -f /usr/share/netdata/webcn/index.html /usr/share/netdata/web/index.html - +[ -f /usr/share/netdata/webcn/netdata.init ] && mv -f /usr/share/netdata/webcn/netdata.init /etc/init.d/netdata rm -rf /tmp/luci-modulecache /tmp/luci-indexcache* +chmod +x /etc/init.d/netdata exit 0 diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js b/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js index 9642d3ac0..1065e771e 100644 --- a/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js +++ b/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -// 时间 By Jason + // DO NOT EDIT: This file is automatically generated from the source files in src/ // ---------------------------------------------------------------------------- @@ -142,18 +142,18 @@ NETDATA.zeropad = function (x) { NETDATA.seconds4human = function (seconds, options) { let defaultOptions = { - now: '现在', + now: 'now', space: ' ', - negative_suffix: '前', - day: '日', - days: '日', - hour: '小时', - hours: '小时', - minute: '分钟', - minutes: '分钟', - second: '秒', - seconds: '秒', - and: '及' + negative_suffix: 'ago', + day: 'day', + days: 'days', + hour: 'hour', + hours: 'hours', + minute: 'min', + minutes: 'mins', + second: 'sec', + seconds: 'secs', + and: 'and' }; if (typeof options !== 'object') { diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/dashboard_info.js b/luci-app-netdata/root/usr/share/netdata/webcn/dashboard_info.js index 08dcafbca..c4e55fa2d 100644 --- a/luci-app-netdata/root/usr/share/netdata/webcn/dashboard_info.js +++ b/luci-app-netdata/root/usr/share/netdata/webcn/dashboard_info.js @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -// 翻译 By Jason + // Codacy declarations /* global NETDATA */ @@ -12,7 +12,7 @@ var netdataDashboard = window.netdataDashboard || {}; netdataDashboard.menu = { 'system': { - title: '系统概览', + title: '系统概观', icon: '', info: '一眼掌握系统效能关键指标。' }, @@ -20,46 +20,31 @@ netdataDashboard.menu = { 'services': { title: '系统服务', icon: '', - info: '系统服务的使用情况。 '+ - 'netdata 以 CGROUPS 监视所有系统服务。 '+ - 'cgroups ' + - '(the resources accounting used by containers).' + info: '系统服务的使用情况。netdata 以 CGROUPS 监视所有系统服务。' }, 'ap': { - title: 'AP接入点', + title: '接入点', icon: '', - info: '系统上找到的接入点(即AP模式下的无线接口)的指标。' + info: '在系统上找到的接入点(即AP模式下的无线接口)的性能指标.' }, 'tc': { - title: 'Quality服务', + title: '服务质量', icon: '', - info: 'Netdata使用其收集和可视化tc类利用率 ' + - 'Tc-helper插件. ' + - '如果您也使用FireQOS来设置QoS, ' + - 'Netdata会自动收集接口和类名。如果您的QoS配置包含间接费用 ' + - '计算,这里显示的值将包括这些开销(相同的总带宽 ' + - '“网络接口”部分中报告的接口将低于总带宽 ' + - '这里报告了)。与界面相比,QoS数据收集可能略有时差 ' + - '(QoS数据收集使用BASH脚本,因此数据收集的转移几毫秒 ' + - '应该有正当理由)。' + info: 'Netdata收集和可视化tc 使用its的类利用率 ' }, 'net': { title: '网络接口', icon: '', - info: '

运转 网路介面的效能指标。.

'+ - '

Netdata检索读取/proc/net/dev文件和/sys/class/net/目录的数据。

' + info: '网路介面的效能指标。' }, 'Infiniband': { title: 'Infiniband端口', icon: '', - info: '

绩效和例外统计 '+ - 'Infiniband 端口。 '+ - '单个端口和硬件计数器描述可以在 '+ - 'Mellanox知识库.' + info: '

性能和异常统计信息

' }, 'wireless': { @@ -73,9 +58,9 @@ netdataDashboard.menu = { icon: '', info: function (os) { if (os === "linux") - return '系统网络堆栈的指标。这些指标从/proc/net/netstat收集,或将kprobes附加到内核函数,适用于IPv4和IPv6流量,并与内核网络堆栈的操作有关。'; + return 'Metrics for the networking stack of the system. These metrics are collected from /proc/net/netstat or attaching kprobes to kernel functions, apply to both IPv4 and IPv6 traffic and are related to operation of the kernel networking stack.'; else - return '系统网络堆栈的指标。'; + return 'Metrics for the networking stack of the system.'; } }, @@ -83,43 +68,43 @@ netdataDashboard.menu = { title: 'IPv4网路', icon: '', info: 'IPv4效能指标。' + - 'Internet Protocol version 4 (IPv4) 是 ' + - '互联网协议(IP)的第四版。它是基于标准的核心协议之一 ' + - '互联网上的互联网工作方法。IPv4是一种用于数据包交换的无连接协议' + - '网络。它以最佳努力交付模式运作,因为它不保证交付,也不保证交付 ' + - '它确保正确的顺序或避免重复交付。这些方面,包括数据完整性,' + - '由上层传输协议(如传输控制协议(TCP))解决。' + 'Internet Protocol version 4 (IPv4) is ' + + 'the fourth version of the Internet Protocol (IP). It is one of the core protocols of standards-based ' + + 'internetworking methods in the Internet. IPv4 is a connectionless protocol for use on packet-switched ' + + 'networks. It operates on a best effort delivery model, in that it does not guarantee delivery, nor does ' + + 'it assure proper sequencing or avoidance of duplicate delivery. These aspects, including data integrity, ' + + 'are addressed by an upper layer transport protocol, such as the Transmission Control Protocol (TCP).' }, 'ipv6': { title: 'IPv6网路', icon: '', - info: 'IPv6效能指标。 Internet Protocol version 6 (IPv6) 是互联网协议(IP)的最新版本,该通信协议为网络上的计算机和跨互联网的路由流量提供识别和定位系统。IPv6是由互联网工程特别工作组(IETF)开发的,旨在处理长期预计的IPv4地址用尽问题。IPv6旨在取代IPv4。' + info: 'IPv6效能指标。 Internet Protocol version 6 (IPv6) is the most recent version of the Internet Protocol (IP), the communications protocol that provides an identification and location system for computers on networks and routes traffic across the Internet. IPv6 was developed by the Internet Engineering Task Force (IETF) to deal with the long-anticipated problem of IPv4 address exhaustion. IPv6 is intended to replace IPv4.' }, 'sctp': { title: 'SCTP 网路', icon: '', - info: '

流控传输协议(SCTP) '+ - '是一种计算机网络协议,在传输层运行,其作用类似于流行的 '+ - '协议TCP和UDP。SCTP提供了UDP和TCP的一些功能:它像UDP一样面向消息 '+ - '并确保具有TCP等拥塞控制的消息的可靠、无序传输。 '+ - '它与这些协议不同,它提供了多寻址和冗余路径,以提高弹性和可靠性。

'+ - '

Netdata收集读取/proc/net/sctp/snmp文件的SCTP指标。

' + info: '

Stream Control Transmission Protocol (SCTP) '+ + 'is a computer network protocol which operates at the transport layer and serves a role similar to the popular '+ + 'protocols TCP and UDP. SCTP provides some of the features of both UDP and TCP: it is message-oriented like UDP '+ + 'and ensures reliable, in-sequence transport of messages with congestion control like TCP. '+ + 'It differs from those protocols by providing multi-homing and redundant paths to increase resilience and reliability.

'+ + '

Netdata collects SCTP metrics reading the /proc/net/sctp/snmp file.

' }, 'ipvs': { - title: 'IP 虚拟服务器', + title: 'IP虚拟服务器', icon: '', info: '

IPVS (IP Virtual Server) '+ - '在Linux内核内实现传输层负载平衡,即所谓的第4层切换。 '+ - '在主机上运行的IPVS在一组真实服务器的前部充当负载平衡器, '+ - '它可以将基于TCP/UDP的服务请求定向到真正的服务器, '+ - '并使真实服务器的服务在单个IP地址上显示为虚拟服务。

'+ - '

Netdata收集摘要统计数据,阅读/proc/net/ip_vs_stats。 '+ - '要显示服务及其服务器的统计信息,请运行ipvsadm -Ln --stats '+ - '或ipvsadm -Ln --rate用于费率统计。'+ - '有关详细信息,请参阅 ipvsadm(8).

' + 'implements transport-layer load balancing inside the Linux kernel, so called Layer-4 switching. '+ + 'IPVS running on a host acts as a load balancer at the front of a cluster of real servers, '+ + 'it can direct requests for TCP/UDP based services to the real servers, '+ + 'and makes services of the real servers to appear as a virtual service on a single IP address.

'+ + '

Netdata collects summary statistics, reading /proc/net/ip_vs_stats. '+ + 'To display the statistics information of services and their servers, run ipvsadm -Ln --stats '+ + 'or ipvsadm -Ln --rate for the rate statistics. '+ + 'For details, see ipvsadm(8).

' }, 'netfilter': { @@ -137,7 +122,7 @@ netdataDashboard.menu = { 'cpu': { title: 'CPUs', icon: '', - info: '系统中每一个 CPU 的详细资讯。全部 CPU 的总量可以到 系统概览 区段查看。' + info: '系统中每一个 CPU 的详细资讯。全部 CPU 的总量可以到 系统概观 区段查看。' }, 'mem': { @@ -149,117 +134,101 @@ netdataDashboard.menu = { 'disk': { title: '磁碟', icon: '', - info: '系统中所有磁碟效能资讯图表。特别留意:这是以 iostat -x所取得的效能数据做为呈现。在预设情况下,netdata 不会显示单一分割区与未挂载的虚拟磁碟效能图表。若仍想要显示,可以修改 netdata 设定档中的相关设定。' + info: '系统中所有磁碟效能资讯图表。特别留意:这是以 iostat -x 所取得的效能数据做为呈现。在预设情况下,netdata 不会显示单一分割区与未挂载的虚拟磁碟效能图表。若仍想要显示,可以修改 netdata 设定档中的相关设定。' }, 'mount': { - title: 'Mount Points', + title: '装载点', icon: '', info: '' }, 'mdstat': { - title: 'MD arrays', + title: 'MD阵列', icon: '', - info: '

RAID 设备是由两个或更多真实块设备创建的虚拟设备。 '+ - 'Linux软件RAID设备是 '+ - '通过md(多设备)设备驱动程序实现。

'+ - '

Netdata监控MD数组的当前状态,读取/proc/mdstat和 '+ - '/sys/block/%s/md/mismatch_cnt 档案

' + info: '

RAID设备是由两个或多个实块设备创建的虚拟设备。

' }, 'sensors': { - title: '感测器', + title: '传感器', icon: '', - info: '系统已配置相关感测器的读数。' + info: '配置的系统传感器读数.' }, 'ipmi': { title: 'IPMI', icon: '', - info: '智能平台管理接口(IPMI)是一套自主计算机子系统的计算机接口规范,独立于主机系统的CPU、固件(BIOS或UEFI)和操作系统提供管理和监控功能。' + info: 'The Intelligent Platform Management Interface (IPMI) is a set of computer interface specifications for an autonomous computer subsystem that provides management and monitoring capabilities independently of the host system\'s CPU, firmware (BIOS or UEFI) and operating system.' }, 'samba': { title: 'Samba', icon: '', - info: '此系统的Samba文件共享操作的绩效指标。Samba是Windows服务的实现,包括Windows SMB协议文件共享。' + info: 'Performance metrics of the Samba file share operations of this system. Samba is a implementation of Windows services, including Windows SMB protocol file shares.' }, 'nfsd': { title: 'NFS服器器', icon: '', - info: '网络文件服务器的绩效指标。 '+ + info: 'Performance metrics of the Network File Server. '+ 'NFS '+ - '是一种分布式文件系统协议,允许客户端计算机上的用户通过网络访问文件, '+ - '就像访问本地存储一样。 '+ - '与许多其他协议一样,NFS基于开放网络计算远程过程调用(ONC RPC)系统。' + 'is a distributed file system protocol, allowing a user on a client computer to access files over a network, '+ + 'much like local storage is accessed. '+ + 'NFS, like many other protocols, builds on the Open Network Computing Remote Procedure Call (ONC RPC) system.' }, 'nfs': { title: 'NFS客户端', icon: '', - info: '绩效指标 '+ - 'NFS '+ - '该系统作为NFS客户端的操作。' + info: '显示本机做为 NFS 客户端的效能指标。' }, 'zfs': { title: 'ZFS文件系统', icon: '', - info: '绩效指标 '+ - 'ZFS ARC and L2ARC. '+ - 'ZFS档案系统的效能指标。以下图表呈现来自 '+ - 'arcstat.py 与 '+ - 'arc_summary.py的效能数据。' + info: 'ZFS档案系统的效能指标。以下图表呈现来自 arcstat.pyarc_summary.py 的效能数据。' }, 'zfspool': { - title: 'ZFS pools', + title: 'ZFS提供', icon: '', - info: 'ZFS的状态。' + info: 'ZFS池的状态。' }, 'btrfs': { title: 'BTRFS文件系统', icon: '', - info: 'BTRFS 档案系统磁碟空间使用指标。' + info: 'BTRFS文件系统的磁盘空间指标。' }, 'apps': { title: '应用程序', icon: '', - info: '每个应用程序的统计数据使用 '+ - 'apps.plugin. '+ - '这个插件会浏览所有流程,并汇总 '+ - 'application groups. '+ - '该插件还计算退出子项的资源。 '+ - '因此,对于shell脚本等进程,报告的值包括命令使用的资源 '+ - '这些脚本在每个时间范围内运行。', + info: '使用收集每个应用程序的统计信息', height: 1.5 }, 'groups': { title: '用户组', icon: '', - info: '每个用户组的统计数据使用 '+ + info: 'Per user group statistics are collected using '+ 'apps.plugin. '+ - '此插件浏览所有流程,并汇总每个用户组的统计数据。 '+ - '该插件还计算退出子项的资源。 '+ - '因此,对于shell脚本等进程,报告的值包括命令使用的资源 '+ - '这些脚本在每个时间范围内运行。', + 'This plugin walks through all processes and aggregates statistics per user group. '+ + 'The plugin also counts the resources of exited children. '+ + 'So for processes like shell scripts, the reported values include the resources used by the commands '+ + 'these scripts run within each timeframe.', height: 1.5 }, 'users': { title: '用户', icon: '', - info: '每个用户的统计数据是使用 '+ + info: 'Per user statistics are collected using '+ 'apps.plugin. '+ - '此插件浏览所有流程,并汇总每个用户的统计数据。 '+ - '该插件还计算退出子项的资源。 '+ - '因此,对于shell脚本等进程,报告的值包括命令使用的资源 '+ - '这些脚本在每个时间范围内运行。', + 'This plugin walks through all processes and aggregates statistics per user. '+ + 'The plugin also counts the resources of exited children. '+ + 'So for processes like shell scripts, the reported values include the resources used by the commands '+ + 'these scripts run within each timeframe.', height: 1.5 }, @@ -282,7 +251,7 @@ netdataDashboard.menu = { 'cgroup': { title: '', icon: '', - info: '容器资源使用率指标。netdata 从 cgroups (abbreviated from control groups 的缩写)中读取这些资讯,cgroups 是 Linux 核心的一个功能,做限制与计算程序集中的资源使用率 (CPU、记忆体、磁碟 I/O、网路...等等)。cgroupsnamespaces (程序之间的隔离) 结合提供了我们所说的:容器。' + info: '容器资源使用率指标。netdata 从 cgroups (control groups 的缩写) 中读取这些资讯,cgroups 是 Linux 核心的一个功能,做限制与计算程序集中的资源使用率 (CPU、记忆体、磁碟 I/O、网路...等等)。cgroupsnamespaces (程序之间的隔离) 结合提供了我们所说的:容器。' }, 'cgqemu': { @@ -294,98 +263,98 @@ netdataDashboard.menu = { 'fping': { title: 'fping', icon: '', - info: '网络延迟统计,通过fpingfping是一个向网络主机发送ICMP回声探针的程序,类似于ping,但在ping多个主机时性能要好得多。3.15之后的fping版本可以直接用作netdata插件。' + info: 'Network latency statistics, via fping. fping is a program to send ICMP echo probes to network hosts, similar to ping, but much better performing when pinging multiple hosts. fping versions after 3.15 can be directly used as netdata plugins.' }, 'gearman': { title: 'Gearman', icon: '', - info: 'Gearman是一个工作服务器,允许您并行工作,加载平衡处理,并在语言之间调用函数。' + info: 'Gearman is a job server that allows you to do work in parallel, to load balance processing, and to call functions between languages.' }, 'ioping': { title: 'ioping', icon: '', - info: '磁盘延迟统计,通过iopingioping是一个从/到磁盘读取/写入数据探针的程序。' + info: 'Disk latency statistics, via ioping. ioping is a program to read/write data probes from/to a disk.' }, 'httpcheck': { title: 'Http Check', icon: '', - info: '使用HTTP检查进行Web服务可用性和延迟监控。此插件是端口检查插件的专用版本。' + info: 'Web Service availability and latency monitoring using HTTP checks. This plugin is a specialized version of the port check plugin.' }, 'memcached': { title: 'memcached', icon: '', - info: 'memcached的绩效指标。Memcached是一个通用的分布式内存缓存系统。它通常用于通过在RAM中缓存数据和对象来加快动态数据库驱动的网站,以减少外部数据源(如数据库或API)必须读取的次数。' + info: 'Performance metrics for memcached. Memcached is a general-purpose distributed memory caching system. It is often used to speed up dynamic database-driven websites by caching data and objects in RAM to reduce the number of times an external data source (such as a database or API) must be read.' }, 'monit': { title: 'monit', icon: '', - info: 'monit中的检查状态。Monit是一个用于管理和监控Unix系统上的流程、程序、文件、目录和文件系统的实用工具。Monit进行自动维护和维修,并在错误情况下执行有意义的因果行为。' + info: 'Statuses of checks in monit. Monit is a utility for managing and monitoring processes, programs, files, directories and filesystems on a Unix system. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.' }, 'mysql': { title: 'MySQL', icon: '', - info: '开源关系数据库管理系统(RDBMS)mysql的绩效指标。' + info: 'Performance metrics for mysql, the open-source relational database management system (RDBMS).' }, 'postgres': { title: 'Postgres', icon: '', - info: '对象关系数据库(ORDBMS)PostgresSQL的性能指标。' + info: 'Performance metrics for PostgresSQL, the object-relational database (ORDBMS).' }, 'redis': { title: 'Redis', icon: '', - info: 'redis的绩效指标。Redis(远程字典服务器)是一个实现数据结构服务器的软件项目。它是开源的、联网的、内存的,并存储具有可选耐用性的密钥。' + info: 'Performance metrics for redis. Redis (REmote DIctionary Server) is a software project that implements data structure servers. It is open-source, networked, in-memory, and stores keys with optional durability.' }, 'rethinkdbs': { title: 'RethinkDB', icon: '', - info: 'rethinkdb的绩效指标。RethinkDB是第一个为实时应用程序构建的开源可扩展数据库' + info: 'Performance metrics for rethinkdb. RethinkDB is the first open-source scalable database built for realtime applications' }, 'retroshare': { title: 'RetroShare', icon: '', - info: 'RetroShare的绩效指标。RetroShare是基于基于GNU隐私保护(GPG)的朋友对朋友网络的加密文件共享、无服务器电子邮件、即时消息、在线聊天和BBS的开源软件。' + info: 'Performance metrics for RetroShare. RetroShare is open source software for encrypted filesharing, serverless email, instant messaging, online chat, and BBS, based on a friend-to-friend network built on GNU Privacy Guard (GPG).' }, 'riakkv': { title: 'Riak KV', icon: '', - info: 'Riak KV的指标,分布式键值存储。' + info: 'Metrics for Riak KV, the distributed key-value store.' }, 'ipfs': { title: 'IPFS', icon: '', - info: 'InterPlanetary File System(IPFS)的绩效指标,IPFS是一种内容可寻址的点对点超媒体分发协议。' + info: 'Performance metrics for the InterPlanetary File System (IPFS), a content-addressable, peer-to-peer hypermedia distribution protocol.' }, 'phpfpm': { title: 'PHP-FPM', icon: '', - info: 'PHP-FPM的绩效指标,PHP的替代FastCGI实现。' + info: 'Performance metrics for PHP-FPM, an alternative FastCGI implementation for PHP.' }, 'pihole': { title: 'Pi-hole', icon: '', - info: 'Pi-hole的指标,一个互联网广告的黑洞。' + - ' Pi-Hole API返回的指标都来自过去24小时。' + info: 'Metrics for Pi-hole, a black hole for Internet advertisements.' + + ' The metrics returned by Pi-Hole API is all from the last 24 hours.' }, 'portcheck': { - title: '端口检查', + title: 'Port Check', icon: '', - info: '使用端口检查来监控服务可用性和延迟。' + info: 'Service availability and latency monitoring using port checks.' }, 'postfix': { @@ -427,7 +396,7 @@ netdataDashboard.menu = { 'web_log': { title: undefined, icon: '', - info: '从服务器日志文件中提取的信息。web_log插件逐步解析服务器日志文件,以实时提供关键服务器性能指标的细分。对于Web服务器,可以选择使用扩展日志文件格式(对于nginxapache),为请求和响应提供计时信息和带宽。web_log插件也可以配置为按URL模式提供请求的细分(检查/etc/netdata/python.d/web_log.conf)。' + info: 'Information extracted from a server log file. web_log plugin incrementally parses the server log file to provide, in real-time, a break down of key server performance metrics. For web servers, an extended log file format may optionally be used (for nginx and apache) offering timing information and bandwidth for both requests and responses. web_log plugin may also be configured to provide a break down of requests per URL pattern (check /etc/netdata/python.d/web_log.conf).' }, 'named': { @@ -481,47 +450,47 @@ netdataDashboard.menu = { 'go_expvar': { title: 'Go - expvars', icon: '', - info: 'expvar软件包 公开的运行Go应用程序的统计数据。' + info: 'Statistics about running Go applications exposed by the expvar package.' }, 'chrony': { icon: '', - info: '关于系统时钟性能的计时参数。' + info: 'chronyd parameters about the system’s clock performance.' }, 'couchdb': { icon: '', - info: 'CouchDB的性能指标,该数据库是基于JSON文档的开源数据库,具有HTTP API和多主复制。' + info: 'Performance metrics for CouchDB, the open-source, JSON document-based database with an HTTP API and multi-master replication.' }, 'beanstalk': { title: 'Beanstalkd', icon: '', - info: '使用从beanstalkc提取的数据提供有关beanstalkd服务器和该服务器上可用的任何管道的统计数据' + info: 'Provides statistics on the beanstalkd server and any tubes available on that server using data pulled from beanstalkc' }, 'rabbitmq': { title: 'RabbitMQ', icon: '', - info: 'RabbitMQ开源消息代理的性能数据。' + info: 'Performance data for the RabbitMQ open-source message broker.' }, 'ceph': { title: 'Ceph', icon: '', - info: '提供ceph集群服务器的统计数据,开源分布式存储系统。' + info: 'Provides statistics on the ceph cluster server, the open-source distributed storage system.' }, 'ntpd': { title: 'ntpd', icon: '', - info: '提供网络时间协议守护程序ntpd的内部变量的统计信息,并可选包括配置的对等变量(如果在模块配置中启用)。本模块介绍了ntpq(标准NTP查询程序)所示的绩效指标,使用NTP模式6个UDP数据包与NTP服务器通信。' + info: 'Provides statistics for the internal variables of the Network Time Protocol daemon ntpd and optional including the configured peers (if enabled in the module configuration). The module presents the performance metrics as shown by ntpq (the standard NTP query program) using NTP mode 6 UDP packets to communicate with the NTP server.' }, 'spigotmc': { title: 'Spigot MC', icon: '', - info: '为Spigot Minecraft服务器提供基本性能统计信息。' + info: 'Provides basic performance statistics for the Spigot Minecraft server.' }, 'unbound': { @@ -533,13 +502,13 @@ netdataDashboard.menu = { 'boinc': { title: 'BOINC', icon: '', - info: '为BOINC分布式计算客户端提供任务计数。' + info: 'Provides task counts for BOINC distributed computing clients.' }, 'w1sensor': { title: '1-Wire Sensors', icon: '', - info: '来自1-Wire传感器的数据。目前会自动检测到温度传感器。' + info: 'Data derived from 1-Wire sensors. Currently temperature sensors are automatically detected.' }, 'logind': { @@ -549,21 +518,21 @@ netdataDashboard.menu = { }, 'powersupply': { - title: '电源', + title: 'Power Supply', icon: '', - info: '各种系统电源的统计数据。从Linux电源类收集的数据。' + info: 'Statistics for the various system power supplies. Data collected from Linux power supply class.' }, 'xenstat': { title: 'Xen Node', icon: '', - info: 'Xen节点的一般统计信息。使用xenstat库收集的数据。' + info: 'General statistics for the Xen node. Data collected using xenstat library.' }, 'xendomain': { title: '', icon: '', - info: 'Xen域资源利用率指标。Netdata使用xenstat库读取此信息,该库允许访问虚拟机的资源使用信息(CPU、内存、磁盘I/O、网络)。' + info: 'Xen domain resource utilization metrics. Netdata reads this information using xenstat library which gives access to the resource usage information (CPU, memory, disk I/O, network) for a virtual machine.' }, 'wmi': { @@ -575,43 +544,43 @@ netdataDashboard.menu = { 'perf': { title: 'Perf Counters', icon: '', - info: '性能监控计数器(PMC)。使用使用硬件性能监控单元(PMU)的perf_event_open()系统调用收集的数据。' + info: 'Performance Monitoring Counters (PMC). Data collected using perf_event_open() system call which utilises Hardware Performance Monitoring Units (PMU).' }, 'vsphere': { title: 'vSphere', icon: '', - info: 'ESXI主机和虚拟机的性能统计。使用govmomi库从VMware vCenter Server收集的数据。' + info: 'Performance statistics for ESXI hosts and virtual machines. Data collected from VMware vCenter Server using govmomi library.' }, 'vcsa': { title: 'VCSA', icon: '', - info: 'vCenter Server设备运行状况统计。从健康API收集的数据。' + info: 'vCenter Server Appliance health statistics. Data collected from Health API.' }, 'zookeeper': { title: 'Zookeeper', icon: '', - info: '提供Zookeeper服务器的健康统计数据。使用mntr命令通过命令端口收集的数据。' + info: 'Provides health statistics for Zookeeper server. Data collected through the command port using mntr command.' }, 'hdfs': { title: 'HDFS', icon: '', - info: '提供Hadoop分布式文件系统性能统计信息。模块通过HDFS守护进程的Web界面收集Java管理扩展上的指标。' + info: 'Provides Hadoop Distributed File System performance statistics. Module collects metrics over Java Management Extensions through the web interface of an HDFS daemon.' }, 'am2320': { title: 'AM2320 Sensor', icon: '', - info: '外部AM2320传感器的读数。' + info: 'Readings from the external AM2320 Sensor.' }, 'scaleio': { title: 'ScaleIO', icon: '', - info: 'ScaleIO各个组件的性能和健康统计。通过VxFlex OS Gateway REST API收集的数据。' + info: 'Performance and health statistics for various ScaleIO components. Data collected via VxFlex OS Gateway REST API.' }, 'squidlog': { @@ -623,13 +592,13 @@ netdataDashboard.menu = { 'cockroachdb': { title: 'CockroachDB', icon: '', - info: '各种CockroachDB组件的性能和健康状况统计。' + info: 'Performance and health statistics for various CockroachDB components.' }, 'ebpf': { title: 'eBPF', icon: '', - info: '使用eBPF监控系统调用、内部函数、字节读取、字节写入和错误。' + info: 'Monitor system calls, internal functions, bytes read, bytes written and errors using eBPF.' }, 'filesystem': { @@ -640,74 +609,74 @@ netdataDashboard.menu = { 'vernemq': { title: 'VerneMQ', icon: '', - info: 'VerneMQ开源MQTT经纪人的性能数据。' + info: 'Performance data for the VerneMQ open-source MQTT broker.' }, 'pulsar': { title: 'Pulsar', icon: '', - info: 'Apache Pulsarpub-sub消息系统的摘要、命名空间和主题性能数据。' + info: 'Summary, namespaces and topics performance data for the Apache Pulsar pub-sub messaging system.' }, 'anomalies': { title: 'Anomalies', icon: '', - info: '与关键系统指标相关的异常分数。高异常概率表示奇怪的行为,并可能触发经过训练的模型的异常预测。有关更多详细信息,请阅读异常收集器文档。' + info: 'Anomaly scores relating to key system metrics. A high anomaly probability indicates strange behaviour and may trigger an anomaly prediction from the trained models. Read the anomalies collector docs for more details.' }, 'alarms': { title: 'Alarms', icon: '', - info: '显示警报随时间推移状态的图表。更多详细信息此处。' + info: 'Charts showing alarm status over time. More details here.' }, 'statsd': { title: 'StatsD', icon: '', - info:'StatsD是一个行业标准技术堆栈,用于监控应用程序和检测任何软件以提供自定义指标。Netdata允许用户在不同图表中组织指标,并轻松可视化任何应用程序指标。在Netdata Learn上阅读更多信息。' + info:'StatsD is an industry-standard technology stack for monitoring applications and instrumenting any piece of software to deliver custom metrics. Netdata allows the user to organize the metrics in different charts and visualize any application metric easily. Read more on Netdata Learn.' }, 'supervisord': { title: 'Supervisord', icon: '', - info: '主管控制的每组流程的详细统计数据。' + - 'Netdata使用getAllProcessInfo方法收集这些指标。' + info: 'Detailed statistics for each group of processes controlled by Supervisor. ' + + 'Netdata collects these metrics using getAllProcessInfo method.' }, 'systemdunits': { - title: 'systemd units', + title: 'systemd单位', icon: '', - info: 'systemd在11种不同类型的不同实体之间提供了一个依赖系统,称为“单位”。 ' + - '单元封装了与系统启动和维护相关的各种对象。 ' + - '单元可能是活动(表示启动、绑定、插入,具体取决于单元类型), ' + - '或不活跃(意味着停止、未绑定、断开连接), ' + - '以及在激活或停用的过程中,即在两种状态之间(这些状态称为激活停用)。 ' + - '特殊的失败状态也可用,这与不活跃非常相似,并在服务以某种方式失败时(进程在退出时、崩溃、操作超时或重新启动过多后返回错误代码)时输入。 ' + - '有关详细信息,请参阅 systemd(1)。' + info: 'systemd provides a dependency system between various entities called "units" of 11 different types. ' + + 'Units encapsulate various objects that are relevant for system boot-up and maintenance. ' + + 'Units may be active (meaning started, bound, plugged in, depending on the unit type), ' + + 'or inactive (meaning stopped, unbound, unplugged), ' + + 'as well as in the process of being activated or deactivated, i.e. between the two states (these states are called activating, deactivating). ' + + 'A special failed state is available as well, which is very similar to inactive and is entered when the service failed in some way (process returned error code on exit, or crashed, an operation timed out, or after too many restarts). ' + + 'For details, see systemd(1).' }, 'changefinder': { title: 'ChangeFinder', icon: '', - info: '使用机器学习在线更改点检测。更多详细信息此处。' + info: 'Online changepoint detection using machine learning. More details here.' }, 'zscores': { title: 'Z-Scores', icon: '', - info: 'Z scores与关键系统指标相关的分数。' + info: 'Z scores scores relating to key system metrics.' }, 'anomaly_detection': { title: 'Anomaly Detection', icon: '', - info: '与异常检测、异常尺寸增加或高于通常异常率相关的图表可能是一些异常行为的迹象。有关更多详细信息,请阅读我们的异常检测指南。' + info: 'Charts relating to anomaly detection, increased anomalous dimensions or a higher than usual anomaly_rate could be signs of some abnormal behaviour. Read our anomaly detection guide for more details.' }, 'fail2ban': { title: 'Fail2ban', icon: '', - info: 'Netdata通过读取Fail2ban日志文件来跟踪当前的监狱状态。' + info: 'Netdata keeps track of the current jail status by reading the Fail2ban log file.' }, }; @@ -721,22 +690,22 @@ netdataDashboard.menu = { netdataDashboard.submenu = { 'web_log.squid_bandwidth': { title: '频宽', - info: 'squid响应的带宽(发送)。此图表可能会出现异常的峰值,因为带宽是在服务器保存日志行时核算的,即使服务日志行所需的时间跨度更长。我们建议使用QoS(例如FireQOS)来准确核算服务器带宽。' + info: 'Bandwidth of responses (sent) by squid. This chart may present unusual spikes, since the bandwidth is accounted at the time the log line is saved by the server, even if the time needed to serve it spans across a longer duration. We suggest to use QoS (e.g. FireQOS) for accurate accounting of the server bandwidth.' }, 'web_log.squid_responses': { title: '回应', - info: '与squid发送的回复相关的信息。' + info: 'Information related to the responses sent by squid.' }, 'web_log.squid_requests': { title: '请求', - info: 'squid收到的与请求相关的信息。' + info: 'Information related to the requests squid has received.' }, 'web_log.squid_hierarchy': { title: '等级制度', - info: '用于服务请求的squid层次结构的绩效指标。' + info: 'Performance metrics for the squid hierarchy used to serve the requests.' }, 'web_log.squid_squid_transport': { @@ -745,12 +714,12 @@ netdataDashboard.submenu = { 'web_log.squid_squid_cache': { title: '缓存', - info: 'squid缓存性能的性能指标。' + info: 'squid缓存性能的性能指标.' }, 'web_log.squid_timings': { title: 'timings', - info: 'squid请求的持续时间。可能会报告不切实际的激增,因为squid会在请求完成后记录请求的总时间。特别是对于HTTPS,客户端从代理获取隧道,并直接与上游服务器交换请求,因此squid无法评估单个请求并报告隧道打开的总时间。' + info: 'Duration of squid requests. Unrealistic spikes may be reported, since squid logs the total time of the requests, when they complete. Especially for HTTPS, the clients get a tunnel from the proxy and exchange requests directly with the upstream servers, so squid cannot evaluate the individual requests and reports the total time the tunnel was open.' }, 'web_log.squid_clients': { @@ -758,32 +727,28 @@ netdataDashboard.submenu = { }, 'web_log.bandwidth': { - info: '请求(接收)和响应(发送)的带宽。接收需要扩展日志格式(没有它,Web服务器日志没有此信息)。此图表可能会出现异常的峰值,因为带宽是在Web服务器保存日志行时核算的,即使服务日志行所需的时间跨度更长。我们建议使用QoS(例如FireQOS)来准确核算Web服务器带宽。' + info: 'Bandwidth of requests (received) and responses (sent). received requires an extended log format (without it, the web server log does not have this information). This chart may present unusual spikes, since the bandwidth is accounted at the time the log line is saved by the web server, even if the time needed to serve it spans across a longer duration. We suggest to use QoS (e.g. FireQOS) for accurate accounting of the web server bandwidth.' }, 'web_log.urls': { - info: '/etc/netdata/python.d/web_log.conf中定义的每个URL模式的请求数量。该图表计算与定义的URL模式匹配的所有请求,独立于Web服务器响应代码(即成功和失败)。' + info: 'Number of requests for each URL pattern defined in /etc/netdata/python.d/web_log.conf. This chart counts all requests matching the URL patterns defined, independently of the web server response codes (i.e. both successful and unsuccessful).' }, 'web_log.clients': { - info: '显示访问Web服务器的唯一客户端IP数量的图表。' + info: 'Charts showing the number of unique client IPs, accessing the web server.' }, 'web_log.timings': { - info: 'Web服务器响应时间-Web服务器准备和响应请求所需的时间。这需要扩展日志格式,其含义特定于Web服务器。对于大多数Web服务器来说,这计入了从收到完整请求到发送响应最后一个字节的时间。因此,它包括响应的网络延迟,但它不包括请求的网络延迟。' + info: 'Web server response timings - the time the web server needed to prepare and respond to requests. This requires an extended log format and its meaning is web server specific. For most web servers this accounts the time from the reception of a complete request, to the dispatch of the last byte of the response. So, it includes the network delays of responses, but it does not include the network delays of requests.' }, 'mem.ksm': { title: 'deduper (ksm)', - info: 'Kernel同页合并 '+ - '(KSM)性能监控,从/sys/kernel/mm/ksm/中的几个文件中读取。 '+ - 'KSM是Linux内核中节省内存的重复数据删除功能。 '+ - 'KSM守护进程ksmd定期扫描已注册的用户内存区域, '+ - '寻找内容相同的页面,这些页面可以替换为单个受写保护的页面。' + info: 'Kernel Same-page Merging (KSM) 效能监视,经由读取 /sys/kernel/mm/ksm/ 下的档案而来。KSM 是在 Linux 核心 (自 2.6.32 版起) 内含的一种节省记忆体使用率重复资料删除功能。)。 KSM 服务程序 ksmd 会定期扫描记忆体区域,寻找正有资料要更新进来且相同资料存在的分页。KSM 最初是从 KVM 专案开发中而来,利用这种共用相同资料的机制,即可以让更多的虚拟机器放到记忆体中。另外,对许多会产生同样内容的应用程序来说,这个功能是相当有效益的。' }, 'mem.hugepages': { - info: 'Hugepages是一项功能,允许内核利用现代硬件架构的多个页面大小功能。内核创建了多页虚拟内存,从物理RAM和交换进行映射。CPU架构中有一个名为“翻译Lookaside缓冲区”(TLB)的机制,用于管理虚拟内存页面与实际物理内存地址的映射。TLB是一个有限的硬件资源,因此使用默认页面大小的大量物理内存会消耗TLB并增加处理开销。通过使用大型页面,内核能够创建更大大小的页面,每个页面消耗TLB中的单个资源。大型页面被固定在物理RAM上,无法交换/分页。' + info: 'Hugepages is a feature that allows the kernel to utilize the multiple page size capabilities of modern hardware architectures. The kernel creates multiple pages of virtual memory, mapped from both physical RAM and swap. There is a mechanism in the CPU architecture called "Translation Lookaside Buffers" (TLB) to manage the mapping of virtual memory pages to actual physical memory addresses. The TLB is a limited hardware resource, so utilizing a large amount of physical memory with the default page size consumes the TLB and adds processing overhead. By utilizing Huge Pages, the kernel is able to create pages of much larger sizes, each page consuming a single resource in the TLB. Huge Pages are pinned to physical RAM and cannot be swapped/paged out.' }, 'mem.numa': { @@ -791,300 +756,300 @@ netdataDashboard.submenu = { }, 'mem.ecc': { - info: '

ECC内存'+ - '是一种使用错误更正代码(ECC)进行检测的计算机数据存储 '+ - '并纠正内存中发生的n位数据损坏。 '+ - '通常,ECC内存保持对单位错误的免疫记忆系统: '+ - '从每个单词读取的数据始终与写入它的数据相同, '+ - '即使实际存储的位数之一被翻转到错误的状态。

'+ - '

内存错误可分为两类:'+ - '软错误,随机损坏位数,但不留下物理损坏。 '+ - '软错误本质上是短暂的,不可重复,可能是由于电 '+ - '磁干扰。 '+ - '硬错误,它以可重复的方式损坏位,因为 '+ - '物理/硬件缺陷或环境问题。' + info: '

ECC 内存 '+ + 'is a type of computer data storage that uses an error correction code (ECC) to detect '+ + 'and correct n-bit data corruption which occurs in memory. '+ + 'Typically, ECC memory maintains a memory system immune to single-bit errors: '+ + 'the data that is read from each word is always the same as the data that had been written to it, '+ + 'even if one of the bits actually stored has been flipped to the wrong state.

'+ + '

Memory errors can be classified into two types: '+ + 'Soft errors, which randomly corrupt bits but do not leave physical damage. '+ + 'Soft errors are transient in nature and are not repeatable, can be because of electrical or '+ + 'magnetic interference. '+ + 'Hard errors, which corrupt bits in a repeatable manner because '+ + 'of a physical/hardware defect or an environmental problem.' }, 'mem.pagetype': { - info: '内存统计数据可从 '+ - '记忆分配器。'+ - 'buddy分配器是系统内存分配器。 '+ - '整个内存空间被分割成物理页面,这些页面按 '+ - 'NUMA节点,区域, '+ - '迁移类型,以及块的大小。 '+ - '通过根据页面的移动能力对其进行分组, '+ - '内核可以回收页面块中的页面,以满足高阶分配。 '+ - '当内核或应用程序请求一些内存时,好友分配器会提供与请求最近的页面匹配。' + info: '可用可用内存的统计信息 '+ + '内存伙伴分配器. '+ + 'The buddy allocator is the system memory allocator. '+ + 'The whole memory space is split in physical pages, which are grouped by '+ + 'NUMA node, zone, '+ + 'migrate type, and size of the block. '+ + 'By keeping pages grouped based on their ability to move, '+ + 'the kernel can reclaim pages within a page block to satisfy a high-order allocation. '+ + 'When the kernel or an application requests some memory, the buddy allocator provides a page that matches closest the request.' }, 'ip.ecn': { - info: '显式拥堵通知(ECN) '+ - '是IP和TCP的扩展,允许在不丢失数据包的情况下端到端通知网络拥塞。 '+ - 'ECN是一项可选功能,可以在两个支持ECN的端点之间使用,当 '+ - '基础网络基础设施也支持它。' + info: '显式拥塞通知(ECN) '+ + 'is an extension to the IP and to the TCP that allows end-to-end notification of network congestion without dropping packets. '+ + 'ECN is an optional feature that may be used between two ECN-enabled endpoints when '+ + 'the underlying network infrastructure also supports it.' }, 'ip.multicast': { - info: 'IP多播是一种技术 '+ - 'IP 网络上的一对多通信。 '+ - '多播高效地使用网络基础设施,要求源只发送一次数据包, '+ - '即使它需要交付给大量接收器。 '+ - '网络中的节点仅在必要时负责复制数据包以到达多个接收器。' + info: 'IP multicast is a technique for '+ + 'IP网络上的一对多通信。'+ + 'Multicast uses network infrastructure efficiently by requiring the source to send a packet only once, '+ + 'even if it needs to be delivered to a large number of receivers. '+ + 'The nodes in the network take care of replicating the packet to reach multiple receivers only when necessary.' }, 'ip.broadcast': { info: '在计算机网络中, '+ - '广播是指传输网络上每台设备都将接收的数据包。 '+ - '在实践中,广播范围仅限于广播领域。' + 'broadcasting refers to transmitting a packet that will be received by every device on the network. '+ + 'In practice, the scope of the broadcast is limited to a broadcast domain.' }, 'netfilter.conntrack': { - title: 'connection tracker', + title: '连接跟踪器', info: 'Netfilter connection tracker 效能指标。Connection tracker 会追踪这台主机上所有的连接,包括流入与流出。工作原理是将所有开启的连接都储存到资料库,以追踪网路、位址转换与连接目标。' }, 'netfilter.nfacct': { - title: 'bandwidth accounting', - info: '以下信息使用nfacct.plugin阅读。' + title: '带宽计费', + info: 'The following information is read using the nfacct.plugin.' }, 'netfilter.synproxy': { - title: 'DDoS保护', - info: 'DDoS保护性能指标。SYNPROXY '+ - '是TCP SYN数据包代理。 '+ - '它用于保护任何TCP服务器(如Web服务器)免受SYN洪水和类似的DDoS攻击。 '+ - 'SYNPROXY拦截新的TCP连接,并使用syncookie处理最初的3向握手 '+ - '而不是连接来建立连接。 '+ - '它经过优化,可以利用所有可用的CPUs处理数百万个数据包,而无需 '+ - '连接之间的任何并发锁定。 '+ - '它可用于任何类型的TCP流量(甚至加密), '+ - '因为它不会干扰内容本身。' + title: 'DDoS防护', + info: 'DDoS保护性能指标. SYNPROXY '+ + 'is a TCP SYN packets proxy. '+ + 'It is used to protect any TCP server (like a web server) from SYN floods and similar DDoS attacks. '+ + 'SYNPROXY intercepts new TCP connections and handles the initial 3-way handshake using syncookies '+ + 'instead of conntrack to establish the connection. '+ + 'It is optimized to handle millions of packets per second utilizing all CPUs available without '+ + 'any concurrency locking between the connections. '+ + 'It can be used for any kind of TCP traffic (even encrypted), '+ + 'since it does not interfere with the content itself.' }, 'ipfw.dynamic_rules': { - title: 'dynamic rules', - info: '由相应的有状态防火墙规则创建的动态规则数量。' + title: '动态规则', + info: '由相应的有状态防火墙规则创建的动态规则数。' }, 'system.softnet_stat': { title: 'softnet', info: function (os) { if (os === 'linux') - return '

与网络接收工作相关的CPU SoftIRQ的统计数据。 '+ - '每个CPU内核的细分可以在CPU/softnet统计上找到。 '+ - '有关识别网络驱动程序相关问题并进行故障诊断的更多信息,请参阅 '+ - '红帽企业Linux网络性能调优指南

'+ - '

已处理 - 处理数据包。 '+ - '已删除 - 由于网络设备积压已满,数据包已丢失。 '+ - '挤压 - 网络设备预算消耗或达到时限的次数, '+ - '但还有更多工作要做。 '+ - 'ReceivedRPS - 这个CPU被唤醒通过处理器间中断处理数据包的次数。 '+ - '流量限制计数 - 达到流量限制的次数(流量限制是可选的 '+ - '接收数据包转向功能)。

'; + return '

与网络接收工作相关的CPU软件的统计信息. '+ + 'Break down per CPU core can be found at CPU / softnet statistics. '+ + 'More information about identifying and troubleshooting network driver related issues can be found at '+ + 'Red Hat Enterprise Linux Network Performance Tuning Guide.

'+ + '

Processed - packets processed. '+ + 'Dropped - packets dropped because the network device backlog was full. '+ + 'Squeezed - number of times the network device budget was consumed or the time limit was reached, '+ + 'but more work was available. '+ + 'ReceivedRPS - number of times this CPU has been woken up to process packets via an Inter-processor Interrupt. '+ + 'FlowLimitCount - number of times the flow limit has been reached (flow limiting is an optional '+ + 'Receive Packet Steering feature).

'; else - return '与网络接收工作相关的CPU SoftIRQ的统计数据。'; + return 'Statistics for CPUs SoftIRQs related to network receive work.'; } }, 'system.clock synchronization': { info: 'NTP '+ - '允许您自动将系统时间与远程服务器同步。 '+ - '这通过与已知具有准确时间的服务器同步来保持机器时间的准确性。' + '允许您自动将系统时间与远程服务器同步. '+ + 'This keeps your machine’s time accurate by syncing with servers that are known to have accurate times.' }, 'cpu.softnet_stat': { - title: 'softnet', + title: '软网', info: function (os) { if (os === 'linux') - return '

与网络接收工作相关的CPU SoftIRQ的统计数据。 '+ - '所有CPU内核的总和可在系统/软网统计中找到。 '+ - '有关识别网络驱动程序相关问题并进行故障诊断的更多信息,请参阅 '+ - '红帽企业Linux网络性能调优指南

'+ - '

已处理 - 处理数据包。 '+ - '已删除 - 由于网络设备积压已满,数据包已丢失。 '+ - '挤压 - 网络设备预算消耗或达到时限的次数, '+ - '但还有更多工作要做。 '+ - 'ReceivedRPS - 这个CPU被唤醒通过处理器间中断处理数据包的次数。 '+ - '流量限制计数 - 达到流量限制的次数(流量限制是可选的 '+ - '接收数据包转向功能)。

'; + return '

与网络接收工作相关的CPU软件的统计信息. '+ + 'Total for all CPU cores can be found at System / softnet statistics. '+ + 'More information about identifying and troubleshooting network driver related issues can be found at '+ + 'Red Hat Enterprise Linux Network Performance Tuning Guide.

'+ + '

Processed - packets processed. '+ + 'Dropped - packets dropped because the network device backlog was full. '+ + 'Squeezed - number of times the network device budget was consumed or the time limit was reached, '+ + 'but more work was available. '+ + 'ReceivedRPS - number of times this CPU has been woken up to process packets via an Inter-processor Interrupt. '+ + 'FlowLimitCount - number of times the flow limit has been reached (flow limiting is an optional '+ + 'Receive Packet Steering feature).

'; else - return '与网络接收工作相关的每个CPU核心SoftIRQ的统计数据。所有CPU内核的总和可在系统/软网统计中找到。'; + return 'Statistics for per CPUs core SoftIRQs related to network receive work. Total for all CPU cores can be found at System / softnet statistics.'; } }, 'go_expvar.memstats': { - title: 'memory statistics', - info: '运行时内存统计。有关每个图表和值的更多信息,请参阅runtime.MemStats文档。' + title: '内存统计信息', + info: 'Go runtime memory statistics. See runtime.MemStats documentation for more info about each chart and the values.' }, 'couchdb.dbactivity': { - title: 'db activity', - info: '整个数据库为整个服务器读取和写入。这包括任何外部HTTP流量,以及在集群中执行的内部复制流量,以确保节点一致性。' + title: 'db活动', + info: 'Overall database reads and writes for the entire server. This includes any external HTTP traffic, as well as internal replication traffic performed in a cluster to ensure node consistency.' }, 'couchdb.httptraffic': { - title: 'http traffic breakdown', - info: '所有HTTP流量,按请求类型(GETPUTPOST等)和响应状态代码(2002014xx等)

此处的任何5xx错误都表示可能存在CouchDB错误;请查看日志文件以了解更多信息。' + title: 'http流量细分', + info: 'All HTTP traffic, broken down by type of request (GET, PUT, POST, etc.) and response status code (200, 201, 4xx, etc.)

Any 5xx errors here indicate a likely CouchDB bug; check the logfile for further information.' }, 'couchdb.ops': { - title: 'server operations' + title: '服务器操作' }, 'couchdb.perdbstats': { - title: 'per db statistics', - info: '每个数据库的统计数据。这包括每个数据库3个大小的图表:活动(数据库中实时数据的大小)、外部(数据库内容的未压缩大小)和文件(磁盘上文件的大小,不包括任何视图和索引)。它还包括每个数据库的文件数量和删除的文件数量。' + title: '每db统计信息', + info: 'Statistics per database. This includes 3 size graphs per database: active (the size of live data in the database), external (the uncompressed size of the database contents), and file (the size of the file on disk, exclusive of any views and indexes). It also includes the number of documents and number of deleted documents per database.' }, 'couchdb.erlang': { - title: 'erlang statistics', - info: '有关托管CouchDB的Erlang VM状态的详细信息。这些仅适用于高级用户。峰值消息队列的高值(>10e6)通常表示重载条件。' + title: 'erlang统计信息', + info: 'Detailed information about the status of the Erlang VM that hosts CouchDB. These are intended for advanced users only. High values of the peak message queue (>10e6) generally indicate an overload condition.' }, 'ntpd.system': { - title: 'system', - info: '阅读列表广告牌ntpq -c rl所示的系统变量统计信息。系统变量被分配为零的关联ID,也可以显示在readvar广告牌ntpq -c“rv 0”中。这些变量用于时钟纪律算法,以计算最低和最稳定的偏移量。' + title: '系统', + info: 'Statistics of the system variables as shown by the readlist billboard ntpq -c rl. System variables are assigned an association ID of zero and can also be shown in the readvar billboard ntpq -c "rv 0". These variables are used in the Clock Discipline Algorithm, to calculate the lowest and most stable offset.' }, 'ntpd.peers': { - title: 'peers', - info: '在/etc/ntp.conf中配置的每个对等变量的统计信息,如readvar广告牌ntpq -c“rv <association>”所示,而每个对等方都分配了一个非零关联ID,如ntpq -c“apeers”所示。该模块定期扫描新的/更改的对等机(默认:每60秒一次)。ntpd从可用对等机中选择最佳对等机来同步时钟。至少需要3名同行才能正确识别最佳同行。' + title: '同行', + info: 'Statistics of the peer variables for each peer configured in /etc/ntp.conf as shown by the readvar billboard ntpq -c "rv <association>", while each peer is assigned a nonzero association ID as shown by ntpq -c "apeers". The module periodically scans for new/changed peers (default: every 60s). ntpd selects the best possible peer from the available peers to synchronize the clock. A minimum of at least 3 peers is required to properly identify the best possible peer.' }, 'mem.page_cache': { - title: 'page cache (eBPF)', - info: '监控对用于操作Linux页面缓存的函数的调用。当与应用程序的集成启用时,Netdata还根据应用程序显示页面缓存操作。' + title: '页面缓存(eBPF)', + info: 'Monitor calls to functions used to manipulate Linux page cache. When integration with apps is enabled, Netdata also shows page cache manipulation per application.' }, 'apps.page_cache': { - title: 'page cache (eBPF)', - info: 'Netdata还在内存子菜单中对这些图表进行了摘要。' + title: '页面缓存 (eBPF)', + info: 'Netdata also gives a summary for these charts in Memory submenu.' }, 'filesystem.vfs': { title: 'vfs (eBPF)', - info: '监控对用于操作文件系统的调用。当与应用程序的集成启用时,Netdata还根据应用程序显示虚拟文件系统。' + info: 'Monitor calls to functions used to manipulate File Systems. When integration with apps is enabled, Netdata also shows Virtual File System per application.' }, 'apps.vfs': { title: 'vfs (eBPF)', - info: 'Netdata还在文件系统子菜单中对这些图表进行了摘要。' + info: 'Netdata also gives a summary for these charts in Filesystem submenu.' }, 'filesystem.ext4_latency': { - title: 'ext4 latency (eBPF)', - info: '延迟是完成事件所需的时间。我们计算调用和返回时间之间的差异,这跨越磁盘I/O、文件系统操作(锁定、I/O)、运行队列延迟以及与监控操作相关的所有事件。基于BCC工具中的eBPF ext4dist。' + title: 'ext4延迟 (eBPF)', + info: 'Latency is the time it takes for an event to be completed. We calculate the difference between the calling and return times, this spans disk I/O, file system operations (lock, I/O), run queue latency and all events related to the monitored action. Based on the eBPF ext4dist from BCC tools.' }, 'filesystem.xfs_latency': { - title: 'xfs latency (eBPF)', - info: '延迟是完成事件所需的时间。我们计算调用和返回时间之间的差异,这跨越磁盘I/O、文件系统操作(锁定、I/O)、运行队列延迟以及与监控操作相关的所有事件。基于BCC工具中的eBPF xfsdist。' + title: 'xfs延迟 (eBPF)', + info: 'Latency is the time it takes for an event to be completed. We calculate the difference between the calling and return times, this spans disk I/O, file system operations (lock, I/O), run queue latency and all events related to the monitored action. Based on the eBPF xfsdist from BCC tools.' }, 'filesystem.nfs_latency': { - title: 'nfs latency (eBPF)', - info: '延迟是完成事件所需的时间。我们计算调用和返回时间之间的差异,这跨越磁盘I/O、文件系统操作(锁定、I/O)、运行队列延迟以及与监控操作相关的所有事件。基于BCC工具中的eBPF nfsdist。' + title: 'nfs延迟 (eBPF)', + info: 'Latency is the time it takes for an event to be completed. We calculate the difference between the calling and return times, this spans disk I/O, file system operations (lock, I/O), run queue latency and all events related to the monitored action. Based on the eBPF nfsdist from BCC tools.' }, 'filesystem.zfs_latency': { - title: 'zfs latency (eBPF)', - info: '延迟是完成事件所需的时间。我们计算调用和返回时间之间的差异,这跨越磁盘I/O、文件系统操作(锁定、I/O)、运行队列延迟以及与监控操作相关的所有事件。基于BCC工具中的eBPF zfsdist。' + title: 'zfs延迟 (eBPF)', + info: 'Latency is the time it takes for an event to be completed. We calculate the difference between the calling and return times, this spans disk I/O, file system operations (lock, I/O), run queue latency and all events related to the monitored action. Based on the eBPF zfsdist from BCC tools.' }, 'filesystem.btrfs_latency': { - title: 'btrfs latency (eBPF)', - info: '延迟是完成事件所需的时间。我们计算调用和返回时间之间的差异,获得最终结果的对数,并将一个值相加到各自的bin。基于BCC工具中的eBPF btrfsdist。' + title: 'btrfs延迟 (eBPF)', + info: 'Latency is the time it takes for an event to be completed. We calculate the difference between the calling and return times, we get the logarithmic for the final result and we sum one value to the respective bin. Based on the eBPF btrfsdist from BCC tools.' }, 'filesystem.file_access': { - title: 'file access (eBPF)', - info: '当与应用程序的集成启用时,Netdata还根据应用程序显示文件访问权限。' + title: '文件访问权限 (eBPF)', + info: 'When integration with apps is enabled, Netdata also shows file access per application.' }, 'apps.file_access': { - title: 'file access (eBPF)', - info: 'Netdata还在文件系统子菜单上提供了此图表的摘要(有关eBPF插件文件图表部分的更多详细信息)。' + title: '文件访问权限 (eBPF)', + info: 'Netdata also gives a summary for this chart on Filesystem submenu (more details on eBPF plugin file chart section).' }, 'ip.kernel': { - title: 'kernel functions (eBPF)', - info: '当ebpf.plugin在主机上运行时,会制作下一个图表。当与应用程序的集成启用时,Netdata还根据应用程序显示对内核函数的调用。' + title: '内核函数 (eBPF)', + info: 'Next charts are made when ebpf.plugin is running on your host. When integration with apps is enabled, Netdata also shows calls for kernel functions per application.' }, 'apps.net': { - title: 'network', - info: 'Netdata还总结了网络堆栈子菜单中的eBPF图表。' + title: '网络', + info: 'Netdata also gives a summary for eBPF charts in Networking Stack submenu.' }, 'system.ipc semaphores': { - info: '系统V信号量是一种进程间通信(IPC)机制。 '+ + info: 'System V信号量是一种进程间通信(IPC)机制. '+ 'It allows processes or threads within a process to synchronize their actions. '+ - '它们通常用于监控共享内存段等系统资源的可用性。 ' + - '有关详细信息,请参阅svipc(7)。 ' + - '要查看主机IPC信号量信息,请运行ipcs -us。对于限制,请运行ipcs -ls。' + 'They are often used to monitor and control the availability of system resources such as shared memory segments. ' + + 'For details, see svipc(7). ' + + 'To see the host IPC semaphore information, run ipcs -us. For limits, run ipcs -ls.' }, 'system.ipc shared memory': { - info: '系统共享内存是一种进程间通信(IPC)机制。 '+ - '它允许进程通过共享内存区域来通信信息。 '+ - '这是可用的最快进程间通信形式,因为当数据在进程之间传递时(没有复制),不会发生内核参与。 '+ - '通常,进程必须同步对共享内存对象的访问,例如使用POSIX信号量。 '+ - '有关详细信息,请参阅svipc(7)。 '+ - '要查看主机IPC共享内存信息,请运行ipcs -um。对于限制,请运行ipcs -lm。' + info: 'System V共享内存是一种进程间通信(IPC)机制. '+ + 'It allows processes to communicate information by sharing a region of memory. '+ + 'It is the fastest form of inter-process communication available since no kernel involvement occurs when data is passed between the processes (no copying). '+ + 'Typically, processes must synchronize their access to a shared memory object, using, for example, POSIX semaphores. '+ + 'For details, see svipc(7). '+ + 'To see the host IPC shared memory information, run ipcs -um. For limits, run ipcs -lm.' }, 'system.ipc message queues': { - info: '系统消息队列是一种进程间通信(IPC)机制。 '+ - '它允许进程以消息形式交换数据。 '+ - '有关详细信息,请参阅svipc(7)。 ' + - '要查看主机IPC消息信息,请运行ipcs -uq。对于限制,请运行ipcs -lq。' + info: 'System V消息队列是一种进程间通信(IPC)机制. '+ + 'It allow processes to exchange data in the form of messages. '+ + 'For details, see svipc(7). ' + + 'To see the host IPC messages information, run ipcs -uq. For limits, run ipcs -lq.' }, 'system.interrupts': { - info: 'Interrupts 是'+ - '通过外部设备(通常是I/O设备)或程序(运行进程)发送到CPU。 '+ - '它们告诉CPU停止当前的活动,并执行操作系统的相应部分。 '+ - 'Interrupt 类型包括 '+ - 'hardware (由硬件设备生成,以表明它们需要操作系统的注意), '+ - 'software (当程序想要请求操作系统执行系统调用时生成), 及 '+ - 'traps (由CPU本身生成,以指示发生了某些错误或情况,需要操作系统的帮助).' + info: 'Interrupts are signals '+ + 'sent to the CPU by external devices (normally I/O devices) or programs (running processes). '+ + 'They tell the CPU to stop its current activities and execute the appropriate part of the operating system. '+ + 'Interrupt types are '+ + 'hardware (generated by hardware devices to signal that they need some attention from the OS), '+ + 'software (generated by programs when they want to request a system call to be performed by the operating system), and '+ + 'traps (generated by the CPU itself to indicate that some error or condition occurred for which assistance from the operating system is needed).' }, 'system.softirqs': { - info: '软件中断(或“softirqs”)是内核中最古老的延迟执行机制之一。 '+ - '内核执行的几项任务并不重要: '+ - '如有必要,它们可以被长时间推迟。 '+ - '在启用所有中断的情况下,可以执行可执行的任务 '+ - '(软件在硬件中断后模式化)。 '+ - '将它们从中断处理程序中取出有助于保持内核响应时间小。' + info: '软件中断(或“softirq”)是内核中最古老的延迟执行机制之一. '+ + 'Several tasks among those executed by the kernel are not critical: '+ + 'they can be deferred for a long period of time, if necessary. '+ + 'The deferrable tasks can execute with all interrupts enabled '+ + '(softirqs are patterned after hardware interrupts). '+ + 'Taking them out of the interrupt handler helps keep kernel response time small.' }, 'cpu.softirqs': { - info: '每个CPU的软件中断总数。 '+ - '要查看系统的总数,请检查 softirqs 查看' + info: '每个CPU的软件中断总数. '+ + 'To see the total number for the system check the softirqs section.' }, 'cpu.interrupts': { - info: '每个CPU的中断总数。 '+ - '要查看系统的总数,请查看中断部分。 '+ - '/proc/interrupts的最后一列提供了中断描述或注册该中断处理程序的设备名称。' + info: '每个CPU的中断总数. '+ + 'To see the total number for the system check the interrupts section. '+ + 'The last column in /proc/interrupts provides an interrupt description or the device name that registered the handler for that interrupt.' }, 'cpu.throttling': { - info: ' CPU节流通常用于自动减慢计算机的速度 '+ - '在可能的情况下减少能源消耗并节省电池电量。' + info: ' CPU调节通常用于自动降低计算机速度'+ + 'when possible to use less energy and conserve battery.' }, 'cpu.cpuidle': { - info: '空闲状态(C-states) '+ - '用于在处理器闲置时节省电力。' + info: 'Idle States (C-states) '+ + 'are used to save power when the processor is idle.' }, 'services.net': { - title: 'network (eBPF)', + title: '网络 (eBPF)', }, 'services.page_cache': { - title: 'pache cache (eBPF)', + title: 'Pache缓存 (eBPF)', }, }; @@ -1107,17 +1072,10 @@ var cgroupMemLimitIsSet = 0; netdataDashboard.context = { 'system.cpu': { info: function (os) { - void (os); - return 'CPU 使用率总表 (全部核心)。 当数值为 100% 时,表示您的 CPU 非常忙碌没有闲置空间。您可以在 CPUs 区段及以及 应用程序 区段深入了解每个核心与应用程序的使用情况。' + void(os); + return 'CPU 使用率总表 (全部核心)。 当数值为 100% 时,表示您的 CPU 非常忙碌没有闲置空间。您可以在 CPU 区段及以及 应用程序 区段深入了解每个核心与应用程序的使用情况。' + netdataDashboard.sparkline('
请特别关注 iowait ', 'system.cpu', 'iowait', '%', ',如果它一直处于较高的情况,这表示您的磁碟是效能瓶颈,您的系统效能会明显降低。') - + netdataDashboard.sparkline( - '
另一个重要的指标是 softirq ', - 'system.cpu', - 'softirq', - '%', - ',若这个数值持续在较高的情况,很有可能是您的网路驱动部份有问题。'+ - '可以在 '+ - '内核文档中找到各个指标。'); + + netdataDashboard.sparkline('
另一个重要的指标是 softirq ', 'system.cpu', 'softirq', '%', ',若这个数值持续在较高的情况,很有可能是您的网路驱动部份有问题。'); }, valueRange: "[0, 100]" }, @@ -1128,28 +1086,28 @@ netdataDashboard.context = { }, 'system.cpu_pressure': { - info: '压力信息 ' + - '识别和量化资源争用造成的中断。 ' + - '“一些”行表示CPU上至少一些任务停滞的时间份额。 ' + - '这些比率(以%为单位)被跟踪为10秒、60秒和300秒windows的近期趋势。' + info: 'Pressure Stall Information ' + + 'identifies and quantifies the disruptions caused by resource contentions. ' + + 'The "some" line indicates the share of time in which at least some tasks are stalled on CPU. ' + + 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.' }, 'system.memory_some_pressure': { - info: '压力信息 ' + - '识别和量化资源争用造成的中断。 ' + - '“一些”行表示至少一些任务在内存上停滞的时间份额。 ' + - '“全”行表示所有非空闲任务同时在内存上停滞的时间份额。 ' + - '在这种状态下,实际的CPU周期将被浪费,在这个状态下花费很长时间的工作负载被认为是鞭打。 ' + - '这些比率(以%为单位)被跟踪为10秒、60秒和300秒windows的近期趋势。' + info: 'Pressure Stall Information ' + + 'identifies and quantifies the disruptions caused by resource contentions. ' + + 'The "some" line indicates the share of time in which at least some tasks are stalled on memory. ' + + 'The "full" line indicates the share of time in which all non-idle tasks are stalled on memory simultaneously. ' + + 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. ' + + 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.' }, 'system.io_some_pressure': { - info: '压力信息 ' + - '识别和量化资源争用造成的中断。' + - '“一些”行表示至少一些任务在I/O上停滞的时间份额。 ' + - '“全”行表示所有非空闲任务同时在I/O上停滞的时间份额。 ' + - '在这种状态下,实际的CPU周期将被浪费,在这个状态下花费很长时间的工作负载被认为是鞭打。 ' + - '这些比率(以%为单位)被跟踪为10秒、60秒和300秒windows的近期趋势。' + info: 'Pressure Stall Information ' + + 'identifies and quantifies the disruptions caused by resource contentions. ' + + 'The "some" line indicates the share of time in which at least some tasks are stalled on I/O. ' + + 'The "full" line indicates the share of time in which all non-idle tasks are stalled on I/O simultaneously. ' + + 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. ' + + 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.' }, 'system.io': { @@ -1168,34 +1126,32 @@ netdataDashboard.context = { }, 'system.swapio': { - info: '

所有的 Swap I/O.

'+ - '输入-系统从磁盘交换到RAM的页面。 '+ - '输出 - 系统已从 RAM 交换到磁盘的页面。' + info: '所有的 Swap I/O. (netdata 会合并显示 输入输出。如果图表中没有任何数值,则表示为 0。 - 您可以修改这一页的设定,让图表显示固定的维度。' }, 'system.pgfaults': { - info: '所有的页面错误。主要页面错误表示系统正在使用其交换。您可以在应用程序监控部分找到哪些应用程序使用交换。' + info: '所有的 Page 错误. Major page faults indicates that the system is using its swap. You can find which applications use the swap at the Applications Monitoring section.' }, 'system.entropy': { colors: '#CC22AA', - info: 'Entropy,主要是用在密码学的乱数集区 (/dev/random) 如果Entropy的集区为空,需要乱数的程序可能会导致执行变慢 (这取决于每个程序使用的介面),等待集区补充。在理想情况下,有高度熵需求的系统应该要具备专用的硬体装置 (例如 TPM 装置)。您也可以安装纯软体的方案,例如 haveged,通常这些方案只会使用在伺服器上。' + info: '熵 (Entropy),主要是用在密码学的乱数集区 (/dev/random)。如果熵的集区为空,需要乱数的程序可能会导致执行变慢 (这取决于每个程序使用的介面),等待集区补充。在理想情况下,有高度熵需求的系统应该要具备专用的硬体装置 (例如 TPM 装置)。您也可以安装纯软体的方案,例如 haveged,通常这些方案只会使用在伺服器上。' }, 'system.clock_sync_state': { - info:'

系统时钟同步状态。 '+ - '强烈建议时钟与可靠的NTP服务器同步。否则, '+ - '这会导致不可预测的问题。 '+ - 'NTP守护进程可能需要几分钟(通常最多17分钟)才能选择要同步的服务器。 '+ - '

状态图:0-不同步,1-同步。

' + info:'

系统时钟同步状态. '+ + 'It is strongly recommended having the clock in sync with reliable NTP servers. Otherwise, '+ + 'it leads to unpredictable problems. '+ + 'It can take several minutes (usually up to 17) before NTP daemon selects a server to synchronize with. '+ + '

State map: 0 - not synchronized, 1 - synchronized.

' }, 'system.clock_sync_offset': { - info: '典型的NTP客户端定期轮询一个或多个NTP服务器。 '+ - '客户必须计算其 '+ - '时间偏移 '+ - '和往返延迟。 '+ - '时间偏移是两个时钟之间绝对时间的差异。' + info: '典型的NTP客户端定期轮询一个或多个NTP服务器. '+ + 'The client must compute its '+ + 'time offset '+ + 'and round-trip delay. '+ + 'Time offset is the difference in absolute time between the two clocks.' }, 'system.forks': { @@ -1205,45 +1161,33 @@ netdataDashboard.context = { 'system.intr': { colors: '#DD5555', - info: 'CPU 中断的总数。透过检查 system.interrupts,得知每一个中断的细节资讯。在 CPUs 区段提供每一个 CPU 核心的中断情形。per CPU core.' + info: 'CPU 中断的总数。透过检查 system.interrupts,得知每一个中断的细节资讯。在 CPU 区段提供每一个 CPU 核心的中断情形。' }, 'system.interrupts': { - info: 'CPU 中断的细节。在 CPUs 区段中,依据每个 CPU 核心分析中断。 per CPU core. '+ - '/proc/interrupts的最后一列提供了中断描述或注册该中断处理程序的设备名称。' + info: 'CPU 中断的细节。在 CPU 区段中,依据每个 CPU 核心分析中断。' }, 'system.hardirq_latency': { - info: '维修硬件中断的总时间。基于BCC工具中的eBPF hardirqs。' + info: '维护硬件中断所花费的总时间。基于eBPF hardirqs from BCC tools.' }, 'system.softirqs': { - info: '

系统中的软件中断总数。 '+ - '在CPU部分,对每个CPU内核进行了分析。

'+ - '

HI - 高优先级任务组。 '+ - 'TIMER - 与计时器中断相关的任务组。 '+ - 'NET_TXNET_RX-用于网络传输和接收处理。 '+ - 'BLOCK - 处理阻止I/O完成事件。 '+ - 'IRQ_POLL - IO子系统用于提高性能(块设备的一种类似NAPI的方法)。 '+ - 'TASKLET - 处理常规任务。 '+ - 'SCHED - 调度程序用于执行负载平衡和其他调度任务。 '+ - 'HRTIMER - 用于高分辨率计时器。 '+ - 'RCU - 执行读拷贝更新 (RCU) 处理。

' - + info: 'CPU softirqs 的细节。在 CPU 区段中,依据每个 CPU 核心分析 softirqs。' }, 'system.softirq_latency': { - info: '维修软件中断的总时间。基于BCC工具中的eBPF softirqs。' + info: '维护软件中断所花费的总时间。基于eBPFsoftirqs from BCC tools.' }, 'system.processes': { - info: '

系统程序。

'+ - '

Running - 显示正在 CPU 中的程序。'+ - 'Blocked - 显示目前被挡下无法进入 CPU 执行的程序,例如:正在等待磁碟完成动作,才能继续。

' + info: '

系统流程.

'+ + '

Running - running or ready to run (runnable). '+ + 'Blocked - currently blocked, waiting for I/O to complete.

' }, 'system.active_processes': { - info: '所有的系统程序。' + info: '系统中的进程总数.' }, 'system.ctxt': { @@ -1286,64 +1230,64 @@ netdataDashboard.context = { }, 'system.swapcalls': { - info: '监控对函数swap_readpageswap_writepage的调用。当启用时,Netdata还显示应用程序的交换访问权限。' + info: '监视对函数的调用 swap_readpage and swap_writepage. When integration with apps is enabled, Netdata also shows swap access per application.' }, 'system.ipc_semaphores': { - info: '分配的系统V IPC信号量。 '+ - '/proc/sys/kernel/sem文件(第二个字段)规定了所有信号量集中信号量的系统范围限制。' + info: '分配的System V IPC信号量的数量. '+ + 'The system-wide limit on the number of semaphores in all semaphore sets is specified in /proc/sys/kernel/sem file (2nd field).' }, 'system.ipc_semaphore_arrays': { - info: '使用过的System V IPC信号量阵列(集)的数量。信号量支持信号量集,其中每个信号量都是计数信号量。 '+ - '因此,当应用程序请求信号量时,内核会以集合的方式释放它们。 '+ - '/proc/sys/kernel/sem文件(第4个字段)中指定了信号量集最大数量的系统范围限制。' + info: 'Number of used System V IPC semaphore arrays (sets). Semaphores support semaphore sets where each one is a counting semaphore. '+ + 'So when an application requests semaphores, the kernel releases them in sets. '+ + 'The system-wide limit on the maximum number of semaphore sets is specified in /proc/sys/kernel/sem file (4th field).' }, 'system.shared_memory_segments': { - info: '分配的System V IPC内存段数。 '+ - '/proc/sys/kernel/shmmni文件中指定了可以创建的系统范围内共享内存段的最大数量。' + info: '分配的System V IPC内存段数. '+ + 'The system-wide maximum number of shared memory segments that can be created is specified in /proc/sys/kernel/shmmni file.' }, 'system.shared_memory_bytes': { - info: 'System V IPC内存段目前使用的内存量。 '+ - '可以创建的最大共享内存段大小的运行时限制在/proc/sys/kernel/shmmax文件中指定。' + info: 'System V IPC内存段当前使用的内存量. '+ + 'The run-time limit on the maximum shared memory segment size that can be created is specified in /proc/sys/kernel/shmmax file.' }, 'system.shared_memory_calls': { - info: '监控对函数shmgetshmatshmdtshmctl的调用。当与应用程序的集成启用时,Netdata还显示每个应用程序的共享内存系统调用使用情况。' + info: '监视对函数的调用 shmget, shmat, shmdt, and shmctl. When integration with apps is enabled, Netdata also shows shared memory system call usage per application.' }, 'system.message_queue_messages': { - info: '系统V IPC消息队列中当前存在的消息数量。' + info: '当前存在于System V IPC消息队列中的消息数。' }, 'system.message_queue_bytes': { - info: '系统V IPC消息队列中消息当前使用的内存量。' + info: 'System V IPC消息队列中消息当前使用的内存量。' }, 'system.uptime': { - info: '系统已运行的时间量,包括暂停的时间。' + info: '系统已运行的时间量,包括挂起所用的时间.' }, 'system.process_thread': { - title : 'Task creation', - info: 'do_fork,或者kernel_clone(如果您运行的内核更新于5.16)来创建新任务的次数,这是用于定义内核内进程和任务的常用名称。Netdata标识监控跟踪点sched_process_fork的线程。此图表由eBPF插件提供。' + title : '任务创建', + info: '其中一项的次数 do_fork, or kernel_clone if you are running kernel newer than 5.9.16, is called to create a new task, which is the common name used to define process and tasks inside the kernel. Netdata identifies the threads monitoring tracepoint sched_process_fork. This chart is provided by eBPF plugin.' }, 'system.exit': { - title : 'Exit monitoring', - info: '呼吁负责关闭的功能(do_exit)和发布(release_task)任务。此图表由eBPF插件提供。' + title : '退出监控', + info: '调用负责关闭的函数 (do_exit) and releasing (release_task) tasks. This chart is provided by eBPF plugin.' }, 'system.task_error': { - title : 'Task error', - info: '创建新进程或线程的错误数量。此图表由eBPF插件提供。' + title : '任务错误', + info: '创建新进程或线程的错误数。此图表由eBPF插件提供.' }, 'system.process_status': { - title : 'Task status', - info: '创建的进程数量和每个周期创建的线程数量(process维度)之间的差异,它还显示了在系统上运行的可能僵尸进程的数量。此图表由eBPF插件提供。' + title : '任务状态', + info: '每个期间创建的进程数和创建的线程数之间的差异(process dimension), it also shows the number of possible zombie process running on system. This chart is provided by eBPF plugin.' }, // ------------------------------------------------------------------------ @@ -1371,41 +1315,41 @@ netdataDashboard.context = { }, 'cpu.core_throttling': { - info: '根据CPU的核心温度对CPU的时钟速度所做的调整次数。' + info: '根据CPU核心温度对CPU时钟速度进行的调整次数.' }, 'cpu.package_throttling': { - info: '根据CPU的封装(芯片)温度对CPU的时钟速度进行的调整次数。' + info: '根据CPU的封装(芯片)温度对CPU时钟速度进行的调整次数.' }, 'cpufreq.cpufreq': { - info: '频率测量CPU每秒执行的周期数。' + info: '频率测量CPU每秒执行的周期数.' }, 'cpuidle.cpuidle': { - info: '在C-states中花费的时间百分比' + info: '在C状态花费的时间百分比.' }, // ------------------------------------------------------------------------ // MEMORY 'mem.ksm': { - info: '

内存页面合并统计数据。 '+ - '共享共享的高比率表示良好的共享, '+ - '但未共享共享的高比率表明浪费了精力。

'+ - '

共享 - 使用共享页面。 '+ - '未共享 - 内存不再共享(页面是唯一的,但反复检查合并)。 '+ - '共享-当前共享的内存(有多少个网站正在共享页面,即保存了多少)。 '+ - '易变 - 易变页面(变化太快,无法放在树上)。

' + info: '

内存页合并统计信息. '+ + 'A high ratio of Sharing to Shared indicates good sharing, '+ + 'but a high ratio of Unshared to Sharing indicates wasted effort.

'+ + '

Shared - used shared pages. '+ + 'Unshared - memory no longer shared (pages are unique but repeatedly checked for merging). '+ + 'Sharing - memory currently shared (how many more sites are sharing the pages, i.e. how much saved). '+ + 'Volatile - volatile pages (changing too fast to be placed in a tree).

' }, 'mem.ksm_savings': { heads: [ netdataDashboard.gaugeChart('Saved', '12%', 'savings', '#0099CC') ], - info: '

KSM节省的内存量。

'+ - '

节省 - 保存内存。 '+ - '提供 - 标记为可合并的内存。

' + info: '

KSM保存的内存量.

'+ + '

Savings - 保存的内存. '+ + 'Offered - 标记为可合并的内存.

' }, 'mem.ksm_ratios': { @@ -1425,23 +1369,23 @@ netdataDashboard.context = { + ' role="application">'; } ], - info: 'The effectiveness of KSM. '+ - '这是当前合并的可合并页面的百分比。' + info: 'KSM的有效性. '+ + '这是当前合并的可合并页面的百分比.' }, 'mem.zram_usage': { - info: 'ZRAM总RAM使用指标。ZRAM使用一些内存来存储有关存储内存页面的元数据,从而引入了与磁盘大小成正比的开销。它排除了相同元素填充的页面,因为没有为它们分配内存。' + info: 'ZRAM total RAM usage metrics. ZRAM uses some memory to store metadata about stored memory pages, thus introducing an overhead which is proportional to disk size. It excludes same-element-filled-pages since no memory is allocated for them.' }, 'mem.zram_savings': { - info: '显示原始和压缩内存数据大小。' + info: '显示原始和压缩内存数据大小.' }, 'mem.zram_ratio': { heads: [ netdataDashboard.gaugeChart('Compression Ratio', '12%', 'ratio', '#0099CC') ], - info: '压缩率,计算为100 * original_size / compressed_size。更多意味着更好的压缩和更多的RAM节省。' + info: 'Compression ratio, calculated as 100 * original_size / compressed_size. More means better compression and more RAM savings.' }, 'mem.zram_efficiency': { @@ -1451,17 +1395,17 @@ netdataDashboard.context = { commonMin: true, commonMax: true, valueRange: "[0, 100]", - info: '内存使用效率,计算为100 * compressed_size / total_mem_used。' + info: 'Memory usage efficiency, calculated as 100 * compressed_size / total_mem_used.' }, 'mem.pgfaults': { - info: '

页面错误是一种中断, '+ - '称为陷阱,当运行中的程序访问内存页面时,由计算机硬件引发 '+ - '映射到虚拟地址空间,但实际上没有加载到主内存中。

'+ - '

次要-页面在生成故障时加载到内存中, '+ - '但在内存管理单元中未标记为正在加载内存中。 '+ - '主要-当系统需要从磁盘加载内存页面或交换内存时生成。

' + info: '

A page fault is a type of interrupt, '+ + 'called trap, raised by computer hardware when a running program accesses a memory page '+ + 'that is mapped into the virtual address space, but not actually loaded into main memory.

'+ + '

Minor - the page is loaded in memory at the time the fault is generated, '+ + 'but is not marked in the memory management unit as being loaded in memory. '+ + 'Major - generated when the system needs to load the memory page from disk or swap memory.

' }, 'mem.committed': { @@ -1470,30 +1414,30 @@ netdataDashboard.context = { }, 'mem.oom_kill': { - info: '被杀死的进程数量 '+ - '内存不足杀手。 '+ - '当系统缺少可用内存时,内核的OOM杀手会被召唤,并且 '+ - '无法在不杀死一个或多个进程的情况下进行。 '+ - '它试图选择其消亡将释放最多记忆的过程,同时 '+ - '给系统用户带来最少的痛苦。 '+ - '此计数器还包括容器中超过内存限制的进程。' + info: '被终止的进程数 '+ + 'Out of Memory Killer. '+ + 'The kernel\'s OOM killer is summoned when the system runs short of free memory and '+ + 'is unable to proceed without killing one or more processes. '+ + 'It tries to pick the process whose demise will free the most memory while '+ + 'causing the least misery for users of the system. '+ + 'This counter also includes processes within containers that have exceeded the memory limit.' }, 'mem.numa': { - info: '

NUMA平衡统计数据。

'+ - '

本地-通过此节点上的进程成功分配了页面。 '+ - '外国 - 最初用于分配给另一个节点的页面。 '+ - '交错-交错策略页面已成功分配给此节点。 '+ - '其他-通过另一个节点上的进程在这个节点上分配的页面。 '+ - 'PteUpdates - 标记为NUMA提示故障的基页。 '+ - 'HugePteUpdates - 标记为NUMA提示故障的透明大页面。 '+ - '与pte_updates相结合,可以计算标记的总地址空间。 '+ - 'HintFaults - NUMA暗示被困的故障。 '+ - 'HintFaultsLocal - 提示本地节点的故障。 '+ - '结合提示故障,可以计算局部故障与远程故障的百分比。 '+ - '很高比例的局部提示故障表明工作量更接近收敛。 '+ - 'PagesMigrated - 页面被迁移,因为它们放错了地方。 '+ - '由于迁移是一种复制操作,它贡献了NUMA平衡产生的开销的最大部分。

' + info: '

NUMA平衡统计.

'+ + '

Local - pages successfully allocated on this node, by a process on this node. '+ + 'Foreign - pages initially intended for this node that were allocated to another node instead. '+ + 'Interleave - interleave policy pages successfully allocated to this node. '+ + 'Other - pages allocated on this node, by a process on another node. '+ + 'PteUpdates - base pages that were marked for NUMA hinting faults. '+ + 'HugePteUpdates - transparent huge pages that were marked for NUMA hinting faults. '+ + 'In Combination with pte_updates the total address space that was marked can be calculated. '+ + 'HintFaults - NUMA hinting faults that were trapped. '+ + 'HintFaultsLocal - hinting faults that were to local nodes. '+ + 'In combination with HintFaults, the percentage of local versus remote faults can be calculated. '+ + 'A high percentage of local hinting faults indicates that the workload is closer to being converged. '+ + 'PagesMigrated - pages were migrated because they were misplaced. '+ + 'As migration is a copying operation, it contributes the largest part of the overhead created by NUMA balancing.

' }, 'mem.available': { @@ -1505,260 +1449,260 @@ netdataDashboard.context = { }, 'mem.kernel': { - info: '

内核使用的总内存量。

'+ - '

Slab - 内核用于缓存数据结构供自己使用。 '+ - 'KernelStack - 为内核完成的每个任务分配。 '+ - 'PageTables - 专用于最低级别的页面表(页面表用于将虚拟地址转换为物理内存地址)。 '+ - 'VmallocUsed-用作虚拟地址空间。 '+ - 'Percpu - 分配给用于支持每个CPU分配的每个CPU分配器(不包括元数据成本)。 '+ - '当您创建每个CPU变量时,系统上的每个处理器都会获得该变量的副本。

' + info: '

内核使用的内存总量.

'+ + '

Slab - used by the kernel to cache data structures for its own use. '+ + 'KernelStack - allocated for each task done by the kernel. '+ + 'PageTables - dedicated to the lowest level of page tables (A page table is used to turn a virtual address into a physical memory address). '+ + 'VmallocUsed - being used as virtual address space. '+ + 'Percpu - allocated to the per-CPU allocator used to back per-CPU allocations (excludes the cost of metadata). '+ + 'When you create a per-CPU variable, each processor on the system gets its own copy of that variable.

' }, 'mem.slab': { - info: '

平板内存统计。

'+ - '

可回收 - 内核可以重用的内存量。 '+ - '不可回收 - 即使内核缺乏内存,也无法重用。

' + info: '

Slab memory statistics.

'+ + '

Reclaimable - amount of memory which the kernel can reuse. '+ + 'Unreclaimable - can not be reused even when the kernel is lacking memory.

' }, 'mem.hugepages': { - info: '专用(或直接)大型页面是为配置为使用大型页面的应用程序保留的内存。巨页使用内存,即使有免费的巨页可用。' + info: 'Dedicated (or Direct) HugePages is memory reserved for applications configured to utilize huge pages. Hugepages are used memory, even if there are free hugepages available.' }, 'mem.transparent_hugepages': { - info: '透明巨页(THP)用巨页支持虚拟内存,支持页面大小的自动推广和降级。它适用于匿名内存映射和tmpfs/shmem的所有应用程序。' + info: 'Transparent HugePages (THP) is backing virtual memory with huge pages, supporting automatic promotion and demotion of page sizes. It works for all applications for anonymous memory mappings and tmpfs/shmem.' }, 'mem.hwcorrupt': { - info: '存在物理损坏问题的内存量,由ECC识别,并由内核预留,使其不被使用。' + info: '存在物理损坏问题的内存量,由 ECC and set aside by the kernel so it does not get used.' }, 'mem.ecc_ce': { - info: '可更正(单位)ECC错误的数量。 '+ - '这些错误不影响系统的正常运行 '+ - '因为他们仍在纠正。 '+ - '周期性可更正错误可能表明其中一个内存模块正在缓慢故障。' + info: '存在物理损坏问题的内存量,由. '+ + 'These errors do not affect the normal operation of the system '+ + 'because they are still being corrected. '+ + 'Periodic correctable errors may indicate that one of the memory modules is slowly failing.' }, 'mem.ecc_ue': { - info: '无法更正(多位)ECC错误的数量。 '+ - '无法更正的错误是一个致命的问题,通常会导致操作系统崩溃。' + info: '无法纠正的(多位)ECC错误数. '+ + 'An uncorrectable error is a fatal issue that will typically lead to an OS crash.' }, 'mem.pagetype_global': { - info: '以一定大小的块为单位的可用内存量。' + info: '在一定大小的块中可用的内存量.' }, 'mem.cachestat_ratio': { - info: '当处理器需要读取或写入主内存中的位置时,它会检查页面缓存中的相应条目。如果条目在那里,则发生了页面缓存命中,并且读取来自缓存。如果没有条目,则会发生页面缓存丢失,内核会分配一个新的条目并从磁盘中复制数据。Netdata计算内存上缓存的访问文件的百分比。计算的比率是计算访问的缓存页面(不计算脏页面和因读取丢失而添加的页面)除以没有脏页面的总访问量。' + info: 'When the processor needs to read or write a location in main memory, it checks for a corresponding entry in the page cache. If the entry is there, a page cache hit has occurred and the read is from the cache. If the entry is not there, a page cache miss has occurred and the kernel allocates a new entry and copies in data from the disk. Netdata calculates the percentage of accessed files that are cached on memory. The ratio is calculated counting the accessed cached pages (without counting dirty pages and pages added because of read misses) divided by total access without dirty pages.' }, 'mem.cachestat_dirties': { - info: '肮脏(修改)页面缓存的数量。引入后修改的页面缓存中的页面称为脏页面。由于页面缓存中的非脏页面在辅助存储(例如硬盘驱动器或固态驱动器)中具有相同的副本,因此丢弃和重用其空间比分页应用程序内存快得多,通常比将脏页面冲入辅助存储并重复使用其空间更可取。' + info: 'Number of dirty(modified) pages cache. Pages in the page cache modified after being brought in are called dirty pages. Since non-dirty pages in the page cache have identical copies in secondary storage (e.g. hard disk drive or solid-state drive), discarding and reusing their space is much quicker than paging out application memory, and is often preferred over flushing the dirty pages into secondary storage and reusing their space.' }, 'mem.cachestat_hits': { - info: '当处理器需要读取或写入主内存中的位置时,它会检查页面缓存中的相应条目。如果条目在那里,则发生了页面缓存命中,并且读取来自缓存。点击量显示未修改的访问页面(我们排除脏页面),此计数还不包括最近插入供阅读的页面。' + info: 'When the processor needs to read or write a location in main memory, it checks for a corresponding entry in the page cache. If the entry is there, a page cache hit has occurred and the read is from the cache. Hits show pages accessed that were not modified (we are excluding dirty pages), this counting also excludes the recent pages inserted for read.' }, 'mem.cachestat_misses': { - info: '当处理器需要读取或写入主内存中的位置时,它会检查页面缓存中的相应条目。如果没有条目,则发生页面缓存丢失,缓存分配新条目并复制主内存的数据。缺少与编写无关的内存的页面插入计数。' + info: 'When the processor needs to read or write a location in main memory, it checks for a corresponding entry in the page cache. If the entry is not there, a page cache miss has occurred and the cache allocates a new entry and copies in data for the main memory. Misses count page insertions to the memory not related to writing.' }, 'mem.sync': { - info: '系统调用sync()和syncfs(),这将文件系统缓冲区刷新到存储设备。这些通话可能会造成性能扰动。sync()调用基于BCC工具中的eBPF syncsnoop。' + info: 'System calls for sync() and syncfs() which flush the file system buffers to storage devices. Performance perturbations might be caused by these calls. The sync() calls are based on the eBPF syncsnoop from BCC tools.' }, 'mem.file_sync': { - info: '系统调用fsync()和fdatasync()传输磁盘设备上文件的所有修改页面缓存。这些通话会阻止,直到设备报告转接已完成。' + info: 'System calls for fsync() and fdatasync() transfer all modified page caches for the files on disk devices. These calls block until the device reports that the transfer has been completed.' }, 'mem.memory_map': { - info: '系统调用msync(),该更改刷新了对映射文件的核心副本所做的更改。' + info: 'System calls for msync() which flushes changes made to the in-core copy of a file that was mapped.' }, 'mem.file_segment': { - info: 'sync_file_range()的系统调用允许在将文件描述符fd引用的打开文件与磁盘同步时进行精细控制。这种系统调用极其危险,不应用于便携式程序。' + info: 'System calls for sync_file_range() permits fine control when synchronizing the open file referred to by the file descriptor fd with disk. This system call is extremely dangerous and should not be used in portable programs.' }, 'filesystem.dc_hit_ratio': { - info: '目录缓存中存在的文件访问百分比。100%表示访问的每个文件都存在于目录缓存中。如果目录缓存中不存在文件1)它们不存在于文件系统中,2)以前没有访问过文件。阅读更多关于目录缓存的信息。当与应用程序的集成启用时,Netdata还根据应用程序显示目录缓存。' + info: 'Percentage of file accesses that were present in the directory cache. 100% means that every file that was accessed was present in the directory cache. If files are not present in the directory cache 1) they are not present in the file system, 2) the files were not accessed before. Read more about directory cache. When integration with apps is enabled, Netdata also shows directory cache per application.' }, 'filesystem.dc_reference': { - info: '文件访问计数器。引用是当有文件访问且文件不存在于目录缓存中时。Miss是当有文件访问且文件系统中找不到文件时。是指有文件访问,文件存在于文件系统中,但不存在于目录缓存中。阅读更多关于目录缓存的信息。' + info: 'Counters of file accesses. Reference is when there is a file access and the file is not present in the directory cache. Miss is when there is file access and the file is not found in the filesystem. Slow is when there is a file access and the file is present in the filesystem but not in the directory cache. Read more about directory cache.' }, 'md.health': { - info: '每个MD阵列的故障设备数量。 '+ - 'Netdata从md状态行的[n/m]字段检索此数据。 '+ - '这意味着理想情况下,数组将有n设备,但目前,m设备正在使用中。 '+ - '失败磁盘n-m。' + info: 'Number of failed devices per MD array. '+ + 'Netdata retrieves this data from the [n/m] field of the md status line. '+ + 'It means that ideally the array would have n devices however, currently, m devices are in use. '+ + 'failed disks is n-m.' }, 'md.disks': { - info: '处于使用和处于停机状态的设备数量。 '+ - 'Netdata从md状态行的[n/m]字段检索此数据。 '+ - '这意味着理想情况下,数组将有n设备,但目前,m设备正在使用中。 '+ - 'inusemdownn-m。' + info: 'Number of devices in use and in the down state. '+ + 'Netdata retrieves this data from the [n/m] field of the md status line. '+ + 'It means that ideally the array would have n devices however, currently, m devices are in use. '+ + 'inuse is m, down is n-m.' }, 'md.status': { - info: '完成正在进行的业务的进展。' + info: 'Completion progress of the ongoing operation.' }, 'md.expected_time_until_operation_finish': { - info: '完成正在进行的操作的预计时间。 '+ - '时间只是一个近似值,因为操作速度将根据其他I/O要求而变化。' + info: 'Estimated time to complete the ongoing operation. '+ + 'The time is only an approximation since the operation speed will vary according to other I/O demands.' }, 'md.operation_speed': { - info: '持续运营的速度。 '+ - '/proc/sys/dev/raid/{speed_limit_min,speed_limit_max}文件中指定了系统范围的重建速度限制。 '+ - '这些选项有利于调整重建过程,并可能增加整体系统负载、cpu和内存使用率。' + info: 'Speed of the ongoing operation. '+ + 'The system-wide rebuild speed limits are specified in /proc/sys/dev/raid/{speed_limit_min,speed_limit_max} files. '+ + 'These options are good for tweaking rebuilt process and may increase overall system load, cpu and memory usage.' }, 'md.mismatch_cnt': { - info: '在执行检查修复时,以及可能在执行重新同步时,md将计算发现的错误数量。 '+ - '不匹配计数记录在sysfs文件md/mismatch_cnt中。 '+ - '此值是重写或(对于check)将重写的扇区数量。 '+ - '它可能大于页面扇区数量的因子的实际错误数量。 '+ - '在RAID1或RAID10上无法非常可靠地解释不匹配,特别是在设备用于交换时。 '+ - '在真正干净的RAID5或RAID6阵列上,任何不匹配都应表明在某些级别上存在硬件问题- '+ - '软件问题绝不应导致此类不匹配。 '+ - '有关详细信息,请参阅md(4)。' + info: 'When performing check and repair, and possibly when performing resync, md will count the number of errors that are found. '+ + 'A count of mismatches is recorded in the sysfs file md/mismatch_cnt. '+ + 'This value is the number of sectors that were re-written, or (for check) would have been re-written. '+ + 'It may be larger than the number of actual errors by a factor of the number of sectors in a page. '+ + 'Mismatches can not be interpreted very reliably on RAID1 or RAID10, especially when the device is used for swap. '+ + 'On a truly clean RAID5 or RAID6 array, any mismatches should indicate a hardware problem at some level - '+ + 'software issues should never cause such a mismatch. '+ + 'For details, see md(4).' }, 'md.flush': { - info: '每个MD阵列的刷新计数。基于BCC工具中的eBPF mdflush。' + info: 'Number of flush counts per MD array. Based on the eBPF mdflush from BCC tools.' }, // ------------------------------------------------------------------------ // IP 'ip.inerrors': { - info: '

接收IP数据包时遇到的错误数量。

' + - '

NoRoutes - 由于没有发送路线而删除的数据包。 ' + - 'Truncated - 由于数据报帧没有携带足够的数据而被丢弃的数据包。 ' + - '校验和-因校验和错误而删除的数据包。

' + info: '

在接收IP数据包期间遇到的错误数.

' + + '

NoRoutes - packets that were dropped because there was no route to send them. ' + + 'Truncated - packets which is being discarded because the datagram frame didn\'t carry enough data. ' + + 'Checksum - packets that were dropped because they had wrong checksum.

' }, 'ip.mcast': { - info: '系统中的总多播流量。' + info: '系统中的总多播流量.' }, 'ip.mcastpkts': { - info: '系统中传输的多播数据包总数。' + info: '系统中传输的多播数据包总数.' }, 'ip.bcast': { - info: '系统中的总广播流量。' + info: '系统中的总广播流量.' }, 'ip.bcastpkts': { - info: '系统中传输的广播数据包总数。' + info: '系统中传输的广播数据包总数.' }, 'ip.ecnpkts': { - info: '

系统中设置了ECN位的接收IP数据包总数。

'+ - '

CEP - 遇到拥堵。 '+ - 'NoECTP - 不支持ECN的运输。 '+ - 'ECTP0ECTP1-支持ECN的传输。

' + info: '

系统中设置ECN位的接收IP数据包总数.

'+ + '

CEP - congestion encountered. '+ + 'NoECTP - non ECN-capable transport. '+ + 'ECTP0 and ECTP1 - ECN capable transport.

' }, 'ip.tcpreorders': { - info: '

TCP通过按正确的顺序排序数据包或防止数据包失序 '+ - '通过请求重新传输出序的数据包。

'+ - '

时间戳 - 使用时间戳选项检测到重新排序。 '+ - 'SACK - 使用选择性确认算法检测到重新排序。 '+ - 'FACK - 使用正向确认算法检测到重新排序。 '+ - 'Reno - 使用快速重新传输算法检测到重新排序。

' + info: '

TCP通过按正确的顺序对数据包进行排序或 '+ + 'by requesting the retransmission of out-of-order packets.

'+ + '

Timestamp - detected re-ordering using the timestamp option. '+ + 'SACK - detected re-ordering using Selective Acknowledgment algorithm. '+ + 'FACK - detected re-ordering using Forward Acknowledgment algorithm. '+ + 'Reno - detected re-ordering using Fast Retransmit algorithm.

' }, 'ip.tcpofo': { - info: '

TCP维护一个无序队列,以在TCP通信中保留无序数据包。

'+ - '

InQueue - TCP层收到一个无序的数据包,并有足够的内存排队。 '+ - 'Droppped - TCP层收到一个无序的数据包,但没有足够的内存,因此将其删除。 '+ - '合并 - 收到的无序数据包与上一个数据包具有覆盖。 '+ - '覆盖部分将被删除。所有这些数据包也将计入InQueue。 '+ - '修剪 - 由于套接字缓冲区溢出,数据包从无序队列中删除。

' + info: '

TCP维护一个无序队列,以保持TCP通信中无序的数据包.

'+ + '

InQueue - the TCP layer receives an out-of-order packet and has enough memory to queue it. '+ + 'Dropped - the TCP layer receives an out-of-order packet but does not have enough memory, so drops it. '+ + 'Merged - the received out-of-order packet has an overlay with the previous packet. '+ + 'The overlay part will be dropped. All these packets will also be counted into InQueue. '+ + 'Pruned - packets dropped from out-of-order queue because of socket buffer overrun.

' }, 'ip.tcpsyncookies': { info: '

SYN cookies '+ - '用于缓解SYN洪水。

'+ - '

收到-发送SYN Cookie后,它回到我们身边并通过了支票。'+ - '发送 - 应用程序无法足够快地接受连接,因此内核无法存储 '+ - '此连接队列中的条目。它没有删除它,而是向客户端发送了一个SYN cookie。 '+ - '失败-从SYN Cookie解码的MSS无效。当这个计数器递增时, '+ - '接收的数据包不会被视为SYN Cookie。

' + 'are used to mitigate SYN flood.

'+ + '

Received - after sending a SYN cookie, it came back to us and passed the check. '+ + 'Sent - an application was not able to accept a connection fast enough, so the kernel could not store '+ + 'an entry in the queue for this connection. Instead of dropping it, it sent a SYN cookie to the client. '+ + 'Failed - the MSS decoded from the SYN cookie is invalid. When this counter is incremented, '+ + 'the received packet won’t be treated as a SYN cookie.

' }, 'ip.tcpmemorypressures': { - info: '套接字因非致命内存分配失败而施加内存压力的次数 '+ - '(内核试图通过减少发送缓冲区等来解决这个问题)。' + info: 'The number of times a socket was put in memory pressure due to a non fatal memory allocation failure '+ + '(the kernel attempts to work around this situation by reducing the send buffers, etc).' }, 'ip.tcpconnaborts': { - info: '

TCP连接中止。

'+ - '

BadData - 当连接在FIN_WAIT1上且内核收到数据包时发生 '+ - '此连接的序列号超过最后一个序列号- '+ - '内核使用RST响应(关闭连接)。 '+ - 'UserClosed - 当内核在已关闭的连接上接收数据并 '+ - '用RST回复。 '+ - 'NoMemory - 当Orphan插太多(未连接到fd)和 '+ - '内核必须删除连接——有时它会发送RST,有时不会。 '+ - '超时 - 当连接超时发生。 '+ - 'Linger - 当内核杀死已被应用程序关闭的套接字并 '+ - '徘徊了足够长的时间。 '+ - '失败 - 当内核尝试发送 RST 但因没有可用内存而失败时发生。

' + info: '

TCP connection aborts.

'+ + '

BadData - happens while the connection is on FIN_WAIT1 and the kernel receives a packet '+ + 'with a sequence number beyond the last one for this connection - '+ + 'the kernel responds with RST (closes the connection). '+ + 'UserClosed - happens when the kernel receives data on an already closed connection and '+ + 'responds with RST. '+ + 'NoMemory - happens when there are too many orphaned sockets (not attached to an fd) and '+ + 'the kernel has to drop a connection - sometimes it will send an RST, sometimes it won\'t. '+ + 'Timeout - happens when a connection times out. '+ + 'Linger - happens when the kernel killed a socket that was already closed by the application and '+ + 'lingered around for long enough. '+ + 'Failed - happens when the kernel attempted to send an RST but failed because there was no memory available.

' }, 'ip.tcp_functions': { - title : 'TCP calls', - info: '对函数tcp_sendmsgtcp_cleanup_rbuftcp_close的调用成功或失败。' + title : 'TCP调用', + info: 'Successful or failed calls to functions tcp_sendmsg, tcp_cleanup_rbuf, and tcp_close.' }, 'ip.total_tcp_bandwidth': { - title : 'TCP bandwidth', - info: '由函数tcp_sendmsgtcp_cleanup_rbuf发送和接收的字节。我们使用tcp_cleanup_rbuf而不是tcp_recvmsg,因为最后一个错过了tcp_read_sock()流量,我们还需要有更多的探针来获得套接字和包大小。' + title : 'TCP带宽', + info: 'Bytes sent and received by functions tcp_sendmsg and tcp_cleanup_rbuf. We use tcp_cleanup_rbuf instead of tcp_recvmsg, because the last one misses tcp_read_sock() traffic and we would also need to have more probes to get the socket and package size.' }, 'ip.tcp_error': { - title : 'TCP errors', - info: '对函数tcp_sendmsgtcp_cleanup_rbuftcp_close的调用失败。' + title : 'TCP错误', + info: 'Failed calls to functions tcp_sendmsg, tcp_cleanup_rbuf, and tcp_close.' }, 'ip.tcp_retransmit': { - title : 'TCP retransmit', - info: '通过函数tcp_retransmit_skb重新传输的数据包数量。' + title : 'TCP重新传输', + info: 'Number of packets retransmitted by function tcp_retransmit_skb.' }, 'ip.udp_functions': { - title : 'UDP calls', - info: '对函数udp_sendmsgudp_recvmsg的调用成功或失败。' + title : 'UDP呼叫', + info: 'Successful or failed calls to functions udp_sendmsg and udp_recvmsg.' }, 'ip.total_udp_bandwidth': { - title : 'UDP bandwidth', - info: '由函数udp_sendmsgudp_recvmsg发送和接收的字节。' + title : 'UDP带宽', + info: 'Bytes sent and received by functions udp_sendmsg and udp_recvmsg.' }, 'ip.udp_error': { - title : 'UDP errors', - info: '对函数udp_sendmsgudp_recvmsg的调用失败。' + title : 'UDP错误', + info: 'Failed calls to functions udp_sendmsg and udp_recvmsg.' }, 'ip.tcp_syn_queue': { - info: '

内核的SYN队列跟踪TCP握手,直到连接完全建立。 ' + - '当太多传入的TCP连接请求处于半开放状态和服务器时,它会溢出 ' + - '未配置回退到SYN Cookie。溢出通常由SYN洪水DoS攻击引起。

' + - '

Drops - 由于SYN队列已满且SYN cookie被禁用,连接数量下降。 ' + - 'Cookies - 由于SYN队列已满而发送的SYN Cookie数量。

' + info: '

内核的SYN队列跟踪TCP握手,直到连接完全建立. ' + + 'It overflows when too many incoming TCP connection requests hang in the half-open state and the server ' + + 'is not configured to fall back to SYN cookies. Overflows are usually caused by SYN flood DoS attacks.

' + + '

Drops - number of connections dropped because the SYN queue was full and SYN cookies were disabled. ' + + 'Cookies - number of SYN cookies sent because the SYN queue was full.

' }, 'ip.tcp_accept_queue': { - info: '

内核的接受队列持有完全建立的TCP连接,等待处理 ' + - '通过收听应用程序。

'+ - '溢出 - 因 '+ - '监听应用程序的接收队列已满。 '+ - 'Drops - 无法处理的传入连接数量,包括SYN洪水, '+ - '溢出、内存不足、安全问题、没有前往目的地的路线、接收相关的ICMP消息、 '+ - '套接字是广播或多播。

' + info: '

内核的接受队列保存完全建立的TCP连接,等待处理 ' + + 'by the listening application.

'+ + 'Overflows - the number of established connections that could not be handled because '+ + 'the receive queue of the listening application was full. '+ + 'Drops - number of incoming connections that could not be handled, including SYN floods, '+ + 'overflows, out of memory, security issues, no route to destination, reception of related ICMP messages, '+ + 'socket is broadcast or multicast.

' }, @@ -1766,368 +1710,368 @@ netdataDashboard.context = { // IPv4 'ipv4.packets': { - info: '

此主机的IPv4数据包统计。

'+ - '

已收到 - IP 层接收的数据包。 '+ - '即使稍后删除数据包,这个计数器也会增加。 '+ - '发送-通过IP层发送的数据包,适用于单播和多播数据包。 '+ - '此计数器不包括转发中计算的任何数据包。 '+ - '转发 - 此主机不是其最终IP目的地的输入数据包, '+ - '结果,有人试图找到一条路线将他们转发到最终目的地。 '+ - '在不充当IP网关的主机中,此计数器将仅包括那些 '+ + info: '

此主机的IPv4数据包统计信息.

'+ + '

Received - IP层接收的数据包. '+ + 'This counter will be increased even if the packet is dropped later. '+ + 'Sent - packets sent via IP layer, for both single cast and multicast packets. '+ + 'This counter does not include any packets counted in Forwarded. '+ + 'Forwarded - input packets for which this host was not their final IP destination, '+ + 'as a result of which an attempt was made to find a route to forward them to that final destination. '+ + 'In hosts which do not act as IP Gateways, this counter will include only those packets which were '+ 'Source-Routed '+ - '源路由选项处理成功。 '+ - '已交付 - 交付到上层协议的数据包,例如TCP、UDP、ICMP等。

' + 'and the Source-Route option processing was successful. '+ + 'Delivered - packets delivered to the upper layer protocols, e.g. TCP, UDP, ICMP, and so on.

' }, 'ipv4.fragsout': { info: '

IPv4碎片 '+ - '此系统的统计数据。

'+ - '

好的 - 已成功碎片化的数据包。 '+ - '失败 - 由于需要碎片化而被丢弃的数据包 '+ - '但不能,例如,由于Don\'t Fragment (DF)标志已设置。 '+ - '创建-因碎片生成的碎片。

' + '此系统的统计信息.

'+ + '

OK - packets that have been successfully fragmented. '+ + 'Failed - packets that have been discarded because they needed to be fragmented '+ + 'but could not be, e.g. due to Don\'t Fragment (DF) flag was set. '+ + 'Created - fragments that have been generated as a result of fragmentation.

' }, 'ipv4.fragsin': { info: '

IPv4重新组装 '+ - '此系统的统计数据。

'+ - '

好的 - 已成功重新组装的数据包。 '+ - '失败 - IP 重新组装算法检测到故障。 '+ - '这不一定是被丢弃的IP片段的计数,因为一些算法 '+ - '通过在收到碎片时进行组合,可能会丢失碎片数量。 '+ - '所有-收到需要重新组装的IP片段。

' + '此系统的统计信息.

'+ + '

OK - packets that have been successfully reassembled. '+ + 'Failed - failures detected by the IP reassembly algorithm. '+ + 'This is not necessarily a count of discarded IP fragments since some algorithms '+ + 'can lose track of the number of fragments by combining them as they are received. '+ + 'All - received IP fragments which needed to be reassembled.

' }, 'ipv4.errors': { - info: '

丢弃的IPv4数据包的数量。

'+ - '

InDiscardsOutDiscards-选择的入站和出站数据包 '+ - '即使没有出错,也要被丢弃 '+ - '检测到以防止它们交付到更高级别的协议。 '+ - 'InHdrErrors - 由于IP头错误而被丢弃的输入数据包,包括 '+ - '校验和不好,版本号不匹配,其他格式错误,超过生存时间, '+ - '在处理他们的IP选项等时发现的错误。 '+ - 'OutNoRoutes - 由于找不到路线而被丢弃的数据包 '+ - '将它们传输到目的地。这包括主机无法路由的任何数据包 '+ - '因为它所有的默认网关都关闭了。 '+ - 'InAddrErrors - 由于IP地址无效或 '+ - '目标IP地址不是本地地址,并且没有启用IP转发。 '+ - 'InUnknownProtos - 由于未知或不支持的协议而被丢弃的输入数据包。

' + info: '

丢弃的IPv4数据包数.

'+ + '

InDiscards, OutDiscards - inbound and outbound packets which were chosen '+ + 'to be discarded even though no errors had been '+ + 'detected to prevent their being deliverable to a higher-layer protocol. '+ + 'InHdrErrors - input packets that have been discarded due to errors in their IP headers, including '+ + 'bad checksums, version number mismatch, other format errors, time-to-live exceeded, '+ + 'errors discovered in processing their IP options, etc. '+ + 'OutNoRoutes - packets that have been discarded because no route could be found '+ + 'to transmit them to their destination. This includes any packets which a host cannot route '+ + 'because all of its default gateways are down. '+ + 'InAddrErrors - input packets that have been discarded due to invalid IP address or '+ + 'the destination IP address is not a local address and IP forwarding is not enabled. '+ + 'InUnknownProtos - input packets which were discarded because of an unknown or unsupported protocol.

' }, 'ipv4.icmp': { - info: '

传输的IPv4 ICMP消息的数量。

'+ - '

收到发送-主机收到并试图发送的ICMP消息。 '+ - '这两个计数器都包含错误。

' + info: '

传输的IPv4 ICMP消息数.

'+ + '

Received, Sent - ICMP messages which the host received and attempted to send. '+ + 'Both these counters include errors.

' }, 'ipv4.icmp_errors': { - info: '

IPv4 ICMP错误的数量。

'+ - '

InErrors - 收到ICMP消息,但确定存在ICMP特定错误, '+ - '例如,ICMP校验和不好,长度不好等。 '+ - 'OutErrors - 此主机由于 '+ - '在ICMP中发现的问题,如缺乏缓冲区。 '+ - '此计数器不包括在ICMP层外发现的错误 '+ - '例如IP无法路由生成的数据报。 '+ - 'InCsumErrors-收到校验和不良的ICMP消息。

' + info: '

IPv4 ICMP错误数.

'+ + '

InErrors - received ICMP messages but determined as having ICMP-specific errors, '+ + 'e.g. bad ICMP checksums, bad length, etc. '+ + 'OutErrors - ICMP messages which this host did not send due to '+ + 'problems discovered within ICMP such as a lack of buffers. '+ + 'This counter does not include errors discovered outside the ICMP layer '+ + 'such as the inability of IP to route the resultant datagram. '+ + 'InCsumErrors - received ICMP messages with bad checksum.

' }, 'ipv4.icmpmsg': { - info: '转让数量 '+ - 'IPv4 ICMP控制消息。' + info: '已传输的数量 '+ + 'IPv4 ICMP control messages.' }, 'ipv4.udppackets': { - info: '传输的UDP数据包的数量。' + info: '传输的UDP数据包数.' }, 'ipv4.udperrors': { - info: '

在传输UDP数据包时遇到的错误数量。

'+ - 'RcvbufErrors - 接收缓冲区已满。 '+ - 'SndbufErrors - 发送缓冲区已满,没有可用的内核内存,或 '+ - 'IP层在尝试发送数据包时报告了错误,并且没有设置错误队列。 '+ - 'InErrors - 这是所有错误的聚合计数器,不包括NoPorts。 '+ - 'NoPorts - 没有应用程序在目标端口监听。 '+ - 'InCsumErrors - 检测到UDP校验和失败。 '+ - '忽略多 - 忽略多播数据包。' + info: '

传输UDP数据包期间遇到的错误数.

'+ + 'RcvbufErrors - receive buffer is full. '+ + 'SndbufErrors - send buffer is full, no kernel memory available, or '+ + 'the IP layer reported an error when trying to send the packet and no error queue has been setup. '+ + 'InErrors - that is an aggregated counter for all errors, excluding NoPorts. '+ + 'NoPorts - no application is listening at the destination port. '+ + 'InCsumErrors - a UDP checksum failure is detected. '+ + 'IgnoredMulti - ignored multicast packets.' }, 'ipv4.udplite': { - info: '传输的UDP-Lite数据包的数量。' + info: '传输的UDP Lite数据包数.' }, 'ipv4.udplite_errors': { - info: '

传输UDP-Lite数据包时遇到的错误数量。

'+ - 'RcvbufErrors - 接收缓冲区已满。 '+ - 'SndbufErrors - 发送缓冲区已满,没有可用的内核内存,或 '+ - 'IP层在尝试发送数据包时报告了错误,并且没有设置错误队列。 '+ - 'InErrors - 这是所有错误的聚合计数器,不包括NoPorts。 '+ - 'NoPorts - 没有应用程序在目标端口监听。 '+ - 'InCsumErrors - 检测到UDP校验和失败。 '+ - '忽略多 - 忽略多播数据包。' + info: '

传输UDP Lite数据包期间遇到的错误数.

'+ + 'RcvbufErrors - receive buffer is full. '+ + 'SndbufErrors - send buffer is full, no kernel memory available, or '+ + 'the IP layer reported an error when trying to send the packet and no error queue has been setup. '+ + 'InErrors - that is an aggregated counter for all errors, excluding NoPorts. '+ + 'NoPorts - no application is listening at the destination port. '+ + 'InCsumErrors - a UDP checksum failure is detected. '+ + 'IgnoredMulti - ignored multicast packets.' }, 'ipv4.tcppackets': { - info: '

TCP层传输的数据包数量。

'+ - '

已收到-已收到的数据包,包括错误接收的数据包, '+ - '例如校验和错误、无效的TCP标头等。 '+ - '发送-发送数据包,不包括重新传输的数据包。 '+ - '但它包括SYN、ACK和RST数据包。

' + info: '

TCP层传输的数据包数.

'+ + '

Received - received packets, including those received in error, '+ + 'such as checksum error, invalid TCP header, and so on. '+ + 'Sent - sent packets, excluding the retransmitted packets. '+ + 'But it includes the SYN, ACK, and RST packets.

' }, 'ipv4.tcpsock': { - info: '当前状态已建立或关闭的TCP连接数量。 '+ - '这是测量时已建立连接的快照 '+ - '(即在同一迭代中建立连接和断开连接不会影响此指标)。' + info: '当前状态为“已建立”或“关闭等待”的TCP连接数. '+ + 'This is a snapshot of the established connections at the time of measurement '+ + '(i.e. a connection established and a connection disconnected within the same iteration will not affect this metric).' }, 'ipv4.tcpopens': { - info: '

TCP连接统计。

'+ - '

活跃 - 此主机尝试的传出TCP连接数量。 '+ - '被动 - 此主机接受的传入TCP连接数量。

' + info: '

TCP连接统计信息.

'+ + '

Active - number of outgoing TCP connections attempted by this host. '+ + 'Passive - number of incoming TCP connections accepted by this host.

' }, 'ipv4.tcperrors': { - info: '

TCP错误。

'+ - '

InErrs - 错误地收到 TCP 时段 '+ - '(包括标题太小、校验和错误、序列错误、错误数据包——适用于IPv4和IPv6)。 '+ - 'InCsumErrors - 收到校验和错误的TCP段(适用于IPv4和IPv6)。 '+ - 'RetransSegs - TCP段重新传输。

' + info: '

TCP错误.

'+ + '

InErrs - TCP segments received in error '+ + '(including header too small, checksum errors, sequence errors, bad packets - for both IPv4 and IPv6). '+ + 'InCsumErrors - TCP segments received with checksum errors (for both IPv4 and IPv6). '+ + 'RetransSegs - TCP segments retransmitted.

' }, 'ipv4.tcphandshake': { - info: '

TCP握手统计。

'+ - '

EstabResets - 已建立的连接重置 '+ - '(即从 ESTABLISHED 或 CLOSE_WAIT 直接过渡到 CLOSED 的连接)。 '+ - 'OutRsts - 发送TCP段,并设置RST标志(适用于IPv4和IPv6)。 '+ - 'AttemptFails - TCP连接从任一方向直接过渡的次数 '+ - 'SYN_SENT或SYN_RECV到CLOED,加上TCP连接直接过渡的次数 '+ - '从SYN_RECV到监听。 '+ - 'SynRetrans - 显示新的出站 TCP 连接的重试, '+ - '这可能表明远程主机上的一般连接问题或积压。

' + info: '

TCP握手统计信息.

'+ + '

EstabResets - established connections resets '+ + '(i.e. connections that made a direct transition from ESTABLISHED or CLOSE_WAIT to CLOSED). '+ + 'OutRsts - TCP segments sent, with the RST flag set (for both IPv4 and IPv6). '+ + 'AttemptFails - number of times TCP connections made a direct transition from either '+ + 'SYN_SENT or SYN_RECV to CLOSED, plus the number of times TCP connections made a direct transition '+ + 'from the SYN_RECV to LISTEN. '+ + 'SynRetrans - shows retries for new outbound TCP connections, '+ + 'which can indicate general connectivity issues or backlog on the remote host.

' }, 'ipv4.sockstat_sockets': { - info: '所有使用的套接字总数 '+ - '地址家庭'+ - '在这个系统中。' + info: '所有已用套接字的总数 '+ + 'address families '+ + 'in this system.' }, 'ipv4.sockstat_tcp_sockets': { - info: '

系统中某些TCP套接字的数量 '+ - 'states

'+ - '

Alloc - 处于任何 TCP 状态。 '+ - 'Orphan - 在任何用户进程中不再连接到套接字描述符, '+ - '但为了完成传输协议,内核仍然需要保持状态。 '+ - 'InUse - 处于任何 TCP 状态,TIME-WAIT 和 CLOSED 除外。 '+ - 'TimeWait - 处于TIME-WAIT状态。

' + info: '

系统中特定位置的TCP套接字数 '+ + 'states.

'+ + '

Alloc - in any TCP state. '+ + 'Orphan - no longer attached to a socket descriptor in any user processes, '+ + 'but for which the kernel is still required to maintain state in order to complete the transport protocol. '+ + 'InUse - in any TCP state, excluding TIME-WAIT and CLOSED. '+ + 'TimeWait - in the TIME-WAIT state.

' }, 'ipv4.sockstat_tcp_mem': { - info: '分配的TCP套接字使用的内存量。' + info: '分配的TCP套接字使用的内存量.' }, 'ipv4.sockstat_udp_sockets': { - info: '使用UDP套接字的数量。' + info: '使用的UDP套接字数.' }, 'ipv4.sockstat_udp_mem': { - info: '分配的UDP套接字使用的内存量。' + info: '分配的UDP套接字使用的内存量.' }, 'ipv4.sockstat_udplite_sockets': { - info: '使用UDP-Lite套接字的数量。' + info: '使用的UDP Lite套接字数.' }, 'ipv4.sockstat_raw_sockets': { - info: '使用原始套接字的数量。' + info: '使用的数量 采用原始套接字.' }, 'ipv4.sockstat_frag_sockets': { - info: '散列表中用于数据包重新组装的条目数量。' + info: '哈希表中用于数据包重组的条目数.' }, 'ipv4.sockstat_frag_mem': { - info: '用于数据包重新组装的内存量。' + info: '用于数据包重组的内存量.' }, // ------------------------------------------------------------------------ // IPv6 'ipv6.packets': { - info: '

此主机的IPv6数据包统计信息。

'+ - '

已收到 - IP 层接收的数据包。 '+ - '即使稍后删除数据包,这个计数器也会增加。 '+ - '发送-通过IP层发送的数据包,适用于单播和多播数据包。 '+ - '此计数器不包括转发中计算的任何数据包。 '+ - '转发 - 此主机不是其最终IP目的地的输入数据包, '+ - '结果,有人试图找到一条路线将他们转发到最终目的地。 '+ - '在不充当IP网关的主机中,此计数器将仅包括那些 '+ + info: '

此主机的IPv6数据包统计信息.

'+ + '

Received - IP层接收的数据包. '+ + 'This counter will be increased even if the packet is dropped later. '+ + 'Sent - packets sent via IP layer, for both single cast and multicast packets. '+ + 'This counter does not include any packets counted in Forwarded. '+ + 'Forwarded - input packets for which this host was not their final IP destination, '+ + 'as a result of which an attempt was made to find a route to forward them to that final destination. '+ + 'In hosts which do not act as IP Gateways, this counter will include only those packets which were '+ 'Source-Routed '+ - '源路由选项处理成功。 '+ - '交付 - 交付到上层协议的数据包,例如TCP、UDP、ICMP等。

' + 'and the Source-Route option processing was successful. '+ + 'Delivers - packets delivered to the upper layer protocols, e.g. TCP, UDP, ICMP, and so on.

' }, 'ipv6.fragsout': { - info: '

IPv6碎片'+ - '此系统的统计数据。

'+ - '

好的 - 已成功碎片化的数据包。 '+ - '失败 - 由于需要碎片化而被丢弃的数据包 '+ - '但不能,例如,由于Don\'t Fragment (DF)标志已设置。 '+ - '所有-碎片生成的碎片。

' + info: '

IPv6碎片 '+ + '此系统的统计信息.

'+ + '

OK - packets that have been successfully fragmented. '+ + 'Failed - packets that have been discarded because they needed to be fragmented '+ + 'but could not be, e.g. due to Don\'t Fragment (DF) flag was set. '+ + 'All - fragments that have been generated as a result of fragmentation.

' }, 'ipv6.fragsin': { info: '

IPv6重新组装 '+ - '此系统的统计数据。

'+ - '

好的 - 已成功重新组装的数据包。 '+ - '失败 - IP 重新组装算法检测到故障。 '+ - '这不一定是被丢弃的IP片段的计数,因为一些算法 '+ - '通过在收到碎片时进行组合,可能会丢失碎片数量。 '+ - '超时 - 检测到重新组装超时。 '+ - '所有-收到需要重新组装的IP片段。

' + '此系统的统计信息.

'+ + '

OK - packets that have been successfully reassembled. '+ + 'Failed - failures detected by the IP reassembly algorithm. '+ + 'This is not necessarily a count of discarded IP fragments since some algorithms '+ + 'can lose track of the number of fragments by combining them as they are received. '+ + 'Timeout - reassembly timeouts detected. '+ + 'All - received IP fragments which needed to be reassembled.

' }, 'ipv6.errors': { - info: '

丢弃的IPv6数据包的数量。

'+ - '

InDiscardsOutDiscards - 即使 '+ - '没有检测到错误来阻止它们交付到更高级别的协议。 '+ - 'InHdrErrors - IP头中的错误,包括糟糕的校验和、版本号不匹配、 '+ - '其他格式错误、超出使用时间等。 '+ - 'InAddrErrors - 无效的IP地址或目标IP地址不是本地地址,并且 '+ - '未启用IP转发。 '+ - 'InUnknownProtos - 未知或不支持的协议。 '+ - 'InTooBigErrors - 大小超过链接MTU。 '+ - 'InTruncatedPkts - 数据包框架没有携带足够的数据。 '+ - 'InNoRoutes - 转发时找不到任何路线。 '+ - 'OutNoRoutes - 找不到此主机生成的数据包的路由。

' + info: '

丢弃的IPv6数据包数.

'+ + '

InDiscards, OutDiscards - packets which were chosen to be discarded even though '+ + 'no errors had been detected to prevent their being deliverable to a higher-layer protocol. '+ + 'InHdrErrors - errors in IP headers, including bad checksums, version number mismatch, '+ + 'other format errors, time-to-live exceeded, etc. '+ + 'InAddrErrors - invalid IP address or the destination IP address is not a local address and '+ + 'IP forwarding is not enabled. '+ + 'InUnknownProtos - unknown or unsupported protocol. '+ + 'InTooBigErrors - the size exceeded the link MTU. '+ + 'InTruncatedPkts - packet frame did not carry enough data. '+ + 'InNoRoutes - no route could be found while forwarding. '+ + 'OutNoRoutes - no route could be found for packets generated by this host.

' }, 'ipv6.udppackets': { - info: '传输的UDP数据包的数量。' + info: '传输的UDP数据包数.' }, 'ipv6.udperrors': { - info: '

在传输UDP数据包时遇到的错误数量。

'+ - 'RcvbufErrors - 接收缓冲区已满。 '+ - 'SndbufErrors - 发送缓冲区已满,没有可用的内核内存,或 '+ - 'IP层在尝试发送数据包时报告了错误,并且没有设置错误队列。 '+ - 'InErrors - 这是所有错误的聚合计数器,不包括NoPorts。 '+ - 'NoPorts - 没有应用程序在目标端口监听。 '+ - 'InCsumErrors - 检测到UDP校验和失败。 '+ - '忽略多 - 忽略多播数据包。' + info: '

传输UDP数据包期间遇到的错误数.

'+ + 'RcvbufErrors - receive buffer is full. '+ + 'SndbufErrors - send buffer is full, no kernel memory available, or '+ + 'the IP layer reported an error when trying to send the packet and no error queue has been setup. '+ + 'InErrors - that is an aggregated counter for all errors, excluding NoPorts. '+ + 'NoPorts - no application is listening at the destination port. '+ + 'InCsumErrors - a UDP checksum failure is detected. '+ + 'IgnoredMulti - ignored multicast packets.' }, 'ipv6.udplitepackets': { - info: '传输的UDP-Lite数据包的数量。' + info: '传输的UDP Lite数据包数.' }, 'ipv6.udpliteerrors': { - info: '

传输UDP-Lite数据包时遇到的错误数量。

'+ - '

RcvbufErrors - 接收缓冲区已满。 '+ - 'SndbufErrors - 发送缓冲区已满,没有可用的内核内存,或 '+ - 'IP层在尝试发送数据包时报告了错误,并且没有设置错误队列。 '+ - 'InErrors - 这是所有错误的聚合计数器,不包括NoPorts。 '+ - 'NoPorts - 没有应用程序在目标端口监听。 '+ - 'InCsumErrors - 检测到UDP校验和失败。

' + info: '

传输UDP Lite数据包期间遇到的错误数.

'+ + '

RcvbufErrors - receive buffer is full. '+ + 'SndbufErrors - send buffer is full, no kernel memory available, or '+ + 'the IP layer reported an error when trying to send the packet and no error queue has been setup. '+ + 'InErrors - that is an aggregated counter for all errors, excluding NoPorts. '+ + 'NoPorts - no application is listening at the destination port. '+ + 'InCsumErrors - a UDP checksum failure is detected.

' }, 'ipv6.mcast': { - info: 'IPv6组播总流量。' + info: 'IPv6多播通信总量.' }, 'ipv6.bcast': { - info: 'IPv6广播总流量。' + info: 'IPv6广播总流量.' }, 'ipv6.mcastpkts': { - info: '传输的IPv6组播数据包总数。' + info: '传输的IPv6多播数据包总数.' }, 'ipv6.icmp': { - info: '

传输的ICMPv6消息数量。

'+ - '

收到发送-主机收到并试图发送的ICMP消息。 '+ - '这两个计数器都包含错误。

' + info: '

传输的ICMPv6消息数.

'+ + '

Received, Sent - ICMP messages which the host received and attempted to send. '+ + 'Both these counters include errors.

' }, 'ipv6.icmpredir': { - info: '传输的ICMPv6重定向消息的数量。'+ - '这些信息通知主机更新其路由信息(在替代路由上发送数据包)。' + info: '传输的ICMPv6重定向消息数. '+ + 'These messages inform a host to update its routing information (to send packets on an alternative route).' }, 'ipv6.icmpechos': { - info: 'ICMPv6回声消息的数量。' + info: '传输的ICMPv6重定向消息数.' }, 'ipv6.icmperrors': { - info: '

ICMPv6错误的数量和 '+ - '错误消息

'+ - '

InErrorsOutErrors - 糟糕的ICMP消息(错误的ICMP校验和,糟糕的长度等)。 '+ - 'InCsumErrors - 校验和错误。

' + info: '

ICMPv6错误数和 '+ + 'error messages.

'+ + '

InErrors, OutErrors - bad ICMP messages (bad ICMP checksums, bad length, etc.). '+ + 'InCsumErrors - wrong checksum.

' }, 'ipv6.groupmemb': { - info: '

传输的ICMPv6组成员消息的数量。

'+ - '

多播路由器发送组成员查询消息,以了解哪些组在其每个组上都有成员 '+ - '连接物理网络。主机计算机通过为每个 '+ - '主机加入的多播组。主机计算机也可以在以下情况下发送组成员报告 '+ - '它加入了一个新的多播组。 '+ - '当主机离开组播组时,会发送组成员减少消息。

' + info: '

传输的ICMPv6组成员身份消息数.

'+ + '

Multicast routers send Group Membership Query messages to learn which groups have members on each of their '+ + 'attached physical networks. Host computers respond by sending a Group Membership Report for each '+ + 'multicast group joined by the host. A host computer can also send a Group Membership Report when '+ + 'it joins a new multicast group. '+ + 'Group Membership Reduction messages are sent when a host computer leaves a multicast group.

' }, 'ipv6.icmprouter': { - info: '

转让ICMPv6的数量 '+ - '路由器发现消息。

'+ - '

路由器招标消息从计算机主机发送到局域网上的任何路由器 '+ - '要求他们在网络上做广告。 '+ - '路由器广告消息由局域网上的路由器发送,以宣布其IP地址 '+ - '可供路由。

' + info: '

传输的ICMPv6的数量 '+ + 'Router Discovery messages.

'+ + '

Router Solicitations message is sent from a computer host to any routers on the local area network '+ + 'to request that they advertise their presence on the network. '+ + 'Router Advertisement message is sent by a router on the local area network to announce its IP address '+ + 'as available for routing.

' }, 'ipv6.icmpneighbor': { - info: '

转让ICMPv6的数量 '+ - '邻居发现消息。

'+ - '

邻居请求被节点用于确定链接层地址 '+ - '邻居,或验证邻居是否仍然可以通过缓存的链接层地址访问。 '+ - '邻居广告被节点用于响应邻居邀约消息。

' + info: '

传输的ICMPv6的数量 '+ + 'Neighbour Discovery messages.

'+ + '

Neighbor Solicitations are used by nodes to determine the link layer address '+ + 'of a neighbor, or to verify that a neighbor is still reachable via a cached link layer address. '+ + 'Neighbor Advertisements are used by nodes to respond to a Neighbor Solicitation message.

' }, 'ipv6.icmpmldv2': { - info: '转让ICMPv6的数量'+ - '多播监听器发现(MLD)消息。' + info: '传输的ICMPv6的数量'+ + 'Multicast Listener Discovery (MLD) messages.' }, 'ipv6.icmptypes': { - info: '传输的ICMPv6消息数量 '+ - '某些类型。' + info: '已传输的ICMPv6消息数 '+ + 'certain types.' }, 'ipv6.ect': { - info: '

系统中设置了ECN位的接收IPv6数据包总数。

'+ - '

CEP - 遇到拥堵。 '+ - 'NoECTP - 不支持ECN的运输。 '+ - 'ECTP0ECTP1-支持ECN的传输。

' + info: '

系统中设置了ECN位的已接收IPv6数据包总数.

'+ + '

CEP - congestion encountered. '+ + 'NoECTP - non ECN-capable transport. '+ + 'ECTP0 and ECTP1 - ECN capable transport.

' }, 'ipv6.sockstat6_tcp_sockets': { - info: '任何TCP套接字的数量 '+ - 'state, '+ - '不包括时间等待和关闭。' + info: 'The number of TCP sockets in any '+ + 'state, '+ + 'excluding TIME-WAIT and CLOSED.' }, 'ipv6.sockstat6_udp_sockets': { - info: '使用UDP套接字的数量。' + info: '使用的UDP套接字数.' }, 'ipv6.sockstat6_udplite_sockets': { - info: '使用UDP-Lite套接字的数量。' + info: '使用的UDP Lite套接字数.' }, 'ipv6.sockstat6_raw_sockets': { - info: '使用原始套接字的数量。' + info: '使用的数量 raw sockets.' }, 'ipv6.sockstat6_frag_sockets': { - info: '散列表中用于数据包重新组装的条目数量。' + info: '哈希表中用于数据包重组的条目数.' }, @@ -2135,99 +2079,99 @@ netdataDashboard.context = { // SCTP 'sctp.established': { - info: '当前状态为的关联数量 '+ - '已建立、已关闭接收或即将关闭。' + info: 'The number of associations for which the current state is either '+ + 'ESTABLISHED, SHUTDOWN-RECEIVED or SHUTDOWN-PENDING.' }, 'sctp.transitions': { - info: '

关联在州之间直接过渡的次数。

'+ - '

活跃 - 从COOKIE-ECHOED到已建立。上层发起了关联尝试。 '+ - '被动 - 从关闭到已建立。远程端点发起了关联尝试。 '+ - '中止-使用原始ABORT从任何状态到关闭。不光彩地终止协会。 '+ - 'Shutdown - 从SHUTDOWN-SENT或SHUTDOWN-ACK-SENT到CLOSHED。优雅地终止协会。

' + info: '

协会在国家间直接过渡的次数.

'+ + '

Active - from COOKIE-ECHOED to ESTABLISHED. The upper layer initiated the association attempt. '+ + 'Passive - from CLOSED to ESTABLISHED. The remote endpoint initiated the association attempt. '+ + 'Aborted - from any state to CLOSED using the primitive ABORT. Ungraceful termination of the association. '+ + 'Shutdown - from SHUTDOWN-SENT or SHUTDOWN-ACK-SENT to CLOSED. Graceful termination of the association.

' }, 'sctp.packets': { - info: '

传输的SCTP数据包数量。

'+ - '

已收到 - 包含重复的数据包。 '+ - '发送-包括重新传输的数据块。

' + info: '

传输的SCTP数据包数.

'+ + '

Received - includes duplicate packets. '+ + 'Sent - includes retransmitted DATA chunks.

' }, 'sctp.packet_errors': { - info: '

接收SCTP数据包时遇到的错误数量。

'+ - '

无效 - 接收方无法识别适当关联的数据包。 '+ - '校验和 - 校验和无效的数据包。

' + info: '

接收SCTP数据包期间遇到的错误数.

'+ + '

Invalid - packets for which the receiver was unable to identify an appropriate association. '+ + 'Checksum - packets with an invalid checksum.

' }, 'sctp.fragmentation': { - info: '

碎片化和重新组装的SCTP消息的数量。

'+ - '

重新组装 - 重新组装用户消息,在转换为数据块后。 '+ - '碎片化 - 由于MTU而不得不碎片化的用户消息。

' + info: '

分段和重新组合的SCTP消息数.

'+ + '

Reassembled - reassembled user messages, after conversion into DATA chunks. '+ + 'Fragmented - user messages that have to be fragmented because of the MTU.

' }, 'sctp.chunks': { - info: '传输控件、有序和无顺序数据块的数量。 '+ - '不包括重播和重复。' + info: '传输的控制、有序和无序数据块的数量. '+ + 'Retransmissions and duplicates are not included.' }, // ------------------------------------------------------------------------ // Netfilter Connection Tracker 'netfilter.conntrack_sockets': { - info: 'Conntrack表中的条目数。' + info: 'conntrack表中的条目数.' }, 'netfilter.conntrack_new': { - info: '

数据包跟踪统计信息。(自v4.9以来)和忽略(自v5.10以来)在最新内核中被硬编码为零。

'+ - '

- 添加以前意想不到的条目。 '+ - '忽略-已连接到conntrack条目的数据包。 '+ - '无效 - 看到无法跟踪的数据包。

' + info: '

数据包跟踪统计信息. New (since v4.9) and Ignore (since v5.10) are hardcoded to zeros in the latest kernel.

'+ + '

New - conntrack entries added which were not expected before. '+ + 'Ignore - packets seen which are already connected to a conntrack entry. '+ + 'Invalid - packets seen which can not be tracked.

' }, 'netfilter.conntrack_changes': { - info: '

conntrack表格中的更改数量。

'+ - '

插入删除-跟踪插入或删除的条目。 '+ - '删除列表 - 跟踪被列入垂死列表的条目。

' + info: '

conntrack表中的更改数.

'+ + '

Inserted, Deleted - conntrack entries which were inserted or removed. '+ + 'Delete-list - conntrack entries which were put to dying list.

' }, 'netfilter.conntrack_expect': { - info: '

“预期”表中的事件数量。 '+ - '连接跟踪预期是用于“预期”与现有连接相关连接的机制。 '+ - '期望是预计在一段时间内发生的连接。

'+ - '

创建删除-跟踪插入或删除的条目。 '+ - ' - 在对它们的预期已经存在后添加了conntrack条目。

' + info: '

The number of events in the "expect" table. '+ + 'Connection tracking expectations are the mechanism used to "expect" RELATED connections to existing ones. '+ + 'An expectation is a connection that is expected to happen in a period of time.

'+ + '

Created, Deleted - conntrack entries which were inserted or removed. '+ + 'New - conntrack entries added after an expectation for them was already present.

' }, 'netfilter.conntrack_search': { - info: '

Conntrack表查找统计信息。

'+ - '

Searched - 进行conntrack 表格查找。 '+ - '重新启动-由于散列调整大小而不得不重新启动的conntrack表查找。 '+ - '找到-成功跟踪表格查找。

' + info: '

Conntrack表查找统计信息.

'+ + '

Searched - conntrack table lookups performed. '+ + 'Restarted - conntrack table lookups which had to be restarted due to hashtable resizes. '+ + 'Found - conntrack table lookups which were successful.

' }, 'netfilter.conntrack_errors': { - info: '

Conntrack错误。

'+ - '

IcmpError - 由于错误情况无法跟踪的数据包。 '+ - '插入失败 - 尝试插入列表但失败的条目 '+ - '(如果同一条目已经存在,则可能)。 '+ - 'Drop - 由于conntrack失败而删除的数据包。 '+ - '要么新的conntrack条目分配失败,要么协议帮助程序删除数据包。 '+ - 'EarlyDrop - 如果达到最大表大小,请删除conntrack条目,为新条目腾出空间。

' + info: '

Conntrack错误.

'+ + '

IcmpError - packets which could not be tracked due to error situation. '+ + 'InsertFailed - entries for which list insertion was attempted but failed '+ + '(happens if the same entry is already present). '+ + 'Drop - packets dropped due to conntrack failure. '+ + 'Either new conntrack entry allocation failed, or protocol helper dropped the packet. '+ + 'EarlyDrop - dropped conntrack entries to make room for new ones, if maximum table size was reached.

' }, 'netfilter.synproxy_syn_received': { - info: '从客户端收到的初始TCP SYN数据包的数量。' + info: '从客户端接收的初始TCP SYN数据包数.' }, 'netfilter.synproxy_conn_reopened': { - info: '直接从TIME-WAIT状态由新的TCP SYN数据包重新打开连接的数量。' + info: '新TCP SYN数据包直接从TIME-WAIT状态重新打开的连接数.' }, 'netfilter.synproxy_cookies': { - info: '

SYNPROXY Cookie统计。

'+ - '

有效无效-从客户端收到的TCP ACK数据包中的cookie验证结果。 '+ - '重新传输 - TCP SYN数据包重新传输到服务器。 '+ - '当客户端重复TCP ACK且与服务器的连接尚未建立时,就会发生这种情况。

' + info: '

SYNPROXY cookie统计信息.

'+ + '

Valid, Invalid - result of cookie validation in TCP ACK packets received from clients. '+ + 'Retransmits - TCP SYN packets retransmitted to the server. '+ + 'It happens when the client repeats TCP ACK and the connection to the server is not yet established.

' }, // ------------------------------------------------------------------------ @@ -2235,414 +2179,414 @@ netdataDashboard.context = { // APPS cpu 'apps.cpu': { - info: 'CPU总利用率(所有内核)。它包括用户、系统和客人时间。' + info: 'Total CPU utilization (all cores). It includes user, system and guest time.' }, 'groups.cpu': { - info: 'CPU总利用率(所有内核)。它包括用户、系统和客人时间。' + info: 'Total CPU utilization (all cores). It includes user, system and guest time.' }, 'users.cpu': { - info: 'CPU总利用率(所有内核)。它包括用户、系统和客人时间。' + info: 'Total CPU utilization (all cores). It includes user, system and guest time.' }, 'apps.cpu_user': { - info: 'CPU 忙于执行代码所需的时间 '+ - '用户模式(所有核心)。' + info: 'The amount of time the CPU was busy executing code in '+ + 'user mode (all cores).' }, 'groups.cpu_user': { - info: 'CPU 忙于执行代码所需的时间 '+ - '用户模式(所有核心)。' + info: 'The amount of time the CPU was busy executing code in '+ + 'user mode (all cores).' }, 'users.cpu_user': { - info: 'TCPU忙于执行代码的大量时间 '+ - '用户模式(所有核心)。' + info: 'The amount of time the CPU was busy executing code in '+ + 'user mode (all cores).' }, 'apps.cpu_system': { - info: 'CPU 忙于执行代码所需的时间 '+ - '内核模式(所有内核)。' + info: 'The amount of time the CPU was busy executing code in '+ + 'kernel mode (all cores).' }, 'groups.cpu_system': { - info: 'CPU 忙于执行代码所需的时间 '+ - '内核模式(所有内核)。' + info: 'The amount of time the CPU was busy executing code in '+ + 'kernel mode (all cores).' }, 'users.cpu_system': { - info: 'CPU 忙于执行代码所需的时间 '+ - '内核模式(所有内核)。' + info: 'The amount of time the CPU was busy executing code in '+ + 'kernel mode (all cores).' }, 'apps.cpu_guest': { - info: '为来宾操作系统(所有内核)运行虚拟CPU所花费的时间。' + info: 'The amount of time spent running a virtual CPU for a guest operating system (all cores).' }, 'groups.cpu_guest': { - info: '为来宾操作系统(所有内核)运行虚拟CPU所花费的时间。' + info: 'The amount of time spent running a virtual CPU for a guest operating system (all cores).' }, 'users.cpu_guest': { - info: '为来宾操作系统(所有内核)运行虚拟CPU所花费的时间。' + info: 'The amount of time spent running a virtual CPU for a guest operating system (all cores).' }, // APPS disk 'apps.preads': { - info: '从存储层读取的数据量。 '+ - '需要实际的物理磁盘I/O。' + info: 'The amount of data that has been read from the storage layer. '+ + 'Actual physical disk I/O was required.' }, 'groups.preads': { - info: '从存储层读取的数据量。 '+ - '需要实际的物理磁盘I/O。' + info: 'The amount of data that has been read from the storage layer. '+ + 'Actual physical disk I/O was required.' }, 'users.preads': { - info: '从存储层读取的数据量。 '+ - '需要实际的物理磁盘I/O。' + info: 'The amount of data that has been read from the storage layer. '+ + 'Actual physical disk I/O was required.' }, 'apps.pwrites': { - info: '已写入存储层的数据量。 '+ - '需要实际的物理磁盘I/O。' + info: 'The amount of data that has been written to the storage layer. '+ + 'Actual physical disk I/O was required.' }, 'groups.pwrites': { - info: '已写入存储层的数据量。 '+ - '需要实际的物理磁盘I/O。' + info: 'The amount of data that has been written to the storage layer. '+ + 'Actual physical disk I/O was required.' }, 'users.pwrites': { - info: '已写入存储层的数据量。 '+ - '需要实际的物理磁盘I/O。' + info: 'The amount of data that has been written to the storage layer. '+ + 'Actual physical disk I/O was required.' }, 'apps.lreads': { - info: '从存储层读取的数据量。 '+ - '它包括I/O终端等内容,不受是否或 '+ - '不是实际的物理磁盘I/O是必需的 '+ - '(读数可能已从pagecache中满意)。' + info: 'The amount of data that has been read from the storage layer. '+ + 'It includes things such as terminal I/O and is unaffected by whether or '+ + 'not actual physical disk I/O was required '+ + '(the read might have been satisfied from pagecache).' }, 'groups.lreads': { - info: '从存储层读取的数据量。 '+ - '它包括I/O终端等内容,不受是否或 '+ - '不是实际的物理磁盘I/O是必需的 '+ - '(读数可能已从pagecache中满意)。' + info: 'The amount of data that has been read from the storage layer. '+ + 'It includes things such as terminal I/O and is unaffected by whether or '+ + 'not actual physical disk I/O was required '+ + '(the read might have been satisfied from pagecache).' }, 'users.lreads': { - info: '从存储层读取的数据量。 '+ - '它包括I/O终端等内容,不受是否或 '+ - '不是实际的物理磁盘I/O是必需的 '+ - '(读数可能已从pagecache中满意)。' + info: 'The amount of data that has been read from the storage layer. '+ + 'It includes things such as terminal I/O and is unaffected by whether or '+ + 'not actual physical disk I/O was required '+ + '(the read might have been satisfied from pagecache).' }, 'apps.lwrites': { - info: '已写入或应写入存储层的数据量。 '+ - '它包括I/O终端等内容,不受是否或 '+ - '不是需要实际的物理磁盘I/O。' + info: 'The amount of data that has been written or shall be written to the storage layer. '+ + 'It includes things such as terminal I/O and is unaffected by whether or '+ + 'not actual physical disk I/O was required.' }, 'groups.lwrites': { - info: '已写入或应写入存储层的数据量。 '+ - '它包括I/O终端等内容,不受是否或 '+ - '不是需要实际的物理磁盘I/O。' + info: 'The amount of data that has been written or shall be written to the storage layer. '+ + 'It includes things such as terminal I/O and is unaffected by whether or '+ + 'not actual physical disk I/O was required.' }, 'users.lwrites': { - info: '已写入或应写入存储层的数据量。 '+ - '它包括I/O终端等内容,不受是否或 '+ - '不是需要实际的物理磁盘I/O。' + info: 'The amount of data that has been written or shall be written to the storage layer. '+ + 'It includes things such as terminal I/O and is unaffected by whether or '+ + 'not actual physical disk I/O was required.' }, 'apps.files': { - info: '打开的文件和目录的数量。' + info: 'The number of open files and directories.' }, 'groups.files': { - info: '打开的文件和目录的数量。' + info: 'The number of open files and directories.' }, 'users.files': { - info: '打开的文件和目录的数量。' + info: 'The number of open files and directories.' }, // APPS mem 'apps.mem': { - info: '应用程序使用的真实内存(RAM)。这不包括共享内存。' + info: 'Real memory (RAM) used by applications. This does not include shared memory.' }, 'groups.mem': { - info: '每个用户组使用的真实内存(RAM)。这不包括共享内存。' + info: 'Real memory (RAM) used per user group. This does not include shared memory.' }, 'users.mem': { - info: '每个用户组使用的真实内存(RAM)。这不包括共享内存。' + info: 'Real memory (RAM) used per user group. This does not include shared memory.' }, 'apps.vmem': { - info: '由应用程序分配的虚拟内存。 '+ - '有关更多信息,请查看本文。' + info: 'Virtual memory allocated by applications. '+ + 'Check this article for more information.' }, 'groups.vmem': { - info: '自Netdata重新启动以来,每个用户组分配的虚拟内存。有关更多信息,请查看本文。' + info: 'Virtual memory allocated per user group since the Netdata restart. Please check this article for more information.' }, 'users.vmem': { - info: '自Netdata重新启动以来,每个用户组分配的虚拟内存。有关更多信息,请查看本文。' + info: 'Virtual memory allocated per user group since the Netdata restart. Please check this article for more information.' }, 'apps.minor_faults': { - info: '小故障的数量 '+ - '不需要从磁盘加载内存页面。 '+ - '当一个进程需要内存中的数据并分配给另一个进程时,会出现轻微的页面故障。 '+ - '他们在多个进程之间共享内存页面—— '+ - '无需将其他数据从磁盘读取到内存。' + info: 'The number of minor faults '+ + 'which have not required loading a memory page from the disk. '+ + 'Minor page faults occur when a process needs data that is in memory and is assigned to another process. '+ + 'They share memory pages between multiple processes – '+ + 'no additional data needs to be read from disk to memory.' }, 'groups.minor_faults': { - info: '小故障的数量 '+ - '不需要从磁盘加载内存页面。 '+ - '当一个进程需要内存中的数据并分配给另一个进程时,会出现轻微的页面故障。 '+ - '他们在多个进程之间共享内存页面—— '+ - '无需将其他数据从磁盘读取到内存。' + info: 'The number of minor faults '+ + 'which have not required loading a memory page from the disk. '+ + 'Minor page faults occur when a process needs data that is in memory and is assigned to another process. '+ + 'They share memory pages between multiple processes – '+ + 'no additional data needs to be read from disk to memory.' }, 'users.minor_faults': { - info: '小故障的数量 '+ - '不需要从磁盘加载内存页面。 '+ - '当一个进程需要内存中的数据并分配给另一个进程时,会出现轻微的页面故障。 '+ - '他们在多个进程之间共享内存页面——'+ - '无需将其他数据从磁盘读取到内存。' + info: 'The number of minor faults '+ + 'which have not required loading a memory page from the disk. '+ + 'Minor page faults occur when a process needs data that is in memory and is assigned to another process. '+ + 'They share memory pages between multiple processes – '+ + 'no additional data needs to be read from disk to memory.' }, // APPS processes 'apps.threads': { - info: '线程的数量。' + info: 'The number of threads.' }, 'groups.threads': { - info: '线程的数量。' + info: 'The number of threads.' }, 'users.threads': { - info: '线程的数量。' + info: 'The number of threads.' }, 'apps.processes': { - info: '进程的数量。' + info: 'The number of processes.' }, 'groups.processes': { - info: '进程的数量。' + info: 'The number of processes.' }, 'users.processes': { - info: '进程的数量。' + info: 'The number of processes.' }, 'apps.uptime': { - info: '组中至少一个进程运行的时间段。' + info: 'The period of time within which at least one process in the group has been running.' }, 'groups.uptime': { - info: '组中至少一个进程运行的时间段。' + info: 'The period of time within which at least one process in the group has been running.' }, 'users.uptime': { - info: '组中至少一个进程运行的时间段。' + info: 'The period of time within which at least one process in the group has been running.' }, 'apps.uptime_min': { - info: '组中进程中最短的正常运行时间。' + info: 'The shortest uptime among processes in the group.' }, 'groups.uptime_min': { - info: '组中进程中最短的正常运行时间。' + info: 'The shortest uptime among processes in the group.' }, 'users.uptime_min': { - info: '组中进程中最短的正常运行时间。' + info: 'The shortest uptime among processes in the group.' }, 'apps.uptime_avg': { - info: '组中进程的平均正常运行时间。' + info: 'The average uptime of processes in the group.' }, 'groups.uptime_avg': { - info: '组中进程的平均正常运行时间。' + info: 'The average uptime of processes in the group.' }, 'users.uptime_avg': { - info: '组中进程的平均正常运行时间。' + info: 'The average uptime of processes in the group.' }, 'apps.uptime_max': { - info: '组中进程中最长的正常运行时间。' + info: 'The longest uptime among processes in the group.' }, 'groups.uptime_max': { - info: '组中进程中最长的正常运行时间。' + info: 'The longest uptime among processes in the group.' }, 'users.uptime_max': { - info: '组中进程中最长的正常运行时间。' + info: 'The longest uptime among processes in the group.' }, 'apps.pipes': { - info: '开放数量 '+ - '管道。 '+ - '管道是一种单向数据通道,可用于进程间通信。' + info: 'The number of open '+ + 'pipes. '+ + 'A pipe is a unidirectional data channel that can be used for interprocess communication.' }, 'groups.pipes': { - info: '开放数量 '+ - '管道。 '+ - '管道是一种单向数据通道,可用于进程间通信。' + info: 'The number of open '+ + 'pipes. '+ + 'A pipe is a unidirectional data channel that can be used for interprocess communication.' }, 'users.pipes': { - info: '开放数量 '+ - '管道。 '+ - '管道是一种单向数据通道,可用于进程间通信。' + info: 'The number of open '+ + 'pipes. '+ + 'A pipe is a unidirectional data channel that can be used for interprocess communication.' }, // APPS swap 'apps.swap': { - info: '匿名私人页面交换虚拟内存的数量。 '+ - '这不包括共享交换内存。' + info: 'The amount of swapped-out virtual memory by anonymous private pages. '+ + 'This does not include shared swap memory.' }, 'groups.swap': { - info: '匿名私人页面交换虚拟内存的数量。 '+ - '这不包括共享交换内存。' + info: 'The amount of swapped-out virtual memory by anonymous private pages. '+ + 'This does not include shared swap memory.' }, 'users.swap': { - info: '匿名私人页面交换虚拟内存的数量。 '+ - '这不包括共享交换内存。' + info: 'The amount of swapped-out virtual memory by anonymous private pages. '+ + 'This does not include shared swap memory.' }, 'apps.major_faults': { - info: '重大故障的数量 '+ - '需要从磁盘加载内存页面。 '+ - '由于RAM中缺少所需的页面,会出现重大页面故障。 '+ - '当流程开始或需要读取其他数据时,它们是正常的 '+ - '在这些情况下,不表示问题状况。 '+ - '然而,一个主要的页面错误也可能是阅读已写出的内存页面的结果 '+ - '交换文件,这可能表明内存短缺。' + info: 'The number of major faults '+ + 'which have required loading a memory page from the disk. '+ + 'Major page faults occur because of the absence of the required page from the RAM. '+ + 'They are expected when a process starts or needs to read in additional data and '+ + 'in these cases do not indicate a problem condition. '+ + 'However, a major page fault can also be the result of reading memory pages that have been written out '+ + 'to the swap file, which could indicate a memory shortage.' }, 'groups.major_faults': { - info: '重大故障的数量 '+ - '需要从磁盘加载内存页面。 '+ - '由于RAM中缺少所需的页面,会出现重大页面故障。 '+ - '当流程开始或需要读取其他数据时,它们是正常的 '+ - '在这些情况下,不表示问题状况。 '+ - '然而,一个主要的页面错误也可能是阅读已写出的内存页面的结果 '+ - '交换文件,这可能表明内存短缺。' + info: 'The number of major faults '+ + 'which have required loading a memory page from the disk. '+ + 'Major page faults occur because of the absence of the required page from the RAM. '+ + 'They are expected when a process starts or needs to read in additional data and '+ + 'in these cases do not indicate a problem condition. '+ + 'However, a major page fault can also be the result of reading memory pages that have been written out '+ + 'to the swap file, which could indicate a memory shortage.' }, 'users.major_faults': { - info: '重大故障的数量 '+ - '需要从磁盘加载内存页面。 '+ - '由于RAM中缺少所需的页面,会出现重大页面故障。 '+ - '当流程开始或需要读取其他数据时,它们是正常的 '+ - '在这些情况下,不表示问题状况。 '+ - '然而,一个主要的页面错误也可能是阅读已写出的内存页面的结果 '+ - '交换文件,这可能表明内存短缺。' + info: 'The number of major faults '+ + 'which have required loading a memory page from the disk. '+ + 'Major page faults occur because of the absence of the required page from the RAM. '+ + 'They are expected when a process starts or needs to read in additional data and '+ + 'in these cases do not indicate a problem condition. '+ + 'However, a major page fault can also be the result of reading memory pages that have been written out '+ + 'to the swap file, which could indicate a memory shortage.' }, // APPS net 'apps.sockets': { - info: '打开sockets的数量。 '+ - 'sockets是一种在服务器上运行的程序之间实现进程间通信的方式, '+ - '或在不同服务器上运行的程序之间。这包括网络和UNIX sockets。' + info: 'The number of open sockets. '+ + 'Sockets are a way to enable inter-process communication between programs running on a server, '+ + 'or between programs running on separate servers. This includes both network and UNIX sockets.' }, 'groups.sockets': { - info: '打开sockets的数量。 '+ - 'sockets是一种在服务器上运行的程序之间实现进程间通信的方式, '+ - '或在不同服务器上运行的程序之间。这包括网络和UNIX sockets。' + info: 'The number of open sockets. '+ + 'Sockets are a way to enable inter-process communication between programs running on a server, '+ + 'or between programs running on separate servers. This includes both network and UNIX sockets.' }, 'users.sockets': { - info: '打开sockets的数量 '+ - 'sockets是一种在服务器上运行的程序之间实现进程间通信的方式, '+ - '或在不同服务器上运行的程序之间。这包括网络和UNIX sockets。' + info: 'The number of open sockets. '+ + 'Sockets are a way to enable inter-process communication between programs running on a server, '+ + 'or between programs running on separate servers. This includes both network and UNIX sockets.' }, // Apps eBPF stuff 'apps.file_open': { - info: '对内部函数do_sys_open的调用(对于比5.5.19更新的内核,我们在do_sys_openat2中添加一个kprobe。),这是从' + + info: 'Calls to the internal function do_sys_open (for kernels newer than 5.5.19 we add a kprobe to do_sys_openat2. ), which is the common function called from' + ' open(2) ' + ' and openat(2). ' }, 'apps.file_open_error': { - info: '对内部函数do_sys_open的调用失败(对于比5.5.19更新的内核,我们向do_sys_openat2添加了一个kprobe。)。' + info: 'Failed calls to the internal function do_sys_open (for kernels newer than 5.5.19 we add a kprobe to do_sys_openat2. ).' }, 'apps.file_closed': { - info: '根据内核版本调用内部函数__close_fdclose_fd,该版本调用' + + info: 'Calls to the internal function __close_fd or close_fd according to your kernel version, which is called from' + ' close(2). ' }, 'apps.file_close_error': { - info: '根据内核版本,对内部函数__close_fdclose_fd的调用失败。' + info: 'Failed calls to the internal function __close_fd or close_fd according to your kernel version.' }, 'apps.file_deleted': { - info: '调用函数vfs_unlink。此图表没有显示从文件系统中删除文件的所有事件,因为文件系统可以创建自己的功能来删除文件。' + info: 'Calls to the function vfs_unlink. This chart does not show all events that remove files from the filesystem, because filesystems can create their own functions to remove files.' }, 'apps.vfs_write_call': { - info: '成功调用了函数vfs_write。如果此图表使用其他功能将数据存储在磁盘上,则可能不会显示所有文件系统事件。' + info: 'Successful calls to the function vfs_write. This chart may not show all filesystem events if it uses other functions to store data on disk.' }, 'apps.vfs_write_error': { - info: '对函数vfs_write的调用失败。如果此图表使用其他功能将数据存储在磁盘上,则可能不会显示所有文件系统事件。' + info: 'Failed calls to the function vfs_write. This chart may not show all filesystem events if it uses other functions to store data on disk.' }, 'apps.vfs_read_call': { - info: '成功调用函数vfs_read。如果此图表使用其他功能将数据存储在磁盘上,则可能不会显示所有文件系统事件。' + info: 'Successful calls to the function vfs_read. This chart may not show all filesystem events if it uses other functions to store data on disk.' }, 'apps.vfs_read_error': { - info: '对函数vfs_read的调用失败。如果此图表使用其他功能将数据存储在磁盘上,则可能不会显示所有文件系统事件。' + info: 'Failed calls to the function vfs_read. This chart may not show all filesystem events if it uses other functions to store data on disk.' }, 'apps.vfs_write_bytes': { - info: '使用函数vfs_write成功编写的字节总数。' + info: 'Total of bytes successfully written using the function vfs_write.' }, 'apps.vfs_read_bytes': { - info: '使用函数vfs_read成功读取的总字节总数。' + info: 'Total of bytes successfully read using the function vfs_read.' }, 'apps.process_create': { - info: '调用do_fork,或者kernel_clone(如果您运行的内核更新于5.16),以创建一个新任务,这是用于定义内核内进程和任务的常用名称。此图表由eBPF插件提供。' + info: 'Calls to either do_fork, or kernel_clone if you are running kernel newer than 5.9.16, to create a new task, which is the common name used to define process and tasks inside the kernel. This chart is provided by eBPF plugin.' }, 'apps.thread_create': { - info: '调用do_fork,或者kernel_clone(如果您运行的内核更新于5.16),以创建一个新任务,这是用于定义内核内进程和任务的常用名称。Netdata标识监控跟踪点sched_process_fork的线程。此图表由eBPF插件提供。' + info: 'Calls to either do_fork, or kernel_clone if you are running kernel newer than 5.9.16, to create a new task, which is the common name used to define process and tasks inside the kernel. Netdata identifies the threads monitoring tracepoint sched_process_fork. This chart is provided by eBPF plugin.' }, 'apps.task_exit': { - info: '对负责关闭的函数的调用(do_exit)任务。此图表由eBPF插件提供。' + info: 'Calls to the function responsible for closing (do_exit) tasks. This chart is provided by eBPF plugin.' }, 'apps.task_close': { - info: '对负责发布功能的调用(release_task)任务。此图表由eBPF插件提供。' + info: 'Calls to the function responsible for releasing (release_task) tasks. This chart is provided by eBPF plugin.' }, 'apps.task_error': { - info: '创建新进程或线程的错误数量。此图表由eBPF插件提供。' + info: 'Number of errors to create a new process or thread. This chart is provided by eBPF plugin.' }, 'apps.total_bandwidth_sent': { - info: '由函数tcp_sendmsgudp_sendmsg发送的字节。' + info: 'Bytes sent by functions tcp_sendmsg and udp_sendmsg.' }, 'apps.total_bandwidth_recv': { - info: '函数tcp_cleanup_rbufudp_recvmsg收到的字节。我们使用tcp_cleanup_rbuf而不是tcp_recvmsg,因为这最后错过了tcp_read_sock()流量,我们还需要有更多的探针来获取套接字和包大小。' + info: 'Bytes received by functions tcp_cleanup_rbuf and udp_recvmsg. We use tcp_cleanup_rbuf instead tcp_recvmsg, because this last misses tcp_read_sock() traffic and we would also need to have more probes to get the socket and package size.' }, 'apps.bandwidth_tcp_send': { - info: '函数tcp_sendmsg用于收集从TCP连接发送的字节数。' + info: 'The function tcp_sendmsg is used to collect number of bytes sent from TCP connections.' }, 'apps.bandwidth_tcp_recv': { - info: 'tcp_cleanup_rbuf函数用于收集从TCP连接接收的字节数。' + info: 'The function tcp_cleanup_rbuf is used to collect number of bytes received from TCP connections.' }, 'apps.bandwidth_tcp_retransmit': { - info: '当主机没有收到发送的数据包的预期返回时,将调用函数tcp_retransmit_skb。' + info: 'The function tcp_retransmit_skb is called when the host did not receive the expected return from a packet sent.' }, 'apps.bandwidth_udp_send': { - info: 'udp_sendmsg函数用于收集从UDP连接发送的字节数。' + info: 'The function udp_sendmsg is used to collect number of bytes sent from UDP connections.' }, 'apps.bandwidth_udp_recv': { - info: '函数udp_recvmsg用于收集从UDP连接接收的字节数。' + info: 'The function udp_recvmsg is used to collect number of bytes received from UDP connections.' }, 'apps.dc_hit_ratio': { - info: '目录缓存中存在的文件访问百分比。100%表示访问的每个文件都存在于目录缓存中。如果目录缓存中不存在文件1)它们不存在于文件系统中,2)以前没有访问过文件。阅读更多关于目录缓存的信息。Netdata还在文件系统子菜单中对这些图表进行了摘要。' + info: 'Percentage of file accesses that were present in the directory cache. 100% means that every file that was accessed was present in the directory cache. If files are not present in the directory cache 1) they are not present in the file system, 2) the files were not accessed before. Read more about directory cache. Netdata also gives a summary for these charts in Filesystem submenu.' }, 'apps.dc_reference': { - info: '文件访问计数器。引用是文件访问时,请参阅filesystem.dc_reference图表以了解更多上下文。阅读更多关于目录缓存的信息。' + info: 'Counters of file accesses. Reference is when there is a file access, see the filesystem.dc_reference chart for more context. Read more about directory cache.' }, 'apps.dc_not_cache': { - info: '文件访问计数器。是指有文件访问且目录缓存中不存在文件时,请参阅filesystem.dc_reference图表以了解更多上下文。阅读更多关于目录缓存的信息。' + info: 'Counters of file accesses. Slow is when there is a file access and the file is not present in the directory cache, see the filesystem.dc_reference chart for more context. Read more about directory cache.' }, 'apps.dc_not_found': { - info: '文件访问计数器。Miss是当有文件访问且文件系统中找不到文件时,请参阅filesystem.dc_reference图表以获取更多上下文。阅读更多关于目录缓存的信息。' + info: 'Counters of file accesses. Miss is when there is file access and the file is not found in the filesystem, see the filesystem.dc_reference chart for more context. Read more about directory cache.' }, // ------------------------------------------------------------------------ @@ -2709,20 +2653,20 @@ netdataDashboard.context = { return ''; } ], - info: '网络接口传输的流量。' + info: 'The amount of traffic transferred by the network interface.' }, 'net.packets': { - info: '网络接口传输的数据包数量。 '+ - '收到的multicast计数器是 '+ - '通常在设备级别计算(与接收不同),因此可能包括未到达主机的数据包。' + info: 'The number of packets transferred by the network interface. '+ + 'Received multicast counter is '+ + 'commonly calculated at the device level (unlike received) and therefore may include packets which did not reach the host.' }, 'net.errors': { - info: '

网络接口遇到的错误数量。

'+ - '

入站 - 此界面上收到的不良数据包。 '+ - '它包括因长度无效、CRC、帧对齐和其他错误而掉落的数据包。 '+ - '出站 - 传输问题。 '+ - '它包括因运营商丢失而导致的帧传输错误、FIFO超支/下流、心跳、 '+ - '延迟碰撞和其他问题。

' + info: '

The number of errors encountered by the network interface.

'+ + '

Inbound - bad packets received on this interface. '+ + 'It includes dropped packets due to invalid length, CRC, frame alignment, and other errors. '+ + 'Outbound - transmit problems. '+ + 'It includes frames transmission errors due to loss of carrier, FIFO underrun/underflow, heartbeat, '+ + 'late collisions, and other problems.

' }, 'net.fifo': { info: '

The number of FIFO errors encountered by the network interface.

'+ @@ -2909,7 +2853,7 @@ netdataDashboard.context = { }, 'disk_ext.io': { - info: 'The amount of discarded data that are no longer in use by a mounted file system.' + info: '已装入的文件系统不再使用的丢弃数据量.' }, 'disk.ops': { @@ -2962,7 +2906,7 @@ netdataDashboard.context = { }, 'disk_ext.avgsz': { height: 0.5, - info: 'The average discard operation size.' + info: '平均丢弃操作大小.' }, 'disk.await': { height: 0.5, @@ -3674,7 +3618,7 @@ netdataDashboard.context = { + ' role="application">'; } ], - info: 'Total CPU utilization within the configured or system-wide (if not set) limits. '+ + info: 'CPU总利用率在配置或系统范围(如果未设置)限制内。 '+ 'When the CPU utilization of a cgroup exceeds the limit for the configured period, '+ 'the tasks belonging to its hierarchy will be throttled and are not allowed to run again until the next period.' }, @@ -3699,7 +3643,7 @@ netdataDashboard.context = { return ''; } ], - info: 'Total CPU utilization within the system-wide CPU resources (all cores). '+ + info: '系统范围CPU资源(所有内核)内的总CPU利用率。 '+ 'The amount of time spent by tasks of the cgroup in '+ 'user and kernel modes.' }, @@ -6353,57 +6297,57 @@ netdataDashboard.context = { }, 'systemd.scope_unit_state': { - info: '切片单元可用于对管理系统流程的单元进行分组(如服务和范围单元) ' + - '在用于资源管理的分层树中。 ' + - '请参阅 systemd.scope(5)。' + info: 'Slice units may be used to group units which manage system processes (such as service and scope units) ' + + 'in a hierarchical tree for resource management purposes. ' + + 'See systemd.scope(5).' }, 'systemd.slice_unit_state': { - info: '范围单位与服务单位相似,但也管理外国流程,而不是启动它们。 ' + - '请参阅 systemd.slice(5)。' + info: 'Scope units are similar to service units, but manage foreign processes instead of starting them as well. ' + + 'See systemd.slice(5).' }, 'anomaly_detection.dimensions': { - info: '被认为异常或正常的维度总数。 ' + info: 'Total count of dimensions considered anomalous or normal. ' }, 'anomaly_detection.anomaly_rate': { - info: '异常维度的百分比。 ' + info: 'Percentage of anomalous dimensions. ' }, 'anomaly_detection.detector_window': { - info: '探测器使用的有源窗口的长度。 ' + info: 'The length of the active window used by the detector. ' }, 'anomaly_detection.detector_events': { - info: '标志(0或1),用于显示探测器何时触发异常事件。 ' + info: 'Flags (0 or 1) to show when an anomaly event has been triggered by the detector. ' }, 'anomaly_detection.prediction_stats': { - info: '与异常检测预测时间相关的诊断指标。 ' + info: 'Diagnostic metrics relating to prediction time of anomaly detection. ' }, 'anomaly_detection.training_stats': { - info: '与异常检测培训时间相关的诊断指标。 ' + info: 'Diagnostic metrics relating to training time of anomaly detection. ' }, // ------------------------------------------------------------------------ // Supervisor 'fail2ban.failed_attempts': { - info: '

尝试失败的次数。

'+ - '

此图表反映了\'Found\'行的数量。 '+ - '找到意味着服务日志文件中的一行与其过滤器中的失败正则表达式匹配。

' + info: '

The number of failed attempts.

'+ + '

This chart reflects the number of \'Found\' lines. '+ + 'Found means a line in the service’s log file matches the failregex in its filter.

' }, 'fail2ban.bans': { - info: '

禁令数量。

'+ - '

此图表反映了\'Ban\'和\'Restore Ban\'行的数量。 '+ - '当上次配置的间隔(查找时间)发生失败的尝试次数(最大尝试)时,就会发生禁用操作。

' + info: '

The number of bans.

'+ + '

This chart reflects the number of \'Ban\' and \'Restore Ban\' lines. '+ + 'Ban action happens when the number of failed attempts (maxretry) occurred in the last configured interval (findtime).

' }, 'fail2ban.banned_ips': { - info: '

禁用IP地址的数量。

' + info: '

The number of banned IP addresses.

' }, }; diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/index.html b/luci-app-netdata/root/usr/share/netdata/webcn/index.html index 6bef614de..5a81a58ee 100644 --- a/luci-app-netdata/root/usr/share/netdata/webcn/index.html +++ b/luci-app-netdata/root/usr/share/netdata/webcn/index.html @@ -12,5 +12,5 @@ theme = localStorage.getItem('netdataTheme') || 'slate'; } const overlayEl = document.getElementById('loadOverlay'); - overlayEl.innerHTML = 'netdata
即时效能监控,做正确的事!
'; - overlayEl.style = theme == 'slate' ? "background-color: #272b30; color: #373b40;" : "background-color: #fff; color: #ddd;";
\ No newline at end of file + overlayEl.innerHTML = 'netdata
实时性能监控,已经安装,未启动!
'; + overlayEl.style = theme == 'slate' ? "background-color: #272b30; color: #373b40;" : "background-color: #fff; color: #ddd;";
\ No newline at end of file diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/main.js b/luci-app-netdata/root/usr/share/netdata/webcn/main.js index 8ecc86995..8c00600de 100644 --- a/luci-app-netdata/root/usr/share/netdata/webcn/main.js +++ b/luci-app-netdata/root/usr/share/netdata/webcn/main.js @@ -1,5 +1,5 @@ // Main JavaScript file for the Netdata GUI. -// 翻译 By Jason + // Codacy declarations /* global NETDATA */ @@ -1511,7 +1511,7 @@ function headMain(os, charts, duration) { if (typeof charts['system.io'] !== 'undefined') { head += '
警报.'; if (!isMemoryModeDbEngine) { - sidebar += '
 
获取更多历史记录 ' + - '配置Netdata\'s 历史 或使用 DB 引擎.'; + sidebar += '
 
获取更多历史记录 '; } sidebar += '
 
netdata
' + data.version.toString() + ''; - sidebar += ''; div.innerHTML = html; document.getElementById('sidebar').innerHTML = sidebar; @@ -2039,7 +2037,7 @@ function clipboardCopyBadgeEmbed(url) { function alarmsUpdateModal() { var active = '

触发警报

'; var all = '

所有作用中的警报

'; - var footer = '
netdata badges 会自动重新整理。不同颜色分表代表的警报状态:  红色  表示重大,  橘色  表示警告,  绿色  表示良好,  灰色  表示未定义 (例如无资料或无状态),  黑色  表示尚未初始化。您可以复制这里的网址并将它们嵌入到任一个网页。
netdata 能够发送这些警报通知。请参阅 这个设定档 了解更多资讯。'; + var footer = '
netdata badges 会自动重新整理。不同颜色分表代表的警报状态: 红色  表示重大, 橘色  表示警告, 绿色  表示良好, 灰色  表示未定义 (例如无资料或无状态), 黑色  表示尚未初始化。您可以复制这里的网址并将它们嵌入到任一个网页。
netdata 能够发送这些警报通知。请参阅 这个设定档 了解更多资讯。'; loadClipboard(function () { }); @@ -2316,7 +2314,7 @@ function alarmsUpdateModal() { all += "
"; if (!count_active) { - active += '

一切正常。没有警报。
'; + active += '

Everything is normal. No raised alarms.
'; } else { active += footer; } @@ -2575,7 +2573,7 @@ function alarmsUpdateModal() { }, { field: 'duration', - title: 'Last Duration', + title: '上次持续时间', titleTooltip: 'The duration the alarm was at its previous state, just before this event', formatter: function (value, row, index) { void (row); @@ -2589,7 +2587,7 @@ function alarmsUpdateModal() { }, { field: 'non_clear_duration', - title: 'Raised Duration', + title: '提升的持续时间', titleTooltip: 'The duration the alarm was raised, just before this event', formatter: function (value, row, index) { void (row); @@ -2603,7 +2601,7 @@ function alarmsUpdateModal() { }, { field: 'recipient', - title: 'Recipient', + title: '收件人', titleTooltip: 'The recipient of this event', align: 'center', valign: 'middle', @@ -2612,7 +2610,7 @@ function alarmsUpdateModal() { }, { field: 'processed', - title: 'Processed Status', + title: '已处理状态', titleTooltip: 'True when this event is processed', formatter: function (value, row, index) { void (row); @@ -2631,7 +2629,7 @@ function alarmsUpdateModal() { }, { field: 'updated', - title: 'Updated Status', + title: '更新的状态', titleTooltip: 'True when this event has been updated by another event', formatter: function (value, row, index) { void (row); @@ -2650,7 +2648,7 @@ function alarmsUpdateModal() { }, { field: 'updated_by_id', - title: 'Updated By ID', + title: '由ID更新', titleTooltip: 'The unique ID of the event that obsoleted this one', formatter: function (value, row, index) { void (row); @@ -2664,7 +2662,7 @@ function alarmsUpdateModal() { }, { field: 'updates_id', - title: 'Updates ID', + title: '更新ID', titleTooltip: 'The unique ID of the event obsoleted because of this event', formatter: function (value, row, index) { void (row); @@ -2678,7 +2676,7 @@ function alarmsUpdateModal() { }, { field: 'exec', - title: 'Script', + title: '脚本', titleTooltip: 'The script to handle the event notification', align: 'center', valign: 'middle', @@ -2687,7 +2685,7 @@ function alarmsUpdateModal() { }, { field: 'exec_run', - title: 'Script Run At', + title: '脚本运行时间', titleTooltip: 'The date and time the script has been ran', formatter: function (value, row, index) { void (row); @@ -2701,7 +2699,7 @@ function alarmsUpdateModal() { }, { field: 'exec_code', - title: 'Script Return Value', + title: '脚本返回值', titleTooltip: 'The return code of the script', formatter: function (value, row, index) { void (row); @@ -2720,7 +2718,7 @@ function alarmsUpdateModal() { }, { field: 'delay', - title: 'Script Delay', + title: '脚本延迟', titleTooltip: 'The hysteresis of the notification', formatter: function (value, row, index) { void (row); @@ -2735,7 +2733,7 @@ function alarmsUpdateModal() { }, { field: 'delay_up_to_timestamp', - title: 'Script Delay Run At', + title: '脚本延迟运行时间', titleTooltip: 'The date and time the script should be run, after hysteresis', formatter: function (value, row, index) { void (row); @@ -2749,7 +2747,7 @@ function alarmsUpdateModal() { }, { field: 'info', - title: '说明', + title: '描述', titleTooltip: 'A short description of the alarm', align: 'center', valign: 'middle', @@ -2758,7 +2756,7 @@ function alarmsUpdateModal() { }, { field: 'source', - title: '警报来源', + title: '报警源', titleTooltip: 'The source of configuration of the alarm', align: 'center', valign: 'middle', @@ -2974,7 +2972,7 @@ function getGithubLatestVersion(callback) { callback(data); }) .fail(function () { - versionLog('从 github 下载最新版本 ID 失败!'); + versionLog('从 github 下载最新版本 ID 失败。'); callback(null); }); } @@ -3047,19 +3045,10 @@ function notifyForUpdate(force) { if (sha1 === null) { save = false; - versionLog('

取得您的 netdata 版本失败!

You can always get the latest netdata from its github page.

'); - } else if (sha2 === null) { - save = false; - versionLog('

从 github 取得 netdata 最新版本失败。

您也可以从 its github page 取得最新 netdata 版本。

'); - } else if (versionsMatch(sha1, sha2)) { + versionLog('

取得您的 netdata 版本失败!

'); + else { save = true; - versionLog('

您已经是最新版本的 netdata!

还没有更新?
或许,我们还需要一些动力继续前进!

如果您还没有做好更新的准备,请您 到 github 给 netdata at its github page.

'); - } else { - save = true; - var compare = 'https://learn.netdata.cloud/docs/agent/changelog/'; - versionLog('

New version of netdata available!

Latest version: ' + sha2 + '

Click here for the changes log and
click here for directions on updating your netdata installation.

We suggest to review the changes log for new features you may be interested, or important bug fixes you may need.
Keeping your netdata updated is generally a good idea.

'); - - document.getElementById('update_badge').innerHTML = '!'; + versionLog('

您已经是最新版本的 netdata!

'); } if (save) { @@ -4264,7 +4253,6 @@ function runOnceOnDashboardWithjQuery() { versionLog('checking, please wait...'); }) .on('shown.bs.modal', function () { - notifyForUpdate(true); }); // ------------------------------------------------------------------------ @@ -4484,7 +4472,6 @@ function finalizePage() { ga('send', 'pageview', '/demosite/' + window.location.host); }, 2000); } else { - notifyForUpdate(); } if (urlOptions.show_alarms === true) { diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata b/luci-app-netdata/root/usr/share/netdata/webcn/netdata new file mode 100644 index 000000000..83f9eda99 --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata @@ -0,0 +1,6 @@ + +config netdata 'netdata' + option logger '1' + option enabled '0' + option port '19990' + diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf new file mode 100644 index 000000000..9b2c9d24b --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf @@ -0,0 +1,52 @@ +# Full configuration can be retrieved from the running +# server at http://localhost:19999/netdata.conf +# +# Example: +# curl -o /etc/netdata/netdata.conf http://localhost:19999/netdata.conf +# + +[global] + update every = 2 + memory deduplication (ksm) = no + debug log = syslog + error log = syslog + access log = none + run as user = root + +[web] + allow connections from = * + allow dashboard from = * + +[plugins] + cgroups = no + apps = no + charts.d = no + fping = no + node.d = no + python.d = no + +[plugin:proc] + ipc =no + /proc/sysvipc/shm = no + /sys/devices/system/edac/mc = no + /sys/devices/system/node = no + /proc/net/sockstat = no + /proc/net/netstat = no + /proc/net/snmp = no + /proc/net/softnet_stat = no + /proc/net/sctp/snmp = no + /proc/net/ip_vs/stats = no + /proc/net/stat/synproxy = no + /sys/kernel/mm/ksm = no + /dev/mapper = no + semaphore totals = no + +[plugin:proc:/proc/diskstats] + path to /dev/vx/dsk = + path to /dev/disk/by-label = + +[health] + enabled = no + +[plugin:proc:ipc] + shared memory totals = no diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init new file mode 100755 index 000000000..9e088294e --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init @@ -0,0 +1,46 @@ +#!/bin/sh /etc/rc.common + +START=99 +USE_PROCD=1 + +APPBINARY=/usr/sbin/netdata +CONFIGFILE=/etc/netdata/netdata.conf + +get_config() { + config_get_bool enabled $1 enabled 1 + config_get_bool logger $1 logger 1 + config_get port $1 port 19999 +} + +netdata_prepare() { + pgrep -f /usr/sbin/netdata | xargs kill -9 >/dev/null 2>&1 + logger -t netdata -p warn "netdata is stop." +} + +stop_service() { + netdata_prepare +} + +start_service() { + netdata_prepare + config_load netdata + config_foreach get_config netdata + [ x$enabled == x1 ] || return 1 + mkdir -m 0755 -p /var/cache/netdata + logger -t netdata -p warn "netdata is start." + chown nobody /var/cache/netdata + mkdir -m 0755 -p /var/lib/netdata + chown nobody /var/lib/netdata + mkdir -m 0755 -p /var/log/netdata + chown nobody /var/log/netdata + procd_open_instance + procd_set_param command $APPBINARY -D -c $CONFIGFILE -p $port:$port + [ "x$logger" == x1 ] && procd_set_param stderr 1 + procd_set_param file $CONFIGFILE + procd_set_param respawn + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "netdata" +} diff --git a/luci-app-netdata/web/dashboard.js b/luci-app-netdata/web/dashboard.js deleted file mode 100644 index 9642d3ac0..000000000 --- a/luci-app-netdata/web/dashboard.js +++ /dev/null @@ -1,10377 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -// 时间 By Jason -// DO NOT EDIT: This file is automatically generated from the source files in src/ - -// ---------------------------------------------------------------------------- -// You can set the following variables before loading this script: - -// 'use strict'; - -/*global netdataNoDygraphs *//* boolean, disable dygraph charts - * (default: false) */ -/*global netdataNoSparklines *//* boolean, disable sparkline charts - * (default: false) */ -/*global netdataNoPeitys *//* boolean, disable peity charts - * (default: false) */ -/*global netdataNoGoogleCharts *//* boolean, disable google charts - * (default: false) */ -/*global netdataNoMorris *//* boolean, disable morris charts - * (default: false) */ -/*global netdataNoEasyPieChart *//* boolean, disable easypiechart charts - * (default: false) */ -/*global netdataNoGauge *//* boolean, disable gauge.js charts - * (default: false) */ -/*global netdataNoD3 *//* boolean, disable d3 charts - * (default: false) */ -/*global netdataNoC3 *//* boolean, disable c3 charts - * (default: false) */ -/*global netdataNoD3pie *//* boolean, disable d3pie charts - * (default: false) */ -/*global netdataNoBootstrap *//* boolean, disable bootstrap - disables help too - * (default: false) */ -/*global netdataNoFontAwesome *//* boolean, disable fontawesome (do not load it) - * (default: false) */ -/*global netdataIcons *//* object, overwrite netdata fontawesome icons - * (default: null) */ -/*global netdataDontStart *//* boolean, do not start the thread to process the charts - * (default: false) */ -/*global netdataErrorCallback *//* function, callback to be called when the dashboard encounters an error - * (default: null) */ -/*global netdataRegistry:true *//* boolean, use the netdata registry - * (default: false) */ -/*global netdataNoRegistry *//* boolean, included only for compatibility with existing custom dashboard - * (obsolete - do not use this any more) */ -/*global netdataRegistryCallback *//* function, callback that will be invoked with one param: the URLs from the registry - * (default: null) */ -/*global netdataShowHelp:true *//* boolean, disable charts help - * (default: true) */ -/*global netdataShowAlarms:true *//* boolean, enable alarms checks and notifications - * (default: false) */ -/*global netdataRegistryAfterMs:true *//* ms, delay registry use at started - * (default: 1500) */ -/*global netdataCallback *//* function, callback to be called when netdata is ready to start - * (default: null) - * netdata will be running while this is called - * (call NETDATA.pause to stop it) */ -/*global netdataPrepCallback *//* function, callback to be called before netdata does anything else - * (default: null) */ -/*global netdataServer *//* string, the URL of the netdata server to use - * (default: the URL the page is hosted at) */ -/*global netdataServerStatic *//* string, the URL of the netdata server to use for static files - * (default: netdataServer) */ -/*global netdataSnapshotData *//* object, a netdata snapshot loaded - * (default: null) */ -/*global netdataAlarmsRecipients *//* array, an array of alarm recipients to show notifications for - * (default: null) */ -/*global netdataAlarmsRemember *//* boolean, keep our position in the alarm log at browser local storage - * (default: true) */ -/*global netdataAlarmsActiveCallback *//* function, a hook for the alarm logs - * (default: undefined) */ -/*global netdataAlarmsNotifCallback *//* function, a hook for alarm notifications - * (default: undefined) */ -/*global netdataIntersectionObserver *//* boolean, enable or disable the use of intersection observer - * (default: true) */ -/*global netdataCheckXSS *//* boolean, enable or disable checking for XSS issues - * (default: false) */ - -// ---------------------------------------------------------------------------- -// global namespace - -// Should stay var! -var NETDATA = window.NETDATA || {}; - -(function(window, document, $, undefined) { - -// *** src/dashboard.js/utils.js - -NETDATA.name2id = function (s) { - return s - .replace(/ /g, '_') - .replace(/:/g, '_') - .replace(/\(/g, '_') - .replace(/\)/g, '_') - .replace(/\./g, '_') - .replace(/\//g, '_'); -}; - -NETDATA.encodeURIComponent = function (s) { - if (typeof(s) === 'string') { - return encodeURIComponent(s); - } - - return s; -}; - -/// A heuristic for detecting slow devices. -let isSlowDeviceResult = undefined; -const isSlowDevice = function () { - if (!isSlowDeviceResult) { - return isSlowDeviceResult; - } - - try { - let ua = navigator.userAgent.toLowerCase(); - - let iOS = /ipad|iphone|ipod/.test(ua) && !window.MSStream; - let android = /android/.test(ua) && !window.MSStream; - isSlowDeviceResult = (iOS || android); - } catch (e) { - isSlowDeviceResult = false; - } - - return isSlowDeviceResult; -}; - -NETDATA.guid = function () { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000) - .toString(16) - .substring(1); - } - - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); -}; - -NETDATA.zeropad = function (x) { - if (x > -10 && x < 10) { - return '0' + x.toString(); - } else { - return x.toString(); - } -}; - -NETDATA.seconds4human = function (seconds, options) { - let defaultOptions = { - now: '现在', - space: ' ', - negative_suffix: '前', - day: '日', - days: '日', - hour: '小时', - hours: '小时', - minute: '分钟', - minutes: '分钟', - second: '秒', - seconds: '秒', - and: '及' - }; - - if (typeof options !== 'object') { - options = defaultOptions; - } else { - for (var x in defaultOptions) { - if (typeof options[x] !== 'string') { - options[x] = defaultOptions[x]; - } - } - } - - if (typeof seconds === 'string') { - seconds = parseInt(seconds, 10); - } - - if (seconds === 0) { - return options.now; - } - - let suffix = ''; - if (seconds < 0) { - seconds = -seconds; - if (options.negative_suffix !== '') { - suffix = options.space + options.negative_suffix; - } - } - - let days = Math.floor(seconds / 86400); - seconds -= (days * 86400); - - let hours = Math.floor(seconds / 3600); - seconds -= (hours * 3600); - - let minutes = Math.floor(seconds / 60); - seconds -= (minutes * 60); - - let strings = []; - - if (days > 1) { - strings.push(days.toString() + options.space + options.days); - } else if (days === 1) { - strings.push(days.toString() + options.space + options.day); - } - - if (hours > 1) { - strings.push(hours.toString() + options.space + options.hours); - } else if (hours === 1) { - strings.push(hours.toString() + options.space + options.hour); - } - - if (minutes > 1) { - strings.push(minutes.toString() + options.space + options.minutes); - } else if (minutes === 1) { - strings.push(minutes.toString() + options.space + options.minute); - } - - if (seconds > 1) { - strings.push(Math.floor(seconds).toString() + options.space + options.seconds); - } else if (seconds === 1) { - strings.push(Math.floor(seconds).toString() + options.space + options.second); - } - - if (strings.length === 1) { - return strings.pop() + suffix; - } - - let last = strings.pop(); - return strings.join(", ") + " " + options.and + " " + last + suffix; -}; - -// ---------------------------------------------------------------------------------------------------------------- -// element data attributes - -NETDATA.dataAttribute = function (element, attribute, def) { - let key = 'data-' + attribute.toString(); - if (element.hasAttribute(key)) { - let data = element.getAttribute(key); - - if (data === 'true') { - return true; - } - if (data === 'false') { - return false; - } - if (data === 'null') { - return null; - } - - // Only convert to a number if it doesn't change the string - if (data === +data + '') { - return +data; - } - - if (/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/.test(data)) { - return JSON.parse(data); - } - - return data; - } else { - return def; - } -}; - -NETDATA.dataAttributeBoolean = function (element, attribute, def) { - let value = NETDATA.dataAttribute(element, attribute, def); - - if (value === true || value === false) // gmosx: Love this :) - { - return value; - } - - if (typeof(value) === 'string') { - if (value === 'yes' || value === 'on') { - return true; - } - - if (value === '' || value === 'no' || value === 'off' || value === 'null') { - return false; - } - - return def; - } - - if (typeof(value) === 'number') { - return value !== 0; - } - - return def; -}; - -// ---------------------------------------------------------------------------------------------------------------- -// fast numbers formatting - -NETDATA.fastNumberFormat = { - formattersFixed: [], - formattersZeroBased: [], - - // this is the fastest and the preferred - getIntlNumberFormat: function (min, max) { - let key = max; - if (min === max) { - if (typeof this.formattersFixed[key] === 'undefined') { - this.formattersFixed[key] = new Intl.NumberFormat(undefined, { - // style: 'decimal', - // minimumIntegerDigits: 1, - // minimumSignificantDigits: 1, - // maximumSignificantDigits: 1, - useGrouping: true, - minimumFractionDigits: min, - maximumFractionDigits: max - }); - } - - return this.formattersFixed[key]; - } else if (min === 0) { - if (typeof this.formattersZeroBased[key] === 'undefined') { - this.formattersZeroBased[key] = new Intl.NumberFormat(undefined, { - // style: 'decimal', - // minimumIntegerDigits: 1, - // minimumSignificantDigits: 1, - // maximumSignificantDigits: 1, - useGrouping: true, - minimumFractionDigits: min, - maximumFractionDigits: max - }); - } - - return this.formattersZeroBased[key]; - } else { - // this is never used - // it is added just for completeness - return new Intl.NumberFormat(undefined, { - // style: 'decimal', - // minimumIntegerDigits: 1, - // minimumSignificantDigits: 1, - // maximumSignificantDigits: 1, - useGrouping: true, - minimumFractionDigits: min, - maximumFractionDigits: max - }); - } - }, - - // this respects locale - getLocaleString: function (min, max) { - let key = max; - if (min === max) { - if (typeof this.formattersFixed[key] === 'undefined') { - this.formattersFixed[key] = { - format: function (value) { - return value.toLocaleString(undefined, { - // style: 'decimal', - // minimumIntegerDigits: 1, - // minimumSignificantDigits: 1, - // maximumSignificantDigits: 1, - useGrouping: true, - minimumFractionDigits: min, - maximumFractionDigits: max - }); - } - }; - } - - return this.formattersFixed[key]; - } else if (min === 0) { - if (typeof this.formattersZeroBased[key] === 'undefined') { - this.formattersZeroBased[key] = { - format: function (value) { - return value.toLocaleString(undefined, { - // style: 'decimal', - // minimumIntegerDigits: 1, - // minimumSignificantDigits: 1, - // maximumSignificantDigits: 1, - useGrouping: true, - minimumFractionDigits: min, - maximumFractionDigits: max - }); - } - }; - } - - return this.formattersZeroBased[key]; - } else { - return { - format: function (value) { - return value.toLocaleString(undefined, { - // style: 'decimal', - // minimumIntegerDigits: 1, - // minimumSignificantDigits: 1, - // maximumSignificantDigits: 1, - useGrouping: true, - minimumFractionDigits: min, - maximumFractionDigits: max - }); - } - }; - } - }, - - // the fallback - getFixed: function (min, max) { - let key = max; - if (min === max) { - if (typeof this.formattersFixed[key] === 'undefined') { - this.formattersFixed[key] = { - format: function (value) { - if (value === 0) { - return "0"; - } - return value.toFixed(max); - } - }; - } - - return this.formattersFixed[key]; - } else if (min === 0) { - if (typeof this.formattersZeroBased[key] === 'undefined') { - this.formattersZeroBased[key] = { - format: function (value) { - if (value === 0) { - return "0"; - } - return value.toFixed(max); - } - }; - } - - return this.formattersZeroBased[key]; - } else { - return { - format: function (value) { - if (value === 0) { - return "0"; - } - return value.toFixed(max); - } - }; - } - }, - - testIntlNumberFormat: function () { - let value = 1.12345; - let e1 = "1.12", e2 = "1,12"; - let s = ""; - - try { - let x = new Intl.NumberFormat(undefined, { - useGrouping: true, - minimumFractionDigits: 2, - maximumFractionDigits: 2 - }); - - s = x.format(value); - } catch (e) { - s = ""; - } - - // console.log('NumberFormat: ', s); - return (s === e1 || s === e2); - }, - - testLocaleString: function () { - let value = 1.12345; - let e1 = "1.12", e2 = "1,12"; - let s = ""; - - try { - s = value.toLocaleString(undefined, { - useGrouping: true, - minimumFractionDigits: 2, - maximumFractionDigits: 2 - }); - } catch (e) { - s = ""; - } - - // console.log('localeString: ', s); - return (s === e1 || s === e2); - }, - - // on first run we decide which formatter to use - get: function (min, max) { - if (this.testIntlNumberFormat()) { - // console.log('numberformat'); - this.get = this.getIntlNumberFormat; - } else if (this.testLocaleString()) { - // console.log('localestring'); - this.get = this.getLocaleString; - } else { - // console.log('fixed'); - this.get = this.getFixed; - } - return this.get(min, max); - } -}; - -// ---------------------------------------------------------------------------------------------------------------- -// Detect the netdata server - -// http://stackoverflow.com/questions/984510/what-is-my-script-src-url -// http://stackoverflow.com/questions/6941533/get-protocol-domain-and-port-from-url -NETDATA._scriptSource = function () { - let script = null; - - if (typeof document.currentScript !== 'undefined') { - script = document.currentScript; - } else { - const all_scripts = document.getElementsByTagName('script'); - script = all_scripts[all_scripts.length - 1]; - } - - if (typeof script.getAttribute.length !== 'undefined') { - script = script.src; - } else { - script = script.getAttribute('src', -1); - } - - return script; -}; - -// *** src/dashboard.js/server-detection.js - -if (typeof netdataServer !== 'undefined') { - NETDATA.serverDefault = netdataServer; -} else { - let s = NETDATA._scriptSource(); - if (s) { - NETDATA.serverDefault = s.replace(/\/dashboard.js(\?.*)?$/g, ""); - } else { - console.log('WARNING: Cannot detect the URL of the netdata server.'); - NETDATA.serverDefault = null; - } -} - -if (NETDATA.serverDefault === null) { - NETDATA.serverDefault = ''; -} else if (NETDATA.serverDefault.slice(-1) !== '/') { - NETDATA.serverDefault += '/'; -} - -if (typeof netdataServerStatic !== 'undefined' && netdataServerStatic !== null && netdataServerStatic !== '') { - NETDATA.serverStatic = netdataServerStatic; - if (NETDATA.serverStatic.slice(-1) !== '/') { - NETDATA.serverStatic += '/'; - } -} else { - NETDATA.serverStatic = NETDATA.serverDefault; -} - -// *** src/dashboard.js/dependencies.js - -// default URLs for all the external files we need -// make them RELATIVE so that the whole thing can also be -// installed under a web server -NETDATA.jQuery = NETDATA.serverStatic + 'lib/jquery-3.6.0.min.js'; -NETDATA.peity_js = NETDATA.serverStatic + 'lib/jquery.peity-3.2.0.min.js'; -NETDATA.sparkline_js = NETDATA.serverStatic + 'lib/jquery.sparkline-2.1.2.min.js'; -NETDATA.easypiechart_js = NETDATA.serverStatic + 'lib/jquery.easypiechart-97b5824.min.js'; -NETDATA.gauge_js = NETDATA.serverStatic + 'lib/gauge-1.3.2.min.js'; -NETDATA.dygraph_js = NETDATA.serverStatic + 'lib/dygraph-c91c859.min.js'; -NETDATA.dygraph_smooth_js = NETDATA.serverStatic + 'lib/dygraph-smooth-plotter-c91c859.js'; -// NETDATA.raphael_js = NETDATA.serverStatic + 'lib/raphael-2.2.4-min.js'; -// NETDATA.c3_js = NETDATA.serverStatic + 'lib/c3-0.4.18.min.js'; -// NETDATA.c3_css = NETDATA.serverStatic + 'css/c3-0.4.18.min.css'; -NETDATA.d3pie_js = NETDATA.serverStatic + 'lib/d3pie-0.2.1-netdata-3.js'; -NETDATA.d3_js = NETDATA.serverStatic + 'lib/d3-4.12.2.min.js'; -// NETDATA.morris_js = NETDATA.serverStatic + 'lib/morris-0.5.1.min.js'; -// NETDATA.morris_css = NETDATA.serverStatic + 'css/morris-0.5.1.css'; -NETDATA.google_js = 'https://www.google.com/jsapi'; -// Error Handling - -NETDATA.errorCodes = { - 100: {message: "Cannot load chart library", alert: true}, - 101: {message: "Cannot load jQuery", alert: true}, - 402: {message: "Chart library not found", alert: false}, - 403: {message: "Chart library not enabled/is failed", alert: false}, - 404: {message: "Chart not found", alert: false}, - 405: {message: "Cannot download charts index from server", alert: true}, - 406: {message: "Invalid charts index downloaded from server", alert: true}, - 407: {message: "Cannot HELLO netdata server", alert: false}, - 408: {message: "Netdata servers sent invalid response to HELLO", alert: false}, - 409: {message: "Cannot ACCESS netdata registry", alert: false}, - 410: {message: "Netdata registry ACCESS failed", alert: false}, - 411: {message: "Netdata registry server send invalid response to DELETE ", alert: false}, - 412: {message: "Netdata registry DELETE failed", alert: false}, - 413: {message: "Netdata registry server send invalid response to SWITCH ", alert: false}, - 414: {message: "Netdata registry SWITCH failed", alert: false}, - 415: {message: "Netdata alarms download failed", alert: false}, - 416: {message: "Netdata alarms log download failed", alert: false}, - 417: {message: "Netdata registry server send invalid response to SEARCH ", alert: false}, - 418: {message: "Netdata registry SEARCH failed", alert: false} -}; - -NETDATA.errorLast = { - code: 0, - message: "", - datetime: 0 -}; - -NETDATA.error = function (code, msg) { - NETDATA.errorLast.code = code; - NETDATA.errorLast.message = msg; - NETDATA.errorLast.datetime = Date.now(); - - console.log("ERROR " + code + ": " + NETDATA.errorCodes[code].message + ": " + msg); - - let ret = true; - if (typeof netdataErrorCallback === 'function') { - ret = netdataErrorCallback('system', code, msg); - } - - if (ret && NETDATA.errorCodes[code].alert) { - alert("ERROR " + code + ": " + NETDATA.errorCodes[code].message + ": " + msg); - } -}; - -NETDATA.errorReset = function () { - NETDATA.errorLast.code = 0; - NETDATA.errorLast.message = "You are doing fine!"; - NETDATA.errorLast.datetime = 0; -}; -// *** src/dashboard.js/compatibility.js - -// Compatibility fixes. - -// fix IE issue with console -if (!window.console) { - window.console = { - log: function () { - } - }; -} - -// if string.endsWith is not defined, define it -if (typeof String.prototype.endsWith !== 'function') { - String.prototype.endsWith = function (s) { - if (s.length > this.length) { - return false; - } - return this.slice(-s.length) === s; - }; -} - -// if string.startsWith is not defined, define it -if (typeof String.prototype.startsWith !== 'function') { - String.prototype.startsWith = function (s) { - if (s.length > this.length) { - return false; - } - return this.slice(s.length) === s; - }; -} -// ---------------------------------------------------------------------------------------------------------------- -// XSS checks - -NETDATA.xss = { - enabled: (typeof netdataCheckXSS === 'undefined') ? false : netdataCheckXSS, - enabled_for_data: (typeof netdataCheckXSS === 'undefined') ? false : netdataCheckXSS, - - string: function (s) { - return s.toString() - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); - }, - - object: function (name, obj, ignore_regex) { - if (typeof ignore_regex !== 'undefined' && ignore_regex.test(name)) { - // console.log('XSS: ignoring "' + name + '"'); - return obj; - } - - switch (typeof(obj)) { - case 'string': - const ret = this.string(obj); - if (ret !== obj) { - console.log('XSS protection changed string ' + name + ' from "' + obj + '" to "' + ret + '"'); - } - return ret; - - case 'object': - if (obj === null) { - return obj; - } - - if (Array.isArray(obj)) { - // console.log('checking array "' + name + '"'); - - let len = obj.length; - while (len--) { - obj[len] = this.object(name + '[' + len + ']', obj[len], ignore_regex); - } - } else { - // console.log('checking object "' + name + '"'); - - for (var i in obj) { - if (obj.hasOwnProperty(i) === false) { - continue; - } - if (this.string(i) !== i) { - console.log('XSS protection removed invalid object member "' + name + '.' + i + '"'); - delete obj[i]; - } else { - obj[i] = this.object(name + '.' + i, obj[i], ignore_regex); - } - } - } - return obj; - - default: - return obj; - } - }, - - checkOptional: function (name, obj, ignore_regex) { - if (this.enabled) { - //console.log('XSS: checking optional "' + name + '"...'); - return this.object(name, obj, ignore_regex); - } - return obj; - }, - - checkAlways: function (name, obj, ignore_regex) { - //console.log('XSS: checking always "' + name + '"...'); - return this.object(name, obj, ignore_regex); - }, - - checkData: function (name, obj, ignore_regex) { - if (this.enabled_for_data) { - //console.log('XSS: checking data "' + name + '"...'); - return this.object(name, obj, ignore_regex); - } - return obj; - } -}; -NETDATA.colorHex2Rgb = function (hex) { - // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") - let shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; - hex = hex.replace(shorthandRegex, function (m, r, g, b) { - return r + r + g + g + b + b; - }); - - let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - return result ? { - r: parseInt(result[1], 16), - g: parseInt(result[2], 16), - b: parseInt(result[3], 16) - } : null; -}; - -NETDATA.colorLuminance = function (hex, lum) { - // validate hex string - hex = String(hex).replace(/[^0-9a-f]/gi, ''); - if (hex.length < 6) { - hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; - } - - lum = lum || 0; - - // convert to decimal and change luminosity - let rgb = "#"; - for (let i = 0; i < 3; i++) { - let c = parseInt(hex.substr(i * 2, 2), 16); - c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16); - rgb += ("00" + c).substr(c.length); - } - - return rgb; -}; -NETDATA.unitsConversion = { - keys: {}, // keys for data-common-units - latest: {}, // latest selected units for data-common-units - - globalReset: function () { - this.keys = {}; - this.latest = {}; - }, - - scalableUnits: { - 'packets/s': { - 'pps': 1, - 'Kpps': 1000, - 'Mpps': 1000000 - }, - 'pps': { - 'pps': 1, - 'Kpps': 1000, - 'Mpps': 1000000 - }, - 'kilobits/s': { - 'bits/s': 1 / 1000, - 'kilobits/s': 1, - 'megabits/s': 1000, - 'gigabits/s': 1000000, - 'terabits/s': 1000000000 - }, - 'bytes/s': { - 'bytes/s': 1, - 'kilobytes/s': 1024, - 'megabytes/s': 1024 * 1024, - 'gigabytes/s': 1024 * 1024 * 1024, - 'terabytes/s': 1024 * 1024 * 1024 * 1024 - }, - 'kilobytes/s': { - 'bytes/s': 1 / 1024, - 'kilobytes/s': 1, - 'megabytes/s': 1024, - 'gigabytes/s': 1024 * 1024, - 'terabytes/s': 1024 * 1024 * 1024 - }, - 'B/s': { - 'B/s': 1, - 'KiB/s': 1024, - 'MiB/s': 1024 * 1024, - 'GiB/s': 1024 * 1024 * 1024, - 'TiB/s': 1024 * 1024 * 1024 * 1024 - }, - 'KB/s': { - 'B/s': 1 / 1024, - 'KB/s': 1, - 'MB/s': 1024, - 'GB/s': 1024 * 1024, - 'TB/s': 1024 * 1024 * 1024 - }, - 'KiB/s': { - 'B/s': 1 / 1024, - 'KiB/s': 1, - 'MiB/s': 1024, - 'GiB/s': 1024 * 1024, - 'TiB/s': 1024 * 1024 * 1024 - }, - 'B': { - 'B': 1, - 'KiB': 1024, - 'MiB': 1024 * 1024, - 'GiB': 1024 * 1024 * 1024, - 'TiB': 1024 * 1024 * 1024 * 1024, - 'PiB': 1024 * 1024 * 1024 * 1024 * 1024 - }, - 'KB': { - 'B': 1 / 1024, - 'KB': 1, - 'MB': 1024, - 'GB': 1024 * 1024, - 'TB': 1024 * 1024 * 1024 - }, - 'KiB': { - 'B': 1 / 1024, - 'KiB': 1, - 'MiB': 1024, - 'GiB': 1024 * 1024, - 'TiB': 1024 * 1024 * 1024 - }, - 'MB': { - 'B': 1 / (1024 * 1024), - 'KB': 1 / 1024, - 'MB': 1, - 'GB': 1024, - 'TB': 1024 * 1024, - 'PB': 1024 * 1024 * 1024 - }, - 'MiB': { - 'B': 1 / (1024 * 1024), - 'KiB': 1 / 1024, - 'MiB': 1, - 'GiB': 1024, - 'TiB': 1024 * 1024, - 'PiB': 1024 * 1024 * 1024 - }, - 'GB': { - 'B': 1 / (1024 * 1024 * 1024), - 'KB': 1 / (1024 * 1024), - 'MB': 1 / 1024, - 'GB': 1, - 'TB': 1024, - 'PB': 1024 * 1024, - 'EB': 1024 * 1024 * 1024 - }, - 'GiB': { - 'B': 1 / (1024 * 1024 * 1024), - 'KiB': 1 / (1024 * 1024), - 'MiB': 1 / 1024, - 'GiB': 1, - 'TiB': 1024, - 'PiB': 1024 * 1024, - 'EiB': 1024 * 1024 * 1024 - }, - 'num': { - 'num': 1, - 'num (K)': 1000, - 'num (M)': 1000000, - 'num (G)': 1000000000, - 'num (T)': 1000000000000 - } - /* - 'milliseconds': { - 'seconds': 1000 - }, - 'seconds': { - 'milliseconds': 0.001, - 'seconds': 1, - 'minutes': 60, - 'hours': 3600, - 'days': 86400 - } - */ - }, - - convertibleUnits: { - 'Celsius': { - 'Fahrenheit': { - check: function (max) { - void(max); - return NETDATA.options.current.temperature === 'fahrenheit'; - }, - convert: function (value) { - return value * 9 / 5 + 32; - } - } - }, - 'celsius': { - 'fahrenheit': { - check: function (max) { - void(max); - return NETDATA.options.current.temperature === 'fahrenheit'; - }, - convert: function (value) { - return value * 9 / 5 + 32; - } - } - }, - 'seconds': { - 'time': { - check: function (max) { - void(max); - return NETDATA.options.current.seconds_as_time; - }, - convert: function (seconds) { - return NETDATA.unitsConversion.seconds2time(seconds); - } - } - }, - 'milliseconds': { - 'milliseconds': { - check: function (max) { - return NETDATA.options.current.seconds_as_time && max < 1000; - }, - convert: function (milliseconds) { - let tms = Math.round(milliseconds * 10); - milliseconds = Math.floor(tms / 10); - - tms -= milliseconds * 10; - - return (milliseconds).toString() + '.' + tms.toString(); - } - }, - 'seconds': { - check: function (max) { - return NETDATA.options.current.seconds_as_time && max >= 1000 && max < 60000; - }, - convert: function (milliseconds) { - milliseconds = Math.round(milliseconds); - - let seconds = Math.floor(milliseconds / 1000); - milliseconds -= seconds * 1000; - - milliseconds = Math.round(milliseconds / 10); - - return seconds.toString() + '.' - + NETDATA.zeropad(milliseconds); - } - }, - 'M:SS.ms': { - check: function (max) { - return NETDATA.options.current.seconds_as_time && max >= 60000; - }, - convert: function (milliseconds) { - milliseconds = Math.round(milliseconds); - - let minutes = Math.floor(milliseconds / 60000); - milliseconds -= minutes * 60000; - - let seconds = Math.floor(milliseconds / 1000); - milliseconds -= seconds * 1000; - - milliseconds = Math.round(milliseconds / 10); - - return minutes.toString() + ':' - + NETDATA.zeropad(seconds) + '.' - + NETDATA.zeropad(milliseconds); - } - } - }, - 'nanoseconds': { - 'nanoseconds': { - check: function (max) { - return NETDATA.options.current.seconds_as_time && max < 1000; - }, - convert: function (nanoseconds) { - let tms = Math.round(nanoseconds * 10); - nanoseconds = Math.floor(tms / 10); - - tms -= nanoseconds * 10; - - return (nanoseconds).toString() + '.' + tms.toString(); - } - }, - 'microseconds': { - check: function (max) { - return NETDATA.options.current.seconds_as_time - && max >= 1000 && max < 1000 * 1000; - }, - convert: function (nanoseconds) { - nanoseconds = Math.round(nanoseconds); - - let microseconds = Math.floor(nanoseconds / 1000); - nanoseconds -= microseconds * 1000; - - nanoseconds = Math.round(nanoseconds / 10 ); - - return microseconds.toString() + '.' - + NETDATA.zeropad(nanoseconds); - } - }, - 'milliseconds': { - check: function (max) { - return NETDATA.options.current.seconds_as_time - && max >= 1000 * 1000 && max < 1000 * 1000 * 1000; - }, - convert: function (nanoseconds) { - nanoseconds = Math.round(nanoseconds); - - let milliseconds = Math.floor(nanoseconds / 1000 / 1000); - nanoseconds -= milliseconds * 1000 * 1000; - - nanoseconds = Math.round(nanoseconds / 1000 / 10); - - return milliseconds.toString() + '.' - + NETDATA.zeropad(nanoseconds); - } - }, - 'seconds': { - check: function (max) { - return NETDATA.options.current.seconds_as_time - && max >= 1000 * 1000 * 1000; - }, - convert: function (nanoseconds) { - nanoseconds = Math.round(nanoseconds); - - let seconds = Math.floor(nanoseconds / 1000 / 1000 / 1000); - nanoseconds -= seconds * 1000 * 1000 * 1000; - - nanoseconds = Math.round(nanoseconds / 1000 / 1000 / 10); - - return seconds.toString() + '.' - + NETDATA.zeropad(nanoseconds); - } - }, - } - }, - - seconds2time: function (seconds) { - seconds = Math.abs(seconds); - - let days = Math.floor(seconds / 86400); - seconds -= days * 86400; - - let hours = Math.floor(seconds / 3600); - seconds -= hours * 3600; - - let minutes = Math.floor(seconds / 60); - seconds -= minutes * 60; - - seconds = Math.round(seconds); - - let ms_txt = ''; - /* - let ms = seconds - Math.floor(seconds); - seconds -= ms; - ms = Math.round(ms * 1000); - - if (ms > 1) { - if (ms < 10) - ms_txt = '.00' + ms.toString(); - else if (ms < 100) - ms_txt = '.0' + ms.toString(); - else - ms_txt = '.' + ms.toString(); - } - */ - - return ((days > 0) ? days.toString() + 'd:' : '').toString() - + NETDATA.zeropad(hours) + ':' - + NETDATA.zeropad(minutes) + ':' - + NETDATA.zeropad(seconds) - + ms_txt; - }, - - // get a function that converts the units - // + every time units are switched call the callback - get: function (uuid, min, max, units, desired_units, common_units_name, switch_units_callback) { - // validate the parameters - if (typeof units === 'undefined') { - units = 'undefined'; - } - - // check if we support units conversion - if (typeof this.scalableUnits[units] === 'undefined' && typeof this.convertibleUnits[units] === 'undefined') { - // we can't convert these units - //console.log('DEBUG: ' + uuid.toString() + ' can\'t convert units: ' + units.toString()); - return function (value) { - return value; - }; - } - - // check if the caller wants the original units - if (typeof desired_units === 'undefined' || desired_units === null || desired_units === 'original' || desired_units === units) { - //console.log('DEBUG: ' + uuid.toString() + ' original units wanted'); - switch_units_callback(units); - return function (value) { - return value; - }; - } - - // now we know we can convert the units - // and the caller wants some kind of conversion - - let tunits = null; - let tdivider = 0; - - if (typeof this.scalableUnits[units] !== 'undefined') { - // units that can be scaled - // we decide a divider - - // console.log('NETDATA.unitsConversion.get(' + units.toString() + ', ' + desired_units.toString() + ', function()) decide divider with min = ' + min.toString() + ', max = ' + max.toString()); - - if (desired_units === 'auto') { - // the caller wants to auto-scale the units - - // find the absolute maximum value that is rendered on the chart - // based on this we decide the scale - min = Math.abs(min); - max = Math.abs(max); - if (min > max) { - max = min; - } - - // find the smallest scale that provides integers - // for (x in this.scalableUnits[units]) { - // if (this.scalableUnits[units].hasOwnProperty(x)) { - // let m = this.scalableUnits[units][x]; - // if (m <= max && m > tdivider) { - // tunits = x; - // tdivider = m; - // } - // } - // } - const sunit = this.scalableUnits[units]; - for (var x of Object.keys(sunit)) { - let m = sunit[x]; - if (m <= max && m > tdivider) { - tunits = x; - tdivider = m; - } - } - - if (tunits === null || tdivider <= 0) { - // we couldn't find one - //console.log('DEBUG: ' + uuid.toString() + ' cannot find an auto-scaling candidate for units: ' + units.toString() + ' (max: ' + max.toString() + ')'); - switch_units_callback(units); - return function (value) { - return value; - }; - } - - if (typeof common_units_name === 'string' && typeof uuid === 'string') { - // the caller wants several charts to have the same units - // data-common-units - - let common_units_key = common_units_name + '-' + units; - - // add our divider into the list of keys - let t = this.keys[common_units_key]; - if (typeof t === 'undefined') { - this.keys[common_units_key] = {}; - t = this.keys[common_units_key]; - } - t[uuid] = { - units: tunits, - divider: tdivider - }; - - // find the max divider of all charts - let common_units = t[uuid]; - for (var x in t) { - if (t.hasOwnProperty(x) && t[x].divider > common_units.divider) { - common_units = t[x]; - } - } - - // save our common_max to the latest keys - let latest = this.latest[common_units_key]; - if (typeof latest === 'undefined') { - this.latest[common_units_key] = {}; - latest = this.latest[common_units_key]; - } - latest.units = common_units.units; - latest.divider = common_units.divider; - - tunits = latest.units; - tdivider = latest.divider; - - //console.log('DEBUG: ' + uuid.toString() + ' converted units: ' + units.toString() + ' to units: ' + tunits.toString() + ' with divider ' + tdivider.toString() + ', common-units=' + common_units_name.toString() + ((t[uuid].divider !== tdivider)?' USED COMMON, mine was ' + t[uuid].units:' set common').toString()); - - // apply it to this chart - switch_units_callback(tunits); - return function (value) { - if (tdivider !== latest.divider) { - // another chart switched our common units - // we should switch them too - //console.log('DEBUG: ' + uuid + ' switching units due to a common-units change, from ' + tunits.toString() + ' to ' + latest.units.toString()); - tunits = latest.units; - tdivider = latest.divider; - switch_units_callback(tunits); - } - - return value / tdivider; - }; - } else { - // the caller did not give data-common-units - // this chart auto-scales independently of all others - //console.log('DEBUG: ' + uuid.toString() + ' converted units: ' + units.toString() + ' to units: ' + tunits.toString() + ' with divider ' + tdivider.toString() + ', autonomously'); - - switch_units_callback(tunits); - return function (value) { - return value / tdivider; - }; - } - } else { - // the caller wants specific units - - if (typeof this.scalableUnits[units][desired_units] !== 'undefined') { - // all good, set the new units - tdivider = this.scalableUnits[units][desired_units]; - // console.log('DEBUG: ' + uuid.toString() + ' converted units: ' + units.toString() + ' to units: ' + desired_units.toString() + ' with divider ' + tdivider.toString() + ', by reference'); - switch_units_callback(desired_units); - return function (value) { - return value / tdivider; - }; - } else { - // oops! switch back to original units - console.log('Units conversion from ' + units.toString() + ' to ' + desired_units.toString() + ' is not supported.'); - switch_units_callback(units); - return function (value) { - return value; - }; - } - } - } else if (typeof this.convertibleUnits[units] !== 'undefined') { - // units that can be converted - if (desired_units === 'auto') { - for (var x in this.convertibleUnits[units]) { - if (this.convertibleUnits[units].hasOwnProperty(x)) { - if (this.convertibleUnits[units][x].check(max)) { - //console.log('DEBUG: ' + uuid.toString() + ' converting ' + units.toString() + ' to: ' + x.toString()); - switch_units_callback(x); - return this.convertibleUnits[units][x].convert; - } - } - } - - // none checked ok - //console.log('DEBUG: ' + uuid.toString() + ' no conversion available for ' + units.toString() + ' to: ' + desired_units.toString()); - switch_units_callback(units); - return function (value) { - return value; - }; - } else if (typeof this.convertibleUnits[units][desired_units] !== 'undefined') { - switch_units_callback(desired_units); - return this.convertibleUnits[units][desired_units].convert; - } else { - console.log('Units conversion from ' + units.toString() + ' to ' + desired_units.toString() + ' is not supported.'); - switch_units_callback(units); - return function (value) { - return value; - }; - } - } else { - // hm... did we forget to implement the new type? - console.log(`Unmatched unit conversion method for units ${units.toString()}`); - switch_units_callback(units); - return function (value) { - return value; - }; - } - } -}; - -NETDATA.icons = { - left: '', - reset: '', - right: '', - zoomIn: '', - zoomOut: '', - resize: '', - lineChart: '', - areaChart: '', - noChart: '', - loading: '', - noData: '' -}; - -if (typeof netdataIcons === 'object') { - // for (let icon in NETDATA.icons) { - // if (NETDATA.icons.hasOwnProperty(icon) && typeof(netdataIcons[icon]) === 'string') - // NETDATA.icons[icon] = netdataIcons[icon]; - // } - for (var icon of Object.keys(NETDATA.icons)) { - if (typeof(netdataIcons[icon]) === 'string') { - NETDATA.icons[icon] = netdataIcons[icon] - } - } -} - -if (typeof netdataSnapshotData === 'undefined') { - netdataSnapshotData = null; -} - -if (typeof netdataShowHelp === 'undefined') { - netdataShowHelp = true; -} - -if (typeof netdataShowAlarms === 'undefined') { - netdataShowAlarms = false; -} - -if (typeof netdataRegistryAfterMs !== 'number' || netdataRegistryAfterMs < 0) { - netdataRegistryAfterMs = 0; // 1500; -} - -if (typeof netdataRegistry === 'undefined') { - // backward compatibility - netdataRegistry = (typeof netdataNoRegistry !== 'undefined' && netdataNoRegistry === false); -} - -if (netdataRegistry === false && typeof netdataRegistryCallback === 'function') { - netdataRegistry = true; -} - -// ---------------------------------------------------------------------------------------------------------------- -// the defaults for all charts - -// if the user does not specify any of these, the following will be used - -NETDATA.chartDefaults = { - width: '100%', // the chart width - can be null - height: '100%', // the chart height - can be null - min_width: null, // the chart minimum width - can be null - library: 'dygraph', // the graphing library to use - method: 'average', // the grouping method - before: 0, // panning - after: -600, // panning - pixels_per_point: 1, // the detail of the chart - fill_luminance: 0.8 // luminance of colors in solid areas -}; - -// ---------------------------------------------------------------------------------------------------------------- -// global options - -NETDATA.options = { - pauseCallback: null, // a callback when we are really paused - - pause: false, // when enabled we don't auto-refresh the charts - - targets: [], // an array of all the state objects that are - // currently active (independently of their - // viewport visibility) - - updated_dom: true, // when true, the DOM has been updated with - // new elements we have to check. - - auto_refresher_fast_weight: 0, // this is the current time in ms, spent - // rendering charts continuously. - // used with .current.fast_render_timeframe - - page_is_visible: true, // when true, this page is visible - - auto_refresher_stop_until: 0, // timestamp in ms - used internally, to stop the - // auto-refresher for some time (when a chart is - // performing pan or zoom, we need to stop refreshing - // all other charts, to have the maximum speed for - // rendering the chart that is panned or zoomed). - // Used with .current.global_pan_sync_time - - on_scroll_refresher_stop_until: 0, // timestamp in ms - used to stop evaluating - // charts for some time, after a page scroll - - last_page_resize: Date.now(), // the timestamp of the last resize request - - last_page_scroll: 0, // the timestamp the last time the page was scrolled - - browser_timezone: 'unknown', // timezone detected by javascript - server_timezone: 'unknown', // timezone reported by the server - - force_data_points: 0, // force the number of points to be returned for charts - fake_chart_rendering: false, // when set to true, the dashboard will download data but will not render the charts - - passive_events: null, // true if the browser supports passive events - - // the current profile - // we may have many... - current: { - units: 'auto', // can be 'auto' or 'original' - temperature: 'celsius', // can be 'celsius' or 'fahrenheit' - seconds_as_time: true, // show seconds as DDd:HH:MM:SS ? - timezone: 'default', // the timezone to use, or 'default' - user_set_server_timezone: 'default', // as set by the user on the dashboard - - legend_toolbox: true, // show the legend toolbox on charts - resize_charts: true, // show the resize handler on charts - - pixels_per_point: isSlowDevice() ? 5 : 1, // the minimum pixels per point for all charts - // increase this to speed javascript up - // each chart library has its own limit too - // the max of this and the chart library is used - // the final is calculated every time, so a change - // here will have immediate effect on the next chart - // update - - idle_between_charts: 100, // ms - how much time to wait between chart updates - - fast_render_timeframe: 200, // ms - render continuously until this time of continuous - // rendering has been reached - // this setting is used to make it render e.g. 10 - // charts at once, sleep idle_between_charts time - // and continue for another 10 charts. - - idle_between_loops: 500, // ms - if all charts have been updated, wait this - // time before starting again. - - idle_parallel_loops: 100, // ms - the time between parallel refresher updates - - idle_lost_focus: 500, // ms - when the window does not have focus, check - // if focus has been regained, every this time - - global_pan_sync_time: 300, // ms - when you pan or zoom a chart, the background - // auto-refreshing of charts is paused for this amount - // of time - - sync_selection_delay: 400, // ms - when you pan or zoom a chart, wait this amount - // of time before setting up synchronized selections - // on hover. - - sync_selection: true, // enable or disable selection sync - - pan_and_zoom_delay: 50, // when panning or zooming, how ofter to update the chart - - sync_pan_and_zoom: true, // enable or disable pan and zoom sync - - pan_and_zoom_data_padding: true, // fetch more data for the master chart when panning or zooming - - update_only_visible: true, // enable or disable visibility management / used for printing - - parallel_refresher: !isSlowDevice(), // enable parallel refresh of charts - - concurrent_refreshes: true, // when parallel_refresher is enabled, sync also the charts - - destroy_on_hide: isSlowDevice(), // destroy charts when they are not visible - - show_help: netdataShowHelp, // when enabled the charts will show some help - show_help_delay_show_ms: 500, - show_help_delay_hide_ms: 0, - - eliminate_zero_dimensions: true, // do not show dimensions with just zeros - - stop_updates_when_focus_is_lost: true, // boolean - shall we stop auto-refreshes when document does not have user focus - stop_updates_while_resizing: 1000, // ms - time to stop auto-refreshes while resizing the charts - - double_click_speed: 500, // ms - time between clicks / taps to detect double click/tap - - smooth_plot: !isSlowDevice(), // enable smooth plot, where possible - - color_fill_opacity_line: 1.0, - color_fill_opacity_area: 0.2, - color_fill_opacity_stacked: 0.8, - - pan_and_zoom_factor: 0.25, // the increment when panning and zooming with the toolbox - pan_and_zoom_factor_multiplier_control: 2.0, - pan_and_zoom_factor_multiplier_shift: 3.0, - pan_and_zoom_factor_multiplier_alt: 4.0, - - abort_ajax_on_scroll: false, // kill pending ajax page scroll - async_on_scroll: false, // sync/async onscroll handler - onscroll_worker_duration_threshold: 30, // time in ms, for async scroll handler - - retries_on_data_failures: 3, // how many retries to make if we can't fetch chart data from the server - - setOptionCallback: function () { - } - }, - - debug: { - show_boxes: false, - main_loop: false, - focus: false, - visibility: false, - chart_data_url: false, - chart_errors: true, // remember to set it to false before merging - chart_timing: false, - chart_calls: false, - libraries: false, - dygraph: false, - globalSelectionSync: false, - globalPanAndZoom: false - } -}; - -NETDATA.statistics = { - refreshes_total: 0, - refreshes_active: 0, - refreshes_active_max: 0 -}; - -// local storage options - -NETDATA.localStorage = { - default: {}, - current: {}, - callback: {} // only used for resetting back to defaults -}; - -NETDATA.localStorageTested = -1; -NETDATA.localStorageTest = function () { - if (NETDATA.localStorageTested !== -1) { - return NETDATA.localStorageTested; - } - - if (typeof Storage !== "undefined" && typeof localStorage === 'object') { - let test = 'test'; - try { - localStorage.setItem(test, test); - localStorage.removeItem(test); - NETDATA.localStorageTested = true; - } catch (e) { - NETDATA.localStorageTested = false; - } - } else { - NETDATA.localStorageTested = false; - } - - return NETDATA.localStorageTested; -}; - -NETDATA.localStorageGet = function (key, def, callback) { - let ret = def; - - if (typeof NETDATA.localStorage.default[key.toString()] === 'undefined') { - NETDATA.localStorage.default[key.toString()] = def; - NETDATA.localStorage.callback[key.toString()] = callback; - } - - if (NETDATA.localStorageTest()) { - try { - // console.log('localStorage: loading "' + key.toString() + '"'); - ret = localStorage.getItem(key.toString()); - // console.log('netdata loaded: ' + key.toString() + ' = ' + ret.toString()); - if (ret === null || ret === 'undefined') { - // console.log('localStorage: cannot load it, saving "' + key.toString() + '" with value "' + JSON.stringify(def) + '"'); - localStorage.setItem(key.toString(), JSON.stringify(def)); - ret = def; - } else { - // console.log('localStorage: got "' + key.toString() + '" with value "' + ret + '"'); - ret = JSON.parse(ret); - // console.log('localStorage: loaded "' + key.toString() + '" as value ' + ret + ' of type ' + typeof(ret)); - } - } catch (error) { - console.log('localStorage: failed to read "' + key.toString() + '", using default: "' + def.toString() + '"'); - ret = def; - } - } - - if (typeof ret === 'undefined' || ret === 'undefined') { - console.log('localStorage: LOADED UNDEFINED "' + key.toString() + '" as value ' + ret + ' of type ' + typeof(ret)); - ret = def; - } - - NETDATA.localStorage.current[key.toString()] = ret; - return ret; -}; - -NETDATA.localStorageSet = function (key, value, callback) { - if (typeof value === 'undefined' || value === 'undefined') { - console.log('localStorage: ATTEMPT TO SET UNDEFINED "' + key.toString() + '" as value ' + value + ' of type ' + typeof(value)); - } - - if (typeof NETDATA.localStorage.default[key.toString()] === 'undefined') { - NETDATA.localStorage.default[key.toString()] = value; - NETDATA.localStorage.current[key.toString()] = value; - NETDATA.localStorage.callback[key.toString()] = callback; - } - - if (NETDATA.localStorageTest()) { - // console.log('localStorage: saving "' + key.toString() + '" with value "' + JSON.stringify(value) + '"'); - try { - localStorage.setItem(key.toString(), JSON.stringify(value)); - } catch (e) { - console.log('localStorage: failed to save "' + key.toString() + '" with value: "' + value.toString() + '"'); - } - } - - NETDATA.localStorage.current[key.toString()] = value; - return value; -}; - -NETDATA.localStorageGetRecursive = function (obj, prefix, callback) { - let keys = Object.keys(obj); - let len = keys.length; - while (len--) { - let i = keys[len]; - - if (typeof obj[i] === 'object') { - //console.log('object ' + prefix + '.' + i.toString()); - NETDATA.localStorageGetRecursive(obj[i], prefix + '.' + i.toString(), callback); - continue; - } - - obj[i] = NETDATA.localStorageGet(prefix + '.' + i.toString(), obj[i], callback); - } -}; - -NETDATA.setOption = function (key, value) { - if (key.toString() === 'setOptionCallback') { - if (typeof NETDATA.options.current.setOptionCallback === 'function') { - NETDATA.options.current[key.toString()] = value; - NETDATA.options.current.setOptionCallback(); - } - } else if (NETDATA.options.current[key.toString()] !== value) { - let name = 'options.' + key.toString(); - - if (typeof NETDATA.localStorage.default[name.toString()] === 'undefined') { - console.log('localStorage: setOption() on unsaved option: "' + name.toString() + '", value: ' + value); - } - - //console.log(NETDATA.localStorage); - //console.log('setOption: setting "' + key.toString() + '" to "' + value + '" of type ' + typeof(value) + ' original type ' + typeof(NETDATA.options.current[key.toString()])); - //console.log(NETDATA.options); - NETDATA.options.current[key.toString()] = NETDATA.localStorageSet(name.toString(), value, null); - - if (typeof NETDATA.options.current.setOptionCallback === 'function') { - NETDATA.options.current.setOptionCallback(); - } - } - - return true; -}; - -NETDATA.getOption = function (key) { - return NETDATA.options.current[key.toString()]; -}; - -// read settings from local storage -NETDATA.localStorageGetRecursive(NETDATA.options.current, 'options', null); - -// always start with this option enabled. -NETDATA.setOption('stop_updates_when_focus_is_lost', true); - -NETDATA.resetOptions = function () { - let keys = Object.keys(NETDATA.localStorage.default); - let len = keys.length; - - while (len--) { - let i = keys[len]; - let a = i.split('.'); - - if (a[0] === 'options') { - if (a[1] === 'setOptionCallback') { - continue; - } - if (typeof NETDATA.localStorage.default[i] === 'undefined') { - continue; - } - if (NETDATA.options.current[i] === NETDATA.localStorage.default[i]) { - continue; - } - - NETDATA.setOption(a[1], NETDATA.localStorage.default[i]); - } else if (a[0] === 'chart_heights') { - if (typeof NETDATA.localStorage.callback[i] === 'function' && typeof NETDATA.localStorage.default[i] !== 'undefined') { - NETDATA.localStorage.callback[i](NETDATA.localStorage.default[i]); - } - } - } - - NETDATA.dateTime.init(NETDATA.options.current.timezone); -}; - -// *** src/dashboard.js/timeout.js - -// TODO: Better name needed - -NETDATA.timeout = { - // by default, these are just wrappers to setTimeout() / clearTimeout() - - step: function (callback) { - return window.setTimeout(callback, 1000 / 60); - }, - - set: function (callback, delay) { - return window.setTimeout(callback, delay); - }, - - clear: function (id) { - return window.clearTimeout(id); - }, - - init: function () { - let custom = true; - - if (window.requestAnimationFrame) { - this.step = function (callback) { - return window.requestAnimationFrame(callback); - }; - - this.clear = function (handle) { - return window.cancelAnimationFrame(handle.value); - }; - // } else if (window.webkitRequestAnimationFrame) { - // this.step = function (callback) { - // return window.webkitRequestAnimationFrame(callback); - // }; - - // if (window.webkitCancelAnimationFrame) { - // this.clear = function (handle) { - // return window.webkitCancelAnimationFrame(handle.value); - // }; - // } else if (window.webkitCancelRequestAnimationFrame) { - // this.clear = function (handle) { - // return window.webkitCancelRequestAnimationFrame(handle.value); - // }; - // } - // } else if (window.mozRequestAnimationFrame) { - // this.step = function (callback) { - // return window.mozRequestAnimationFrame(callback); - // }; - - // this.clear = function (handle) { - // return window.mozCancelRequestAnimationFrame(handle.value); - // }; - // } else if (window.oRequestAnimationFrame) { - // this.step = function (callback) { - // return window.oRequestAnimationFrame(callback); - // }; - - // this.clear = function (handle) { - // return window.oCancelRequestAnimationFrame(handle.value); - // }; - // } else if (window.msRequestAnimationFrame) { - // this.step = function (callback) { - // return window.msRequestAnimationFrame(callback); - // }; - - // this.clear = function (handle) { - // return window.msCancelRequestAnimationFrame(handle.value); - // }; - } else { - custom = false; - } - - if (custom) { - // we have installed custom .step() / .clear() functions - // overwrite the .set() too - - this.set = function (callback, delay) { - let start = Date.now(), - handle = new Object(); - - const loop = () => { - let current = Date.now(), - delta = current - start; - - if (delta >= delay) { - callback.call(); - } else { - handle.value = this.step(loop); - } - } - - handle.value = this.step(loop); - return handle; - }; - } - } -}; - -NETDATA.timeout.init(); -// Codacy declarations -/* global netdataTheme */ - -NETDATA.themes = { - white: { - bootstrap_css: NETDATA.serverStatic + 'css/bootstrap-3.3.7.css', - dashboard_css: NETDATA.serverStatic + 'dashboard.css?v20190902-0', - background: '#FFFFFF', - foreground: '#000000', - grid: '#F0F0F0', - axis: '#F0F0F0', - highlight: '#F5F5F5', - colors: ['#3366CC', '#DC3912', '#109618', '#FF9900', '#990099', '#DD4477', - '#3B3EAC', '#66AA00', '#0099C6', '#B82E2E', '#AAAA11', '#5574A6', - '#994499', '#22AA99', '#6633CC', '#E67300', '#316395', '#8B0707', - '#329262', '#3B3EAC'], - easypiechart_track: '#f0f0f0', - easypiechart_scale: '#dfe0e0', - gauge_pointer: '#C0C0C0', - gauge_stroke: '#F0F0F0', - gauge_gradient: false, - d3pie: { - title: '#333333', - subtitle: '#666666', - footer: '#888888', - other: '#aaaaaa', - mainlabel: '#333333', - percentage: '#dddddd', - value: '#aaaa22', - tooltip_bg: '#000000', - tooltip_fg: '#efefef', - segment_stroke: "#ffffff", - gradient_color: '#000000' - } - }, - slate: { - bootstrap_css: NETDATA.serverStatic + 'css/bootstrap-slate-flat-3.3.7.css?v20161229-1', - dashboard_css: NETDATA.serverStatic + 'dashboard.slate.css?v20190902-0', - background: '#272b30', - foreground: '#C8C8C8', - grid: '#283236', - axis: '#283236', - highlight: '#383838', - /* colors: [ '#55bb33', '#ff2222', '#0099C6', '#faa11b', '#adbce0', '#DDDD00', - '#4178ba', '#f58122', '#a5cc39', '#f58667', '#f5ef89', '#cf93c0', - '#a5d18a', '#b8539d', '#3954a3', '#c8a9cf', '#c7de8a', '#fad20a', - '#a6a479', '#a66da8' ], - */ - colors: ['#66AA00', '#FE3912', '#3366CC', '#D66300', '#0099C6', '#DDDD00', - '#5054e6', '#EE9911', '#BB44CC', '#e45757', '#ef0aef', '#CC7700', - '#22AA99', '#109618', '#905bfd', '#f54882', '#4381bf', '#ff3737', - '#329262', '#3B3EFF'], - easypiechart_track: '#373b40', - easypiechart_scale: '#373b40', - gauge_pointer: '#474b50', - gauge_stroke: '#373b40', - gauge_gradient: false, - d3pie: { - title: '#C8C8C8', - subtitle: '#283236', - footer: '#283236', - other: '#283236', - mainlabel: '#C8C8C8', - percentage: '#dddddd', - value: '#cccc44', - tooltip_bg: '#272b30', - tooltip_fg: '#C8C8C8', - segment_stroke: "#283236", - gradient_color: '#000000' - } - } -}; - -if (typeof netdataTheme !== 'undefined' && typeof NETDATA.themes[netdataTheme] !== 'undefined') { - NETDATA.themes.current = NETDATA.themes[netdataTheme]; -} else { - NETDATA.themes.current = NETDATA.themes.white; -} - -NETDATA.colors = NETDATA.themes.current.colors; - -// these are the colors Google Charts are using -// we have them here to attempt emulate their look and feel on the other chart libraries -// http://there4.io/2012/05/02/google-chart-color-list/ -//NETDATA.colors = [ '#3366CC', '#DC3912', '#FF9900', '#109618', '#990099', '#3B3EAC', '#0099C6', -// '#DD4477', '#66AA00', '#B82E2E', '#316395', '#994499', '#22AA99', '#AAAA11', -// '#6633CC', '#E67300', '#8B0707', '#329262', '#5574A6', '#3B3EAC' ]; - -// an alternative set -// http://www.mulinblog.com/a-color-palette-optimized-for-data-visualization/ -// (blue) (red) (orange) (green) (pink) (brown) (purple) (yellow) (gray) -//NETDATA.colors = [ '#5DA5DA', '#F15854', '#FAA43A', '#60BD68', '#F17CB0', '#B2912F', '#B276B2', '#DECF3F', '#4D4D4D' ]; -// dygraph - -// Codacy declarations -/* global smoothPlotter */ -/* global Dygraph */ - -NETDATA.dygraph = { - smooth: false -}; - -NETDATA.dygraphToolboxPanAndZoom = function (state, after, before) { - if (after < state.netdata_first) { - after = state.netdata_first; - } - - if (before > state.netdata_last) { - before = state.netdata_last; - } - - state.setMode('zoom'); - NETDATA.globalSelectionSync.stop(); - NETDATA.globalSelectionSync.delay(); - state.tmp.dygraph_user_action = true; - state.tmp.dygraph_force_zoom = true; - // state.log('toolboxPanAndZoom'); - state.updateChartPanOrZoom(after, before); - NETDATA.globalPanAndZoom.setMaster(state, after, before); -}; - -NETDATA.dygraphSetSelection = function (state, t) { - if (typeof state.tmp.dygraph_instance !== 'undefined') { - let r = state.calculateRowForTime(t); - if (r !== -1) { - state.tmp.dygraph_instance.setSelection(r); - return true; - } else { - state.tmp.dygraph_instance.clearSelection(); - state.legendShowUndefined(); - } - } - - return false; -}; - -NETDATA.dygraphClearSelection = function (state) { - if (typeof state.tmp.dygraph_instance !== 'undefined') { - state.tmp.dygraph_instance.clearSelection(); - } - return true; -}; - -NETDATA.dygraphSmoothInitialize = function (callback) { - $.ajax({ - url: NETDATA.dygraph_smooth_js, - cache: true, - dataType: "script", - xhrFields: {withCredentials: true} // required for the cookie - }) - .done(function () { - NETDATA.dygraph.smooth = true; - smoothPlotter.smoothing = 0.3; - }) - .fail(function () { - NETDATA.dygraph.smooth = false; - }) - .always(function () { - if (typeof callback === "function") { - return callback(); - } - }); -}; - -NETDATA.dygraphInitialize = function (callback) { - if (typeof netdataNoDygraphs === 'undefined' || !netdataNoDygraphs) { - $.ajax({ - url: NETDATA.dygraph_js, - cache: true, - dataType: "script", - xhrFields: {withCredentials: true} // required for the cookie - }) - .done(function () { - NETDATA.registerChartLibrary('dygraph', NETDATA.dygraph_js); - }) - .fail(function () { - NETDATA.chartLibraries.dygraph.enabled = false; - NETDATA.error(100, NETDATA.dygraph_js); - }) - .always(function () { - if (NETDATA.chartLibraries.dygraph.enabled && NETDATA.options.current.smooth_plot) { - NETDATA.dygraphSmoothInitialize(callback); - } else if (typeof callback === "function") { - return callback(); - } - }); - } else { - NETDATA.chartLibraries.dygraph.enabled = false; - if (typeof callback === "function") { - return callback(); - } - } -}; - -NETDATA.dygraphChartUpdate = function (state, data) { - let dygraph = state.tmp.dygraph_instance; - - if (typeof dygraph === 'undefined') { - return NETDATA.dygraphChartCreate(state, data); - } - - // when the chart is not visible, and hidden - // if there is a window resize, dygraph detects - // its element size as 0x0. - // this will make it re-appear properly - - if (state.tm.last_unhidden > state.tmp.dygraph_last_rendered) { - dygraph.resize(); - } - - let options = { - file: data.result.data, - colors: state.chartColors(), - labels: data.result.labels, - //labelsDivWidth: state.chartWidth() - 70, - includeZero: state.tmp.dygraph_include_zero, - visibility: state.dimensions_visibility.selected2BooleanArray(state.data.dimension_names) - }; - - if (state.tmp.dygraph_chart_type === 'stacked') { - if (options.includeZero && state.dimensions_visibility.countSelected() < options.visibility.length) { - options.includeZero = 0; - } - } - - if (!NETDATA.chartLibraries.dygraph.isSparkline(state)) { - options.ylabel = state.units_current; // (state.units_desired === 'auto')?"":state.units_current; - } - - if (state.tmp.dygraph_force_zoom) { - if (NETDATA.options.debug.dygraph || state.debug) { - state.log('dygraphChartUpdate() forced zoom update'); - } - - options.dateWindow = (state.requested_padding !== null) ? [state.view_after, state.view_before] : null; - //options.isZoomedIgnoreProgrammaticZoom = true; - state.tmp.dygraph_force_zoom = false; - } else if (state.current.name !== 'auto') { - if (NETDATA.options.debug.dygraph || state.debug) { - state.log('dygraphChartUpdate() loose update'); - } - } else { - if (NETDATA.options.debug.dygraph || state.debug) { - state.log('dygraphChartUpdate() strict update'); - } - - options.dateWindow = (state.requested_padding !== null) ? [state.view_after, state.view_before] : null; - //options.isZoomedIgnoreProgrammaticZoom = true; - } - - options.valueRange = state.tmp.dygraph_options.valueRange; - - let oldMax = null, oldMin = null; - if (state.tmp.__commonMin !== null) { - state.data.min = state.tmp.dygraph_instance.axes_[0].extremeRange[0]; - oldMin = options.valueRange[0] = NETDATA.commonMin.get(state); - } - if (state.tmp.__commonMax !== null) { - state.data.max = state.tmp.dygraph_instance.axes_[0].extremeRange[1]; - oldMax = options.valueRange[1] = NETDATA.commonMax.get(state); - } - - if (state.tmp.dygraph_smooth_eligible) { - if ((NETDATA.options.current.smooth_plot && state.tmp.dygraph_options.plotter !== smoothPlotter) - || (NETDATA.options.current.smooth_plot === false && state.tmp.dygraph_options.plotter === smoothPlotter)) { - NETDATA.dygraphChartCreate(state, data); - return; - } - } - - if (netdataSnapshotData !== null && NETDATA.globalPanAndZoom.isActive() && NETDATA.globalPanAndZoom.isMaster(state) === false) { - // pan and zoom on snapshots - options.dateWindow = [NETDATA.globalPanAndZoom.force_after_ms, NETDATA.globalPanAndZoom.force_before_ms]; - //options.isZoomedIgnoreProgrammaticZoom = true; - } - - if (NETDATA.chartLibraries.dygraph.isLogScale(state)) { - if (Array.isArray(options.valueRange) && options.valueRange[0] <= 0) { - options.valueRange[0] = null; - } - } - - dygraph.updateOptions(options); - - let redraw = false; - if (oldMin !== null && oldMin > state.tmp.dygraph_instance.axes_[0].extremeRange[0]) { - state.data.min = state.tmp.dygraph_instance.axes_[0].extremeRange[0]; - options.valueRange[0] = NETDATA.commonMin.get(state); - redraw = true; - } - if (oldMax !== null && oldMax < state.tmp.dygraph_instance.axes_[0].extremeRange[1]) { - state.data.max = state.tmp.dygraph_instance.axes_[0].extremeRange[1]; - options.valueRange[1] = NETDATA.commonMax.get(state); - redraw = true; - } - - if (redraw) { - // state.log('forcing redraw to adapt to common- min/max'); - dygraph.updateOptions(options); - } - - state.tmp.dygraph_last_rendered = Date.now(); - return true; -}; - -NETDATA.dygraphChartCreate = function (state, data) { - if (NETDATA.options.debug.dygraph || state.debug) { - state.log('dygraphChartCreate()'); - } - - state.tmp.dygraph_chart_type = NETDATA.dataAttribute(state.element, 'dygraph-type', state.chart.chart_type); - if (state.tmp.dygraph_chart_type === 'stacked' && data.dimensions === 1) { - state.tmp.dygraph_chart_type = 'area'; - } - if (state.tmp.dygraph_chart_type === 'stacked' && NETDATA.chartLibraries.dygraph.isLogScale(state)) { - state.tmp.dygraph_chart_type = 'area'; - } - - let highlightCircleSize = NETDATA.chartLibraries.dygraph.isSparkline(state) ? 3 : 4; - - let smooth = NETDATA.dygraph.smooth - ? (NETDATA.dataAttributeBoolean(state.element, 'dygraph-smooth', (state.tmp.dygraph_chart_type === 'line' && NETDATA.chartLibraries.dygraph.isSparkline(state) === false))) - : false; - - state.tmp.dygraph_include_zero = NETDATA.dataAttribute(state.element, 'dygraph-includezero', (state.tmp.dygraph_chart_type === 'stacked')); - let drawAxis = NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawaxis', true); - - state.tmp.dygraph_options = { - colors: NETDATA.dataAttribute(state.element, 'dygraph-colors', state.chartColors()), - - // leave a few pixels empty on the right of the chart - rightGap: NETDATA.dataAttribute(state.element, 'dygraph-rightgap', 5), - showRangeSelector: NETDATA.dataAttributeBoolean(state.element, 'dygraph-showrangeselector', false), - showRoller: NETDATA.dataAttributeBoolean(state.element, 'dygraph-showroller', false), - title: NETDATA.dataAttribute(state.element, 'dygraph-title', state.title), - titleHeight: NETDATA.dataAttribute(state.element, 'dygraph-titleheight', 19), - legend: NETDATA.dataAttribute(state.element, 'dygraph-legend', 'always'), // we need this to get selection events - labels: data.result.labels, - labelsDiv: NETDATA.dataAttribute(state.element, 'dygraph-labelsdiv', state.element_legend_childs.hidden), - //labelsDivStyles: NETDATA.dataAttribute(state.element, 'dygraph-labelsdivstyles', { 'fontSize':'1px' }), - //labelsDivWidth: NETDATA.dataAttribute(state.element, 'dygraph-labelsdivwidth', state.chartWidth() - 70), - labelsSeparateLines: NETDATA.dataAttributeBoolean(state.element, 'dygraph-labelsseparatelines', true), - labelsShowZeroValues: NETDATA.chartLibraries.dygraph.isLogScale(state) ? false : NETDATA.dataAttributeBoolean(state.element, 'dygraph-labelsshowzerovalues', true), - labelsKMB: false, - labelsKMG2: false, - showLabelsOnHighlight: NETDATA.dataAttributeBoolean(state.element, 'dygraph-showlabelsonhighlight', true), - hideOverlayOnMouseOut: NETDATA.dataAttributeBoolean(state.element, 'dygraph-hideoverlayonmouseout', true), - includeZero: state.tmp.dygraph_include_zero, - xRangePad: NETDATA.dataAttribute(state.element, 'dygraph-xrangepad', 0), - yRangePad: NETDATA.dataAttribute(state.element, 'dygraph-yrangepad', 1), - valueRange: NETDATA.dataAttribute(state.element, 'dygraph-valuerange', [null, null]), - ylabel: state.units_current, // (state.units_desired === 'auto')?"":state.units_current, - yLabelWidth: NETDATA.dataAttribute(state.element, 'dygraph-ylabelwidth', 12), - - // the function to plot the chart - plotter: null, - - // The width of the lines connecting data points. - // This can be used to increase the contrast or some graphs. - strokeWidth: NETDATA.dataAttribute(state.element, 'dygraph-strokewidth', ((state.tmp.dygraph_chart_type === 'stacked') ? 0.1 : ((smooth === true) ? 1.5 : 0.7))), - strokePattern: NETDATA.dataAttribute(state.element, 'dygraph-strokepattern', undefined), - - // The size of the dot to draw on each point in pixels (see drawPoints). - // A dot is always drawn when a point is "isolated", - // i.e. there is a missing point on either side of it. - // This also controls the size of those dots. - drawPoints: NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawpoints', false), - - // Draw points at the edges of gaps in the data. - // This improves visibility of small data segments or other data irregularities. - drawGapEdgePoints: NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawgapedgepoints', true), - connectSeparatedPoints: NETDATA.chartLibraries.dygraph.isLogScale(state) ? false : NETDATA.dataAttributeBoolean(state.element, 'dygraph-connectseparatedpoints', false), - pointSize: NETDATA.dataAttribute(state.element, 'dygraph-pointsize', 1), - - // enabling this makes the chart with little square lines - stepPlot: NETDATA.dataAttributeBoolean(state.element, 'dygraph-stepplot', false), - - // Draw a border around graph lines to make crossing lines more easily - // distinguishable. Useful for graphs with many lines. - strokeBorderColor: NETDATA.dataAttribute(state.element, 'dygraph-strokebordercolor', NETDATA.themes.current.background), - strokeBorderWidth: NETDATA.dataAttribute(state.element, 'dygraph-strokeborderwidth', (state.tmp.dygraph_chart_type === 'stacked') ? 0.0 : 0.0), - fillGraph: NETDATA.dataAttribute(state.element, 'dygraph-fillgraph', (state.tmp.dygraph_chart_type === 'area' || state.tmp.dygraph_chart_type === 'stacked')), - fillAlpha: NETDATA.dataAttribute(state.element, 'dygraph-fillalpha', - ((state.tmp.dygraph_chart_type === 'stacked') - ? NETDATA.options.current.color_fill_opacity_stacked - : NETDATA.options.current.color_fill_opacity_area) - ), - stackedGraph: NETDATA.dataAttribute(state.element, 'dygraph-stackedgraph', (state.tmp.dygraph_chart_type === 'stacked')), - stackedGraphNaNFill: NETDATA.dataAttribute(state.element, 'dygraph-stackedgraphnanfill', 'none'), - drawAxis: drawAxis, - axisLabelFontSize: NETDATA.dataAttribute(state.element, 'dygraph-axislabelfontsize', 10), - axisLineColor: NETDATA.dataAttribute(state.element, 'dygraph-axislinecolor', NETDATA.themes.current.axis), - axisLineWidth: NETDATA.dataAttribute(state.element, 'dygraph-axislinewidth', 1.0), - drawGrid: NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawgrid', true), - gridLinePattern: NETDATA.dataAttribute(state.element, 'dygraph-gridlinepattern', null), - gridLineWidth: NETDATA.dataAttribute(state.element, 'dygraph-gridlinewidth', 1.0), - gridLineColor: NETDATA.dataAttribute(state.element, 'dygraph-gridlinecolor', NETDATA.themes.current.grid), - maxNumberWidth: NETDATA.dataAttribute(state.element, 'dygraph-maxnumberwidth', 8), - sigFigs: NETDATA.dataAttribute(state.element, 'dygraph-sigfigs', null), - digitsAfterDecimal: NETDATA.dataAttribute(state.element, 'dygraph-digitsafterdecimal', 2), - valueFormatter: NETDATA.dataAttribute(state.element, 'dygraph-valueformatter', undefined), - highlightCircleSize: NETDATA.dataAttribute(state.element, 'dygraph-highlightcirclesize', highlightCircleSize), - highlightSeriesOpts: NETDATA.dataAttribute(state.element, 'dygraph-highlightseriesopts', null), // TOO SLOW: { strokeWidth: 1.5 }, - highlightSeriesBackgroundAlpha: NETDATA.dataAttribute(state.element, 'dygraph-highlightseriesbackgroundalpha', null), // TOO SLOW: (state.tmp.dygraph_chart_type === 'stacked')?0.7:0.5, - pointClickCallback: NETDATA.dataAttribute(state.element, 'dygraph-pointclickcallback', undefined), - visibility: state.dimensions_visibility.selected2BooleanArray(state.data.dimension_names), - logscale: NETDATA.chartLibraries.dygraph.isLogScale(state) ? 'y' : undefined, - - // Expects a string in the format ":
You must enable JavaScript in order to use Netdata!
You can do this in your browser settings.
Filename
Hostname
Origin URL
Charts Info
Snapshot Info
Time Range
Comments

\ No newline at end of file diff --git a/luci-app-netdata/web/main.js b/luci-app-netdata/web/main.js deleted file mode 100644 index 8ecc86995..000000000 --- a/luci-app-netdata/web/main.js +++ /dev/null @@ -1,5159 +0,0 @@ -// Main JavaScript file for the Netdata GUI. -// 翻译 By Jason -// Codacy declarations -/* global NETDATA */ - -// netdata snapshot data -var netdataSnapshotData = null; - -// enable alarms checking and notifications -var netdataShowAlarms = true; - -// enable registry updates -var netdataRegistry = true; - -// forward definition only - not used here -var netdataServer = undefined; -var netdataServerStatic = undefined; -var netdataCheckXSS = undefined; - -// control the welcome modal and analytics -var this_is_demo = null; - -function escapeUserInputHTML(s) { - return s.toString() - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/#/g, '#') - .replace(/'/g, ''') - .replace(/\(/g, '(') - .replace(/\)/g, ')') - .replace(/\//g, '/'); -} - -function verifyURL(s) { - if (typeof (s) === 'string' && (s.startsWith('http://') || s.startsWith('https://'))) { - return s - .replace(/'/g, '%22') - .replace(/"/g, '%27') - .replace(/\)/g, '%28') - .replace(/\(/g, '%29'); - } - - console.log('invalid URL detected:'); - console.log(s); - return 'javascript:alert("invalid url");'; -} - -// -------------------------------------------------------------------- -// urlOptions - -var urlOptions = { - hash: '#', - theme: null, - help: null, - mode: 'live', // 'live', 'print' - update_always: false, - pan_and_zoom: false, - server: null, - after: 0, - before: 0, - highlight: false, - highlight_after: 0, - highlight_before: 0, - nowelcome: false, - show_alarms: false, - chart: null, - family: null, - alarm: null, - alarm_unique_id: 0, - alarm_id: 0, - alarm_event_id: 0, - alarm_when: 0, - - hasProperty: function (property) { - // console.log('checking property ' + property + ' of type ' + typeof(this[property])); - return typeof this[property] !== 'undefined'; - }, - - genHash: function (forReload) { - var hash = urlOptions.hash; - - if (urlOptions.pan_and_zoom === true) { - hash += ';after=' + urlOptions.after.toString() + - ';before=' + urlOptions.before.toString(); - } - - if (urlOptions.highlight === true) { - hash += ';highlight_after=' + urlOptions.highlight_after.toString() + - ';highlight_before=' + urlOptions.highlight_before.toString(); - } - - if (urlOptions.theme !== null) { - hash += ';theme=' + urlOptions.theme.toString(); - } - - if (urlOptions.help !== null) { - hash += ';help=' + urlOptions.help.toString(); - } - - if (urlOptions.update_always === true) { - hash += ';update_always=true'; - } - - if (forReload === true && urlOptions.server !== null) { - hash += ';server=' + urlOptions.server.toString(); - } - - if (urlOptions.mode !== 'live') { - hash += ';mode=' + urlOptions.mode; - } - - return hash; - }, - - parseHash: function () { - var variables = document.location.hash.split(';'); - var len = variables.length; - while (len--) { - if (len !== 0) { - var p = variables[len].split('='); - if (urlOptions.hasProperty(p[0]) && typeof p[1] !== 'undefined') { - urlOptions[p[0]] = decodeURIComponent(p[1]); - } - } else { - if (variables[len].length > 0) { - urlOptions.hash = variables[len]; - } - } - } - - var booleans = ['nowelcome', 'show_alarms', 'update_always']; - len = booleans.length; - while (len--) { - if (urlOptions[booleans[len]] === 'true' || urlOptions[booleans[len]] === true || urlOptions[booleans[len]] === '1' || urlOptions[booleans[len]] === 1) { - urlOptions[booleans[len]] = true; - } else { - urlOptions[booleans[len]] = false; - } - } - - var numeric = ['after', 'before', 'highlight_after', 'highlight_before', 'alarm_when']; - len = numeric.length; - while (len--) { - if (typeof urlOptions[numeric[len]] === 'string') { - try { - urlOptions[numeric[len]] = parseInt(urlOptions[numeric[len]]); - } - catch (e) { - console.log('failed to parse URL hash parameter ' + numeric[len]); - urlOptions[numeric[len]] = 0; - } - } - } - - if (urlOptions.alarm_when) { - // if alarm_when exists, create after/before params - // -/+ 2 minutes from the alarm, and reload the page - const alarmTime = new Date(urlOptions.alarm_when * 1000).valueOf(); - const timeMarginMs = 120000; // 2 mins - - const after = alarmTime - timeMarginMs; - const before = alarmTime + timeMarginMs; - const newHash = document.location.hash.replace( - /;alarm_when=[0-9]*/i, - ";after=" + after + ";before=" + before, - ); - history.replaceState(null, '', newHash); - location.reload(); - } - - if (urlOptions.server !== null && urlOptions.server !== '') { - netdataServerStatic = document.location.origin.toString() + document.location.pathname.toString(); - netdataServer = urlOptions.server; - netdataCheckXSS = true; - } else { - urlOptions.server = null; - } - - if (urlOptions.before > 0 && urlOptions.after > 0) { - urlOptions.pan_and_zoom = true; - urlOptions.nowelcome = true; - } else { - urlOptions.pan_and_zoom = false; - } - - if (urlOptions.highlight_before > 0 && urlOptions.highlight_after > 0) { - urlOptions.highlight = true; - } else { - urlOptions.highlight = false; - } - - switch (urlOptions.mode) { - case 'print': - urlOptions.theme = 'white'; - urlOptions.welcome = false; - urlOptions.help = false; - urlOptions.show_alarms = false; - - if (urlOptions.pan_and_zoom === false) { - urlOptions.pan_and_zoom = true; - urlOptions.before = Date.now(); - urlOptions.after = urlOptions.before - 600000; - } - - netdataShowAlarms = false; - netdataRegistry = false; - this_is_demo = false; - break; - - case 'live': - default: - urlOptions.mode = 'live'; - break; - } - - // console.log(urlOptions); - }, - - hashUpdate: function () { - history.replaceState(null, '', urlOptions.genHash(true)); - }, - - netdataPanAndZoomCallback: function (status, after, before) { - //console.log(1); - //console.log(new Error().stack); - - if (netdataSnapshotData === null) { - urlOptions.pan_and_zoom = status; - urlOptions.after = after; - urlOptions.before = before; - urlOptions.hashUpdate(); - } - }, - - netdataHighlightCallback: function (status, after, before) { - //console.log(2); - //console.log(new Error().stack); - - if (status === true && (after === null || before === null || after <= 0 || before <= 0 || after >= before)) { - status = false; - after = 0; - before = 0; - } - - if (netdataSnapshotData === null) { - urlOptions.highlight = status; - } else { - urlOptions.highlight = false; - } - - urlOptions.highlight_after = Math.round(after); - urlOptions.highlight_before = Math.round(before); - urlOptions.hashUpdate(); - - var show_eye = NETDATA.globalChartUnderlay.hasViewport(); - - if (status === true && after > 0 && before > 0 && after < before) { - var d1 = NETDATA.dateTime.localeDateString(after); - var d2 = NETDATA.dateTime.localeDateString(before); - if (d1 === d2) { - d2 = ''; - } - document.getElementById('navbar-highlight-content').innerHTML = - ((show_eye === true) ? '' : '').toString() - + 'highlighted time-frame' - + ' ' + d1 + ' ' + NETDATA.dateTime.localeTimeString(after) + ' to ' - + ' ' + d2 + ' ' + NETDATA.dateTime.localeTimeString(before) + ', ' - + 'duration ' + NETDATA.seconds4human(Math.round((before - after) / 1000)) + '' - + '' - + ''; - - $('.navbar-highlight').show(); - - $('.highlight-tooltip').tooltip({ - html: true, - delay: { show: 500, hide: 0 }, - container: 'body' - }); - } else { - $('.navbar-highlight').hide(); - } - }, - - clearHighlight: function () { - NETDATA.globalChartUnderlay.clear(); - - if (NETDATA.globalPanAndZoom.isActive() === true) { - NETDATA.globalPanAndZoom.clearMaster(); - } - }, - - showHighlight: function () { - NETDATA.globalChartUnderlay.focus(); - } -}; - -urlOptions.parseHash(); - -// -------------------------------------------------------------------- -// check options that should be processed before loading netdata.js - -var localStorageTested = -1; - -function localStorageTest() { - if (localStorageTested !== -1) { - return localStorageTested; - } - - if (typeof Storage !== "undefined" && typeof localStorage === 'object') { - var test = 'test'; - try { - localStorage.setItem(test, test); - localStorage.removeItem(test); - localStorageTested = true; - } - catch (e) { - console.log(e); - localStorageTested = false; - } - } else { - localStorageTested = false; - } - - return localStorageTested; -} - -function loadLocalStorage(name) { - var ret = null; - - try { - if (localStorageTest() === true) { - ret = localStorage.getItem(name); - } else { - console.log('localStorage is not available'); - } - } - catch (error) { - console.log(error); - return null; - } - - if (typeof ret === 'undefined' || ret === null) { - return null; - } - - // console.log('loaded: ' + name.toString() + ' = ' + ret.toString()); - - return ret; -} - -function saveLocalStorage(name, value) { - // console.log('saving: ' + name.toString() + ' = ' + value.toString()); - try { - if (localStorageTest() === true) { - localStorage.setItem(name, value.toString()); - return true; - } - } - catch (error) { - console.log(error); - } - - return false; -} - -function getTheme(def) { - if (urlOptions.mode === 'print') { - return 'white'; - } - - var ret = loadLocalStorage('netdataTheme'); - if (typeof ret === 'undefined' || ret === null || ret === 'undefined') { - return def; - } else { - return ret; - } -} - -function setTheme(theme) { - if (urlOptions.mode === 'print') { - return false; - } - - if (theme === netdataTheme) { - return false; - } - return saveLocalStorage('netdataTheme', theme); -} - -var netdataTheme = getTheme('slate'); -var netdataShowHelp = true; - -if (urlOptions.theme !== null) { - setTheme(urlOptions.theme); - netdataTheme = urlOptions.theme; -} else { - urlOptions.theme = netdataTheme; -} - -if (urlOptions.help !== null) { - saveLocalStorage('options.show_help', urlOptions.help); - netdataShowHelp = urlOptions.help; -} else { - urlOptions.help = loadLocalStorage('options.show_help'); -} - -// -------------------------------------------------------------------- -// natural sorting -// http://www.davekoelle.com/files/alphanum.js - LGPL - -function naturalSortChunkify(t) { - var tz = []; - var x = 0, y = -1, n = 0, i, j; - - while (i = (j = t.charAt(x++)).charCodeAt(0)) { - var m = (i >= 48 && i <= 57); - if (m !== n) { - tz[++y] = ""; - n = m; - } - tz[y] += j; - } - - return tz; -} - -function naturalSortCompare(a, b) { - var aa = naturalSortChunkify(a.toLowerCase()); - var bb = naturalSortChunkify(b.toLowerCase()); - - for (var x = 0; aa[x] && bb[x]; x++) { - if (aa[x] !== bb[x]) { - var c = Number(aa[x]), d = Number(bb[x]); - if (c.toString() === aa[x] && d.toString() === bb[x]) { - return c - d; - } else { - return (aa[x] > bb[x]) ? 1 : -1; - } - } - } - - return aa.length - bb.length; -} - -// -------------------------------------------------------------------- -// saving files to client - -function saveTextToClient(data, filename) { - var blob = new Blob([data], { - type: 'application/octet-stream' - }); - - var url = URL.createObjectURL(blob); - var link = document.createElement('a'); - link.setAttribute('href', url); - link.setAttribute('download', filename); - - var el = document.getElementById('hiddenDownloadLinks'); - el.innerHTML = ''; - el.appendChild(link); - - setTimeout(function () { - el.removeChild(link); - URL.revokeObjectURL(url); - }, 60); - - link.click(); -} - -function saveObjectToClient(data, filename) { - saveTextToClient(JSON.stringify(data), filename); -} - -// ----------------------------------------------------------------------------- -// registry call back to render my-netdata menu - -function toggleExpandIcon(svgEl) { - if (svgEl.getAttribute('data-icon') === 'caret-down') { - svgEl.setAttribute('data-icon', 'caret-up'); - } else { - svgEl.setAttribute('data-icon', 'caret-down'); - } -} - -function toggleAgentItem(e, guid) { - e.stopPropagation(); - e.preventDefault(); - - toggleExpandIcon(e.currentTarget.children[0]); - - const el = document.querySelector(`.agent-alternate-urls.agent-${guid}`); - if (el) { - el.classList.toggle('collapsed'); - } -} - -// When you stream metrics from netdata to netdata, the receiving netdata now -// has multiple host databases. It's own, and multiple mirrored. Mirrored databases -// can be accessed with -const OLD_DASHBOARD_SUFFIX = "old" -let isOldSuffix = true -try { - const currentScriptMainJs = document.currentScript; - const mainJsSrc = currentScriptMainJs.getAttribute("src") - isOldSuffix = mainJsSrc.startsWith("../main.js") -} catch { - console.warn("current script not detecting, assuming the dashboard is running with /old suffix") -} - -function transformWithOldSuffix(url) { - return isOldSuffix ? `../${url}` : url -} - -function renderStreamedHosts(options) { - let html = `
Databases streamed to this agent
`; - - var base = document.location.origin.toString() + - document.location.pathname.toString() - .replace(isOldSuffix ? `/${OLD_DASHBOARD_SUFFIX}` : "", ""); - if (base.endsWith("/host/" + options.hostname + "/")) { - base = base.substring(0, base.length - ("/host/" + options.hostname + "/").toString().length); - } - - if (base.endsWith("/")) { - base = base.substring(0, base.length - 1); - } - - var master = options.hosts[0].hostname; - // We sort a clone of options.hosts, to keep the master as the first element - // for future calls. - var sorted = options.hosts.slice(0).sort(function (a, b) { - if (a.hostname === master) { - return -1; - } - return naturalSortCompare(a.hostname, b.hostname); - }); - - let displayedDatabases = false; - - for (var s of sorted) { - let url, icon; - const hostname = s.hostname; - - if (myNetdataMenuFilterValue !== "") { - if (!hostname.includes(myNetdataMenuFilterValue)) { - continue; - } - } - - displayedDatabases = true; - - if (hostname === master) { - url = isOldSuffix ? `${base}/${OLD_DASHBOARD_SUFFIX}/` : `${base}/`; - icon = 'home'; - } else { - url = isOldSuffix ? `${base}/host/${hostname}/${OLD_DASHBOARD_SUFFIX}/` : `${base}/host/${hostname}/`; - icon = 'window-restore'; - } - - html += ( - `
- - - - - ${hostname} - -
-
` - ) - } - - if (!displayedDatabases) { - html += ( - `
- - no databases match the filter criteria. -
` - ) - } - - return html; -} - -function renderMachines(machinesArray) { - let html = `
My nodes
`; - - if (machinesArray === null) { - let ret = loadLocalStorage("registryCallback"); - if (ret) { - machinesArray = JSON.parse(ret); - console.log("failed to contact the registry - loaded registry data from browser local storage"); - } - } - - let found = false; - let displayedAgents = false; - - const maskedURL = NETDATA.registry.MASKED_DATA; - - if (machinesArray) { - saveLocalStorage("registryCallback", JSON.stringify(machinesArray)); - - var machines = machinesArray.sort(function (a, b) { - return naturalSortCompare(a.name, b.name); - }); - - for (var machine of machines) { - found = true; - - if (myNetdataMenuFilterValue !== "") { - if (!machine.name.includes(myNetdataMenuFilterValue)) { - continue; - } - } - - displayedAgents = true; - - const alternateUrlItems = ( - `` - ) - - html += ( - ` - ${alternateUrlItems}` - ) - } - - if (found && (!displayedAgents)) { - html += ( - `
- - zero nodes are matching the filter value. -
` - ) - } - } - - if (!found) { - if (machines) { - html += ( - `` - ) - } else { - html += ( - `` - ) - } - - html += `
`; - html += `
Demo netdata nodes
`; - - const demoServers = [ - { url: "//london.netdata.rocks/default.html", title: "UK - London (DigitalOcean.com)" }, - { url: "//newyork.netdata.rocks/default.html", title: "US - New York (DigitalOcean.com)" }, - { url: "//sanfrancisco.netdata.rocks/default.html", title: "US - San Francisco (DigitalOcean.com)" }, - { url: "//atlanta.netdata.rocks/default.html", title: "US - Atlanta (CDN77.com)" }, - { url: "//frankfurt.netdata.rocks/default.html", title: "Germany - Frankfurt (DigitalOcean.com)" }, - { url: "//toronto.netdata.rocks/default.html", title: "Canada - Toronto (DigitalOcean.com)" }, - { url: "//singapore.netdata.rocks/default.html", title: "Japan - Singapore (DigitalOcean.com)" }, - { url: "//bangalore.netdata.rocks/default.html", title: "India - Bangalore (DigitalOcean.com)" }, - - ] - - for (var server of demoServers) { - html += ( - `
- - ${server.title} -
-
- ` - ); - } - } - - return html; -} - -function setMyNetdataMenu(html) { - const el = document.getElementById('my-netdata-dropdown-content') - el.innerHTML = html; -} - -function clearMyNetdataMenu() { - setMyNetdataMenu(`
- - Loading, please wait... -
-
`); -} - -function errorMyNetdataMenu() { - setMyNetdataMenu(`
- - Cannot load known Netdata agents from Netdata Cloud! Please make sure you have the latest version of Netdata. -
`); -} - -function restrictMyNetdataMenu() { - setMyNetdataMenu(`
- Please sign in to netdata.cloud to view your nodes! -
-
`); -} - -function openAuthenticatedUrl(url) { - if (isSignedIn()) { - window.open(url); - } else { - window.open(`${NETDATA.registry.cloudBaseURL}/account/sign-in-agent?id=${NETDATA.registry.machine_guid}&name=${encodeURIComponent(NETDATA.registry.hostname)}&origin=${encodeURIComponent(window.location.origin + "/")}&redirect_uri=${encodeURIComponent(window.location.origin + "/" + url)}`); - } -} - -function renderMyNetdataMenu(machinesArray) { - const el = document.getElementById('my-netdata-dropdown-content'); - el.classList.add(`theme-${netdataTheme}`); - - if (machinesArray == registryAgents) { - console.log("Rendering my-netdata menu from registry"); - } else { - console.log("Rendering my-netdata menu from netdata.cloud", machinesArray); - } - - let html = ''; - - if (!isSignedIn()) { - if (!NETDATA.registry.isRegistryEnabled()) { - html += ( - `` - ); - } - } - - if (isSignedIn()) { - html += ( - `
- - -
-
` - ); - } - - // options.hosts = [ - // { - // hostname: "streamed1", - // }, - // { - // hostname: "streamed2", - // }, - // ] - - if (options.hosts.length > 1) { - html += `
${renderStreamedHosts(options)}

`; - } - - if (isSignedIn() || NETDATA.registry.isRegistryEnabled()) { - html += `
${renderMachines(machinesArray)}

`; - } - - if (!isSignedIn()) { - html += ( - `
- - 更换标识 -
-
-
- - 这是什么? -
-
` - ) - } else { - html += ( - `
- - Nodes beta -
-
- -
- - What is this? -
-
` - ) - } - - el.innerHTML = html; - - gotoServerInit(); -} - -function isdemo() { - if (this_is_demo !== null) { - return this_is_demo; - } - this_is_demo = false; - - try { - if (typeof document.location.hostname === 'string') { - if (document.location.hostname.endsWith('.my-netdata.io') || - document.location.hostname.endsWith('.mynetdata.io') || - document.location.hostname.endsWith('.netdata.rocks') || - document.location.hostname.endsWith('.netdata.ai') || - document.location.hostname.endsWith('.netdata.live') || - document.location.hostname.endsWith('.firehol.org') || - document.location.hostname.endsWith('.netdata.online') || - document.location.hostname.endsWith('.netdata.cloud')) { - this_is_demo = true; - } - } - } - catch (error) { - } - return this_is_demo; -} - -function netdataURL(url, forReload) { - if (typeof url === 'undefined') - // url = document.location.toString(); - { - url = ''; - } - - if (url.indexOf('#') !== -1) { - url = url.substring(0, url.indexOf('#')); - } - - var hash = urlOptions.genHash(forReload); - - // console.log('netdataURL: ' + url + hash); - - return url + hash; -} - -function netdataReload(url) { - document.location = verifyURL(netdataURL(url, true)); - - // since we play with hash - // this is needed to reload the page - location.reload(); -} - -function gotoHostedModalHandler(url) { - document.location = verifyURL(url + urlOptions.genHash()); - return false; -} - -var gotoServerValidateRemaining = 0; -var gotoServerMiddleClick = false; -var gotoServerStop = false; - -function gotoServerValidateUrl(id, guid, url) { - var penalty = 0; - var error = 'failed'; - - if (document.location.toString().startsWith('http://') && url.toString().startsWith('https://')) - // we penalize https only if the current url is http - // to allow the user walk through all its servers. - { - penalty = 500; - } else if (document.location.toString().startsWith('https://') && url.toString().startsWith('http://')) { - error = 'can\'t check'; - } - - var finalURL = netdataURL(url); - - setTimeout(function () { - document.getElementById('gotoServerList').innerHTML += '' + escapeUserInputHTML(url) + 'checking...'; - - NETDATA.registry.hello(url, function (data) { - if (typeof data !== 'undefined' && data !== null && typeof data.machine_guid === 'string' && data.machine_guid === guid) { - // console.log('OK ' + id + ' URL: ' + url); - document.getElementById(guid + '-' + id + '-status').innerHTML = "OK"; - - if (!gotoServerStop) { - gotoServerStop = true; - - if (gotoServerMiddleClick) { - window.open(verifyURL(finalURL), '_blank'); - gotoServerMiddleClick = false; - document.getElementById('gotoServerResponse').innerHTML = 'Opening new window to ' + NETDATA.registry.machines[guid].name + '
' + escapeUserInputHTML(url) + '

(check your pop-up blocker if it fails)'; - } else { - document.getElementById('gotoServerResponse').innerHTML += 'found it! It is at:
' + escapeUserInputHTML(url) + ''; - document.location = verifyURL(finalURL); - $('#gotoServerModal').modal('hide'); - } - } - } else { - if (typeof data !== 'undefined' && data !== null && typeof data.machine_guid === 'string' && data.machine_guid !== guid) { - error = 'wrong machine'; - } - - document.getElementById(guid + '-' + id + '-status').innerHTML = error; - gotoServerValidateRemaining--; - if (gotoServerValidateRemaining <= 0) { - gotoServerMiddleClick = false; - document.getElementById('gotoServerResponse').innerHTML = 'Sorry! I cannot find any operational URL for this server'; - } - } - }); - }, (id * 50) + penalty); -} - -function gotoServerModalHandler(guid) { - // console.log('goto server: ' + guid); - - gotoServerStop = false; - var checked = {}; - var len = NETDATA.registry.machines[guid].alternate_urls.length; - var count = 0; - - document.getElementById('gotoServerResponse').innerHTML = ''; - document.getElementById('gotoServerList').innerHTML = ''; - document.getElementById('gotoServerName').innerHTML = NETDATA.registry.machines[guid].name; - $('#gotoServerModal').modal('show'); - - gotoServerValidateRemaining = len; - while (len--) { - var url = NETDATA.registry.machines[guid].alternate_urls[len]; - checked[url] = true; - gotoServerValidateUrl(count++, guid, url); - } - - if (!isSignedIn()) { - // When the registry is enabled, if the user's known URLs are not working - // we consult the registry to get additional URLs. - setTimeout(function () { - if (gotoServerStop === false) { - document.getElementById('gotoServerResponse').innerHTML = 'Added all the known URLs for this machine.'; - NETDATA.registry.search(guid, function (data) { - // console.log(data); - len = data.urls.length; - while (len--) { - var url = data.urls[len][1]; - // console.log(url); - if (typeof checked[url] === 'undefined') { - gotoServerValidateRemaining++; - checked[url] = true; - gotoServerValidateUrl(count++, guid, url); - } - } - }); - } - }, 2000); - } - - return false; -} - -function gotoServerInit() { - $(".registry_link").on('click', function (e) { - if (e.which === 2) { - e.preventDefault(); - gotoServerMiddleClick = true; - } else { - gotoServerMiddleClick = false; - } - - return true; - }); -} - -function switchRegistryModalHandler() { - document.getElementById('switchRegistryPersonGUID').value = NETDATA.registry.person_guid; - document.getElementById('switchRegistryURL').innerHTML = NETDATA.registry.server; - document.getElementById('switchRegistryResponse').innerHTML = ''; - $('#switchRegistryModal').modal('show'); -} - -function notifyForSwitchRegistry() { - var n = document.getElementById('switchRegistryPersonGUID').value; - - if (n !== '' && n.length === 36) { - NETDATA.registry.switch(n, function (result) { - if (result !== null) { - $('#switchRegistryModal').modal('hide'); - NETDATA.registry.init(); - } else { - document.getElementById('switchRegistryResponse').innerHTML = "Sorry! The registry rejected your request."; - } - }); - } else { - document.getElementById('switchRegistryResponse').innerHTML = "The ID you have entered is not a GUID."; - } -} - -var deleteRegistryGuid = null; -var deleteRegistryUrl = null; - -function deleteRegistryModalHandler(guid, name, url) { - // void (guid); - - deleteRegistryGuid = guid; - deleteRegistryUrl = url; - - document.getElementById('deleteRegistryServerName').innerHTML = name; - document.getElementById('deleteRegistryServerName2').innerHTML = name; - document.getElementById('deleteRegistryServerURL').innerHTML = url; - document.getElementById('deleteRegistryResponse').innerHTML = ''; - - $('#deleteRegistryModal').modal('show'); -} - -function notifyForDeleteRegistry() { - const responseEl = document.getElementById('deleteRegistryResponse'); - - if (deleteRegistryUrl) { - if (isSignedIn()) { - deleteCloudAgentURL(deleteRegistryGuid, deleteRegistryUrl) - .then((count) => { - if (!count) { - responseEl.innerHTML = "Sorry, this command was rejected by netdata.cloud!"; - return; - } - NETDATA.registry.delete(deleteRegistryUrl, function (result) { - if (result === null) { - console.log("Received error from registry", result); - } - - deleteRegistryUrl = null; - $('#deleteRegistryModal').modal('hide'); - NETDATA.registry.init(); - }); - }); - } else { - NETDATA.registry.delete(deleteRegistryUrl, function (result) { - if (result !== null) { - deleteRegistryUrl = null; - $('#deleteRegistryModal').modal('hide'); - NETDATA.registry.init(); - } else { - responseEl.innerHTML = "Sorry, this command was rejected by the registry server!"; - } - }); - } - } -} - -var options = { - menus: {}, - submenu_names: {}, - data: null, - hostname: 'netdata_server', // will be overwritten by the netdata server - version: 'unknown', - release_channel: 'unknown', - hosts: [], - - duration: 0, // the default duration of the charts - update_every: 1, - - chartsPerRow: 0, - // chartsMinWidth: 1450, - chartsHeight: 180, -}; - -function chartsPerRow(total) { - void (total); - - if (options.chartsPerRow === 0) { - return 1; - //var width = Math.floor(total / options.chartsMinWidth); - //if(width === 0) width = 1; - //return width; - } else { - return options.chartsPerRow; - } -} - -function prioritySort(a, b) { - if (a.priority < b.priority) { - return -1; - } - if (a.priority > b.priority) { - return 1; - } - return naturalSortCompare(a.name, b.name); -} - -function sortObjectByPriority(object) { - var idx = {}; - var sorted = []; - - for (var i in object) { - if (!object.hasOwnProperty(i)) { - continue; - } - - if (typeof idx[i] === 'undefined') { - idx[i] = object[i]; - sorted.push(i); - } - } - - sorted.sort(function (a, b) { - if (idx[a].priority < idx[b].priority) { - return -1; - } - if (idx[a].priority > idx[b].priority) { - return 1; - } - return naturalSortCompare(a, b); - }); - - return sorted; -} - -// ---------------------------------------------------------------------------- -// scroll to a section, without changing the browser history - -function scrollToId(hash) { - if (hash && hash !== '' && document.getElementById(hash) !== null) { - var offset = $('#' + hash).offset(); - if (typeof offset !== 'undefined') { - //console.log('scrolling to ' + hash + ' at ' + offset.top.toString()); - $('html, body').animate({ scrollTop: offset.top - 30 }, 0); - } - } - - // we must return false to prevent the default action - return false; -} - -// ---------------------------------------------------------------------------- - -// user editable information -var customDashboard = { - menu: {}, - submenu: {}, - context: {} -}; - -// netdata standard information -var netdataDashboard = { - sparklines_registry: {}, - os: 'unknown', - - menu: {}, - submenu: {}, - context: {}, - - // generate a sparkline - // used in the documentation - sparkline: function (prefix, chart, dimension, units, suffix) { - if (options.data === null || typeof options.data.charts === 'undefined') { - return ''; - } - - if (typeof options.data.charts[chart] === 'undefined') { - return ''; - } - - if (typeof options.data.charts[chart].dimensions === 'undefined') { - return ''; - } - - if (typeof options.data.charts[chart].dimensions[dimension] === 'undefined') { - return ''; - } - - var key = chart + '.' + dimension; - - if (typeof units === 'undefined') { - units = ''; - } - - if (typeof this.sparklines_registry[key] === 'undefined') { - this.sparklines_registry[key] = { count: 1 }; - } else { - this.sparklines_registry[key].count++; - } - - key = key + '.' + this.sparklines_registry[key].count; - - return prefix + '
(X' + units + ')' + suffix; - }, - - gaugeChart: function (title, width, dimensions, colors) { - if (typeof colors === 'undefined') { - colors = ''; - } - - if (typeof dimensions === 'undefined') { - dimensions = ''; - } - - return '
'; - }, - - anyAttribute: function (obj, attr, key, def) { - if (typeof (obj[key]) !== 'undefined') { - var x = obj[key][attr]; - - if (typeof (x) === 'undefined') { - return def; - } - - if (typeof (x) === 'function') { - return x(netdataDashboard.os); - } - - return x; - } - - return def; - }, - - menuTitle: function (chart) { - if (typeof chart.menu_pattern !== 'undefined') { - return (this.anyAttribute(this.menu, 'title', chart.menu_pattern, chart.menu_pattern).toString() - + ' ' + chart.type.slice(-(chart.type.length - chart.menu_pattern.length - 1)).toString()).replace(/_/g, ' '); - } - - return (this.anyAttribute(this.menu, 'title', chart.menu, chart.menu)).toString().replace(/_/g, ' '); - }, - - menuIcon: function (chart) { - if (typeof chart.menu_pattern !== 'undefined') { - return this.anyAttribute(this.menu, 'icon', chart.menu_pattern, '').toString(); - } - - return this.anyAttribute(this.menu, 'icon', chart.menu, ''); - }, - - menuInfo: function (chart) { - if (typeof chart.menu_pattern !== 'undefined') { - return this.anyAttribute(this.menu, 'info', chart.menu_pattern, null); - } - - return this.anyAttribute(this.menu, 'info', chart.menu, null); - }, - - menuHeight: function (chart) { - if (typeof chart.menu_pattern !== 'undefined') { - return this.anyAttribute(this.menu, 'height', chart.menu_pattern, 1.0); - } - - return this.anyAttribute(this.menu, 'height', chart.menu, 1.0); - }, - - submenuTitle: function (menu, submenu) { - var key = menu + '.' + submenu; - // console.log(key); - var title = this.anyAttribute(this.submenu, 'title', key, submenu).toString().replace(/_/g, ' '); - if (title.length > 28) { - var a = title.substring(0, 13); - var b = title.substring(title.length - 12, title.length); - return a + '...' + b; - } - return title; - }, - - submenuInfo: function (menu, submenu) { - var key = menu + '.' + submenu; - return this.anyAttribute(this.submenu, 'info', key, null); - }, - - submenuHeight: function (menu, submenu, relative) { - var key = menu + '.' + submenu; - return this.anyAttribute(this.submenu, 'height', key, 1.0) * relative; - }, - - contextInfo: function (id) { - var x = this.anyAttribute(this.context, 'info', id, null); - - if (x !== null) { - return '
' + x + '
'; - } else { - return ''; - } - }, - - contextValueRange: function (id) { - if (typeof this.context[id] !== 'undefined' && typeof this.context[id].valueRange !== 'undefined') { - return this.context[id].valueRange; - } else { - return '[null, null]'; - } - }, - - contextHeight: function (id, def) { - if (typeof this.context[id] !== 'undefined' && typeof this.context[id].height !== 'undefined') { - return def * this.context[id].height; - } else { - return def; - } - }, - - contextDecimalDigits: function (id, def) { - if (typeof this.context[id] !== 'undefined' && typeof this.context[id].decimalDigits !== 'undefined') { - return this.context[id].decimalDigits; - } else { - return def; - } - } -}; - -// ---------------------------------------------------------------------------- - -// enrich the data structure returned by netdata -// to reflect our menu system and content -// TODO: this is a shame - we should fix charts naming (issue #807) -function enrichChartData(chart) { - var parts = chart.type.split('_'); - var tmp = parts[0]; - - switch (tmp) { - case 'ap': - case 'net': - case 'disk': - case 'powersupply': - case 'statsd': - chart.menu = tmp; - break; - - case 'apache': - chart.menu = chart.type; - if (parts.length > 2 && parts[1] === 'cache') { - chart.menu_pattern = tmp + '_' + parts[1]; - } else if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - - case 'bind': - chart.menu = chart.type; - if (parts.length > 2 && parts[1] === 'rndc') { - chart.menu_pattern = tmp + '_' + parts[1]; - } else if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - - case 'cgroup': - chart.menu = chart.type; - if (chart.id.match(/.*[\._\/-:]qemu[\._\/-:]*/) || chart.id.match(/.*[\._\/-:]kvm[\._\/-:]*/)) { - chart.menu_pattern = 'cgqemu'; - } else { - chart.menu_pattern = 'cgroup'; - } - break; - - case 'go': - chart.menu = chart.type; - if (parts.length > 2 && parts[1] === 'expvar') { - chart.menu_pattern = tmp + '_' + parts[1]; - } else if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - - case 'mount': - if (parts.length > 2) { - chart.menu = tmp + '_' + parts[1]; - } else { - chart.menu = tmp; - } - break; - - case 'isc': - chart.menu = chart.type; - if (parts.length > 2 && parts[1] === 'dhcpd') { - chart.menu_pattern = tmp + '_' + parts[1]; - } else if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - - case 'ovpn': - chart.menu = chart.type; - if (parts.length > 3 && parts[1] === 'status' && parts[2] === 'log') { - chart.menu_pattern = tmp + '_' + parts[1]; - } else if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - - case 'smartd': - case 'web': - chart.menu = chart.type; - if (parts.length > 2 && parts[1] === 'log') { - chart.menu_pattern = tmp + '_' + parts[1]; - } else if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - - case 'tc': - chart.menu = tmp; - - // find a name for this device from fireqos info - // we strip '_(in|out)' or '(in|out)_' - if (chart.context === 'tc.qos' && (typeof options.submenu_names[chart.family] === 'undefined' || options.submenu_names[chart.family] === chart.family)) { - var n = chart.name.split('.')[1]; - if (n.endsWith('_in')) { - options.submenu_names[chart.family] = n.slice(0, n.lastIndexOf('_in')); - } else if (n.endsWith('_out')) { - options.submenu_names[chart.family] = n.slice(0, n.lastIndexOf('_out')); - } else if (n.startsWith('in_')) { - options.submenu_names[chart.family] = n.slice(3, n.length); - } else if (n.startsWith('out_')) { - options.submenu_names[chart.family] = n.slice(4, n.length); - } else { - options.submenu_names[chart.family] = n; - } - } - - // increase the priority of IFB devices - // to have inbound appear before outbound - if (chart.id.match(/.*-ifb$/)) { - chart.priority--; - } - - break; - - default: - chart.menu = chart.type; - if (parts.length > 1) { - chart.menu_pattern = tmp; - } - break; - } - - chart.submenu = chart.family; -} - -// ---------------------------------------------------------------------------- - -function headMain(os, charts, duration) { - void (os); - - if (urlOptions.mode === 'print') { - return ''; - } - - var head = ''; - - if (typeof charts['system.swap'] !== 'undefined') { - head += '
'; - } - - if (typeof charts['system.io'] !== 'undefined') { - head += '
'; - - head += '
'; - } - else if (typeof charts['system.pgpgio'] !== 'undefined') { - head += '
'; - - head += '
'; - } - - if (typeof charts['system.cpu'] !== 'undefined') { - head += '
'; - } - - if (typeof charts['system.net'] !== 'undefined') { - head += '
'; - - head += '
'; - } - else if (typeof charts['system.ip'] !== 'undefined') { - head += '
'; - - head += '
'; - } - else if (typeof charts['system.ipv4'] !== 'undefined') { - head += '
'; - - head += '
'; - } - else if (typeof charts['system.ipv6'] !== 'undefined') { - head += '
'; - - head += '
'; - } - - if (typeof charts['system.ram'] !== 'undefined') { - head += '
'; - } - - return head; -} - -function generateHeadCharts(type, chart, duration) { - if (urlOptions.mode === 'print') { - return ''; - } - - var head = ''; - var hcharts = netdataDashboard.anyAttribute(netdataDashboard.context, type, chart.context, []); - if (hcharts.length > 0) { - var hi = 0, hlen = hcharts.length; - while (hi < hlen) { - if (typeof hcharts[hi] === 'function') { - head += hcharts[hi](netdataDashboard.os, chart.id).replace(/CHART_DURATION/g, duration.toString()).replace(/CHART_UNIQUE_ID/g, chart.id); - } else { - head += hcharts[hi].replace(/CHART_DURATION/g, duration.toString()).replace(/CHART_UNIQUE_ID/g, chart.id); - } - hi++; - } - } - return head; -} - -function renderPage(menus, data) { - var div = document.getElementById('charts_div'); - var pcent_width = Math.floor(100 / chartsPerRow($(div).width())); - - // find the proper duration for per-second updates - var duration = Math.round(($(div).width() * pcent_width / 100 * data.update_every / 3) / 60) * 60; - options.duration = duration; - options.update_every = data.update_every; - - var html = ''; - var sidebar = ''; - div.innerHTML = html; - document.getElementById('sidebar').innerHTML = sidebar; - - if (urlOptions.highlight === true) { - NETDATA.globalChartUnderlay.init(null - , urlOptions.highlight_after - , urlOptions.highlight_before - , (urlOptions.after > 0) ? urlOptions.after : null - , (urlOptions.before > 0) ? urlOptions.before : null - ); - } else { - NETDATA.globalChartUnderlay.clear(); - } - - if (urlOptions.mode === 'print') { - printPage(); - } else { - finalizePage(); - } -} - -function renderChartsAndMenu(data) { - options.menus = {}; - options.submenu_names = {}; - - var menus = options.menus; - var charts = data.charts; - var m, menu_key; - - for (var c in charts) { - if (!charts.hasOwnProperty(c)) { - continue; - } - - var chart = charts[c]; - enrichChartData(chart); - m = chart.menu; - - // create the menu - if (typeof menus[m] === 'undefined') { - menus[m] = { - menu_pattern: chart.menu_pattern, - priority: chart.priority, - submenus: {}, - title: netdataDashboard.menuTitle(chart), - icon: netdataDashboard.menuIcon(chart), - info: netdataDashboard.menuInfo(chart), - height: netdataDashboard.menuHeight(chart) * options.chartsHeight - }; - } else { - if (typeof (menus[m].menu_pattern) === 'undefined') { - menus[m].menu_pattern = chart.menu_pattern; - } - - if (chart.priority < menus[m].priority) { - menus[m].priority = chart.priority; - } - } - - menu_key = (typeof (menus[m].menu_pattern) !== 'undefined') ? menus[m].menu_pattern : m; - - // create the submenu - if (typeof menus[m].submenus[chart.submenu] === 'undefined') { - menus[m].submenus[chart.submenu] = { - priority: chart.priority, - charts: [], - title: null, - info: netdataDashboard.submenuInfo(menu_key, chart.submenu), - height: netdataDashboard.submenuHeight(menu_key, chart.submenu, menus[m].height) - }; - } else { - if (chart.priority < menus[m].submenus[chart.submenu].priority) { - menus[m].submenus[chart.submenu].priority = chart.priority; - } - } - - // index the chart in the menu/submenu - menus[m].submenus[chart.submenu].charts.push(chart); - } - - // propagate the descriptive subname given to QoS - // to all the other submenus with the same name - for (var m in menus) { - if (!menus.hasOwnProperty(m)) { - continue; - } - - for (var s in menus[m].submenus) { - if (!menus[m].submenus.hasOwnProperty(s)) { - continue; - } - - // set the family using a name - if (typeof options.submenu_names[s] !== 'undefined') { - menus[m].submenus[s].title = s + ' (' + options.submenu_names[s] + ')'; - } else { - menu_key = (typeof (menus[m].menu_pattern) !== 'undefined') ? menus[m].menu_pattern : m; - menus[m].submenus[s].title = netdataDashboard.submenuTitle(menu_key, s); - } - } - } - - renderPage(menus, data); -} - -// ---------------------------------------------------------------------------- - -function loadJs(url, callback) { - $.ajax({ - url: url.startsWith("http") ? url : transformWithOldSuffix(url), - cache: true, - dataType: "script", - xhrFields: { withCredentials: true } // required for the cookie - }) - .fail(function () { - alert('Cannot load required JS library: ' + url); - }) - .always(function () { - if (typeof callback === 'function') { - callback(); - } - }) -} - -var clipboardLoaded = false; - -function loadClipboard(callback) { - if (clipboardLoaded === false) { - clipboardLoaded = true; - loadJs('lib/clipboard-polyfill-be05dad.js', callback); - } else { - callback(); - } -} - -var bootstrapTableLoaded = false; - -function loadBootstrapTable(callback) { - if (bootstrapTableLoaded === false) { - bootstrapTableLoaded = true; - loadJs('lib/bootstrap-table-1.11.0.min.js', function () { - loadJs('lib/bootstrap-table-export-1.11.0.min.js', function () { - loadJs('lib/tableExport-1.6.0.min.js', callback); - }) - }); - } else { - callback(); - } -} - -var bootstrapSliderLoaded = false; - -function loadBootstrapSlider(callback) { - if (bootstrapSliderLoaded === false) { - bootstrapSliderLoaded = true; - loadJs('lib/bootstrap-slider-10.0.0.min.js', function () { - NETDATA._loadCSS(transformWithOldSuffix("css/bootstrap-slider-10.0.0.min.css")); - callback(); - }); - } else { - callback(); - } -} - -var lzStringLoaded = false; - -function loadLzString(callback) { - if (lzStringLoaded === false) { - lzStringLoaded = true; - loadJs('lib/lz-string-1.4.4.min.js', callback); - } else { - callback(); - } -} - -var pakoLoaded = false; - -function loadPako(callback) { - if (pakoLoaded === false) { - pakoLoaded = true; - loadJs('lib/pako-1.0.6.min.js', callback); - } else { - callback(); - } -} - -// ---------------------------------------------------------------------------- - -function clipboardCopy(text) { - clipboard.writeText(text); -} - -function clipboardCopyBadgeEmbed(url) { - clipboard.writeText(''); -} - -// ---------------------------------------------------------------------------- - -function alarmsUpdateModal() { - var active = '

触发警报

'; - var all = '

所有作用中的警报

'; - var footer = '
netdata badges 会自动重新整理。不同颜色分表代表的警报状态:  红色  表示重大,  橘色  表示警告,  绿色  表示良好,  灰色  表示未定义 (例如无资料或无状态),  黑色  表示尚未初始化。您可以复制这里的网址并将它们嵌入到任一个网页。
netdata 能够发送这些警报通知。请参阅 这个设定档 了解更多资讯。'; - - loadClipboard(function () { - }); - - NETDATA.alarms.get('all', function (data) { - options.alarm_families = []; - - alarmsCallback(data); - - if (data === null) { - document.getElementById('alarms_active').innerHTML = - document.getElementById('alarms_all').innerHTML = - document.getElementById('alarms_log').innerHTML = - 'failed to load alarm data!'; - return; - } - - function alarmid4human(id) { - if (id === 0) { - return '-'; - } - - return id.toString(); - } - - function timestamp4human(timestamp, space) { - if (timestamp === 0) { - return '-'; - } - - if (typeof space === 'undefined') { - space = ' '; - } - - var t = new Date(timestamp * 1000); - var now = new Date(); - - if (t.toDateString() === now.toDateString()) { - return t.toLocaleTimeString(); - } - - return t.toLocaleDateString() + space + t.toLocaleTimeString(); - } - - function alarm_lookup_explain(alarm, chart) { - var dimensions = ' of all values '; - - if (chart.dimensions.length > 1) { - dimensions = ' of the sum of all dimensions '; - } - - if (typeof alarm.lookup_dimensions !== 'undefined') { - var d = alarm.lookup_dimensions.replace(/|/g, ','); - var x = d.split(','); - if (x.length > 1) { - dimensions = 'of the sum of dimensions ' + alarm.lookup_dimensions + ' '; - } else { - dimensions = 'of all values of dimension ' + alarm.lookup_dimensions + ' '; - } - } - - return '' + alarm.lookup_method + ' ' - + dimensions + ', of chart ' + alarm.chart + '' - + ', starting ' + NETDATA.seconds4human(alarm.lookup_after + alarm.lookup_before, { space: ' ' }) + ' and up to ' + NETDATA.seconds4human(alarm.lookup_before, { space: ' ' }) + '' - + ((alarm.lookup_options) ? (', with options ' + alarm.lookup_options.replace(/ /g, ', ') + '') : '') - + '.'; - } - - function alarm_to_html(alarm, full) { - var chart = options.data.charts[alarm.chart]; - if (typeof (chart) === 'undefined') { - chart = options.data.charts_by_name[alarm.chart]; - if (typeof (chart) === 'undefined') { - // this means the charts loaded are incomplete - // probably netdata was restarted and more alarms - // are now available. - console.log('Cannot find chart ' + alarm.chart + ', you probably need to refresh the page.'); - return ''; - } - } - - var has_alarm = (typeof alarm.warn !== 'undefined' || typeof alarm.crit !== 'undefined'); - var badge_url = NETDATA.alarms.server + '/api/v1/badge.svg?chart=' + alarm.chart + '&alarm=' + alarm.name + '&refresh=auto'; - - var action_buttons = '
 
role: ' + alarm.recipient + '
 
' - + '
' - + '
' - + '
'; - - var html = '
' - + ''; - - return html; - } - - function alarm_family_show(id) { - var html = '
' + alarm.chart + '
 

 
' + alarm.info + '' + action_buttons + '
' - + ((typeof alarm.warn !== 'undefined') ? ('') : '') - + ((typeof alarm.crit !== 'undefined') ? ('') : ''); - - if (full === true) { - var units = chart.units; - if (units === '%') { - units = '%'; - } - - html += ((typeof alarm.lookup_after !== 'undefined') ? ('') : '') - + ((typeof alarm.calc !== 'undefined') ? ('') : '') - + ((chart.green !== null) ? ('') : '') - + ((chart.red !== null) ? ('') : ''); - } - - if (alarm.warn_repeat_every > 0) { - html += ''; - } - - if (alarm.crit_repeat_every > 0) { - html += ''; - } - - var delay = ''; - if ((alarm.delay_up_duration > 0 || alarm.delay_down_duration > 0) && alarm.delay_multiplier !== 0 && alarm.delay_max_duration > 0) { - if (alarm.delay_up_duration === alarm.delay_down_duration) { - delay += '
hysteresis ' + NETDATA.seconds4human(alarm.delay_up_duration, { - space: ' ', - negative_suffix: '' - }); - } else { - delay = '
hysteresis '; - if (alarm.delay_up_duration > 0) { - delay += 'on escalation ' + NETDATA.seconds4human(alarm.delay_up_duration, { - space: ' ', - negative_suffix: '' - }) + ', '; - } - if (alarm.delay_down_duration > 0) { - delay += 'on recovery ' + NETDATA.seconds4human(alarm.delay_down_duration, { - space: ' ', - negative_suffix: '' - }) + ', '; - } - } - if (alarm.delay_multiplier !== 1.0) { - delay += 'multiplied by ' + alarm.delay_multiplier.toString() + ''; - delay += ', up to ' + NETDATA.seconds4human(alarm.delay_max_duration, { - space: ' ', - negative_suffix: '' - }) + ''; - } - delay += '
'; - } - - html += '
' - + ((has_alarm === true) ? ('') : '') - + '' - + '
warning when' + alarm.warn + '
critical when' + alarm.crit + '
db lookup' + alarm_lookup_explain(alarm, chart) + '
calculation' + alarm.calc + '
green threshold' + chart.green + ' ' + units + '
red threshold' + chart.red + ' ' + units + '
repeat warning' + NETDATA.seconds4human(alarm.warn_repeat_every) + '
repeat critical' + NETDATA.seconds4human(alarm.crit_repeat_every) + '
check every' + NETDATA.seconds4human(alarm.update_every, { - space: ' ', - negative_suffix: '' - }) + '
execute' + alarm.exec + '' + delay + '
source' + alarm.source + '
'; - var family = options.alarm_families[id]; - var len = family.arr.length; - while (len--) { - var alarm = family.arr[len]; - html += alarm_to_html(alarm, true); - } - html += '
'; - - $('#alarm_all_' + id.toString()).html(html); - enableTooltipsAndPopovers(); - } - - // find the proper family of each alarm - var x, family, alarm; - var count_active = 0; - var count_all = 0; - var families = {}; - var families_sort = []; - for (x in data.alarms) { - if (!data.alarms.hasOwnProperty(x)) { - continue; - } - - alarm = data.alarms[x]; - family = alarm.family; - - // find the chart - var chart = options.data.charts[alarm.chart]; - if (typeof chart === 'undefined') { - chart = options.data.charts_by_name[alarm.chart]; - } - - // not found - this should never happen! - if (typeof chart === 'undefined') { - console.log('WARNING: alarm ' + x + ' is linked to chart ' + alarm.chart + ', which is not found in the list of chart got from the server.'); - chart = { priority: 9999999 }; - } - else if (typeof chart.menu !== 'undefined' && typeof chart.submenu !== 'undefined') - // the family based on the chart - { - family = chart.menu + ' - ' + chart.submenu; - } - - if (typeof families[family] === 'undefined') { - families[family] = { - name: family, - arr: [], - priority: chart.priority - }; - - families_sort.push(families[family]); - } - - if (chart.priority < families[family].priority) { - families[family].priority = chart.priority; - } - - families[family].arr.unshift(alarm); - } - - // sort the families, like the dashboard menu does - var families_sorted = families_sort.sort(function (a, b) { - if (a.priority < b.priority) { - return -1; - } - if (a.priority > b.priority) { - return 1; - } - return naturalSortCompare(a.name, b.name); - }); - - var i = 0; - var fc = 0; - var len = families_sorted.length; - while (len--) { - family = families_sorted[i++].name; - var active_family_added = false; - var expanded = 'true'; - var collapsed = ''; - var cin = 'in'; - - if (fc !== 0) { - all += ""; - expanded = 'false'; - collapsed = 'class="collapsed"'; - cin = ''; - } - - all += '
'; - - options.alarm_families[fc] = families[family]; - - fc++; - - var arr = families[family].arr; - var c = arr.length; - while (c--) { - alarm = arr[c]; - if (alarm.status === 'WARNING' || alarm.status === 'CRITICAL') { - if (!active_family_added) { - active_family_added = true; - active += '

' + family + '

'; - } - count_active++; - active += alarm_to_html(alarm, true); - } - - count_all++; - } - } - active += ""; - if (families_sorted.length > 0) { - all += "
"; - } - all += ""; - - if (!count_active) { - active += '

一切正常。没有警报。
'; - } else { - active += footer; - } - - if (!count_all) { - all += "

此系统中没有运行警报。

"; - } else { - all += footer; - } - - document.getElementById('alarms_active').innerHTML = active; - document.getElementById('alarms_all').innerHTML = all; - enableTooltipsAndPopovers(); - - if (families_sorted.length > 0) { - alarm_family_show(0); - } - - // register bootstrap events - var $accordion = $('#alarms_all_accordion'); - $accordion.on('show.bs.collapse', function (d) { - var target = $(d.target); - var id = $(target).data('alarm-id'); - alarm_family_show(id); - }); - $accordion.on('hidden.bs.collapse', function (d) { - var target = $(d.target); - var id = $(target).data('alarm-id'); - $('#alarm_all_' + id.toString()).html(''); - }); - - document.getElementById('alarms_log').innerHTML = '

警报记录

'; - - loadBootstrapTable(function () { - $('#alarms_log_table').bootstrapTable({ - url: NETDATA.alarms.server + '/api/v1/alarm_log?all', - cache: false, - pagination: true, - pageSize: 10, - showPaginationSwitch: false, - search: true, - searchTimeOut: 300, - searchAlign: 'left', - showColumns: true, - showExport: true, - exportDataType: 'basic', - exportOptions: { - fileName: 'netdata_alarm_log' - }, - onClickRow: function (row, $element,field) { - void (field); - void ($element); - let main_url; - let common_url = "&host=" + encodeURIComponent(row['hostname']) + "&chart=" + encodeURIComponent(row['chart']) + "&family=" + encodeURIComponent(row['family']) + "&alarm=" + encodeURIComponent(row['name']) + "&alarm_unique_id=" + row['unique_id'] + "&alarm_id=" + row['alarm_id'] + "&alarm_event_id=" + row['alarm_event_id'] + "&alarm_when=" + row['when']; - if (NETDATA.registry.isUsingGlobalRegistry() && NETDATA.registry.machine_guid != null) { - main_url = "https://netdata.cloud/alarms/redirect?agentID=" + NETDATA.registry.machine_guid + common_url; - } else { - main_url = NETDATA.registry.server + "/goto-host-from-alarm.html?" + common_url ; - } - window.open(main_url,"_blank"); - }, - rowStyle: function (row, index) { - void (index); - - switch (row.status) { - case 'CRITICAL': - return { classes: 'danger' }; - break; - case 'WARNING': - return { classes: 'warning' }; - break; - case 'UNDEFINED': - return { classes: 'info' }; - break; - case 'CLEAR': - return { classes: 'success' }; - break; - } - return {}; - }, - showFooter: false, - showHeader: true, - showRefresh: true, - showToggle: false, - sortable: true, - silentSort: false, - columns: [ - { - field: 'when', - title: '事件日期', - valign: 'middle', - titleTooltip: 'The date and time the even took place', - formatter: function (value, row, index) { - void (row); - void (index); - return timestamp4human(value, ' '); - }, - align: 'center', - switchable: false, - sortable: true - }, - { - field: 'hostname', - title: '主机', - valign: 'middle', - titleTooltip: 'The host that generated this event', - align: 'center', - visible: false, - sortable: true - }, - { - field: 'unique_id', - title: '唯一 ID', - titleTooltip: 'The host unique ID for this event', - formatter: function (value, row, index) { - void (row); - void (index); - return alarmid4human(value); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'alarm_id', - title: '警报 ID', - titleTooltip: 'The ID of the alarm that generated this event', - formatter: function (value, row, index) { - void (row); - void (index); - return alarmid4human(value); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'alarm_event_id', - title: '警报事件 ID', - titleTooltip: 'The incremental ID of this event for the given alarm', - formatter: function (value, row, index) { - void (row); - void (index); - return alarmid4human(value); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'chart', - title: '图表', - titleTooltip: 'The chart the alarm is attached to', - align: 'center', - valign: 'middle', - switchable: false, - sortable: true - }, - { - field: 'family', - title: 'Family', - titleTooltip: 'The family of the chart the alarm is attached to', - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'name', - title: '警报', - titleTooltip: 'The alarm name that generated this event', - formatter: function (value, row, index) { - void (row); - void (index); - return value.toString().replace(/_/g, ' '); - }, - align: 'center', - valign: 'middle', - switchable: false, - sortable: true - }, - { - field: 'value_string', - title: 'Friendly Value', - titleTooltip: 'The value of the alarm, that triggered this event', - align: 'right', - valign: 'middle', - sortable: true - }, - { - field: 'old_value_string', - title: 'Friendly Old Value', - titleTooltip: 'The value of the alarm, just before this event', - align: 'right', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'old_value', - title: 'Old Value', - titleTooltip: 'The value of the alarm, just before this event', - formatter: function (value, row, index) { - void (row); - void (index); - return ((value !== null) ? Math.round(value * 100) / 100 : 'NaN').toString(); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'value', - title: 'Value', - titleTooltip: 'The value of the alarm, that triggered this event', - formatter: function (value, row, index) { - void (row); - void (index); - return ((value !== null) ? Math.round(value * 100) / 100 : 'NaN').toString(); - }, - align: 'right', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'units', - title: '单位', - titleTooltip: 'The units of the value of the alarm', - align: 'left', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'old_status', - title: '先前状态', - titleTooltip: 'The status of the alarm, just before this event', - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'status', - title: '状态', - titleTooltip: 'The status of the alarm, that was set due to this event', - align: 'center', - valign: 'middle', - switchable: false, - sortable: true - }, - { - field: 'duration', - title: 'Last Duration', - titleTooltip: 'The duration the alarm was at its previous state, just before this event', - formatter: function (value, row, index) { - void (row); - void (index); - return NETDATA.seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'non_clear_duration', - title: 'Raised Duration', - titleTooltip: 'The duration the alarm was raised, just before this event', - formatter: function (value, row, index) { - void (row); - void (index); - return NETDATA.seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'recipient', - title: 'Recipient', - titleTooltip: 'The recipient of this event', - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'processed', - title: 'Processed Status', - titleTooltip: 'True when this event is processed', - formatter: function (value, row, index) { - void (row); - void (index); - - if (value === true) { - return 'DONE'; - } else { - return 'PENDING'; - } - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'updated', - title: 'Updated Status', - titleTooltip: 'True when this event has been updated by another event', - formatter: function (value, row, index) { - void (row); - void (index); - - if (value === true) { - return 'UPDATED'; - } else { - return 'CURRENT'; - } - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'updated_by_id', - title: 'Updated By ID', - titleTooltip: 'The unique ID of the event that obsoleted this one', - formatter: function (value, row, index) { - void (row); - void (index); - return alarmid4human(value); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'updates_id', - title: 'Updates ID', - titleTooltip: 'The unique ID of the event obsoleted because of this event', - formatter: function (value, row, index) { - void (row); - void (index); - return alarmid4human(value); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'exec', - title: 'Script', - titleTooltip: 'The script to handle the event notification', - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'exec_run', - title: 'Script Run At', - titleTooltip: 'The date and time the script has been ran', - formatter: function (value, row, index) { - void (row); - void (index); - return timestamp4human(value, ' '); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'exec_code', - title: 'Script Return Value', - titleTooltip: 'The return code of the script', - formatter: function (value, row, index) { - void (row); - void (index); - - if (value === 0) { - return 'OK (returned 0)'; - } else { - return 'FAILED (with code ' + value.toString() + ')'; - } - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'delay', - title: 'Script Delay', - titleTooltip: 'The hysteresis of the notification', - formatter: function (value, row, index) { - void (row); - void (index); - - return NETDATA.seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'delay_up_to_timestamp', - title: 'Script Delay Run At', - titleTooltip: 'The date and time the script should be run, after hysteresis', - formatter: function (value, row, index) { - void (row); - void (index); - return timestamp4human(value, ' '); - }, - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'info', - title: '说明', - titleTooltip: 'A short description of the alarm', - align: 'center', - valign: 'middle', - visible: false, - sortable: true - }, - { - field: 'source', - title: '警报来源', - titleTooltip: 'The source of configuration of the alarm', - align: 'center', - valign: 'middle', - visible: false, - sortable: true - } - ] - }); - // console.log($('#alarms_log_table').bootstrapTable('getOptions')); - }); - }); -} - -function alarmsCallback(data) { - var count = 0, x; - for (x in data.alarms) { - if (!data.alarms.hasOwnProperty(x)) { - continue; - } - - var alarm = data.alarms[x]; - if (alarm.status === 'WARNING' || alarm.status === 'CRITICAL') { - count++; - } - } - - if (count > 0) { - document.getElementById('alarms_count_badge').innerHTML = count.toString(); - } else { - document.getElementById('alarms_count_badge').innerHTML = ''; - } -} - -function initializeDynamicDashboardWithData(data) { - if (data !== null) { - options.hostname = data.hostname; - options.data = data; - options.version = data.version; - options.release_channel = data.release_channel; - netdataDashboard.os = data.os; - - if (typeof data.hosts !== 'undefined') { - options.hosts = data.hosts; - } - - // update the dashboard hostname - document.getElementById('hostname').innerHTML = '' + options.hostname + ((netdataSnapshotData !== null) ? ' (snap)' : '').toString() + '  '; - document.getElementById('hostname').href = NETDATA.serverDefault; - document.getElementById('netdataVersion').innerHTML = options.version; - - if (netdataSnapshotData !== null) { - $('#alarmsButton').hide(); - $('#updateButton').hide(); - // $('#loadButton').hide(); - $('#saveButton').hide(); - $('#printButton').hide(); - } - - // update the dashboard title - document.title = options.hostname + ' netdata 仪表板'; - - // close the splash screen - $("#loadOverlay").css("display", "none"); - - // create a chart_by_name index - data.charts_by_name = {}; - var charts = data.charts; - var x; - for (x in charts) { - if (!charts.hasOwnProperty(x)) { - continue; - } - - var chart = charts[x]; - data.charts_by_name[chart.name] = chart; - } - - // render all charts - renderChartsAndMenu(data); - - // Ensure MyNetdata menu is rendered with latest host info #5370 - renderMyNetdataMenu(isSignedIn() ? cloudAgents : registryAgents); - } -} - -// an object to keep initialization configuration -// needed due to the async nature of the XSS modal -var initializeConfig = { - url: null, - custom_info: true, -}; - -function loadCustomDashboardInfo(url, callback) { - loadJs(url, function () { - $.extend(true, netdataDashboard, customDashboard); - callback(); - }); -} - -function initializeChartsAndCustomInfo() { - NETDATA.alarms.callback = alarmsCallback; - - // download all the charts the server knows - NETDATA.chartRegistry.downloadAll(initializeConfig.url, function (data) { - if (data !== null) { - if (initializeConfig.custom_info === true && typeof data.custom_info !== 'undefined' && data.custom_info !== "" && netdataSnapshotData === null) { - //console.log('loading custom dashboard decorations from server ' + initializeConfig.url); - loadCustomDashboardInfo(NETDATA.serverDefault + data.custom_info, function () { - initializeDynamicDashboardWithData(data); - }); - } else { - //console.log('not loading custom dashboard decorations from server ' + initializeConfig.url); - initializeDynamicDashboardWithData(data); - } - } - }); -} - -function xssModalDisableXss() { - //console.log('disabling xss checks'); - NETDATA.xss.enabled = false; - NETDATA.xss.enabled_for_data = false; - initializeConfig.custom_info = true; - initializeChartsAndCustomInfo(); - return false; -} - -function xssModalKeepXss() { - //console.log('keeping xss checks'); - NETDATA.xss.enabled = true; - NETDATA.xss.enabled_for_data = true; - initializeConfig.custom_info = false; - initializeChartsAndCustomInfo(); - return false; -} - -function initializeDynamicDashboard(netdata_url) { - if (typeof netdata_url === 'undefined' || netdata_url === null) { - netdata_url = NETDATA.serverDefault; - } - - initializeConfig.url = netdata_url; - - // initialize clickable alarms - NETDATA.alarms.chart_div_offset = -50; - NETDATA.alarms.chart_div_id_prefix = 'chart_'; - NETDATA.alarms.chart_div_animation_duration = 0; - - NETDATA.pause(function () { - if (typeof netdataCheckXSS !== 'undefined' && netdataCheckXSS === true) { - //$("#loadOverlay").css("display","none"); - document.getElementById('netdataXssModalServer').innerText = initializeConfig.url; - $('#xssModal').modal('show'); - } else { - initializeChartsAndCustomInfo(); - } - }); -} - -// ---------------------------------------------------------------------------- - -function versionLog(msg) { - document.getElementById('versionCheckLog').innerHTML = msg; -} - -// New way of checking for updates, based only on versions - -function versionsMatch(v1, v2) { - if (v1 == v2) { - return true; - } else { - let s1 = v1.split('.'); - let s2 = v2.split('.'); - // Check major version - let n1 = parseInt(s1[0].substring(1, 2), 10); - let n2 = parseInt(s2[0].substring(1, 2), 10); - if (n1 < n2) return false; - else if (n1 > n2) return true; - - // Check minor version - n1 = parseInt(s1[1], 10); - n2 = parseInt(s2[1], 10); - if (n1 < n2) return false; - else if (n1 > n2) return true; - - // Split patch: format could be e.g. 0-22-nightly - s1 = s1[2].split('-'); - s2 = s2[2].split('-'); - - n1 = parseInt(s1[0], 10); - n2 = parseInt(s2[0], 10); - if (n1 < n2) return false; - else if (n1 > n2) return true; - - n1 = (s1.length > 1) ? parseInt(s1[1], 10) : 0; - n2 = (s2.length > 1) ? parseInt(s2[1], 10) : 0; - if (n1 < n2) return false; - else return true; - } -} - -function getGithubLatestVersion(callback) { - versionLog('正在从 github 下载最新版本 ID...'); - - $.ajax({ - url: 'https://api.github.com/repos/netdata/netdata/releases/latest', - async: true, - cache: false - }) - .done(function (data) { - data = data.tag_name.replace(/(\r\n|\n|\r| |\t)/gm, ""); - versionLog('从 github 取得最新版本是 ' + data); - callback(data); - }) - .fail(function () { - versionLog('从 github 下载最新版本 ID 失败!'); - callback(null); - }); -} - -function getGCSLatestVersion(callback) { - versionLog('Downloading latest version id from GCS...'); - $.ajax({ - url: "https://www.googleapis.com/storage/v1/b/netdata-nightlies/o/latest-version.txt", - async: true, - cache: false - }) - .done(function (response) { - $.ajax({ - url: response.mediaLink, - async: true, - cache: false - }) - .done(function (data) { - data = data.replace(/(\r\n|\n|\r| |\t)/gm, ""); - versionLog('Latest nightly version from GCS is ' + data); - callback(data); - }) - .fail(function (xhr, textStatus, errorThrown) { - versionLog('Failed to download the latest nightly version id from GCS!'); - callback(null); - }); - }) - .fail(function (xhr, textStatus, errorThrown) { - versionLog('Failed to download the latest nightly version from GCS!'); - callback(null); - }); -} - - -function checkForUpdateByVersion(force, callback) { - if (options.release_channel === 'stable') { - getGithubLatestVersion(function (sha2) { - callback(options.version, sha2); - }); - } else { - getGCSLatestVersion(function (sha2) { - callback(options.version, sha2); - }); - } - return null; -} - -function notifyForUpdate(force) { - versionLog('

正在检查更新...

'); - - var now = Date.now(); - - if (typeof force === 'undefined' || force !== true) { - var last = loadLocalStorage('last_update_check'); - - if (typeof last === 'string') { - last = parseInt(last); - } else { - last = 0; - } - - if (now - last < 3600000 * 8) { - // no need to check it - too soon - return; - } - } - - checkForUpdateByVersion(force, function (sha1, sha2) { - var save = false; - - if (sha1 === null) { - save = false; - versionLog('

取得您的 netdata 版本失败!

You can always get the latest netdata from its github page.

'); - } else if (sha2 === null) { - save = false; - versionLog('

从 github 取得 netdata 最新版本失败。

您也可以从 its github page 取得最新 netdata 版本。

'); - } else if (versionsMatch(sha1, sha2)) { - save = true; - versionLog('

您已经是最新版本的 netdata!

还没有更新?
或许,我们还需要一些动力继续前进!

如果您还没有做好更新的准备,请您 到 github 给 netdata at its github page.

'); - } else { - save = true; - var compare = 'https://learn.netdata.cloud/docs/agent/changelog/'; - versionLog('

New version of netdata available!

Latest version: ' + sha2 + '

Click here for the changes log and
click here for directions on updating your netdata installation.

We suggest to review the changes log for new features you may be interested, or important bug fixes you may need.
Keeping your netdata updated is generally a good idea.

'); - - document.getElementById('update_badge').innerHTML = '!'; - } - - if (save) { - saveLocalStorage('last_update_check', now.toString()); - } - }); -} - -// ---------------------------------------------------------------------------- -// printing dashboards - -function showPageFooter() { - document.getElementById('footer').style.display = 'block'; -} - -function printPreflight() { - var url = document.location.origin.toString() + document.location.pathname.toString() + document.location.search.toString() + urlOptions.genHash() + ';mode=print'; - var width = 990; - var height = screen.height * 90 / 100; - //console.log(url); - //console.log(document.location); - window.open(url, '', 'width=' + width.toString() + ',height=' + height.toString() + ',menubar=no,toolbar=no,personalbar=no,location=no,resizable=no,scrollbars=yes,status=no,chrome=yes,centerscreen=yes,attention=yes,dialog=yes'); - $('#printPreflightModal').modal('hide'); -} - -function printPage() { - var print_is_rendering = true; - - $('#printModal').on('hide.bs.modal', function (e) { - if (print_is_rendering === true) { - e.preventDefault(); - return false; - } - - return true; - }); - - $('#printModal').on('show.bs.modal', function () { - var print_options = { - stop_updates_when_focus_is_lost: false, - update_only_visible: false, - sync_selection: false, - eliminate_zero_dimensions: false, - pan_and_zoom_data_padding: false, - show_help: false, - legend_toolbox: false, - resize_charts: false, - pixels_per_point: 1 - }; - - var x; - for (x in print_options) { - if (print_options.hasOwnProperty(x)) { - NETDATA.options.current[x] = print_options[x]; - } - } - - NETDATA.parseDom(); - showPageFooter(); - - NETDATA.globalSelectionSync.stop(); - NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], urlOptions.after, urlOptions.before); - // NETDATA.onresize(); - - var el = document.getElementById('printModalProgressBar'); - var eltxt = document.getElementById('printModalProgressBarText'); - - function update_chart(idx) { - var state = NETDATA.options.targets[--idx]; - - var pcent = (NETDATA.options.targets.length - idx) * 100 / NETDATA.options.targets.length; - $(el).css('width', pcent + '%').attr('aria-valuenow', pcent); - eltxt.innerText = Math.round(pcent).toString() + '%, ' + state.id; - - setTimeout(function () { - state.updateChart(function () { - NETDATA.options.targets[idx].resizeForPrint(); - - if (idx > 0) { - update_chart(idx); - } else { - print_is_rendering = false; - $('#printModal').modal('hide'); - window.print(); - window.close(); - } - }) - }, 0); - } - - print_is_rendering = true; - update_chart(NETDATA.options.targets.length); - }); - - $('#printModal').modal('show'); -} - -// -------------------------------------------------------------------- - -function jsonStringifyFn(obj) { - return JSON.stringify(obj, function (key, value) { - return (typeof value === 'function') ? value.toString() : value; - }); -} - -function jsonParseFn(str) { - return JSON.parse(str, function (key, value) { - if (typeof value != 'string') { - return value; - } - return (value.substring(0, 8) == 'function') ? eval('(' + value + ')') : value; - }); -} - -// -------------------------------------------------------------------- - -var snapshotOptions = { - bytes_per_chart: 2048, - compressionDefault: 'pako.deflate.base64', - - compressions: { - 'none': { - bytes_per_point_memory: 5.2, - bytes_per_point_disk: 5.6, - - compress: function (s) { - return s; - }, - - compressed_length: function (s) { - return s.length; - }, - - uncompress: function (s) { - return s; - } - }, - - 'pako.deflate.base64': { - bytes_per_point_memory: 1.8, - bytes_per_point_disk: 1.9, - - compress: function (s) { - return btoa(pako.deflate(s, { to: 'string' })); - }, - - compressed_length: function (s) { - return s.length; - }, - - uncompress: function (s) { - return pako.inflate(atob(s), { to: 'string' }); - } - }, - - 'pako.deflate': { - bytes_per_point_memory: 1.4, - bytes_per_point_disk: 3.2, - - compress: function (s) { - return pako.deflate(s, { to: 'string' }); - }, - - compressed_length: function (s) { - return s.length; - }, - - uncompress: function (s) { - return pako.inflate(s, { to: 'string' }); - } - }, - - 'lzstring.utf16': { - bytes_per_point_memory: 1.7, - bytes_per_point_disk: 2.6, - - compress: function (s) { - return LZString.compressToUTF16(s); - }, - - compressed_length: function (s) { - return s.length * 2; - }, - - uncompress: function (s) { - return LZString.decompressFromUTF16(s); - } - }, - - 'lzstring.base64': { - bytes_per_point_memory: 2.1, - bytes_per_point_disk: 2.3, - - compress: function (s) { - return LZString.compressToBase64(s); - }, - - compressed_length: function (s) { - return s.length; - }, - - uncompress: function (s) { - return LZString.decompressFromBase64(s); - } - }, - - 'lzstring.uri': { - bytes_per_point_memory: 2.1, - bytes_per_point_disk: 2.3, - - compress: function (s) { - return LZString.compressToEncodedURIComponent(s); - }, - - compressed_length: function (s) { - return s.length; - }, - - uncompress: function (s) { - return LZString.decompressFromEncodedURIComponent(s); - } - } - } -}; - -// -------------------------------------------------------------------- -// loading snapshots - -function loadSnapshotModalLog(priority, msg) { - document.getElementById('loadSnapshotStatus').className = "alert alert-" + priority; - document.getElementById('loadSnapshotStatus').innerHTML = msg; -} - -var tmpSnapshotData = null; - -function loadSnapshot() { - $('#loadSnapshotImport').addClass('disabled'); - - if (tmpSnapshotData === null) { - loadSnapshotPreflightEmpty(); - loadSnapshotModalLog('danger', 'no data have been loaded'); - return; - } - - loadPako(function () { - loadLzString(function () { - loadSnapshotModalLog('info', 'Please wait, activating snapshot...'); - $('#loadSnapshotModal').modal('hide'); - - netdataShowAlarms = false; - netdataRegistry = false; - netdataServer = tmpSnapshotData.server; - NETDATA.serverDefault = netdataServer; - - document.getElementById('charts_div').innerHTML = ''; - document.getElementById('sidebar').innerHTML = ''; - NETDATA.globalReset(); - - if (typeof tmpSnapshotData.hash !== 'undefined') { - urlOptions.hash = tmpSnapshotData.hash; - } else { - urlOptions.hash = '#'; - } - - if (typeof tmpSnapshotData.info !== 'undefined') { - var info = jsonParseFn(tmpSnapshotData.info); - if (typeof info.menu !== 'undefined') { - netdataDashboard.menu = info.menu; - } - - if (typeof info.submenu !== 'undefined') { - netdataDashboard.submenu = info.submenu; - } - - if (typeof info.context !== 'undefined') { - netdataDashboard.context = info.context; - } - } - - if (typeof tmpSnapshotData.compression !== 'string') { - tmpSnapshotData.compression = 'none'; - } - - if (typeof snapshotOptions.compressions[tmpSnapshotData.compression] === 'undefined') { - alert('unknown compression method: ' + tmpSnapshotData.compression); - tmpSnapshotData.compression = 'none'; - } - - tmpSnapshotData.uncompress = snapshotOptions.compressions[tmpSnapshotData.compression].uncompress; - netdataSnapshotData = tmpSnapshotData; - - urlOptions.after = tmpSnapshotData.after_ms; - urlOptions.before = tmpSnapshotData.before_ms; - - if (typeof tmpSnapshotData.highlight_after_ms !== 'undefined' - && tmpSnapshotData.highlight_after_ms !== null - && tmpSnapshotData.highlight_after_ms > 0 - && typeof tmpSnapshotData.highlight_before_ms !== 'undefined' - && tmpSnapshotData.highlight_before_ms !== null - && tmpSnapshotData.highlight_before_ms > 0 - ) { - urlOptions.highlight_after = tmpSnapshotData.highlight_after_ms; - urlOptions.highlight_before = tmpSnapshotData.highlight_before_ms; - urlOptions.highlight = true; - } else { - urlOptions.highlight_after = 0; - urlOptions.highlight_before = 0; - urlOptions.highlight = false; - } - - netdataCheckXSS = false; // disable the modal - this does not affect XSS checks, since dashboard.js is already loaded - NETDATA.xss.enabled = true; // we should not do any remote requests, but if we do, check them - NETDATA.xss.enabled_for_data = true; // check also snapshot data - that have been excluded from the initial check, due to compression - loadSnapshotPreflightEmpty(); - initializeDynamicDashboard(); - }); - }); -}; - -function loadSnapshotPreflightFile(file) { - var filename = NETDATA.xss.string(file.name); - var fr = new FileReader(); - fr.onload = function (e) { - document.getElementById('loadSnapshotFilename').innerHTML = filename; - var result = null; - try { - result = NETDATA.xss.checkAlways('snapshot', JSON.parse(e.target.result), /^(snapshot\.info|snapshot\.data)$/); - - //console.log(result); - var date_after = new Date(result.after_ms); - var date_before = new Date(result.before_ms); - - if (typeof result.charts_ok === 'undefined') { - result.charts_ok = 'unknown'; - } - - if (typeof result.charts_failed === 'undefined') { - result.charts_failed = 0; - } - - if (typeof result.compression === 'undefined') { - result.compression = 'none'; - } - - if (typeof result.data_size === 'undefined') { - result.data_size = 0; - } - - document.getElementById('loadSnapshotFilename').innerHTML = '' + filename + ''; - document.getElementById('loadSnapshotHostname').innerHTML = '' + result.hostname + ', netdata version: ' + result.netdata_version.toString() + ''; - document.getElementById('loadSnapshotURL').innerHTML = result.url; - document.getElementById('loadSnapshotCharts').innerHTML = result.charts.charts_count.toString() + ' charts, ' + result.charts.dimensions_count.toString() + ' dimensions, ' + result.data_points.toString() + ' points per dimension, ' + Math.round(result.duration_ms / result.data_points).toString() + ' ms per point'; - document.getElementById('loadSnapshotInfo').innerHTML = 'version: ' + result.snapshot_version.toString() + ', includes ' + result.charts_ok.toString() + ' unique chart data queries ' + ((result.charts_failed > 0) ? ('' + result.charts_failed.toString() + ' failed') : '').toString() + ', compressed with ' + result.compression.toString() + ', data size ' + (Math.round(result.data_size * 100 / 1024 / 1024) / 100).toString() + ' MB'; - document.getElementById('loadSnapshotTimeRange').innerHTML = '' + NETDATA.dateTime.localeDateString(date_after) + ' ' + NETDATA.dateTime.localeTimeString(date_after) + ' to ' + NETDATA.dateTime.localeDateString(date_before) + ' ' + NETDATA.dateTime.localeTimeString(date_before) + ''; - document.getElementById('loadSnapshotComments').innerHTML = ((result.comments) ? result.comments : '').toString(); - loadSnapshotModalLog('success', 'File loaded, click Import to render it!'); - $('#loadSnapshotImport').removeClass('disabled'); - - tmpSnapshotData = result; - } - catch (e) { - console.log(e); - document.getElementById('loadSnapshotStatus').className = "alert alert-danger"; - document.getElementById('loadSnapshotStatus').innerHTML = "Failed to parse this file!"; - $('#loadSnapshotImport').addClass('disabled'); - } - } - - //console.log(file); - fr.readAsText(file); -}; - -function loadSnapshotPreflightEmpty() { - document.getElementById('loadSnapshotFilename').innerHTML = ''; - document.getElementById('loadSnapshotHostname').innerHTML = ''; - document.getElementById('loadSnapshotURL').innerHTML = ''; - document.getElementById('loadSnapshotCharts').innerHTML = ''; - document.getElementById('loadSnapshotInfo').innerHTML = ''; - document.getElementById('loadSnapshotTimeRange').innerHTML = ''; - document.getElementById('loadSnapshotComments').innerHTML = ''; - loadSnapshotModalLog('success', 'Browse for a snapshot file (or drag it and drop it here), then click Import to render it.'); - $('#loadSnapshotImport').addClass('disabled'); -}; - -var loadSnapshotDragAndDropInitialized = false; - -function loadSnapshotDragAndDropSetup() { - if (loadSnapshotDragAndDropInitialized === false) { - loadSnapshotDragAndDropInitialized = true; - $('#loadSnapshotDragAndDrop') - .on('drag dragstart dragend dragover dragenter dragleave drop', function (e) { - e.preventDefault(); - e.stopPropagation(); - }) - .on('drop', function (e) { - if (e.originalEvent.dataTransfer.files.length) { - loadSnapshotPreflightFile(e.originalEvent.dataTransfer.files.item(0)); - } else { - loadSnapshotPreflightEmpty(); - loadSnapshotModalLog('danger', 'No file selected'); - } - }); - } -}; - -function loadSnapshotPreflight() { - var files = document.getElementById('loadSnapshotSelectFiles').files; - if (files.length <= 0) { - loadSnapshotPreflightEmpty(); - loadSnapshotModalLog('danger', 'No file selected'); - return; - } - - loadSnapshotModalLog('info', 'Loading file...'); - - loadSnapshotPreflightFile(files.item(0)); -} - -// -------------------------------------------------------------------- -// saving snapshots - -var saveSnapshotStop = false; - -function saveSnapshotCancel() { - saveSnapshotStop = true; -} - -var saveSnapshotModalInitialized = false; - -function saveSnapshotModalSetup() { - if (saveSnapshotModalInitialized === false) { - saveSnapshotModalInitialized = true; - $('#saveSnapshotModal') - .on('hide.bs.modal', saveSnapshotCancel) - .on('show.bs.modal', saveSnapshotModalInit) - .on('shown.bs.modal', function () { - $('#saveSnapshotResolutionSlider').find(".slider-handle:first").attr("tabindex", 1); - document.getElementById('saveSnapshotComments').focus(); - }); - } -}; - -function saveSnapshotModalLog(priority, msg) { - document.getElementById('saveSnapshotStatus').className = "alert alert-" + priority; - document.getElementById('saveSnapshotStatus').innerHTML = msg; -} - -function saveSnapshotModalShowExpectedSize() { - var points = Math.round(saveSnapshotViewDuration / saveSnapshotSelectedSecondsPerPoint); - var priority = 'info'; - var msg = 'A moderate snapshot.'; - - var sizemb = Math.round( - (options.data.charts_count * snapshotOptions.bytes_per_chart - + options.data.dimensions_count * points * snapshotOptions.compressions[saveSnapshotCompression].bytes_per_point_disk) - * 10 / 1024 / 1024) / 10; - - var memmb = Math.round( - (options.data.charts_count * snapshotOptions.bytes_per_chart - + options.data.dimensions_count * points * snapshotOptions.compressions[saveSnapshotCompression].bytes_per_point_memory) - * 10 / 1024 / 1024) / 10; - - if (sizemb < 10) { - priority = 'success'; - msg = 'A nice small snapshot!'; - } - if (sizemb > 50) { - priority = 'warning'; - msg = 'Will stress your browser...'; - } - if (sizemb > 100) { - priority = 'danger'; - msg = 'Hm... good luck...'; - } - - saveSnapshotModalLog(priority, 'The snapshot will have ' + points.toString() + ' points per dimension. Expected size on disk ' + sizemb + ' MB, at browser memory ' + memmb + ' MB.
' + msg); -} - -var saveSnapshotCompression = snapshotOptions.compressionDefault; - -function saveSnapshotSetCompression(name) { - saveSnapshotCompression = name; - document.getElementById('saveSnapshotCompressionName').innerHTML = saveSnapshotCompression; - saveSnapshotModalShowExpectedSize(); -} - -var saveSnapshotSlider = null; -var saveSnapshotSelectedSecondsPerPoint = 1; -var saveSnapshotViewDuration = 1; - -function saveSnapshotModalInit() { - $('#saveSnapshotModalProgressSection').hide(); - $('#saveSnapshotResolutionRadio').show(); - saveSnapshotModalLog('info', 'Select resolution and click Save'); - $('#saveSnapshotExport').removeClass('disabled'); - - loadBootstrapSlider(function () { - saveSnapshotViewDuration = options.duration; - var start_ms = Math.round(Date.now() - saveSnapshotViewDuration * 1000); - - if (NETDATA.globalPanAndZoom.isActive() === true) { - saveSnapshotViewDuration = Math.round((NETDATA.globalPanAndZoom.force_before_ms - NETDATA.globalPanAndZoom.force_after_ms) / 1000); - start_ms = NETDATA.globalPanAndZoom.force_after_ms; - } - - var start_date = new Date(start_ms); - var yyyymmddhhssmm = start_date.getFullYear() + NETDATA.zeropad(start_date.getMonth() + 1) + NETDATA.zeropad(start_date.getDate()) + '-' + NETDATA.zeropad(start_date.getHours()) + NETDATA.zeropad(start_date.getMinutes()) + NETDATA.zeropad(start_date.getSeconds()); - - document.getElementById('saveSnapshotFilename').value = 'netdata-' + options.hostname.toString() + '-' + yyyymmddhhssmm.toString() + '-' + saveSnapshotViewDuration.toString() + '.snapshot'; - saveSnapshotSetCompression(saveSnapshotCompression); - - var min = options.update_every; - var max = Math.round(saveSnapshotViewDuration / 100); - - if (NETDATA.globalPanAndZoom.isActive() === false) { - max = Math.round(saveSnapshotViewDuration / 50); - } - - var view = Math.round(saveSnapshotViewDuration / Math.round($(document.getElementById('charts_div')).width() / 2)); - - // console.log('view duration: ' + saveSnapshotViewDuration + ', min: ' + min + ', max: ' + max + ', view: ' + view); - - if (max < 10) { - max = 10; - } - if (max < min) { - max = min; - } - if (view < min) { - view = min; - } - if (view > max) { - view = max; - } - - if (saveSnapshotSlider !== null) { - saveSnapshotSlider.destroy(); - } - - saveSnapshotSlider = new Slider('#saveSnapshotResolutionSlider', { - ticks: [min, view, max], - min: min, - max: max, - step: options.update_every, - value: view, - scale: (max > 100) ? 'logarithmic' : 'linear', - tooltip: 'always', - formatter: function (value) { - if (value < 1) { - value = 1; - } - - if (value < options.data.update_every) { - value = options.data.update_every; - } - - saveSnapshotSelectedSecondsPerPoint = value; - saveSnapshotModalShowExpectedSize(); - - var seconds = ' seconds '; - if (value === 1) { - seconds = ' second '; - } - - return value + seconds + 'per point' + ((value === options.data.update_every) ? ', server default' : '').toString(); - } - }); - }); -} - -function saveSnapshot() { - loadPako(function () { - loadLzString(function () { - saveSnapshotStop = false; - $('#saveSnapshotModalProgressSection').show(); - $('#saveSnapshotResolutionRadio').hide(); - $('#saveSnapshotExport').addClass('disabled'); - - var filename = document.getElementById('saveSnapshotFilename').value; - // console.log(filename); - saveSnapshotModalLog('info', 'Generating snapshot as ' + filename.toString() + ''); - - var save_options = { - stop_updates_when_focus_is_lost: false, - update_only_visible: false, - sync_selection: false, - eliminate_zero_dimensions: true, - pan_and_zoom_data_padding: false, - show_help: false, - legend_toolbox: false, - resize_charts: false, - pixels_per_point: 1 - }; - var backedup_options = {}; - - var x; - for (x in save_options) { - if (save_options.hasOwnProperty(x)) { - backedup_options[x] = NETDATA.options.current[x]; - NETDATA.options.current[x] = save_options[x]; - } - } - - var el = document.getElementById('saveSnapshotModalProgressBar'); - var eltxt = document.getElementById('saveSnapshotModalProgressBarText'); - - options.data.charts_by_name = null; - - var saveData = { - hostname: options.hostname, - server: NETDATA.serverDefault, - netdata_version: options.data.version, - snapshot_version: 1, - after_ms: Date.now() - options.duration * 1000, - before_ms: Date.now(), - highlight_after_ms: urlOptions.highlight_after, - highlight_before_ms: urlOptions.highlight_before, - duration_ms: options.duration * 1000, - update_every_ms: options.update_every * 1000, - data_points: 0, - url: ((urlOptions.server !== null) ? urlOptions.server : document.location.origin.toString() + document.location.pathname.toString() + document.location.search.toString()).toString(), - comments: document.getElementById('saveSnapshotComments').value.toString(), - hash: urlOptions.hash, - charts: options.data, - info: jsonStringifyFn({ - menu: netdataDashboard.menu, - submenu: netdataDashboard.submenu, - context: netdataDashboard.context - }), - charts_ok: 0, - charts_failed: 0, - compression: saveSnapshotCompression, - data_size: 0, - data: {} - }; - - if (typeof snapshotOptions.compressions[saveData.compression] === 'undefined') { - alert('unknown compression method: ' + saveData.compression); - saveData.compression = 'none'; - } - - var compress = snapshotOptions.compressions[saveData.compression].compress; - var compressed_length = snapshotOptions.compressions[saveData.compression].compressed_length; - - function pack_api1_v1_chart_data(state) { - if (state.library_name === null || state.data === null) { - return; - } - - var data = state.data; - state.data = null; - data.state = null; - var str = JSON.stringify(data); - - if (typeof str === 'string') { - var cstr = compress(str); - saveData.data[state.chartDataUniqueID()] = cstr; - return compressed_length(cstr); - } else { - return 0; - } - } - - var clearPanAndZoom = false; - if (NETDATA.globalPanAndZoom.isActive() === false) { - NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], saveData.after_ms, saveData.before_ms); - clearPanAndZoom = true; - } - - saveData.after_ms = NETDATA.globalPanAndZoom.force_after_ms; - saveData.before_ms = NETDATA.globalPanAndZoom.force_before_ms; - saveData.duration_ms = saveData.before_ms - saveData.after_ms; - saveData.data_points = Math.round((saveData.before_ms - saveData.after_ms) / (saveSnapshotSelectedSecondsPerPoint * 1000)); - saveSnapshotModalLog('info', 'Generating snapshot with ' + saveData.data_points.toString() + ' data points per dimension...'); - - var charts_count = 0; - var charts_ok = 0; - var charts_failed = 0; - - function saveSnapshotRestore() { - $('#saveSnapshotModal').modal('hide'); - - // restore the options - var x; - for (x in backedup_options) { - if (backedup_options.hasOwnProperty(x)) { - NETDATA.options.current[x] = backedup_options[x]; - } - } - - $(el).css('width', '0%').attr('aria-valuenow', 0); - eltxt.innerText = '0%'; - - if (clearPanAndZoom) { - NETDATA.globalPanAndZoom.clearMaster(); - } - - NETDATA.options.force_data_points = 0; - NETDATA.options.fake_chart_rendering = false; - NETDATA.onscroll_updater_enabled = true; - NETDATA.onresize(); - NETDATA.unpause(); - - $('#saveSnapshotExport').removeClass('disabled'); - } - - NETDATA.globalSelectionSync.stop(); - NETDATA.options.force_data_points = saveData.data_points; - NETDATA.options.fake_chart_rendering = true; - NETDATA.onscroll_updater_enabled = false; - NETDATA.abortAllRefreshes(); - - var size = 0; - var info = ' Resolution: ' + saveSnapshotSelectedSecondsPerPoint.toString() + ((saveSnapshotSelectedSecondsPerPoint === 1) ? ' second ' : ' seconds ').toString() + 'per point.'; - - function update_chart(idx) { - if (saveSnapshotStop === true) { - saveSnapshotModalLog('info', 'Cancelled!'); - saveSnapshotRestore(); - return; - } - - var state = NETDATA.options.targets[--idx]; - - var pcent = (NETDATA.options.targets.length - idx) * 100 / NETDATA.options.targets.length; - $(el).css('width', pcent + '%').attr('aria-valuenow', pcent); - eltxt.innerText = Math.round(pcent).toString() + '%, ' + state.id; - - setTimeout(function () { - charts_count++; - state.isVisible(true); - state.current.force_after_ms = saveData.after_ms; - state.current.force_before_ms = saveData.before_ms; - - state.updateChart(function (status, reason) { - state.current.force_after_ms = null; - state.current.force_before_ms = null; - - if (status === true) { - charts_ok++; - // state.log('ok'); - size += pack_api1_v1_chart_data(state); - } else { - charts_failed++; - state.log('failed to be updated: ' + reason); - } - - saveSnapshotModalLog((charts_failed) ? 'danger' : 'info', 'Generated snapshot data size ' + (Math.round(size * 100 / 1024 / 1024) / 100).toString() + ' MB. ' + ((charts_failed) ? (charts_failed.toString() + ' charts have failed to be downloaded') : '').toString() + info); - - if (idx > 0) { - update_chart(idx); - } else { - saveData.charts_ok = charts_ok; - saveData.charts_failed = charts_failed; - saveData.data_size = size; - // console.log(saveData.compression + ': ' + (size / (options.data.dimensions_count * Math.round(saveSnapshotViewDuration / saveSnapshotSelectedSecondsPerPoint))).toString()); - - // save it - // console.log(saveData); - saveObjectToClient(saveData, filename); - - if (charts_failed > 0) { - alert(charts_failed.toString() + ' failed to be downloaded'); - } - - saveSnapshotRestore(); - saveData = null; - } - }) - }, 0); - } - - update_chart(NETDATA.options.targets.length); - }); - }); -} - -// -------------------------------------------------------------------- -// activate netdata on the page - -function dashboardSettingsSetup() { - var update_options_modal = function () { - // console.log('update_options_modal'); - - var sync_option = function (option) { - var self = $('#' + option); - - if (self.prop('checked') !== NETDATA.getOption(option)) { - // console.log('switching ' + option.toString()); - self.bootstrapToggle(NETDATA.getOption(option) ? 'on' : 'off'); - } - }; - - var theme_sync_option = function (option) { - var self = $('#' + option); - - self.bootstrapToggle(netdataTheme === 'slate' ? 'on' : 'off'); - }; - var units_sync_option = function (option) { - var self = $('#' + option); - - if (self.prop('checked') !== (NETDATA.getOption('units') === 'auto')) { - self.bootstrapToggle(NETDATA.getOption('units') === 'auto' ? 'on' : 'off'); - } - - if (self.prop('checked') === true) { - $('#settingsLocaleTempRow').show(); - $('#settingsLocaleTimeRow').show(); - } else { - $('#settingsLocaleTempRow').hide(); - $('#settingsLocaleTimeRow').hide(); - } - }; - var temp_sync_option = function (option) { - var self = $('#' + option); - - if (self.prop('checked') !== (NETDATA.getOption('temperature') === 'celsius')) { - self.bootstrapToggle(NETDATA.getOption('temperature') === 'celsius' ? 'on' : 'off'); - } - }; - var timezone_sync_option = function (option) { - var self = $('#' + option); - - document.getElementById('browser_timezone').innerText = NETDATA.options.browser_timezone; - document.getElementById('server_timezone').innerText = NETDATA.options.server_timezone; - document.getElementById('current_timezone').innerText = (NETDATA.options.current.timezone === 'default') ? 'unset, using browser default' : NETDATA.options.current.timezone; - - if (self.prop('checked') === NETDATA.dateTime.using_timezone) { - self.bootstrapToggle(NETDATA.dateTime.using_timezone ? 'off' : 'on'); - } - }; - - sync_option('eliminate_zero_dimensions'); - sync_option('destroy_on_hide'); - sync_option('async_on_scroll'); - sync_option('parallel_refresher'); - sync_option('concurrent_refreshes'); - sync_option('sync_selection'); - sync_option('sync_pan_and_zoom'); - sync_option('stop_updates_when_focus_is_lost'); - sync_option('smooth_plot'); - sync_option('pan_and_zoom_data_padding'); - sync_option('show_help'); - sync_option('seconds_as_time'); - theme_sync_option('netdata_theme_control'); - units_sync_option('units_conversion'); - temp_sync_option('units_temp'); - timezone_sync_option('local_timezone'); - - if (NETDATA.getOption('parallel_refresher') === false) { - $('#concurrent_refreshes_row').hide(); - } else { - $('#concurrent_refreshes_row').show(); - } - }; - NETDATA.setOption('setOptionCallback', update_options_modal); - - // handle options changes - $('#eliminate_zero_dimensions').change(function () { - NETDATA.setOption('eliminate_zero_dimensions', $(this).prop('checked')); - }); - $('#destroy_on_hide').change(function () { - NETDATA.setOption('destroy_on_hide', $(this).prop('checked')); - }); - $('#async_on_scroll').change(function () { - NETDATA.setOption('async_on_scroll', $(this).prop('checked')); - }); - $('#parallel_refresher').change(function () { - NETDATA.setOption('parallel_refresher', $(this).prop('checked')); - }); - $('#concurrent_refreshes').change(function () { - NETDATA.setOption('concurrent_refreshes', $(this).prop('checked')); - }); - $('#sync_selection').change(function () { - NETDATA.setOption('sync_selection', $(this).prop('checked')); - }); - $('#sync_pan_and_zoom').change(function () { - NETDATA.setOption('sync_pan_and_zoom', $(this).prop('checked')); - }); - $('#stop_updates_when_focus_is_lost').change(function () { - urlOptions.update_always = !$(this).prop('checked'); - urlOptions.hashUpdate(); - - NETDATA.setOption('stop_updates_when_focus_is_lost', !urlOptions.update_always); - }); - $('#smooth_plot').change(function () { - NETDATA.setOption('smooth_plot', $(this).prop('checked')); - }); - $('#pan_and_zoom_data_padding').change(function () { - NETDATA.setOption('pan_and_zoom_data_padding', $(this).prop('checked')); - }); - $('#seconds_as_time').change(function () { - NETDATA.setOption('seconds_as_time', $(this).prop('checked')); - }); - $('#local_timezone').change(function () { - if ($(this).prop('checked')) { - selected_server_timezone('default', true); - } else { - selected_server_timezone('default', false); - } - }); - - $('#units_conversion').change(function () { - NETDATA.setOption('units', $(this).prop('checked') ? 'auto' : 'original'); - }); - $('#units_temp').change(function () { - NETDATA.setOption('temperature', $(this).prop('checked') ? 'celsius' : 'fahrenheit'); - }); - - $('#show_help').change(function () { - urlOptions.help = $(this).prop('checked'); - urlOptions.hashUpdate(); - - NETDATA.setOption('show_help', urlOptions.help); - netdataReload(); - }); - - // this has to be the last - // it reloads the page - $('#netdata_theme_control').change(function () { - urlOptions.theme = $(this).prop('checked') ? 'slate' : 'white'; - urlOptions.hashUpdate(); - - if (setTheme(urlOptions.theme)) { - netdataReload(); - } - }); -} - -function scrollDashboardTo() { - if (netdataSnapshotData !== null && typeof netdataSnapshotData.hash !== 'undefined') { - //console.log(netdataSnapshotData.hash); - scrollToId(netdataSnapshotData.hash.replace('#', '')); - } else { - // check if we have to jump to a specific section - scrollToId(urlOptions.hash.replace('#', '')); - - if (urlOptions.chart !== null) { - NETDATA.alarms.scrollToChart(urlOptions.chart); - //urlOptions.hash = '#' + NETDATA.name2id('menu_' + charts[c].menu + '_submenu_' + charts[c].submenu); - //urlOptions.hash = '#chart_' + NETDATA.name2id(urlOptions.chart); - //console.log('hash = ' + urlOptions.hash); - } - } -} - -var modalHiddenCallback = null; - -function scrollToChartAfterHidingModal(chart, alarmDate, alarmStatus) { - modalHiddenCallback = function () { - NETDATA.alarms.scrollToChart(chart, alarmDate); - - if (['WARNING', 'CRITICAL'].includes(alarmStatus)) { - const currentChartState = NETDATA.options.targets.find( - (chartState) => chartState.id === chart, - ) - const twoMinutes = 2 * 60 * 1000 - NETDATA.globalPanAndZoom.setMaster( - currentChartState, - alarmDate - twoMinutes, - alarmDate + twoMinutes, - ) - } - }; -} - -// ---------------------------------------------------------------------------- - -function enableTooltipsAndPopovers() { - $('[data-toggle="tooltip"]').tooltip({ - animated: 'fade', - trigger: 'hover', - html: true, - delay: { show: 500, hide: 0 }, - container: 'body' - }); - $('[data-toggle="popover"]').popover(); -} - -// ---------------------------------------------------------------------------- - -var runOnceOnDashboardLastRun = 0; - -function runOnceOnDashboardWithjQuery() { - if (runOnceOnDashboardLastRun !== 0) { - scrollDashboardTo(); - - // restore the scrollspy at the proper position - $(document.body).scrollspy('refresh'); - $(document.body).scrollspy('process'); - - return; - } - - runOnceOnDashboardLastRun = Date.now(); - - // ------------------------------------------------------------------------ - // bootstrap modals - - // prevent bootstrap modals from scrolling the page - // maintains the current scroll position - // https://stackoverflow.com/a/34754029/4525767 - - var scrollPos = 0; - var modal_depth = 0; // how many modals are currently open - var modal_shown = false; // set to true, if a modal is shown - var netdata_paused_on_modal = false; // set to true, if the modal paused netdata - var scrollspyOffset = $(window).height() / 3; // will be updated below - the offset of scrollspy to select an item - - $('.modal') - .on('show.bs.modal', function () { - if (modal_depth === 0) { - scrollPos = window.scrollY; - - $('body').css({ - overflow: 'hidden', - position: 'fixed', - top: -scrollPos - }); - - modal_shown = true; - - if (NETDATA.options.pauseCallback === null) { - NETDATA.pause(function () { - }); - netdata_paused_on_modal = true; - } else { - netdata_paused_on_modal = false; - } - } - - modal_depth++; - //console.log(urlOptions.after); - - }) - .on('hide.bs.modal', function () { - - modal_depth--; - - if (modal_depth <= 0) { - modal_depth = 0; - - $('body') - .css({ - overflow: '', - position: '', - top: '' - }); - - // scroll to the position we had open before the modal - $('html, body') - .animate({ scrollTop: scrollPos }, 0); - - // unpause netdata, if we paused it - if (netdata_paused_on_modal === true) { - NETDATA.unpause(); - netdata_paused_on_modal = false; - } - - // restore the scrollspy at the proper position - $(document.body).scrollspy('process'); - } - //console.log(urlOptions.after); - }) - .on('hidden.bs.modal', function () { - if (modal_depth === 0) { - modal_shown = false; - } - - if (typeof modalHiddenCallback === 'function') { - modalHiddenCallback(); - } - - modalHiddenCallback = null; - //console.log(urlOptions.after); - }); - - // ------------------------------------------------------------------------ - // sidebar / affix - - if (shouldShowSignInBanner()) { - const el = document.getElementById("sign-in-banner"); - if (el) { - el.style.display = "initial"; - el.classList.add(`theme-${netdataTheme}`); - } - } - - $('#sidebar') - .affix({ - offset: { - top: (isdemo()) ? 150 : 0, - bottom: 0 - } - }) - .on('affixed.bs.affix', function () { - // fix scrolling of very long affix lists - // http://stackoverflow.com/questions/21691585/bootstrap-3-1-0-affix-too-long - - $(this).removeAttr('style'); - }) - .on('affix-top.bs.affix', function () { - // fix bootstrap affix click bug - // https://stackoverflow.com/a/37847981/4525767 - - if (modal_shown) { - return false; - } - }) - .on('activate.bs.scrollspy', function (e) { - // change the URL based on the current position of the screen - - if (modal_shown === false) { - var el = $(e.target); - var hash = el.find('a').attr('href'); - if (typeof hash === 'string' && hash.substring(0, 1) === '#' && urlOptions.hash.startsWith(hash + '_submenu_') === false) { - urlOptions.hash = hash; - urlOptions.hashUpdate(); - } - } - }); - - Ps.initialize(document.getElementById('sidebar'), { - wheelSpeed: 0.5, - wheelPropagation: true, - swipePropagation: true, - minScrollbarLength: null, - maxScrollbarLength: null, - useBothWheelAxes: false, - suppressScrollX: true, - suppressScrollY: false, - scrollXMarginOffset: 0, - scrollYMarginOffset: 0, - theme: 'default' - }); - - // ------------------------------------------------------------------------ - // scrollspy - - if (scrollspyOffset > 250) { - scrollspyOffset = 250; - } - if (scrollspyOffset < 75) { - scrollspyOffset = 75; - } - document.body.setAttribute('data-offset', scrollspyOffset); - - // scroll the dashboard, before activating the scrollspy, so that our - // hash will not be updated before we got the chance to scroll to it - scrollDashboardTo(); - - $(document.body).scrollspy({ - target: '#sidebar', - offset: scrollspyOffset // controls the diff of the element to the top, to select it - }); - - // ------------------------------------------------------------------------ - // my-netdata menu - - Ps.initialize(document.getElementById('my-netdata-dropdown-content'), { - wheelSpeed: 1, - wheelPropagation: false, - swipePropagation: false, - minScrollbarLength: null, - maxScrollbarLength: null, - useBothWheelAxes: false, - suppressScrollX: true, - suppressScrollY: false, - scrollXMarginOffset: 0, - scrollYMarginOffset: 0, - theme: 'default' - }); - - $('#myNetdataDropdownParent') - .on('show.bs.dropdown', function () { - var hash = urlOptions.genHash(); - $('.registry_link').each(function (idx) { - this.setAttribute('href', this.getAttribute("href").replace(/#.*$/, hash)); - }); - - NETDATA.pause(function () { - }); - }) - .on('shown.bs.dropdown', function () { - Ps.update(document.getElementById('my-netdata-dropdown-content')); - myNetdataMenuDidShow(); - }) - .on('hidden.bs.dropdown', function () { - NETDATA.unpause(); - }); - - $('#deleteRegistryModal') - .on('hidden.bs.modal', function () { - deleteRegistryGuid = null; - }); - - // ------------------------------------------------------------------------ - // update modal - - $('#updateModal') - .on('show.bs.modal', function () { - versionLog('checking, please wait...'); - }) - .on('shown.bs.modal', function () { - notifyForUpdate(true); - }); - - // ------------------------------------------------------------------------ - // alarms modal - - $('#alarmsModal') - .on('shown.bs.modal', function () { - alarmsUpdateModal(); - }) - .on('hidden.bs.modal', function () { - document.getElementById('alarms_active').innerHTML = - document.getElementById('alarms_all').innerHTML = - document.getElementById('alarms_log').innerHTML = - 'loading...'; - }); - - // ------------------------------------------------------------------------ - - dashboardSettingsSetup(); - loadSnapshotDragAndDropSetup(); - saveSnapshotModalSetup(); - showPageFooter(); - - // ------------------------------------------------------------------------ - // https://github.com/viralpatel/jquery.shorten/blob/master/src/jquery.shorten.js - - $.fn.shorten = function (settings) { - "use strict"; - - var config = { - showChars: 750, - minHideChars: 10, - ellipsesText: "...", - moreText: ' show more information', - lessText: ' show less information', - onLess: function () { - NETDATA.onscroll(); - }, - onMore: function () { - NETDATA.onscroll(); - }, - errMsg: null, - force: false - }; - - if (settings) { - $.extend(config, settings); - } - - if ($(this).data('jquery.shorten') && !config.force) { - return false; - } - $(this).data('jquery.shorten', true); - - $(document).off("click", '.morelink'); - - $(document).on({ - click: function () { - - var $this = $(this); - if ($this.hasClass('less')) { - $this.removeClass('less'); - $this.html(config.moreText); - $this.parent().prev().animate({ 'height': '0' + '%' }, 0, function () { - $this.parent().prev().prev().show(); - }).hide(0, function () { - config.onLess(); - }); - } else { - $this.addClass('less'); - $this.html(config.lessText); - $this.parent().prev().animate({ 'height': '100' + '%' }, 0, function () { - $this.parent().prev().prev().hide(); - }).show(0, function () { - config.onMore(); - }); - } - return false; - } - }, '.morelink'); - - return this.each(function () { - var $this = $(this); - - var content = $this.html(); - var contentlen = $this.text().length; - if (contentlen > config.showChars + config.minHideChars) { - var c = content.substr(0, config.showChars); - if (c.indexOf('<') >= 0) // If there's HTML don't want to cut it - { - var inTag = false; // I'm in a tag? - var bag = ''; // Put the characters to be shown here - var countChars = 0; // Current bag size - var openTags = []; // Stack for opened tags, so I can close them later - var tagName = null; - - for (var i = 0, r = 0; r <= config.showChars; i++) { - if (content[i] === '<' && !inTag) { - inTag = true; - - // This could be "tag" or "/tag" - tagName = content.substring(i + 1, content.indexOf('>', i)); - - // If its a closing tag - if (tagName[0] === '/') { - - if (tagName !== ('/' + openTags[0])) { - config.errMsg = 'ERROR en HTML: the top of the stack should be the tag that closes'; - } else { - openTags.shift(); // Pops the last tag from the open tag stack (the tag is closed in the retult HTML!) - } - - } else { - // There are some nasty tags that don't have a close tag like
- if (tagName.toLowerCase() !== 'br') { - openTags.unshift(tagName); // Add to start the name of the tag that opens - } - } - } - - if (inTag && content[i] === '>') { - inTag = false; - } - - if (inTag) { - bag += content.charAt(i); - } else { - // Add tag name chars to the result - r++; - if (countChars <= config.showChars) { - bag += content.charAt(i); // Fix to ie 7 not allowing you to reference string characters using the [] - countChars++; - } else { - // Now I have the characters needed - if (openTags.length > 0) { - // I have unclosed tags - - //console.log('They were open tags'); - //console.log(openTags); - for (var j = 0; j < openTags.length; j++) { - //console.log('Cierro tag ' + openTags[j]); - bag += ''; // Close all tags that were opened - - // You could shift the tag from the stack to check if you end with an empty stack, that means you have closed all open tags - } - break; - } - } - } - } - c = $('
').html(bag + '' + config.ellipsesText + '').html(); - } else { - c += config.ellipsesText; - } - - var html = '
' + c + - '
' + content + - '
' + config.moreText + ''; - - $this.html(html); - $this.find(".allcontent").hide(); // Hide all text - $('.shortcontent p:last', $this).css('margin-bottom', 0); //Remove bottom margin on last paragraph as it's likely shortened - } - }); - }; -} - -function finalizePage() { - // resize all charts - without starting the background thread - // this has to be done while NETDATA is paused - // if we omit this, the affix menu will be wrong, since all - // the Dom elements are initially zero-sized - NETDATA.parseDom(); - - // ------------------------------------------------------------------------ - - NETDATA.globalPanAndZoom.callback = null; - NETDATA.globalChartUnderlay.callback = null; - - if (urlOptions.pan_and_zoom === true && NETDATA.options.targets.length > 0) { - NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], urlOptions.after, urlOptions.before); - } - - // callback for us to track PanAndZoom operations - NETDATA.globalPanAndZoom.callback = urlOptions.netdataPanAndZoomCallback; - NETDATA.globalChartUnderlay.callback = urlOptions.netdataHighlightCallback; - - // ------------------------------------------------------------------------ - - // let it run (update the charts) - NETDATA.unpause(); - - runOnceOnDashboardWithjQuery(); - $(".shorten").shorten(); - enableTooltipsAndPopovers(); - - if (isdemo()) { - // do not to give errors on netdata demo servers for 60 seconds - NETDATA.options.current.retries_on_data_failures = 60; - - // google analytics when this is used for the home page of the demo sites - // this does not run on user's installations - setTimeout(function () { - (function (i, s, o, g, r, a, m) { - i['GoogleAnalyticsObject'] = r; - i[r] = i[r] || function () { - (i[r].q = i[r].q || []).push(arguments) - }, i[r].l = 1 * new Date(); - a = s.createElement(o), - m = s.getElementsByTagName(o)[0]; - a.async = 1; - a.src = g; - m.parentNode.insertBefore(a, m) - })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); - - ga('create', 'UA-64295674-3', 'auto'); - ga('send', 'pageview', '/demosite/' + window.location.host); - }, 2000); - } else { - notifyForUpdate(); - } - - if (urlOptions.show_alarms === true) { - setTimeout(function () { - $('#alarmsModal').modal('show'); - }, 1000); - } - - NETDATA.onresizeCallback = function () { - Ps.update(document.getElementById('sidebar')); - Ps.update(document.getElementById('my-netdata-dropdown-content')); - }; - NETDATA.onresizeCallback(); - - if (netdataSnapshotData !== null) { - NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], netdataSnapshotData.after_ms, netdataSnapshotData.before_ms); - } - - //if (urlOptions.nowelcome !== true) { - // setTimeout(function () { - // $('#welcomeModal').modal(); - // }, 2000); - //} - - // var netdataEnded = performance.now(); - // console.log('start up time: ' + (netdataEnded - netdataStarted).toString() + ' ms'); -} - -function resetDashboardOptions() { - var help = NETDATA.options.current.show_help; - - NETDATA.resetOptions(); - if (setTheme('slate')) { - netdataReload(); - } - - if (help !== NETDATA.options.current.show_help) { - netdataReload(); - } -} - -// callback to add the dashboard info to the -// parallel javascript downloader in netdata -var netdataPrepCallback = function () { - NETDATA.requiredCSS.push({ - url: NETDATA.serverStatic + 'css/bootstrap-toggle-2.2.2.min.css', - isAlreadyLoaded: function () { - return false; - } - }); - - NETDATA.requiredJs.push({ - url: NETDATA.serverStatic + 'lib/bootstrap-toggle-2.2.2.min.js', - isAlreadyLoaded: function () { - return false; - } - }); - - NETDATA.requiredJs.push({ - url: NETDATA.serverStatic + 'dashboard_info.js?v20181019-1', - async: false, - isAlreadyLoaded: function () { - return false; - } - }); - - if (isdemo()) { - document.getElementById('masthead').style.display = 'block'; - } else { - if (urlOptions.update_always === true) { - NETDATA.setOption('stop_updates_when_focus_is_lost', !urlOptions.update_always); - } - } -}; - -var selected_server_timezone = function (timezone, status) { - //console.log('called with timezone: ' + timezone + ", status: " + ((typeof status === 'undefined')?'undefined':status).toString()); - - // clear the error - document.getElementById('timezone_error_message').innerHTML = ''; - - if (typeof status === 'undefined') { - // the user selected a timezone from the menu - - NETDATA.setOption('user_set_server_timezone', timezone); - - if (NETDATA.dateTime.init(timezone) === false) { - NETDATA.dateTime.init(); - - if (!$('#local_timezone').prop('checked')) { - $('#local_timezone').bootstrapToggle('on'); - } - - document.getElementById('timezone_error_message').innerHTML = 'Ooops! That timezone was not accepted by your browser. Please open a github issue to help us fix it.'; - NETDATA.setOption('user_set_server_timezone', NETDATA.options.server_timezone); - } else { - if ($('#local_timezone').prop('checked')) { - $('#local_timezone').bootstrapToggle('off'); - } - } - } else if (status === true) { - // the user wants the browser default timezone to be activated - - NETDATA.dateTime.init(); - } else { - // the user wants the server default timezone to be activated - //console.log('found ' + NETDATA.options.current.user_set_server_timezone); - - if (NETDATA.options.current.user_set_server_timezone === 'default') { - NETDATA.options.current.user_set_server_timezone = NETDATA.options.server_timezone; - } - - timezone = NETDATA.options.current.user_set_server_timezone; - - if (NETDATA.dateTime.init(timezone) === false) { - NETDATA.dateTime.init(); - - if (!$('#local_timezone').prop('checked')) { - $('#local_timezone').bootstrapToggle('on'); - } - - document.getElementById('timezone_error_message').innerHTML = 'Sorry. The timezone "' + timezone.toString() + '" is not accepted by your browser. Please select one from the list.'; - NETDATA.setOption('user_set_server_timezone', NETDATA.options.server_timezone); - } - } - - document.getElementById('current_timezone').innerText = (NETDATA.options.current.timezone === 'default') ? 'unset, using browser default' : NETDATA.options.current.timezone; - return false; -}; - -// our entry point -// var netdataStarted = performance.now(); - -var netdataCallback = initializeDynamicDashboard; - -// ================================================================================================= -// netdata.cloud - -let registryAgents = []; - -let cloudAgents = []; - -let myNetdataMenuFilterValue = ""; - -let cloudAccountID = null; - -let cloudAccountName = null; - -let cloudToken = null; - -/// Enforces a maximum string length while retaining the prefix and the postfix of -/// the string. -function truncateString(str, maxLength) { - if (str.length <= maxLength) { - return str; - } - - const spanLength = Math.floor((maxLength - 3) / 2); - return `${str.substring(0, spanLength)}...${str.substring(str.length - spanLength)}`; -} - -// ------------------------------------------------------------------------------------------------- -// netdata.cloud API Client -// ------------------------------------------------------------------------------------------------- - -function isValidAgent(a) { - return a.urls != null && a.urls.length > 0; -} - -// https://github.com/netdata/hub/issues/146 -function getCloudAccountAgents() { - if (!isSignedIn()) { - return []; - } - - return fetch( - `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents`, - { - method: "GET", - mode: "cors", - headers: { - "Authorization": `Bearer ${cloudToken}` - } - } - ).then((response) => { - if (!response.ok) { - throw Error("Cannot fetch known accounts"); - } - return response.json(); - }).then((payload) => { - const agents = payload.result ? payload.result.agents : null; - - if (!agents) { - return []; - } - - return agents.filter((a) => isValidAgent(a)).map((a) => { - return { - "guid": a.id, - "name": a.name, - "url": a.urls[0], - "alternate_urls": a.urls - } - }) - }).catch(function (error) { - console.log(error); - return null; - }); -} - -/** Updates the lastAccessTime and accessCount properties of the agent for the account. */ -function touchAgent() { - if (!isSignedIn()) { - return []; - } - - const touchUrl = `${NETDATA.registry.cloudBaseURL}/api/v1/agents/${NETDATA.registry.machine_guid}/touch?account_id=${cloudAccountID}`; - return fetch( - touchUrl, - { - method: "post", - body: "", - mode: "cors", - headers: { - "Authorization": `Bearer ${cloudToken}` - } - } - ).then((response) => { - if (!response.ok) { - throw Error("Cannot touch agent" + JSON.stringify(response)); - } - return response.json(); - }).then((payload) => { - - }).catch(function (error) { - console.log(error); - return null; - }); -} - -// https://github.com/netdata/hub/issues/128 -function postCloudAccountAgents(agentsToSync) { - if (!isSignedIn()) { - return []; - } - - const maskedURL = NETDATA.registry.MASKED_DATA; - - const agents = agentsToSync.map((a) => { - const urls = a.alternate_urls.filter((url) => url != maskedURL); - - return { - "id": a.guid, - "name": a.name, - "urls": urls - } - }).filter((a) => isValidAgent(a)) - - const payload = { - "accountID": cloudAccountID, - "agents": agents, - "merge": false, - }; - - return fetch( - `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents`, - { - method: "POST", - mode: "cors", - headers: { - "Content-Type": "application/json; charset=utf-8", - "Authorization": `Bearer ${cloudToken}` - }, - body: JSON.stringify(payload) - } - ).then((response) => { - return response.json(); - }).then((payload) => { - const agents = payload.result ? payload.result.agents : null; - - if (!agents) { - return []; - } - - return agents.filter((a) => isValidAgent(a)).map((a) => { - return { - "guid": a.id, - "name": a.name, - "url": a.urls[0], - "alternate_urls": a.urls - } - }) - }); -} - -function deleteCloudAgentURL(agentID, url) { - if (!isSignedIn()) { - return []; - } - - return fetch( - `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents/${agentID}/url?value=${encodeURIComponent(url)}`, - { - method: "DELETE", - mode: "cors", - headers: { - "Content-Type": "application/json; charset=utf-8", - "Authorization": `Bearer ${cloudToken}` - }, - } - ).then((response) => { - return response.json(); - }).then((payload) => { - const count = payload.result ? payload.result.count : 0; - return count; - }); -} - -// ------------------------------------------------------------------------------------------------- - -function signInDidClick(e) { - e.preventDefault(); - e.stopPropagation(); - - if (!NETDATA.registry.isUsingGlobalRegistry()) { - // If user is using a private registry, request his consent for - // synchronizing with cloud. - showSignInModal(); - return; - } - - signIn(); -} - -function shouldShowSignInBanner() { - return false; -} - -function closeSignInBanner() { - localStorage.setItem("signInBannerClosed", "true"); - const el = document.getElementById("sign-in-banner"); - if (el) { - el.style.display = "none"; - } -} - -function closeSignInBannerDidClick(e) { - closeSignInBanner(); -} - -function signOutDidClick(e) { - e.preventDefault(); - e.stopPropagation(); - signOut(); -} - -// ------------------------------------------------------------------------------------------------- - -function updateMyNetdataAfterFilterChange() { - const machinesEl = document.getElementById("my-netdata-menu-machines") - machinesEl.innerHTML = renderMachines(cloudAgents); - - if (options.hosts.length > 1) { - const streamedEl = document.getElementById("my-netdata-menu-streamed") - streamedEl.innerHTML = renderStreamedHosts(options); - } -} - -function myNetdataMenuDidShow() { - const filterEl = document.getElementById("my-netdata-menu-filter-input"); - if (filterEl) { - filterEl.focus(); - } -} - -function myNetdataFilterDidChange(e) { - const inputEl = e.target; - setTimeout(() => { - myNetdataMenuFilterValue = inputEl.value; - updateMyNetdataAfterFilterChange(); - }, 1); -} - -function myNetdataFilterClearDidClick(e) { - e.preventDefault(); - e.stopPropagation(); - - const inputEl = document.getElementById("my-netdata-menu-filter-input"); - inputEl.value = ""; - myNetdataMenuFilterValue = ""; - - updateMyNetdataAfterFilterChange(); - - inputEl.focus(); -} - -// ------------------------------------------------------------------------------------------------- - -function clearCloudVariables() { - cloudAccountID = null; - cloudAccountName = null; - cloudToken = null; -} - -function clearCloudLocalStorageItems() { - localStorage.removeItem("cloud.baseURL"); - localStorage.removeItem("cloud.agentID"); - localStorage.removeItem("cloud.sync"); -} - -function signIn() { - const url = `${NETDATA.registry.cloudBaseURL}/account/sign-in-agent?id=${NETDATA.registry.machine_guid}&name=${encodeURIComponent(NETDATA.registry.hostname)}&origin=${encodeURIComponent(window.location.origin + "/")}`; - window.open(url); -} - -function signOut() { - cloudSSOSignOut(); -} - -function handleMessage(e) { - switch (e.data.type) { - case "sign-in": - handleSignInMessage(e); - break; - - case "sign-out": - handleSignOutMessage(e); - break; - - default: - return; - } -} - -function handleSignInMessage(e) { - closeSignInBanner(); - localStorage.setItem("cloud.baseURL", NETDATA.registry.cloudBaseURL); - - cloudAccountID = e.data.accountID; - cloudAccountName = e.data.accountName; - cloudToken = e.data.token; - - netdataRegistryCallback(registryAgents); - if (e.data.redirectURI && !window.location.href.includes(e.data.redirectURI)) { - // lgtm false-positive - redirectURI does not come from user input, but from iframe callback - window.location.replace(e.data.redirectURI); // lgtm[js/client-side-unvalidated-url-redirection] - } -} - -function handleSignOutMessage(e) { - clearCloudVariables(); - renderMyNetdataMenu(registryAgents); -} - -function isSignedIn() { - return cloudToken != null && cloudAccountID != null; -} - -function sortedArraysEqual(a, b) { - if (a.length != b.length) return false; - - for (var i = 0; i < a.length; ++i) { - if (a[i] !== b[i]) return false; - } - - return true; -} - -// If merging is needed returns the merged agents set, otherwise returns null. -function mergeAgents(cloud, local) { - let dirty = false; - - const union = new Map(); - - for (const cagent of cloud) { - union.set(cagent.guid, cagent); - } - - for (const lagent of local) { - const cagent = union.get(lagent.guid); - if (cagent) { - for (const u of lagent.alternate_urls) { - if (u === NETDATA.registry.MASKED_DATA) { // TODO: temp until registry is updated. - continue; - } - - if (!cagent.alternate_urls.includes(u)) { - dirty = true; - cagent.alternate_urls.push(u); - } - } - } else { - dirty = true; - union.set(lagent.guid, lagent); - } - } - - if (dirty) { - return Array.from(union.values()); - } - - return null; -} - -function showSignInModal() { - document.getElementById("sim-registry").innerHTML = NETDATA.registry.server; - $("#signInModal").modal("show"); -} - -function explicitlySignIn() { - $("#signInModal").modal("hide"); - signIn(); -} - -function showSyncModal() { - document.getElementById("sync-registry-modal-registry").innerHTML = NETDATA.registry.server; - $("#syncRegistryModal").modal("show"); -} - -function explicitlySyncAgents() { - $("#syncRegistryModal").modal("hide"); - - const json = localStorage.getItem("cloud.sync"); - const sync = json ? JSON.parse(json) : {}; - delete sync[cloudAccountID]; - localStorage.setItem("cloud.sync", JSON.stringify(sync)); - - NETDATA.registry.init(); -} - -function syncAgents(callback) { - const json = localStorage.getItem("cloud.sync"); - const sync = json ? JSON.parse(json) : {}; - - const currentAgent = { - guid: NETDATA.registry.machine_guid, - name: NETDATA.registry.hostname, - url: NETDATA.serverDefault, - alternate_urls: [NETDATA.serverDefault], - } - - const localAgents = sync[cloudAccountID] - ? [currentAgent] - : registryAgents.concat([currentAgent]); - - console.log("Checking if sync is needed.", localAgents); - - const agentsToSync = mergeAgents(cloudAgents, localAgents); - - if ((!sync[cloudAccountID]) || agentsToSync) { - sync[cloudAccountID] = new Date().getTime(); - localStorage.setItem("cloud.sync", JSON.stringify(sync)); - } - - if (agentsToSync) { - console.log("Synchronizing with netdata.cloud."); - - postCloudAccountAgents(agentsToSync).then((agents) => { - // TODO: clear syncTime on error! - cloudAgents = agents; - callback(cloudAgents); - }); - - return - } - - callback(cloudAgents); -} - -let isCloudSSOInitialized = false; - -function cloudSSOInit() { - const iframeEl = document.getElementById("ssoifrm"); - const url = `${NETDATA.registry.cloudBaseURL}/account/sso-agent?id=${NETDATA.registry.machine_guid}`; - iframeEl.src = url; - isCloudSSOInitialized = true; -} - -function cloudSSOSignOut() { - const iframe = document.getElementById("ssoifrm"); - const url = `${NETDATA.registry.cloudBaseURL}/account/sign-out-agent`; - iframe.src = url; -} - -function initCloud() { - if (!NETDATA.registry.isCloudEnabled) { - clearCloudVariables(); - clearCloudLocalStorageItems(); - return; - } - - if (NETDATA.registry.cloudBaseURL != localStorage.getItem("cloud.baseURL")) { - clearCloudVariables(); - clearCloudLocalStorageItems(); - if (NETDATA.registry.cloudBaseURL) { - localStorage.setItem("cloud.baseURL", NETDATA.registry.cloudBaseURL); - } - } - - if (!isCloudSSOInitialized) { - cloudSSOInit(); - } - - touchAgent(); -} - -// This callback is called after NETDATA.registry is initialized. -function netdataRegistryCallback(machinesArray) { - localStorage.setItem("cloud.agentID", NETDATA.registry.machine_guid); - - initCloud(); - - registryAgents = machinesArray; - - if (isSignedIn()) { - // We call getCloudAccountAgents() here because it requires that - // NETDATA.registry is initialized. - clearMyNetdataMenu(); - getCloudAccountAgents().then((agents) => { - if (!agents) { - errorMyNetdataMenu(); - return; - } - cloudAgents = agents; - syncAgents((agents) => { - const agentsMap = {} - for (const agent of agents) { - agentsMap[agent.guid] = agent; - } - - NETDATA.registry.machines = agentsMap; - NETDATA.registry.machines_array = agents; - - renderMyNetdataMenu(agents); - }); - }); - } else { - renderMyNetdataMenu(machinesArray) - } -}; - -// If we know the cloudBaseURL and agentID from local storage render (eagerly) -// the account ui before receiving the definitive response from the web server. -// This improves the perceived performance. -function tryFastInitCloud() { - const baseURL = localStorage.getItem("cloud.baseURL"); - const agentID = localStorage.getItem("cloud.agentID"); - - if (baseURL && agentID) { - NETDATA.registry.cloudBaseURL = baseURL; - NETDATA.registry.machine_guid = agentID; - NETDATA.registry.isCloudEnabled = true; - - initCloud(); - } -} - -function initializeApp() { - window.addEventListener("message", handleMessage, false); - - // tryFastInitCloud(); -} - -if (document.readyState === "complete") { - initializeApp(); -} else { - document.addEventListener("readystatechange", () => { - if (document.readyState === "complete") { - initializeApp(); - } - }); -}