Compare commits

...
143 Commits
Author SHA1 Message Date
github-actions[bot] 26d174538f 🦄 Sync 2026-09-13 19:17:01
Merge-upstream / merge (push) Canceled after 0s
2026-09-13 19:17:01 +08:00
kiddin9 d9f7c5c117 Update upstream.yml 2026-09-13 19:15:00 +08:00
github-actions[bot] 7614ee5c63 💐 Sync 2026-09-13 10:49:47 2026-09-13 10:49:47 +08:00
github-actions[bot] 70d35bab31 🗽 Sync 2026-09-13 02:49:28
Merge-upstream / merge (push) Canceled after 0s
2026-09-13 02:49:28 +08:00
kiddin9 bdd9cea5d7 Update upstream.yml 2026-09-13 02:47:28 +08:00
github-actions[bot] 795028f9ea 💐 Sync 2026-09-13 00:41:32 2026-09-13 00:41:32 +08:00
github-actions[bot] cdcf288975 🎨 Sync 2026-09-12 22:40:36 2026-09-12 22:40:36 +08:00
kiddin9 83bcd4708f Update ssr-plus.patch 2026-09-12 22:38:23 +08:00
kiddin9 07891fa751 Update upstream.yml 2026-09-12 20:57:13 +08:00
github-actions[bot] 5f6047bcba 🗽 Sync 2026-09-12 10:51:28 2026-09-12 10:51:28 +08:00
github-actions[bot] f56e31d6d8 Sync 2026-09-12 01:28:05 2026-09-12 01:28:05 +08:00
github-actions[bot] 84e13cad49 Sync 2026-09-11 23:47:18 2026-09-11 23:47:18 +08:00
github-actions[bot] b5ce6b03b2 🎈 Sync 2026-09-11 10:41:59 2026-09-11 10:41:59 +08:00
github-actions[bot] 0ee799dbde 🍓 Sync 2026-09-11 01:35:11 2026-09-11 01:35:11 +08:00
github-actions[bot] 91e0df6c86 🐤 Sync 2026-09-10 23:45:40 2026-09-10 23:45:40 +08:00
github-actions[bot] d9c423b124 🌴 Sync 2026-09-10 18:27:49
Merge-upstream / merge (push) Canceled after 0s
2026-09-10 18:27:49 +08:00
kiddin9 bea159edee Update upstream.yml 2026-09-10 18:25:42 +08:00
github-actions[bot] 9dcc7b440b 💐 Sync 2026-09-10 18:21:54 2026-09-10 18:21:54 +08:00
kiddin9 e4a587bfc3 Update upstream.yml 2026-09-10 18:19:42 +08:00
github-actions[bot] 705f63c409 🗽 Sync 2026-09-10 18:16:50 2026-09-10 18:16:50 +08:00
kiddin9 e895da1d6b Update upstream.yml 2026-09-10 18:14:28 +08:00
github-actions[bot] 87517f518f 🐶 Sync 2026-09-10 17:05:24 2026-09-10 17:05:24 +08:00
github-actions[bot] ca30fdbbbb 🛸 Sync 2026-09-10 16:56:29 2026-09-10 16:56:29 +08:00
kiddin9 81d5757031 Update upstream.yml 2026-09-10 16:54:18 +08:00
github-actions[bot] 18bc066e07 🗽 Sync 2026-09-10 14:57:19 2026-09-10 14:57:19 +08:00
github-actions[bot] 7b0b16dcd4 💐 Sync 2026-09-10 14:49:21 2026-09-10 14:49:21 +08:00
kiddin9 0e9e9c2496 Update luci-app-passwall.patch 2026-09-10 14:47:22 +08:00
kiddin9 3a12ffbcad Delete .github/diy/patches/frp.patch 2026-09-10 14:34:37 +08:00
github-actions[bot] e45467bc23 🌴 Sync 2026-09-09 14:20:42 2026-09-09 14:20:42 +08:00
kiddin9 99e36fe9b0 Update luci-app-passwall2.patch 2026-09-09 14:18:32 +08:00
github-actions[bot] f8f5792e57 Sync 2026-09-09 01:26:15 2026-09-09 01:26:15 +08:00
kiddin9 a179224c4d Update upstream.yml 2026-09-09 01:23:49 +08:00
github-actions[bot] 302b45db1b 🎈 Sync 2026-09-09 01:06:03 2026-09-09 01:06:03 +08:00
kiddin9 b6b067e0ad Update upstream.yml 2026-09-09 01:03:32 +08:00
github-actions[bot] b0cf524450 🎨 Sync 2026-09-09 00:58:08 2026-09-09 00:58:08 +08:00
kiddin9 f4103e8c2a Create frp.patch 2026-09-09 00:55:42 +08:00
github-actions[bot] 2d6112f2cd 🐤 Sync 2026-09-08 23:54:39 2026-09-08 23:54:39 +08:00
github-actions[bot] 3d2cd8c73a 🎁 Sync 2026-09-08 10:47:09 2026-09-08 10:47:09 +08:00
github-actions[bot] 629b00127c 💐 Sync 2026-09-08 03:58:36 2026-09-08 03:58:36 +08:00
github-actions[bot] 51ae3e2992 🌴 Sync 2026-09-08 01:08:11
Merge-upstream / merge (push) Canceled after 0s
2026-09-08 01:08:11 +08:00
github-actions[bot] 8ff254bfa0 🏅 Sync 2026-09-07 22:51:35 2026-09-07 22:51:35 +08:00
github-actions[bot] 6e956beb69 🔥 Sync 2026-09-07 20:49:02 2026-09-07 20:49:02 +08:00
kiddin9 c05bdbe2bc Update upstream.yml 2026-09-07 20:46:37 +08:00
github-actions[bot] 7cef4bfa84 🎄 Sync 2026-09-07 10:34:05 2026-09-07 10:34:05 +08:00
github-actions[bot] 6348b68a14 💋 Sync 2026-09-07 03:05:06
Merge-upstream / merge (push) Canceled after 0s
2026-09-07 03:05:06 +08:00
kiddin9 95ded25b90 Update upstream.yml 2026-09-07 03:02:57 +08:00
github-actions[bot] 4b545cbffa 🐤 Sync 2026-09-07 02:18:00 2026-09-07 02:18:00 +08:00
github-actions[bot] 65e584daaa 🤞 Sync 2026-09-06 22:50:31 2026-09-06 22:50:31 +08:00
github-actions[bot] cb845a1f2d 🌴 Sync 2026-09-06 14:11:16
Merge-upstream / merge (push) Canceled after 0s
2026-09-06 14:11:16 +08:00
github-actions[bot] 3f15c041aa 🍉 Sync 2026-09-06 13:36:06 2026-09-06 13:36:06 +08:00
kiddin9 b2ff7cbe2f Delete .github/diy/patches/mosdns.patch 2026-09-06 13:33:57 +08:00
github-actions[bot] c27f496810 🏅 Sync 2026-09-06 10:36:07 2026-09-06 10:36:07 +08:00
github-actions[bot] dee375ce66 🔥 Sync 2026-09-06 07:02:02
Merge-upstream / merge (push) Canceled after 0s
2026-09-06 07:02:02 +08:00
kiddin9 7c496d5738 Update upstream.yml 2026-09-06 06:59:56 +08:00
github-actions[bot] d3321f4c3c 🎄 Sync 2026-09-06 05:58:26 2026-09-06 05:58:26 +08:00
kiddin9 f5aa63986c Delete .github/diy/patches/filebrowser.patch 2026-09-06 05:56:21 +08:00
github-actions[bot] a2faaa2a01 🛸 Sync 2026-09-06 05:52:01 2026-09-06 05:52:01 +08:00
kiddin9 570b248f8b Update upstream.yml 2026-09-06 05:50:03 +08:00
github-actions[bot] 87d47fbcb2 🔥 Sync 2026-09-06 05:41:59 2026-09-06 05:41:59 +08:00
github-actions[bot] 380ee71a08 🌴 Sync 2026-09-06 03:52:04 2026-09-06 03:52:04 +08:00
github-actions[bot] 8ca86b3a5e 🦄 Sync 2026-09-06 03:35:37 2026-09-06 03:35:37 +08:00
github-actions[bot] dbdd70b00d 🎁 Sync 2026-09-06 02:50:41 2026-09-06 02:50:41 +08:00
kiddin9 e70e8fddee Create filebrowser.patch 2026-09-06 02:48:51 +08:00
github-actions[bot] 02c6c789ba Sync 2026-09-06 02:17:46 2026-09-06 02:17:46 +08:00
github-actions[bot] f638f12257 🗽 Sync 2026-09-06 00:43:47
Merge-upstream / merge (push) Canceled after 0s
2026-09-06 00:43:48 +08:00
kiddin9 259b690118 Update upstream.yml 2026-09-06 00:41:54 +08:00
github-actions[bot] fc820ab4f5 🌴 Sync 2026-09-05 22:29:54 2026-09-05 22:29:54 +08:00
kiddin9 8eec681054 Update upstream.yml 2026-09-05 22:27:44 +08:00
github-actions[bot] 01aa5b5f9e 🔥 Sync 2026-09-05 21:18:46 2026-09-05 21:18:46 +08:00
kiddin9 28a85181b8 Update upstream.yml 2026-09-05 21:16:25 +08:00
github-actions[bot] 5f9dbf5e2d 🎄 Sync 2026-09-05 15:13:21
Merge-upstream / merge (push) Canceled after 0s
2026-09-05 15:13:21 +08:00
github-actions[bot] 70e84ddf56 💐 Sync 2026-09-05 14:55:36 2026-09-05 14:55:36 +08:00
kiddin9 e0826e34a3 Update depends.patch 2026-09-05 14:53:24 +08:00
kiddin9 b92e3e9efb Update Makefile 2026-09-05 14:52:09 +08:00
github-actions[bot] 24345f777c Sync 2026-09-05 14:47:29 2026-09-05 14:47:29 +08:00
kiddin9 695b29172f Delete .github/diy/patches/pgyvpn.patch 2026-09-05 14:45:25 +08:00
kiddin9 aac1b49f77 Update depends.patch 2026-09-05 14:44:49 +08:00
github-actions[bot] 8eaa48a277 💐 Sync 2026-09-05 10:39:08 2026-09-05 10:39:08 +08:00
github-actions[bot] 6ad046d5b6 🏅 Sync 2026-09-05 03:00:50 2026-09-05 03:00:50 +08:00
github-actions[bot] d0f52bd3f5 🔥 Sync 2026-09-04 23:41:24
Merge-upstream / merge (push) Canceled after 0s
2026-09-04 23:41:24 +08:00
github-actions[bot] 25ff979f91 🦄 Sync 2026-09-04 16:01:59 2026-09-04 16:01:59 +08:00
kiddin9 f2af90562f Update upstream.yml 2026-09-04 15:59:54 +08:00
kiddin9 cac0bc6d4c Update upstream.yml 2026-09-04 15:51:26 +08:00
kiddin9 1f194cfbed Update upstream.yml 2026-09-04 15:47:00 +08:00
kiddin9 9f4be58e93 Update upstream.yml
Merge-upstream / merge (push) Canceled after 0s
2026-09-04 14:46:53 +08:00
kiddin9 7bf0d12a49 Update upstream.yml 2026-09-04 14:40:17 +08:00
kiddin9 50d5c68bec Update fix.patch 2026-09-04 14:39:59 +08:00
github-actions[bot] a65cd2a696 Sync 2026-09-04 03:19:40 2026-09-04 03:19:40 +08:00
github-actions[bot] 92c3e430e5 Sync 2026-09-03 23:42:31 2026-09-03 23:42:31 +08:00
github-actions[bot] 58f9300b4a 🎉 Sync 2026-09-03 10:41:43 2026-09-03 10:41:43 +08:00
github-actions[bot] 2b9479b1ed 🚀 Sync 2026-09-03 03:25:04 2026-09-03 03:25:04 +08:00
github-actions[bot] 610ab4b79a 🎄 Sync 2026-09-02 23:53:04 2026-09-02 23:53:04 +08:00
github-actions[bot] eb2b4e956d Sync 2026-09-02 10:34:10 2026-09-02 10:34:10 +08:00
github-actions[bot] e9d23393c1 🐶 Sync 2026-09-02 00:00:06 2026-09-02 00:00:06 +08:00
github-actions[bot] 22565d103c 🌴 Sync 2026-09-01 11:16:04 2026-09-01 11:16:04 +08:00
github-actions[bot] 22285ed654 Sync 2026-09-01 05:29:46 2026-09-01 05:29:46 +08:00
github-actions[bot] 8cbf526882 💐 Sync 2026-09-01 02:40:52
Merge-upstream / merge (push) Canceled after 0s
2026-09-01 02:40:52 +08:00
github-actions[bot] 2a19f43c9e Sync 2026-08-31 22:31:57 2026-08-31 22:31:57 +08:00
kiddin9 a2635cb70a Update upstream.yml 2026-08-31 22:29:58 +08:00
github-actions[bot] 6ab5dde746 🌴 Sync 2026-08-31 11:11:11
Merge-upstream / merge (push) Canceled after 0s
2026-08-31 11:11:11 +08:00
github-actions[bot] a0412f91a9 🤞 Sync 2026-08-31 03:15:28 2026-08-31 03:15:28 +08:00
github-actions[bot] 221a4bc6ae 🎉 Sync 2026-08-31 01:44:18 2026-08-31 01:44:18 +08:00
github-actions[bot] cf0c9e3564 🏅 Sync 2026-08-30 23:57:09 2026-08-30 23:57:09 +08:00
github-actions[bot] b975999290 🤞 Sync 2026-08-30 21:23:32 2026-08-30 21:23:32 +08:00
kiddin9 bb4b6094e3 Update upstream.yml 2026-08-30 21:21:17 +08:00
github-actions[bot] dd41e8d648 🍉 Sync 2026-08-30 11:16:17 2026-08-30 11:16:17 +08:00
github-actions[bot] 5093acfe28 🎄 Sync 2026-08-30 03:21:07 2026-08-30 03:21:07 +08:00
github-actions[bot] eea38c835c 🍓 Sync 2026-08-30 00:07:42 2026-08-30 00:07:42 +08:00
github-actions[bot] 28e8ae5ca9 🔥 Sync 2026-08-29 17:03:28
Merge-upstream / merge (push) Canceled after 0s
2026-08-29 17:03:28 +08:00
kiddin9 e1f8fcd79e Update argon.patch 2026-08-29 17:01:15 +08:00
github-actions[bot] 2afb356964 🍓 Sync 2026-08-29 13:21:59 2026-08-29 13:21:59 +08:00
github-actions[bot] 7dae33e577 Sync 2026-08-29 07:56:04
Merge-upstream / merge (push) Canceled after 0s
2026-08-29 07:56:04 +08:00
kiddin9 951ef13e31 Update argon.patch 2026-08-29 07:53:49 +08:00
github-actions[bot] ca1245d63e 🔥 Sync 2026-08-29 06:54:09 2026-08-29 06:54:09 +08:00
kiddin9 2ef14df650 Update argon.patch 2026-08-29 06:52:00 +08:00
github-actions[bot] 7aced82c07 🗽 Sync 2026-08-29 06:50:13 2026-08-29 06:50:13 +08:00
kiddin9 7797adc28b Update argon.patch 2026-08-29 06:47:53 +08:00
github-actions[bot] e92ae720d3 🎁 Sync 2026-08-29 06:41:41 2026-08-29 06:41:41 +08:00
kiddin9 03e0670c3f Update argon.patch 2026-08-29 06:39:39 +08:00
kiddin9 b6b304663d Update argon.patch 2026-08-29 06:38:06 +08:00
github-actions[bot] cdda1ac76b 🌈 Sync 2026-08-29 06:30:39 2026-08-29 06:30:39 +08:00
kiddin9 49c2813666 Update argon.patch 2026-08-29 06:28:32 +08:00
github-actions[bot] c255e197f1 🍕 Sync 2026-08-29 06:07:48 2026-08-29 06:07:48 +08:00
kiddin9 0ed5334ff8 Update argon.patch 2026-08-29 06:05:30 +08:00
github-actions[bot] 2b816cc67d 🤞 Sync 2026-08-29 05:48:24 2026-08-29 05:48:24 +08:00
kiddin9 8530ecccd2 Update argon.patch 2026-08-29 05:46:02 +08:00
github-actions[bot] 540e1d3dcc Sync 2026-08-29 05:43:50 2026-08-29 05:43:50 +08:00
kiddin9 cce79ad2ee Update argon.patch 2026-08-29 05:41:35 +08:00
kiddin9 d381f0df47 Update argon.patch 2026-08-29 05:21:30 +08:00
github-actions[bot] 2f4d9baa04 🌈 Sync 2026-08-29 02:42:48 2026-08-29 02:42:49 +08:00
kiddin9 d8bdedeed3 Update upstream.yml 2026-08-29 02:40:30 +08:00
kiddin9 aa62e16d4b Update luci-theme-footstrap.patch 2026-08-29 02:33:31 +08:00
kiddin9 ade21a38d0 Update argon.patch 2026-08-29 02:32:48 +08:00
kiddin9 61a1fa1913 Update argon.patch 2026-08-29 02:25:53 +08:00
github-actions[bot] 9ae7e779c4 🚀 Sync 2026-08-29 01:50:45 2026-08-29 01:50:45 +08:00
kiddin9 10a2d6362b Update upstream.yml 2026-08-29 01:48:26 +08:00
github-actions[bot] 508ec1a68f Sync 2026-08-29 01:37:46 2026-08-29 01:37:46 +08:00
kiddin9 153543af85 Update upstream.yml 2026-08-29 01:35:57 +08:00
kiddin9 f3d45a26a8 Update argon.patch
Merge-upstream / merge (push) Canceled after 0s
2026-08-29 00:53:34 +08:00
kiddin9 b341798cdd Update argon.patch 2026-08-29 00:51:14 +08:00
github-actions[bot] 04e8cdd08f 🎉 Sync 2026-08-28 21:44:02 2026-08-28 21:44:02 +08:00
kiddin9 82aaee7f65 Update upstream.yml 2026-08-28 21:41:48 +08:00
github-actions[bot] 045d307bfe 🎁 Sync 2026-08-28 19:05:48 2026-08-28 19:05:48 +08:00
1313 changed files with 250307 additions and 45071 deletions
+700
View File
@@ -1,3 +1,136 @@
--- a/luci-app-argon-config/root/etc/config/argon
+++ b/luci-app-argon-config/root/etc/config/argon
@@ -3,8 +3,8 @@ config global
option dark_primary '#483d8b'
option blur '10'
option blur_dark '10'
- option transparency '0.5'
- option transparency_dark '0.5'
- option mode 'normal'
- option online_wallpaper 'bing'
+ option transparency '0.3'
+ option transparency_dark '0.3'
+ option mode 'dark'
+ option online_wallpaper 'default'
--- a/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
+++ b/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
@@ -50,11 +50,12 @@ return view.extend({
s.anonymous = true;
o = s.option(form.ListValue, 'online_wallpaper', _('Wallpaper source'));
+ o.value('default', _('Default'));
o.value('none', _('Built-in'));
o.value('bing', _('Bing'));
o.value('unsplash', _('Unsplash'));
o.value('wallhaven', _('Wallhaven'));
- o.default = 'bing';
+ o.default = 'default';
o.rmempty = false;
o = s.option(form.ListValue, 'mode', _('Theme mode'));
--- a/luci-theme-argon/ucode/template/themes/argon/header_login.ut
+++ b/luci-theme-argon/ucode/template/themes/argon/header_login.ut
@@ -46,7 +46,7 @@
-%}
<!DOCTYPE html>
-<html lang="{{ dispatcher.lang }}">
+<html lang="{{ dispatcher.lang }}"{% if (mode == 'light'): %} data-darkmode="false"{% else %} data-darkmode="true"{% endif %}>
<head>
{% include("themes/" + theme + "/head_meta", { hostname: hostname, node: node, bar_color: bar_color, media: media }) %}
@@ -54,9 +54,7 @@
<link rel="stylesheet" href="{{ media }}/css/cascade.css{# ?v=PKG_VERSION #}">
<style title="text/css">
{% if (mode == 'normal'): %}
- @media (prefers-color-scheme: dark) {
{{ dark_css }}
- }
{% endif %}
{% if (mode == 'dark'): %}
{{ dark_css }}
--- a/luci-theme-argon/ucode/template/themes/argon/header.ut
+++ b/luci-theme-argon/ucode/template/themes/argon/header.ut
@@ -55,9 +55,7 @@
<link rel="stylesheet" href="{{ media }}/css/cascade.css{# ?v=PKG_VERSION #}">
<style title="text/css">
{% if (mode == 'normal'): %}
- @media (prefers-color-scheme: dark) {
{{ dark_css }}
- }
{% endif %}
{% if (mode == 'dark'): %}
{{ dark_css }}
--- a/luci-theme-argon/ucode/template/themes/argon/header.ut
+++ b/luci-theme-argon/ucode/template/themes/argon/header.ut
@@ -47,7 +47,7 @@
-%}
<!DOCTYPE html>
-<html lang="{{ dispatcher.lang }}">
+<html lang="{{ dispatcher.lang }}"{% if (mode == 'light'): %} data-darkmode="false"{% else %} data-darkmode="true"{% endif %}>
<head>
{% include("themes/" + theme + "/head_meta", { hostname: hostname, node: node, bar_color: bar_color, media: media }) %}
--- a/luci-theme-argon/ucode/template/themes/argon/sysauth.ut
+++ b/luci-theme-argon/ucode/template/themes/argon/sysauth.ut
@@ -115,11 +115,12 @@
<!-- Video Player End -->
{% else %}
<!-- Image Background Start -->
- <div class="main-bg" id="main-bg" style="background-image:url({{ bgArry.bgUrl }})"></div>
+ {% online_wallpaper = cfg.get_first('argon', 'global', 'online_wallpaper') ?? 'default' %}
+ <div class="main-bg" id="main-bg" {% if (online_wallpaper != 'default'): %}style="background-image:url({{ bgArry.bgUrl }})"{% endif %}></div>
<!-- Image Background End -->
{% endif %}
<!-- Login Container Start -->
- <div class="login-container">
+ <div class="login-container" {% if (online_wallpaper == 'default'): %} style="backdrop-filter: blur(0px)"{% endif %}>
<div class="login-form">
<!-- Logo Start -->
<a class="brand" href="/"><img src="{{ media }}/img/argon.svg" class="icon">
--- a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css
+++ b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css
@@ -103,6 +103,22 @@ body {
-webkit-tap-highlight-color: transparent;
font-size: 0.875rem;
}
+body::before {
+ content: "";
+ background-image: url("/luci-static/argon/img/pattern.svg");
+ background-repeat: repeat;
+ background-size: 440px auto;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: -1;
+ pointer-events: none;
+ opacity: .3;
+}
+:root[data-darkmode="false"] body::before {opacity: .8}
+.main .main-right{background-color: transparent !important}
main {
display: block;
}
@@ -718,7 +734,7 @@ select[multiple="multiple"] {
}
.login-page .login-container {
z-index: 10;
- margin-left: 5%;
+ margin: 0 auto;
display: flex;
height: 100vh;
width: 26rem;
--- a/luci-theme-argon/ucode/template/themes/argon/footer.ut --- a/luci-theme-argon/ucode/template/themes/argon/footer.ut
+++ b/luci-theme-argon/ucode/template/themes/argon/footer.ut +++ b/luci-theme-argon/ucode/template/themes/argon/footer.ut
@@ -19,13 +19,6 @@ @@ -19,13 +19,6 @@
@@ -14,3 +147,570 @@
<a class="luci-link" href="{{ version.disturl }}" target="_blank">{{ version.distname }} {{ version.distversion }}-{{ version.distrevision }}</a> <a class="luci-link" href="{{ version.disturl }}" target="_blank">{{ version.distname }} {{ version.distversion }}-{{ version.distrevision }}</a>
--- a/luci-theme-argon/ucode/template/themes/argon/footer_login.ut
+++ b/luci-theme-argon/ucode/template/themes/argon/footer_login.ut
@@ -20,8 +20,6 @@
<!-- added style="text-wrap: auto" but on this page it is still not the best solution. I will take it to consideration next time :) -->
<footer style="text-wrap: auto">
<div>
- <a class="luci-link" href="https://github.com/openwrt/luci" target="_blank">Powered by {{ version.luciname }} ({{ version.luciversion }})</a>
- <a href="https://github.com/jerrykuku/luci-theme-argon" target="_blank">ArgonTheme {# vPKG_VERSION #}</a>
<a class="luci-link" href="{{ version.disturl }}" target="_blank">{{ version.distname }} {{ version.distversion }}-{{ version.distrevision }}</a>
</div>
</footer>
diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/pattern.svg b/luci-theme-argon/htdocs/luci-static/argon/img/pattern.svg
new file mode 100644
index 000000000..72eb03cdc
--- /dev/null
+++ b/luci-theme-argon/htdocs/luci-static/argon/img/pattern.svg
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.0"
+ width="870.000000pt"
+ height="870.000000pt"
+ viewBox="0 0 870.000000 870.000000"
+ preserveAspectRatio="xMidYMid meet"
+ id="svg90"
+ sodipodi:docname="cats_final3.svg"
+ inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
+ xml:space="preserve"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+<g opacity="0.20">
+<defs
+ id="defs90"><inkscape:path-effect
+ effect="bspline"
+ id="path-effect103"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect102"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect101"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect99"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect98"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect97"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect97-5"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect98-3"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect99-5"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect101-6"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect102-2"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /><inkscape:path-effect
+ effect="bspline"
+ id="path-effect103-9"
+ is_visible="true"
+ lpeversion="1.3"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false"
+ uniform="false" /></defs><sodipodi:namedview
+ id="namedview90"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="pt"
+ inkscape:zoom="11.313708"
+ inkscape:cx="57.010484"
+ inkscape:cy="819.84612"
+ inkscape:window-width="2560"
+ inkscape:window-height="1371"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer3"><inkscape:page
+ x="0"
+ y="0"
+ width="870"
+ height="870"
+ id="page123"
+ margin="0"
+ bleed="0" /></sodipodi:namedview><metadata
+ id="metadata1">
+Created by potrace 1.16, written by Peter Selinger 2001-2019
+</metadata><g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Layer 1"
+ style="display:inline"><path
+ d="m 188.7,6.5 -5.8,6.2 -13,0.7 -13,0.7 -4.8,-5.1 c -3.7,-3.9 -5.4,-5.1 -7.2,-4.8 -2.9,0.4 -5.5,5.4 -5.7,11.2 -0.3,6.7 -4.1,16.7 -7.8,20.6 -3.9,4.2 -4.1,5.3 -1.4,8.7 1.1,1.4 2,3.6 2,4.9 0,5.9 2.9,9.6 12.6,16.2 8.6,5.7 8.9,6.8 8.9,29.2 -0.1,17.6 -0.2,18.9 -2.9,26.9 -2.3,6.8 -2.7,9.1 -2,12 0.7,2.9 1.4,3.7 3.7,3.9 1.8,0.2 3.7,-0.4 4.9,-1.5 2.5,-2.3 5.8,-8.6 5.8,-11.2 0,-1.1 0.4,-2.2 0.9,-2.5 0.4,-0.3 1.1,-2.4 1.4,-4.7 1,-7.6 9,-12.9 11.8,-7.7 0.9,1.6 0.8,5.1 -0.2,14.6 l -1.3,12.4 2.5,1.9 c 1.3,1 2.9,1.9 3.5,1.9 2.3,0 5.2,-4.8 6.8,-11.5 5.2,-20.9 5.6,-21.6 13.6,-21 3.2,0.3 8.1,1 10.7,1.6 3,0.7 13.4,1.2 27.3,1.1 14.3,0 22.9,0.3 23.7,1 1.8,1.4 1.6,9.8 -0.3,17.8 -1.7,7.3 -1.3,10.5 1.6,12 2.1,1.2 4.8,0.2 8.1,-2.9 2.1,-1.9 4.9,-11.8 4.9,-17.2 0,-3.5 3.3,-9.9 5.6,-10.6 1.1,-0.4 2.7,4.2 6.5,18.7 1.2,4.7 2.9,9.3 3.7,10.2 1.6,1.9 7.2,2.5 7.2,0.9 0,-0.5 0.6,-1.6 1.4,-2.4 1.2,-1.2 1.5,-7.4 1.8,-35.3 0.1,-18.7 -0.1,-37.8 -0.6,-42.5 -0.8,-8.2 -0.7,-9 1.8,-14.4 1.4,-3.2 2.6,-6.8 2.6,-8.1 0,-4.1 -4.8,-11.9 -10,-16.3 -5.7,-4.8 -10.2,-6.6 -19.8,-7.9 -3.7,-0.6 -8.3,-1.9 -10.1,-3 -4.1,-2.5 -7.3,-1.4 -9.2,3 -1,2.6 -0.9,3.3 1,5.6 1.2,1.5 2.4,3.4 2.7,4.2 0.8,2.3 8.4,6 12.4,6 4.4,0 11,3.7 13,7.3 1.3,2.4 1.3,3 0,5.4 -1.5,2.7 -1.9,2.8 -8.5,2.5 -3.9,-0.1 -18.2,-0.4 -32,-0.6 -13.7,-0.1 -26,-0.6 -27.3,-1 -3.1,-1 -4.4,-4.8 -3.6,-10.7 0.6,-4.4 0.4,-5.1 -2.3,-7.8 -1.7,-1.6 -3.7,-4.5 -4.5,-6.3 -0.8,-1.8 -3,-6.8 -4.9,-11 -3.3,-7.6 -3.5,-7.7 -6.9,-7.6 -3,0 -4.4,1 -9.3,6.3 z m 12.5,3.5 c 1,3 3.2,8.3 4.8,11.8 1.6,3.4 3.5,8.4 4.1,11 1.8,7 5.5,14.9 7.6,16 1,0.6 16.2,1.1 35.6,1.3 l 33.7,0.4 2.5,-3 c 1.8,-2.3 2.4,-4.2 2.5,-7.9 0,-4.3 -0.4,-5.2 -3.6,-8.2 -1.9,-1.9 -4.3,-3.4 -5.3,-3.4 -6.6,0 -19.1,-6.9 -19.1,-10.5 0,-2.4 1.6,-2.5 7.5,-0.5 3.2,1.1 6.9,2 8.1,2 1.3,0 4.6,0.8 7.3,1.9 14.1,5.3 19.4,16.4 12.9,26.9 -2,3.2 -2,4.2 -1.2,17 1.3,20.1 0.5,68.3 -1.1,70.1 -1.1,1.1 -1.6,0.4 -2.8,-4 -0.9,-3 -2.1,-7.7 -2.7,-10.4 -4,-18.2 -14.2,-19.3 -16.4,-1.7 -0.4,2.9 -1.3,6.7 -2.1,8.5 -0.7,1.8 -1.6,4.5 -2,6 -0.3,1.6 -1.1,2.7 -1.8,2.4 -0.9,-0.3 -1.1,-3.8 -0.8,-13.4 0.5,-17.3 2,-16.3 -24.4,-16.4 -18.2,0 -25,-0.4 -41.6,-2.5 -9.5,-1.1 -13.8,2.9 -15.5,14.3 -0.7,5.3 -4.2,14.3 -5.4,14.3 -1.4,0 -1.7,-2.3 -0.9,-6 1.4,-5.8 1.1,-19.4 -0.4,-21.5 -1.2,-1.5 -2.2,-1.7 -5.7,-1.1 -8.3,1.3 -13.5,7.7 -14.7,17.9 -0.7,5.6 -2.7,9.7 -4.9,9.7 -2.5,0 -2.5,-2.1 0.6,-13.3 2.7,-10.4 3,-12.7 3,-27 0,-9.3 -0.4,-15.8 -1,-16.2 -0.5,-0.3 -1,-1.4 -1,-2.4 0,-2 -7,-9 -11.8,-11.7 -4.1,-2.4 -8.1,-8.1 -9.3,-13.5 -0.9,-3.7 -0.6,-5.1 2.6,-12.4 1.9,-4.5 3.5,-9.5 3.5,-11.1 0,-4.2 1.8,-10 3.5,-11.4 1.2,-1 2.3,-0.5 5.9,2.8 5.7,5.3 8.3,5.9 17,3.8 3.9,-0.9 8.6,-1.6 10.4,-1.6 4.6,0 10.1,-3.3 14.2,-8.5 1.9,-2.4 4.1,-4.3 4.9,-4.2 0.8,0.1 2.2,2.7 3.3,5.7 z"
+ id="path1"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 168,33 c -2.3,4.4 2.9,8 6.4,4.4 3,-2.9 1.6,-5.5 -3.1,-6.2 -1.4,-0.1 -2.6,0.5 -3.3,1.8 z"
+ id="path2"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 147.4,33.1 c -1,1.7 1.3,3.6 2.7,2.2 1.2,-1.2 0.4,-3.3 -1.1,-3.3 -0.5,0 -1.2,0.5 -1.6,1.1 z"
+ id="path3"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 617.8,42.1 c -1,0.5 -1.8,1.6 -1.8,2.3 0,0.7 -0.8,2.4 -1.9,3.7 -3.8,4.9 -5.4,16.7 -5.6,41.4 l -0.3,23 -4.4,-0.1 c -4.9,-0.2 -9.7,-2.3 -13.7,-6 -2.7,-2.5 -6.5,-3.2 -7.6,-1.4 -0.6,1 -1.2,7.2 -1.4,14.1 -0.1,2.2 -0.7,2.8 -3.6,3.3 -1.9,0.4 -5.1,2.2 -7.1,4.1 -4.4,4.2 -5.9,4.3 -10.4,1 -2.5,-1.8 -4.6,-2.5 -8.2,-2.5 -4.4,0 -4.8,0.2 -4.8,2.3 0,1.3 0.6,4.3 1.4,6.8 5.1,16.2 6.7,23.1 6.2,25.6 -0.6,2.4 0.1,3.5 4.9,8.2 3,3 5.5,5.8 5.5,6.2 0,1.4 14.7,9.9 17.2,9.9 3.2,0 5.1,2.3 6.7,7.9 0.7,2.5 2.5,7.2 4,10.5 3.7,8.2 4.6,10.9 6.6,19.1 1.6,6.5 1.6,7.3 0.1,10.9 -0.9,2.1 -1.6,5.6 -1.6,7.7 0,3.3 0.4,4.1 2.5,4.9 7.3,2.8 12.9,-5 14.7,-20.3 1.4,-12.2 1.8,-12.5 13.5,-11.9 l 9.2,0.4 2,4.1 c 1.1,2.3 2.4,6.8 3,10 1.6,8.8 4,12.6 9.9,15.4 3.1,1.5 3.5,1.5 6,-0.4 3.5,-2.6 3.8,-5.1 1.2,-11.2 -1.9,-4.2 -2.1,-6.4 -1.8,-14.3 0.2,-5.9 0.9,-10.6 2,-12.8 2.4,-5 4.8,-18.1 4.8,-26 0,-9.5 -2.6,-22 -5.8,-28.2 -2.4,-4.8 -17.5,-20.8 -19.5,-20.8 -0.4,0 -2.7,-1.8 -5,-4 -4.3,-3.9 -4.7,-4.9 -8.8,-18.6 -1.4,-4.7 -1.1,-21.9 0.6,-31.4 2.2,-12.7 2,-26.7 -0.5,-30.8 -2.1,-3.3 -4.9,-4.1 -8.2,-2.1 z m 4.4,5.6 c 0.1,1 0.2,16.6 0.2,34.8 0.1,32.7 0.1,33 2.5,37.5 2.4,4.7 8.8,12 10.4,12 0.6,0 1.9,1 3.1,2.2 1.2,1.3 4.8,4.5 8,7.3 9.9,8.5 12.6,16.3 12.6,36.1 0,13.1 -1.7,24.4 -4.5,30.9 -0.7,1.6 -1.6,5.6 -2,8.7 -0.6,4.8 -0.4,6.3 1.2,9.1 4.4,7.5 3.3,15.7 -1.4,10.4 -3.2,-3.5 -7.3,-13.6 -7.3,-17.9 0,-4.3 -2.5,-9.5 -5,-10.3 -0.8,-0.2 -6.4,-0.5 -12.4,-0.7 l -10.8,-0.3 -2.9,3.3 c -2.5,2.8 -2.9,4 -2.9,9.2 0,8.2 -1.8,15.6 -4.4,18.7 l -2.3,2.6 -0.7,-2.7 c -0.4,-1.5 -0.2,-4.4 0.4,-6.6 1.4,-5.2 -0.3,-16.3 -4,-25.5 -10,-25.3 -9.2,-22.3 -8.8,-34.7 0.3,-10.9 0.4,-11.6 4.5,-19.8 4,-8.2 8,-13.7 15.3,-20.7 3.3,-3.2 3.5,-3.8 3.4,-9.6 -0.1,-3.4 -0.9,-10.5 -1.8,-15.7 -2.3,-12.7 -1.7,-27.8 1.7,-42.9 1.4,-6.3 3.1,-12.7 3.8,-14.2 1.3,-3.2 3.8,-3.9 4.1,-1.2 z M 592,113.3 c 1.9,1.3 5.5,2.9 8,3.6 10.1,2.9 11.6,8.1 4.2,15.1 -5.5,5.2 -8.9,9.7 -12.2,16 -1.2,2.5 -2.7,5.4 -3.3,6.5 -0.6,1.1 -1.3,7.1 -1.5,13.3 -0.5,13.1 -1.1,13.8 -7.8,10.2 -4.9,-2.6 -14.2,-11 -17,-15.5 -2.5,-4.1 -5.4,-12.3 -5.4,-15.6 0,-1.5 -0.7,-4.3 -1.6,-6.4 -1.6,-4 -1.6,-9.6 0.2,-10.2 0.6,-0.2 2.7,0.8 4.8,2.2 2,1.4 4.5,2.5 5.4,2.5 0.9,0 4.9,-2.5 8.7,-5.6 3.9,-3.1 8.1,-6 9.4,-6.5 2.1,-0.8 2.3,-1.4 1.8,-5 -1,-7.3 0.5,-8.4 6.3,-4.6 z"
+ id="path12"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 623,151.5 c 0,1.4 0.6,2.5 1.3,2.5 2.1,0 2.7,-1.1 1.6,-3.1 -1.4,-2.7 -2.9,-2.3 -2.9,0.6 z"
+ id="path13"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 595,126 c 0,2.4 2.6,3.8 4.2,2.2 0.8,-0.8 0.8,-1.5 -0.2,-2.7 -1.8,-2.1 -4,-1.9 -4,0.5 z"
+ id="path14"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 581.8,138.1 c -3.1,1.7 -1.6,6.9 1.9,6.9 2.2,0 3.8,-4.6 2.3,-6.5 -1.5,-1.7 -1.9,-1.8 -4.2,-0.4 z"
+ id="path15"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 564.4,148.1 c -1,1.7 2.3,4.6 3.7,3.2 0.7,-0.7 0.9,-1.9 0.6,-2.7 -0.7,-1.8 -3.3,-2.1 -4.3,-0.5 z"
+ id="path16"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 421.9,45.3 c -1.3,1.2 -4,4 -5.9,6.3 -4.7,5.5 -7.9,6.4 -17.6,5.2 -11.7,-1.4 -15.4,-2.8 -20.3,-7.5 -4.6,-4.4 -9.1,-5.7 -10.8,-3.1 -1.4,2.3 -3.5,8.2 -4,11.6 -0.3,1.8 -1.6,5.2 -2.9,7.5 -1.4,2.3 -3,5.4 -3.6,6.9 -0.7,1.5 -2.5,3.2 -4,3.9 -3.6,1.5 -4,3 -2.8,12.2 1,8.2 3.9,14.5 8.4,18.5 8.1,6.9 9.5,20 7,62.4 -0.5,8.9 -0.4,12.1 0.6,13.3 1.9,2.3 4.6,1.8 6.8,-1.3 2,-2.6 2.3,-2.7 11.4,-2.6 10.6,0.1 13.8,1.3 13.8,4.9 0,3.9 4.1,3.3 7.4,-1 3.3,-4.3 5,-4.4 6.6,-0.4 1.8,4.2 7.9,7.3 11.7,5.8 3.9,-1.5 17.5,-2.1 19.3,-0.9 1.8,1.2 0.2,2.8 -10.9,10.5 -11.9,8.2 -18,13.4 -19.6,16.6 -1.5,2.8 -1.4,3.2 0.6,6 1.6,2.3 2.7,2.9 4.3,2.6 12.2,-3 13.8,-3.7 20.3,-8.7 6.2,-5 9.1,-7.7 18.8,-18.2 1.9,-2.1 4.5,-5.9 5.7,-8.5 2.1,-4.5 2.3,-6.1 2.3,-24.3 0,-11.9 -0.5,-21.3 -1.2,-24 -0.6,-2.5 -2.1,-8.8 -3.3,-14.1 -2,-9.1 -9.2,-28.5 -12.3,-33.2 -0.8,-1.3 -1.8,-4.2 -2.2,-6.6 -0.4,-2.4 -1.3,-5.8 -2,-7.6 -0.8,-1.7 -2.1,-6.2 -2.9,-9.9 -0.9,-3.7 -2.8,-8.9 -4.3,-11.4 -2.5,-4.5 -10,-13.2 -11.4,-13.2 -0.3,0 -1.7,1 -3,2.3 z m -44.1,10.2 5.1,5.6 15.4,0.2 c 17.1,0.2 18,-0.1 21.4,-6.8 2.8,-5.4 5.6,-5.9 9.2,-1.4 2.9,3.8 8.4,18.3 10,26.9 1.3,6.5 1.6,7.5 6.3,18 4,9 8.5,21.5 9.8,27 0.4,1.9 1.5,5.1 2.3,7.1 1.2,2.8 1.6,8.6 1.9,28.3 0.3,21.8 0.1,24.9 -1.3,25.9 -0.9,0.7 -1.9,2.1 -2.3,3.2 -1.2,3.7 -18.1,20.2 -23.6,23 -1.7,0.9 -3,1.9 -3,2.3 0,1.1 -8.7,3.5 -9.9,2.7 -0.6,-0.3 -1.1,-1.4 -1.1,-2.4 0,-1.8 1.4,-3 14,-12.3 9.2,-6.7 20,-16.9 20,-18.7 0,-2.6 -0.9,-3.1 -3.9,-1.9 -3.7,1.5 -28,2.1 -29.7,0.8 -2.1,-1.9 -0.5,-4 3.1,-4 1.9,0 3.7,-0.5 4.1,-1.1 0.4,-0.7 0.6,-5.8 0.5,-11.5 -0.1,-10.3 -0.1,-10.5 3.1,-14.9 3.4,-4.5 7,-6.5 11.8,-6.5 3.3,0 4.3,-0.9 2.9,-2.7 -1.7,-1.9 -7.3,-1.6 -12.3,0.7 -3.6,1.7 -4.7,3.1 -7.2,8.3 -2.5,5.3 -2.9,7.4 -2.9,14.7 0,4.7 -0.4,9.1 -0.8,9.7 -0.5,0.8 -2.9,1.3 -5.7,1.3 -3.8,0 -5.2,-0.4 -5.9,-1.8 -0.6,-1.1 -0.6,-2.3 -0.1,-2.8 1.1,-1.1 4.9,-22.4 4.2,-24.2 -0.2,-0.6 -1.3,-1.2 -2.3,-1.2 -2.1,0 -2.5,1.4 -3.3,11.5 -1.2,14.5 -3.3,22.1 -5.9,21.2 -1.5,-0.5 -1.1,-23.5 0.5,-25.4 0.7,-0.9 0.6,-2 -0.6,-3.8 -1.8,-2.7 -3.5,-3.3 -3.7,-1.3 -0.1,0.7 -0.2,6.6 -0.3,13.1 -0.1,12.8 -0.7,14.3 -5.6,13.2 -1.4,-0.4 -5.3,-0.9 -8.7,-1.2 -7.3,-0.6 -8.1,-2 -5.8,-9.7 2.1,-6.8 3,-17 1.7,-19.2 -0.9,-1.7 -1.1,-1.6 -1.7,1.1 -0.3,1.7 -1.1,4.6 -1.6,6.5 -0.6,1.9 -1.4,7.2 -1.8,11.8 -0.4,4.5 -1,8.5 -1.4,8.8 -2.1,2.2 -2.5,-2.6 -2,-27.9 0.7,-31.2 0.6,-31.8 -8,-41.5 -2.5,-2.8 -5.1,-6.1 -5.7,-7.3 -1.9,-3.5 -1.4,-12.5 0.9,-16.3 1.2,-1.8 2.1,-3.9 2.1,-4.6 0,-0.7 1.4,-3.2 3,-5.7 1.7,-2.4 3,-5.2 3,-6.2 0,-1 0.8,-3.8 1.9,-6.2 1,-2.4 2.1,-5.2 2.4,-6.2 1,-2.6 1.9,-2.1 7.5,3.8 z"
+ id="path17"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 411.5,77.1 c -1.3,4.1 4.7,7.7 7.5,4.4 1.8,-2.2 0.8,-5.1 -1.7,-4.7 -1.2,0.2 -2.4,-0.2 -2.8,-0.8 -1,-1.6 -2.3,-1.2 -3,1.1 z"
+ id="path18"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 365.2,79.7 c 0.4,3.3 4.4,5.8 6.5,4.1 3.2,-2.6 0.3,-6.8 -4.7,-6.8 -1.7,0 -2.1,0.5 -1.8,2.7 z"
+ id="path19"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 388,80.5 c -1.8,2.1 0.3,6.8 2.8,6.3 2.1,-0.4 2.8,-4.4 1.2,-6.4 -1.6,-1.8 -2.4,-1.8 -4,0.1 z"
+ id="path20"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 423.2,85.2 c -1.5,1.5 -1.6,4.4 -0.2,5.3 0.6,0.3 1.9,0.3 3.1,0 1.5,-0.5 1.9,-1.4 1.7,-3.3 -0.3,-2.9 -2.6,-4 -4.6,-2 z"
+ id="path21"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 736.6,148.9 c -6,6.6 -0.4,23.5 16.2,49.1 8,12.3 9.6,18 7.1,26 -3.6,12.1 -3.9,14 -3,22.8 0.5,4.8 1.6,10.7 2.4,13.2 2.5,7.5 3.8,12.8 5.2,22.2 1.1,7.2 1.9,9.7 4.2,12.6 4.4,5.3 6.5,6.5 8.9,4.8 1.7,-1.3 1.9,-2.8 1.9,-14.8 0.1,-16.3 0.2,-16.8 1.9,-16.8 1.6,0 4.6,5.8 4.6,9.1 0,1.2 0.7,4.7 1.6,7.8 3.6,12.4 5.6,15.1 10.3,13.6 2.6,-0.8 3.1,-3.9 2.9,-17 -0.1,-6.1 0.2,-12.1 0.6,-13.4 0.8,-2.4 0.9,-2.4 10.5,-1.5 5.3,0.4 16.5,0.8 25,0.9 h 15.4 l 1.8,3.5 c 1.1,1.9 2.2,5 2.5,7 0.4,1.9 1,3.9 1.4,4.5 0.4,0.5 1.3,3.5 1.9,6.5 1.6,7.5 4.4,12 7.6,12 2.3,0 6.41118,-0.0354 6.41118,-4.0354 0,-4 -4.11118,-4.6646 -6.31118,-4.2646 -3.2,0.6 -4.1,-1.2 -5.6,-11.2 -1.3,-8.7 -2.8,-12.7 -6,-16.5 l -2.2,-2.4 -27.8,-0.3 c -23.6,-0.3 -27.9,-0.1 -29,1.2 -0.9,1 -1.1,5.1 -0.9,14.5 0.3,9.2 0.1,13 -0.7,13 -1.9,0 -3.4,-2.4 -4.3,-7.1 -1.5,-7.1 -4.9,-18 -6.2,-19.5 -2,-2.4 -6.5,-1.7 -8.4,1.3 -1.5,2.2 -1.7,4.3 -1.3,13.7 0.5,12.1 0.3,13.6 -1.8,13.6 -2.3,0 -4.9,-8.2 -6,-18.5 -0.3,-3.9 -2,-11.5 -3.6,-17 -2.5,-8.5 -2.9,-11.2 -2.6,-18.2 0.2,-4.5 0.9,-8.7 1.5,-9.5 0.6,-0.7 1.8,-3.9 2.6,-7 1.3,-5 1.3,-6.4 0,-10.7 -0.8,-2.7 -2.1,-5.5 -2.9,-6.1 -0.7,-0.7 -1.4,-1.7 -1.4,-2.2 0,-0.6 -3.1,-6 -6.9,-12.2 -12.3,-20 -17.5,-34 -14.1,-38.1 2.9,-3.5 8.8,4.5 21.6,29.4 2.7,5.2 7,11.8 9.7,14.7 4.1,4.5 5.4,5.3 9.5,5.9 3.3,0.4 6.2,0.1 9.2,-1 5.4,-1.9 26,-4.1 45.9,-5 7.9,-0.4 15.4,-1 16.6,-1.5 2.4,-0.9 4.4,-4.3 7.7,-12.8 2.2,-5.9 5,-7 7,-2.7 3.25672,4.52695 4.88817,4.75784 4.15897,0.16291 C 870.85742,177.50246 865.7,171 863.4,171 c -1.2,0 -8.4,10.8 -8.4,12.7 0,1.5 -2.9,7 -4.3,8.1 -0.6,0.5 -10.4,1.2 -21.7,1.5 -11.3,0.4 -22.1,1.1 -24,1.6 -5.3,1.6 -22.1,3.8 -24.6,3.3 -1.2,-0.2 -3.5,-1.6 -5,-3.1 -3.3,-3.2 -5.6,-6.6 -14.3,-22.6 -7.9,-14.4 -13,-21.4 -17.2,-23.5 -4.7,-2.5 -5.2,-2.5 -7.3,-0.1 z"
+ id="path25"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1"
+ sodipodi:nodetypes="cccccccccsssccccccccccsscccccccsccccscccccccsccccccccccssscccccccc" /><path
+ d="M -2.015625,175.87812 C -5.7714471,175.45439 2.7,189.5 5.5,192.4 c 1.1,1.1 3.4,1.6 6.8,1.6 2.9,0 7.3,0.8 10,1.7 l 4.7,1.7 5.5,-5.4 c 3.9,-3.8 5.8,-5.1 6.6,-4.3 1.1,1.1 3.6,13.1 4.6,22.5 0.6,5.5 0.5,5.6 -2.6,7.2 -4,2.1 -4,4.8 0,6.3 l 3.1,1.2 -2.8,4.8 c -1.5,2.6 -6.5,8.3 -11,12.6 -4.6,4.3 -9.2,9.2 -10.3,11 -3.1,5 -3.5,11.9 -1.6,25.1 0.9,6.4 1.5,11.9 1.2,12.2 -1.7,1.7 -6.7,-5.8 -6.7,-10.2 0,-3.1 -3.3,-11.9 -5.3,-14.2 -2.5,-2.7 -3.9,-2.8 -6,-0.4 -1.4,1.6 -1.7,4.4 -1.7,18.5 0,16.7 0.7,19.7 3.2,14.1 0.9,-1.9 0.9,-3.9 0,-8.3 -1.7,-8 -1.5,-19.2 0.2,-21.6 1.4,-1.9 1.5,-1.9 2.4,0.5 2.5,6.6 3.5,9.9 4.2,14.2 1,5.4 2.9,9.3 6.5,13 5.7,6.1 8,2.4 7.1,-11.1 -0.4,-5.3 -1.2,-11.9 -1.8,-14.8 -1.7,-8.1 0.5,-12.6 11.9,-24 10.5,-10.6 11.6,-12.4 13.3,-20.9 1.8,-9.1 -1.9,-45.4 -4.6,-45.4 -0.9,0 -6.9,4.4 -10.4,7.6 l -3.5,3.2 -9.7,-0.5 -9.7,-0.6 -2.4,-3.6 c -1.3,-2 -3.4,-5.2 -4.5,-7.1 l -2.996875,-2.98437 z"
+ id="path26"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1"
+ sodipodi:nodetypes="scscccsccccccccsscssccccccccccssccccccs" /><path
+ d="m 862,200 c 0,1.7 -3.9,5 -6,5 -1.3,0 -2,0.7 -2,1.9 0,3 2.1,3.7 4.1,1.3 0.9,-1.2 2.2,-2.2 2.7,-2.2 0.5,0 2.1,-0.9 3.6,-2.1 2.1,-1.7 2.4,-2.4 1.5,-3.5 -1.3,-1.6 -3.9,-1.9 -3.9,-0.4 z"
+ id="path27"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 369.4,208.3 c -3.7,2.2 -9.4,6.9 -9.4,7.8 0,0.5 -2.5,5.1 -5.5,10.2 -3,5 -5.5,9.6 -5.5,10.2 0,0.5 -1.4,3 -3,5.5 -1.6,2.5 -3,5.2 -3,6 0,0.9 -2,3.7 -4.4,6.4 l -4.5,4.8 -9.8,-0.7 c -5.4,-0.4 -10.9,-1.2 -12.3,-1.7 -4.5,-1.8 -15.2,-2.9 -32.5,-3.5 -12.1,-0.3 -17.5,-0.9 -18.9,-1.9 -1.1,-0.7 -3.2,-4.8 -4.7,-8.9 -2.6,-7.1 -5.8,-11.4 -8.6,-11.5 -1.2,0 -10.3,13.6 -10.3,15.6 0,2.3 -6.6,4.4 -13.9,4.4 -6.8,0 -7.4,-0.2 -14.2,-4.7 -5.6,-3.7 -7.4,-4.5 -8.7,-3.6 -2.6,1.6 -2.9,3.3 -5.9,30.8 -1.3,12.2 2.6,22 12.6,31.3 2.5,2.4 5.9,5.6 7.4,7 1.5,1.5 3.7,4.6 4.9,6.9 1.8,3.7 2,5.4 1.6,15.7 -0.3,7.1 -0.9,12.1 -1.6,12.8 -1.8,1.8 -1.4,7 0.7,9.5 3.6,4.3 6.2,2.5 10.4,-6.7 1.4,-3 3,-7.8 3.7,-10.5 0.7,-2.8 1.9,-6.5 2.8,-8.3 1.1,-2.6 1.7,-3 2.8,-2.1 1.9,1.6 1.8,15.5 -0.1,18.9 -3.3,5.8 -0.7,14 4.5,14 1.5,0 3.2,-0.6 3.7,-1.3 1.5,-1.8 7,-18.5 7.8,-23.6 0.9,-5.7 5.5,-10.6 8.8,-9.7 5.8,1.7 16.7,1.8 27,0.2 11.8,-1.9 18.2,-1.5 19.7,1.3 0.5,1 0.7,5.6 0.4,10.2 -1,16.9 -0.9,17.5 2.1,19.5 2.5,1.6 2.7,1.6 4.9,-0.5 2.7,-2.5 6.1,-11.3 7.1,-18.3 0.6,-4.9 4.3,-11.4 6,-10.7 0.6,0.2 1,6.1 1,14.6 0,11.9 0.3,14.5 1.7,15.9 2.5,2.5 6.8,0.6 9.3,-4.2 1.1,-2.1 2.9,-8.4 3.8,-13.9 1,-5.5 2.7,-12.9 3.7,-16.5 1,-3.6 2.5,-9 3.4,-12.1 2.2,-7.8 2,-13.9 -0.9,-25.3 -1.4,-5.4 -2.5,-11 -2.5,-12.5 0,-1.6 4.1,-9.6 10.1,-19.6 10.4,-17.7 14.3,-25.9 15.8,-33.9 1,-5.6 -0.1,-11.5 -2.5,-13.3 -2.1,-1.6 -2.3,-1.6 -5,0 z m 3.4,11.7 c -0.6,5.5 -7.5,20.3 -16.5,34.8 -3.6,5.9 -7.4,12.5 -8.4,14.7 -2.3,5 -2.4,11.4 -0.3,16.3 1.1,2.4 1.8,7.7 2.2,14.9 0.4,11.2 0.2,12.8 -4.3,27.3 -0.7,2.5 -1.7,7.6 -2,11.5 -0.7,7.2 -3.6,15.5 -5.4,15.5 -2,0 -2.4,-2.6 -2.2,-15.7 0.2,-9.2 -0.2,-13.9 -1,-14.9 -1.2,-1.5 -5.6,-1.9 -7.6,-0.6 -1.7,1.1 -3.5,5.9 -4.4,11.7 -0.9,6.5 -4.2,15.8 -5.7,16.3 -1.3,0.4 -1.3,1 -1.4,-14.8 0,-6.3 -0.5,-12.3 -1,-13.3 -0.9,-1.7 -2.5,-1.8 -28.6,-1.1 -26.8,0.7 -27.8,0.8 -29.8,2.9 -3.1,3.4 -5.3,8.6 -6.4,15.6 -1.8,11.5 -2.4,13.4 -4.5,13.4 -1.9,0 -2,-0.8 -2,-13.8 0,-13.5 -0.1,-13.9 -2.5,-15.9 l -2.4,-2 -2.3,2.9 c -1.3,1.5 -2.9,3.5 -3.6,4.3 -0.8,0.8 -2.1,5.2 -3,9.8 -1.5,7.8 -2.9,11.2 -4.7,11.2 -1.8,0 -2,-5.9 -0.5,-14 0.8,-4.7 1.5,-10 1.5,-11.8 0,-4.7 -4.6,-13.6 -9.4,-18.2 -7.4,-7.1 -9.7,-9 -10.7,-9 -0.5,0 -0.9,-0.4 -0.9,-1 0,-0.5 -1.1,-2.6 -2.5,-4.7 -3.1,-4.5 -2.9,-7.4 0.8,-9.1 3.5,-1.7 3.4,-2.8 -0.2,-4.6 -1.6,-0.9 -3.1,-2.2 -3.5,-3.1 -0.3,-0.8 -0.1,-5.9 0.4,-11.3 0.5,-5.3 1,-10.7 1,-11.9 0,-1.2 0.8,-2.7 1.8,-3.2 1.4,-0.7 2.8,0 6.7,3.5 4,3.6 5.5,4.4 7.5,3.9 1.4,-0.3 6.5,-1.1 11.3,-1.8 l 8.8,-1.2 5,-7.8 c 2.7,-4.3 5.5,-7.7 6.1,-7.5 0.6,0.2 2.4,3.3 3.9,6.9 1.4,3.5 4,7.9 5.6,9.6 l 3,3.3 h 15.1 c 12.3,0 18.5,0.6 32.7,3 9.7,1.6 19,3 20.9,3 7.4,0 13.2,-5.6 20.9,-20.4 8.1,-15.2 13.4,-24 16.6,-27.5 2.7,-2.9 3.3,-3.1 4.7,-2 1.2,1 1.5,2.5 1.2,5.9 z"
+ id="path28"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 246.4,261.1 c -1,1.7 1.3,3.6 2.7,2.2 1.2,-1.2 0.4,-3.3 -1.1,-3.3 -0.5,0 -1.2,0.5 -1.6,1.1 z"
+ id="path29"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 255.4,267.2 c -0.9,1.5 2.7,4.1 3.9,2.9 1.3,-1.3 0.1,-4.1 -1.7,-4.1 -0.8,0 -1.8,0.5 -2.2,1.2 z"
+ id="path30"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 227,269.5 c -1,1.2 -1,1.8 0,3 2,2.5 5.5,1.5 5.5,-1.5 0,-3 -3.5,-4 -5.5,-1.5 z"
+ id="path31"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 205.3,270.6 c -0.8,2.1 1.3,4.2 2.8,2.7 1.3,-1.3 0.5,-4.3 -1.1,-4.3 -0.6,0 -1.3,0.7 -1.7,1.6 z"
+ id="path32"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 34.2,209.2 c -2,2 -1.4,4 1.1,3.6 1.4,-0.2 2.2,-1 2.2,-2.2 0,-2.4 -1.6,-3.1 -3.3,-1.4 z"
+ id="path33"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 12.6,209.9 c -0.4,0.7 -0.5,1.5 -0.2,1.8 0.9,0.9 1.9,-0.4 1.4,-1.8 -0.4,-1.1 -0.6,-1.1 -1.2,0 z"
+ id="path34"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 867.4,267.1 c -0.9,1.5 0.6,19.8 1.7,20.5 0.5,0.3 0.9,-4.2 0.9,-10.5 0,-10.2 -0.7,-13 -2.6,-10 z"
+ id="path35"
+ style="display:none;fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 496.3,275.2 c -1.3,0.6 -2.5,1.9 -2.9,3 -0.3,1 -1.7,3.6 -3.1,5.8 -2.8,4.3 -8.6,7.1 -17.3,8.5 -2.5,0.3 -5.9,1.1 -7.6,1.7 -2.8,1 -3.7,0.7 -8.5,-2.5 -6.1,-4 -13.1,-5.8 -14.5,-3.6 -0.5,0.8 -1.1,5 -1.5,9.4 -0.4,5.9 -1.3,9.5 -3.3,13.5 -2,4 -3,8 -3.6,14.5 -0.5,4.9 -1.2,10.7 -1.6,12.7 -0.6,3.5 -0.5,3.8 2.7,5.1 1.9,0.8 6.4,4.3 10,7.8 3.6,3.5 8.4,8 10.7,10 4.9,4.1 5.5,7.8 2,10.2 -1.3,0.8 -4.3,3.3 -6.8,5.5 -2.5,2.3 -5.6,4.4 -7,4.7 -3.8,1 -8.6,5 -10,8.5 -1.1,2.7 -1,3.3 0.5,5 3.5,3.9 9.4,2.1 20.7,-6.2 4,-3 9.3,-6.5 11.8,-7.9 2.5,-1.4 6.2,-3.5 8.3,-4.7 4.7,-2.7 4.7,-2.7 4.7,0.2 0,2.4 -4.9,7.6 -10.7,11.2 -4,2.6 -6.7,5.6 -8.2,9.2 -2.8,6.7 3,9.3 11.4,5.2 7.3,-3.6 20.7,-14.2 21.7,-17.2 0.3,-0.9 2.2,-0.5 7.5,1.6 l 7,2.8 11.8,-2.6 c 6.5,-1.4 13.9,-2.6 16.4,-2.6 5.5,0 22.9,-3.3 32.6,-6.1 7.2,-2.1 13.3,-4.9 17.3,-8 3.7,-2.8 9.9,-12 10.7,-15.9 0.4,-1.9 1.4,-4.8 2.2,-6.3 1.8,-3.5 1.4,-24.4 -0.6,-29.7 -7.2,-19.4 -17.6,-29.8 -33.4,-33.4 -11.1,-2.6 -18.7,-1.8 -35.2,3.6 -13.8,4.6 -15.6,4.6 -18.6,0.6 -1.3,-1.8 -3.3,-5.1 -4.4,-7.3 -3.7,-7.6 -6,-8.8 -11.2,-6.3 z m 8.4,10.8 c 4.7,9.4 6.2,10.5 13.3,10.4 3.3,-0.1 6.5,-0.6 7.2,-1.1 0.7,-0.5 4.5,-1.8 8.3,-2.8 3.9,-1 7.6,-2.3 8.4,-2.9 0.8,-0.7 5.9,-1.1 12.5,-1.1 8.6,0 11.8,0.4 14.1,1.7 1.7,0.9 4.7,2.4 6.7,3.3 6.1,2.7 13.7,11.9 17.1,20.5 2.6,6.8 2.9,8.6 2.9,19.5 0,13.7 -1.1,18.7 -5.2,24.8 -7.5,11.1 -20,17 -41,19.2 -3.6,0.4 -7.6,1.2 -9,1.7 -1.4,0.6 -5.9,1.2 -10,1.4 -4.1,0.3 -9.8,1.1 -12.7,1.9 -6.4,1.9 -9.2,1.9 -13.4,0 -6.9,-3 -8.3,-4.7 -8.1,-10.6 0.1,-4.3 0.5,-5.7 2.4,-7.1 1.3,-1 2.8,-1.8 3.5,-1.8 1.4,0 2.8,6.3 1.9,7.9 -1,1.5 3.1,5.1 5.8,5.1 1.3,0 5.2,-0.9 8.7,-2.1 3.5,-1.1 12.5,-2.7 19.9,-3.4 17.2,-1.6 27.3,-4.4 31.7,-8.7 1.8,-1.8 3.3,-3.6 3.3,-4 0,-1.4 -3.3,-0.9 -5.1,0.8 -1.8,1.6 -5.8,2.9 -13.9,4.4 -2.5,0.4 -6.4,1.6 -8.6,2.5 -2.6,1 -6.2,1.5 -9.9,1.3 l -5.8,-0.3 -1.9,-5.5 c -1.3,-3.7 -1.9,-8.6 -2,-15 -0.1,-8.3 0.2,-10.2 2.5,-15 2.7,-5.8 6.7,-10.7 11.3,-13.7 4.8,-3.1 13.2,-5.2 18.5,-4.6 4.2,0.5 4.9,0.3 4.9,-1.1 0,-3.1 -5.7,-4.5 -13,-3.3 -3.6,0.5 -7.2,1.6 -8.1,2.3 -0.8,0.8 -2.1,1.4 -2.7,1.4 -1.7,0 -13,11.9 -14.7,15.5 -4.6,9.5 -6,22.6 -3.1,28.3 0.7,1.5 1.6,4.6 2,6.9 0.5,3.8 0.3,4.4 -1.9,5.9 -3.4,2.2 -10.6,3.5 -12.2,2.2 -0.7,-0.6 -1.3,-2.9 -1.3,-5.2 0,-4.5 -2.2,-8.6 -4.7,-8.6 -0.8,0 -3.2,1.4 -5.3,3 -4.4,3.5 -5.5,6.8 -5.1,15.2 0.3,6.2 0.3,6.2 -8.6,13.8 -6,5 -16.1,11.2 -17.3,10.5 -2.5,-1.6 -0.6,-4.8 6.3,-10.4 10.4,-8.6 17.3,-17.9 15,-20.2 -0.9,-0.9 -1.6,-0.9 -2.5,-0.2 -0.7,0.6 -3,1.3 -5.1,1.6 -2.1,0.3 -6.4,2.3 -9.5,4.3 -3.1,2.1 -7.6,4.8 -10.1,6.2 -2.5,1.3 -6.1,3.6 -8.1,5.1 -5.7,4.5 -9.7,6.4 -11.5,5.8 -2.4,-1 -1.4,-4 2,-5.8 6.6,-3.4 10.4,-6.2 20.7,-15.3 3.2,-2.8 1.3,-7.4 -5.5,-13.9 -3.4,-3.2 -7.9,-7 -9.9,-8.4 -2.1,-1.4 -3.8,-3.2 -3.8,-3.9 0,-0.7 -0.6,-1.7 -1.4,-2.1 -2.8,-1.7 -5,-7.7 -5,-14.3 -0.1,-6.9 2.1,-14.3 5.7,-19.2 1.6,-2.2 1.9,-3.7 1.4,-8 -0.9,-9.4 1.8,-10.7 9.5,-4.7 5.3,4.2 8.2,4.5 16.8,1.5 4,-1.4 8.6,-2.6 10,-2.6 5.8,0 9,-2 11.7,-7.4 3,-6 5.2,-8.8 6.7,-8.3 0.6,0.2 2.5,3.2 4.3,6.7 z"
+ id="path36"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 504.9,311.9 c -1.8,1.4 -2.8,1.7 -4.2,0.9 -2.6,-1.4 -4.5,0.5 -2.7,2.7 2.8,3.4 4.7,3.6 7.9,0.9 4.7,-3.9 3.7,-8.3 -1,-4.5 z"
+ id="path37"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 519.8,312.6 c -1.5,3.3 0,5.9 3.3,5.9 2.8,0 3.7,-3.1 1.9,-6.4 -1.5,-2.9 -3.8,-2.6 -5.2,0.5 z"
+ id="path38"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 477.4,321.4 c -0.9,2.4 0.3,4.7 2.1,4 1.8,-0.7 1.6,-4.5 -0.2,-5.2 -0.7,-0.2 -1.6,0.3 -1.9,1.2 z"
+ id="path39"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 450.8,321.7 c -5.8,0.5 -6.3,2.2 -1.4,5.2 4.3,2.7 5.5,2.6 8.9,-0.5 3.3,-2.8 3,-5.5 -0.5,-5.2 -1.3,0.1 -4.4,0.3 -7,0.5 z"
+ id="path40"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 129,284 -4.4,5 h -7 c -3.9,0.1 -9.1,0.5 -11.6,1.1 -11.8,2.5 -11.6,2.6 -16.8,-2.3 -5.8,-5.4 -10.4,-7.5 -14,-6.2 -3.1,1.1 -3.5,2.6 -5.2,19.9 -1,9.8 -1.5,12.2 -3.1,13.3 -2.3,1.6 -2.4,4.3 -0.4,8.2 1.2,2.4 1.5,6.2 1.2,19.5 -0.2,9.1 -0.6,16.7 -0.9,17 -0.3,0.3 -2.5,1.6 -4.9,2.8 -3,1.5 -5.3,3.8 -7.4,7.2 -2.8,4.7 -3,5.7 -3,14.5 0.1,9.2 0.2,9.8 3.9,16.3 2.1,3.8 5.2,8.4 6.9,10.4 2.9,3.3 3.2,4.3 3.2,10.2 v 6.6 l 6,0.3 c 3.3,0.2 6.4,0.7 6.9,1.3 1.7,1.6 3.7,1 6.6,-2.1 l 2.8,-3 16.9,0.1 c 9.2,0 19.1,-0.3 22,-0.6 5.1,-0.7 5.3,-0.7 9.4,3.4 2.3,2.2 4.5,4.1 4.8,4.1 0.3,0 2.4,-1.2 4.6,-2.5 2.2,-1.4 5.2,-2.5 6.7,-2.5 2.2,0 3.4,-1 6.1,-5.3 1.9,-2.8 4.9,-6.6 6.7,-8.2 1.8,-1.7 4.3,-4.6 5.6,-6.5 1.3,-1.9 4,-5.5 5.8,-8 1.9,-2.5 3.5,-4.8 3.5,-5.2 0.1,-0.4 2,-4 4.4,-8 4,-6.9 7.7,-15.9 7.7,-19.1 0,-1.1 -2.5,-7.1 -3.5,-8.5 -0.1,-0.1 -1.3,0.2 -2.6,0.7 -4.2,1.5 -8.8,6.7 -11.4,12.5 -1.4,3.1 -2.9,5.6 -3.5,5.6 -0.5,0 -1,-0.4 -1,-0.8 0,-0.5 -1.4,-3 -3.1,-5.6 -3.1,-4.7 -9.4,-9.6 -12.3,-9.6 -4.1,0 -3,-10.2 1.9,-18.3 5.1,-8.5 6.1,-13.2 4.1,-20.1 -1.1,-3.5 -1.4,-7 -1,-9.2 0.6,-3.3 0.3,-3.9 -4.9,-8.9 -4.9,-4.8 -12.7,-16.1 -12.7,-18.4 0,-0.5 -0.9,-2 -2.1,-3.5 -3.1,-3.9 -5.9,-3.3 -10.9,2.4 z m 11.3,7.5 c 2,4.1 4.1,7.5 4.7,7.5 0.5,0 1,0.4 1,1 0,0.5 1.5,3.1 3.4,5.7 3.7,5.2 6.6,15.1 6.6,22.4 0,2.9 -0.9,6 -2.5,8.9 -5.5,9.7 -5.9,11.1 -6.2,23.6 -0.1,6.6 -0.7,17 -1.3,23 -0.6,6 -1.3,17 -1.6,24.4 -0.5,12.6 -1.6,18 -3.6,18 -1.8,0 -2.6,-5 -3.2,-19.8 -0.4,-8.5 -1,-16 -1.3,-16.8 -0.8,-2.3 -3.2,-1.6 -3.9,1.1 -0.7,2.7 0,18.5 1,22.5 1.2,4.5 -0.4,5.4 -10.6,5.6 -5.1,0.1 -15,0.4 -22,0.8 -9.6,0.4 -12.9,0.2 -13,-0.7 -0.1,-0.7 -0.2,-7.8 -0.3,-15.9 0,-14.5 -0.5,-17.2 -2.7,-15 -0.8,0.8 -1.1,5.9 -0.9,16.6 0.3,16.8 -0.4,20 -4.2,19.4 -2.1,-0.3 -2.2,-0.8 -2.7,-16.3 -0.3,-8.8 -0.9,-16.5 -1.2,-17.1 -0.4,-0.6 -1.4,-8 -2.2,-16.5 -2.4,-25.2 -0.5,-78.4 3,-85.1 l 1.5,-2.9 3.7,2.3 c 2,1.2 4.6,3.4 5.8,4.7 2.3,2.7 4.1,2.9 27.1,2.3 l 11.2,-0.2 4.1,-5.5 c 2.2,-3 4.6,-5.5 5.3,-5.5 0.7,0 2.9,3.4 5,7.5 z m 47.1,73.1 c 0.4,1 -0.1,3.8 -1.1,6.3 -2,5.3 -9,18.8 -11,21 -0.8,0.9 -3.6,5.1 -6.4,9.4 -2.7,4.3 -5.6,8 -6.5,8.4 -0.8,0.3 -2,1.7 -2.5,3 -0.9,2.6 -2.9,2.3 -2.9,-0.4 0,-0.9 2,-5.2 4.4,-9.7 2.4,-4.5 6.7,-12.6 9.6,-18.1 10.1,-19.2 14.6,-24.7 16.4,-19.9 z m -28.3,2.7 c 4.9,4.4 7.3,8.6 7.1,12.3 -0.3,3.5 -6.2,18.5 -11.1,27.9 -2.1,4.2 -3.1,7.4 -3.1,10.7 0,2.6 -0.5,5 -1.1,5.3 -1.6,1 -2.1,0.1 -2.3,-4.2 -0.1,-2.1 -0.5,-4.3 -0.8,-4.9 -0.9,-1.3 1.8,-29.8 3.2,-34.4 0.5,-1.9 1,-6 1,-9.1 0,-8.1 1.3,-8.8 7.1,-3.6 z m -91.7,-0.1 c 1.7,2.7 3.1,10.9 4.6,26.9 1.8,20.3 1.2,23.1 -3.7,17.6 C 65.7,408.8 59,398.3 59,397 c 0,-0.6 -0.4,-1.8 -0.9,-2.8 -0.5,-0.9 -1.4,-4.2 -2.1,-7.3 -0.9,-5 -0.8,-6.3 0.9,-10.9 1.9,-4.9 6.4,-11 8.3,-11 0.4,0 1.4,1 2.2,2.2 z"
+ id="path41"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 134,305.9 c -1.4,2.7 -1.3,5.8 0.3,6.4 0.6,0.2 2.7,0.2 4.5,0 2.5,-0.4 3.2,-1 3.2,-2.8 0,-4.8 -5.9,-7.4 -8,-3.6 z"
+ id="path42"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 82.2,308.3 c -1.9,2.3 -2.4,6.3 -0.9,7.5 1.1,1 1.7,0.9 2.7,-0.3 0.9,-1.1 2.3,-1.3 5.1,-0.9 3.2,0.5 3.9,0.4 3.9,-1 0,-2.4 -4.8,-6.6 -7.5,-6.6 -1.3,0 -2.7,0.6 -3.3,1.3 z"
+ id="path43"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 112.2,312.2 c 0.3,2.5 3.4,3.6 5.1,1.9 1.4,-1.4 -0.9,-4.1 -3.5,-4.1 -1.4,0 -1.9,0.6 -1.6,2.2 z"
+ id="path44"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 771.2,356.7 c -1.7,0.6 -4.5,6.4 -7.2,14.4 -1.5,4.3 -3.4,7.7 -6.2,10.6 -3.9,4 -4.1,4.3 -3.5,9.5 0.5,5.8 -1,10.1 -4,11.2 -0.9,0.4 -9.8,0.6 -19.7,0.5 -10,0 -24,0.2 -31.2,0.6 l -13,0.8 -2.2,-2.8 C 683,400 682,398 682,397 c 0,-2.9 4.3,-5.9 11,-7.6 11.2,-2.8 17.1,-7 18.6,-13.1 0.8,-2.9 -0.9,-7.1 -3.2,-8 -1.7,-0.6 -8.7,1.3 -12.1,3.3 -1.2,0.8 -5.5,1.9 -9.5,2.5 -8.1,1.2 -11.6,3 -16.9,8.6 -7.3,7.7 -8.4,16 -3.3,25.2 2.8,5 3,9.1 0.9,15.1 -1.2,3.4 -1.5,10.4 -1.5,36.9 v 32.6 l 2.5,3.8 c 3.4,4.8 6.7,5 9.5,0.4 1.1,-1.7 2,-4.2 2,-5.3 0,-1.2 0.7,-3.8 1.5,-5.7 0.8,-2 1.5,-4.8 1.5,-6.2 0,-2.9 3.6,-10.5 4.9,-10.5 1.3,0 3.9,7.7 5,14.6 1,6.8 3.7,12.9 7,15.8 4.4,4 10.8,-1.3 8.3,-6.9 -1.4,-3.1 -2.7,-17.4 -1.8,-20.8 l 0.6,-2.5 h 25.3 c 21.5,0.1 25.7,-0.2 27.8,-1.5 3.3,-2.2 9.8,-3.1 13.1,-1.8 2.7,1 5.8,6.4 5.8,10.2 0,2.6 4.8,16.9 6.6,19.6 1,1.7 2.4,2.3 4.9,2.3 4.5,0 4.8,-1.4 3.6,-15.1 -1.1,-12.5 -0.4,-17.3 2.5,-17.7 3.8,-0.5 7.4,4.9 10,15 1.9,7.1 3.2,10 5.6,12.5 3.5,3.6 8.1,4.5 9.2,1.7 1,-2.7 0.7,-9.9 -0.8,-14.5 -2.7,-8.4 -4.9,-26.8 -4.3,-35.1 0.7,-8.9 3.9,-17.4 6.9,-18.4 1.1,-0.3 4.8,-3.3 8.2,-6.5 4.5,-4.2 6.6,-7.1 7.5,-10.1 0.7,-2.4 1.7,-5.3 2.2,-6.6 1.6,-4.1 1.1,-7.2 -1.4,-8.3 -2.6,-1.2 -6.9,-12.4 -7.3,-19 -0.3,-5.3 -4.5,-13.9 -6.8,-13.9 -1,0 -4.3,2.5 -7.3,5.6 l -5.6,5.6 -5.1,-0.6 c -2.8,-0.4 -8.1,-1.1 -11.7,-1.5 -8,-1 -12.1,-3.2 -15.6,-8.6 -4.1,-6.1 -5.7,-7.2 -9.1,-5.8 z m 7.3,11.3 c 5.3,6.6 8.8,7.8 23.9,8.6 l 12.5,0.7 4.2,-4.1 c 5.7,-5.8 7.9,-5.3 7.9,1.6 0,3.1 1.6,8.3 4.1,13.7 2.9,6.2 4.2,14.7 2.9,19.5 -1.1,4 -6.1,9.6 -11.8,13 -4.1,2.5 -8,7.6 -9.1,11.8 -1.3,4.7 -0.7,31.7 0.9,39.7 0.7,3.3 2.1,8.1 3.2,10.7 2,4.6 1.9,7.8 -0.1,7.8 -1.5,0 -4.7,-6 -7.1,-13.5 -3.6,-11.3 -3.9,-12 -7,-13.8 -4.1,-2.4 -11.9,-3.4 -13.1,-1.6 -1.5,2.3 -1,15.7 0.8,22.5 1.2,4.5 1.4,6.7 0.6,7.5 -1.4,1.4 -4.3,-1.5 -4.3,-4.4 -0.1,-1.2 -0.7,-3.3 -1.5,-4.7 -0.8,-1.4 -1.4,-3.7 -1.5,-5.1 0,-3.9 -2.8,-11 -5.2,-13.6 -1.8,-1.9 -3.2,-2.3 -8.7,-2.3 -3.6,0 -10.4,0.5 -15.1,1.2 -4.7,0.6 -18,1.2 -29.6,1.2 -16.6,0.1 -21.5,0.4 -22.8,1.5 -1.4,1.2 -1.6,2.7 -1.2,9.3 0.4,4.4 1.1,8.8 1.6,9.8 1.2,2.3 1.3,10.7 0.1,11.4 -1.7,1.1 -4.2,-4.5 -6.1,-13.6 -2.1,-10.1 -5.7,-18.1 -8.4,-18.6 -3.4,-0.7 -6.8,4.3 -9.5,14.3 -0.6,2.2 -1.8,6.6 -2.7,9.7 -1.6,6.1 -3.9,7.7 -4.9,3.5 -0.3,-1.2 -0.5,-7.6 -0.3,-14.2 0.1,-6.6 0.1,-19 -0.1,-27.5 -0.2,-9.8 0.1,-17.8 0.9,-21.8 1.5,-7.6 0.8,-19.5 -1.4,-23.7 -2.3,-4.3 -2.1,-12 0.4,-16 3.9,-6.3 17.2,-12.5 26.6,-12.5 1.7,0 3.7,-0.7 4.4,-1.5 1.8,-2.1 5,-1.9 5,0.3 0,3.3 -6.1,8.1 -11.8,9.2 -5,0.9 -10.8,3.5 -14.6,6.4 -2.6,2.1 -3.3,9.4 -1.2,13.4 2.1,4 7.6,5.6 15.9,4.7 3.2,-0.4 17.6,-0.8 31.9,-0.9 l 26,-0.1 2.3,-2.7 c 2.4,-2.7 5.5,-11.8 5.5,-15.8 0,-1.2 1.1,-4 2.5,-6.4 1.3,-2.3 3.1,-6 3.9,-8.1 2.9,-8.1 4.7,-11.5 5.9,-11.5 0.6,0.1 3,2.3 5.2,5 z"
+ id="path45"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 775.5,387 c -0.4,0.7 -0.3,1.6 0.3,2.2 1.4,1.4 4.5,0.2 4,-1.5 -0.6,-1.6 -3.4,-2.1 -4.3,-0.7 z"
+ id="path46"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 821.3,388.7 c -0.7,0.3 -1.3,1.6 -1.3,2.9 0,1.9 0.5,2.4 2.5,2.4 1.8,0 2.5,-0.5 2.5,-1.9 0,-2.2 -2,-4 -3.7,-3.4 z"
+ id="path47"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 795.7,390.2 c -0.6,1.8 2.1,6.8 3.6,6.8 1.7,-0.1 4.7,-2.5 4.7,-3.9 0,-0.7 -1.6,-1.9 -3.5,-2.7 -4.2,-1.7 -4.2,-1.7 -4.8,-0.2 z"
+ id="path48"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 220.4,467.7 c -1.6,2.1 -3.5,5 -4.3,6.4 -2.1,4.3 -6.2,6.6 -14.7,8.4 -12.2,2.7 -15.2,2.5 -20.9,-1.3 -4.9,-3.3 -11.7,-4.4 -13,-2.1 -0.4,0.6 -0.9,4.7 -1.2,9.2 -0.4,6.3 -1.2,9.7 -3.5,14.5 -2.3,5 -3.1,8.2 -3.4,14.3 -0.2,4.4 -0.9,8.9 -1.4,10 -1.6,2.9 -0.4,5.3 3.8,7.7 2.1,1.1 6.3,4.5 9.3,7.4 3,2.9 7.6,7 10.2,9.1 7,5.6 6.6,8.1 -2,14.4 -3.8,2.7 -8.2,5.5 -9.9,6.2 -1.7,0.6 -4.5,2.5 -6.3,4.2 -2.7,2.4 -3.2,3.5 -2.9,6.6 l 0.3,3.8 5.8,-0.1 c 4.2,-0.1 6.4,-0.7 8,-2.1 3.8,-3.4 15,-10.9 19.2,-12.8 2.2,-1 5.4,-2.9 7.2,-4.2 3.7,-2.8 5.9,-2.3 4.2,0.9 -0.6,1.1 -3.8,4.5 -7.2,7.6 -10.8,10 -10.7,9.9 -10.7,13.5 0,1.9 0.6,4 1.4,4.6 2.2,1.9 8.4,0.2 13.7,-3.6 2.5,-1.8 5.1,-3.3 5.6,-3.3 0.6,0 3.6,-2.6 6.7,-5.7 l 5.6,-5.7 5.3,1.7 c 3,0.9 7.1,1.7 9.1,1.7 4.8,0 17.7,-2 19.6,-3 0.9,-0.5 6.3,-1.3 12,-1.9 25.9,-2.8 39.8,-7.3 48.7,-16 8.7,-8.5 11.8,-18.5 11,-35.6 -0.8,-15.9 -3.5,-23.2 -12.9,-34.6 -4.8,-5.9 -15.9,-11.8 -24.3,-13 -8.7,-1.2 -22.2,0.6 -34.6,4.7 -5.8,2 -11.6,3.4 -12.9,3.2 -1.6,-0.2 -3.2,-2.2 -5.7,-6.8 -7.3,-13.5 -9.7,-14.9 -14.9,-8.3 z m 9.8,8.9 c 5.2,10.6 10.4,13.5 18.1,10 1.8,-0.8 6.8,-2.4 11.2,-3.6 4.4,-1.2 8.8,-2.6 9.7,-3.1 1,-0.5 6,-0.9 11.1,-0.9 8.5,0 9.8,0.3 16.6,3.5 7.7,3.7 15.5,10.8 18.5,16.9 2.1,4.4 6.3,18.2 7.1,23.8 0.7,4.5 -0.3,8.5 -5.2,22.5 -1.8,5.1 -8.8,12.2 -14.8,15.2 -6.8,3.4 -17.3,6.3 -24.5,6.8 -3.6,0.3 -7,0.9 -7.7,1.5 -0.6,0.5 -5.8,1.4 -11.5,1.9 -5.7,0.6 -12.5,1.7 -15.1,2.5 -5.7,1.9 -15.1,1.1 -18.3,-1.4 -2.3,-2 -4.4,-7.2 -4.4,-11.2 0,-3 4,-8 6.5,-8 1.1,0 1.5,1.2 1.5,5 0,8.1 5.6,11.3 12.8,7.6 3.3,-1.7 10.8,-3.1 24.7,-4.7 5.5,-0.6 12,-1.7 14.5,-2.4 2.5,-0.7 5.6,-1.6 7,-1.9 1.4,-0.3 4.4,-2.1 6.5,-4 3.6,-3.1 3.8,-3.5 2.1,-4.2 -1,-0.4 -2.6,-0.2 -3.5,0.4 -4,2.9 -9.8,5.2 -12.8,5.2 -1.8,0 -5,0.6 -7,1.4 -4.9,1.8 -15.1,2.8 -17.3,1.6 -2.9,-1.5 -5.2,-10.6 -5.4,-20.5 -0.1,-7.8 0.3,-9.7 2.4,-14 1.4,-2.7 4.4,-6.9 6.8,-9.3 2.3,-2.3 4.2,-4.6 4.2,-5.1 0,-1.4 13.8,-4.3 18.8,-3.9 4,0.2 4.7,0 5,-1.6 0.7,-3.3 -2.3,-4.5 -9.6,-3.9 -13.1,1.1 -25.5,11.3 -30.4,25.1 -3.3,9.2 -3.4,13.6 -0.8,22 1.1,3.5 2,7.7 2,9.3 0,2.6 -0.6,3.2 -4.7,4.9 -2.7,1.1 -5.6,2.4 -6.5,3 -2.8,1.6 -4.9,-1.4 -4.3,-6 0.5,-4.3 -2.3,-9 -5.5,-9 -1,0 -4.2,2.2 -7.1,5 -3,2.7 -6.4,5 -7.5,5 -1.2,0 -2.7,0.7 -3.4,1.5 -0.7,0.8 -2.5,1.5 -4,1.5 -1.6,0 -6,2.2 -11.1,5.6 -4.6,3.1 -9.1,5.9 -9.9,6.2 -0.8,0.3 -4.5,2.5 -8.3,4.9 -6.9,4.4 -10.7,5.4 -10.7,2.8 0,-0.8 1.2,-2.2 2.8,-3.2 1.5,-0.9 3.2,-2.1 3.7,-2.7 0.6,-0.6 2.8,-2 5,-3.1 4.7,-2.4 13.5,-10.7 13.5,-12.8 0,-4 -3.4,-8.9 -10.2,-14.5 -12.2,-10 -16.6,-16.3 -17.3,-24.7 -0.3,-3.5 2.8,-13.9 5.3,-17.5 1.1,-1.6 1.9,-5.3 2.2,-10.5 0.7,-10.6 1.6,-10.7 13.7,-1.9 2,1.4 2.9,1.4 7.5,0.4 2.9,-0.7 6.2,-1.9 7.2,-2.6 1.1,-0.7 4.7,-1.6 8,-2 5.2,-0.6 6.6,-1.2 9.4,-4.2 1.8,-1.9 4.2,-5.2 5.3,-7.3 1,-2.1 2.6,-3.9 3.4,-3.9 0.8,0 2.9,2.9 4.7,6.6 z M 218,568.4 c -0.1,5 -0.8,6 -9,12.3 -11.5,8.7 -19,12.3 -19,9 0,-0.7 4.4,-5.7 9.8,-11.2 5.3,-5.5 11,-11.5 12.5,-13.3 3.6,-4.2 5.7,-3 5.7,3.2 z"
+ id="path49"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 230.6,501.5 c -1.1,0.8 -3.3,1.5 -4.8,1.5 -1.7,0 -3.1,0.7 -3.5,1.5 -0.7,1.9 2.3,4.4 5.3,4.5 2.7,0 7.8,-5.4 7.1,-7.4 -0.8,-2 -1.6,-2 -4.1,-0.1 z"
+ id="path50"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 246.1,502.4 c -1.9,2.3 -1,6.1 1.4,6.1 1.6,0 2,-0.7 2,-3.4 0,-3.8 -1.5,-5 -3.4,-2.7 z"
+ id="path51"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 201.3,511.6 c -0.8,2.1 2.8,5.7 5,4.8 1.8,-0.7 3.1,-3.9 2.2,-5.4 -1,-1.6 -6.5,-1.2 -7.2,0.6 z"
+ id="path52"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 173,513.5 c -1.6,1.9 2.8,5.5 6.7,5.5 2.2,0 6.1,-3 6.5,-5 0.2,-1.2 -0.9,-1.5 -6,-1.5 -3.5,0 -6.7,0.5 -7.2,1 z"
+ id="path53"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 524.5,489.3 c -0.8,1.8 -2.4,6.3 -3.5,10.2 -2.8,9.5 -8.1,18.9 -10.8,19.3 -3.6,0.5 -4.4,3.4 -3.1,10.9 0.6,3.8 1.5,7.6 2,8.5 0.5,1 0.9,2.4 0.9,3.1 0,0.8 2.3,4 5,7.1 8.6,9.8 8.2,7.9 8.3,43.5 0,17.4 0.4,32.4 0.9,33.3 1.3,2.6 3.1,2.2 5.7,-1.2 l 2.2,-3.1 10.2,0.5 c 8.3,0.4 10.4,0.8 11.2,2.2 0.6,0.9 1.8,2.6 2.8,3.6 2.2,2.4 5.4,0.9 6.8,-3.2 1.7,-4.7 3.4,-4.3 7.6,1.7 l 3.8,5.5 6,-0.6 c 3.3,-0.4 9.1,-0.9 12.8,-1.3 6.8,-0.6 6.9,-0.5 6.5,1.7 -0.3,2.2 -7.6,8 -21.5,16.9 -4.6,2.9 -10.2,9.6 -10.3,12.2 0,2.2 4.2,5.9 6.8,5.9 2.9,0 13,-3.8 16.7,-6.3 6.1,-4.2 22.8,-21.4 26.3,-27.2 l 3.7,-6 V 605 c 0,-17.5 -0.4,-23 -1.9,-29.5 -2.6,-11.1 -8.1,-27.7 -12.1,-36 -3.1,-6.6 -4.8,-11.6 -6.6,-19.5 -1.2,-5.4 -5.4,-17 -7.7,-21.5 -3.1,-6.2 -8.4,-11.5 -11.2,-11.5 -2.4,0 -6.2,3.7 -8.8,8.7 -1.9,3.6 -6.5,4.4 -18.9,3.4 l -11.2,-0.9 -5.7,-5.1 c -3.1,-2.7 -7,-5.5 -8.6,-6 -2.7,-0.9 -3,-0.8 -4.3,2.2 z m 60.9,5.8 c 4.6,5.4 7,11.4 11.1,27.9 1.8,7.1 5.5,16.9 9,24 1.2,2.5 3.8,9.7 5.8,16 4.1,13.2 5.7,26.4 5.8,47.6 0.1,12.5 -0.1,14.5 -2.1,18.5 -2.7,5.5 -21.6,24 -28.5,28 -5.2,3 -10.8,3.8 -12.1,1.7 -0.9,-1.3 1.8,-3.7 15.3,-13.6 11.6,-8.4 19.5,-16 19.1,-18.2 -0.3,-1.2 -2.2,-1.5 -11.3,-1.5 -6.1,0 -12.9,0.3 -15.2,0.8 -3.3,0.5 -4.5,0.3 -5.8,-1 -1.6,-1.6 -1.6,-1.7 0.1,-3 1,-0.7 2.6,-1.3 3.6,-1.3 2.8,0 3.8,-3.2 3.7,-12.6 0,-4.9 0.4,-10 0.9,-11.4 1.2,-3.1 7.7,-9.9 10.6,-11 1.8,-0.7 1.5,-0.9 -1.4,-0.9 -9.7,0.1 -15.4,10.4 -15.5,27.9 v 5.5 h -6 c -5.5,0 -6,-0.2 -6.3,-2.3 -0.2,-1.2 0.6,-4.6 1.7,-7.6 2.5,-6.8 3.2,-17.1 1.2,-17.1 -1.7,0 -2.6,2.8 -4.5,14.5 -1.8,10.5 -3.9,16.5 -5.7,16.5 -1.6,0 -1.6,-2.3 0,-17.4 1.1,-9.4 1,-10.6 -0.5,-12.3 -2.9,-3.1 -3.7,-0.6 -3.8,12.2 -0.1,9.1 -0.5,12.3 -1.6,13 -1.8,1.1 -11.6,0 -15.8,-1.7 -2.8,-1.2 -3.3,-1.8 -2.8,-3.7 0.6,-2.4 2.1,-12.4 3.3,-20.9 0.5,-4.3 0.4,-4.7 -1.4,-4.7 -2.3,0 -3.3,3.3 -3.3,11.1 0,2.7 -0.4,4.9 -0.9,4.9 -0.4,0 -1.1,2.6 -1.5,5.7 -0.8,7.2 -1.9,9.4 -3.4,6.6 -0.8,-1.4 -0.8,-4.2 0,-9.4 0.6,-4.1 1.2,-15.7 1.2,-25.9 0.1,-18.3 0.1,-18.6 -2.7,-24.5 -1.5,-3.3 -4.1,-7.4 -5.6,-9 -9.2,-9.9 -9.4,-13.9 -1.5,-30.3 3,-6.4 6.1,-13.9 6.8,-16.7 2,-7.5 3.6,-7.9 9.3,-2.2 2.8,2.8 6.2,5.1 8.2,5.6 6.2,1.6 27.9,2.2 29.1,0.8 0.6,-0.7 2.9,-3.6 5.2,-6.5 2.3,-2.8 4.5,-5.2 4.9,-5.2 0.4,0 1.9,1.4 3.3,3.1 z"
+ id="path54"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 568.5,517.8 c -2.2,2.2 1.3,8.2 4.8,8.2 1.9,0 5.1,-5.5 4.3,-7.5 -0.5,-1.3 -7.9,-1.9 -9.1,-0.7 z"
+ id="path55"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 522.6,520.5 c -0.8,2.3 1.1,5.5 3.3,5.5 1,0 2.9,-0.9 4.2,-1.9 2.9,-2.3 2,-3.6 -3.2,-4.5 -2.8,-0.5 -3.8,-0.3 -4.3,0.9 z"
+ id="path56"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 546.2,524.2 c -0.7,0.7 -1.2,2 -1.2,3.1 0,1.4 0.6,1.8 2.7,1.5 3.1,-0.3 4.4,-3.5 2.1,-4.9 -1.7,-1.2 -2.2,-1.1 -3.6,0.3 z"
+ id="path57"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 580.8,527.1 c -2.4,1.3 -2.3,3.6 0.2,4.9 4.2,2.3 8,-1.6 4.8,-4.8 -1.4,-1.4 -2.7,-1.5 -5,-0.1 z"
+ id="path58"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 401,494.7 c -7.4,9 -12.3,42.8 -8.6,58.6 2,8.3 2,8.2 0,10.1 -2.7,2.7 -6,1.8 -13.5,-3.9 -11,-8.3 -12.9,-7.4 -12.9,6.1 0,5.2 -0.1,5.4 -3.6,6.9 -2,0.8 -5.2,2.9 -7.1,4.6 -4,3.5 -6.8,3.4 -14.2,-0.7 -2.4,-1.3 -5.1,-2.4 -6.1,-2.4 -3.5,0 -4,6.3 -1,12.5 1.1,2.2 1.9,5.4 2,7.2 0,1.8 0.7,5.3 1.6,7.9 1.4,4 2.1,8.8 2.3,14.2 0.1,0.7 1.3,1.7 2.9,2.3 1.5,0.5 4.4,2.9 6.5,5.3 5.2,6.1 12.2,10.6 16.6,10.6 5,0 5.8,0.8 7.4,7 1.5,5.6 3,9.3 7.6,19 2.4,5.1 2.6,6.5 2.6,19.5 0,7.7 0.4,14.6 0.8,15.2 0.5,0.7 2.1,1.3 3.6,1.3 6.1,0 12.1,-11.4 12.1,-23.3 0,-9.5 0.3,-9.7 12.9,-9.7 11.9,0 12.1,0.1 12.1,6.3 0,7.6 6.3,21.6 10.5,23.5 2.9,1.3 5.5,1.5 7.9,0.6 2.6,-1 2.2,-12.3 -0.5,-16.9 -2.7,-4.5 -2.2,-10.6 1.8,-21 2.4,-6.4 2.6,-8.5 3,-25.9 0.3,-11.5 0.1,-19.7 -0.5,-21 -0.6,-1.1 -1.8,-4.1 -2.7,-6.6 -1.7,-4.5 -9.6,-14.7 -12.1,-15.7 -0.8,-0.3 -3.1,-2.1 -5.2,-4.2 -2.1,-2 -6,-5.4 -8.6,-7.6 -6.6,-5.6 -7.7,-10 -7.6,-32.5 0,-9.6 0.4,-20.2 1,-23.5 1.4,-8.8 1.2,-17.5 -0.6,-22.8 -1.4,-4.1 -1.9,-4.7 -4.4,-4.7 -2.1,0 -3.7,1 -6,3.7 z m 6.5,13.8 c -0.1,6.1 -0.7,17.8 -1.4,26.2 -1.3,13.8 -1.3,15.9 0.3,23.9 1.7,8.3 6.5,19.4 8.9,20.3 2.5,1 18.6,15.4 20.9,18.8 1.5,2.1 4,7.8 5.7,12.7 3.7,10.5 4.3,23.5 1.5,30.2 -2.3,5.4 -5.4,22.4 -5.4,29.3 0,3.2 0.7,8.2 1.6,11 1.4,4.1 1.4,5.3 0.4,6.6 -0.9,1.1 -1.7,1.2 -3.1,0.4 -2.8,-1.5 -4.7,-5.9 -6,-14.1 -0.7,-4.4 -2.1,-8.8 -3.6,-11.1 l -2.4,-3.9 -13,0.3 c -7.7,0.2 -13.3,0.7 -13.9,1.4 -0.5,0.6 -1.4,5.1 -2,10 -1.9,14.5 -2,14.9 -3.9,17.4 -2.7,3.5 -5.6,2.2 -4.6,-2.2 2,-8.8 0.2,-22.2 -4.3,-31.8 -1.6,-3.5 -3.9,-9.5 -5.1,-13.3 -4.1,-13.4 -2.2,-33.8 4,-42.8 1.1,-1.4 1.9,-3 1.9,-3.4 0,-1.4 4.5,-7.4 5.5,-7.4 0.6,0 3.2,-2.3 5.9,-5.1 l 4.8,-5.1 -0.6,-6 c -0.4,-3.3 -1.2,-7.2 -1.8,-8.6 -0.7,-1.6 -1.2,-10.3 -1.2,-21.7 -0.1,-16.6 0.2,-20.2 2.3,-28.5 2.5,-10.5 4.8,-15.2 7.1,-14.8 1.2,0.3 1.5,2.3 1.5,11.3 z M 377.9,564 c 2.4,1.7 5.2,3 6.1,3 1,0 2.3,0.7 3,1.5 0.7,0.8 1.9,1.5 2.6,1.5 1.7,0 5.4,3.5 5.4,5.1 0,0.6 -3.3,4.3 -7.2,8.3 -4,3.9 -8.3,9.2 -9.4,11.6 -6.6,13.7 -6.8,14.4 -7.2,23.8 -0.4,7.7 -0.7,9.4 -2.3,10.3 -2.7,1.4 -7.5,-0.9 -14,-6.6 -6.5,-5.8 -10.7,-13.9 -13.9,-27 -1.2,-5 -2.7,-10 -3.3,-11.3 -1.8,-3.7 0.5,-4.9 4.2,-2.1 4.6,3.4 10.8,3.2 15.7,-0.6 2.1,-1.7 5.5,-4.1 7.4,-5.4 4.5,-3 5,-3.8 5,-8.3 0,-4.4 0.8,-6.8 2.4,-6.8 0.6,0 3.1,1.4 5.5,3 z"
+ id="path59"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 406.6,599.5 c -1.2,1.3 -1.3,2.1 -0.4,4 1.9,4.2 6.4,2.2 4.8,-2.1 -1.2,-3.1 -2.6,-3.7 -4.4,-1.9 z"
+ id="path60"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 380.7,574.6 c -1.3,1.3 -0.7,4.4 0.7,4.4 0.8,0 1.7,-0.4 2,-0.9 0.7,-1.1 -1.8,-4.4 -2.7,-3.5 z"
+ id="path61"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 365.8,587.7 c -2.9,0.7 -2.3,5.1 0.8,5.9 3.1,0.8 4.7,-0.6 4.2,-3.7 -0.3,-2.4 -1.9,-3.1 -5,-2.2 z"
+ id="path62"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 349,600 c 0,2.5 0.4,3.1 1.8,2.8 1.1,-0.2 1.7,-1.2 1.7,-2.8 0,-1.6 -0.6,-2.6 -1.7,-2.8 -1.4,-0.3 -1.8,0.3 -1.8,2.8 z"
+ id="path63"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 849.2,521.2 c -1.1,1.3 -2.4,3.6 -2.8,5.2 -0.4,1.6 -1.8,4.5 -3.1,6.4 -1.2,1.9 -2.3,3.8 -2.3,4.2 0,2.7 -12.9,1.2 -22.5,-2.7 -2.9,-1.1 -7.5,-1.6 -16.5,-1.6 -12,0 -12.8,0.1 -19.2,3.2 -9.2,4.3 -16.4,11.6 -21.1,21.3 -2,4.2 -3.7,8.5 -3.7,9.6 0,1.1 -0.7,3.9 -1.5,6.2 -2,5.6 -1.9,10.8 0.4,21.1 2.6,11.9 5.2,17.1 11.6,23.2 6.5,6.3 16.3,10.5 27,11.9 3.9,0.4 9.7,1.2 13,1.7 3.3,0.5 9.6,1 14,1 4.4,0.1 11.8,0.8 16.5,1.6 8.9,1.6 15.4,1.2 19.9,-1.1 3.3,-1.8 5.3,-1.8 7.7,0.1 3.66122,3.39212 5.85278,2.92751 5.85278,0.22751 0,-1.2 -3.35278,-3.82751 -4.45278,-4.52751 -1.4,-0.8 -2,-2.3 -2,-4.7 0,-2.2 0.44665,-4.81655 2,-5.5 4.85334,-2.1354 4.1247,-5.06573 1.8247,-5.86573 -1,-0.4 -4.6247,-2.03427 -6.3247,-3.83427 -3.9,-4.5 -10.6,-5.8 -12.5,-2.4 -0.6,1.2 -1,4.6 -0.8,7.4 l 0.3,5.2 -3.9,-0.2 c -2.2,-0.2 -4.4,-0.7 -5,-1.3 -0.5,-0.5 -2,-1 -3.2,-1 -4,0 -4.5,-2 -2.8,-11.1 2.3,-12.2 0.7,-25.6 -3.7,-30 -1,-1 -1.9,-2.3 -1.9,-2.7 0,-1.9 -10,-10.3 -15.2,-12.6 -4.4,-2 -7.3,-2.6 -13,-2.6 -7.6,0 -9.8,0.9 -9.8,4.2 0,1.9 3.4,2.5 4.5,0.8 1,-1.5 8,-1.2 12.2,0.6 12.3,5.2 15.7,8.3 20.8,19 3.5,7.3 3.7,8.1 3.2,15.3 -0.3,4.9 -1.2,9 -2.5,11.4 -3.5,6.5 -4.1,6.9 -9.6,6.4 -10.9,-1 -24.3,-3.9 -28.5,-6.3 -6.2,-3.4 -8.6,-1.1 -3.6,3.6 4,3.8 26.9,7.7 37.5,6.4 3.1,-0.4 5.9,-0.1 8.4,1 2.4,1 6.8,1.6 11.7,1.6 8.7,0 9.2,-0.4 8.7,-7.4 -0.4,-6.3 3.8,-7.2 6.7,-1.5 3.2,6 0.4,14.8 -5.2,17 -4.4,1.6 -57.1,-2.9 -66.3,-5.8 -14.9,-4.6 -22.3,-11.1 -26.9,-24 -2.1,-5.5 -2.3,-7.6 -1.9,-19 0.5,-14.6 1.9,-18.7 9.4,-28.3 7.9,-10 12,-12.4 23.5,-14.1 7.7,-1.1 9.6,-1 20.9,1.1 6.9,1.2 13,2.7 13.6,3.2 0.7,0.5 3.4,1.1 6.1,1.4 3.8,0.5 5.2,0.3 6.2,-1 0.7,-0.9 1.9,-1.6 2.6,-1.6 1.1,0 4.3,-6.1 5.9,-11.7 0.4,-1.1 1.4,-2.7 2.2,-3.4 1.4,-1.1 2.1,-0.7 5.3,2.7 2,2.2 4.4,5.5 5.3,7.2 1.3,2.5 2.4,3.2 4.8,3.2 2.6,0 8.55889,1.16838 9.0988,-1.57417 C 877.01728,532.76023 869.5,533.1 867.1,532.7 c -1.6,-0.4 -3.2,-1.4 -3.5,-2.4 -0.8,-2.6 -9.2,-11.3 -10.9,-11.3 -0.7,0 -2.3,1 -3.5,2.2 z"
+ id="path64"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1"
+ sodipodi:nodetypes="cscscsccsccccsccccscssccccccsscsscssccccccccccsccccccccccccsccccssccsc" /><path
+ d="m 32,531.7 c -0.8,0.3 -2.8,1.8 -4.5,3.3 -1.6,1.6 -3.9,3 -5,3.1 -3.1,0.4 -16.7,-2.2 -19.7,-3.7 -2.8,-1.4 -4.8657393,-1.6614 -3.9269514,1.50225 L -0.53033009,538.9708 6.3,540.3 c 3.4,0.3 7.7,1.3 9.5,2.2 3.9,2 8.1,1.3 12,-1.9 1.5,-1.3 4.1,-3.1 5.9,-4 4.6,-2.3 6.3,-0.3 6.3,7.4 0,4.7 0.5,6.4 2.4,8.7 1.3,1.5 2.9,4.6 3.7,6.8 1.6,4.8 1.7,20.2 0.2,23 -0.6,1.1 -5.2,6 -10.2,11 -13.1,12.9 -14.8,17.7 -8.1,23.2 2.1,1.8 4.3,3.3 4.8,3.3 0.5,0 1.7,0.9 2.7,2 1,1.1 4.7,3.4 8.2,5 4.6,2.2 6.3,3.5 6.3,5 0,2.8 -3.8,2.6 -8.4,-0.5 -2.1,-1.4 -7.2,-4.4 -11.4,-6.7 -4.2,-2.2 -9.4,-5.2 -11.4,-6.4 -2,-1.3 -5.6,-2.6 -8,-3 -2.4,-0.3 -5.3,-1.3 -6.5,-2 -3.3,-2.1 -6.3550291,-1.83258 -6.3550291,1.46742 0,2 2.5550291,3.13258 3.5550291,3.13258 0.8,0 1.5,0.4 1.5,0.8 0,1.4 7.4,8.8 15.3,15.1 4.2,3.4 7.7,6.7 7.7,7.2 0,1.7 -3,2.2 -6.3,0.8 -4,-1.6 -16.8,-9.7 -18.4,-11.7 -1.1,-1.4 -2.8909903,-1.46517 -2.8909903,0.73483 0,2.8 7.6909903,9.36517 11.5909903,10.56517 1.2,0.4 4.1,2 6.5,3.6 3,2 5.5,2.9 8.4,2.9 3.5,0 4.1,-0.3 4.7,-2.6 1.2,-4.7 -0.8,-8.7 -6.1,-12.2 -6,-4 -13.5,-10.7 -13.5,-12.1 0,-0.5 0.5,-1.3 1,-1.6 1.1,-0.7 12.7,5.3 26.7,13.7 7.5,4.5 8.7,4.9 13.5,4.6 4.2,-0.2 5.4,-0.7 5.6,-2.1 0.9,-4.5 -0.8,-6.3 -10.2,-11.7 -5.3,-3 -11.4,-7 -13.7,-9 -3.5,-3 -4.1,-4 -3.6,-6.1 0.4,-1.4 1.4,-3.3 2.4,-4.2 1,-0.9 4.5,-4.5 7.8,-7.8 5.6,-5.7 7.4,-7.4 13.3,-13.1 1.7,-1.7 2.2,-2.9 1.7,-4.8 -0.3,-1.4 -0.8,-3.9 -1.1,-5.5 -2.2,-14.7 -2.9,-17.2 -5,-20.1 -1.6,-2.1 -2.9,-5.9 -3.9,-11.9 -0.9,-4.8 -1.8,-9.2 -2.1,-9.6 -0.6,-1 -8,-1.1 -10.4,-0.2 z"
+ id="path65"
+ style="display:inline;fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1"
+ sodipodi:nodetypes="sccssccccsscccccsscscccccssscsccscssccscscccccscccccccs" /><path
+ d="m 846,557.2 c 0,2.6 4,6.8 6.4,6.8 2.8,0 6.7,-3.5 6,-5.4 -0.3,-0.9 -2,-1.4 -4.2,-1.3 -2,0 -4.7,-0.3 -5.9,-0.8 -1.7,-0.5 -2.3,-0.4 -2.3,0.7 z"
+ id="path66"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 829.4,559.4 c -1.2,4.8 3.2,8.6 6.4,5.4 1.7,-1.7 1.5,-4.4 -0.4,-6.2 -2.3,-2.4 -5.3,-2 -6,0.8 z"
+ id="path67"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 4.4,565.4 c -1,2.6 0.4,4.8 2.8,4.4 3.3,-0.4 3.3,-5.2 0,-5.6 -1.3,-0.2 -2.5,0.3 -2.8,1.2 z"
+ id="path68"
+ style="display:inline;fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 27.3,564.7 c -2,0.7 -1.5,4.1 0.6,5.3 4.4,2.3 11.1,0.1 11.1,-3.8 0,-1.8 -2,-2.5 -3.6,-1.1 -1.1,0.9 -2,0.9 -4,0 -1.4,-0.6 -2.6,-1.1 -2.7,-1 -0.1,0 -0.8,0.3 -1.4,0.6 z"
+ id="path69"
+ style="display:inline;fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 301.3,656.5 c -1.2,0.9 -3.2,3.3 -4.4,5.5 l -2.3,4 h -11.5 c -6.4,0 -13.3,0.5 -15.3,1 -4.2,1.2 -7.8,-0.1 -11.3,-4 -2.4,-2.7 -7.4,-5 -10.9,-5 -2.1,0 -2.7,0.7 -3.5,3.7 -1.6,6.5 -3.4,16.6 -4.1,22.8 -0.3,3.3 -1.2,7 -2,8.2 -1.2,1.8 -1.2,2.8 -0.2,5.6 0.8,2.1 1.2,9.5 1.2,20.5 v 17.1 l -3.1,1.6 c -10.2,5.3 -14.6,13.7 -13.4,25.8 0.9,8.8 3.9,15.3 10.5,23 2.8,3.2 5,6.3 5,6.9 0,0.5 -0.8,2.6 -1.7,4.5 -2.3,5 -0.9,6.8 5.3,6.9 2.7,0.1 6.4,0.5 8.3,0.9 3,0.6 3.8,0.4 5.4,-1.6 1.8,-2.3 2.6,-2.4 14.6,-2.6 6.9,-0.2 17.5,-0.7 23.6,-1.3 l 11,-1 3.8,4.5 c 4.3,5 5.6,5.4 8.2,2.5 1,-1.1 2.5,-2 3.4,-2 2.8,-0.1 5.9,-2.4 8.9,-6.6 1.7,-2.3 5.2,-6.3 7.9,-9 4.4,-4.4 12.6,-15.9 16.1,-22.4 0.7,-1.4 1.9,-3.2 2.6,-4 0.6,-0.8 2.4,-3.8 3.9,-6.6 2.1,-4.1 2.7,-6.5 2.7,-11.7 0,-5.7 -0.3,-6.8 -2.2,-8.1 -1.2,-0.9 -2.6,-1.6 -2.9,-1.6 -1.5,0 -6.9,5.2 -8.4,8 -0.8,1.7 -2.2,4.3 -3.1,6 -1.7,3.3 -5.4,4.2 -5.4,1.2 0,-2.1 -8.7,-11.2 -10.7,-11.2 -5,0 -6.9,-9.4 -3.3,-16 7.3,-13.3 7.4,-13.8 6,-21.9 -0.8,-4.2 -1.3,-9.3 -1.2,-11.4 0.2,-3.5 -0.3,-4.4 -5.1,-9 -4.6,-4.5 -11.7,-14.5 -11.7,-16.5 0,-0.3 -1.2,-2.3 -2.6,-4.4 -2.9,-4.1 -4.8,-4.6 -8.1,-2.3 z m 4.9,6.2 c 0.8,1 2.5,3.8 3.7,6.3 1.3,2.5 4,6.8 6.2,9.7 2.1,2.9 3.9,5.5 3.9,5.9 0,0.4 0.6,1.5 1.3,2.3 1.3,1.5 2.9,7.5 4.3,15.3 0.7,4.5 -0.9,9.9 -5,15.8 l -3.1,4.5 -0.7,19 c -0.5,10.9 -1.5,22.2 -2.4,26.4 -1.3,5.7 -1.5,10.2 -1.1,18.6 0.7,13.2 0.3,15.7 -2.7,15.3 -2.5,-0.4 -3,-2.6 -4.6,-22.4 -0.6,-7.6 -1.3,-14.1 -1.5,-14.3 -0.2,-0.1 -0.9,0 -1.6,0.4 -0.9,0.6 -1,4.4 -0.6,14.6 0.3,8.3 0.1,14.1 -0.4,14.5 -1.7,1 -41.8,1.5 -43.6,0.5 -1.5,-0.8 -1.7,-2.5 -1.4,-13.8 0.3,-14.8 -0.3,-18.3 -3.1,-18.3 -1.9,0 -1.9,0.7 -1.7,17.2 0.3,18.2 -0.2,22.1 -2.9,21.6 -2.2,-0.4 -3.1,-5.3 -3.1,-16.3 0,-5 -0.4,-10.3 -1,-11.8 -0.6,-1.6 -1.1,-6.3 -1.1,-10.5 0,-4.2 -0.7,-13.3 -1.5,-20.2 -1,-8.3 -1.2,-15.4 -0.7,-21 0.4,-4.7 0.6,-9.2 0.4,-10 -0.3,-2 1.8,-43.9 2.4,-46.8 0.7,-3.7 4.4,-2.7 10.8,3 4.7,4.2 6.4,5.1 9.2,5 1.9,-0.1 3.9,-0.4 4.4,-0.7 0.4,-0.3 6.3,-0.5 13.1,-0.6 h 12.3 l 3.3,-3.7 c 1.8,-1.9 3.5,-4.4 3.9,-5.4 0.7,-2.3 2.7,-2.3 4.6,-0.1 z m 49.8,81.8 c 0,3.4 -7.4,18.8 -10.9,23 -1,1.1 -2.7,3.7 -3.9,5.8 -1.2,2 -2.6,4.3 -3.2,5 -0.5,0.6 -2.5,3.2 -4.3,5.7 -3.6,4.8 -6.7,6.4 -6.7,3.3 0,-1 1.8,-4.9 3.9,-8.6 2.2,-3.7 4.3,-7.7 4.6,-8.9 0.4,-1.3 1.3,-3 2,-3.8 0.8,-0.8 2.3,-3.5 3.5,-6 5.1,-10.9 12.2,-20.6 14.2,-19.4 0.4,0.3 0.8,2 0.8,3.9 z m -116.6,7 c 0.9,3.8 1.6,9.9 1.7,13.5 0,3.6 0.4,9.9 0.8,14 0.8,7.3 0.1,12 -1.7,12 -1.5,0 -9,-10.7 -11.1,-15.8 -1.1,-2.6 -2.8,-7.3 -3.7,-10.4 -1.7,-5.7 -1.7,-5.8 0.7,-12 1.9,-4.8 3.4,-6.9 6.4,-9 4.6,-3.1 4.4,-3.4 6.9,7.7 z m 90.4,-6.1 4.6,4.4 v 7.4 c 0,6.8 -0.4,8 -5.2,17.4 -2.9,5.6 -5.2,10.8 -5.2,11.7 0,2.2 -5.1,6 -6.4,4.7 -1.3,-1.3 1,-30.2 3.1,-38.3 0.8,-3.2 1.2,-6.6 0.9,-7.4 -0.7,-1.6 1,-4.3 2.6,-4.3 0.5,0 3,2 5.6,4.4 z M 241.5,799 c 0.3,0.6 -0.1,1.3 -1,1.6 -1.9,0.8 -3,0 -2,-1.5 0.8,-1.4 2.2,-1.4 3,-0.1 z"
+ id="path70"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 302.8,683.5 c -1.5,3.4 0.2,5.2 4.9,5.1 3.2,-0.2 3.9,-0.6 4.1,-2.6 0.7,-4.9 -6.9,-7 -9,-2.5 z"
+ id="path71"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 252.3,685.3 c -2.8,3.1 -3.6,6.7 -1.6,7.4 0.9,0.4 2.1,-0.1 2.9,-1.2 1.3,-1.8 1.4,-1.8 3.3,0 2.2,1.9 5.1,1.4 5.1,-0.8 0,-1.2 -2.1,-3.5 -6.1,-6.5 -1.3,-1 -2,-0.8 -3.6,1.1 z"
+ id="path72"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 282.4,688.4 c -0.9,2.2 0.2,4.6 2.1,4.6 1.2,0 1.5,-0.8 1.3,-2.7 -0.3,-3 -2.5,-4.2 -3.4,-1.9 z"
+ id="path73"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 49,668.2 c -1.7,1.9 -7.3,11 -8.7,13.8 -0.6,1.4 -1.9,5.4 -2.8,9 -2.6,10 -7.1,23.1 -10,29.6 -4.7,10.4 -7.3,17.7 -9.5,26.9 -1.2,4.9 -2.6,11 -3.3,13.5 -0.7,2.7 -1.2,12.5 -1.2,24.5 v 20 l 3.2,6 c 4.3,8.2 21.8,25.5 30.4,30.2 5.7,3 7.1,3.3 12.9,3.1 l 6.5,-0.3 -0.1,-4 c -0.1,-3.4 -0.9,-4.6 -4.9,-8.2 -2.5,-2.4 -9.1,-7.2 -14.5,-10.8 -15.1,-10 -14.8,-12.1 1.5,-11.1 6.1,0.4 11.9,0.4 12.8,0.1 0.8,-0.4 2.8,-2.4 4.3,-4.6 1.4,-2.1 3.2,-3.9 3.8,-3.9 0.6,0.1 2,1.5 3.1,3.3 2.9,4.6 6.2,4.8 8,0.4 l 1.4,-3.4 10.8,-0.6 c 11.5,-0.6 11.5,-0.6 14.8,4.7 1.6,2.5 3.4,0.5 5,-5.3 1,-4 1.1,-5.9 0.3,-8 -1.6,-3.8 -1.9,-44.2 -0.3,-50.1 1.6,-6 2.6,-7.7 7.9,-13.9 4.3,-5.1 5.1,-7.2 7.5,-18.9 1.5,-7.5 1.5,-7.7 -2.3,-10.3 -3.9,-2.6 -9.8,-13.4 -11.5,-20.9 -3.2,-14.2 -6.3,-15.4 -15.6,-5.8 l -6,6.2 -12.7,0.4 -12.7,0.4 -2.8,-2.9 c -1.5,-1.7 -4.1,-4.7 -5.8,-6.7 -3.1,-3.8 -7.3,-4.8 -9.5,-2.4 z m 10.6,11 c 3,5.7 5.5,6.1 27.2,4 9.1,-0.8 9.4,-0.9 13.5,-5 2.4,-2.3 5,-4.2 5.9,-4.2 1.6,0 5.8,9.8 5.8,13.6 0,1.1 1.6,4.3 3.6,7.2 6.9,10.4 8.4,20.1 4,27.1 -1.4,2.2 -2.9,4.1 -3.3,4.2 -1.7,0.8 -7,9.6 -8.1,13.5 -1.5,5.1 -1.6,35.4 -0.2,44 1,6.4 0.2,13.5 -1.5,13.5 -0.6,0 -1.4,-4.1 -1.9,-9.1 -0.4,-4.9 -1.2,-9 -1.7,-9 -0.5,0 -1.2,-1.8 -1.5,-4 -0.8,-4.6 -3.4,-5.6 -3.3,-1.3 0.1,3.4 1.4,11.6 2.7,16.5 1.5,5.6 0.2,6.5 -10.4,7.3 l -9.2,0.7 -0.6,-3.9 c -0.3,-2.1 -0.5,-7.5 -0.4,-12 0,-8.5 -0.4,-10.3 -2.7,-10.3 -2.3,0 -2.9,4.9 -1.4,11.5 1.7,7.5 1.9,19.7 0.2,20.2 -2,0.7 -3.1,-2.9 -5.1,-16.3 C 69,773.1 68.4,771 66.4,771 c -1.9,0 -1.8,6.2 0.1,13.7 1.9,7.4 2,14.2 0.1,14.9 -0.8,0.3 -3.3,0.2 -5.7,-0.3 l -4.2,-0.8 -0.1,-9.5 c -0.1,-8.2 -0.5,-10.2 -2.8,-14.6 -4.5,-8.6 -14.2,-13.9 -18.2,-9.9 -2.2,2.3 -1.4,3.1 4.3,4.5 3.2,0.8 5.9,2.3 8.2,4.6 l 3.4,3.5 0.3,11.8 0.4,11.8 3.9,1.2 c 7.5,2.3 3.4,5.3 -6.2,4.6 C 28,805 26,805 26,807 c 0,2.1 18.8,18.9 24.2,21.6 4,2 10.8,8.3 10.8,10 0,2 -3.7,2.6 -7.8,1.3 -4.8,-1.5 -12,-7.1 -20.5,-15.6 C 22.6,814 20.1,810.1 18.8,802.8 c -1.5,-9.1 -0.2,-42.6 1.8,-48.1 0.9,-2.3 2.8,-8.5 4.2,-13.7 1.4,-5.2 2.9,-9.7 3.2,-10 1.3,-0.9 9,-19.9 10.1,-24.7 0.6,-2.7 2.2,-8.2 3.6,-12.3 1.3,-4.1 2.9,-9.2 3.5,-11.3 0.6,-2.1 2.6,-5.5 4.5,-7.4 l 3.3,-3.6 2.6,2.4 c 1.4,1.3 3.2,3.6 4,5.1 z"
+ id="path74"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 58.4,699.4 c -1,2.7 0.1,5 2.8,6 3.5,1.2 5.8,-0.6 5.8,-4.5 0,-3 -1.7,-3.8 -3.7,-1.8 -0.8,0.8 -1.3,0.8 -1.7,0 -1,-1.5 -2.6,-1.4 -3.2,0.3 z"
+ id="path75"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 106.7,701.7 c -0.9,0.9 -0.8,3.5 0.2,5.1 1.3,2.1 6.1,-0.6 6.1,-3.5 0,-1.9 -0.5,-2.3 -2.8,-2.3 -1.6,0 -3.2,0.3 -3.5,0.7 z"
+ id="path76"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 85.7,702.7 c -1.3,1.2 -0.7,5 0.9,6.3 1.2,1.1 1.8,1 3.1,-0.3 1.4,-1.3 1.4,-2.1 0.5,-4.2 -1.1,-2.4 -3.1,-3.2 -4.5,-1.8 z"
+ id="path77"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 50.3,708 c -3.2,1.3 -3,4.8 0.3,6.1 5.3,2 8.6,-1.8 4.8,-5.5 -1.7,-1.8 -2,-1.8 -5.1,-0.6 z"
+ id="path78"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 695.5,710 c -4,2.6 -8.3,7.9 -12.4,15.3 -14.2,26.2 -16.5,29.9 -19.9,32.5 -3.6,2.7 -5.5,2.7 -18.7,-0.2 -8.5,-1.9 -18.1,-2.7 -38.3,-2.9 -15,-0.2 -15.4,-0.2 -17.3,-2.7 -1.1,-1.4 -2.7,-4.1 -3.5,-6 -3.7,-9 -7,-15 -8.3,-15 -1.7,0 -7.5,6.3 -10,11 -1,1.9 -3,4.7 -4.4,6.2 -2.5,2.7 -3.1,2.8 -11.5,2.8 h -9 l -5.8,-4.5 c -3.1,-2.5 -6.3,-4.5 -7,-4.5 -3.5,0 -6.4,14.7 -6.4,32.7 0,17.6 1.2,20.5 13.9,32.6 13,12.2 14.3,16.1 11.2,34.7 -1.4,8.3 -1.4,15.7 -0.1,16.5 2.1,1.3 7,-0.7 8.5,-3.4 1.9,-3.9 5.2,-13.6 6.5,-19.6 1,-4.4 2.3,-6.4 4.1,-6.5 1.4,0 1.7,7.6 0.9,18.1 -0.9,11.4 -0.3,15.9 2.4,15.9 2.6,0 7.2,-4.8 8.4,-8.7 3.1,-10.6 4.1,-14.2 5.2,-19 1.3,-5.9 4.5,-8.4 9,-7.2 3.9,1.1 20,0.9 25,-0.2 8,-1.9 18.7,-2.3 19.6,-0.7 0.5,0.7 1,7.4 1.1,14.8 0.1,7.4 0.2,14 0.2,14.6 0.1,1.5 4.7,2.7 7.2,1.9 2.6,-0.8 5,-5.7 5.5,-11.1 0.2,-2.5 1,-5.7 1.8,-7.2 0.7,-1.5 1.6,-4.3 2,-6.4 0.7,-3.9 3.3,-5.8 4.3,-3.2 0.3,0.9 0.3,7.1 0,13.8 -0.6,12.4 -0.5,13.1 2.5,15.4 1.3,1.1 2.2,1.1 5,-0.1 2.7,-1.1 3.7,-2.5 5.6,-7.3 1.3,-3.2 2.7,-8.8 3.2,-12.4 0.5,-3.6 1.5,-8.1 2.1,-10 1.2,-3.8 1.9,-7 4.4,-19.5 1.7,-8.9 1.3,-14.6 -1.6,-23.9 -3.2,-10.1 -2.7,-13.3 4.4,-24.7 1.2,-1.9 3.1,-5 4.2,-6.8 1.1,-1.9 3,-4.8 4.2,-6.7 2.7,-4.2 9.6,-19.5 11.3,-25.1 1.6,-5.3 0.7,-11.3 -2.1,-13.6 -2.7,-2.2 -3.7,-2.1 -7.4,0.3 z m 4.8,6.7 c 0.3,1.6 0.2,4.6 -0.2,6.8 -0.9,4.8 -8.4,20.5 -12.2,25.5 -1.4,1.9 -3.7,5.5 -4.9,8 -1.2,2.5 -3.2,5.8 -4.4,7.5 -1.1,1.6 -2.9,5.2 -3.8,7.8 -1.7,4.8 -1.7,5 1.4,17 l 3.1,12.1 -1.7,9.5 c -1,5.3 -2.3,11.4 -3.1,13.6 -0.7,2.2 -2.1,8.5 -3,14 -2.4,15.4 -2.5,15.5 -4.5,15.5 -2.7,0 -3.2,-2.6 -2.8,-14.3 0.3,-11.5 -0.9,-15.7 -4.6,-15.7 -4.8,0.1 -8.3,6.6 -10.1,19 -0.7,4.7 -2.9,9 -4.5,9 -0.6,0 -1,-5.3 -1,-13.3 0,-9 -0.4,-13.7 -1.2,-14.5 -0.9,-0.9 -8.7,-1.2 -28.9,-1.2 h -27.7 l -2.5,2.9 c -1.6,1.9 -3.3,6.6 -5.1,13.6 -3.1,12.3 -5,17.5 -6.6,17.5 -1.9,0 -2.1,-2.5 -0.9,-9.1 2.2,-12.2 2.2,-15.3 0,-19.8 -2.4,-4.6 -3.7,-5 -7.3,-2.2 -2.4,1.9 -4.4,7.2 -6.8,17.6 -0.6,2.7 -1.8,6.1 -2.7,7.4 -2.5,3.9 -3.4,0.5 -2.2,-8 2,-14.1 2.2,-21.2 0.7,-24.7 -1.4,-3.1 -9.1,-11.7 -17.7,-19.5 -3.9,-3.6 -7.1,-9.2 -7.1,-12.3 0,-0.8 1.1,-1.9 2.5,-2.4 3.3,-1.3 3.2,-3.3 -0.6,-6.3 l -3.1,-2.4 1.1,-7.9 c 0.6,-4.3 1.2,-10.1 1.4,-12.9 0.3,-6.7 2.5,-7.1 8.2,-1.5 l 4.3,4.2 9.8,-1.1 c 13.7,-1.6 14.5,-2.1 20,-12.9 0.9,-1.9 2.4,-3.6 3.2,-3.9 2,-0.8 4.8,3.1 6.9,9.6 2.7,8.4 4.5,9.1 23.4,9.1 10.9,0 17,0.4 20.5,1.5 2.7,0.8 6.3,1.5 7.9,1.5 1.7,0 7.7,0.9 13.5,2.1 8.9,1.7 11.1,1.8 14.3,0.8 3.9,-1.3 10.7,-7.1 10.7,-9.3 0,-0.6 1.2,-2.8 2.6,-4.7 1.4,-1.9 4.5,-7.2 6.9,-11.9 4,-7.8 8.9,-16.1 13,-21.8 2.2,-3.1 5.1,-2.9 5.8,0.5 z"
+ id="path79"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 575,762 c 0,1.5 0.8,2.2 2.9,2.6 2.1,0.4 3.1,1.3 3.3,2.8 0.4,3 5.8,3.7 5.8,0.7 0,-1.4 -0.9,-2.3 -2.7,-2.7 -1.5,-0.4 -3.7,-1.8 -4.9,-3.1 -2.6,-2.8 -4.4,-3 -4.4,-0.3 z"
+ id="path80"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 555.1,769.4 c -1.6,2 0.3,5.6 2.9,5.6 2.6,0 4.5,-3.6 2.9,-5.6 -0.6,-0.8 -1.9,-1.4 -2.9,-1.4 -1,0 -2.3,0.6 -2.9,1.4 z"
+ id="path81"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 533.2,771.7 c 0.5,2.6 3.8,2.9 3.8,0.4 0,-1.5 -0.6,-2.1 -2.1,-2.1 -1.4,0 -1.9,0.5 -1.7,1.7 z"
+ id="path82"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><g
+ id="g1"
+ style="display:inline"><path
+ d="m 839.5,862.7 c -1.6,0.9 -4.2,2.9 -5.7,4.5 l -2.6,2.8 h 2.5 c 1.4,0 3.9,-1 5.5,-2.2 l 3.1,-2.1 1.8,2.1 c 0.9,1.2 2.5,2.2 3.4,2.2 1.4,0 1.6,-0.6 1,-2.8 -0.7,-3.1 -3.3,-6.2 -4.9,-6.2 -0.6,0.1 -2.4,0.8 -4.1,1.7 z"
+ id="path89"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1"
+ inkscape:label="path89" /><path
+ d="m 783.7,862.7 c -0.8,1 -1.9,3 -2.2,4.5 -0.6,2.4 -0.4,2.8 1.4,2.8 1.1,0 2.5,-0.9 3.1,-2 1.4,-2.6 4.2,-2.6 6.5,0 1,1.1 3.1,2 4.8,2 h 2.9 l -4.9,-4.5 c -5.2,-4.8 -8.9,-5.7 -11.6,-2.8 z"
+ id="path88"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><g
+ id="g479"
+ inkscape:label="fish"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ transform="translate(252.06731,446.07601)"><path
+ d="m 52.769736,-42.117156 c -4.967114,4.169731 -4.967114,4.811228 -0.584367,14.433684 5.843664,12.829942 10.518595,15.716679 14.024793,8.980959 4.382747,-8.339462 9.057678,-6.094222 7.012396,3.528234 -1.753099,8.0187143 -1.460916,8.3394623 2.045282,3.207486 5.55148,-7.697965 8.765495,-6.73572 6.42803,1.603742 -1.753099,7.0564683 -1.460916,7.0564683 1.753099,0.9622463 3.506198,-5.7734743 3.798381,-5.7734743 5.55148,-0.320749 1.460916,5.131977 2.045282,4.811228 5.259297,-2.5659883 2.921832,-7.056468 2.629649,-7.697965 -1.460916,-6.094222 -3.798381,1.603742 -4.382747,0.641497 -2.921831,-3.848983 1.753099,-4.490479 1.460915,-5.131976 -1.753099,-2.24524 -5.551481,5.131977 -8.765496,0.962246 -4.382748,-5.452725 2.921832,-4.169731 2.921832,-4.490479 -0.584366,-1.282994 -7.012396,7.056468 -12.563877,5.131977 -8.473312,-2.565988 5.55148,-11.546948 -10.518595,-17.320421 -21.913738,-8.339462 z m 16.946624,0.962245 c 4.674931,1.924492 4.090564,4.169731 -3.798381,16.999673 -2.337466,3.848983 -3.506199,3.848983 -7.30458,0.641497 -10.810777,-9.943205 -2.045282,-23.093895 11.102961,-17.64117 z"
+ id="path48-2"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.306133" /><path
+ d="m 60.658681,-34.419191 c 1.168733,0.962245 2.921832,0.962245 4.090565,0 0.87655,-1.282994 0,-2.24524 -2.045282,-2.24524 -2.045283,0 -2.921832,0.962246 -2.045283,2.24524 z"
+ id="path49-0"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.306133" /><path
+ d="m 99.22686,-11.646045 c -4.674931,3.8489833 -4.674931,10.2639533 0,8.3394623 3.21401,-1.603743 4.38275,0.320749 4.38275,5.773474 0,14.4336837 7.59676,21.8108987 11.39514,10.9054497 1.7531,-4.8112277 6.13585,-11.5469467 9.64205,-14.7544327 8.18112,-7.056467 -0.58437,-11.5469473 -15.48571,-8.018713 -6.42803,1.603743 -8.47331,1.282994 -7.30458,-1.2829943 2.33746,-4.169731 1.46091,-4.49048 -2.62965,-0.962246 z m 21.91374,7.0564683 c 0,1.603743 -1.16874,3.207485 -2.92183,3.207485 -1.46092,0 -3.5062,3.528234 -4.67494,8.018714 -0.87654,4.4904797 -2.92183,7.0564677 -4.38274,6.0942217 -3.79838,-2.565988 -3.21402,-16.6789237 1.16873,-18.2826667 6.13585,-2.886736 10.81078,-2.245239 10.81078,0.962246 z"
+ id="path68-2"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.306133" /></g><g
+ id="g483"
+ inkscape:label="star1"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ transform="matrix(3.9452232,0,0,4.2240352,-552.25879,-827.74646)"><path
+ d="m 178.53387,240.94477 c -0.3,1.2 -1.6,2.4 -2.7,2.7 -2.1,0.6 -2.1,0.7 -0.4,2 0.9,0.7 1.7,2.1 1.7,3 0,1.8 1.5,2.2 2.5,0.6 0.4,-0.6 1.5,-0.8 2.6,-0.5 1.5,0.5 1.9,0.1 1.9,-1.7 0,-1.3 0.5,-2.9 1.2,-3.6 0.9,-0.9 0.8,-1.2 -0.7,-1.2 -1,0 -2.7,-0.8 -3.7,-1.7 -1.8,-1.6 -1.9,-1.6 -2.4,0.4 z m 4.3,2.3 c 1.3,0 1.4,0.3 0.6,1.1 -0.6,0.6 -0.9,1.8 -0.6,2.7 0.4,1 0.2,1.3 -0.6,0.8 -0.6,-0.4 -1.7,-0.3 -2.4,0.2 -0.9,0.8 -1.5,0.4 -2.3,-1.3 -0.9,-1.9 -0.9,-2.5 0.2,-2.9 0.8,-0.3 1.4,-1.3 1.4,-2.3 0.1,-1.7 0.1,-1.7 1.1,-0.1 0.5,1 1.7,1.8 2.6,1.8 z"
+ id="path175"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><g
+ id="g480"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ inkscape:label="paw1"
+ transform="matrix(4.9319668,0,0,5.7559584,-126.28228,122.10017)"><path
+ d="m 166.13387,74.74477 c 0,0.8 0.5,1.5 1,1.5 0.6,0 1,-0.7 1,-1.5 0,-0.8 -0.4,-1.5 -1,-1.5 -0.5,0 -1,0.7 -1,1.5 z"
+ id="path46-3"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 162.13387,75.64477 c 0,0.9 0.5,1.6 1,1.6 0.6,0 1,-0.4 1,-0.9 0,-0.6 -0.4,-1.3 -1,-1.6 -0.5,-0.3 -1,0.1 -1,0.9 z"
+ id="path47-7"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 170.13387,76.24477 c 0,0.7 0.3,1 0.7,0.7 0.3,-0.4 0.3,-1 0,-1.4 -0.4,-0.3 -0.7,0 -0.7,0.7 z"
+ id="path50-5"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 160.13387,79.24477 c 0,0.5 0.7,1 1.6,1 0.8,0 1.2,-0.5 0.9,-1 -0.3,-0.6 -1,-1 -1.6,-1 -0.5,0 -0.9,0.4 -0.9,1 z"
+ id="path59-9"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 164.83387,78.94477 c -2.1,2.1 -0.7,5.5 2.1,4.8 3.5,-0.8 4.6,-2 3.9,-3.9 -0.6,-1.6 -4.8,-2.2 -6,-0.9 z"
+ id="path60-2"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><g
+ id="g484"
+ inkscape:label="paw2"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ transform="matrix(4.040358,0,0,4.774807,-159.45488,-523.8208)"><path
+ d="m 77.733867,236.14477 c -0.4,0.7 -0.5,1.5 -0.2,1.8 0.9,0.9 1.9,-0.4 1.4,-1.8 -0.4,-1.1 -0.6,-1.1 -1.2,0 z"
+ id="path169"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 73.133867,238.24477 c 0,0.5 0.5,1 1,1 0.6,0 1,-0.5 1,-1 0,-0.6 -0.4,-1 -1,-1 -0.5,0 -1,0.4 -1,1 z"
+ id="path171"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 81.133867,238.84477 c 0,0.8 0.5,1.2 1,0.9 0.6,-0.3 1,-1 1,-1.6 0,-0.5 -0.4,-0.9 -1,-0.9 -0.5,0 -1,0.7 -1,1.6 z"
+ id="path172"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 74.733867,241.84477 c -2.1,2 -2.1,2 1.5,3.8 3.5,1.7 4.9,1.4 4.9,-1.3 0,-3.7 -3.7,-5.2 -6.4,-2.5 z"
+ id="path176"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 82.133867,242.24477 c 0,0.5 0.4,1 0.9,1 0.6,0 1.3,-0.5 1.6,-1 0.3,-0.6 -0.1,-1 -0.9,-1 -0.9,0 -1.6,0.4 -1.6,1 z"
+ id="path178"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><g
+ id="g481"
+ inkscape:label="klubok1"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ transform="matrix(2.8077392,0,0,2.729068,127.57199,210.94513)"><path
+ d="m 220.93387,182.14477 c -7,6.3 -2.9,16.1 6.7,16.1 5.1,0 9.1,1.6 10,3.9 0.6,1.5 0.1,2.1 -5.6,6.1 -2.7,2 -1.9,5.2 1.7,6.8 4,1.9 5.3,1.4 1.4,-0.6 -4.9,-2.4 -5,-4.7 -0.3,-6.9 6.1,-2.9 5.8,-5.5 -1.5,-9.9 -0.2,-0.1 0.7,-1.8 1.9,-3.8 5.7,-9.8 -5.9,-19.2 -14.3,-11.7 z m 5.8,1.9 c -1.7,1.6 -1.8,1.6 -0.5,-0.5 0.7,-1.2 1.5,-2 1.8,-1.7 0.3,0.2 -0.3,1.2 -1.3,2.2 z m 4.4,-2.4 c 0,0.3 -0.5,0.8 -1.2,1.2 -0.7,0.4 -0.8,0.3 -0.4,-0.4 0.7,-1.2 1.6,-1.6 1.6,-0.8 z m -6.6,4.8 c 0.8,3.4 5.5,9 6.8,8.1 0.7,-0.3 0.8,-0.1 0.4,0.5 -0.4,0.6 -1.4,0.8 -2.3,0.5 -1.2,-0.5 -1.4,-0.3 -0.8,0.8 0.4,0.8 -0.6,0.1 -2.3,-1.5 -1.8,-1.6 -3.4,-3.7 -3.7,-4.7 -0.3,-1 -1.1,-1.7 -1.8,-1.5 -0.7,0.1 -0.9,0.1 -0.4,-0.1 0.4,-0.3 0.7,-1.4 0.7,-2.6 0,-1.7 0.5,-1.2 2,1.8 1.1,2.2 1.7,3.1 1.4,2 -0.8,-2.2 -1.6,-8.6 -1,-7 0.2,0.5 0.7,2.2 1,3.7 z m 7.8,-3 c -1.9,1.9 -1.4,3.2 0.6,1.7 1.4,-1.1 1.5,-1.1 0.5,0.1 -1.8,2 -1.6,3.3 0.3,2.6 1.4,-0.5 1.5,-0.4 0.4,0.9 -1,1.2 -1,1.5 0,1.5 0.8,0 1,0.3 0.6,0.7 -0.4,0.5 -1.4,0 -2.1,-1 -0.8,-1.2 -1.5,-1.4 -2,-0.8 -0.3,0.6 -1.1,1.1 -1.7,1.1 -0.6,0 -0.3,-1 0.8,-2.3 1,-1.2 1.2,-1.6 0.4,-1 -1.9,1.7 -3.5,1.7 -2.1,0 0.6,-0.8 0.7,-1.8 0.3,-2.2 -0.4,-0.5 -0.2,-0.5 0.4,-0.2 0.7,0.4 1.7,0 2.4,-0.8 0.7,-0.8 1.5,-1.5 1.8,-1.5 0.3,0 0.1,0.5 -0.6,1.2 z m -11.5,7.5 c -0.4,0.3 -1,0.3 -1.4,0 -0.3,-0.4 0,-0.7 0.7,-0.7 0.7,0 1,0.3 0.7,0.7 z m 0,2 c -0.4,0.3 -1,0.3 -1.4,0 -0.3,-0.4 0,-0.7 0.7,-0.7 0.7,0 1,0.3 0.7,0.7 z m 13,1 c -0.4,0.3 -0.7,0 -0.7,-0.7 0,-0.7 0.3,-1 0.7,-0.7 0.3,0.4 0.3,1 0,1.4 z m -11.2,1.3 c 0.3,0.5 0.4,1 0.1,1 -0.3,0 -0.8,-0.5 -1.1,-1 -0.3,-0.6 -0.4,-1 -0.1,-1 0.3,0 0.8,0.4 1.1,1 z"
+ id="path131"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 225.13387,192.04477 c 0,0.5 0.7,1.5 1.5,2.2 0.8,0.7 1.5,0.8 1.5,0.2 0,-0.5 -0.7,-1.5 -1.5,-2.2 -0.8,-0.7 -1.5,-0.8 -1.5,-0.2 z"
+ id="path132"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><g
+ id="g483-8"
+ inkscape:label="star1"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ transform="matrix(3.9452232,0,0,4.2240352,-279.64123,-226.23287)"><path
+ d="m 178.53387,240.94477 c -0.3,1.2 -1.6,2.4 -2.7,2.7 -2.1,0.6 -2.1,0.7 -0.4,2 0.9,0.7 1.7,2.1 1.7,3 0,1.8 1.5,2.2 2.5,0.6 0.4,-0.6 1.5,-0.8 2.6,-0.5 1.5,0.5 1.9,0.1 1.9,-1.7 0,-1.3 0.5,-2.9 1.2,-3.6 0.9,-0.9 0.8,-1.2 -0.7,-1.2 -1,0 -2.7,-0.8 -3.7,-1.7 -1.8,-1.6 -1.9,-1.6 -2.4,0.4 z m 4.3,2.3 c 1.3,0 1.4,0.3 0.6,1.1 -0.6,0.6 -0.9,1.8 -0.6,2.7 0.4,1 0.2,1.3 -0.6,0.8 -0.6,-0.4 -1.7,-0.3 -2.4,0.2 -0.9,0.8 -1.5,0.4 -2.3,-1.3 -0.9,-1.9 -0.9,-2.5 0.2,-2.9 0.8,-0.3 1.4,-1.3 1.4,-2.3 0.1,-1.7 0.1,-1.7 1.1,-0.1 0.5,1 1.7,1.8 2.6,1.8 z"
+ id="path175-9"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><path
+ d="m 194.4,868.5 c -1.8,1.3 -1.6,1.4 2.5,1.5 3.7,0 4.2,-0.2 3.1,-1.5 -1.6,-1.9 -3.1,-1.9 -5.6,0 z"
+ id="path90"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><g
+ id="g484-3"
+ inkscape:label="paw2"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ transform="matrix(3.2174039,0,0,3.8427558,264.04962,-855.12678)"><path
+ d="m 77.733867,236.14477 c -0.4,0.7 -0.5,1.5 -0.2,1.8 0.9,0.9 1.9,-0.4 1.4,-1.8 -0.4,-1.1 -0.6,-1.1 -1.2,0 z"
+ id="path169-6"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 73.133867,238.24477 c 0,0.5 0.5,1 1,1 0.6,0 1,-0.5 1,-1 0,-0.6 -0.4,-1 -1,-1 -0.5,0 -1,0.4 -1,1 z"
+ id="path171-1"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 81.133867,238.84477 c 0,0.8 0.5,1.2 1,0.9 0.6,-0.3 1,-1 1,-1.6 0,-0.5 -0.4,-0.9 -1,-0.9 -0.5,0 -1,0.7 -1,1.6 z"
+ id="path172-2"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 74.733867,241.84477 c -2.1,2 -2.1,2 1.5,3.8 3.5,1.7 4.9,1.4 4.9,-1.3 0,-3.7 -3.7,-5.2 -6.4,-2.5 z"
+ id="path176-9"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /><path
+ d="m 82.133867,242.24477 c 0,0.5 0.4,1 0.9,1 0.6,0 1.3,-0.5 1.6,-1 0.3,-0.6 -0.1,-1 -0.9,-1 -0.9,0 -1.6,0.4 -1.6,1 z"
+ id="path178-3"
+ style="fill:#8b95a7;fill-opacity:1;stroke:none;stroke-width:0.1" /></g><g
+ id="g107"
+ inkscape:label="left"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"><path
+ d="m 779,4.4 c -0.7,2.4 -2.5,5.7 -4.1,7.2 -2.5,2.4 -8.9,13.9 -8.9,16.1 0,0.5 -0.8,2.4 -1.8,4.3 -1.1,1.9 -2.2,4.9 -2.5,6.7 -0.6,2.8 -0.3,3.4 2.7,5.2 2.1,1.3 4.3,4.1 6,7.8 1.6,3.2 3.8,6.9 5,8.3 7.2,8.3 8.5,13.3 4.1,15 -1.5,0.6 -5,2.1 -7.9,3.5 -2.9,1.4 -7.3,2.9 -9.8,3.4 -6.8,1.2 -11.8,4.6 -11.8,8 0,6.3 6.1,7.7 16.3,3.7 5.9,-2.2 11.5,-4.2 23.3,-8 5.8,-1.8 9,-2 9.8,-0.7 1,1.5 -2.1,3.5 -17.7,11.2 -4.2,2.1 -6.2,3.8 -7.4,6.4 -1.6,3.3 -1.5,3.6 0.2,5.5 3.3,3.7 7.3,2.9 28.7,-5.2 1.5,-0.5 3.4,-1.8 4.4,-2.9 2.4,-2.6 4.3,-2.4 7.9,1 3.8,3.7 12.2,5.6 30.5,7.1 7.4,0.6 20.7375,1.125 22.9375,1.625 7.6875,-1.0375 9.56458,-13.251512 9.21875,-1.53125 -0.0877,2.97105 0.5625,-3.28125 -13.85625,-3.09375 -3.19973,0.0416 -9.6,-0.7 -14.3,-1.5 -4.7,-0.8 -11.9,-1.5 -16.1,-1.5 -6,0 -8.5,-0.5 -11.9,-2.3 -6.5,-3.4 -8.3,-6.4 -7.5,-12.2 0.4,-2.6 1.6,-5.6 2.6,-6.6 4.1,-4.1 11.3,-3.2 7.6,0.9 -1.8,2 -2.2,7.8 -0.7,10.2 0.7,1.2 4,1.6 14.7,2.1 7.6,0.3 15.4,1.1 17.3,1.8 2.275,-0.196875 6.26456,0.180958 9.02812,0.63125 9.78125,1.59375 11.62813,0.7375 11.62813,-1.5625 0,-2.2 -7.05625,-3.625 -10.35625,-2.96875 -4.7,-0.1 -14.3,-1 -16.2,-1.6 -1,-0.3 -1.2,-3 -0.9,-12.7 0.4,-11 0.7,-12.6 3.1,-16.8 3,-5.1 11.2,-13.3 15.2,-15.1 13.70312,-3.678125 11.0125,-9.7375 8.8125,-9.7375 -1.7,0 -14.1125,6.8375 -15.0125,8.1375 -0.4,0.7 -1.7,1.8 -2.8,2.4 -3.6,1.9 -11.4,12.6 -12.1,16.3 -0.3,2 -1.3,5.6 -2,8 -0.9,2.7 -1.3,6.8 -1.1,10.7 0.3,3.7 0,6.7 -0.6,7.3 -1.3,1.3 -11.6,1.4 -13.6,0.2 -0.9,-0.6 -1.2,-2.5 -1,-6.2 0.2,-3 0,-6 -0.4,-6.7 -1.2,-1.8 -8.8,-1.4 -12.2,0.7 -3.4,2 -6.6,2.8 -17.1,4.1 -3.9,0.4 -9.3,1.5 -12,2.3 -2.7,0.9 -9.9,3.2 -16.1,5.1 -10.1,3.3 -14.3,3.7 -14.3,1.6 0,-1.5 2.8,-3.1 9.6,-5.4 10.3,-3.5 21.4,-8.9 21.9,-10.7 0.9,-2.7 -2.2,-9.5 -7.8,-17.1 -8.4,-11.4 -9.2,-13.2 -9.1,-21.8 0,-8.7 2.8,-15.2 9.4,-22.4 2.7,-2.9 4.1,-5.5 4.6,-8.4 0.6,-4 0.5,-4.2 -1.8,-4.2 -2.1,0 -2.7,0.7 -3.8,4.4 z m 32.3,81.8 c -0.3,2.9 -1.1,6.2 -1.8,7.3 -2.5,4 -27.4,14 -29.5,11.9 -1.9,-1.9 0.2,-4.6 5.4,-7.1 10.7,-5.1 21.5,-12.2 23.4,-15.2 2.1,-3.6 3.1,-2.4 2.5,3.1 z"
+ id="path4"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1"
+ sodipodi:nodetypes="ccsccccccscscccccccccccssssccsccccsscccccscccccscccccccsccscccscccsccc" /><path
+ d="m 796.7,4 c 1.7,2.5 3.4,4 4.7,4.1 1.2,0 8.2,0 15.6,-0.1 l 13.5,-0.1 3.3,-3.1 C 835.5,3 837,1.2 837,0.8 837,0.4 835.4,0 833.5,0 831.1,0 830,0.5 830,1.4 c 0,2 -6.6,2.9 -18.5,2.4 C 803.7,3.6 801.6,3.2 800.6,1.7 799.9,0.8 798.1,0 796.7,0 h -2.6 z"
+ id="path5"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 845,1 c 0,3.6 2.7,12 4.7,14.7 3.2,4.1 4.8,4.6 13.3,3.7 6.5,-0.6 10.7824,-0.749957 11.21875,-2.90625 C 874.96875,12.7875 869.7,14 862.5,14 853.7,14 851.9,12.7 849.9,4.9 849,1.3 848.1,0 846.8,0 845.8,0 845,0.4 845,1 Z"
+ id="path6"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1"
+ sodipodi:nodetypes="sccsscss" /><path
+ d="m 779.5,26 c -0.8,1.3 1.2,4.8 3.5,6 2.8,1.5 7.6,1.2 9,-0.5 1.8,-2.1 0.4,-4.8 -2.1,-4.2 -1.1,0.3 -3.8,-0.1 -6,-0.8 -2.2,-0.8 -4.1,-1 -4.4,-0.5 z"
+ id="path8"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 830,30.1 c 0,1.5 1.2,3.2 3.2,4.6 2.9,2 3.3,2.1 6,0.7 1.5,-0.8 2.9,-1.9 3,-2.4 0.4,-3.2 0.1,-3.5 -3.7,-3.6 -2.2,-0.1 -5,-0.5 -6.2,-0.9 -2,-0.6 -2.3,-0.4 -2.3,1.6 z"
+ id="path9"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 809.4,33.1 c -1,1.7 2.3,4.6 3.7,3.2 0.7,-0.7 0.9,-1.9 0.6,-2.7 -0.7,-1.8 -3.3,-2.1 -4.3,-0.5 z"
+ id="path10"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m 851.5,35.1 c -1,1.6 0.3,5.6 2,6.3 2.3,0.8 4.5,-0.4 5.1,-3 0.8,-3.2 -0.2,-4.4 -3.6,-4.4 -1.6,0 -3.2,0.5 -3.5,1.1 z"
+ id="path11"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /></g><g
+ id="g106-5"
+ transform="translate(4.85616,-2.0112115)"
+ style="display:inline;fill:#8b95a7;fill-opacity:1"
+ inkscape:label="right2"><path
+ d="m -27.33033,-5.908252 c -2.6,1.5 -2.2,4.9 0.7,4.9 2.6,0 3.6,2.1 3.6,8.1999996 0,4.2000004 3,9.9000004 6.5,12.2000004 2,1.3 4.9,1.5 18.2000001,1 14.9999999,-0.5 16.1999999,-0.4 24.0999999,2 10.6,3.2 14.2,5.5 19.6,12.2 10.6,12.9 12.4,31.7 4.9,49.4 -1.3,3.1 -9.2,17.000002 -9.7,17.000002 -0.1,0 -4,1.6 -8.6,3.6 -8.2,3.5 -8.104505,3.00338 -19.37868,2.40676 -3.3607341,-0.89437 -7.3357849,0.68908 -13.8529656,0.57475 -1.2,-0.6 -9.8871044,-0.39404 -15.1871044,-0.89401 -12.9,-1.2 -12.58125,-2.9875 -12.58125,-0.6875 0,1.4 0.9,2.1 3.8,2.5 2,0.4 5.645299,0.48082 8.102252,1.46742 2.4125,0.96875 12.177253,2.16229 24.9914981,1.68883 22.1848629,-0.81969 26.4062499,-1.45625 33.9062499,-7.05625 4.2,-3 9.2,-8.600001 9.2,-10.100001 0,-0.3 1,-2.2 2.3,-4.300001 3.9,-6.2 5.7,-15 5.7,-27.3 0,-13.4 -1.6,-19.6 -7.2,-27.9 -10,-15.1 -25.6,-21 -51.79999988,-19.5 -15.00000012,0.8 -14.70000012,1 -18.80000012,-11.5000002 -2.9,-8.7999998 -5.3,-11.6999999 -8.5,-9.8999998 z"
+ id="path7-4"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1"
+ sodipodi:nodetypes="csscccccsccccscsscscscccc" /><path
+ d="m -29.03033,33.591748 c 0,3.1 2.3,2.8 2.8,-0.4 0.2,-1.5 -0.2,-2.2 -1.2,-2.2 -1.1,0 -1.6,0.9 -1.6,2.6 z"
+ id="path22-7"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m -15.93033,37.091748 c -1.8,2.5 -2,3.3 -1,4.5 0.7,0.8 2.4,1.4 3.8,1.2 2.1,-0.2 2.7,-0.9 2.9,-3.5 0.2,-2.3 -0.2,-3.4 -1.6,-4.2 -1.6,-0.8 -2.3,-0.5 -4.1,2 z"
+ id="path23-6"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1" /><path
+ d="m -0.11157988,38.941748 c -0.7,0.7 -6.78437502,0.534375 -9.35312502,5.51875 -11.8000001,7.9 -14.4656251,19.63125 -15.0656251,37.03125 -0.3,7.9 -0.6,9.1 -2.4,10.000001 -1.2,0.5 -2.1,1.5 -2.1,2.1 0,1.4 18.670796,5.393243 32.5719224,6.225826 C 12.741593,100.21758 16.06967,98.69175 18.86967,97.29175 c 1.9,-1.000001 3.6,-2.400001 3.9,-3.100001 0.4,-1.4 -3.333709,-2.362913 -4.233709,-0.862913 -1.1,1.8 -23.7753006,0.205632 -31.734835,0.525826 l -6.331456,-2.462913 -0.3,-8.500001 c -0.2,-6.8 0.2,-9.9 2.1,-15.5 3.5,-10.2 6.410501,-17.654664 16.4105013,-22.454664 8.3,-3.9 14.2894987,-1.745336 19.0894987,0.454639 4.6,2.1 9.7,2.5 9.7,0.9 0,-0.7 -1.5,-2.4 -3.4,-3.8 -3.2,-2.3 -3.603125,-3.953125 -12.303125,-3.953125 -6.3999999,0 -11.07812488,-0.396875 -11.87812488,0.403125 z"
+ id="path24-5"
+ style="fill:#8b95a7;stroke:none;stroke-width:0.1;fill-opacity:1"
+ sodipodi:nodetypes="scccsccccccccccscsss" /></g></g></g>
+</svg>
+11 -11
View File
@@ -1,3 +1,14 @@
--- a/pgyvpn/Makefile
+++ b/pgyvpn/Makefile
@@ -67,7 +67,6 @@ ifeq ($(ARCH),x86_64)
OPENSSL_COMPAT_TARGET:=linux-x86_64
endif
-PKG_FLAGS:=nonshared
PKG_MAINTAINER:=Oray <developer@oray.com>
include $(INCLUDE_DIR)/package.mk
--- a/luci-app-easytier/Makefile --- a/luci-app-easytier/Makefile
+++ b/luci-app-easytier/Makefile +++ b/luci-app-easytier/Makefile
@@ -10,7 +10,7 @@ PKG_VERSION:=2.3.0 @@ -10,7 +10,7 @@ PKG_VERSION:=2.3.0
@@ -33,17 +44,6 @@
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
--- a/pgyvpn/Makefile
+++ b/pgyvpn/Makefile
@@ -36,7 +36,6 @@ PKG_SOURCE:=pgyvpnsvr
PKG_SOURCE_URL:=https://mirrors.oray.com/orayos/packages/$(PKG_NAME)/$(PKG_ARCH_PGYYPN)/$(PKG_VERSION)/bin
PKG_HASH:=skip
-PKG_FLAGS:=nonshared
PKG_MAINTAINER:=Oray <developer@oray.com>
include $(INCLUDE_DIR)/package.mk
--- a/luci-app-rclone/Makefile --- a/luci-app-rclone/Makefile
+++ b/luci-app-rclone/Makefile +++ b/luci-app-rclone/Makefile
@@ -9,7 +9,7 @@ PKG_VERSION:=1.4.1 @@ -9,7 +9,7 @@ PKG_VERSION:=1.4.1
-10
View File
@@ -1,13 +1,3 @@
--- a/oscam/files/oscam.init
+++ b/oscam/files/oscam.init
@@ -8,5 +8,5 @@ start() {
}
stop() {
- killall oscam
+ kill `pidof oscam | sed "s/$$//g"`
}
--- a/totd/root/etc/init.d/totd --- a/totd/root/etc/init.d/totd
+++ b/totd/root/etc/init.d/totd +++ b/totd/root/etc/init.d/totd
@@ -55,5 +55,5 @@ start_service(){ @@ -55,5 +55,5 @@ start_service(){
+1 -1
View File
@@ -240,7 +240,7 @@
@@ -825,7 +825,7 @@ for k, v in pairs(nodes_table) do @@ -825,7 +825,7 @@ for k, v in pairs(nodes_table) do
end end
m:appendTemplate("/global/footer", {shunt_list = api.jsonc.stringify(shunt_list)}) m:appendTemplate("/global/footer")
- -
+m:appendTemplate("/global/status_bottom") +m:appendTemplate("/global/status_bottom")
m:appendTemplate("/cbi/sortable", {sectiontype = s2.sectiontype}) m:appendTemplate("/cbi/sortable", {sectiontype = s2.sectiontype})
+1 -1
View File
@@ -116,7 +116,7 @@
@@ -383,7 +383,7 @@ for k, v in pairs(nodes_table) do @@ -383,7 +383,7 @@ for k, v in pairs(nodes_table) do
end end
m:appendTemplate("/global/footer", {shunt_list = api.jsonc.stringify(shunt_list)}) m:appendTemplate("/global/footer")
- -
+m:appendTemplate("/global/status_bottom") +m:appendTemplate("/global/status_bottom")
m:appendTemplate("/cbi/sortable", {sectiontype = s2.sectiontype}) m:appendTemplate("/cbi/sortable", {sectiontype = s2.sectiontype})
@@ -8,21 +8,6 @@
+ option wallpaper 'pattern' + option wallpaper 'pattern'
+ option layout 'sidebar' + option layout 'sidebar'
+ option autocollapse 'on' + option autocollapse 'on'
--- a/luci-theme-footstrap/styles/02-tokens.css
+++ b/luci-theme-footstrap/styles/02-tokens.css
@@ -19,6 +19,11 @@
* friends) live in those blocks too, beside the fills they must be legible against: a
* dark palette has light fills and needs a dark ink, and one global `#fff` failed WCAG AA
* on seven of the eight dark-palette fills (down to 1.69:1). */
+ --card-bg-color: var(--fs-panel) !important;
+ --border-color: var(--fs-border) !important;
+ --app-container_title-color: var(--fs-text) !important;
+ --item-label_key-span-color: var(--app-container_title-color) !important;
+ --app-container_status-label_block: var(--app-container_title-color) !important;
--fs-shadow: 0 1px 3px rgba(15,23,37,.08);
/* pop surfaces (menus, dropdown lists, the select picker): one value rather than a
* literal per site */
diff --git a/luci-theme-footstrap/root/etc/footstrap/pattern.svg b/luci-theme-footstrap/root/etc/footstrap/pattern.svg diff --git a/luci-theme-footstrap/root/etc/footstrap/pattern.svg b/luci-theme-footstrap/root/etc/footstrap/pattern.svg
new file mode 100644 new file mode 100644
index 000000000..72eb03cdc index 000000000..72eb03cdc
-6
View File
@@ -1,6 +0,0 @@
--- a/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns
+++ b/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns
@@ -1,2 +1,2 @@
#!/bin/sh
-[ "$ACTION" = ifup ] && /etc/init.d/mosdns restart
+[[ "$ACTION" = ifup && "$(uci -q get mosdns.mosdns.enabled)" == 1 ]] && /etc/init.d/mosdns restart
-11
View File
@@ -1,11 +0,0 @@
--- a/pgyvpn/Makefile
+++ b/pgyvpn/Makefile
@@ -78,7 +78,7 @@ define Package/pgyvpn/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/usr/share/pgyvpn
- $(CP) $(PKG_BUILD_DIR)/{pgyvpn_oraysl,pgyvpnsvr} $(1)/usr/sbin
+ $(CP) $(PKG_BUILD_DIR)/pgyvpn_oraysl $(1)/usr/sbin
$(INSTALL_BIN) ./files/etc/init.d/* $(1)/etc/init.d
$(INSTALL_CONF) ./files/etc/config/* $(1)/etc/config
$(INSTALL_BIN) ./files/etc/hotplug.d/iface/* $(1)/etc/hotplug.d/iface
+1 -1
View File
@@ -3,7 +3,7 @@
@@ -33,6 +33,13 @@ LUCI_DEPENDS:= \ @@ -33,6 +33,13 @@ LUCI_DEPENDS:= \
+libuci-lua +lua +luci-compat +coreutils +coreutils-base64 +dns2tcp +dnsmasq-full \ +libuci-lua +lua +luci-compat +coreutils +coreutils-base64 +dns2tcp +dnsmasq-full \
+jq +ip-full +lua-neturl +libuci-lua +microsocks +ipt2socks +lyaml \ +jq +ip-full +lua-neturl +libuci-lua +microsocks +ipt2socks +lyaml \
+resolveip +curl +nping +unzip +xz-utils +xz \ +resolveip +bind-dig +curl +nping +unzip +xz-utils +xz \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:coreutils-timeout \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:coreutils-timeout \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Http_Proxy:3proxy \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Http_Proxy:3proxy \
+25 -17
View File
@@ -109,7 +109,7 @@ jobs:
( (
git_clone https://github.com/Openwrt-Passwall/openwrt-passwall && mvdir openwrt-passwall git_clone https://github.com/Openwrt-Passwall/openwrt-passwall && mvdir openwrt-passwall
git_clone https://github.com/Openwrt-Passwall/openwrt-passwall-packages && mvdir openwrt-passwall-packages git_clone https://github.com/Openwrt-Passwall/openwrt-passwall-packages && mvdir openwrt-passwall-packages
git_clone https://github.com/sbwml/luci-app-mosdns openwrt-mos && mv -n openwrt-mos/{*mosdns,v2dat} ./; rm -rf openwrt-mos git_clone https://github.com/sbwml/luci-app-mosdns openwrt-mos && mv -n openwrt-mos/{*mosdns,geo2txt} ./; rm -rf openwrt-mos
git_clone https://github.com/Lienol/openwrt-package liep && rm -rf liep/other git_clone https://github.com/Lienol/openwrt-package liep && rm -rf liep/other
git_clone https://github.com/rufengsuixing/luci-app-autoipsetadder git_clone https://github.com/rufengsuixing/luci-app-autoipsetadder
git_clone https://github.com/NateLol/luci-app-beardropper git_clone https://github.com/NateLol/luci-app-beardropper
@@ -130,7 +130,7 @@ jobs:
git_clone https://github.com/sirpdboy/luci-app-poweroffdevice poweroffdevice && mvdir poweroffdevice git_clone https://github.com/sirpdboy/luci-app-poweroffdevice poweroffdevice && mvdir poweroffdevice
git_clone https://github.com/sirpdboy/luci-app-watchdog watchdog1 && mvdir watchdog1 git_clone https://github.com/sirpdboy/luci-app-watchdog watchdog1 && mvdir watchdog1
git_clone https://github.com/sirpdboy/luci-app-cupsd cupsd1 && mv -n cupsd1/{luci-app-cupsd,cups} ./ ; rm -rf cupsd1 git_clone https://github.com/sirpdboy/luci-app-cupsd cupsd1 && mv -n cupsd1/{luci-app-cupsd,cups} ./ ; rm -rf cupsd1
git_clone https://github.com/sirpdboy/luci-app-timecontrol timecontrol && mvdir timecontrol # git_clone https://github.com/sirpdboy/luci-app-timecontrol timecontrol && mvdir timecontrol
git_clone https://github.com/sirpdboy/luci-theme-kucat git_clone https://github.com/sirpdboy/luci-theme-kucat
git_clone https://github.com/sirpdboy/luci-app-kucat-config git_clone https://github.com/sirpdboy/luci-app-kucat-config
git_clone https://github.com/sirpdboy/luci-app-chatgpt-web git_clone https://github.com/sirpdboy/luci-app-chatgpt-web
@@ -152,6 +152,7 @@ jobs:
git_clone https://github.com/Tencent-Cloud-Plugins/tencentcloud-openwrt-plugin-cos && mv -n tencentcloud-openwrt-plugin-cos/tencentcloud_cos ./luci-app-tencentcloud-cos; rm -rf tencentcloud-openwrt-plugin-cos git_clone https://github.com/Tencent-Cloud-Plugins/tencentcloud-openwrt-plugin-cos && mv -n tencentcloud-openwrt-plugin-cos/tencentcloud_cos ./luci-app-tencentcloud-cos; rm -rf tencentcloud-openwrt-plugin-cos
git_clone https://github.com/doushang/luci-app-shortcutmenu luci-shortcutmenu && mv -n luci-shortcutmenu/luci-app-shortcutmenu ./ ; rm -rf luci-shortcutmenu git_clone https://github.com/doushang/luci-app-shortcutmenu luci-shortcutmenu && mv -n luci-shortcutmenu/luci-app-shortcutmenu ./ ; rm -rf luci-shortcutmenu
git_clone https://github.com/aa65535/openwrt-dist-luci git_clone https://github.com/aa65535/openwrt-dist-luci
git_clone https://github.com/minicom365/openwrt-smart-reboot && mv -f openwrt-smart-reboot/*smart-reboot ./;rm -rf openwrt-smart-reboot
# git_clone https://github.com/morytyann/OpenWrt-msd && mvdir OpenWrt-msd # git_clone https://github.com/morytyann/OpenWrt-msd && mvdir OpenWrt-msd
# git_clone https://github.com/messense/aliyundrive-webdav aliyundrive && mv -n aliyundrive/openwrt/* ./ ; rm -rf aliyundrive # git_clone https://github.com/messense/aliyundrive-webdav aliyundrive && mv -n aliyundrive/openwrt/* ./ ; rm -rf aliyundrive
# git_clone https://github.com/sbilly/netmaker-openwrt && mv -n netmaker-openwrt/netmaker ./; rm -rf netmaker-openwrt # git_clone https://github.com/sbilly/netmaker-openwrt && mv -n netmaker-openwrt/netmaker ./; rm -rf netmaker-openwrt
@@ -176,6 +177,7 @@ jobs:
git_clone https://github.com/nikkinikki-org/OpenWrt-momo && mv -f OpenWrt-momo/{luci-app-momo,momo} ./;rm -rf OpenWrt-momo git_clone https://github.com/nikkinikki-org/OpenWrt-momo && mv -f OpenWrt-momo/{luci-app-momo,momo} ./;rm -rf OpenWrt-momo
git_clone https://github.com/fcshark-org/openwrt-fchomo && mvdir openwrt-fchomo git_clone https://github.com/fcshark-org/openwrt-fchomo && mvdir openwrt-fchomo
git clone https://github.com/fw876/helloworld -b dev && mvdir helloworld git clone https://github.com/fw876/helloworld -b dev && mvdir helloworld
git_clone https://github.com/umk0/openwrt-luci-haproxy-manager && mv -f openwrt-luci-haproxy-manager/luci-app-haproxy-manager ./;rm -rf openwrt-luci-haproxy-manager
) & ) &
( (
git_clone https://github.com/ZeaKyX/speedtest-web git_clone https://github.com/ZeaKyX/speedtest-web
@@ -193,6 +195,7 @@ jobs:
git_clone https://github.com/peter-tank/luci-app-dnscrypt-proxy2 git_clone https://github.com/peter-tank/luci-app-dnscrypt-proxy2
git_clone https://github.com/sundaqiang/openwrt-packages && mv -n openwrt-packages/luci-* ./; rm -rf openwrt-packages git_clone https://github.com/sundaqiang/openwrt-packages && mv -n openwrt-packages/luci-* ./; rm -rf openwrt-packages
git_clone https://github.com/CHN-beta/rkp-ipid git_clone https://github.com/CHN-beta/rkp-ipid
git_clone https://github.com/lucas-albers-lz4/fwlive && mv -f fwlive/openwrt-feed/luci-app-fwlive ./;rm -rf fwlive
git_clone https://github.com/2018nuoyan/openwrt_nezha && mv -n openwrt_nezha/*nezhav1 ./; rm -rf openwrt_nezha git_clone https://github.com/2018nuoyan/openwrt_nezha && mv -n openwrt_nezha/*nezhav1 ./; rm -rf openwrt_nezha
git clone https://github.com/Ausaci/luci-app-nat6-helper -b main-dev git clone https://github.com/Ausaci/luci-app-nat6-helper -b main-dev
git_clone https://github.com/vernesong/OpenClash && mv -f OpenClash/luci-app-openclash ./; rm -rf OpenClash git_clone https://github.com/vernesong/OpenClash && mv -f OpenClash/luci-app-openclash ./; rm -rf OpenClash
@@ -207,6 +210,7 @@ jobs:
git_clone https://github.com/xptsp/luci-app-squid-adv git_clone https://github.com/xptsp/luci-app-squid-adv
git_clone https://github.com/xptsp/openwrt-e2guardian git_clone https://github.com/xptsp/openwrt-e2guardian
git_clone https://github.com/10000ge10000/luci-app-openclaw git_clone https://github.com/10000ge10000/luci-app-openclaw
git_clone https://github.com/WROIATE/luci-app-hijpass
) & ) &
( (
git_clone https://github.com/honwen/luci-app-shadowsocks-rust git_clone https://github.com/honwen/luci-app-shadowsocks-rust
@@ -241,6 +245,7 @@ jobs:
git_sparse_clone master "https://github.com/coolsnowwolf/lede" package/lean package/network/services/shellsync package/qca/shortcut-fe git_sparse_clone master "https://github.com/coolsnowwolf/lede" package/lean package/network/services/shellsync package/qca/shortcut-fe
git_clone https://github.com/linkease/istore-packages git_clone https://github.com/linkease/istore-packages
git clone https://github.com/laipeng668/luci-app-gecoosac gecoosac1 && mvdir gecoosac1 git clone https://github.com/laipeng668/luci-app-gecoosac gecoosac1 && mvdir gecoosac1
git_clone https://github.com/eamonxg/luci-theme-shadcn
) & ) &
( (
git_clone https://github.com/muink/luci-app-dnsproxy git_clone https://github.com/muink/luci-app-dnsproxy
@@ -269,7 +274,7 @@ jobs:
git_clone https://github.com/gSpotx2f/luci-app-interfaces-statistics git_clone https://github.com/gSpotx2f/luci-app-interfaces-statistics
git_clone https://github.com/gSpotx2f/luci-app-cpu-status-mini git_clone https://github.com/gSpotx2f/luci-app-cpu-status-mini
git_clone https://github.com/gSpotx2f/luci-app-cpu-status git_clone https://github.com/gSpotx2f/luci-app-cpu-status
git_clone https://github.com/Carseason/openwrt-packages Carseason1 && mv -n Carseason1/*/* ./;mv services/* ./;rm -rf Carseason1 services git_clone https://github.com/Carseason/openwrt-packages Carseason1 && mv -n Carseason1/*/* ./;rm -rf Carseason1
git_clone https://github.com/Carseason/openwrt-themedog && mv -n openwrt-themedog/luci/* ./;rm -rf openwrt-themedog git_clone https://github.com/Carseason/openwrt-themedog && mv -n openwrt-themedog/luci/* ./;rm -rf openwrt-themedog
git_clone https://github.com/Carseason/openwrt-app-actions Carseason2 && mv -n Carseason2/applications/* ./;rm -rf Carseason2 git_clone https://github.com/Carseason/openwrt-app-actions Carseason2 && mv -n Carseason2/applications/* ./;rm -rf Carseason2
git_clone https://github.com/Thaolga/openwrt-nekobox && mv openwrt-nekobox/luci-* ./;rm -rf openwrt-nekobox git_clone https://github.com/Thaolga/openwrt-nekobox && mv openwrt-nekobox/luci-* ./;rm -rf openwrt-nekobox
@@ -288,7 +293,8 @@ jobs:
git_clone https://github.com/EkkoG/luci-app-natmap git_clone https://github.com/EkkoG/luci-app-natmap
git_clone https://github.com/yichya/openwrt-hv-tools git_clone https://github.com/yichya/openwrt-hv-tools
git_clone https://github.com/ddimension/openwrt-repo && mv -f openwrt-repo/*wwand* ./;rm -rf openwrt-repo git_clone https://github.com/ddimension/openwrt-repo && mv -f openwrt-repo/*wwand* ./;rm -rf openwrt-repo
# git_clone https://github.com/papagaye744/luci-theme-design git_clone https://github.com/jerrykuku/luci-theme-argon
git_clone https://github.com/jerrykuku/luci-app-argon-config
) & ) &
( (
git_clone https://github.com/EasyTier/luci-app-easytier luci-app-easytier1 && mvdir luci-app-easytier1 git_clone https://github.com/EasyTier/luci-app-easytier luci-app-easytier1 && mvdir luci-app-easytier1
@@ -351,8 +357,9 @@ jobs:
git_sparse_clone revision https://github.com/Self-Hosting-Group/packages net/miniupnpd git_sparse_clone revision https://github.com/Self-Hosting-Group/packages net/miniupnpd
) & ) &
( (
git_sparse_clone frp-toml https://github.com/laipeng668/luci applications/luci-app-frpc git_sparse_clone frp https://github.com/laipeng668/luci applications/luci-app-frpc
git_sparse_clone frp-toml https://github.com/laipeng668/luci applications/luci-app-frps git_sparse_clone frp https://github.com/laipeng668/luci applications/luci-app-frps
git_sparse_clone frp https://github.com/laipeng668/packages net/frp
) & ) &
( (
git_sparse_clone master "https://github.com/coolsnowwolf/lede" package/wwan package/lean package/network/services/shellsync package/qca/shortcut-fe && cp -rf wwan/*/* ./ ; rm -Rf wwan git_sparse_clone master "https://github.com/coolsnowwolf/lede" package/wwan package/lean package/network/services/shellsync package/qca/shortcut-fe && cp -rf wwan/*/* ./ ; rm -Rf wwan
@@ -376,10 +383,8 @@ jobs:
package/utils/mhz package/utils/pcat-manager package/utils/mhz package/utils/pcat-manager
) & ) &
( (
npx --yes degit 'dibdot/luci/applications/luci-app-shunt#luci-app-shunt-pr' luci-app-shunt
npx --yes degit 'dibdot/packages/net/shunt#shunt-pr' shunt
git_sparse_clone master "https://github.com/x-wrt/com.x-wrt" luci-app-macvlan luci-app-xwan git_sparse_clone master "https://github.com/x-wrt/com.x-wrt" luci-app-macvlan luci-app-xwan
git_sparse_clone master "https://github.com/obsy/packages" oscam luci-proto-wwan 3ginfo # git_sparse_clone master "https://github.com/obsy/packages" oscam luci-proto-wwan 3ginfo
git_sparse_clone istoreos-24.10 "https://github.com/jjm2473/packages" utils/dockerd git_sparse_clone istoreos-24.10 "https://github.com/jjm2473/packages" utils/dockerd
git_sparse_clone master "https://github.com/teleofis/teleofis-feed" luci packages; rm -rf luci/luci-app-{pollmydevice,simman*,strongswan,pingcontrol} luci/luci-theme-teleofis; mvdir luci; \ git_sparse_clone master "https://github.com/teleofis/teleofis-feed" luci packages; rm -rf luci/luci-app-{pollmydevice,simman*,strongswan,pingcontrol} luci/luci-theme-teleofis; mvdir luci; \
rm -rf packages/{base-files*,*lt70*,cp210x-cfg,fbfdownloader,pollmydevice,simman*,pingcontrol}; mvdir packages rm -rf packages/{base-files*,*lt70*,cp210x-cfg,fbfdownloader,pollmydevice,simman*,pingcontrol}; mvdir packages
@@ -387,13 +392,13 @@ jobs:
( (
git_sparse_clone develop "https://github.com/Ysurac/openmptcprouter-feeds" \ git_sparse_clone develop "https://github.com/Ysurac/openmptcprouter-feeds" \
dsvpn glorytun-udp glorytun grpcurl ipcalc luci-app-dsvpn luci-app-glorytun-tcp luci-app-glorytun-udp luci-app-mail luci-app-mlvpn luci-app-mptcp luci-app-nginx-ha luci-app-sqm-autorate luci-app-packet-capture luci-app-iperf luci-theme-openmptcprouter sqm-autorate speedtestc mlvpn mptcp tcptraceroute tracebox tsping atinout z8102 dsvpn glorytun-udp glorytun grpcurl ipcalc luci-app-dsvpn luci-app-glorytun-tcp luci-app-glorytun-udp luci-app-mail luci-app-mlvpn luci-app-mptcp luci-app-nginx-ha luci-app-sqm-autorate luci-app-packet-capture luci-app-iperf luci-theme-openmptcprouter sqm-autorate speedtestc mlvpn mptcp tcptraceroute tracebox tsping atinout z8102
git_sparse_clone chawrt/24.10 "https://github.com/liudf0716/luci" applications/luci-app-yt-dlp applications/luci-app-apfree-wifidog applications/luci-app-ss-redir git_sparse_clone chawrt/25.12 "https://github.com/liudf0716/luci" applications/luci-app-xkcptun applications/luci-app-apfree-wifidog
git_sparse_clone chawrt/24.10 "https://github.com/liudf0716/packages" net/ss-redir git_sparse_clone chawrt/25.12 "https://github.com/liudf0716/packages" net/xkcptun net/apfree-wifidog
) & ) &
git_sparse_clone master "https://github.com/immortalwrt/packages" net/n2n net/qbittorrent \ git_sparse_clone master "https://github.com/immortalwrt/packages" net/n2n net/qbittorrent \
net/amule net/cdnspeedtest net/minieap net/ddns-go net/sysuh3c net/3proxy net/cloudreve \ net/amule net/cdnspeedtest net/minieap net/ddns-go net/sysuh3c net/3proxy utils/filebrowser net/cloudreve \
net/go-nats net/go-wol net/bitsrunlogin-go net/transfer net/udp2raw net/msd_lite \ net/go-nats net/go-wol net/bitsrunlogin-go net/transfer net/udp2raw net/msd_lite \
net/subconverter net/ngrokc net/scutclient net/gost net/ua2f net/dufs net/frp net/qBittorrent-Enhanced-Edition \ net/subconverter net/ngrokc net/scutclient net/gost net/ua2f net/dufs net/qBittorrent-Enhanced-Edition \
net/tinyportmapper net/nexttrace net/rustdesk-server net/tuic-server net/transmission-web-control \ net/tinyportmapper net/nexttrace net/rustdesk-server net/tuic-server net/transmission-web-control \
net/ipset-lists net/ShadowVPN net/nps net/dnsforwarder \ net/ipset-lists net/ShadowVPN net/nps net/dnsforwarder \
net/ps3netsrv net/brook net/q \ net/ps3netsrv net/brook net/q \
@@ -404,9 +409,9 @@ jobs:
utils/phicomm-k3screenctrl utils/joker utils/7z utils/dhrystone utils/supervisor utils/tinymembench utils/pcat-mgr utils/fan2go \ utils/phicomm-k3screenctrl utils/joker utils/7z utils/dhrystone utils/supervisor utils/tinymembench utils/pcat-mgr utils/fan2go \
utils/coremark utils/watchcat multimedia/you-get multimedia/lux multimedia/gmediarender multimedia/ykdl multimedia/gallery-dl \ utils/coremark utils/watchcat multimedia/you-get multimedia/lux multimedia/gmediarender multimedia/ykdl multimedia/gallery-dl \
sound/spotifyd devel/go-rice devel/rust-bindgen admin/gotop \ sound/spotifyd devel/go-rice devel/rust-bindgen admin/gotop \
lang/lua/lua-periphery lang/lua/lua-neturl lang/lua/lua-maxminddb lang/golang devel/gn lang/lua/lua-periphery lang/lua/lua-neturl lang/lua/lua-maxminddb lang/golang devel/gn lang/node/node-pnpm
git_clone https://github.com/koshev-msk/modemfeed && mv -n modemfeed/*/!(telephony)/!(ookla-speedtest) ./; rm -rf modemfeed git_clone https://github.com/koshev-msk/modemfeed && mv -n modemfeed/*/!(telephony)/!(ookla-speedtest) ./; rm -rf modemfeed
git_sparse_clone openwrt-25.12 "https://github.com/immortalwrt/luci" applications collections/luci-nginx protocols/luci-proto-minieap protocols/luci-proto-quectel themes/luci-theme-argon git_sparse_clone openwrt-25.12 "https://github.com/immortalwrt/luci" applications collections/luci-nginx protocols/luci-proto-minieap protocols/luci-proto-quectel
mv -f applications luciapp && rm -rf luciapp/luci-app-firewall mv -f applications luciapp && rm -rf luciapp/luci-app-firewall
git_sparse_clone openwrt-25.12 "https://github.com/coolsnowwolf/luci" applications \ git_sparse_clone openwrt-25.12 "https://github.com/coolsnowwolf/luci" applications \
modules/luci-base modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system protocols/luci-proto-openvpnc themes/luci-theme-design modules/luci-base modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system protocols/luci-proto-openvpnc themes/luci-theme-design
@@ -424,7 +429,7 @@ jobs:
run: | run: |
shopt -s extglob shopt -s extglob
set +e set +e
mv -n luciapp/!(luci-app-noddos|luci-app-filebrowser-go|luci-app-openvpn-server|luci-app-chrony|luci-app-kodexplorer|luci-app-cshark|luci-app-dnscrypt-proxy|luci-app-https-dns-proxy|luci-app-ssr-mudb-server|luci-app-ledtrig-*|luci-app-antiblock) ./ ; rm -Rf luciapp mv -n luciapp/!(luci-app-noddos|luci-app-openvpn-server|luci-app-chrony|luci-app-kodexplorer|luci-app-cshark|luci-app-dnscrypt-proxy|luci-app-https-dns-proxy|luci-app-ssr-mudb-server|luci-app-ledtrig-*|luci-app-antiblock) ./ ; rm -Rf luciapp
mv -n lean/!(r8101|r8125|r8126|r8168) ./ ; rm -Rf lean mv -n lean/!(r8101|r8125|r8126|r8168) ./ ; rm -Rf lean
mv -n liep/!(luci-app-filebrowser) ./ ; rm -Rf liep mv -n liep/!(luci-app-filebrowser) ./ ; rm -Rf liep
mv -n istore-packages/!(qBittorrent*|luci-app-qbittorrent-ee|baidupcs-web|luci-app-LingTiGameAcc|inter_i40e) ./;rm -rf istore-packages mv -n istore-packages/!(qBittorrent*|luci-app-qbittorrent-ee|baidupcs-web|luci-app-LingTiGameAcc|inter_i40e) ./;rm -rf istore-packages
@@ -464,7 +469,7 @@ jobs:
-H "Authorization: Bearer ${{ secrets.TOKEN_KIDDIN9 }}" \ -H "Authorization: Bearer ${{ secrets.TOKEN_KIDDIN9 }}" \
-X POST -d '{ "query": "query {repository(owner: \"'"$1"'\", name: \"'"$2"'\"){latestRelease{tagName tagCommit{oid}}refs(refPrefix:\"refs/tags/\",last:1,orderBy:{field:TAG_COMMIT_DATE,direction:ASC}){edges{node{name target{oid}}}}defaultBranchRef{target{...on Commit {oid}}}}}"}' https://api.github.com/graphql) -X POST -d '{ "query": "query {repository(owner: \"'"$1"'\", name: \"'"$2"'\"){latestRelease{tagName tagCommit{oid}}refs(refPrefix:\"refs/tags/\",last:1,orderBy:{field:TAG_COMMIT_DATE,direction:ASC}){edges{node{name target{oid}}}}defaultBranchRef{target{...on Commit {oid}}}}}"}' https://api.github.com/graphql)
} }
for pkg in $(ls !(luci-*|nikki|mihomo*|openwrt-einat-ebpf|qBittorrent-Enhanced-Edition|tuic-client|glorytun|dae|daed|shadowsocks-libev|mosdns|spotifyd|miniupnpd|openwrt-Toolkit|libdouble-conversion|wxbase|3proxy|ucode|mergerfs|openwrt-nezhav1|homebox|sub-web|tcptraceroute|frp|openwrt-caddy|mentohust|brlaser|rapidjson|smartdns|hysteria|gecoosac|libcryptopp|naiveproxy|rustdesk-server|shadowsocksr-libev|tuic-server|joker|ps3netsrv|natter|netmaker|openwrt-ympd|subconverter|sms-tool)/Makefile); do for pkg in $(ls !(luci-*|nikki|mihomo*|dockermanager|kaiplus|fastnet|baidudrive|openwrt-einat-ebpf|qBittorrent-Enhanced-Edition|tuic-client|glorytun|dae|daed|shadowsocks-libev|mosdns|spotifyd|miniupnpd|openwrt-Toolkit|libdouble-conversion|wxbase|3proxy|ucode|mergerfs|openwrt-nezhav1|homebox|sub-web|tcptraceroute|frp|openwrt-caddy|mentohust|brlaser|rapidjson|smartdns|hysteria|gecoosac|libcryptopp|naiveproxy|rustdesk-server|shadowsocksr-libev|tuic-server|joker|ps3netsrv|natter|netmaker|openwrt-ympd|subconverter|sms-tool)/Makefile); do
repo="$(grep ^PKG_SOURCE_URL $pkg | grep github | cut -f 4-5 -d '/' | sed -e 's/.git//' | grep -E '[0-9a-zA-Z_-]+$')" || true repo="$(grep ^PKG_SOURCE_URL $pkg | grep github | cut -f 4-5 -d '/' | sed -e 's/.git//' | grep -E '[0-9a-zA-Z_-]+$')" || true
if [ "$repo" ]; then if [ "$repo" ]; then
owner="$(echo $repo | cut -f 1 -d '/')" owner="$(echo $repo | cut -f 1 -d '/')"
@@ -528,6 +533,9 @@ jobs:
cp -rf luci-app-bypass/root/www/luci-static/bypass/* luci-app-passwall2/root/www/luci-static/passwall2/ cp -rf luci-app-bypass/root/www/luci-static/bypass/* luci-app-passwall2/root/www/luci-static/passwall2/
cp -rf luci-app-bypass/root/www/luci-static/bypass/* luci-app-ssr-plus/root/www/luci-static/shadowsocksr/ cp -rf luci-app-bypass/root/www/luci-static/bypass/* luci-app-ssr-plus/root/www/luci-static/shadowsocksr/
echo ".page-container>div>div>a:first-child,.info_content>.status_box{display:none !important}" >>luci-app-quickstart/htdocs/luci-static/quickstart/style.css echo ".page-container>div>div>a:first-child,.info_content>.status_box{display:none !important}" >>luci-app-quickstart/htdocs/luci-static/quickstart/style.css
sed -i -e "s/body\[theme=dark\]/:root[data-darkmode=true]/g" \
-e "s/body\[theme=light\]/:root[data-darkmode=false]/g" luci-app-quickstart/htdocs/luci-static/quickstart/style.css
sed -i 's/body.getAttribute("theme");if(o)switch(o){case"dark":case"light":return o}/documentElement.getAttribute("data-darkmode");if(o)switch(o){case"true":return"dark";case"false":return"light"}/g' luci-app-quickstart/htdocs/luci-static/quickstart/index.js
sed -i 's/icon!=="baby"/icon!==""/' luci-app-quickstart/htdocs/luci-static/quickstart/index.js sed -i 's/icon!=="baby"/icon!==""/' luci-app-quickstart/htdocs/luci-static/quickstart/index.js
sed -i 's/+php8-cgi /+php8-cgi +php8-fpm /' luci-theme-spectra/Makefile sed -i 's/+php8-cgi /+php8-cgi +php8-fpm /' luci-theme-spectra/Makefile
-121
View File
@@ -1,121 +0,0 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=3ginfo
PKG_VERSION:=20260425
PKG_RELEASE:=3
include $(INCLUDE_DIR)/package.mk
define Package/3ginfo/Default
SECTION:=net
CATEGORY:=Network
TITLE:=Information about the status of the 3G/4G/5G modem
MAINTAINER:=Cezary Jackiewicz <cezary@eko.one.pl>
PKGARCH:=all
endef
define Package/3ginfo-old
$(call Package/3ginfo/Default)
DEPENDS:=+3ginfo-text-old +uhttpd
endef
define Package/3ginfo-lite
$(call Package/3ginfo/Default)
TITLE+= (lite version)
DEPENDS:=+comgt +@BUSYBOX_DEFAULT_AWK
endef
define Package/3ginfo-qmisignal
$(call Package/3ginfo/Default)
TITLE+= (qmi signal)
DEPENDS:=+uqmi +uhttpd
endef
define Package/3ginfo-text-old
$(call Package/3ginfo/Default)
TITLE+= (text version)
DEPENDS:=+comgt
endef
define Package/3ginfo-text-old/conffiles
/etc/config/3ginfo
endef
define Package/3ginfo
$(call Package/3ginfo/Default)
DEPENDS:=+3ginfo-text +uhttpd
endef
define Package/3ginfo-text
$(call Package/3ginfo/Default)
TITLE+= (text version)
DEPENDS:=+comgt +sms-tool +modemdata
endef
define Package/3ginfo-text/conffiles
/etc/config/3ginfo
endef
define Build/Compile
endef
define Package/3ginfo-old/install
$(CP) ./files-html-old/* $(1)
endef
define Package/3ginfo-lite/install
$(CP) ./files-lite/* $(1)
$(CP) ./files-text-old/usr/share/3ginfo/mccmnc.dat $(1)/usr/share/3ginfo-lite
$(CP) ./files-text-old/usr/share/3ginfo/scripts/probeport.gcom $(1)/usr/share/3ginfo-lite
endef
define Package/3ginfo-qmisignal/install
$(CP) ./files-qmisignal/* $(1)
$(FIND) $(1) -type f -name '*.js' | while read src; do \
uglifyjs "$$$$src" -o "$$$$src".1 && \
mv "$$$$src".1 "$$$$src" || true; \
done
endef
define Package/3ginfo-text-old/install
$(CP) ./files-text-old/* $(1)
endef
define Package/3ginfo-text-old/postinst
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
ln -sf /usr/share/3ginfo/cgi-bin/3ginfo.sh /usr/bin/3ginfo
}
exit 0
endef
define Package/3ginfo/install
$(CP) ./files-html/* $(1)
$(SED) 's/?v=1/?v='${PKG_VERSION}'/g' $(1)/usr/share/3ginfo/html/index.html
$(SED) 's/^\t*//g;s/^\s*//g;/^$$$$/d' $(1)/usr/share/3ginfo/html/index.html
$(FIND) $(1) -type f -name '*.js' | while read src; do \
uglifyjs "$$$$src" -o "$$$$src".1 && \
mv "$$$$src".1 "$$$$src" || true; \
done
$(FIND) $(1) -type f -name '*.css' | while read src; do \
cleancss "$$$$src" -o "$$$$src".1 && \
mv "$$$$src".1 "$$$$src" || true; \
done
endef
define Package/3ginfo-text/install
$(CP) ./files-text/* $(1)
endef
$(eval $(call BuildPackage,3ginfo-old))
$(eval $(call BuildPackage,3ginfo-lite))
$(eval $(call BuildPackage,3ginfo-qmisignal))
$(eval $(call BuildPackage,3ginfo-text-old))
$(eval $(call BuildPackage,3ginfo))
$(eval $(call BuildPackage,3ginfo-text))
-11
View File
@@ -1,11 +0,0 @@
#!/bin/sh /etc/rc.common
# (c) 2010-2019 Cezary Jackiewicz <cezary@eko.one.pl>
START=99
start () {
PORT=$(uci -q get 3ginfo.@3ginfo[0].http_port)
[ -z $PORT ] && { PORT=81; }
uhttpd -c /usr/share/3ginfo/uhttpd.conf -h /usr/share/3ginfo/ -p 0.0.0.0:$PORT > /dev/null 2>&1
}
@@ -1,19 +0,0 @@
#!/bin/sh
DEVICE=$(uci get 3ginfo.@3ginfo[0].device)
SCRIPT=$(uci get 3ginfo.@3ginfo[0].script)
echo -e "Content-type: text/html\n\n"
if [ -e scripts/$SCRIPT.sh ]; then
sh scripts/$SCRIPT.sh
elif [ -e scripts/$SCRIPT.gcom ]; then
if ! pidof gcom > /dev/null; then
O=$(gcom -d $DEVICE -s scripts/$SCRIPT.gcom)
echo "<div class=\"c\">$O</div>"
else
echo "<div class=\"c\">Brak możliwości sprawdzenia limitu. Spróbuj za chwilę.</div>"
fi
else
echo "<div class=\"c\"><font color=red>Brak skryptu $SCRIPT</font></div>"
fi
echo "<div class=\"c\"><input type=\"button\" class=\"button\" value=\"Wróć\" onclick=\"trzyginfo('cgi-bin/3ginfo.sh');\"></div>"
@@ -1,17 +0,0 @@
#!/bin/sh
SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
[ -z "$SEC" ] && exit 0
ALLOW=$(uci -q get 3ginfo.@3ginfo[0].connect_button)
[ "x$ALLOW" = "x0" ] && exit 0
UP=$(ifstatus $SEC | grep "\"up\": true")
if [ -n "$UP" ]; then
ifdown $SEC > /dev/null 2>&1
else
ifup $SEC > /dev/null 2>&1
fi
sleep 3
exit 0
@@ -1,6 +0,0 @@
#!/bin/sh
D=$(uci -q get 3ginfo.@3ginfo[0].device)
echo -e "Content-type: text/html\n\n"
if [ -e $D ]; then
gcom -d $D sig | sed -e 's/ /,/g'
fi
@@ -1,96 +0,0 @@
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "
<html>
<style type=\"text/css\">
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
}
#centered {
width: 800px;
margin: auto;
text-align: center;
}
.label {
text-align: left;
}
.text {
width: 100%;
}
pre {
text-align: left;
}
</style>
<head>
<title>SMS</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
</head>
<body>
"
if [ "$REQUEST_METHOD" = POST ]; then
read -t 3 QUERY_STRING
eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
action=`uhttpd -d $action 2>/dev/null`
tel=`uhttpd -d $msisdn 2>/dev/null`
msg=`uhttpd -d $msg 2>/dev/null`
id=`uhttpd -d $id 2>/dev/null`
else
action="x"
fi
case "$action" in
send)
echo "[global]" > /tmp/gnokiirc
echo "model = AT" >> /tmp/gnokiirc
echo "port = "$(uci get 3ginfo.@3ginfo[0].device) >> /tmp/gnokiirc
echo "connection = serial" >> /tmp/gnokiirc
echo "$msg" | tr '+' ' ' | gnokii --config /tmp/gnokiirc --sendsms $tel 2>/dev/null
R=$?
if [ $R -eq 0 ]; then
echo "Wysłano wiadomość do $tel!<br />"
else
echo "<font color=red><strong>Wystąpił problem z wysłaniem wiadomości!</strong></font><br />"
fi
echo $tel": "$msg >> /tmp/sms.txt
rm /tmp/gnokiirc
;;
delete)
echo "[global]" > /tmp/gnokiirc
echo "model = AT" >> /tmp/gnokiirc
echo "port = "$(uci get 3ginfo.@3ginfo[0].device) >> /tmp/gnokiirc
echo "connection = serial" >> /tmp/gnokiirc
gnokii --config /tmp/gnokiirc --deletesms SM $id 2>/dev/null
rm /tmp/gnokiirc
;;
esac
echo "
<form method=\"post\">
<input type=\"hidden\" name=\"action\" id=\"action\" value=\"send\">
<div class=label>Numer telefonu:</div><input name=\"msisdn\" class=text><br />
<div class=label>Wiadomość:</div><textarea name=\"msg\" class=text></textarea><br /><br />
<input type=\"submit\" name=\"submit\" value=\"Wyślij\" text-align=center>
</form>
"
echo "[global]" > /tmp/gnokiirc
echo "model = AT" >> /tmp/gnokiirc
echo "port = "$(uci get 3ginfo.@3ginfo[0].device) >> /tmp/gnokiirc
echo "connection = serial" >> /tmp/gnokiirc
echo "<pre>"
gnokii --config /tmp/gnokiirc --getsms SM 0 end 2>/dev/null | \
sed -e ' \
s/ (unread)/<\/pre><font color=green><strong>Nowa wiadomość<\/strong><\/font><pre>/g; \
s/Msg Center.*//g; \
s/(read)//g; \
s/^Sender/Nadawca/g;s/Date\/time/Data\/czas/g; \
s/^Text:/Treść wiadomości:<\/pre><pre style="white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;">/g; \
s/\(^[0-9]*\)..Inbox Message/<\/pre><hr \/><form style="text-align: left;" method="post"><input type="hidden" name="action" id="action" value="delete"><input type="hidden" name="id" id="id" value="\1"><input type="submit" name="submit" value="Usuń"><\/form><pre>/g'
rm /tmp/gnokiirc
echo "</pre>
</div>
</body></html>"
@@ -1,55 +0,0 @@
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "
<html>
<style type=\"text/css\">
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
}
#centered {
width: 800px;
margin: auto;
text-align: center;
}
.label {
text-align: left;
}
.text {
width: 100%;
}
pre {
text-align: left;
}
</style>
<head>
<title>USSD</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
</head>
<body>
"
if [ "$REQUEST_METHOD" = POST ]; then
read -t 3 QUERY_STRING
eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
action=`uhttpd -d $action`
ussd=`uhttpd -d $ussd`
else
action="x"
fi
case "$action" in
send)
A=$(ussd159 -p $(uci get 3ginfo.@3ginfo[0].device) -t 30 -u "$ussd")
echo "Odpowiedź: $A<br /><br />"
;;
esac
echo "
<form method=\"post\">
<input type=\"hidden\" name=\"action\" id=\"action\" value=\"send\">
<div class=label>USSD:</div><input name=\"ussd\" class=text><br />
<input type=\"submit\" name=\"submit\" value=\"Wyślij\" text-align=center>
</form>
</div>
</body></html>"
@@ -1,75 +0,0 @@
<html>
<style type="text/css">
body {font-family: Verdana, Arial, Helvetica, sans-serif;}
.button {width:150px;}
a:link {text-decoration:none;color:blue;}
a:visited {text-decoration:none;color:blue;}
a:active {text-decoration:none;color:blue;}
a:hover {text-decoration:underline;color:blue;}
.c {margin:auto;text-align:center;clear:both;}
.l {width:39%;clear:both;float:left;text-align:right;}
.r {width:59%;float:right; text-align:left;}
</style>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>3G/4G</title>
<script language="javascript" type="text/javascript">
function detailson() {
document.getElementById('details').style.display = "inline";
document.getElementById('details_on').style.display = "none";
document.getElementById('details_off').style.display = "inline";
}
function detailsoff() {
document.getElementById('details').style.display = "none";
document.getElementById('details_on').style.display = "inline";
document.getElementById('details_off').style.display = "none";
}
function trzyginfo(zrodlo, reload) {
var a;
try {a = new XMLHttpRequest();} catch (e) {
try {a = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
try {a = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {
alert("Coś stara ta przelądarka...");
return false;
}
}
}
document.getElementById('loader').style.display = "block";
document.getElementById('zawartosc').innerHTML = "";
a.open("GET", zrodlo);
a.onreadystatechange = function() {
if (a.readyState == 4) {
document.getElementById('loader').style.display = "none";
document.getElementById('zawartosc').innerHTML = a.responseText;
if (reload == 1) {
location.reload(true);
}
}
}
a.send(null);
}
</script>
</head>
<body onload="trzyginfo('cgi-bin/3ginfo.sh',0);">
<table style='width:100%;height:100%;'>
<tr><td colspan=3 style='height:100px;'>&nbsp;</td></tr>
<tr>
<td>&nbsp;</td>
<td style='width:600px; height:200px;'>
<div id='zawartosc'></div>
<div id='loader' style="text-align:center;display:block;"><img src="loader.gif"></div>
</td>
<td>&nbsp;</td>
</tr>
<tr><td colspan=3>&nbsp;</td></tr>
</table>
</body></html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

@@ -1,9 +0,0 @@
#!/bin/sh
O=$(wget -q -c http://www.cyfrowypolsat.pl/internet/biezace-zuzycie/ -O -)
O1=$(echo "$O" | sed -n '/Okres rozliczeniowy/,/_idJsp27/p' | tr -d '\n' | sed -e 's/\t//g;s/ */ /g;s/.*\(<span class="bolder">Okres.*\)\(<br><br><span\).*/\1/' | tr '\277\363\263\346\352\266\261\274\361' zolcesazn | tr '\241\306\312\243\321\323\246\257\254' ACELNOSZZ)
if [ -z "$O1" ]; then
echo "<div class=\"c\">Brak możliwości sprawdzenia limitu.</div>"
else
echo "$O1"
fi
@@ -1,31 +0,0 @@
pdu2txt() {
# pobrany z https://forum.openwrt.org/viewtopic.php?pid=158891#p158891
data1=$(echo $1 | sed -e 's/.\{2\}/&\ /g')
ret=''
shift=0
carry=0
for byte in $data1; do
if [ $shift -eq 7 ]; then
ret=$ret$(echo $carry | awk '{printf("%c",$0)}')
carry=0
shift=0
fi
byte=$((0x$byte))
: $(( a = (0xFF >> ($shift + 1)) & 0xFF ))
: $(( b = $a ^ 0xFF ))
: $(( digit = $carry | (($byte & $a) << $shift) & 0xFF ))
: $(( carry = ($byte & $b) >> (7 - $shift) ))
ret=$ret$(echo $digit | awk '{printf("%c",$0)}')
: $(( shift++ ))
done
echo $ret
}
@@ -1,18 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"AAD8EC3602\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
exit 0
:noresponse
print ""
exit 0
@@ -1,10 +0,0 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/lycamobile_pdu.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O" | tr '\n' ' ' | sed -e 's/1 Opis 9 Powrot 0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,71 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CNMI=0,1,0,0,0^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGF=1^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGL=\"ALL\"^m"
waitfor 10 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"*121#\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
:error
print "Problem operatora - brak możliwości sprawdzenia..."
exit 0
:readatcmd
let i=20
send $c
:loop
get 1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
let $j="x"
if $mid($s,9,1) <> "," goto del2
let $j=$mid($s,8,1)
goto del3
:del2
if $mid($s,10,1) <> "," goto del3
let $j=$mid($s,8,2)
:del3
get 1 "^m" $s
print $s
if $j = "x" goto del4
send "AT+CMGD="
send $j
send "^m"
waitfor 5 "OK"
:del4
exit 0
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
:loop2
if i = 0 return
let i=i-1
sleep 0.5
goto loop
@@ -1,71 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CNMI=0,1,0,0,0^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGF=1^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGL=\"ALL\"^m"
waitfor 10 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"AA982C3602\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
:error
print "Problem operatora - brak możliwości sprawdzenia..."
exit 0
:readatcmd
let i=20
send $c
:loop
get 1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
let $j="x"
if $mid($s,9,1) <> "," goto del2
let $j=$mid($s,8,1)
goto del3
:del2
if $mid($s,10,1) <> "," goto del3
let $j=$mid($s,8,2)
:del3
get 1 "^m" $s
print $s
if $j = "x" goto del4
send "AT+CMGD="
send $j
send "^m"
waitfor 5 "OK"
:del4
exit 0
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
:loop2
if i = 0 return
let i=i-1
sleep 0.5
goto loop
@@ -1,27 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "at+cmgf=0^m"
waitfor 5 "OK"
if % = -1 goto error
send "at+cscs=\"IRA\"^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"AA182CA682C546\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
get 1 "^m" $s
print $s
exit 0
:error
print ""
exit 0
@@ -1,10 +0,0 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/ofnk.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O"
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,19 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*101*01#\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
exit 0
:noresponse
print ""
exit 0
@@ -1,9 +0,0 @@
#!/bin/sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/ofnk2.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
A=$(echo $O | awk '{for(i=1;;i=i+4)if(substr($1,i,4)!=""){printf "%c",(index("0123456789ABCDEF",substr($1,i+2,1))-1)*16+(index("0123456789ABCDEF",substr($1,i+3,1))-1)}else exit;}')
echo $A | sed -e 's/1 Opis.*9 Powrot.*0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,37 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*111#\",15^m"
waitfor 10 "0 Wyjscie"
if % = -1 goto noresponse
send "AT+CUSD=1,\"1\",15^m"
waitfor 10 "0 Wyjscie"
if % = -1 goto noresponse
let c=20
send "AT+CUSD=1,\"3\",15^m"
:loop
get 1 "^m" $s
if c=0 goto exit
if len($s) < 6 goto toshort
if $mid($s,1,5) = "+CUSD" goto ok
:toshort
let c=c-1
sleep 1
goto loop
:ok
let $s=$right($s,len($s)-10)
print $s,"\"\n"
:exit
send "AT+CUSD=1,\"0\",15^m"
waitfor 10 "Dziekujemy"
exit 0
:noresponse
print "Problem operatora - brak możliwości sprawdzenia..."
exit 0
@@ -1,28 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*111#\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"1\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"3\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
send "AT+CUSD=1,\"0\",15^m"
waitfor 10 "+CUSD: "
exit 0
:noresponse
print ""
exit 0
@@ -1,9 +0,0 @@
#!/bin/sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/play_fresh2.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
A=$(echo $O | awk '{for(i=1;;i=i+4)if(substr($1,i,4)!=""){printf "%c",(index("0123456789ABCDEF",substr($1,i+2,1))-1)*16+(index("0123456789ABCDEF",substr($1,i+3,1))-1)}else exit;}')
echo $A | sed -e 's/1 Opis.*9 Powrot.*0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,28 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"AA582C3602\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"31\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"33\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
send "AT+CUSD=1,\"30\",15^m"
waitfor 10 "+CUSD: "
exit 0
:noresponse
print ""
exit 0
@@ -1,10 +0,0 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/play_fresh_pdu.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O" | tr '\n' ' ' | sed -e 's/1 Opis.*9 Powrot.*0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,20 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"AA182C3602\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
send "AT+CUSD=1,\"30\",15^m"
waitfor 10 "+CUSD: "
exit 0
:noresponse
print ""
exit 0
@@ -1,10 +0,0 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/tmobile.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O" | tr '\n' ' ' | sed -e 's/1 Opis 9 Powrot 0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,19 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*108#\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
exit 0
:noresponse
print ""
exit 0
@@ -1,27 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "at+cmgf=0^m"
waitfor 5 "OK"
if % = -1 goto error
send "at+cscs=\"IRA\"^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"AA180C3702\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
get 1 "^m" $s
print $s
exit 0
:error
print ""
exit 0
@@ -1,10 +0,0 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/virginmobile_pdu.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O"
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -1,86 +0,0 @@
<html>
<style type="text/css">
body {font-family: Verdana, Arial, Helvetica, sans-serif;}
.c {margin:auto;text-align:center;clear:both;}
.l {width:49%;clear:both;float:left;text-align:right;}
.r {width:49%;float:right;text-align:left;}
</style>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Siła sygnału</title>
<script language="javascript" type="text/javascript">
<!--
var secs=0;
var delay = 1000;
startTimer();
function startTimer()
{
if (secs==0)
{
secs=3;
refreshData();
}
else
{
self.status = secs;
secs = secs - 1;
}
self.setTimeout("startTimer()", delay);
}
function refreshData()
{
var req;
try {req = new XMLHttpRequest();} catch (e) {
try {req = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
try {req = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {
alert("Coś stara ta przelądarka...");
return false;
}
}
}
req.open("GET", "/cgi-bin/signal.sh");
req.onreadystatechange = function() {
if (req.readyState == 4) {
var line=req.responseText;
var arr=(line.split(/,/));
if(arr.length>3)
{
var p = (arr[2]*100/31).toFixed();
document.getElementById('csq').innerHTML=p+'%';
document.getElementById('precent').style.width=p+"%";
var color = "red";
if (p > 29) {color="orange"; }
if (p > 45) {color="yellow"; }
if (p > 61) {color="green"; }
document.getElementById('precent').style.backgroundColor=color;
}
}
}
req.send(null);
}
//-->
</script>
</head>
<body>
<table style='width:100%;height:100%;'>
<tr><td colspan=3 style='height:100px;'>&nbsp;</td></tr>
<tr>
<td>&nbsp;</td>
<td style='width:600px; height:200px;'>
<span class="l">Siła sygnału:</span><span id="csq" class="r"></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div id="precent" style="float:left; background-color:black; border-right:1px solid #000000; height:100%; width:0%">&nbsp;</div>
</div>
</td>
<td>&nbsp;</td>
</tr>
<tr><td colspan=3>&nbsp;</td></tr>
</table>
</body>
</html>
@@ -1,35 +0,0 @@
<span class="l" style="display:{STATUS_SHOW}">Status:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Connection time:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Received:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Transmitted:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operator:</span><span class="r">{COPS}</span>
<span class="l">Operating mode:</span><span class="r">{MODE}</span>
<span class="l">Signal strength:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Pozostały limit" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Refresh" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Show details</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Hide details</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">UMTS QoS Profile:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Device:</span><span class="r">{DEVICE}</span>
</div>
@@ -1,35 +0,0 @@
<span class="l" style="display:{STATUS_SHOW}">Staatus:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Ühendusaeg:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Vastvõetud:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Saadetud:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operaator:</span><span class="r">{COPS}</span>
<span class="l">Töörežiim:</span><span class="r">{MODE}</span>
<span class="l">Signaali tugevus:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Pozostały limit" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Uuenda" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Näita detaile</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Peida detailid</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">UMTS QoS Profile:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Seade:</span><span class="r">{DEVICE}</span>
</div>
@@ -1,35 +0,0 @@
<span class="l" style="display:{STATUS_SHOW}">Stato:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Tempo di connessione:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Ricevuti:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Trasmessi:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operatore:</span><span class="r">{COPS}</span>
<span class="l">Tipo di connessione:</span><span class="r">{MODE}</span>
<span class="l">Forza segnale:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Limite" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Aggiorna" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Mostra dettagli</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Nascondi dettagli</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">Profilo UMTS QoS:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Dispositivo:</span><span class="r">{DEVICE}</span>
</div>
@@ -1,35 +0,0 @@
<span class="l" style="display:{STATUS_SHOW}">Status:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Czas połączenia:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Pobrano:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Wysłano:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operator:</span><span class="r">{COPS}</span>
<span class="l">Tryb pracy:</span><span class="r">{MODE}</span>
<span class="l">Siła sygnału:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Pozostały limit" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Odśwież" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Pokaż informacje dodatkowe</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Ukryj informacje dodatkowe</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">Profil UMTS QoS:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Urządzenie:</span><span class="r">{DEVICE}</span>
</div>
@@ -1 +0,0 @@
E404:/index.html
-13
View File
@@ -1,13 +0,0 @@
#!/bin/sh /etc/rc.common
#
# (c) 2010-2024 Cezary Jackiewicz <cezary@eko.one.pl>
#
START=99
start() {
PORT=$(uci -q get 3ginfo.@3ginfo[0].http_port)
[ -z "$PORT" ] && PORT=81
uhttpd -E /index.html -x /cgi-bin -h /usr/share/3ginfo/html -p 0.0.0.0:$PORT -i .sh=/bin/sh > /dev/null 2>&1
}
@@ -1,192 +0,0 @@
label {
font-weight: 400;
text-align: right;
}
.modal {
display: none;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0,0,0);
background-color: rgba(0,0,0,0.4);
}
.modal-content {
background-color: #fefefe;
margin: 15% auto;
padding: 20px;
border: 1px solid #888;
width: 80%;
border-radius: 5px;
}
.section {
border-bottom: 1px dashed #8c8b8b;
}
h3 {
margin-bottom: 20px;
}
#container {
transition: margin-left .5s;
padding: 20px;
}
.click,
.click:hover,
.click:visited,
.click:link {
text-decoration: none;
color: #31708f;
cursor: pointer;
}
.margintop {
margin-top: 10px;
}
@media (max-width: 768px) {
.margintop {
margin-top: -90px;
}
.center-xd {
text-align: center;
}
}
.sizing-box {
height: 110px;
width: 150px;
}
.signal-bars {
display: inline-block;
}
.signal-bars .bar {
width: 14%;
margin-left: 1%;
min-height: 20%;
display: inline-block;
}
.signal-bars .bar.first-bar { height: 20%; }
.signal-bars .bar.second-bar { height: 40%; }
.signal-bars .bar.third-bar { height: 60%; }
.signal-bars .bar.fourth-bar { height: 80%; }
.signal-bars .bar.fifth-bar { height: 99%; }
.lzero .bar {
background-color: #fafafa;
border: thin solid #ccc;
}
.lone .bar {
background-color: #ff0000;
border: thin solid #800000;
}
.ltwo .bar {
background-color: #ff6a00;
border: thin solid #803500;
}
.lthree .bar {
background-color: #ffd800;
border: thin solid #806a00;
}
.lfour .bar {
background-color: #b6ff00;
border: thin solid #558000;
}
.lfive .bar {
background-color: #4cff00;
border: thin solid #2a8000;
}
.four-bars .bar.fifth-bar,
.three-bars .bar.fifth-bar,
.three-bars .bar.fourth-bar,
.one-bar .bar:not(.first-bar),
.two-bars .bar:not(.first-bar):not(.second-bar) {
background-color: #fafafa;
border: thin solid #ccc;
}
.oneline {
clear: both;
}
@media (max-width: 527px) {
.hidden-vxs {
display: none;
}
}
@media (min-width: 578px) and (max-width: 821px) {
.modalmargintop {
margin-top: 5px;
}
}
.error {
color: red;
}
@media (max-width: 768px) {
.col-xs-12-text-left {
text-align: left;
}
}
.tab {
overflow: hidden;
border: 1px solid #ccc;
background-color: #f1f1f1;
}
.tab button {
background-color: inherit;
float: left;
border: none;
outline: none;
cursor: pointer;
padding: 14px 16px;
transition: 0.3s;
font-size: 17px;
}
.tab button:hover {
background-color: #ddd;
}
.tab button.active {
background-color: #ccc;
}
.tabcontent {
display: none;
padding: 6px 12px;
b1order: 1px solid #ccc;
b1order-top: none;
}
.full-height {
height: 100vh;
}
.flex-center {
align-items: center;
display: flex;
justify-content: center;
}
.position-ref {
position: relative;
}
.flex-content {
text-align: center;
}
@@ -1,803 +0,0 @@
function readdata(source, callback) {
var xmlhttp;
try {xmlhttp = new XMLHttpRequest();} catch (e) {
try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {
alert("Old browser?");
return false;
}
}
}
xmlhttp.open("GET", "/cgi-bin/" + source);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
callback(JSON.parse(xmlhttp.responseText));
}
}
}
xmlhttp.send(null);
}
function translate() {
var lang = navigator.languages ? navigator.languages[0] : navigator.language;
this._lang = lang.substr(0, 2);
// this._lang = 'en';
fetch(`/i18n/${this._lang}.json`)
.then((response) => {
if (response.ok) {
return response.json();
}
throw new Error('Something went wrong');
})
.then((translation) => {
this._translation = translation;
this._elements = document.querySelectorAll("[data-i18n]");
this._elements.forEach((element) => {
var keys = element.dataset.i18n.split(".");
var text = keys.reduce((obj, i) => obj[i], translation);
if (text) {
element.innerHTML = text;
}
});
})
.catch((error) => {
console.log(`Could not load ${this._lang}, en will be used`);
});
}
function _t(text, defaulttext) {
if (this._translation) {
var key = text.replaceAll(' ', '').toLowerCase();
if (key in this._translation) {
return this._translation[key];
}
}
return defaulttext ? defaulttext : text;
}
function info_onload() {
translate();
showmodeminfo();
}
function formatDateTime(s) {
if (s.length == 14) {
return s.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5:$6");
} else if (s.length == 12) {
return s.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5");
} else if (s.length == 8) {
return s.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3");
} else if (s.length == 6) {
return s.replace(/(\d{4})(\d{2})/, "$1-$2");
}
return s;
}
function lz(n) {
return (n < 10 ? '0' : '' ) + n;
}
function formatDateTimeForUptime(uptime) {
var d = new Date(new Date().getTime() - uptime * 1000);
return '' +
d.getFullYear() + '-' +
lz(d.getMonth() + 1) + '-' +
lz(d.getDate()) + ' ' +
lz(d.getHours()) + ':' +
lz(d.getMinutes()) + ':' +
lz(d.getSeconds());
}
function createRowForModal(key, value) {
return '<div class="row"><div class="col-xs-5 col-sm-6 text-right">' + key + '</div><div class="col-xs-7 col-sm-6 text-left"><p>' + value + '</p></div></div>';
}
function createRow9ColForModal(arr) {
return '<div class="row">' +
'<div class="col-xs-1 text-right"><p>' + arr[0] + '</p></div>' +
'<div class="col-xs-3 text-left"><p>' + arr[1] + '</p></div>' +
'<div class="col-xs-2 text-left"><p>' + arr[2] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[3] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[4] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[5] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[6] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[7] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[8] + '</p></div>' +
'</div>';
}
/*****************************************************************************/
var modal;
function setValue(element, value) {
var e = document.getElementById(element);
if (e.tagName == "SELECT") {
for (var i = 0; i < e.options.length; i++) {
if (e.options[i].value == value) {
e.selectedIndex = i;
break;
}
}
} else if (e.tagName == "P") {
e.innerHTML = value;
} else if (e.tagName == "H3") {
e.innerHTML = value;
} else if (e.tagName == "SPAN") {
e.innerHTML = value;
} else if (e.tagName == "DIV") {
e.innerHTML = value;
} else if (e.type === 'checkbox') {
e.checked = value;
} else if (e.type === 'radio') {
e.checked = value;
} else {
e.value = value;
}
}
function setDisplay(element, show) {
document.getElementById(element).style.display = (show ? 'block' : 'none');
}
function addClasses(element, classes) {
for (var i = 0; i < classes.length; i++) {
if (!element.className.match(new RegExp('(?:^|\\s)' + classes[i] + '(?!\\S)', 'g')))
element.className += " " + classes[i];
}
}
function removeClasses(element, classes) {
for (var i = 0; i < classes.length; i++) {
element.className = element.className.replace(new RegExp('(?:^|\\s)' + classes[i] + '(?!\\S)', 'g'), '');
}
}
function showMsg(msg, error) {
closeMsg();
if (!msg || 0 === msg.length) { msg = _t('Please wait') + '...'; }
var e = document.getElementById('msgtxt');
e.innerHTML = msg;
if (error) {
e.style.color = 'red';
addClasses(e, ['has-error']);
} else {
e.style.color = null;
removeClasses(e, ['has-error']);
}
modal = document.getElementById('div_msg');
modal.style.display = 'block';
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = 'none';
}
}
}
function closeMsg() {
if (modal) { modal.style.display = 'none'; }
}
function sortJSON(data, key, way) {
return data.sort(function(a, b) {
var x = a[key]; var y = b[key];
if (way === 'asc' ) { return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }
if (way === 'desc') { return ((x > y) ? -1 : ((x < y) ? 1 : 0)); }
});
}
function formatDuration(s, showsec) {
if (s === '-') {return '-';}
if (s === '') {return '-';}
var d = Math.floor(s/86400),
h = Math.floor(s/3600) % 24,
m = Math.floor(s/60)%60,
s = s % 60;
var time = d > 0 ? d + 'd ' : '';
if (time != '') {time += h + _t('h') + ' '} else {time = h > 0 ? h + _t('h') + ' ' : ''}
if (time != '') {time += m + 'm '} else {time = m > 0 ? m + 'm ' : ''}
if (showsec) {
time += s + 's';
} else {
if (time == '') { time += m + 'm'; }
}
return time;
}
/*****************************************************************************/
function modem(evt, modem) {
var i, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
}
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", "");
}
document.getElementById(modem).style.display = "block";
evt.currentTarget.className += " active";
}
function showmodeminfo() {
readdata('infoproducts.sh', function(data1) {
var html = '';
if (data1.res.length > 1) {
var htmltab = '<div class="tab">';
(data1.res).forEach(function callback(value, idx) {
var id = (idx == 0 ? 'id="defaultOpen"' : '');
htmltab += '<button class="tablinks" onclick="modem(event, \'modem' + idx + '\')"' + id + '><span id="tabtitle' + idx + '"></span></button>';
html += ('<div id="modem' + idx + '" class="tabcontent">' + document.getElementById('div_template').innerHTML + '</div>').replaceAll('_idx', idx);
});
htmltab += '</div>';
setValue('div_modems', '');
document.getElementById('div_modems').insertAdjacentHTML('beforeend', htmltab + html);
document.getElementById("defaultOpen").click();
} else {
setValue('div_modems', '');
html += ('<div id="modem0">' + document.getElementById('div_template').innerHTML + '</div>').replaceAll('_idx', 0);
document.getElementById('div_modems').insertAdjacentHTML('beforeend', html);
}
(data1.res).forEach(function callback(data, idx) {
setValue('vendor' + idx, data.vendor == '' ? '-' : data.vendor);
setValue('product' + idx, data.product == '' ? '-' : data.product);
if (data1.res.length > 1) {
setValue('tabtitle' + idx, data.product == '' ? 'modem #' + (idx + 1) : data.product);
}
setValue('revision' + idx, data.revision == '' ? '-' : data.revision);
setValue('imei' + idx, data.imei == '' ? '-' : data.imei);
setValue('iccid' + idx, data.iccid == '' ? '-' : data.iccid);
setValue('imsi' + idx, data.imsi == '' ? '-' : data.imsi);
});
showmodemparams();
setInterval(showmodemparams, 10000);
});
}
var arrmodemaddon = [];
function showmodemparams() {
readdata('info.sh', function(data1) {
(data1.res).forEach(function callback(data2, idx) {
var data = data2[0];
setValue('rx' + idx, data.rx == '' ? '-' : data.rx);
setValue('tx' + idx, data.tx == '' ? '-' : data.tx);
setValue('uptime' + idx, formatDuration(data.conn_time_sec, false));
setValue('uptime_since' + idx, ' (' + _t('since') + ' ' + formatDateTimeForUptime(data.conn_time_sec) + ')');
var data = data2[1];
if (data.error)
return;
arrmodemaddon[idx] = [];
switch(data.registration) {
case "0":
setValue('registration' + idx, _t('registered0', 'Not registered'));
break;
case "1":
setValue('registration' + idx, _t('registered1', 'Registered, home network'));
break;
case "2":
setValue('registration' + idx, _t('registered2', 'Not registered, searching'));
break;
case "3":
setValue('registration' + idx, _t('registered3', 'Registration denied'));
break;
case "5":
setValue('registration' + idx, _t('registered5', 'Registered, roaming'));
break;
case "6":
setValue('registration' + idx, _t('registered6', 'Registered for SMS only, home network'));
break;
case "7":
setValue('registration' + idx, _t('registered7', 'Registered for SMS only, roaming'));
break;
default:
setValue('registration' + idx, data.registration == '' ? '-' : data.registration);
}
if (data.registration == '1' || data.registration == '5' || data.registration == '6' || data.registration == '7') {
setValue('signal' + idx, data.signal == '' ? '-' : data.signal + '%');
if (data.signal) {
var e = document.getElementById('signal_bars' + idx);
removeClasses(e, ['lzero', 'lone', 'ltwo', 'lthree', 'lfour', 'lfive', 'one-bar', 'two-bars', 'three-bars', 'four-bars', 'five-bars']);
if (data.signal >= 80) {
addClasses(e, ['lfive', 'five-bars']);
}
if (data.signal < 80 && data.signal >= 60) {
addClasses(e, ['lfour', 'four-bars']);
}
if (data.signal < 60 && data.signal >= 40) {
addClasses(e, ['lthree', 'three-bars']);
}
if (data.signal < 40 && data.signal >= 20) {
addClasses(e, ['ltwo', 'two-bars']);
}
if (data.signal < 20 && data.signal > 0) {
addClasses(e, ['lone', 'one-bar']);
}
if (data.signal == 0) {
addClasses(e, ['lzero', 'one-bar']);
}
}
setValue('operator' + idx, data.operator_name == '' ? '-' : data.operator_name);
var mode = (data.mode == '' ? '-' : data.mode);
if (mode.toLowerCase().includes('lte') || mode.toLowerCase().includes('5g')) {
if (mode.toLowerCase().includes('lte')) {
mode = (data.mode).split(' ')[0];
}
if (mode.toLowerCase().includes('5g')) {
mode = (data.mode).split(' ')[0] + ' ' + (data.mode).split(' ')[1];
}
var count = ((data.mode).match(/\//g) || []).length;
if (count > 0) {
mode += ' (' + (count + 1) + 'CA)';
}
}
setValue('mode' + idx, mode);
arrmodemaddon[idx].push({'idx':1, 'key':'Mode', 'value':data.mode});
if (data.country) {
arrmodemaddon[idx].push({'idx':19, 'key':'Country', 'value':data.country});
}
if (data.operator_mcc && data.operator_mcc != '' && data.operator_mnc && data.operator_mnc != '') {
arrmodemaddon[idx].push({'idx':20, 'key':'MCC MNC', 'value':data.operator_mcc + ' ' + data.operator_mnc});
}
if (data.lac_dec && data.lac_dec > 0) {
arrmodemaddon[idx].push({'idx':22, 'key':'LAC', 'value':data.lac_dec + ' (' + data.lac_hex + ')'});
}
if (data.cid_dec && data.cid_dec > 0) {
arrmodemaddon[idx].push({'idx':21, 'key':'Cell ID', 'value':data.cid_dec + ' (' + data.cid_hex + ')'});
}
if (data.cid_dec && data.cid_dec > 0 && data.operator_mcc == 260) {
switch (data.operator_mnc) {
case '01':
case '02':
case '03':
case '06':
document.getElementById('btsearch' + idx).setAttribute('href', 'https://btsearch.pl/stations?mnc=260' + data.operator_mnc + '&q=' + data.cid_dec);
break;
default:
document.getElementById('btsearch' + idx).setAttribute('href', 'https://btsearch.pl/stations?q=' + data.cid_dec);
}
setDisplay('div_btsearch' + idx, true);
} else {
setDisplay('div_btsearch' + idx, false);
}
} else {
setValue('signal' + idx, '-');
var e = document.getElementById('signal_bars' + idx);
removeClasses(e, ['lzero', 'lone', 'ltwo', 'lthree', 'lfour', 'lfive', 'one-bar', 'two-bars', 'three-bars', 'four-bars', 'five-bars']);
addClasses(e, ['lzero', 'one-bar']);
setValue('operator' + idx, '-');
setValue('mode' + idx, '-');
setDisplay('div_btsearch' + idx, false);
}
if (data.addon) {
arrmodemaddon[idx] = arrmodemaddon[idx].concat(data.addon);
}
setDisplay('div_addon' + idx, (arrmodemaddon[idx]).length > 0);
});
});
}
function paramdesc(param, value) {
var pvalue = parseInt(value.split(' ')[0]);
var description = '';
var color = '';
var title = '';
switch(param) {
case 'rssi':
if (pvalue > -65) { color = '#2bdf5a'; description += _t('excellent'); }
if (pvalue > -75 && pvalue <= -65 ) { color = '#efff12'; description += _t('good'); }
if (pvalue > -85 && pvalue <= -75 ) { color = '#f8c200'; description += _t('fair'); }
if (pvalue > -95 && pvalue <= -85 ) { color = '#fa0000'; description += _t('poor'); }
if (pvalue <= -95) { color = '#fa0000'; description += _t('very poor'); }
title += '> -65 dBm ' + _t('excellent') + '\n';
title += '> -75 dBm i <= -65 dBm ' + _t('good') + '\n';
title += '> -85 dBm i <= -75 dBm ' + _t('fair') + '\n';
title += '> -95 dBm i <= -85 dBm ' + _t('poor') + '\n';
title += '<= -95 dBm ' + _t('very poor');
break;
case 'rsrp':
if (pvalue >= -80) { color = '#2bdf5a'; description += _t('excellent'); }
if (pvalue >= -90 && pvalue < -80 ) { color = '#efff12'; description += _t('good'); }
if (pvalue >= -100 && pvalue < -90 ) { color = '#f8c200'; description += _t('fair'); }
if (pvalue < -100) { color = '#fa0000'; description += _t('poor'); }
title += '> -80 dBm ' + _t('excellent') + '\n';
title += '>= -90 dBm i < -80 dBm ' + _t('good') + '\n';
title += '>= -100 dBm i < -90 dBm ' + _t('fair') + '\n';
title += '< -100 dBm ' + _t('poor');
break;
case 'rsrq':
if (pvalue >= -10) { color = '#2bdf5a'; description += _t('excellent'); }
if (pvalue >= -15 && pvalue < -10 ) { color = '#efff12'; description += _t('good'); }
if (pvalue >= -20 && pvalue < -15 ) { color = '#f8c200'; description += _t('fair'); }
if (pvalue < -20) { color = '#fa0000'; description += _t('poor'); }
title += '>= -10 dB ' + _t('excellent') + '\n';
title += '>= -15 dB i < -10 dB ' + _t('good') + '\n';
title += '>= -20 dB i < -15 dB ' + _t('fair') + '\n';
title += '< -20 dB ' + _t('poor');
break;
}
return ', <span style="color:' + color + '" title="' + title + '">' + description + '</span>';
}
function modemaddon(idx) {
var htmlco = '';
var htmlxs = '';
var html = '';
var pcc = [];
var scc1 = [];
var scc2 = [];
var scc3 = [];
var scc4 = [];
var ulscc = [];
var sorted = sortJSON(arrmodemaddon[idx], 'idx', 'asc');
sorted.forEach(function(e) {
var description = '';
switch (e.idx) {
// MODE
case 1:
if ((e.value).search(/^LTE B/) > -1 || (e.value).search(/^LTE-A B/) > -1) {
pcc[1] = (e.value).replace(/^LTE /, '').replace(/^LTE-A /, '');
}
if ((e.value).search(/^5G/) > -1) {
pcc[1] = (e.value).replace(/^5G NSA /, '').replace(/^5G SA /, '');
}
break;
// PCC
case 30:
if ((e.value).includes(' @')) {
pcc[1] = (e.value).split(' @')[0];
pcc[2] = (e.value).split(' @')[1];
} else {
pcc[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 31:
pcc[2] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 32:
if (typeof pcc[2] === 'undefined') {
pcc[2] = e.value;
} else {
pcc[2] = e.value + ' DL<br>' + pcc[2] + ' UL'
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 33:
pcc[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 34:
if ((e.key).toLowerCase().includes('earfcn ul')) {
if (typeof pcc[4] === 'undefined') {
pcc[4] = e.value + ' UL';
} else {
pcc[4] = pcc[4] + ' DL<br>' + e.value + ' UL';
}
} else {
if (typeof pcc[4] === 'undefined') {
pcc[4] = e.value;
} else {
pcc[4] = e.value + ' DL<br>' + pcc[4];
}
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 35:
description = paramdesc('rssi', e.value);
pcc[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 36:
description = paramdesc('rsrp', e.value);
pcc[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 37:
description = paramdesc('rsrq', e.value);
pcc[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 38:
if ((e.key).toLowerCase().includes('sinr')) {
pcc[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC1
case 50:
if ((e.value).includes(' @')) {
scc1[1] = (e.value).split(' @')[0];
scc1[2] = (e.value).split(' @')[1];
} else {
scc1[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 52:
scc1[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 53:
scc1[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 54:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc1[4] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 55:
description = paramdesc('rssi', e.value);
scc1[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 56:
description = paramdesc('rsrp', e.value);
scc1[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 57:
description = paramdesc('rsrq', e.value);
scc1[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 58:
if ((e.key).toLowerCase().includes('sinr')) {
scc1[8] = e.value;
} else {
html += createRowForModal(e.key, e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC2
case 60:
if ((e.value).includes(' @')) {
scc2[1] = (e.value).split(' @')[0];
scc2[2] = (e.value).split(' @')[1];
} else {
scc2[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 62:
scc2[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 63:
scc2[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 64:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc2[4] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 65:
description = paramdesc('rssi', e.value);
scc2[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 66:
description = paramdesc('rsrp', e.value);
scc2[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 67:
description = paramdesc('rsrq', e.value);
scc2[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 68:
if ((e.key).toLowerCase().includes('sinr')) {
scc2[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC3
case 70:
if ((e.value).includes(' @')) {
scc3[1] = (e.value).split(' @')[0];
scc3[2] = (e.value).split(' @')[1];
} else {
scc3[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 72:
scc3[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 73:
scc3[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 74:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc3[4] = e.value;
} else {
html += createRowForModal(e.key, e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 75:
description = paramdesc('rssi', e.value);
scc3[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 76:
description = paramdesc('rsrp', e.value);
scc3[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 77:
description = paramdesc('rsrq', e.value);
scc3[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 78:
if ((e.key).toLowerCase().includes('sinr')) {
scc3[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC4
case 80:
if ((e.value).includes(' @')) {
scc4[1] = (e.value).split(' @')[0];
scc4[2] = (e.value).split(' @')[1];
} else {
scc4[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 82:
scc4[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 83:
scc4[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 84:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc4[4] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 85:
description = paramdesc('rssi', e.value);
scc4[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 86:
description = paramdesc('rsrp', e.value);
scc4[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 87:
description = paramdesc('rsrq', e.value);
scc4[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 88:
if ((e.key).toLowerCase().includes('sinr')) {
scc4[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 150:
ulscc[1] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 152:
ulscc[2] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 153:
ulscc[3] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 154:
ulscc[4] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
default:
if (e.idx < 30) {
htmlco += createRowForModal(_t(e.key), e.value);
} else {
html += createRowForModal(_t(e.key), e.value);
htmlxs += createRowForModal(_t(e.key), e.value);
}
}
});
htmlco += '<div class="visible-xs-block visible-sm-block">' + htmlxs + '</div>';
if (pcc.length + scc1.length + scc2.length + scc3.length + scc4.length > 0) {
htmlco += '<div class="margintop hidden-xs hidden-sm">' + html;
if (pcc.length > 0) {
pcc[0] = 'PCC';
for (var idx = 0; idx <= 9; idx++) {
if (typeof pcc[idx] === 'undefined') { pcc[idx] = '-'; }
}
htmlco += createRow9ColForModal(['', _t('Band'), _t('Bandwidth'), 'PCI', 'EARFCN', 'RSSI', 'RSRP', 'RSRQ', 'SINR']);
htmlco += createRow9ColForModal(pcc);
}
if (scc1.length > 0) {
scc1[0] = 'SCC1';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc1[idx] === 'undefined') { scc1[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc1);
}
if (scc2.length > 0) {
scc2[0] = 'SCC2';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc2[idx] === 'undefined') { scc2[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc2);
}
if (scc3.length > 0) {
scc3[0] = 'SCC3';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc3[idx] === 'undefined') { scc3[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc3);
}
if (scc4.length > 0) {
scc4[0] = 'SCC4';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc4[idx] === 'undefined') { scc4[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc4);
}
if (ulscc.length > 0) {
ulscc[0] = 'UL SCC';
for (var idx = 0; idx <= 9; idx++) {
if (typeof ulscc[idx] === 'undefined') { ulscc[idx] = '-'; }
}
htmlco += createRow9ColForModal(ulscc);
}
htmlco += '</div>';
}
showMsg(htmlco);
}
/*****************************************************************************/
window.onload = info_onload;
File diff suppressed because one or more lines are too long
@@ -1,53 +0,0 @@
#!/bin/sh
#
# (c) 2024-2025 Cezary Jackiewicz <cezary@eko.one.pl>
#
. /lib/functions.sh
RES="/usr/share/modemdata"
ECM=""
SEPARATOR=""
parse_section() {
[ -n "$SEPARATOR" ] && echo "$SEPARATOR"
local section="$1"
config_get device "$section" device ""
config_get network "$section" network ""
config_get force_plmn "$section" force_plmn "0"
if echo "x$device" | grep -q "192.168."; then
ECM="$RES/addon/ecm/huawei.sh $device"
else
ECM=""
if [ ! -e /var/state/3ginfo-detected ]; then
[ -z "$device" ] && device=$(/usr/share/3ginfo/detectdevice.sh)
[ -z "$network" ] && network=$(/usr/share/3ginfo/detectsection.sh "$section")
fi
config_get pincode "$section" pincode ""
if [ -n "$pincode" ] && [ ! -e /var/state/3ginfo-pincode ]; then
[ -n "$device" ] && sms_tool -d "$device" at "at+cpin=\"$pincode\""
fi
fi
echo "["
$RES/network.sh "$network" | tr -d '\n'
echo ","
if [ -n "$ECM" ]; then
$ECM params
else
$RES/params.sh "$device" "$force_plmn" | tr -d '\n'
fi
echo "]"
SEPARATOR=","
}
config_load 3ginfo
echo -e "Content-type: application/json\n\n"
echo '{"res":['
config_foreach parse_section 3ginfo
echo ']}'
touch /var/state/3ginfo-detected
touch /var/state/3ginfo-pincode
exit 0
@@ -1,42 +0,0 @@
#!/bin/sh
#
# (c) 2024-2025 Cezary Jackiewicz <cezary@eko.one.pl>
#
. /lib/functions.sh
RES="/usr/share/modemdata"
SEPARATOR=""
parse_section() {
[ -n "$SEPARATOR" ] && echo "$SEPARATOR"
local section="$1"
local device
local network
config_get device "$section" device ""
if echo "x$device" | grep -q "192.168."; then
$RES/addon/ecm/huawei.sh $device product
else
if [ ! -e /var/state/3ginfo-detected ]; then
[ -z "$device" ] && device=$(/usr/share/3ginfo/detectdevice.sh)
fi
config_get pincode "$section" pincode ""
if [ -n "$pincode" ] && [ ! -e /var/state/3ginfo-pincode ]; then
[ -n "$device" ] && sms_tool -d "$device" at "at+cpin=\"$pincode\""
fi
$RES/product.sh "$device" | tr -d '\n'
fi
SEPARATOR=","
}
config_load 3ginfo
echo -e "Content-type: application/json\n\n"
echo '{"res":['
config_foreach parse_section 3ginfo
echo ']}'
touch /var/state/3ginfo-detected
touch /var/state/3ginfo-pincode
exit 0
@@ -1,4 +0,0 @@
/**
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
@@ -1,39 +0,0 @@
{
"device": "Urządzenie",
"vendor": "Producent",
"product": "Model",
"revision": "Wersja",
"imei": "Identyfikator modemu (IMEI)",
"iccid": "Numer karty SIM (ICCID)",
"imsi": "Identyfikator abonenta (IMSI)",
"parameters": "Parametry",
"signal": "Sygnał",
"mode": "Technologia",
"simstatus": "Status karty SIM",
"more": "więcej parametrów",
"btslocation": "lokalizacja stacji bazowej",
"connection": "Połączenie z internetem",
"connectiontime": "Czas połączenia",
"tx": "Wysłano",
"rx": "Pobrano",
"registered0": "Brak sieci",
"registered1": "Zalogowana do sieci macierzystej",
"registered2": "Wyszukiwanie operatora",
"registered3": "Odmowa dostępu",
"registered5": "Zalogowana do sieci w roamingu",
"registered6": "Zalogowana do sieci macierzystej, tylko SMS",
"registered7": "Zalogowana do sieci w roamingu, tylko SMS",
"since": "od",
"h": "g",
"temperature": "Temperatura",
"band": "Pasmo",
"primaryband": "Pasmo podstawowe",
"bandwidth": "Szerokość",
"excellent": "doskonały",
"good": "dobry",
"fair": "słaby",
"poor": "zły",
"verypoor": "bardzo zły",
"pleasewait": "Proszę czekać",
"country": "Kraj"
}
@@ -1,145 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="cezary@eko.one.pl">
<title>3G/4G/5G</title>
<link href="/bootstrap.min.css?v=1" rel="stylesheet">
<!--[if lt IE 9]>
<script src="/html5shiv.min.js?v=1"></script>
<script src="/respond.min.js?v=1"></script>
<![endif]-->
<link href="/3ginfo.css?v=1" rel="stylesheet">
<script src="/3ginfo.js?v=1"></script>
</head>
<body>
<div class="container">
<div id="div_content">
<div id="div_template" style="display:none">
<h3 class="section" data-i18n="device">Device</h3>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="vendor">Vendor</div>
<div class="col-xs-6">
<p id="vendor_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="product">Product</div>
<div class="col-xs-6">
<p id="product_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="revision">Revision</div>
<div class="col-xs-6">
<p id="revision_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="imei">International Mobile Equipment Identity (IMEI)</div>
<div class="col-xs-6">
<p id="imei_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="iccid">SIM number (ICCID)</div>
<div class="col-xs-6">
<p id="iccid_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="imsi">International Mobile Subscriber Identity (IMSI)</div>
<div class="col-xs-6">
<p id="imsi_idx">-</p>
</div>
</div>
<h3 class="section" data-i18n="parameters">Parameters</h3>
<div class="row">
<div class="col-sm-8">
<div class="row">
<div class="col-xs-6 text-right" data-i18n="operator">Operator</div>
<div class="col-xs-6">
<p id="operator_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="signal">Signal</div>
<div class="col-xs-6">
<p id="signal_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="mode">Mode</div>
<div class="col-xs-6">
<p id="mode_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="simstatus">SIM status</div>
<div class="col-xs-6">
<p id="registration_idx">-</p>
</div>
</div>
<div class="row" id="div_addon_idx" style="display:none;">
<div class="col-xs-6 col-xs-offset-6">
<p><a href="#" class="click" onclick="modemaddon(_idx);" data-i18n="more">more parameters</a></p>
</div>
</div>
<div class="row" id="div_btsearch_idx" style="display:none;">
<div class="col-xs-6 col-xs-offset-6">
<p><a href="#" id="btsearch_idx" class="click" target="_blank" data-i18n="btslocation">BTS location</a>&nbsp;&rarr;</p>
</div>
</div>
</div>
<div class="col-sm-4 center-xd">
<div class="signal-bars sizing-box lzero one-bar" id="signal_bars_idx">
<div class="first-bar bar"></div>
<div class="second-bar bar"></div>
<div class="third-bar bar"></div>
<div class="fourth-bar bar"></div>
<div class="fifth-bar bar"></div>
</div>
</div>
</div>
<h3 class="section" data-i18n="connection">Connection</h3>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="connectiontime">Connection time</div>
<div class="col-xs-6">
<p><span id="uptime_idx">-</span><span class="visible-xs oneline"></span><span id="uptime_since_idx"></span></p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="tx">Uploaded</div>
<div class="col-xs-6">
<p id="tx_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="rx">Downloaded</div>
<div class="col-xs-6">
<p id="rx_idx">-</p>
</div>
</div>
</div>
<div id="div_modems">
<div class="flex-center position-ref full-height">
<div class="flex-content">
<div data-i18n="pleasewait">Please wait</div>
</div>
</div>
</div>
</div>
<div id="div_msg" class="modal">
<div id="msgtxt" class="modal-content text-center" data-i18n="pleasewait">Please wait</div>
</div>
<div class="text-center">&nbsp;</div>
</body>
</html>
@@ -1,5 +0,0 @@
/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
* Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
* */
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
@@ -1,51 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.01
waitquiet 0.01 0.01
let $c="AT+CSQ^m"
let $r="+CSQ"
gosub readatcmd
let $c="AT+COPS=3,0;+COPS?^m"
let $r="+COPS"
gosub readatcmd
let $c="AT+COPS=3,2;+COPS?^m"
let $r="+COPS"
gosub readatcmd
let $c="AT+CREG=2;+CREG?^m"
let $r="+CREG"
gosub readatcmd
let $c="AT+CPIN?^m"
let $r="+CPIN"
gosub readatcmd
exit 0
:readatcmd
let i=15
send $c
:loop
get 0.1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
print $s
return
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
if $mid($s,1,2) = "CO" return
if len($s) < 10 goto loop2
if $mid($s,1,10) != "+CME ERROR" goto loop2
print $s
return
:loop2
if i = 0 exit 0
let i=i-1
goto loop
@@ -1,118 +0,0 @@
#!/bin/sh
#
# (c) 2010-2019 Cezary Jackiewicz <cezary@eko.one.pl>
#
RES="/usr/share/3ginfo-lite"
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
if [ "x$DEVICE" = "x" ]; then
touch /tmp/modem
DEVICE=$(cat /tmp/modem)
else
echo "$DEVICE" > /tmp/modem
fi
if [ "x$DEVICE" = "x" ]; then
devices=$(ls /dev/ttyUSB* /dev/cdc-wdm* /dev/ttyACM* /dev/ttyHS* 2>/dev/null | sort -r)
for d in $devices; do
DEVICE=$d gcom -s $RES/probeport.gcom > /dev/null 2>&1
if [ $? = 0 ]; then
echo "$d" > /tmp/modem
break
fi
done
DEVICE=$(cat /tmp/modem)
fi
if [ "x$DEVICE" = "x" ]; then
echo '{"error":"Device not found"}'
exit 0
fi
O=$(gcom -d $DEVICE -s $RES/3ginfo.gcom 2>/dev/null)
# CSQ
CSQ=$(echo "$O" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
[ "x$CSQ" = "x" ] && CSQ=-1
if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
CSQ_PER=$(($CSQ * 100/31))
else
CSQ="-"
CSQ_PER="0"
fi
# COPS numeric
COPS_NUM=$(echo "$O" | awk -F[\"] '/^\+COPS: .,2/ {print $2}' | head -1)
if [ "x$COPS_NUM" = "x" ]; then
COPS_NUM="-"
COPS_MCC="-"
COPS_MNC="-"
else
COPS_MCC=${COPS_NUM:0:3}
COPS_MNC=${COPS_NUM:3:3}
COPS=$(awk -F[\;] '/'$COPS_NUM'/ {print $2}' $RES/mccmnc.dat)
fi
[ "x$COPS" = "x" ] && COPS=$COPS_NUM
if [ -z "$FORCE_PLMN" ]; then
# COPS alphanumeric
T=$(echo "$O" | awk -F[\"] '/^\+COPS: .,0/ {print $2}')
[ "x$T" != "x" ] && COPS="$T"
fi
# CREG
eval $(echo "$O" | busybox awk -F[,] '/^\+CREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";LAC_HEX=\"%X\";CID_HEX=\"%X\";LAC_DEC=\"%d\";CID_DEC=\"%d\";MODE1=\"%d\"", $2, "0x"$3, "0x"$4, "0x"$3, "0x"$4, $5}')
case "$T" in
0*) REG="0";;
1*) REG="1";;
2*) REG="2";;
3*) REG="3";;
5*) REG="5";;
*) REG="-";;
esac
# MODE
[ -z "$MODE1" -o "x$MODE1" = "x0" ] && MODE1=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4;exit}')
case "$MODE1" in
2*) MODE="UMTS";;
3*) MODE="EDGE";;
4*) MODE="HSDPA";;
5*) MODE="HSUPA";;
6*) MODE="HSPA";;
7*) MODE="LTE";;
*) MODE="-";;
esac
T=$(echo "$O" | awk -F[,\ ] '/^\+CME ERROR:/ {print $0;exit}')
if [ -n "$T" ]; then
case "$T" in
"+CME ERROR: 10"*) REG="SIM not inserted";;
"+CME ERROR: 11"*) REG="SIM PIN required";;
"+CME ERROR: 12"*) REG="SIM PUK required";;
"+CME ERROR: 13"*) REG="SIM failure";;
"+CME ERROR: 14"*) REG="SIM busy";;
"+CME ERROR: 15"*) REG="SIM wrong";;
"+CME ERROR: 17"*) REG="SIM PIN2 required";;
"+CME ERROR: 18"*) REG="SIM PUK2 required";;
*) REG=$(echo "$T" | cut -f2 -d: | xargs);;
esac
fi
cat <<EOF
{
"csq":"$CSQ",
"signal":"$CSQ_PER",
"operator_name":"$COPS",
"operator_mcc":"$COPS_MCC",
"operator_mnc":"$COPS_MNC",
"mode":"$MODE",
"registration":"$REG",
"lac_dec":"$LAC_DEC",
"lac_hex":"$LAC_HEX",
"cid_dec":"$CID_DEC",
"cid_hex":"$CID_HEX"
}
EOF
exit 0
@@ -1,9 +0,0 @@
#!/bin/sh
echo "Content-type: application/json"
echo ""
if [ -e /dev/cdc-wdm0 ]; then
uqmi -s -d /dev/cdc-wdm0 --get-signal-info | sed 's/"type":"hdr".*,"type"/"type"/g'
else
echo "{}"
fi
exit 0
-42
View File
@@ -1,42 +0,0 @@
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Status" />
<meta name="author" content="Cezary Jackiewicz">
<title>QMI</title>
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<p> </p>
<table class='table table-condensed table-striped'>
<colgroup><col class='col-xs-4'><col class='col-xs-2'><col class='col-xs-2'><col class='col-xs-2'><col class='col-xs-2'></colgroup>
<thead><tr><th>Parametr</th><th>Wartość</th><th>Min</th><th>Max</th><th>Jednostka</th></tr></thead>
<tbody>
<tr><td><span id='key1'>&nbsp;</span></td><td><span id='val1'></span></td><td><span id='min1'></span></td><td><span id='max1'></span></td><td><span id='unit1'></span></td></tr>
<tr><td><span id='key2'>&nbsp;</span></td><td><span id='val2'></span></td><td><span id='min2'></span></td><td><span id='max2'></span></td><td><span id='unit2'></span></td></tr>
<tr><td><span id='key3'>&nbsp;</span></td><td><span id='val3'></span></td><td><span id='min3'></span></td><td><span id='max3'></span></td><td><span id='unit3'></span></td></tr>
<tr><td><span id='key4'>&nbsp;</span></td><td><span id='val4'></span></td><td><span id='min4'></span></td><td><span id='max4'></span></td><td><span id='unit4'></span></td></tr>
<tr><td><span id='key5'>&nbsp;</span></td><td><span id='val5'></span></td><td><span id='min5'></span></td><td><span id='max5'></span></td><td><span id='unit5'></span></td></tr>
</tbody>
</table>
<div id="div_g" style="width:100%; height:300px;"><p class="text-center">Trwa zbieranie danych...</p></div>
<p><i>Interwał 3s, okno 15 minut.</i></p>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dygraph/1.1.1/dygraph-combined.js"></script>
<script src="/qmisignal.js"></script>
</body>
</html>
-102
View File
@@ -1,102 +0,0 @@
var data = [];
var g;
var min = [], max = [];
var colors = [];
colors['signal'] = '#333';
colors['rssi'] = '#333';
colors['rsrp'] = '#333';
colors['ecio'] = '#333';
colors['rsrq'] = '#333';
colors['snr'] = '#333';
window.intervalId = setInterval(function() {
$.getJSON( "/cgi-bin/qmisignal.sh", function(data1) {
var idx=0
$.each(data1, function(i, val) {
idx++;
unit='';
if (!min[i]) {min[i]=999;max[i]=-999;}
switch(i) {
case "type":
val=(val).toUpperCase();
break;
case "signal":
case "rssi":
case "rsrp":
if (val < min[i]) {min[i] = val;}
if (val > max[i]) {max[i] = val;}
unit='dBm'
break;
case "ecio":
case "rsrq":
case "snr":
if (val < min[i]) {min[i] = val;}
if (val > max[i]) {max[i] = val;}
unit='dB'
break;
}
$("#key"+idx).text(''+i);
$("#val"+idx).text(''+val);
$('#val'+idx).css('color', colors[i]);
$("#unit"+idx).text(''+unit);
$('#unit'+idx).css('color', colors[i]);
if (i != 'type')
{
$("#min"+idx).text(''+min[i]);
$('#min'+idx).css('color', colors[i]);
$("#max"+idx).text(''+max[i]);
$('#max'+idx).css('color', colors[i]);
}
});
data.push([new Date(),
data1["signal"],
data1["rssi"],
data1["rsrp"],
data1["ecio"],
data1["rsrq"],
data1["snr"]
]);
if (data.length > 300) {data.shift();}
if (g==null) {
g = new Dygraph(document.getElementById("div_g"), data, {
drawPoints: false,
showRoller: false,
labels: ['', 'Signal', 'RSSI', 'RSRP', 'ECIO', 'RSRQ', 'SNR'],
labelsSeparateLines: true,
ylabel: 'RSSI, RSRP [dBm]',
y2label: 'ECIO, RSRQ, SNR [dB]',
series : {
'ECIO': {axis: 'y2'},
'RSRQ': {axis: 'y2'},
'SNR': {axis: 'y2'}
},
axes: {
y: {independentTicks: true},
y2: {
independentTicks: true,
ticker: Dygraph.numericLinearTicks,
drawGrid: true,
gridLineColor: "#ff0000",
gridLinePattern: [4,4]
}
}
});
var tcolors = g.getColors();
colors['signal'] = tcolors[0];
colors['rssi'] = tcolors[1];
colors['rsrp'] = tcolors[2];
colors['ecio'] = tcolors[3];
colors['rsrq'] = tcolors[4];
colors['snr'] = tcolors[5];
} else {
g.updateOptions({'file':data});
}
});
}, 3000);
-7
View File
@@ -1,7 +0,0 @@
config 3ginfo
option device ''
option http_port '81'
option language 'pl'
option network 'wan'
option pincode ''
@@ -1,4 +0,0 @@
case "$ACTION" in
remove)
[ -f /tmp/pincode_was_given ] && rm -f /tmp/pincode_was_given;;
esac
@@ -1,4 +0,0 @@
#!/bin/sh
ln -s /usr/share/3ginfo/cgi-bin/3ginfo.sh /usr/bin/3ginfo
exit 0
@@ -1,593 +0,0 @@
#!/bin/sh
#
# (c) 2010-2026 Cezary Jackiewicz <cezary@eko.one.pl>
#
# Output format
# 0 - html
# 1 - txt
# 2 - json
FORMAT=1
RES="/usr/share/3ginfo"
LANG=$(uci -q get 3ginfo.@3ginfo[0].language)
[ "x$LANG" = "x" ] && LANG="en"
getpath() {
devname="$(basename "$1")"
case "$devname" in
'tty'*)
devpath="$(readlink -f /sys/class/tty/$devname/device)"
P=${devpath%/*/*}
;;
*)
devpath="$(readlink -f /sys/class/usbmisc/$devname/device/)"
P=${devpath%/*}
;;
esac
}
showjsonerror() {
echo "{\"error\": \"$1\"}"
}
if [ "x$1" = "xjson" ]; then
FORMAT=2
else
if [ "`basename $0`" = "3ginfo" ]; then
FORMAT=1
else
FORMAT=0
echo -e "Content-type: text/html\n\n"
fi
if [ ! -e $RES/msg.dat.$LANG ]; then
echo "File missing: $RES/msg.dat.$LANG"
exit 0
fi
. $RES/msg.dat.$LANG
fi
# odpytanie urzadzenia
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
if echo "x$DEVICE" | grep -q "192.168."; then
if grep -q "Vendor=1bbb" /sys/kernel/debug/usb/devices; then
O=$($RES/scripts/alcatel_hilink.sh $DEVICE)
fi
if grep -q "Vendor=12d1" /sys/kernel/debug/usb/devices; then
O=$($RES/scripts/huawei_hilink.sh $DEVICE)
fi
if grep -q "Vendor=19d2" /sys/kernel/debug/usb/devices; then
O=$($RES/scripts/zte.sh $DEVICE)
fi
SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
SEC=${SEC:-wan}
else
if [ "x$DEVICE" = "x" ]; then
devices=$(ls /dev/ttyUSB* /dev/cdc-wdm* /dev/ttyACM* /dev/ttyHS* 2>/dev/null | sort -r);
for d in $devices; do
DEVICE=$d gcom -s $RES/scripts/probeport.gcom > /dev/null 2>&1
if [ $? = 0 ]; then
uci set 3ginfo.@3ginfo[0].device="$d"
uci commit 3ginfo
break
fi
done
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
fi
if [ "x$DEVICE" = "x" ]; then
[ $FORMAT -eq 0 ] && echo "<h3 style='color:red;' class=\"c\">$NOTDETECTED</h3>"
[ $FORMAT -eq 1 ] && echo $NOTDETECTED
[ $FORMAT -eq 2 ] && showjsonerror "NOTDETECTED"
exit 0
fi
if [ ! -e $DEVICE ]; then
[ $FORMAT -eq 0 ] && echo "<h3 style='color:red;' class=\"c\">$NODEVICE $DEVICE!</h3>"
[ $FORMAT -eq 1 ] && echo "$NODEVICE $DEVICE."
[ $FORMAT -eq 2 ] && showjsonerror "NODEVICE $DEVICE"
exit 0
fi
# znajdz odpowiednia sekcje w konfiguracji
SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
if [ -z "$SEC" ]; then
getpath $DEVICE
PORIG=$P
for DEV in /sys/class/tty/* /sys/class/usbmisc/*; do
getpath "/dev/"${DEV##/*/}
if [ "x$PORIG" = "x$P" ]; then
SEC=$(uci show network | grep "/dev/"${DEV##/*/} | cut -f2 -d.)
[ -n "$SEC" ] && break
fi
done
fi
# [ "${DEVICE%%[0-9]}" = "/dev/ttyUSB" ] && stty -F $DEVICE -iexten -opost -icrnl
# daj pin jak jest taka potrzeba
if [ ! -f /tmp/pincode_was_given ]; then
# tylko za pierwszym razem
if [ ! -z $SEC ]; then
PINCODE=$(uci -q get network.$SEC.pincode)
fi
if [ -z "$PINCODE" ]; then
PINCODE=$(uci -q get 3ginfo.@3ginfo[0].pincode)
fi
if [ ! -z $PINCODE ]; then
PINCODE="$PINCODE" gcom -d "$DEVICE" -s /etc/gcom/setpin.gcom > /dev/null || {
[ $FORMAT -eq 0 ] && echo "<h3 style='color:red;' class=\"c\">$PINERROR</h3>"
[ $FORMAT -eq 1 ] && echo "$PINERROR"
[ $FORMAT -eq 2 ] && showjsonerror "PINERROR"
exit 0
}
fi
touch /tmp/pincode_was_given
fi
O=$(gcom -d $DEVICE -s $RES/scripts/3ginfo.gcom 2>/dev/null)
fi
if [ "x$1" = "xtest" ]; then
echo "$O"
echo "---------------------------------------------------------------"
ls /dev/tty*
echo "---------------------------------------------------------------"
cat /sys/kernel/debug/usb/devices
echo "---------------------------------------------------------------"
uci show 3ginfo
exit 0
fi
# CSQ
CSQ=$(echo "$O" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
[ "x$CSQ" = "x" ] && CSQ=-1
if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
# for Gargoyle
[ -e /tmp/strength.txt ] && echo "+CSQ: $CSQ,99" > /tmp/strength.txt
CSQ_PER=$(($CSQ * 100/31))
CSQ_COL="red"
[ $CSQ -ge 10 ] && CSQ_COL="orange"
[ $CSQ -ge 15 ] && CSQ_COL="yellow"
[ $CSQ -ge 20 ] && CSQ_COL="green"
CSQ_RSSI=$((2 * CSQ - 113))
else
CSQ="-"
CSQ_PER="0"
CSQ_COL="black"
CSQ_RSSI="-"
fi
# COPS
COPS_NUM=$(echo "$O" | awk -F[\"] '/^\+COPS: .,2/ {print $2}')
if [ "x$COPS_NUM" = "x" ]; then
COPS_NUM="-"
COPS_MCC="-"
COPS_MNC="-"
else
COPS_MCC=${COPS_NUM:0:3}
COPS_MNC=${COPS_NUM:3:3}
COPS=$(awk -F[\;] '/'$COPS_NUM'/ {print $2}' $RES/mccmnc.dat)
[ "x$COPS" = "x" ] && COPS="-"
fi
# dla modemow Option i ZTE
if [ "$COPS_NUM" = "-" ]; then
COPS=$(echo "$O" | awk -F[\"] '/^\+COPS: .,0/ {print $2}')
[ "x$COPS" = "x" ] && COPS="---"
COPS_TMP=$(awk -F[\;] 'BEGIN {IGNORECASE = 1} /'"$COPS"'/ {print $2}' $RES/mccmnc.dat)
if [ "x$COPS_TMP" = "x" ]; then
COPS_NUM="-"
COPS_MCC="-"
COPS_MNC="-"
else
COPS="$COPS_TMP"
COPS_NUM=$(awk -F[\;] 'BEGIN {IGNORECASE = 1} /'"$COPS"'/ {print $1}' $RES/mccmnc.dat)
COPS_MCC=${COPS_NUM:0:3}
COPS_MNC=${COPS_NUM:3:3}
fi
fi
# Technologia
MODE="-"
# Nowe Huawei
TECH=$(echo "$O" | awk -F[,] '/^\^SYSINFOEX/ {print $9}' | sed 's/"//g')
if [ "x$TECH" != "x" ]; then
MODE=$(echo "$TECH" | sed 's/-//g')
fi
# Starsze modele Huawei i inne pozostale
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,] '/^\^SYSINFO/ {print $7}')
case $TECH in
17*) MODE="HSPA+ (64QAM)";;
18*) MODE="HSPA+ (MIMO)";;
1*) MODE="GSM";;
2*) MODE="GPRS";;
3*) MODE="EDGE";;
4*) MODE="UMTS";;
5*) MODE="HSDPA";;
6*) MODE="HSUPA";;
7*) MODE="HSPA";;
9*) MODE="HSPA+";;
*) MODE="-";;
esac
fi
# ZTE
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\+ZPAS/ {print $2}' | sed 's/"//g')
if [ "x$TECH" != "x" -a "x$TECH" != "xNo" ]; then
MODE="$TECH"
fi
fi
# OPTION
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F, '/^\+COPS: 0/ {print $4}')
MODE="-"
if [ "$TECH" = 0 ]; then
TECH1=$(echo "$O" | awk '/^_OCTI/ {print $2}' | cut -f1 -d,)
case $TECH1 in
1*) MODE="GSM";;
2*) MODE="GPRS";;
3*) MODE="EDGE";;
*) MODE="-";;
esac
elif [ "$TECH" = 2 ]; then
TECH1=$(echo "$O" | awk '/^_OWCTI/ {print $2}')
case $TECH1 in
1*) MODE="UMTS";;
2*) MODE="HSDPA";;
3*) MODE="HSUPA";;
4*) MODE="HSPA";;
*) MODE="-";;
esac
fi
fi
# Sierra
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\*CNTI/ {print $3}' | sed 's|/|,|g')
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
fi
fi
# Novatel
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\$CNTI/ {print $4}' | sed 's|/|,|g')
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
fi
fi
# Vodafone - icera
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\%NWSTATE/ {print $4}' | sed 's|/|,|g')
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
fi
fi
# SIMCOM
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\+CNSMOD/ {print $3}')
case "$TECH" in
1*) MODE="GSM";;
2*) MODE="GPRS";;
3*) MODE="EDGE";;
4*) MODE="UMTS";;
5*) MODE="HSDPA";;
6*) MODE="HSUPA";;
7*) MODE="HSPA";;
*) MODE="-";;
esac
fi
# generic 3GPP TS 27.007 V10.4.0
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4}')
case "$TECH" in
2*) MODE="UMTS";;
3*) MODE="EDGE";;
4*) MODE="HSDPA";;
5*) MODE="HSUPA";;
6*) MODE="HSPA";;
7*) MODE="LTE";;
*) MODE="-";;
esac
fi
# CREG
CREG="+CGREG"
LAC=$(echo "$O" | awk -F[,] '/\'$CREG'/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
if [ "x$LAC" = "x" ]; then
CREG="+CREG"
LAC=$(echo "$O" | awk -F[,] '/\'$CREG'/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
fi
if [ "x$LAC" != "x" ]; then
LAC_NUM=$(printf %d 0x$LAC)
else
LAC="-"
LAC_NUM="-"
fi
# TAC
TAC=$(echo "$O" | awk -F[,] '/^\+CEREG/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
if [ "x$TAC" != "x" ]; then
TAC_NUM=$(printf %d 0x$TAC)
else
TAC="-"
TAC_NUM="-"
fi
# ECIO / RSCP
ECIO="-"
RSCP="-"
ECIx=$(echo "$O" | awk -F[,\ ] '/^\+ZRSSI:/ {print $3}')
if [ "x$ECIx" != "x" ]; then
ECIO=`expr $ECIx / 2`
ECIO="-"$ECIO
fi
RSCx=$(echo "$O" | awk -F[,\ ] '/^\+ZRSSI:/ {print $4}')
if [ "x$RSCx" != "x" ]; then
RSCP=`expr $RSCx / 2`
RSCP="-"$RSCP
fi
RSCx=$(echo "$O" | awk -F[,\ ] '/^\^CSNR:/ {print $2}')
if [ "x$RSCx" != "x" ]; then
RSCP=$RSCx
fi
ECIx=$(echo "$O" | awk -F[,\ ] '/^\^CSNR:/ {print $3}')
if [ "x$ECIx" != "x" ]; then
ECIO=$ECIx
fi
# RSRP / RSRQ
RSRP="-"
RSRQ="-"
SINR="-"
RSRx=$(echo "$O" | awk -F[,:] '/^\^LTERSRP:/ {print $2}')
if [ "x$RSRx" != "x" ]; then
RSRP=$RSRx
RSRQ=$(echo "$O" | awk -F[,:] '/^\^LTERSRP:/ {print $3}')
fi
TECH=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $2}' | sed 's/[" ]//g')
if [ "x$TECH" != "x" ]; then
PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}')
PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}')
PARAM4=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $6}')
case "$TECH" in
WCDMA*)
RSCP=$(awk 'BEGIN {print -121 + '$PARAM2'}')
ECIO=$(awk 'BEGIN {print -32.5 + '$PARAM3'/2}')
;;
LTE*)
RSRP=$(awk 'BEGIN {print -141 + '$PARAM2'}')
SINR=$(awk 'BEGIN {print -20.2 + '$PARAM3'/5}')
RSRQ=$(awk 'BEGIN {print -20 + '$PARAM4'/2}')
;;
esac
fi
if [ -n "$SEC" ]; then
if [ "x$(uci -q get network.$SEC.proto)" = "xqmi" ]; then
. /usr/share/libubox/jshn.sh
json_init
json_load "$(uqmi -d "$(uci -q get network.$SEC.device)" --get-signal-info)" >/dev/null 2>&1
json_get_var T type
if [ "x$T" = "xlte" ]; then
json_get_var RSRP rsrp
json_get_var RSRQ rsrq
fi
if [ "x$T" = "xwcdma" ]; then
json_get_var ECIO ecio
json_get_var RSSI rssi
json_get_var RSCP rscp
if [ -z "$RSCP" ]; then
RSCP=$((RSSI+ECIO))
fi
fi
fi
fi
BTSINFO=""
CID=$(echo "$O" | awk -F[,] '/\'$CREG'/ {printf "%s", toupper($4)}' | sed 's/[^A-F0-9]//g')
if [ "x$CID" != "x" ]; then
CID_NUM=$(printf %d 0x$CID)
if [ ${#CID} -gt 4 ]; then
T=$(echo "$CID" | awk '{print substr($1,length(substr($1,1,length($1)-4))+1)}')
else
T=$CID
fi
CLF=$(uci -q get 3ginfo.@3ginfo[0].clf)
if [ -e "$CLF" ]; then
PAT="xxx"
[ "x$T" != "x-" -a "x$LAC_NUM" != "x-" ] && PAT="^$COPS_NUM;0x"$(printf %04X 0x$T)";0x"$(printf %04X $LAC_NUM)";"
is_gz=$(dd if="$CLF" bs=1 count=2 2>/dev/null | hexdump -v -e '1/1 "%02x"')
if [ "x$is_gz" = "x1f8b" ] ; then
BTSINFO="<a href=\"https://maps.google.pl/?t=k\&z=17\&q="$(zcat "$CLF" | awk -F";" '/'$PAT'/ {printf $5","$6}')"\">"$(zcat "$CLF" | awk -F";" '/'$PAT'/ {gsub(/\!/,"\\!");print $8}')"</a>"
else
BTSINFO="<a href=\"https://maps.google.pl/?t=k\&z=17\&q="$(awk -F";" '/'$PAT'/ {printf $5","$6}' "$CLF")"\">"$(awk -F";" '/'$PAT'/ {gsub(/\!/,"\\!");print $8}' "$CLF")"</a>"
fi
if [ $FORMAT -eq 2 ]; then
BTSINFO=$(echo "$BTSINFO" | sed 's!<a.*>\(.*\)</a>!\1!g')
fi
fi
if [ $FORMAT -eq 0 ]; then
case $COPS_NUM in
260*) CID="<a href=\"https://btsearch.pl/stations?q="$CID_NUM"\">$CID</a>";;
esac
fi
else
CID="-"
CID_NUM="-"
fi
# CGEQNEG
QOS_SHOW="none"
DOWN="-"
UP="-"
DOWx=$(echo "$O" | awk -F[,] '/\+CGEQNEG/ {printf "%s", $4}')
if [ "x$DOWx" != "x" ]; then
DOWN=$DOWx
UP=$(echo "$O" | awk -F[,] '/\+CGEQNEG/ {printf "%s", $3}')
QOS_SHOW="block"
fi
# SMS
if [ -e /usr/bin/gnokii ]; then
SMS_SHOW="block"
else
SMS_SHOW="none"
fi
# USSD
which ussd159 >/dev/null 2>&1
if [ $? -eq 0 ]; then
USSD_SHOW="block"
else
USSD_SHOW="none"
fi
# Stan limitu
LIMIT_SHOW="none"
LIMIT=$(uci -q get 3ginfo.@3ginfo[0].script)
if [ "x$LIMIT" != "x" ]; then
LIMIT_SHOW="block"
fi
# Status polaczenia
CONN_TIME="-"
RX="-"
TX="-"
if [ -z "$SEC" ]; then
STATUS=$NOINFO
[ $FORMAT -eq 2 ] && STATUS="NOINFO"
STATUS_TRE="-"
STATUS_SHOW="none"
STATUS_SHOW_BUTTON="none"
else
NETUP=$(ifstatus $SEC | grep "\"up\": true")
if [ -n "$NETUP" ]; then
[ $FORMAT -eq 0 ] && STATUS="<font color=green>$CONNECTED</font>"
[ $FORMAT -eq 1 ] && STATUS=$CONNECTED
[ $FORMAT -eq 2 ] && STATUS="CONNECTED"
STATUS_TRE=$DISCONNECT
CT=$(uci -q -P /var/state/ get network.$SEC.connect_time)
if [ -z $CT ]; then
CT=$(ifstatus $SEC | awk -F[:,] '/uptime/ {print $2}' | xargs)
else
UPTIME=$(cut -d. -f1 /proc/uptime)
CT=$((UPTIME-CT))
fi
if [ ! -z $CT ]; then
D=$(expr $CT / 60 / 60 / 24)
H=$(expr $CT / 60 / 60 % 24)
M=$(expr $CT / 60 % 60)
S=$(expr $CT % 60)
CONN_TIME=$(printf "%dd, %02d:%02d:%02d" $D $H $M $S)
fi
IFACE=$(ifstatus $SEC | awk -F\" '/l3_device/ {print $4}')
if [ -n "$IFACE" ]; then
RX=$(ifconfig $IFACE | awk -F[\(\)] '/bytes/ {printf "%s",$2}')
TX=$(ifconfig $IFACE | awk -F[\(\)] '/bytes/ {printf "%s",$4}')
fi
else
[ $FORMAT -eq 0 ] && STATUS="<font color=red>$DISCONNECTED</font>"
[ $FORMAT -eq 1 ] && STATUS=$DISCONNECTED
[ $FORMAT -eq 2 ] && STATUS="DISCONNECTED"
STATUS_TRE=$CONNECT
fi
STATUS_SHOW="block"
STATUS_SHOW_BUTTON="block"
fi
if [ "x"$(uci -q get 3ginfo.@3ginfo[0].connect_button) = "x0" ]; then
STATUS_SHOW_BUTTON="none"
fi
# Informacja o urzadzeniu
DEVICE=$(echo "$O" | awk -F[:] '/DEVICE/ { print $2}')
if [ "x$DEVICE" = "x" ]; then
DEVICE="-"
fi
# podmiana w szablonie
if [ $FORMAT -eq 2 ]; then
TEMPLATE="$RES/status.json"
else
[ $FORMAT -eq 0 ] && EXT="html"
[ $FORMAT -eq 1 ] && EXT="txt"
TEMPLATE="$RES/status.$EXT.$LANG"
fi
if [ -e $TEMPLATE ]; then
sed -e "s!{CSQ}!$CSQ!g; \
s!{CSQ_PER}!$CSQ_PER!g; \
s!{CSQ_RSSI}!$CSQ_RSSI!g; \
s!{CSQ_COL}!$CSQ_COL!g; \
s!{COPS}!$COPS!g; \
s!{COPS_NUM}!$COPS_NUM!g; \
s!{COPS_MCC}!$COPS_MCC!g; \
s!{COPS_MNC}!$COPS_MNC!g; \
s!{LAC}!$LAC!g; \
s!{LAC_NUM}!$LAC_NUM!g; \
s!{CID}!$CID!g; \
s!{CID_NUM}!$CID_NUM!g; \
s!{TAC}!$TAC!g; \
s!{TAC_NUM}!$TAC_NUM!g; \
s!{BTSINFO}!$BTSINFO!g; \
s!{DOWN}!$DOWN!g; \
s!{UP}!$UP!g; \
s!{QOS_SHOW}!$QOS_SHOW!g; \
s!{SMS_SHOW}!$SMS_SHOW!g; \
s!{USSD_SHOW}!$USSD_SHOW!g; \
s!{LIMIT_SHOW}!$LIMIT_SHOW!g; \
s!{STATUS}!$STATUS!g; \
s!{CONN_TIME}!$CONN_TIME!g; \
s!{CONN_TIME_SEC}!$CT!g; \
s!{RX}!$RX!g; \
s!{TX}!$TX!g; \
s!{STATUS_TRE}!$STATUS_TRE!g; \
s!{STATUS_SHOW}!$STATUS_SHOW!g; \
s!{STATUS_SHOW_BUTTON}!$STATUS_SHOW_BUTTON!g; \
s!{DEVICE}!$DEVICE!g; \
s!{ECIO}!$ECIO!g; \
s!{RSCP}!$RSCP!g; \
s!{RSRP}!$RSRP!g; \
s!{RSRQ}!$RSRQ!g; \
s!{SINR}!$SINR!g; \
s!{MODE}!$MODE!g" $TEMPLATE
else
echo "Template $TEMPLATE missing!"
fi
exit 0
@@ -1,39 +0,0 @@
22234;BT Italia SpA
22202;Elsacom
22299;H3G
22233;H3G
22277;IPSE 2000
22235;Lycamobile Srl
22207;Noverca Italia Srl
22230;RFI Rete Ferroviaria Italiana SpA
22243;Telecom Italia Mobile SpA
22201;TIM
22248;Telecom Italia Mobile SpA
22210;Vodafone
22206;Vodafone
22244;WIND
22288;WIND
26001;Plus
26002;T-Mobile;T-Mobile.pl
26003;Orange;PTK Centertel;Orange PL
26006;Play;Play Fakt Mobile
26016;Mobyland LTE;Cyfrowy Polsat
26017;Aero2
26034;NetWorks
24801;Telia
24802;Elisa
24803;Tele2
51001;Indosat Ooredoo
51003;StarOne
51007;TelkomFlexi
51008;AXIS
51009;Smartfren
51010;Telkomsel
51011;XL 4G
51020;TELKOMMobile
51021;IM3
51027;Ceria
51028;Fren/Hepi
51088;BOLT! Super 4G
51089;3
51099;Esia
@@ -1,8 +0,0 @@
NOTDETECTED="Not detected any device"
NODEVICE="No device"
PINERROR="PIN code error"
CONNECTED="Connected"
CONNECT="Connect"
DISCONNECTED="Disconnected"
DISCONNECT="Disconnect"
NOINFO="No information"
@@ -1,8 +0,0 @@
NOTDETECTED="Ei tuvastatud ühtegi seadet"
NODEVICE="Seade puudub"
PINERROR="PIN-koodi viga"
CONNECTED="Ühendatud"
CONNECT="Ühenda"
DISCONNECTED="Lahti ühendatud"
DISCONNECT="Ühenda lahti"
NOINFO="Pole informatsiooni"
@@ -1,8 +0,0 @@
NOTDETECTED="Nessun dispositivo trovato"
NODEVICE="Nessun dispositivo"
PINERROR="Errore codice PIN"
CONNECTED="Connesso"
CONNECT="Connetti"
DISCONNECTED="Disconnesso"
DISCONNECT="Disconnetti"
NOINFO="Nessuna Informazione"
@@ -1,8 +0,0 @@
NOTDETECTED="Nie wykryto żadnego urządzenia!"
NODEVICE="Brak urządzenia"
PINERROR="Błąd kodu PIN"
CONNECTED="Połączony"
CONNECT="Połącz"
DISCONNECTED="Rozłączony"
DISCONNECT="Rozłącz"
NOINFO="Brak informacji"
@@ -1,176 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT\^CURC=0^m"
waitfor 5 "OK","ERROR"
let $c="AT+CSQ^m"
let $r="+CSQ"
gosub readatcmd
let $c="ATE1; +CGMI^m"
gosub readatcmdnr
let $v=$s
if $toupper($mid($v,0,3)) = "HUA" goto huawei
if $toupper($mid($v,0,3)) = "NOK" goto vodafone
if $toupper($mid($v,0,3)) = "NOV" goto novatel
if $toupper($mid($v,0,3)) = "OPT" goto option
if $toupper($mid($v,0,3)) = "QUA" goto qualcomm
if $toupper($mid($v,0,3)) = "SIM" goto simcom
if $toupper($mid($v,0,3)) = "SIE" goto sierra
if $toupper($mid($v,0,3)) = "VOD" goto vodafone
if $toupper($mid($v,0,3)) = "ZTE" goto zte
goto generic
:simcom
let $c="AT+CNSMOD?^m"
let $r="+CNSMOD"
gosub readatcmd
goto next
:vodafone
let $c="AT%NWSTATE=1^m"
let $r="%NWSTATE"
gosub readatcmd
goto next
:novatel
let $c="AT$CNTI=0^m"
let $r="$CNTI"
gosub readatcmd
goto next
:sierra
let $c="AT*CNTI=0^m"
let $r="*CNTI"
gosub readatcmd
goto next
:option
let $c="AT_OCTI?^m"
let $r="_OCTI"
gosub readatcmd
let $c="AT_OWCTI?^m"
let $r="_OWCTI"
gosub readatcmd
goto next
:qualcomm
let $c="AT+COPS?^m"
let $r="+COPS"
gosub readatcmd
goto next1
:zte
let $c="AT+COPS?^m"
let $r="+COPS"
gosub readatcmd
let $c="AT+ZRSSI^m"
let $r="+ZRSSI"
gosub readatcmd
let $c="AT+ZPAS?^m"
let $r="+ZPAS"
gosub readatcmd
goto next1
:huawei
let $c="AT\^SYSINFOEX^m"
let $r="\^SYSINFOEX"
gosub readatcmd
let $c="AT\^CSNR?^m"
let $r="\^CSNR"
gosub readatcmd
let $c="AT\^LTERSRP?^m"
let $r="\^LTERSRP"
gosub readatcmd
let $c="AT\^HCSQ?^m"
let $r="\^HCSQ"
gosub readatcmd
:generic
let $c="AT\^SYSINFO^m"
let $r="\^SYSINFO"
gosub readatcmd
:next
let $c="AT+COPS=3,2;+COPS?^m"
let $r="+COPS"
gosub readatcmd
:next1
let $c="AT+CREG=2;+CREG?^m"
let $r="+CREG"
gosub readatcmd
let $c="AT+CGREG=2;+CGREG?^m"
let $r="+CGREG"
gosub readatcmd
let $c="AT+CEREG=2;+CEREG?^m"
let $r="+CEREG"
gosub readatcmd
let $c="AT+CGEQNEG=1^m"
let $r="+CGEQNEG"
gosub readatcmd
let $c="ATE1; +CGMM^m"
gosub readatcmdnr
print "\nDEVICE:",$v," ",$s,"\n"
exit 0
:readatcmd
let i=15
send $c
:loop
get 0.1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
print $s
return
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
if $mid($s,1,2) = "CO" return
:loop2
if i = 0 return
let i=i-1
goto loop
:readatcmdnr
let i=15
send $c
:loop3
get 0.1 "^m" $s
if len($s) < 2 goto loop5
if $mid($s,1,2) = "ER" goto loop4
if $mid($s,1,2) = "OK" goto loop5
if $mid($s,1,2) = "AT" goto loop5
if $mid($s,1,2) = "TE" goto loop5
if $mid($s,1,1) = "+" goto loop5
if $mid($s,1,1) = "\^" goto loop5
let l=len($s)
let $s=$mid($s,1,l)
return
:loop4
let $s=""
return
:loop5
if i = 0 return
let i=i-1
goto loop3
@@ -1,60 +0,0 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
[ -e /usr/bin/wget ] || exit 0
getvaluen() {
echo $(sed 's!.*"'$2'":\([^,]*\).*!\1!g' /tmp/$1)
}
getvalue() {
echo $(sed 's!.*"'$2'":"\([^"]*\).*!\1!g' /tmp/$1)
}
rand=`awk 'BEGIN{srand();print int(rand()*(99000-1000))+1000 }'`
files="getWanInfo getImgInfo getSysteminfo"
for f in $files; do
wget -t 3 -O /tmp/$f "http://$IP/goform/$f?rand=$rand" >/dev/null 2>&1
done
MODEN=$(getvaluen getWanInfo "network_type")
case $MODEN in
1) MODE="GPRS";;
2) MODE="EDGE";;
3) MODE="HSDPA";;
4) MODE="HSUPA";;
5) MODE="UMTS";;
9) MODE="GSM";;
11) MODE="LTE";;
12) MODE="HSPA+";;
13) MODE="DC HSPA+";;
*) MODE="-";;
esac
echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
OPER=$(getvalue getWanInfo "network_name")
echo "+COPS: 0,0,\"$OPER\",x"
SIGNAL=$(getvaluen getImgInfo "signal")
case $SIGNAL in
1) CSQ="6";;
2) CSQ="12";;
3) CSQ="18";;
4) CSQ="24";;
5) CSQ="31";;
*) CSQ="0";;
esac
echo "+CSQ: $CSQ,99"
MODEL=$(getvalue getSysteminfo "dev_name")
echo "DEVICE:Alcatel $MODEL"
if [ "x$2" != "xdebug" ]; then
for f in $files; do
rm /tmp/$f
done
fi
exit 0
@@ -1,172 +0,0 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
[ -e /usr/bin/wget ] || exit 0
getvaluen() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9]//g')
}
getvaluens() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9-]//g')
}
getvalue() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1)
}
cookie=$(mktemp)
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/token" >/dev/null 2>&1
token=$(getvaluen webserver-token token)
if [ -z "$token" ]; then
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/SesTokInfo" >/dev/null 2>&1
sesinfo=$(getvalue webserver-token SesInfo)
fi
if [ -z "$sesinfo" ]; then
/usr/bin/wget -q -O /dev/null --keep-session-cookies --save-cookies $cookie "http://$IP/html/home.html"
fi
/usr/bin/wget -t 25 -O /tmp/user-state-login "http://$IP/api/user/state-login"
T1=$(getvalue user-state-login State)
if [ "x$T1" != "x0" ]; then
USER="admin"
PASS="admin"
PASS=$(echo -n "$PASS" | base64)
DATA="<request><Username>$USER</Username><Password>$PASS</Password></request>"
/usr/bin/wget -t 25 -O /dev/null "http://$IP/api/user/login" --post-data $DATA --header "__RequestVerificationToken: $token"
fi
files="device/signal monitoring/status net/current-plmn net/signal-para device/information device/basic_information"
for f in $files; do
nf=$(echo $f | sed 's!/!-!g')
if [ -n "$token" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "__RequestVerificationToken: $token" >/dev/null 2>&1
elif [ -n "$sesinfo" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "Cookie: $sesinfo" >/dev/null 2>&1
else
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --load-cookies=$cookie >/dev/null 2>&1
fi
done
rssi=$(getvaluen device-signal rssi)
if [ -n "$rssi" ]; then
CSQ=$(((-1*rssi + 113)/2))
echo "+CSQ: $CSQ,99"
else
per=$(getvaluen monitoring-status SignalStrength)
if [ -n "$per" ]; then
CSQ=$((($per*31)/100))
echo "+CSQ: $CSQ,99"
fi
fi
MODEN=$(getvaluen monitoring-status CurrentNetworkType)
case $MODEN in
1) MODE="GSM";;
2) MODE="GPRS";;
3) MODE="EDGE";;
4) MODE="WCDMA";;
5) MODE="HSDPA";;
6) MODE="HSUPA";;
7) MODE="HSPA";;
8) MODE="TDSCDMA";;
9) MODE="HSPA+";;
10) MODE="EVDO rev. 0";;
11) MODE="EVDO rev. A";;
12) MODE="EVDO rev. B";;
13) MODE="1xRTT";;
14) MODE="UMB";;
15) MODE="1xEVDV";;
16) MODE="3xRTT";;
17) MODE="HSPA+64QAM";;
18) MODE="HSPA+MIMO";;
19) MODE="LTE";;
21) MODE="IS95A";;
22) MODE="IS95B";;
23) MODE="CDMA1x";;
24) MODE="EVDO rev. 0";;
25) MODE="EVDO rev. A";;
26) MODE="EVDO rev. B";;
27) MODE="Hybrydowa CDMA1x";;
28) MODE="Hybrydowa EVDO rev. 0";;
29) MODE="Hybrydowa EVDO rev. A";;
30) MODE="Hybrydowa EVDO rev. B";;
31) MODE="EHRPD rev. 0";;
32) MODE="EHRPD rev. A";;
33) MODE="EHRPD rev. B";;
34) MODE="Hybrydowa EHRPD rev. 0";;
35) MODE="Hybrydowa EHRPD rev. A";;
36) MODE="Hybrydowa EHRPD rev. B";;
41) MODE="WCDMA (UMTS)";;
42) MODE="HSDPA";;
43) MODE="HSUPA";;
44) MODE="HSPA";;
45) MODE="HSPA+";;
46) MODE="DC-HSPA+";;
61) MODE="TD SCDMA";;
62) MODE="TD HSDPA";;
63) MODE="TD HSUPA";;
64) MODE="TD HSPA";;
65) MODE="TD HSPA+";;
81) MODE="802.16E";;
101) MODE="LTE";;
*) MODE="-";;
esac
echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
numeric=$(getvaluen net-current-plmn Numeric)
echo "+COPS: 0,2,\"$numeric\",x"
lac=$(getvalue net-signal-para Lac)
if [ -z "$lac" ]; then
/usr/bin/wget -t 3 -O /tmp/add-param "http://$IP/config/deviceinformation/add_param.xml" > /dev/null 2>&1
lac=$(getvalue add-param lac)
rm /tmp/add-param
fi
cid=$(getvalue net-signal-para CellID)
if [ -z "$cid" ]; then
cell_id=$(getvalue device-signal cell_id)
cid=""
[ -n "$cell_id" ] && cid=$(printf %0X $cell_id)
fi
echo "+CREG: 2,1,\"$lac\",\"$cid\""
if [ "x$MODE" = "xLTE" ]; then
rsrp=$(getvaluens device-signal rsrp)
sinr=$(getvaluens device-signal sinr)
rsrq=$(getvaluens device-signal rsrq)
rsrp=$(awk 'BEGIN {print '$rsrp' + 141}')
sinr=$(awk 'BEGIN {print ('$sinr'+20.2)*5}')
rsrq=$(awk 'BEGIN {print ('$rsrq'+20)*2}')
echo "^HCSQ: \"$MODE\",$rssi,$rsrp,$sinr,$rsrq"
else
rscp=$(getvaluens device-signal rscp)
[ -z "$rscp" ] && rscp=$(getvaluens net-signal-para Rscp)
ecio=$(getvaluens net-signal-para ecio)
[ -z "$ecio" ] && ecio=$(getvaluens net-signal-para Ecio)
echo "^CSNR: $rscp,$ecio"
fi
device=$(getvalue device-information DeviceName)
if [ -n "$device" ]; then
class=$(getvalue device-information Classify)
echo "DEVICE:Huawei $device $class"
else
device=$(getvalue device-basic_information devicename)
class=$(getvalue device-basic_information classify)
[ -n "$device" ] && echo "DEVICE:Huawei $device $class"
fi
DATA="<request><Logout>1</Logout></request>"
/usr/bin/wget -t 25 -O /tmp/ccc "http://$IP/api/user/logout" --post-data $DATA --header "__RequestVerificationToken: $token"
if [ "x$2" != "xdebug" ]; then
for f in $files webserver/token; do
nf=$(echo $f | sed 's!/!-!g')
rm /tmp/$nf
done
fi
rm $cookie
exit 0
@@ -1,159 +0,0 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
[ -e /usr/bin/wget ] || exit 0
getvaluen() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9]//g')
}
getvaluens() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9-]//g')
}
getvalue() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1)
}
cookie=$(mktemp)
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/token" >/dev/null 2>&1
token=$(getvaluen webserver-token token)
if [ -z "$token" ]; then
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/SesTokInfo" >/dev/null 2>&1
sesinfo=$(getvalue webserver-token SesInfo)
fi
if [ -z "$sesinfo" ]; then
/usr/bin/wget -q -O /dev/null --keep-session-cookies --save-cookies $cookie "http://$IP/html/home.html"
fi
files="device/signal monitoring/status net/current-plmn net/signal-para device/information device/basic_information"
for f in $files; do
nf=$(echo $f | sed 's!/!-!g')
if [ -n "$token" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "__RequestVerificationToken: $token" >/dev/null 2>&1
elif [ -n "$sesinfo" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "Cookie: $sesinfo" >/dev/null 2>&1
else
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --load-cookies=$cookie >/dev/null 2>&1
fi
done
rssi=$(getvaluen device-signal rssi)
if [ -n "$rssi" ]; then
CSQ=$(((-1*rssi + 113)/2))
echo "+CSQ: $CSQ,99"
else
per=$(getvaluen monitoring-status SignalStrength)
if [ -n "$per" ]; then
CSQ=$((($per*31)/100))
echo "+CSQ: $CSQ,99"
fi
fi
MODEN=$(getvaluen monitoring-status CurrentNetworkType)
case $MODEN in
1) MODE="GSM";;
2) MODE="GPRS";;
3) MODE="EDGE";;
4) MODE="WCDMA";;
5) MODE="HSDPA";;
6) MODE="HSUPA";;
7) MODE="HSPA";;
8) MODE="TDSCDMA";;
9) MODE="HSPA+";;
10) MODE="EVDO rev. 0";;
11) MODE="EVDO rev. A";;
12) MODE="EVDO rev. B";;
13) MODE="1xRTT";;
14) MODE="UMB";;
15) MODE="1xEVDV";;
16) MODE="3xRTT";;
17) MODE="HSPA+64QAM";;
18) MODE="HSPA+MIMO";;
19) MODE="LTE";;
21) MODE="IS95A";;
22) MODE="IS95B";;
23) MODE="CDMA1x";;
24) MODE="EVDO rev. 0";;
25) MODE="EVDO rev. A";;
26) MODE="EVDO rev. B";;
27) MODE="Hybrydowa CDMA1x";;
28) MODE="Hybrydowa EVDO rev. 0";;
29) MODE="Hybrydowa EVDO rev. A";;
30) MODE="Hybrydowa EVDO rev. B";;
31) MODE="EHRPD rev. 0";;
32) MODE="EHRPD rev. A";;
33) MODE="EHRPD rev. B";;
34) MODE="Hybrydowa EHRPD rev. 0";;
35) MODE="Hybrydowa EHRPD rev. A";;
36) MODE="Hybrydowa EHRPD rev. B";;
41) MODE="WCDMA (UMTS)";;
42) MODE="HSDPA";;
43) MODE="HSUPA";;
44) MODE="HSPA";;
45) MODE="HSPA+";;
46) MODE="DC-HSPA+";;
61) MODE="TD SCDMA";;
62) MODE="TD HSDPA";;
63) MODE="TD HSUPA";;
64) MODE="TD HSPA";;
65) MODE="TD HSPA+";;
81) MODE="802.16E";;
101) MODE="LTE";;
*) MODE="-";;
esac
echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
numeric=$(getvaluen net-current-plmn Numeric)
echo "+COPS: 0,2,\"$numeric\",x"
lac=$(getvalue net-signal-para Lac)
if [ -z "$lac" ]; then
/usr/bin/wget -t 3 -O /tmp/add-param "http://$IP/config/deviceinformation/add_param.xml" > /dev/null 2>&1
lac=$(getvalue add-param lac)
rm /tmp/add-param
fi
cid=$(getvalue net-signal-para CellID)
if [ -z "$cid" ]; then
cell_id=$(getvalue device-signal cell_id)
cid=""
[ -n "$cell_id" ] && cid=$(printf %0X $cell_id)
fi
echo "+CREG: 2,1,\"$lac\",\"$cid\""
if [ "x$MODE" = "xLTE" ]; then
rsrp=$(getvaluens device-signal rsrp)
sinr=$(getvaluens device-signal sinr)
rsrq=$(getvaluens device-signal rsrq)
rsrp=$(awk 'BEGIN {print '$rsrp' + 141}')
sinr=$(awk 'BEGIN {print ('$sinr'+20.2)*5}')
rsrq=$(awk 'BEGIN {print ('$rsrq'+20)*2}')
echo "^HCSQ: \"$MODE\",$rssi,$rsrp,$sinr,$rsrq"
else
rscp=$(getvaluens device-signal rscp)
[ -z "$rscp" ] && rscp=$(getvaluens net-signal-para Rscp)
ecio=$(getvaluens net-signal-para ecio)
[ -z "$ecio" ] && ecio=$(getvaluens net-signal-para Ecio)
echo "^CSNR: $rscp,$ecio"
fi
device=$(getvalue device-information DeviceName)
if [ -n "$device" ]; then
class=$(getvalue device-information Classify)
echo "DEVICE:Huawei $device $class"
else
device=$(getvalue device-basic_information devicename)
class=$(getvalue device-basic_information classify)
[ -n "$device" ] && echo "DEVICE:Huawei $device $class"
fi
if [ "x$2" != "xdebug" ]; then
for f in $files webserver/token; do
nf=$(echo $f | sed 's!/!-!g')
rm /tmp/$nf
done
fi
rm $cookie
exit 0
@@ -1,14 +0,0 @@
let $d = $env("DEVICE")
if $d = "" goto timeout
open com $d
set com 115200n81
set senddelay 0.05
waitquiet 2 0.5
send "AT^m"
waitfor 2 "OK" "+CME ERROR"
if % = -1 goto timeout
exit 0
:timeout
exit 1
@@ -1,50 +0,0 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
T=$(mktemp)
wget -q -O $T "http://$IP/goform/goform_get_cmd_process?multi_data=1&cmd=manufacturer_name,model_name,network_provider,network_type,lte_rsrp,lte_rsrq,lte_rssi,lte_snr,cell_id,lac_code,hmcc,hmnc,rmcc,rmnc,rssi,rscp,ecio"
. /usr/share/libubox/jshn.sh
json_load "$(cat $T)"
json_get_vars manufacturer_name model_name network_provider network_type lte_rsrp lte_rsrq lte_rssi lte_snr cell_id lac_code hmcc hmnc rmcc rmnc rssi rscp ecio
if [ -n "$lte_rssi" ]; then
rssi=$lte_rssi
fi
if [ -n "$rssi" ]; then
CSQ=$(((rssi+113)/2))
else
CSQ=0
fi
echo "+CSQ: $CSQ,99"
echo "DEVICE:$manufacturer_name $model_name"
echo "^SYSINFOEX:x,x,x,x,,x,\"$network_type\",x,\"$network_type\""
if [ -n "$hmcc" ]; then
mcc=$(printf "%03d" $hmcc)
else
[ -n "$rmcc" ] && mcc=$(printf "%03d" $rmcc)
fi
if [ -n "$hmnc" ]; then
mnc=$(printf "%02d" $hmnc)
else
[ -n "$rmnc" ] && mnc=$(printf "%02d" $rmnc)
fi
echo "+COPS: 0,2,\"$mcc$mnc\",x"
if [ "x$network_type" = "xLTE" ]; then
echo "^LTERSRP: $lte_rsrp,$lte_rsrq"
else
echo "^CSNR: $rscp,$ecio"
fi
echo "+CREG: 2,1,\"$lac_code\",\"$cell_id\""
rm $T
exit 0
@@ -1,31 +0,0 @@
{
"error": "",
"csq": "{CSQ}",
"signal": "{CSQ_PER}",
"rssi": "{CSQ_RSSI}",
"mode": "{MODE}",
"device": "{DEVICE}",
"operator_name": "{COPS}",
"operator": "{COPS_NUM}",
"operator_mcc": "{COPS_MCC}",
"operator_mnc": "{COPS_MNC}",
"lac_hex": "{LAC}",
"lac_dec": "{LAC_NUM}",
"cid_hex": "{CID}",
"cid_dec": "{CID_NUM}",
"tac_hex": "{TAC}",
"tac_dec": "{TAC_NUM}",
"bts_info": "{BTSINFO}",
"bts_qos_down": "{DOWN}",
"bts_qos_up": "{UP}",
"status": "{STATUS}",
"conn_time": "{CONN_TIME}",
"conn_time_sec": "{CONN_TIME_SEC}",
"iface_rx": "{RX}",
"iface_tx": "{TX}",
"rscp": "{RSCP}",
"ecio": "{ECIO}",
"rsrp": "{RSRP}",
"sinr": "{SINR}",
"rsrq": "{RSRQ}"
}
@@ -1,18 +0,0 @@
Status: {STATUS}
Connection time: {CONN_TIME}
Received / Transmitted data: {RX} / {TX}
Operator: {COPS}
Operating mode: {MODE}
Signal strength: {CSQ_PER}%
Device: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
@@ -1,18 +0,0 @@
Staatus: {STATUS}
Ühendusaeg: {CONN_TIME}
Vastuvõetud/saadetud andmed: {RX} / {TX}
Operaator: {COPS}
Töörežiim: {MODE}
Signaali tugevus: {CSQ_PER}%
Seade: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
@@ -1,18 +0,0 @@
Stato: {STATUS}
Tempo di connessione: {CONN_TIME}
Dati ricevuti / Trasmessi: {RX} / {TX}
Operatore: {COPS}
Tipo di connessione: {MODE}
Forza segnale: {CSQ_PER}%
Dispositivo: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
@@ -1,18 +0,0 @@
Status: {STATUS}
Czas polaczenia: {CONN_TIME}
Przeslano danych: {RX} / {TX}
Operator: {COPS}
Tryb pracy: {MODE}
Sila sygnalu: {CSQ_PER}%
Urzadzenie: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
-6
View File
@@ -1,6 +0,0 @@
config 3ginfo
option device ''
option http_port '81'
option network 'wan'
option pincode ''
-138
View File
@@ -1,138 +0,0 @@
#!/bin/sh
#
# (c) 2024-2025 Cezary Jackiewicz <cezary@eko.one.pl>
#
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
FORMAT=1
[ "x$1" = "xjson" ] && FORMAT=2
ECM=""
RES="/usr/share/modemdata"
format_conn_time() {
CT=$1
D=$(expr $CT / 60 / 60 / 24)
H=$(expr $CT / 60 / 60 % 24)
M=$(expr $CT / 60 % 60)
S=$(expr $CT % 60)
printf "%dd, %02d:%02d:%02d" $D $H $M $S
}
SEPARATOR=""
parse_section() {
[ -n "$SEPARATOR" ] && echo "$SEPARATOR"
local section="$1"
config_get device "$section" device ""
config_get network "$section" network ""
config_get force_plmn "$section" force_plmn "0"
if echo "x$device" | grep -q "192.168."; then
ECM="$RES/addon/ecm/huawei.sh $device"
else
ECM=""
if [ ! -e /var/state/3ginfo-detected ]; then
[ -z "$device" ] && device=$(/usr/share/3ginfo/detectdevice.sh)
[ -z "$network" ] && network=$(/usr/share/3ginfo/detectsection.sh "$section")
fi
config_get pincode "$section" pincode ""
if [ -n "$pincode" ] && [ ! -e /var/state/3ginfo-pincode ]; then
[ -n "$device" ] && sms_tool -d "$device" at "at+cpin=\"$pincode\""
fi
fi
if [ "$FORMAT" = "1" ]; then
SEPARATOR="---"
json_init
if [ -n "$ECM" ]; then
json_load "$($ECM product)"
else
json_load "$($RES/product.sh "$device")"
fi
json_get_vars vendor product revision imei iccid imsi
echo "Device: ${vendor} ${product}"
echo "Revision: ${revision}"
echo "IMEI: ${imei}"
echo "ICCID: ${iccid}"
echo "IMSI: ${imsi}"
echo ""
json_init
json_load "$($RES/network.sh "$network")"
json_get_vars conn_time_sec rx tx
echo "Connected time: "$(format_conn_time ${conn_time_sec})
echo "TX: ${tx}"
echo "RX: ${rx}"
echo ""
json_init
if [ -n "$ECM" ]; then
json_load "$($ECM params)"
else
json_load "$($RES/params.sh "$device" "$force_plmn")"
fi
json_get_vars signal operator_name operator_mcc operator_mnc country mode registration lac_dec lac_hex cid_dec cid_hex
echo "Signal: ${signal} %"
echo "Mode: ${mode}"
echo "Operator: ${operator_name} (${operator_mcc} ${operator_mnc})"
[ -n "$country" ] && echo "Country: ${country}"
case $registration in
0) REG="not registered";;
1) REG="registered, home network";;
2) REG="not registered, searching";;
3) REG="registration denied";;
5) REG="registered, roaming";;
6) REG="registered for SMS only, home network";;
7) REG="registered for SMS only, roaming";;
*) REG="$registration";;
esac
echo "Registration: ${REG}"
echo ""
T="21;CellID: ${cid_dec} (${cid_hex})"
T="${T}\n22;LAC: ${lac_dec} (${lac_hex})"
if json_is_a addon array; then
json_get_keys addon addon
json_select addon
for i in $addon; do
json_select "$i"
json_get_vars idx key value
json_select ..
if [ "$idx" = "10" ]; then
T="${T}\n${idx};${key}: ${value/&deg;/°}"
else
T="${T}\n${idx};${key}: ${value}"
fi
done
fi
echo -e "$T" | sort | awk -F[\;] '{print $2}'
else
SEPARATOR=","
echo "["
if [ -n "$ECM" ]; then
$ECM product
echo ","
$RES/network.sh "$network"
echo ","
$ECM params
else
$RES/product.sh "$device"
echo ","
$RES/network.sh "$network"
echo ","
$RES/params.sh "$device" "$force_plmn"
fi
echo "]"
fi
}
config_load 3ginfo
[ "$FORMAT" = "2" ] && echo '{"res":['
config_foreach parse_section 3ginfo
[ "$FORMAT" = "2" ] && echo ']}'
touch /var/state/3ginfo-detected
touch /var/state/3ginfo-pincode
exit 0
@@ -1,13 +0,0 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.01
waitquiet 0.01 0.01
send "AT+CPIN?^m"
waitfor 2 "OK" "+CME ERROR"
if % = -1 goto timeout
exit 0
:timeout
exit 1
@@ -1,20 +0,0 @@
#!/bin/sh
#
# (c) 2023-2024 Cezary Jackiewicz <cezary@eko.one.pl>
#
# find any device
DEVICES=$(find /dev -name "ttyUSB*" -o -name "ttyACM*" -o -name "wwan*at*" | sort -r)
for DEVICE in $DEVICES; do
gcom -d $DEVICE -s /usr/share/3ginfo/check.gcom >/dev/null 2>&1
if [ $? = 0 ]; then
uci set 3ginfo.@3ginfo[0].device="$DEVICE"
uci commit 3ginfo
echo "$DEVICE"
exit 0
fi
done
echo ""
exit 0
@@ -1,60 +0,0 @@
#!/bin/sh
#
# (c) 2024 Cezary Jackiewicz <cezary@eko.one.pl>
#
getdevicepath() {
devname="$(basename $1)"
case "$devname" in
'wwan'*'at'*)
devpath="$(readlink -f /sys/class/wwan/$devname/device)"
echo ${devpath%/*/*/*}
;;
'ttyACM'*)
devpath="$(readlink -f /sys/class/tty/$devname/device)"
echo ${devpath%/*}
;;
'tty'*)
devpath="$(readlink -f /sys/class/tty/$devname/device)"
echo ${devpath%/*/*}
;;
*)
devpath="$(readlink -f /sys/class/usbmisc/$devname/device)"
echo ${devpath%/*}
;;
esac
}
CONFIGSEC=$1
if [ -n "$CONFIGSEC" ]; then
SEC=$(uci -q get 3ginfo.${CONFIGSEC}.network)
if [ -n "$SEC" ]; then
echo "$SEC"
exit 0
fi
fi
DEVICE=$(uci -q get 3ginfo.${CONFIGSEC}.device)
if [ -z "$DEVICE" ]; then
echo ""
exit 0
fi
DEVPATH=$(getdevicepath "$DEVICE")
DEVICES=$(uci show network | awk '/network\..*\.device/')
for T in $DEVICES; do
T1=$(echo "$T" | cut -f2 -d= | xargs)
if [ -e "$T1" ]; then
if [ "$DEVPATH" = "$(getdevicepath "$T1")" ]; then
T2=$(echo "$T" | cut -f2 -d.)
uci set 3ginfo.${CONFIGSEC}.network="$T2"
uci commit 3ginfo
echo "$T2"
exit 0
fi
fi
done
echo ""
exit 0
+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=3proxy PKG_NAME:=3proxy
PKG_VERSION:=0.9.5 PKG_VERSION:=0.9.5
PKG_RELEASE:=2 PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/3proxy/3proxy/tar.gz/$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/3proxy/3proxy/tar.gz/$(PKG_VERSION)?
+88
View File
@@ -0,0 +1,88 @@
#
# Copyright (C) 2026 jjm2473@gmail.com
#
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
AGENTFLOW_ARCH_x86_64:=amd64
AGENTFLOW_ARCH_aarch64:=arm64
AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH))
AGENTFLOW_HASH_x86_64:=454857022d555b23979bd7b9116ef926ce7117e9e6034116f3223bb72cae07db
AGENTFLOW_HASH_aarch64:=34dfe07fd2a1bcb7de8eadb41dd0a67b46d5db78f4ca14d1835fe94608c0579a
PKG_NAME:=agentflow
PKG_VERSION:=0.3.1
PKG_RELEASE:=9
AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH)
AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH))
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
STRIP:=true
RSTRIP:=:
include $(INCLUDE_DIR)/package.mk
define Download/agentflow
URL:=https://fw.koolcenter.com/binary/geili/agentflow/build/
URL_FILE:=$(AGENTFLOW_URL_FILE)
FILE:=$(AGENTFLOW_DOWNLOAD)
HASH:=skip
endef
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=AgentFlow
DEPENDS:=@(x86_64||aarch64) +git +git-http +mise
URL:=https://agentflow.geili.ai/
endef
define Package/$(PKG_NAME)/description
AgentFlow provides a Web UI for orchestrating coding agents and workflows.
endef
define Package/$(PKG_NAME)/conffiles
/etc/config/agentflow
endef
define Package/$(PKG_NAME)/prerm
#!/bin/sh
if [ "$${IPKG_INSTROOT}" = "" ]; then
if [ "$$(readlink /usr/share/linkeasefull/desktop-apps.d/30-agentflow.json 2>/dev/null)" = "/usr/share/agentflow/agentflow-plugin.json" ]; then
rm -f /usr/share/linkeasefull/desktop-apps.d/30-agentflow.json
fi
fi
exit 0
endef
define Build/Prepare
$(INSTALL_DIR) $(PKG_BUILD_DIR)
$(CP) $(DL_DIR)/$(AGENTFLOW_DOWNLOAD) $(PKG_BUILD_DIR)/agentflow
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/uci-defaults $(1)/etc/config $(1)/usr/share/agentflow/www $(1)/usr/share/linkeasefull/desktop-apps.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/agentflow $(1)/usr/sbin/agentflow
$(INSTALL_BIN) ./files/agentflow.init $(1)/etc/init.d/agentflow
$(INSTALL_BIN) ./files/agentflow.uci-default $(1)/etc/uci-defaults/09-agentflow
$(INSTALL_CONF) ./files/agentflow.config $(1)/etc/config/agentflow
$(INSTALL_DATA) ./files/agentflow-plugin.json $(1)/usr/share/agentflow/agentflow-plugin.json
$(INSTALL_DATA) ./files/www/logo.svg $(1)/usr/share/agentflow/www/logo.svg
ln -sf /usr/share/agentflow/agentflow-plugin.json $(1)/usr/share/linkeasefull/desktop-apps.d/30-agentflow.json
endef
$(eval $(call Download,agentflow))
$(eval $(call BuildPackage,$(PKG_NAME)))
+41
View File
@@ -0,0 +1,41 @@
{
"schemaVersion": 1,
"id": "agentflow",
"name": "AgentFlow",
"icon": "logo.svg",
"staticRoot": "/usr/share/agentflow/www",
"desktop": {
"mode": "module",
"entry": "desktop-entry.js",
"isolation": "shadow-dom"
},
"standalone": {
"entry": "index.html",
"basePath": "/apps/agentflow/",
"url": "/cgi-bin/luci/admin/services/agentflow/open",
"externalOpen": {
"enabled": true,
"label": "Open AgentFlow"
}
},
"auth": {
"mode": "passthrough"
},
"backend": {
"type": "http",
"scheme": "http",
"host": "127.0.0.1",
"portFromUci": "agentflow.@agentflow[0].port",
"defaultPort": 9000,
"upstreamBasePath": "/apps/agentflow/",
"pathMode": "preserve",
"proxyMode": "app-base"
},
"window": {
"width": 1180,
"height": 760,
"singleton": true
},
"capabilities": ["agent", "coding", "workflow"],
"categories": ["development", "ai"]
}
+5
View File
@@ -0,0 +1,5 @@
config agentflow
option enabled '0'
option data_dir ''
option host '0.0.0.0'
option port '9000'
+50
View File
@@ -0,0 +1,50 @@
#!/bin/sh /etc/rc.common
START=93
USE_PROCD=1
get_config() {
config_get_bool enabled "$1" enabled 0
config_get data_dir "$1" data_dir ""
config_get host "$1" host "0.0.0.0"
config_get port "$1" port "9000"
}
start_service() {
config_load agentflow
config_foreach get_config agentflow
[ "$enabled" = 1 ] || return 1
[ -x /usr/sbin/agentflow ] || {
logger -t agentflow "missing executable: /usr/sbin/agentflow"
return 1
}
[ -r /lib/functions/mise.sh ] || {
logger -t agentflow "missing mise environment helper"
return 1
}
. /lib/functions/mise.sh
if ! istore_runtime_env; then
logger -t agentflow "failed to initialize mise environment"
return 1
fi
mkdir -p "$data_dir" "$data_dir/data" || return 1
logger -t agentflow "starting AgentFlow on $host:$port"
procd_open_instance
procd_set_param command /usr/sbin/agentflow
procd_set_param env \
"AGENT_FLOW_DATA=$data_dir/data" \
"AGENT_FLOW_HOST=$host" \
"AGENT_FLOW_PORT=$port" \
"HOME=$HOME" \
"PATH=$PATH"
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "agentflow"
}
+21
View File
@@ -0,0 +1,21 @@
#!/bin/sh
[ ! -f "/usr/share/ucitrack/luci-app-agentflow.json" ] && {
cat > /usr/share/ucitrack/luci-app-agentflow.json << EEOF
{
"config": "agentflow",
"init": "agentflow"
}
EEOF
}
uci -q batch <<-EOF >/dev/null
delete ucitrack.@agentflow[-1]
add ucitrack agentflow
set ucitrack.@agentflow[-1].init=agentflow
commit ucitrack
EOF
/etc/init.d/agentflow enable
/etc/init.d/agentflow start
exit 0
+21
View File
@@ -0,0 +1,21 @@
<svg
width="150"
height="150"
viewBox="0 0 150 150"
xmlns="http://www.w3.org/2000/svg"
>
<rect width="150" height="150" rx="30" fill="#f5f1e8" />
<text
x="50%"
y="54%"
text-anchor="middle"
dominant-baseline="middle"
font-size="68"
font-weight="700"
font-family="Georgia, 'Times New Roman', serif"
letter-spacing="-4"
fill="#111111"
>
AF
</text>
</svg>

After

Width:  |  Height:  |  Size: 408 B

@@ -0,0 +1,48 @@
import json
import pathlib
import unittest
APP_DIR = pathlib.Path(__file__).resolve().parents[1]
class DesktopManifestContractTest(unittest.TestCase):
def setUp(self):
self.manifest = json.loads(
(APP_DIR / "files" / "agentflow-plugin.json").read_text()
)
def test_manifest_uses_agentflow_app_base_proxy(self):
self.assertEqual(self.manifest["id"], "agentflow")
self.assertEqual(self.manifest["staticRoot"], "/usr/share/agentflow/www")
self.assertEqual(self.manifest["standalone"]["entry"], "index.html")
self.assertEqual(self.manifest["standalone"]["basePath"], "/apps/agentflow/")
self.assertEqual(
self.manifest["standalone"]["url"],
"/cgi-bin/luci/admin/services/agentflow/open",
)
self.assertEqual(
self.manifest["standalone"]["externalOpen"],
{"enabled": True, "label": "Open AgentFlow"},
)
self.assertEqual(self.manifest["auth"]["mode"], "passthrough")
backend = self.manifest["backend"]
self.assertEqual(backend["upstreamBasePath"], "/apps/agentflow/")
self.assertEqual(backend["pathMode"], "preserve")
self.assertEqual(backend["proxyMode"], "app-base")
def test_desktop_entry_matches_manifest_contract(self):
desktop = self.manifest["desktop"]
self.assertEqual(desktop["mode"], "module")
self.assertEqual(desktop["entry"], "desktop-entry.js")
self.assertEqual(desktop["isolation"], "shadow-dom")
self.assertFalse(
(APP_DIR / "files" / "www" / "desktop-entry.js").exists(),
"desktop-entry.js must be served by AgentFlow backend, not the static iframe wrapper",
)
if __name__ == "__main__":
unittest.main()
+1 -1
View File
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=airconnect PKG_NAME:=airconnect
PKG_VERSION:=1.11.2 PKG_VERSION:=1.11.3
PKG_RELEASE=1 PKG_RELEASE=1
PKG_SOURCE:=AirConnect-$(PKG_VERSION).zip PKG_SOURCE:=AirConnect-$(PKG_VERSION).zip
+70
View File
@@ -0,0 +1,70 @@
#
# Copyright (C) 2018 Dengfeng Liu
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=apfree-wifidog
PKG_VERSION:=9.09.2938
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/liudf0716/$(PKG_NAME)/tar.gz/$(PKG_VERSION)?
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER:=Dengfeng Liu <liudf0716@gmail.com>
PKG_LICENSE:=GPL-3.0-or-later
PKG_LICENSE_FILES:=COPYING
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
define Package/apfree-wifidog
SUBMENU:=Captive Portals
SECTION:=net
CATEGORY:=Network
DEPENDS:=+zlib +libjson-c +libevent2 +libevent2-openssl +libuci \
+openssl-util +libnetfilter-queue +conntrack +libmosquitto \
+libnftnl +libmnl +libbpf +aw-bpf
TITLE:=Apfree's wireless captive portal solution
URL:=https://github.com/liudf0716/apfree_wifidog
endef
define Package/apfree-wifidog/description
The ApFree Wifidog project is a complete and embeddable captive portal
solution for wireless community groups or individuals who wish to open a free
Hotspot while still preventing abuse of their Internet connection.
It's enhanced wifidog
endef
define Package/apfree-wifidog/conffiles
/etc/config/wifidogx
endef
define Package/apfree-wifidog/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wifidogx $(1)/usr/bin/wifidogx
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctlx $(1)/usr/bin/wdctlx
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc
$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-redir.html $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-redir.html.front $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-redir.html.rear $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/authserver-offline.html $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/internet-offline.html $(1)/etc/
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/wifidogx.init $(1)/etc/init.d/wifidogx
$(INSTALL_DIR) $(1)/etc/config
$(CP) ./files/wifidogx.conf $(1)/etc/config/wifidogx
$(INSTALL_DIR) $(1)/etc/wifidogx
$(INSTALL_DIR) $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wifi-config $(1)/www/cgi-bin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wifi-diag $(1)/www/cgi-bin/
endef
$(eval $(call BuildPackage,apfree-wifidog))
+125
View File
@@ -0,0 +1,125 @@
![ApFreeWiFiDog](https://github.com/liudf0716/apfree_wifidog/blob/master/logo.png)
[![license][1]][2]
[![PRs Welcome][3]][4]
[![Issues Welcome][5]][6]
[![Release Version][7]][8]
[![OpenWrt][11]][12]
[![Join the QQ Group][15]][16]
[1]: https://img.shields.io/badge/license-GPLV3-brightgreen.svg?style=plastic
[2]: https://github.com/liudf0716/apfree_wifidog/blob/master/COPYING
[3]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=plastic
[4]: https://github.com/liudf0716/apfree_wifidog/pulls
[5]: https://img.shields.io/badge/Issues-welcome-brightgreen.svg?style=plastic
[6]: https://github.com/liudf0716/apfree_wifidog/issues/new
[7]: https://img.shields.io/badge/release-3.11.1716-red.svg?style=plastic
[8]: https://github.com/liudf0716/apfree_wifidog/releases
[11]: https://img.shields.io/badge/Platform-%20OpenWrt%7C%20LEDE%20-brightgreen.svg?style=plastic
[12]: https://github.com/KunTengRom/kunteng-lede-17.01.4
[13]: https://img.shields.io/badge/KunTeng-Inside-blue.svg?style=plastic
[14]: https://www.kunteng.org.cn
[15]: https://img.shields.io/badge/chat-qq%20group-brightgreen.svg
[16]: https://jq.qq.com/?_wv=1027&k=4ADDSev
## ApFree WiFiDog: A high performance captive portal solution for HTTP(s)
ApFree WiFiDog is a high performance captive portal solution for HTTP(s), which mainly used in ([LEDE](https://github.com/lede-project/source) & [OpenWrt](https://github.com/openwrt/openwrt)) platform.
**[中文介绍](https://github.com/liudf0716/apfree_wifidog/blob/master/README_ZH.md)**
## Enhancement of apfree-wifidog
In fact, the title should be why we choose apfree-wifidog, the reason was the following:
> Stable
apfree-wifidog was widely used in tens of thousands device, which were running in business scene. In order to improve its stable, we rewrite all iptables rule by api instead of fork call, which will easily cause deadlock in multithread-fork running environment. we also re-write the code and replace libhttpd (which is unmaintained for years) with libevent
> Performance
apfree-wifidog's http request-response is more quick, u can find statistic data in our test document
> HTTPs redirect
apfree-wifidog support https redirect, in current internet environment, captive portal solution without supporting https redirect will become unsuitable gradually
> More features
apfree-wifidog support mac temporary-pass, ip,domain,pan-domain,white-mac,black-mac rule and etc. all these rules can be applied without restarting wifidog
> MQTT support
by enable mqtt support, u can remotely deliver such as trusted ip, domain and pan-domain rules to apfree wifidog
> Compilable with wifidog protocol
u don't need to modify your wifidog authentication server to adapt apfree-wifidog; if u have pression on server-side, apfree wifidog's improved protocol can greatly relieve it, which disabled by default
## Getting started
before starting apfree-wifidog, we must know how to configure it. apfree-wifidog use OpenWrt standard uci config system, all your apfree-wifidog configure information stored in `/etc/confg/wifidogx`, which will be parsed by `/etc/init.d/wifidogx` to /tmp/wifidog.conf, apfree-wifidog's real configure file is `/tmp/wifidog.conf`
The default apfree-wifidog UCI configuration file like this:
```
config wifidog
option gateway_interface 'br-lan'
option auth_server_hostname 'wifidog.kunteng.org.cn'
option auth_server_port 443
option auth_server_path '/wifidog/'
option check_interval 60
option client_timeout 5
option apple_cna 1
option thread_number 5
option wired_passed 0
option enable 0
```
> auth_server_hostname was apfree-wifidog auth server, it can be domain or ip; wifidog.kunteng.org.cn is a free auth server we provided, it was also [open source](https://github.com/wificoin-project/wwas)
> apple_cna 1 apple captive detect deceive; 2 apple captive detect deceive to disallow portal page appear
> wired_passed means whether LAN access devices need to auth or not, value 1 means no need to auth
> enable means whether start apfree-wifidog when we executed `/etc/init.d/wifidogx start`, if u wanted to start apfree-wifidog, you must set enable to 1 before executing `/etc/init.d/wifidogx start`
### How to support https redirect
In order to support https redirect, apfree-wifidog need x509 pem cert and private key, u can generate yourself like this:
```
PX5G_BIN="/usr/sbin/px5g"
OPENSSL_BIN="/usr/bin/openssl"
APFREE_CERT="/etc/apfree.crt"
APFREE_KEY="/etc/apfree.key"
generate_keys() {
local days bits country state location commonname
# Prefer px5g for certificate generation (existence evaluated last)
local GENKEY_CMD=""
local UNIQUEID=$(dd if=/dev/urandom bs=1 count=4 | hexdump -e '1/1 "%02x"')
[ -x "$OPENSSL_BIN" ] && GENKEY_CMD="$OPENSSL_BIN req -x509 -sha256 -outform pem -nodes"
[ -x "$PX5G_BIN" ] && GENKEY_CMD="$PX5G_BIN selfsigned -pem"
[ -n "$GENKEY_CMD" ] && {
$GENKEY_CMD \
-days ${days:-730} -newkey rsa:${bits:-2048} -keyout "${APFREE_KEY}.new" -out "${APFREE_CERT}.new" \
-subj /C="${country:-CN}"/ST="${state:-localhost}"/L="${location:-Unknown}"/O="${commonname:-ApFreeWiFidog}$UNIQUEID"/CN="${commonname:-ApFreeWiFidog}"
sync
mv "${APFREE_KEY}.new" "${APFREE_KEY}"
mv "${APFREE_CERT}.new" "${APFREE_CERT}"
}
}
```
or when u start `/etc/init.d/wifidogx start`, it will generate it automatically
For more information, please refer to the upstream [project page](https://github.com/liudf0716/apfree_wifidog)
+39
View File
@@ -0,0 +1,39 @@
config wifidogx 'common'
option external_interface 'wan'
option check_interval '60'
option client_timeout '60'
option wired_passed '1'
option enabled '1'
option log_level '0'
option js_filter '1'
option apple_cna '1'
option auth_server_mode 'local'
option enable_anti_nat '0'
option ttl_values '64,128,255'
option ap_device_id 'AW85844955CC7D742A339'
option ap_mac_address '5C-C7-D7-42-A3-39'
option ap_longitude '116.395000'
option ap_latitude '039.911000'
option disable_portal_auth '0'
option enable_privileged_ops '0'
option privileged_ops_secret 'chawrt@2026'
option device_id 'AW58534605CC7D742A339'
option local_portal 'https://qq.com'
config gateway 'apfree'
option gateway_name 'br-lan'
option gateway_channel 'apfree'
option gateway_auth_enabled '1'
option gateway_id '5CC7D742A336'
option gateway_subnetv4 '192.168.8.1/24'
config auth 'local'
option auth_server_hostname '192.168.8.109'
option auth_server_port '8001'
option auth_server_path '/wifidog/'
config longconn 'openclaw'
option long_conn_mode 'ws'
option ws_server_hostname '192.168.8.109'
option ws_server_port '8001'
option ws_server_path '/ws/wifidogx'
+304
View File
@@ -0,0 +1,304 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2018 Dengfeng Liu
# After aw-bpf (START=98) so dns_ringbuf_portal is pinned for wildcard trust.
START=99
USE_PROCD=1
NAME=wifidogx
PROG="/usr/bin/${NAME}"
CONFIGFILE="/tmp/wifidogx.conf"
handle_gateway() {
local section="$1"
local gateway_name gateway_channel gateway_id
local gateway_subnetv4
local gateway_auth_enabled
config_get gateway_name "$section" gateway_name
config_get gateway_channel "$section" gateway_channel
config_get gateway_id "$section" gateway_id
config_get gateway_auth_enabled "$section" gateway_auth_enabled 1
if [ -z "$gateway_name" ] || [ -z "$gateway_channel" ] ; then
echo "gateway_name and gateway_channel are required for $section" >&2
return
fi
# Get gateway_id from gateway_name if not set
if [ -z "$gateway_id" ]; then
gateway_id=$(ifconfig "$gateway_name" | awk '/HWaddr/ {print toupper($5)}' | tr -d ':')
if [ -z "$gateway_id" ]; then
echo "Failed to get gateway_id for $gateway_name" >&2
return
fi
uci set wifidogx."$section".gateway_id="$gateway_id"
uci commit wifidogx
fi
# according to the gateway_name to get the subnetv4
local gateway_ipv4=$(ifconfig "$gateway_name" | awk '/inet addr:/ {print $2}' | cut -d: -f2)
local gateway_maskv4=$(ifconfig "$gateway_name" | awk '/Mask:/ {print $4}' | cut -d: -f2)
[ -z "$gateway_ipv4" ] && echo "Failed to get gateway_ipv4 for $gateway_name" >&2 && return
[ -z "$gateway_maskv4" ] && echo "Failed to get gateway_maskv4 for $gateway_name" >&2 && return
# change the gateway_ip4/gateway_maskv4 to CIDR format
local mask_bits=0
local mask_value=$(printf '%d' "0x$(echo $gateway_maskv4 | tr '.' ' ' | awk '{printf "%02x%02x%02x%02x",$1,$2,$3,$4}')")
while [ $mask_value -ne 0 ]; do
mask_bits=$((mask_bits + (mask_value & 1)))
mask_value=$((mask_value >> 1))
done
gateway_subnetv4="$gateway_ipv4/$mask_bits"
uci set wifidogx."$section".gateway_subnetv4="$gateway_subnetv4"
uci commit wifidogx
printf "GatewaySetting {\n\tGatewayAuthEnabled %s\n\tGatewayInterface %s\n\tGatewayChannel %s\n\tGatewayID %s\n\tGatewaySubnetV4 %s\n}\n" \
"${gateway_auth_enabled}" "${gateway_name}" "${gateway_channel}" "${gateway_id}" "${gateway_subnetv4}" >> "$CONFIGFILE"
}
add_white_list_entries() {
local list_type="$1"
local uci_field="$2"
local target_variable="$3"
list_type=$(uci get wifidogx.common."$list_type")
for group in $list_type; do
group_list=$(uci get wifidogx."$group"."$uci_field")
if [ -n "$group_list" ]; then
eval "$target_variable=\"\${$target_variable} \$group_list\""
fi
done
}
prepare_common_settings() {
printf "CheckInterval %s\nClientTimeout %s\nJsFilter %s\nWiredPassed %s\nBypassAppleCNA %s\n" \
"$check_interval" "$client_timeout" "$js_filter" "$wired_passed" "$apple_cna" >> "$CONFIGFILE"
printf "EnableAntiNat %s\n" "$enable_anti_nat" >> "$CONFIGFILE"
printf "TTLValues %s\n" "$ttl_values" >> "$CONFIGFILE"
printf "DisablePortalAuth %s\n" "$disable_portal_auth" >> "$CONFIGFILE"
printf "EnablePrivilegedOps %s\n" "$enable_privileged_ops" >> "$CONFIGFILE"
[ -n "$privileged_ops_secret" ] && printf "PrivilegedOpsSecret %s\n" "$privileged_ops_secret" >> "$CONFIGFILE"
[ -n "$anti_nat_permit_macs" ] && printf "AntiNatPermitMACs %s\n" "$anti_nat_permit_macs" >> "$CONFIGFILE"
process_trusted_list() {
local list="$1"
local config_name="$2"
if [ -n "$list" ]; then
# Clean up whitespace and remove duplicates
list=$(echo "$list" | sed -e 's/^[[:space:]]*//;s/[[:space:]]*$//;s/[[:space:]]\+/ /g' \
| tr ' ' '\n' | sort -u | tr '\n' ',' | sed 's/,$//')
printf "%s %s\n" "$config_name" "$list" >> "$CONFIGFILE"
fi
}
process_trusted_list "$trusted_domains" "TrustedDomains"
process_trusted_list "$trusted_macs" "TrustedMACList"
process_trusted_list "$trusted_wildcard_domains" "TrustedWildcardDomains"
}
prepare_device_info() {
# Check if any device info fields are set
if [ -n "$ap_device_id" ] || [ -n "$ap_mac_address" ] || [ -n "$ap_longitude" ] || [ -n "$ap_latitude" ] || [ -n "$location_id" ]; then
printf "DeviceInfo {\n" >> "$CONFIGFILE"
[ -n "$ap_device_id" ] && printf "\tApDeviceId %s\n" "$ap_device_id" >> "$CONFIGFILE"
[ -n "$ap_mac_address" ] && printf "\tApMacAddress %s\n" "$ap_mac_address" >> "$CONFIGFILE"
[ -n "$ap_longitude" ] && printf "\tApLongitude %s\n" "$ap_longitude" >> "$CONFIGFILE"
[ -n "$ap_latitude" ] && printf "\tApLatitude %s\n" "$ap_latitude" >> "$CONFIGFILE"
[ -n "$location_id" ] && printf "\tLocationId %s\n" "$location_id" >> "$CONFIGFILE"
printf "}\n" >> "$CONFIGFILE"
fi
}
prepare_auth_server_settings() {
# 获取选中的认证服务器配置
local selected_auth_server
selected_auth_server=$(uci get wifidogx.common.selected_auth_server 2>/dev/null)
# 如果是云认证或旁路模式,需要验证选中的认证服务器
if [ "$auth_server_mode" = "cloud" ] || [ "$auth_server_mode" = "bypass" ]; then
if [ -z "$selected_auth_server" ]; then
echo "Error: selected_auth_server is required for $auth_server_mode mode" >&2
return 1
fi
local auth_server_hostname auth_server_port auth_server_path
uci_validate_section "$NAME" "auth" "$selected_auth_server" \
'auth_server_hostname:string:192.168.1.1' \
'auth_server_port:port:80' \
'auth_server_path:string:/wifidog/'
export auth_server_hostname
export auth_server_port
export auth_server_path
fi
case "$auth_server_mode" in
cloud|bypass)
printf "AuthServerMode 0\n" >> "$CONFIGFILE"
printf "DeviceID %s\nAuthServer {\n\tHostname %s\n\tHTTPPort %s\n\tPath %s\n}\n" \
"$device_id" "$auth_server_hostname" "$auth_server_port" "$auth_server_path" >> "$CONFIGFILE"
;;
local)
printf "AuthServerMode 2\n" >> "$CONFIGFILE"
[ -n "$device_id" ] && printf "DeviceID %s\n" "$device_id" >> "$CONFIGFILE"
[ -n "$auth_server_offline_file" ] && printf "AuthServerOfflineFile %s\n" "$auth_server_offline_file" >> "$CONFIGFILE"
[ -n "$local_portal" ] && printf "LocalPortal %s\n" "$local_portal" >> "$CONFIGFILE"
;;
esac
[ -n "$internet_offline_file" ] && printf "InternetOfflineFile %s\n" "$internet_offline_file" >> "$CONFIGFILE"
}
prepare_longconn_settings() {
local long_conn_mode ws_server_hostname ws_server_port ws_server_path
local mqtt_server_hostname mqtt_server_port mqtt_username mqtt_password
local selected_long_conn
selected_long_conn=$(uci get wifidogx.common.selected_long_conn 2>/dev/null)
[ -z "$selected_long_conn" ] && return
if ! uci -q get wifidogx."$selected_long_conn" >/dev/null; then
echo "Long connection: selected section $selected_long_conn does not exist" >&2
return
fi
uci_validate_section "$NAME" "longconn" "$selected_long_conn" \
'long_conn_mode:or("ws","wss","mqtt","mqtts"):ws' \
'ws_server_hostname:string' \
'ws_server_port:port:443' \
'ws_server_path:string:/ws/wifidogx' \
'mqtt_server_hostname:string' \
'mqtt_server_port:port:1883' \
'mqtt_username:string' \
'mqtt_password:string'
case "$long_conn_mode" in
ws|wss)
if [ -z "$ws_server_hostname" ]; then
echo "Long connection: ws_server_hostname is required" >&2
return
fi
local ws_ssl
ws_ssl=$([ "$long_conn_mode" = "wss" ] && echo 1 || echo 0)
printf "WebSocket {\n\tWSServer %s\n\tWSServerPort %s\n\tWSServerPath %s\n\tWSServerSSL %s\n}\n" \
"$ws_server_hostname" "$ws_server_port" "$ws_server_path" "$ws_ssl" >> "$CONFIGFILE"
;;
mqtt|mqtts)
if [ -z "$mqtt_server_hostname" ]; then
echo "Long connection: mqtt_server_hostname is required" >&2
return
fi
local mqtt_ssl
mqtt_ssl=$([ "$long_conn_mode" = "mqtts" ] && echo 1 || echo 0)
printf "mqtt {\n\tserveraddr %s\n\tserverport %s\n\tmqttUseSSL %s\n\tmqttUsername %s\n\tmqttPassword %s\n}\n" \
"$mqtt_server_hostname" "$mqtt_server_port" "$mqtt_ssl" "${mqtt_username:-}" "${mqtt_password:-}" >> "$CONFIGFILE"
;;
esac
}
prepare_external_interface() {
[ -z "$external_interface" ] && echo "No ExternalInterface " >&2 && return
local external_interface_name
if [ "$external_interface" = "wwan" ]; then
external_interface_name=$(ubus call network.interface."$external_interface" status | jsonfilter -e '@.device')
else
external_interface_name=$(uci get network."$external_interface".device)
fi
[ -z "$external_interface_name" ] && echo "Failed to get device name for $external_interface" >&2 && return
printf "ExternalInterface %s\n" "$external_interface_name" >> "$CONFIGFILE"
}
prepare_wifidog_conf() {
[ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
local auth_server_mode_value='"cloud", "bypass", "local"'
# 获取选中的认证服务器
local selected_auth_server
selected_auth_server=$(uci get wifidogx.common.selected_auth_server 2>/dev/null)
uci_validate_section "$NAME" "$NAME" common \
'enabled:bool:0' \
"auth_server_mode:or($auth_server_mode_value)" \
'selected_auth_server:string' \
'selected_long_conn:string' \
'log_level:integer:7' \
'device_id:string' \
'check_interval:integer:60' \
'client_timeout:integer:5' \
'wired_passed:bool:1' \
'apple_cna:bool:0' \
'trusted_domains:list(host)' \
'trusted_wildcard_domains:list(string)' \
'trusted_macs:list(string)' \
'app_white_list:list(string)' \
'mac_white_list:list(string)' \
'wildcard_white_list:list(string)' \
'js_filter:bool:1' \
'auth_server_offline_file:string' \
'internet_offline_file:string' \
'local_portal:string' \
'external_interface:string' \
'enable_anti_nat:bool:0' \
'enable_privileged_ops:bool:0' \
'privileged_ops_secret:string:chawrt@2026' \
'ttl_values:string:64,128' \
'anti_nat_permit_macs:string' \
'disable_portal_auth:bool:1' \
'ap_device_id:string' \
'ap_mac_address:string' \
'ap_longitude:string' \
'ap_latitude:string' \
'location_id:string'
[ -n "$app_white_list" ] && add_white_list_entries "app_white_list" "domain_name" "trusted_domains"
[ -n "$mac_white_list" ] && add_white_list_entries "mac_white_list" "mac_address" "trusted_macs"
[ -n "$wildcard_white_list" ] && add_white_list_entries "wildcard_white_list" "wildcard_domain" "trusted_wildcard_domains"
prepare_external_interface
prepare_auth_server_settings
prepare_longconn_settings
prepare_device_info
config_foreach handle_gateway gateway
prepare_common_settings
}
service_triggers() {
procd_add_reload_trigger "wifidogx"
}
start_service() {
config_load "$NAME"
prepare_wifidog_conf
if [ "$enabled" -eq 0 ]; then
echo "wifidogx is disabled, exit..." >&2
return
fi
procd_open_instance
procd_set_param command "$PROG" -c "$CONFIGFILE" -s -f -d "$log_level"
procd_set_param respawn
procd_set_param file /etc/config/wifidogx
procd_close_instance
}
status_service() {
/usr/bin/wdctlx status
}
reload_service() {
stop
start
}
+2 -2
View File
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_BAIDUDRIVE:=$(ARCH) PKG_ARCH_BAIDUDRIVE:=$(ARCH)
PKG_NAME:=baidudrive PKG_NAME:=baidudrive
PKG_VERSION:=dockermanager-runtime-v0.1.1 PKG_VERSION:=1.0.6
PKG_RELEASE:=16 PKG_RELEASE:=21
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/baidudrive-runtime-v$(PKG_VERSION)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/baidudrive-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip PKG_HASH:=skip
+1 -1
View File
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=BaiduPCS-Go PKG_NAME:=BaiduPCS-Go
PKG_VERSION:=4.0.2 PKG_VERSION:=4.0.2
PKG_RELEASE:=8 PKG_RELEASE:=9
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/qjfoidnh/BaiduPCS-Go/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/qjfoidnh/BaiduPCS-Go/tar.gz/v$(PKG_VERSION)?

Some files were not shown because too many files have changed in this diff Show More