Update On Thu Aug 1 20:31:18 CEST 2024

This commit is contained in:
github-action[bot]
2024-08-01 20:31:19 +02:00
parent 9122b7df9e
commit fa7251dd57
138 changed files with 3384 additions and 3083 deletions

1
.github/update.log vendored
View File

@@ -720,3 +720,4 @@ Update On Sun Jul 28 20:32:24 CEST 2024
Update On Mon Jul 29 20:33:10 CEST 2024 Update On Mon Jul 29 20:33:10 CEST 2024
Update On Tue Jul 30 20:33:50 CEST 2024 Update On Tue Jul 30 20:33:50 CEST 2024
Update On Wed Jul 31 20:30:50 CEST 2024 Update On Wed Jul 31 20:30:50 CEST 2024
Update On Thu Aug 1 20:31:07 CEST 2024

View File

@@ -744,7 +744,7 @@ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"boa_interner", "boa_interner",
"boa_macros", "boa_macros",
"indexmap 2.2.6", "indexmap 2.3.0",
"num-bigint", "num-bigint",
"rustc-hash 2.0.0", "rustc-hash 2.0.0",
] ]
@@ -770,7 +770,7 @@ dependencies = [
"fast-float", "fast-float",
"hashbrown 0.14.5", "hashbrown 0.14.5",
"icu_normalizer", "icu_normalizer",
"indexmap 2.2.6", "indexmap 2.3.0",
"intrusive-collections", "intrusive-collections",
"itertools 0.13.0", "itertools 0.13.0",
"num-bigint", "num-bigint",
@@ -816,7 +816,7 @@ dependencies = [
"boa_gc", "boa_gc",
"boa_macros", "boa_macros",
"hashbrown 0.14.5", "hashbrown 0.14.5",
"indexmap 2.2.6", "indexmap 2.3.0",
"once_cell", "once_cell",
"phf 0.11.2", "phf 0.11.2",
"rustc-hash 2.0.0", "rustc-hash 2.0.0",
@@ -1145,9 +1145,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.11" version = "4.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3" checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@@ -1155,9 +1155,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.11" version = "4.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa" checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@@ -1167,9 +1167,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.5.11" version = "4.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e" checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
@@ -1219,7 +1219,7 @@ dependencies = [
"hex", "hex",
"humansize", "humansize",
"image 0.25.2", "image 0.25.2",
"indexmap 2.2.6", "indexmap 2.3.0",
"log", "log",
"md-5", "md-5",
"mlua", "mlua",
@@ -1277,7 +1277,7 @@ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.59.0",
"winreg 0.52.0", "winreg 0.52.0",
"wry", "wry",
"zip 2.1.5", "zip 2.1.6",
"zip-extensions", "zip-extensions",
] ]
@@ -2844,7 +2844,7 @@ dependencies = [
"futures-sink", "futures-sink",
"futures-util", "futures-util",
"http 0.2.12", "http 0.2.12",
"indexmap 2.2.6", "indexmap 2.3.0",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
@@ -2863,7 +2863,7 @@ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
"http 1.1.0", "http 1.1.0",
"indexmap 2.2.6", "indexmap 2.3.0",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
@@ -3413,9 +3413,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.2.6" version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.14.5", "hashbrown 0.14.5",
@@ -3891,7 +3891,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-targets 0.52.6", "windows-targets 0.48.5",
] ]
[[package]] [[package]]
@@ -5062,7 +5062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
dependencies = [ dependencies = [
"fixedbitset", "fixedbitset",
"indexmap 2.2.6", "indexmap 2.3.0",
] ]
[[package]] [[package]]
@@ -5265,7 +5265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"indexmap 2.2.6", "indexmap 2.3.0",
"quick-xml 0.32.0", "quick-xml 0.32.0",
"serde", "serde",
"time", "time",
@@ -6220,7 +6220,7 @@ version = "1.0.121"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609"
dependencies = [ dependencies = [
"indexmap 2.2.6", "indexmap 2.3.0",
"itoa 1.0.11", "itoa 1.0.11",
"memchr", "memchr",
"ryu", "ryu",
@@ -6279,7 +6279,7 @@ dependencies = [
"chrono", "chrono",
"hex", "hex",
"indexmap 1.9.3", "indexmap 1.9.3",
"indexmap 2.2.6", "indexmap 2.3.0",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
@@ -6317,7 +6317,7 @@ version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [ dependencies = [
"indexmap 2.2.6", "indexmap 2.3.0",
"itoa 1.0.11", "itoa 1.0.11",
"ryu", "ryu",
"serde", "serde",
@@ -7527,7 +7527,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [ dependencies = [
"indexmap 2.2.6", "indexmap 2.3.0",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
@@ -7540,7 +7540,7 @@ version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
dependencies = [ dependencies = [
"indexmap 2.2.6", "indexmap 2.3.0",
"toml_datetime", "toml_datetime",
"winnow 0.5.40", "winnow 0.5.40",
] ]
@@ -7551,7 +7551,7 @@ version = "0.22.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16"
dependencies = [ dependencies = [
"indexmap 2.2.6", "indexmap 2.3.0",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
@@ -9306,9 +9306,9 @@ dependencies = [
[[package]] [[package]]
name = "zip" name = "zip"
version = "2.1.5" version = "2.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b895748a3ebcb69b9d38dcfdf21760859a4b0d0b0015277640c2ef4c69640e6f" checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e"
dependencies = [ dependencies = [
"aes", "aes",
"arbitrary", "arbitrary",
@@ -9320,7 +9320,7 @@ dependencies = [
"displaydoc", "displaydoc",
"flate2", "flate2",
"hmac", "hmac",
"indexmap 2.2.6", "indexmap 2.3.0",
"lzma-rs", "lzma-rs",
"memchr", "memchr",
"pbkdf2", "pbkdf2",
@@ -9339,7 +9339,7 @@ version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a" checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a"
dependencies = [ dependencies = [
"zip 2.1.5", "zip 2.1.6",
] ]
[[package]] [[package]]

View File

@@ -10,7 +10,7 @@ pub use self::clash_strategy::{ClashStrategy, ExternalControllerPortStrategy};
pub use logging::LoggingLevel; pub use logging::LoggingLevel;
// TODO: when support sing-box, remove this struct // TODO: when support sing-box, remove this struct
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
pub enum ClashCore { pub enum ClashCore {
#[serde(rename = "clash", alias = "clash-premium")] #[serde(rename = "clash", alias = "clash-premium")]
ClashPremium, ClashPremium,
@@ -88,6 +88,15 @@ impl TryFrom<&nyanpasu_utils::core::CoreType> for ClashCore {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum ProxiesSelectorMode {
Hidden,
#[default]
Normal,
Submenu,
}
/// ### `verge.yaml` schema /// ### `verge.yaml` schema
#[derive(Default, Debug, Clone, Deserialize, Serialize)] #[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct IVerge { pub struct IVerge {
@@ -198,7 +207,7 @@ pub struct IVerge {
pub clash_strategy: Option<ClashStrategy>, pub clash_strategy: Option<ClashStrategy>,
/// 是否启用代理托盘选择 /// 是否启用代理托盘选择
pub clash_tray_selector: Option<bool>, pub clash_tray_selector: Option<ProxiesSelectorMode>,
} }
#[derive(Default, Debug, Clone, Deserialize, Serialize)] #[derive(Default, Debug, Clone, Deserialize, Serialize)]
@@ -292,7 +301,7 @@ impl IVerge {
// auto_log_clean: Some(60 * 24 * 7), // 7 days 自动清理日记 // auto_log_clean: Some(60 * 24 * 7), // 7 days 自动清理日记
max_log_files: Some(7), // 7 days max_log_files: Some(7), // 7 days
enable_auto_check_update: Some(true), enable_auto_check_update: Some(true),
clash_tray_selector: Some(true), clash_tray_selector: Some(ProxiesSelectorMode::default()),
enable_service_mode: Some(false), enable_service_mode: Some(false),
..Self::default() ..Self::default()
} }

View File

@@ -1,7 +1,7 @@
use crate::{ use crate::{
config::Config, config::Config,
enhance::ScriptType, enhance::ScriptType,
utils::{dirs, help, tmpl}, utils::{dirs, help},
}; };
use anyhow::{bail, Context, Result}; use anyhow::{bail, Context, Result};
use reqwest::StatusCode; use reqwest::StatusCode;
@@ -150,12 +150,12 @@ impl ProfileItem {
Some(ProfileItemType::Merge) => { Some(ProfileItemType::Merge) => {
let name = item.name.unwrap_or("Merge".into()); let name = item.name.unwrap_or("Merge".into());
let desc = item.desc.unwrap_or("".into()); let desc = item.desc.unwrap_or("".into());
ProfileItem::from_merge(name, desc) ProfileItem::from_merge(name, desc, file_data)
} }
Some(ProfileItemType::Script(script_type)) => { Some(ProfileItemType::Script(script_type)) => {
let name = item.name.unwrap_or("Script".into()); let name = item.name.unwrap_or("Script".into());
let desc = item.desc.unwrap_or("".into()); let desc = item.desc.unwrap_or("".into());
ProfileItem::from_script(name, desc, script_type) ProfileItem::from_script(name, desc, script_type, file_data)
} }
None => bail!("could not find the item type"), None => bail!("could not find the item type"),
} }
@@ -178,7 +178,7 @@ impl ProfileItem {
desc: Some(desc), desc: Some(desc),
file: Some(file), file: Some(file),
updated: Some(chrono::Local::now().timestamp() as usize), updated: Some(chrono::Local::now().timestamp() as usize),
file_data: Some(file_data.unwrap_or(tmpl::ITEM_LOCAL.into())), file_data,
..Default::default() ..Default::default()
}) })
} }
@@ -347,7 +347,11 @@ impl ProfileItem {
/// ## Merge type (enhance) /// ## Merge type (enhance)
/// create the enhanced item by using `merge` rule /// create the enhanced item by using `merge` rule
pub fn from_merge(name: String, desc: String) -> Result<ProfileItem> { pub fn from_merge(
name: String,
desc: String,
file_data: Option<String>,
) -> Result<ProfileItem> {
let uid = help::get_uid("m"); let uid = help::get_uid("m");
let file = format!("{uid}.yaml"); let file = format!("{uid}.yaml");
@@ -358,14 +362,19 @@ impl ProfileItem {
desc: Some(desc), desc: Some(desc),
file: Some(file), file: Some(file),
updated: Some(chrono::Local::now().timestamp() as usize), updated: Some(chrono::Local::now().timestamp() as usize),
file_data: Some(tmpl::ITEM_MERGE.into()), file_data,
..Default::default() ..Default::default()
}) })
} }
/// ## Script type (enhance) /// ## Script type (enhance)
/// create the enhanced item by using javascript quick.js /// create the enhanced item by using javascript quick.js
pub fn from_script(name: String, desc: String, script_type: ScriptType) -> Result<ProfileItem> { pub fn from_script(
name: String,
desc: String,
script_type: ScriptType,
file_data: Option<String>,
) -> Result<ProfileItem> {
let uid = help::get_uid("s"); let uid = help::get_uid("s");
let file = match script_type { let file = match script_type {
ScriptType::JavaScript => format!("{uid}.js"), // js ext ScriptType::JavaScript => format!("{uid}.js"), // js ext
@@ -379,7 +388,7 @@ impl ProfileItem {
desc: Some(desc), desc: Some(desc),
file: Some(file), file: Some(file),
updated: Some(chrono::Local::now().timestamp() as usize), updated: Some(chrono::Local::now().timestamp() as usize),
file_data: Some(tmpl::ITEM_SCRIPT.into()), file_data,
..Default::default() ..Default::default()
}) })
} }

View File

@@ -1,6 +1,6 @@
use indexmap::IndexMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_yaml::Mapping; use serde_yaml::Mapping;
use std::collections::HashMap;
use crate::enhance::Logs; use crate::enhance::Logs;
@@ -10,7 +10,7 @@ pub struct IRuntime {
// 记录在配置中包括merge和script生成的出现过的keys // 记录在配置中包括merge和script生成的出现过的keys
// 这些keys不一定都生效 // 这些keys不一定都生效
pub exists_keys: Vec<String>, pub exists_keys: Vec<String>,
pub chain_logs: HashMap<String, Logs>, pub chain_logs: IndexMap<String, Logs>,
} }
impl IRuntime { impl IRuntime {

View File

@@ -103,6 +103,10 @@ pub trait Migration<'a>: DynClone {
fn migrate(&self) -> std::io::Result<()> { fn migrate(&self) -> std::io::Result<()> {
unimplemented!() unimplemented!()
} }
fn discard(&self) -> std::io::Result<()> {
Ok(())
}
} }
clone_trait_object!(Migration<'_>); clone_trait_object!(Migration<'_>);
@@ -268,7 +272,18 @@ impl Runner<'_> {
Ok(()) Ok(())
} }
Err(e) => { Err(e) => {
eprintln!("Migration {} failed: {}", name, e); eprintln!(
"Migration {} failed: {}; trying to discard changes",
name, e
);
match migration.discard() {
Ok(_) => {
eprintln!("Migration {} discarded.", name);
}
Err(e) => {
eprintln!("Migration {} discard failed: {}", name, e);
}
}
store.set_state(Cow::Owned(name.to_string()), MigrationState::Failed); store.set_state(Cow::Owned(name.to_string()), MigrationState::Failed);
Err(e) Err(e)
} }

View File

@@ -1,11 +1,15 @@
use std::borrow::Cow;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use serde_yaml::Mapping;
use crate::{ use crate::{
config::RUNTIME_CONFIG, config::RUNTIME_CONFIG,
core::migration::{DynMigration, Migration}, core::migration::{DynMigration, Migration},
}; };
pub static UNITS: Lazy<Vec<DynMigration>> = Lazy::new(|| vec![MigrateAppHomeDir.into()]); pub static UNITS: Lazy<Vec<DynMigration>> =
Lazy::new(|| vec![MigrateAppHomeDir.into(), MigrateProxiesSelectorMode.into()]);
pub static VERSION: Lazy<semver::Version> = Lazy::new(|| semver::Version::parse("1.6.0").unwrap()); pub static VERSION: Lazy<semver::Version> = Lazy::new(|| semver::Version::parse("1.6.0").unwrap());
@@ -109,4 +113,142 @@ impl<'a> Migration<'a> for MigrateAppHomeDir {
println!("Migration completed"); println!("Migration completed");
Ok(()) Ok(())
} }
#[allow(deprecated)]
fn discard(&self) -> std::io::Result<()> {
let home_dir = crate::utils::dirs::app_home_dir().unwrap();
let app_config_dir = crate::utils::dirs::app_config_dir().unwrap();
let app_data_dir = crate::utils::dirs::app_data_dir().unwrap();
if !home_dir.exists() {
std::fs::create_dir_all(&home_dir)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
let file_opts = fs_extra::file::CopyOptions::default().skip_exist(true);
let dir_opts = fs_extra::dir::CopyOptions::default()
.skip_exist(true)
.content_only(true);
if home_dir != app_config_dir {
// move profiles.yaml
let path = app_config_dir.join("profiles.yaml");
if path.exists() {
println!("Moving profiles.yaml to home dir");
fs_extra::file::move_file(path, home_dir.join("profiles.yaml"), &file_opts)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
// move profiles dir
let path = crate::utils::dirs::app_profiles_dir().unwrap();
if path.exists() {
println!("Moving profiles dir to home dir");
fs_extra::dir::move_dir(path, home_dir.join("profiles"), &dir_opts)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
// move other files and dirs to home dir
println!("Moving other files and dirs to home dir");
fs_extra::dir::move_dir(app_data_dir, &home_dir, &dir_opts)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
// move nyanpasu config
let path = app_config_dir.join(crate::utils::dirs::NYANPASU_CONFIG);
if path.exists() {
println!("Moving verge.yaml to home dir");
fs_extra::file::move_file(path, home_dir.join("verge.yaml"), &file_opts)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
// move clash guard overrides
let path = crate::utils::dirs::clash_guard_overrides_path().unwrap();
if path.exists() {
println!("Moving config.yaml to home dir");
fs_extra::file::move_file(path, home_dir.join("config.yaml"), &file_opts)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
// move clash runtime config
let path = app_config_dir.join(RUNTIME_CONFIG);
if path.exists() {
println!("Moving clash-verge.yaml to home dir");
fs_extra::file::move_file(path, home_dir.join("clash-verge.yaml"), &file_opts)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
}
println!("Migration discarded");
Ok(())
}
}
#[derive(Debug, Clone)]
pub struct MigrateProxiesSelectorMode;
impl<'a> Migration<'a> for MigrateProxiesSelectorMode {
fn version(&self) -> &'a semver::Version {
&VERSION
}
fn name(&self) -> std::borrow::Cow<'a, str> {
Cow::Borrowed("Migrate Proxies Selector Mode")
}
fn migrate(&self) -> std::io::Result<()> {
let config_path = crate::utils::dirs::nyanpasu_config_path().unwrap();
if !config_path.exists() {
println!("Config file not found, skipping migration");
return Ok(());
}
println!("parse config file...");
let config = std::fs::read_to_string(&config_path)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
let mut config: Mapping = serde_yaml::from_str(&config)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
let mode = config.get_mut("clash_tray_selector");
match mode {
None => {
println!("clash_tray_selector not found, skipping migration");
return Ok(());
}
Some(mode) => {
if mode.is_bool() {
println!("detected old mode, migrating...");
let value = mode.as_bool().unwrap();
let value = if value { "normal" } else { "hidden" };
*mode = serde_yaml::Value::from(value);
println!("write config file...");
let config = serde_yaml::to_string(&config)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
std::fs::write(&config_path, config)?;
}
println!("Migration completed");
}
}
Ok(())
}
fn discard(&self) -> std::io::Result<()> {
let config_path = crate::utils::dirs::nyanpasu_config_path().unwrap();
if !config_path.exists() {
println!("Config file not found, skipping migration");
return Ok(());
}
println!("parse config file...");
let config = std::fs::read_to_string(&config_path)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
let mut config: Mapping = serde_yaml::from_str(&config)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
let mode = config.get_mut("clash_tray_selector");
match mode {
None => {
println!("clash_tray_selector not found, skipping migration");
return Ok(());
}
Some(mode) => {
if mode.is_string() {
println!("detected new mode, migrating...");
let value = mode.as_str().unwrap();
let value = value == "normal";
*mode = serde_yaml::Value::from(value);
println!("write config file...");
let config = serde_yaml::to_string(&config)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
std::fs::write(&config_path, config)?;
}
println!("Migration discarded");
}
}
Ok(())
}
} }

View File

@@ -1,5 +1,5 @@
use crate::{ use crate::{
config::Config, config::{nyanpasu::ProxiesSelectorMode, Config},
core::{ core::{
clash::proxies::{Proxies, ProxiesGuard, ProxiesGuardExt}, clash::proxies::{Proxies, ProxiesGuard, ProxiesGuardExt},
handle::Handle, handle::Handle,
@@ -162,8 +162,11 @@ pub async fn proxies_updated_receiver() {
} }
Handle::mutate_proxies(); Handle::mutate_proxies();
{ {
let is_tray_selector_enabled = let is_tray_selector_enabled = Config::verge()
Config::verge().latest().clash_tray_selector.unwrap_or(true); .latest()
.clash_tray_selector
.unwrap_or_default()
!= ProxiesSelectorMode::Hidden;
if !is_tray_selector_enabled { if !is_tray_selector_enabled {
continue; continue;
} }
@@ -209,8 +212,12 @@ pub fn setup_proxies() {
mod platform_impl { mod platform_impl {
use super::{ProxySelectAction, TrayProxyItem}; use super::{ProxySelectAction, TrayProxyItem};
use crate::core::{clash::proxies::ProxiesGuard, handle::Handle}; use crate::{
config::nyanpasu::ProxiesSelectorMode,
core::{clash::proxies::ProxiesGuard, handle::Handle},
};
use base64::{engine::general_purpose::STANDARD as base64_standard, Engine as _}; use base64::{engine::general_purpose::STANDARD as base64_standard, Engine as _};
use rust_i18n::t;
use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu}; use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu};
use tracing::warn; use tracing::warn;
@@ -256,20 +263,30 @@ mod platform_impl {
} }
pub fn setup_tray(menu: &mut SystemTrayMenu) -> SystemTrayMenu { pub fn setup_tray(menu: &mut SystemTrayMenu) -> SystemTrayMenu {
let mut menu = menu.to_owned(); let mut parent_menu = menu.to_owned();
let is_tray_selector_enabled = crate::config::Config::verge() let selector_mode = crate::config::Config::verge()
.latest() .latest()
.clash_tray_selector .clash_tray_selector
.unwrap_or(true); .unwrap_or_default();
if !is_tray_selector_enabled { let mut menu = match selector_mode {
return menu; ProxiesSelectorMode::Hidden => return parent_menu,
} ProxiesSelectorMode::Normal => {
// TODO: support submenu parent_menu = parent_menu.add_native_item(SystemTrayMenuItem::Separator);
menu = menu.add_native_item(SystemTrayMenuItem::Separator); parent_menu.clone()
}
ProxiesSelectorMode::Submenu => SystemTrayMenu::new(),
};
let proxies = ProxiesGuard::global().read().inner().to_owned(); let proxies = ProxiesGuard::global().read().inner().to_owned();
let mode = crate::utils::config::get_current_clash_mode(); let mode = crate::utils::config::get_current_clash_mode();
let tray_proxies = super::to_tray_proxies(mode.as_str(), &proxies); let tray_proxies = super::to_tray_proxies(mode.as_str(), &proxies);
generate_selectors(&menu, &tray_proxies) menu = generate_selectors(&menu, &tray_proxies);
if selector_mode == ProxiesSelectorMode::Submenu {
parent_menu =
parent_menu.add_submenu(SystemTraySubmenu::new(t!("tray.select_proxies"), menu));
parent_menu
} else {
menu
}
} }
pub fn update_selected_proxies(actions: &[ProxySelectAction]) { pub fn update_selected_proxies(actions: &[ProxySelectAction]) {

View File

@@ -8,13 +8,14 @@ mod utils;
pub use self::chain::ScriptType; pub use self::chain::ScriptType;
use self::{chain::*, field::*, merge::*, script::*, tun::*}; use self::{chain::*, field::*, merge::*, script::*, tun::*};
use crate::config::Config; use crate::config::Config;
use indexmap::IndexMap;
use serde_yaml::Mapping; use serde_yaml::Mapping;
use std::collections::{HashMap, HashSet}; use std::collections::HashSet;
pub use utils::{Logs, LogsExt}; pub use utils::{Logs, LogsExt};
/// Enhance mode /// Enhance mode
/// 返回最终配置、该配置包含的键、和script执行的结果 /// 返回最终配置、该配置包含的键、和script执行的结果
pub async fn enhance() -> (Mapping, Vec<String>, HashMap<String, Logs>) { pub async fn enhance() -> (Mapping, Vec<String>, IndexMap<String, Logs>) {
// config.yaml 的配置 // config.yaml 的配置
let clash_config = { Config::clash().latest().0.clone() }; let clash_config = { Config::clash().latest().0.clone() };
@@ -61,7 +62,7 @@ pub async fn enhance() -> (Mapping, Vec<String>, HashMap<String, Logs>) {
(current_mapping, profile_spec_chains, valid) (current_mapping, profile_spec_chains, valid)
}; };
let mut result_map = HashMap::new(); // 保存脚本日志 let mut result_map = IndexMap::new(); // 保存脚本日志
let mut exists_keys = use_keys(&config); // 保存出现过的keys let mut exists_keys = use_keys(&config); // 保存出现过的keys
let valid = use_valid_fields(valid); let valid = use_valid_fields(valid);

View File

@@ -1,5 +1,7 @@
use serde_yaml::{Mapping, Value}; use serde_yaml::{Mapping, Value};
use crate::config::{nyanpasu::ClashCore, Config};
macro_rules! revise { macro_rules! revise {
($map: expr, $key: expr, $val: expr) => { ($map: expr, $key: expr, $val: expr) => {
let ret_key = Value::String($key.into()); let ret_key = Value::String($key.into());
@@ -31,10 +33,21 @@ pub fn use_tun(mut config: Mapping, enable: bool) -> Mapping {
revise!(tun_val, "enable", enable); revise!(tun_val, "enable", enable);
if enable { if enable {
append!(tun_val, "stack", "gvisor"); let core = {
append!(tun_val, "dns-hijack", vec!["any:53"]); *Config::verge()
append!(tun_val, "auto-route", true); .latest()
append!(tun_val, "auto-detect-interface", true); .clash_core
.as_ref()
.unwrap_or(&ClashCore::default())
};
if core == ClashCore::ClashRs {
append!(tun_val, "device-id", "dev://utun1989");
} else {
append!(tun_val, "stack", "gvisor");
append!(tun_val, "dns-hijack", vec!["any:53"]);
append!(tun_val, "auto-route", true);
append!(tun_val, "auto-detect-interface", true);
}
} }
revise!(config, "tun", tun_val); revise!(config, "tun", tun_val);

View File

@@ -13,9 +13,10 @@ use crate::{
}; };
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use chrono::Local; use chrono::Local;
use indexmap::IndexMap;
use log::debug; use log::debug;
use serde_yaml::Mapping; use serde_yaml::Mapping;
use std::collections::{HashMap, VecDeque}; use std::collections::VecDeque;
use sysproxy::Sysproxy; use sysproxy::Sysproxy;
use tauri::api::dialog::FileDialogBuilder; use tauri::api::dialog::FileDialogBuilder;
@@ -173,7 +174,7 @@ pub fn get_runtime_exists() -> CmdResult<Vec<String>> {
} }
#[tauri::command] #[tauri::command]
pub fn get_runtime_logs() -> CmdResult<HashMap<String, Logs>> { pub fn get_runtime_logs() -> CmdResult<IndexMap<String, Logs>> {
Ok(Config::runtime().latest().chain_logs.clone()) Ok(Config::runtime().latest().chain_logs.clone())
} }

View File

@@ -5,7 +5,6 @@ pub mod dirs;
pub mod help; pub mod help;
pub mod init; pub mod init;
pub mod resolve; pub mod resolve;
pub mod tmpl;
// mod winhelp; // mod winhelp;
pub mod downloader; pub mod downloader;
#[cfg(windows)] #[cfg(windows)]

View File

@@ -1,35 +0,0 @@
//! Some config file template
/// template for new a profile item
pub const ITEM_LOCAL: &str = "# Profile Template for clash verge
proxies:
proxy-groups:
rules:
";
/// enhanced profile
pub const ITEM_MERGE: &str = "# Merge Template for clash verge
# The `Merge` format used to enhance profile
prepend-rules:
prepend-proxies:
prepend-proxy-groups:
append-rules:
append-proxies:
append-proxy-groups:
";
/// enhanced profile
pub const ITEM_SCRIPT: &str = "// Define the `main` function
function main(params) {
return params;
}
";

View File

@@ -41,7 +41,7 @@ export interface VergeConfig {
enable_clash_fields?: boolean; enable_clash_fields?: boolean;
enable_builtin_enhanced?: boolean; enable_builtin_enhanced?: boolean;
proxy_layout_column?: number; proxy_layout_column?: number;
clash_tray_selector?: boolean; clash_tray_selector?: "normal" | "hidden" | "submenu";
clash_strategy?: { clash_strategy?: {
external_controller_port_strategy: "fixed" | "random" | "allow_fallback"; external_controller_port_strategy: "fixed" | "random" | "allow_fallback";
}; };
@@ -75,11 +75,53 @@ export namespace Profile {
items?: Item[]; items?: Item[];
} }
export type ScriptType = "javascript" | "lua"; export const Template = {
merge: `# Clash Nyanpasu Merge Template (YAML)
# Documentation on https://nyanpasu.elaina.moe/
# Set the default merge strategy to recursive merge.
# Enable the old mode with the override__ prefix.
# Use the filter__ prefix to filter lists (removing unwanted content).
# All prefixes should support accessing maps or lists with a.b.c syntax.
`,
javascript: `// Clash Nyanpasu JavaScript Template
// Documentation on https://nyanpasu.elaina.moe/
/** @type {config} */
export default function (profile) {
return profile;
}
`,
luascript: `-- Clash Nyanpasu Lua Script Template
-- Documentation on https://nyanpasu.elaina.moe/
return config;
`,
profile: `# Clash Nyanpasu Profile Template
# Documentation on https://nyanpasu.elaina.moe/
proxies:
proxy-groups:
rules:
`,
};
export const Type = {
Local: "local",
Remote: "remote",
Merge: "merge",
JavaScript: {
script: "javascript",
},
LuaScript: {
script: "lua",
},
} as const;
export interface Item { export interface Item {
uid: string; uid: string;
type?: "local" | "remote" | "merge" | { script: ScriptType }; type?: (typeof Type)[keyof typeof Type];
name?: string; name?: string;
desc?: string; desc?: string;
file?: string; file?: string;

View File

@@ -56,7 +56,7 @@
"@vitejs/plugin-react-swc": "3.7.0", "@vitejs/plugin-react-swc": "3.7.0",
"clsx": "2.1.1", "clsx": "2.1.1",
"sass": "1.77.8", "sass": "1.77.8",
"shiki": "1.12.0", "shiki": "1.12.1",
"tailwindcss-textshadow": "2.1.3", "tailwindcss-textshadow": "2.1.3",
"vite": "5.3.5", "vite": "5.3.5",
"vite-plugin-monaco-editor": "1.1.3", "vite-plugin-monaco-editor": "1.1.3",

View File

@@ -0,0 +1,105 @@
import { memo, useState, useTransition } from "react";
import { useTranslation } from "react-i18next";
import { Menu as MenuIcon } from "@mui/icons-material";
import { LoadingButton } from "@mui/lab";
import { alpha, ListItemButton, Menu, MenuItem, useTheme } from "@mui/material";
import { Profile, useClash } from "@nyanpasu/interface";
import { cleanDeepClickEvent } from "@nyanpasu/ui";
export const ChainItem = memo(function ChainItem({
item,
selected,
onClick,
onChainEdit,
}: {
item: Profile.Item;
selected?: boolean;
onClick: () => Promise<void>;
onChainEdit: () => void;
}) {
const { t } = useTranslation();
const { palette } = useTheme();
const { deleteProfile } = useClash();
const [isPending, startTransition] = useTransition();
const handleClick = () => {
startTransition(onClick);
};
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
const menuMapping = {
Apply: () => handleClick(),
"Edit Info": () => onChainEdit(),
Delete: () => deleteProfile(item.uid),
};
const handleMenuClick = (func: () => void) => {
setAnchorEl(null);
func();
};
return (
<>
<ListItemButton
className="!mb-2 !mt-2 !flex !justify-between gap-2"
sx={{
backgroundColor: selected
? alpha(palette.primary.main, 0.3)
: alpha(palette.secondary.main, 0.1),
borderRadius: 4,
"&:hover": {
backgroundColor: selected
? alpha(palette.primary.main, 0.5)
: undefined,
},
}}
onClick={handleClick}
disabled={isPending}
>
<div className="truncate py-1">
<span>{item.name}</span>
</div>
<LoadingButton
size="small"
color="primary"
className="!size-8 !min-w-0"
onClick={(e) => {
cleanDeepClickEvent(e);
setAnchorEl(e.currentTarget);
}}
loading={isPending}
>
<MenuIcon />
</LoadingButton>
</ListItemButton>
<Menu
anchorEl={anchorEl}
open={Boolean(anchorEl)}
onClose={() => setAnchorEl(null)}
>
{Object.entries(menuMapping).map(([key, func], index) => {
return (
<MenuItem
key={index}
onClick={(e) => {
cleanDeepClickEvent(e);
handleMenuClick(func);
}}
>
{t(key)}
</MenuItem>
);
})}
</Menu>
</>
);
});
export default ChainItem;

View File

@@ -0,0 +1,25 @@
import { alpha, useTheme } from "@mui/material";
import { Profile } from "@nyanpasu/interface";
import { getLanguage } from "../utils";
export const LanguageChip = ({ type }: { type: Profile.Item["type"] }) => {
const { palette } = useTheme();
const lang = getLanguage(type, true);
return (
lang && (
<div
className="my-auto rounded-full px-2 py-0.5 text-center text-sm font-bold"
style={{
backgroundColor: alpha(palette.primary.main, 0.1),
color: palette.primary.main,
}}
>
{lang}
</div>
)
);
};
export default LanguageChip;

View File

@@ -1,127 +1,79 @@
import { useLockFn } from "ahooks"; import { useLockFn } from "ahooks";
import { memo } from "react"; import { useAtomValue } from "jotai";
import { Add, Edit } from "@mui/icons-material"; import { Add } from "@mui/icons-material";
import { import { alpha, ListItemButton, useTheme } from "@mui/material";
alpha,
IconButton,
ListItemButton,
ListItemIcon,
ListItemText,
useTheme,
} from "@mui/material";
import { Profile, useClash } from "@nyanpasu/interface"; import { Profile, useClash } from "@nyanpasu/interface";
import { filterProfiles } from "../utils"; import { filterProfiles } from "../utils";
import ChainItem from "./chain-item";
const ChainItem = memo(function ChainItem({ import { atomChainsSelected, atomGlobalChainCurrent } from "./store";
name,
desc,
selected,
onClick,
onChainEdit,
}: {
name?: string;
desc?: string;
selected?: boolean;
onClick: () => void;
onChainEdit: () => void;
}) {
const { palette } = useTheme();
return (
<ListItemButton
className="!mb-2 !mt-2"
sx={{
backgroundColor: selected
? alpha(palette.primary.main, 0.3)
: alpha(palette.secondary.main, 0.1),
borderRadius: 4,
"&:hover": {
backgroundColor: selected
? alpha(palette.primary.main, 0.5)
: undefined,
},
}}
onClick={onClick}
>
<ListItemText primary={name} secondary={desc} />
<IconButton
edge="end"
color="primary"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
onChainEdit();
}}
>
<Edit />
</IconButton>
</ListItemButton>
);
});
export interface SideChainProps { export interface SideChainProps {
global?: boolean;
profile?: Profile.Item;
onChainEdit: (item?: Profile.Item) => void | Promise<void>; onChainEdit: (item?: Profile.Item) => void | Promise<void>;
} }
export const SideChain = ({ global, profile, onChainEdit }: SideChainProps) => { export const SideChain = ({ onChainEdit }: SideChainProps) => {
const { palette } = useTheme(); const { palette } = useTheme();
const { getProfiles, setProfilesConfig, setProfiles } = useClash(); const isGlobalChainCurrent = useAtomValue(atomGlobalChainCurrent);
const currnetProfile = useAtomValue(atomChainsSelected);
const {
getProfiles,
setProfilesConfig,
setProfiles,
getRuntimeLogs: { mutate: mutateRuntimeLogs },
} = useClash();
const { scripts } = filterProfiles(getProfiles.data?.items); const { scripts } = filterProfiles(getProfiles.data?.items);
const handleChainClick = useLockFn(async (uid: string) => { const handleChainClick = useLockFn(async (uid: string) => {
const chains = global const chains = isGlobalChainCurrent
? (getProfiles.data?.chain ?? []) ? (getProfiles.data?.chain ?? [])
: (profile?.chains ?? []); : (currnetProfile?.chains ?? []);
const updatedChains = chains.includes(uid) const updatedChains = chains.includes(uid)
? chains.filter((chain) => chain !== uid) ? chains.filter((chain) => chain !== uid)
: [...chains, uid]; : [...chains, uid];
if (global) { if (isGlobalChainCurrent) {
await setProfilesConfig({ chain: updatedChains }); await setProfilesConfig({ chain: updatedChains });
} else { } else {
await setProfiles(uid, { chains: updatedChains }); await setProfiles(uid, { chains: updatedChains });
} }
mutateRuntimeLogs();
}); });
return ( return (
<div className="h-full overflow-auto !pl-2 !pr-2"> <div className="h-full overflow-auto !pl-2 !pr-2">
{scripts?.map((item, index) => { {scripts?.map((item, index) => {
const selected = global const selected = isGlobalChainCurrent
? getProfiles.data?.chain?.includes(item.uid) ? getProfiles.data?.chain?.includes(item.uid)
: profile?.chains?.includes(item.uid); : currnetProfile?.chains?.includes(item.uid);
return ( return (
<ChainItem <ChainItem
key={index} key={index}
name={item.name} item={item}
desc={item.desc}
selected={selected} selected={selected}
onClick={() => handleChainClick(item.uid)} onClick={async () => await handleChainClick(item.uid)}
onChainEdit={() => onChainEdit(item)} onChainEdit={() => onChainEdit(item)}
/> />
); );
})} })}
<ListItemButton <ListItemButton
className="!mb-2 !mt-2" className="!mb-2 !mt-2 flex justify-center gap-2"
sx={{ sx={{
backgroundColor: alpha(palette.secondary.main, 0.1), backgroundColor: alpha(palette.secondary.main, 0.1),
borderRadius: 4, borderRadius: 4,
}} }}
onClick={() => onChainEdit()} onClick={() => onChainEdit()}
> >
<ListItemIcon> <Add color="primary" />
<Add color="primary" />
</ListItemIcon>
<ListItemText primary="New Chain" /> <div className="py-1">New Chain</div>
</ListItemButton> </ListItemButton>
</div> </div>
); );

View File

@@ -0,0 +1,6 @@
import { atom } from "jotai";
import type { Profile } from "@nyanpasu/interface";
export const atomGlobalChainCurrent = atom<boolean>(false);
export const atomChainsSelected = atom<Profile.Item>();

View File

@@ -107,10 +107,18 @@ export const ProfileItem = memo(function ProfileItem({
await deleteConnections(); await deleteConnections();
} catch (err) { } catch (err) {
useMessage(`Error setting profile: \n ${JSON.stringify(err)}`, { const is_fetch_error = err instanceof Error && err.name === "FetchError";
title: t("Error"), useMessage(
type: "error", is_fetch_error
}); ? t("FetchError", {
content: t("Subscription"),
})
: `Error setting profile: \n ${err instanceof Error ? err.message : String(err)}`,
{
title: t("Error"),
type: "error",
},
);
} finally { } finally {
setLoading({ card: false }); setLoading({ card: false });
} }

View File

@@ -1,4 +1,4 @@
import { useAsyncEffect, useLockFn, useUpdateEffect } from "ahooks"; import { useAsyncEffect, useUpdateEffect } from "ahooks";
import { useAtomValue } from "jotai"; import { useAtomValue } from "jotai";
import { forwardRef, useImperativeHandle, useRef } from "react"; import { forwardRef, useImperativeHandle, useRef } from "react";
import { monaco } from "@/services/monaco"; import { monaco } from "@/services/monaco";
@@ -23,12 +23,16 @@ export const ProfileMonacoView = forwardRef(function ProfileMonacoView(
const monacoRef = useRef<HTMLDivElement>(null); const monacoRef = useRef<HTMLDivElement>(null);
const monacoeditorRef = useRef<typeof monaco | null>(null);
const instanceRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null); const instanceRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
useAsyncEffect(async () => { useAsyncEffect(async () => {
if (open) { if (open) {
const { monaco } = await import("@/services/monaco"); const { monaco } = await import("@/services/monaco");
monacoeditorRef.current = monaco;
if (!monacoRef.current) { if (!monacoRef.current) {
return; return;
} }
@@ -49,21 +53,25 @@ export const ProfileMonacoView = forwardRef(function ProfileMonacoView(
getValue: () => instanceRef.current?.getValue(), getValue: () => instanceRef.current?.getValue(),
})); }));
const changeLanguage = useLockFn(async () => { useUpdateEffect(() => {
const { monaco } = await import("@/services/monaco"); const model = instanceRef.current?.getModel();
const text = instanceRef.current?.getModel(); if (!model || !language) {
if (!text || !language) {
return; return;
} }
monaco.editor.setModelLanguage(text, language); monacoeditorRef.current?.editor.setModelLanguage(model, language);
}); }, [language]);
useUpdateEffect(() => { useUpdateEffect(() => {
changeLanguage(); const model = instanceRef.current?.getModel();
}, [language]);
if (!model || !value) {
return;
}
model.setValue(value);
}, [value]);
return <div ref={monacoRef} className={className} />; return <div ref={monacoRef} className={className} />;
}); });

View File

@@ -1,5 +1,6 @@
import { Allotment } from "allotment"; import { Allotment } from "allotment";
import "allotment/dist/style.css"; import "allotment/dist/style.css";
import { useAtomValue } from "jotai";
import { useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Close } from "@mui/icons-material"; import { Close } from "@mui/icons-material";
@@ -7,23 +8,26 @@ import { IconButton } from "@mui/material";
import { Profile } from "@nyanpasu/interface"; import { Profile } from "@nyanpasu/interface";
import { SideChain } from "./modules/side-chain"; import { SideChain } from "./modules/side-chain";
import { SideLog } from "./modules/side-log"; import { SideLog } from "./modules/side-log";
import { atomChainsSelected, atomGlobalChainCurrent } from "./modules/store";
import { ScriptDialog } from "./script-dialog"; import { ScriptDialog } from "./script-dialog";
export interface ProfileSideProps { export interface ProfileSideProps {
profile?: Profile.Item;
global?: boolean;
onClose: () => void; onClose: () => void;
} }
export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => { export const ProfileSide = ({ onClose }: ProfileSideProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [item, setItem] = useState<Profile.Item>(); const [item, setItem] = useState<Profile.Item>();
const handleEditChain = async (item?: Profile.Item) => { const isGlobalChainCurrent = useAtomValue(atomGlobalChainCurrent);
setItem(item);
const currentProfile = useAtomValue(atomChainsSelected);
const handleEditChain = async (_item?: Profile.Item) => {
setItem(_item);
setOpen(true); setOpen(true);
}; };
@@ -34,7 +38,9 @@ export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
<div className="text-xl font-bold">{t("Proxy Chains")}</div> <div className="text-xl font-bold">{t("Proxy Chains")}</div>
<div className="truncate"> <div className="truncate">
{global ? t("Global Proxy Chains") : profile?.name} {isGlobalChainCurrent
? t("Global Proxy Chains")
: currentProfile?.name}
</div> </div>
</div> </div>
@@ -46,11 +52,7 @@ export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
<div style={{ height: "calc(100% - 84px)" }}> <div style={{ height: "calc(100% - 84px)" }}>
<Allotment vertical defaultSizes={[1, 0]}> <Allotment vertical defaultSizes={[1, 0]}>
<Allotment.Pane snap> <Allotment.Pane snap>
<SideChain <SideChain onChainEdit={handleEditChain} />
global={global}
profile={profile}
onChainEdit={handleEditChain}
/>
</Allotment.Pane> </Allotment.Pane>
<Allotment.Pane minSize={40}> <Allotment.Pane minSize={40}>
@@ -61,7 +63,7 @@ export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
<ScriptDialog <ScriptDialog
open={open} open={open}
item={item} profile={item}
onClose={() => { onClose={() => {
setOpen(false); setOpen(false);
setItem(undefined); setItem(undefined);

View File

@@ -1,22 +1,60 @@
import { useAsyncEffect, useReactive } from "ahooks"; import { useAsyncEffect, useReactive } from "ahooks";
import { isEqual } from "lodash-es"; import { useEffect, useRef, useState } from "react";
import { useRef } from "react";
import { SelectElement, TextFieldElement, useForm } from "react-hook-form-mui"; import { SelectElement, TextFieldElement, useForm } from "react-hook-form-mui";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Divider } from "@mui/material"; import { Divider } from "@mui/material";
import { Profile, useClash } from "@nyanpasu/interface"; import { Profile, useClash } from "@nyanpasu/interface";
import { BaseDialog, BaseDialogProps } from "@nyanpasu/ui"; import { BaseDialog, BaseDialogProps } from "@nyanpasu/ui";
import LanguageChip from "./modules/language-chip";
import { ProfileMonacoView, ProfileMonacoViewRef } from "./profile-monaco-view"; import { ProfileMonacoView, ProfileMonacoViewRef } from "./profile-monaco-view";
import { getLanguage } from "./utils";
const formCommonProps = {
autoComplete: "off",
autoCorrect: "off",
fullWidth: true,
};
const optionTypeMapping = [
{
id: "js",
value: Profile.Type.JavaScript,
language: "javascript",
label: "JavaScript",
},
{
id: "lua",
value: Profile.Type.LuaScript,
language: "lua",
label: "LuaScript",
},
{
id: "merge",
value: Profile.Type.Merge,
language: "yaml",
label: "Merge",
},
];
const convertTypeMapping = (data: Profile.Item) => {
optionTypeMapping.forEach((option) => {
if (option.id === data.type) {
data.type = option.value;
}
});
return data;
};
export interface ScriptDialogProps extends Omit<BaseDialogProps, "title"> { export interface ScriptDialogProps extends Omit<BaseDialogProps, "title"> {
open: boolean; open: boolean;
onClose: () => void; onClose: () => void;
item?: Profile.Item; profile?: Profile.Item;
} }
export const ScriptDialog = ({ export const ScriptDialog = ({
open, open,
item, profile,
onClose, onClose,
...props ...props
}: ScriptDialogProps) => { }: ScriptDialogProps) => {
@@ -25,121 +63,120 @@ export const ScriptDialog = ({
const { getProfileFile, setProfileFile, createProfile, setProfiles } = const { getProfileFile, setProfileFile, createProfile, setProfiles } =
useClash(); useClash();
const optionTypeMapping = [ const form = useForm<Profile.Item>();
{
id: "js",
value: { script: "javascript" },
language: "javascript",
label: t("JavaScript"),
},
{
id: "lua",
value: { script: "lua" },
language: "lua",
label: t("LuaScript"),
},
{
id: "merge",
value: "merge",
language: "yaml",
label: t("Merge"),
},
];
const preprocessing = () => { const isEdit = Boolean(profile);
const result = optionTypeMapping.find((option) =>
isEqual(option.value, item?.type),
);
return { ...item, type: result?.id } as Profile.Item; useEffect(() => {
}; if (isEdit) {
form.reset(profile);
} else {
form.reset({
type: "merge",
chains: [],
name: "New Script",
desc: "",
});
}
}, [isEdit]);
const { control, watch, handleSubmit, reset } = useForm<Profile.Item>({ const [openMonaco, setOpenMonaco] = useState(false);
defaultValues: item
? preprocessing()
: {
type: "merge",
chains: [],
name: "New Script",
desc: "",
},
});
const profileMonacoViewRef = useRef<ProfileMonacoViewRef>(null); const profileMonacoViewRef = useRef<ProfileMonacoViewRef>(null);
const editor = useReactive({ const editor = useReactive<{
value: "", value: string;
language: "javascript", language: string;
rawType: Profile.Item["type"];
}>({
value: Profile.Template.merge,
language: "yaml",
rawType: "merge",
}); });
const handleTypeChange = () => { const onSubmit = form.handleSubmit(async (data) => {
const language = optionTypeMapping.find((option) => convertTypeMapping(data);
isEqual(option.id, watch("type")),
)?.language;
if (language) { const editorValue = profileMonacoViewRef.current?.getValue();
editor.language = language;
if (!editorValue) {
return;
} }
};
const isEdit = Boolean(item);
const commonProps = {
autoComplete: "off",
autoCorrect: "off",
fullWidth: true,
};
const onSubmit = handleSubmit(async (form) => {
const value = profileMonacoViewRef.current?.getValue() || "";
const type = optionTypeMapping.find((option) =>
isEqual(option.id, form.type),
)?.value;
const data = {
...form,
type,
} as Profile.Item;
try { try {
if (isEdit) { if (isEdit) {
await setProfiles(data.uid, data); await setProfiles(data.uid, data);
await setProfileFile(data.uid, value); await setProfileFile(data.uid, editorValue);
} else { } else {
await createProfile(data, value); await createProfile(data, editorValue);
} }
setTimeout(() => reset(), 300);
onClose();
} finally { } finally {
onClose();
} }
}); });
useAsyncEffect(async () => { useAsyncEffect(async () => {
editor.value = await getProfileFile(item?.uid); if (isEdit) {
editor.value = await getProfileFile(profile?.uid);
if (item) { editor.language = getLanguage(profile?.type)!;
reset(item);
} else { } else {
reset(); editor.value = Profile.Template.merge;
editor.language = "yaml";
} }
setOpenMonaco(open);
}, [open]); }, [open]);
const handleTypeChange = () => {
const data = form.getValues();
editor.rawType = convertTypeMapping(data).type;
const lang = getLanguage(editor.rawType);
if (!lang) {
return;
}
editor.language = lang;
switch (lang) {
case "yaml": {
editor.value = Profile.Template.merge;
break;
}
case "lua": {
editor.value = Profile.Template.luascript;
break;
}
case "javascript": {
editor.value = Profile.Template.javascript;
break;
}
}
};
return ( return (
<BaseDialog <BaseDialog
title={isEdit ? "Edit Script" : "New Script"} title={
<div className="flex gap-2">
<span>{isEdit ? "Edit Script" : "New Script"}</span>
<LanguageChip type={isEdit ? profile?.type : editor.rawType} />
</div>
}
open={open} open={open}
onClose={() => onClose()} onClose={() => onClose()}
onOk={onSubmit} onOk={onSubmit}
divider divider
contentStyle={{ contentStyle={{
height: "80vh", overflow: "hidden",
width: "90vw",
padding: 0, padding: 0,
}} }}
full
{...props} {...props}
> >
<div className="flex h-full"> <div className="flex h-full">
@@ -149,8 +186,8 @@ export const ScriptDialog = ({
<SelectElement <SelectElement
label={t("Type")} label={t("Type")}
name="type" name="type"
control={control} control={form.control}
{...commonProps} {...formCommonProps}
size="small" size="small"
required required
options={optionTypeMapping} options={optionTypeMapping}
@@ -161,8 +198,8 @@ export const ScriptDialog = ({
<TextFieldElement <TextFieldElement
label={t("Name")} label={t("Name")}
name="name" name="name"
control={control} control={form.control}
{...commonProps} {...formCommonProps}
size="small" size="small"
required required
/> />
@@ -170,8 +207,8 @@ export const ScriptDialog = ({
<TextFieldElement <TextFieldElement
label={t("Descriptions")} label={t("Descriptions")}
name="desc" name="desc"
control={control} control={form.control}
{...commonProps} {...formCommonProps}
size="small" size="small"
multiline multiline
/> />
@@ -183,7 +220,7 @@ export const ScriptDialog = ({
<ProfileMonacoView <ProfileMonacoView
className="w-full" className="w-full"
ref={profileMonacoViewRef} ref={profileMonacoViewRef}
open={open} open={openMonaco}
value={editor.value} value={editor.value}
language={editor.language} language={editor.language}
/> />

View File

@@ -1,3 +1,4 @@
import { isEqual } from "lodash-es";
import { Profile } from "@nyanpasu/interface"; import { Profile } from "@nyanpasu/interface";
export const filterProfiles = (items?: Profile.Item[]) => { export const filterProfiles = (items?: Profile.Item[]) => {
@@ -21,12 +22,12 @@ export const filterProfiles = (items?: Profile.Item[]) => {
}); });
}; };
const profiles = getItems(["local", "remote"]); const profiles = getItems([Profile.Type.Local, Profile.Type.Remote]);
const scripts = getItems([ const scripts = getItems([
"merge", Profile.Type.Merge,
{ script: "javascript" }, Profile.Type.JavaScript,
{ script: "lua" }, Profile.Type.LuaScript,
]); ]);
return { return {
@@ -34,3 +35,25 @@ export const filterProfiles = (items?: Profile.Item[]) => {
scripts, scripts,
}; };
}; };
export const getLanguage = (type: Profile.Item["type"], snake?: boolean) => {
switch (true) {
case isEqual(type, Profile.Type.JavaScript):
case isEqual(type, Profile.Type.JavaScript.script): {
return snake ? "JavaScript" : "javascript";
}
case isEqual(type, Profile.Type.LuaScript):
case isEqual(type, Profile.Type.LuaScript.script): {
return snake ? "Lua" : "lua";
}
case isEqual(type, Profile.Type.Merge): {
return snake ? "YAML" : "yaml";
}
default: {
return;
}
}
};

View File

@@ -20,6 +20,12 @@ export const SettingNyanpasuMisc = () => {
silent: "Silent", silent: "Silent",
}; };
const trayProxiesSelectorMode = {
normal: t("Normal"),
hidden: t("Hidden"),
submenu: t("Submenu"),
};
return ( return (
<BaseCard label={t("Nyanpasu Setting")}> <BaseCard label={t("Nyanpasu Setting")}>
<List disablePadding> <List disablePadding>
@@ -32,6 +38,17 @@ export const SettingNyanpasuMisc = () => {
} }
/> />
<MenuItem
label={t("Tray Proxies Selector")}
options={trayProxiesSelectorMode}
selected={nyanpasuConfig?.clash_tray_selector || "normal"}
onSelected={(value) =>
setNyanpasuConfig({
clash_tray_selector: value as "normal" | "hidden" | "submenu",
})
}
/>
<SwitchItem <SwitchItem
label={t("Auto Close Connections")} label={t("Auto Close Connections")}
{...createBooleanProps("auto_close_connection")} {...createBooleanProps("auto_close_connection")}
@@ -42,11 +59,6 @@ export const SettingNyanpasuMisc = () => {
{...createBooleanProps("enable_builtin_enhanced")} {...createBooleanProps("enable_builtin_enhanced")}
/> />
<SwitchItem
label={t("Enable Tray Proxies Selector")}
{...createBooleanProps("clash_tray_selector")}
/>
<SwitchItem <SwitchItem
label={t("Lighten up Animation Effects")} label={t("Lighten up Animation Effects")}
{...createBooleanProps("lighten_animation_effects")} {...createBooleanProps("lighten_animation_effects")}

View File

@@ -156,8 +156,13 @@
"Last Update": "Last Updated: {{fromNow}}", "Last Update": "Last Updated: {{fromNow}}",
"Update Rules Providers Success": "Update Rules Providers Success", "Update Rules Providers Success": "Update Rules Providers Success",
"Portable Update Error": "Portable Update is not supported, please download the latest version from the official website.", "Portable Update Error": "Portable Update is not supported, please download the latest version from the official website.",
"Enable Tray Proxies Selector": "Enable Tray Proxies Selector", "Tray Proxies Selector": "Tray Proxies Selector",
"Hidden": "Hidden",
"Normal": "Normal",
"Submenu": "Submenu",
"Proxy Set proxies": "{{rule}} proxies", "Proxy Set proxies": "{{rule}} proxies",
"Update Proxies Providers All": "Update Rules Proxies All", "Update Proxies Providers All": "Update Rules Proxies All",
"Lighten up Animation Effects": "Lighten up Animation Effects" "Lighten up Animation Effects": "Lighten up Animation Effects",
"Subscription": "Subscription",
"FetchError": "Failed to fetch {{content}} due to network issue. Please check your network connection and try again later."
} }

View File

@@ -142,5 +142,10 @@
"Update Rules Providers Success": "Провайдеры правил успешно обновлены", "Update Rules Providers Success": "Провайдеры правил успешно обновлены",
"Portable Update Error": "Обновление портативной версии не поддерживается", "Portable Update Error": "Обновление портативной версии не поддерживается",
"Enable Tray Proxies Selector": "Включить выбор прокси в трее" "Tray Proxies Selector": "Выбор прокси в трее",
"Hidden": "Скрыть",
"Normal": "Обычный",
"Submenu": "Подменю",
"Subscription": "подписка",
"FetchError": "Из-за проблем с сетью содержимое {{content}} невозможно получить. Пожалуйста, проверьте сетевое соединение или повторите попытку позже."
} }

View File

@@ -158,8 +158,13 @@
"Last Update": "{{fromNow}}更新", "Last Update": "{{fromNow}}更新",
"Update Rules Providers Success": "更新规则集成功", "Update Rules Providers Success": "更新规则集成功",
"Portable Update Error": "便携版无法自动更新,请到 Github 下载最新版本", "Portable Update Error": "便携版无法自动更新,请到 Github 下载最新版本",
"Enable Tray Proxies Selector": "开启托盘代理选择", "Tray Proxies Selector": "托盘代理选择",
"Hidden": "隐藏",
"Normal": "开启",
"Submenu": "子菜单",
"Proxy Set proxies": "{{rule}} 个节点", "Proxy Set proxies": "{{rule}} 个节点",
"Update Proxies Providers All": "全部更新", "Update Proxies Providers All": "全部更新",
"Lighten up Animation Effects": "减轻动画效果" "Lighten up Animation Effects": "减轻动画效果",
"Subscription": "订阅",
"FetchError": "由于网络问题,无法获取{{content}}内容。请检查网络连接或稍后再试。"
} }

View File

@@ -1,5 +1,9 @@
import { useState } from "react"; import { useAtom } from "jotai";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import {
atomChainsSelected,
atomGlobalChainCurrent,
} from "@/components/profiles/modules/store";
import NewProfileButton from "@/components/profiles/new-profile-button"; import NewProfileButton from "@/components/profiles/new-profile-button";
import ProfileItem from "@/components/profiles/profile-item"; import ProfileItem from "@/components/profiles/profile-item";
import ProfileSide from "@/components/profiles/profile-side"; import ProfileSide from "@/components/profiles/profile-side";
@@ -18,15 +22,15 @@ export const ProfilePage = () => {
const { profiles } = filterProfiles(getProfiles.data?.items); const { profiles } = filterProfiles(getProfiles.data?.items);
const [globalChain, setGlobalChain] = useState(false); const [globalChain, setGlobalChain] = useAtom(atomGlobalChainCurrent);
const [chainsSelected, setChainsSelected] = useAtom(atomChainsSelected);
const handleGlobalChainClick = () => { const handleGlobalChainClick = () => {
setChainsSelected(undefined); setChainsSelected(undefined);
setGlobalChain(!globalChain); setGlobalChain(!globalChain);
}; };
const [chainsSelected, setChainsSelected] = useState<Profile.Item>();
const onClickChains = (profile: Profile.Item) => { const onClickChains = (profile: Profile.Item) => {
setGlobalChain(false); setGlobalChain(false);
@@ -61,11 +65,7 @@ export const ProfilePage = () => {
sideClassName="!overflow-visible" sideClassName="!overflow-visible"
side={ side={
(globalChain || chainsSelected) && ( (globalChain || chainsSelected) && (
<ProfileSide <ProfileSide onClose={handleSideClose} />
profile={chainsSelected}
global={globalChain}
onClose={handleSideClose}
/>
) )
} }
> >

View File

@@ -29,6 +29,10 @@ export const containsSearchTerm = (obj: any, term: string): boolean => {
return false; return false;
}; };
export function formatError(err: unknown): string {
return `Error: ${err instanceof Error ? err.message : String(err)}`;
}
export function formatEnvInfos(envs: EnvInfos) { export function formatEnvInfos(envs: EnvInfos) {
let result = "----------- System -----------\n"; let result = "----------- System -----------\n";
result += `OS: ${envs.os}\n`; result += `OS: ${envs.os}\n`;

View File

@@ -6,6 +6,7 @@
"ps": "Copy Env (PS)", "ps": "Copy Env (PS)",
"sh": "Copy Env (sh)" "sh": "Copy Env (sh)"
}, },
"select_proxies": "Select Proxies",
"dashboard": "Dashboard", "dashboard": "Dashboard",
"direct_mode": "Direct Mode", "direct_mode": "Direct Mode",
"global_mode": "Global Mode", "global_mode": "Global Mode",

View File

@@ -6,6 +6,7 @@
"ps": "复制环境变量(PS)", "ps": "复制环境变量(PS)",
"sh": "复制环境变量(sh)" "sh": "复制环境变量(sh)"
}, },
"select_proxies": "选择代理",
"dashboard": "打开面板", "dashboard": "打开面板",
"direct_mode": "直连模式", "direct_mode": "直连模式",
"global_mode": "全局模式", "global_mode": "全局模式",

View File

@@ -2,7 +2,7 @@
"manifest_version": 1, "manifest_version": 1,
"latest": { "latest": {
"mihomo": "v1.18.7", "mihomo": "v1.18.7",
"mihomo_alpha": "alpha-117cdd8", "mihomo_alpha": "alpha-e7e1400",
"clash_rs": "v0.1.20", "clash_rs": "v0.1.20",
"clash_premium": "2023-09-05-gdcc8d87" "clash_premium": "2023-09-05-gdcc8d87"
}, },
@@ -36,5 +36,5 @@
"darwin-x64": "clash-darwin-amd64-n{}.gz" "darwin-x64": "clash-darwin-amd64-n{}.gz"
} }
}, },
"updated_at": "2024-07-29T22:20:59.937Z" "updated_at": "2024-07-31T22:20:11.102Z"
} }

View File

@@ -88,7 +88,7 @@
"stylelint-order": "6.0.4", "stylelint-order": "6.0.4",
"stylelint-scss": "6.4.1", "stylelint-scss": "6.4.1",
"tailwindcss": "3.4.7", "tailwindcss": "3.4.7",
"tsx": "4.16.2", "tsx": "4.16.5",
"typescript": "5.5.4" "typescript": "5.5.4"
}, },
"packageManager": "pnpm@9.6.0", "packageManager": "pnpm@9.6.0",

View File

@@ -140,8 +140,8 @@ importers:
specifier: 3.4.7 specifier: 3.4.7
version: 3.4.7 version: 3.4.7
tsx: tsx:
specifier: 4.16.2 specifier: 4.16.5
version: 4.16.2 version: 4.16.5
typescript: typescript:
specifier: 5.5.4 specifier: 5.5.4
version: 5.5.4 version: 5.5.4
@@ -307,8 +307,8 @@ importers:
specifier: 1.77.8 specifier: 1.77.8
version: 1.77.8 version: 1.77.8
shiki: shiki:
specifier: 1.12.0 specifier: 1.12.1
version: 1.12.0 version: 1.12.1
tailwindcss-textshadow: tailwindcss-textshadow:
specifier: 2.1.3 specifier: 2.1.3
version: 2.1.3 version: 2.1.3
@@ -441,8 +441,8 @@ importers:
specifier: 2.23.2 specifier: 2.23.2
version: 2.23.2 version: 2.23.2
undici: undici:
specifier: 6.19.4 specifier: 6.19.5
version: 6.19.4 version: 6.19.5
packages: packages:
@@ -1669,8 +1669,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@shikijs/core@1.12.0': '@shikijs/core@1.12.1':
resolution: {integrity: sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==} resolution: {integrity: sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA==}
'@sindresorhus/is@4.6.0': '@sindresorhus/is@4.6.0':
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
@@ -5289,8 +5289,8 @@ packages:
shell-quote@1.8.1: shell-quote@1.8.1:
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
shiki@1.12.0: shiki@1.12.1:
resolution: {integrity: sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==} resolution: {integrity: sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg==}
side-channel@1.0.6: side-channel@1.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
@@ -5644,8 +5644,8 @@ packages:
tslib@2.6.2: tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
tsx@4.16.2: tsx@4.16.5:
resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
hasBin: true hasBin: true
@@ -5716,8 +5716,8 @@ packages:
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
engines: {node: '>=14.0'} engines: {node: '>=14.0'}
undici@6.19.4: undici@6.19.5:
resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==} resolution: {integrity: sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg==}
engines: {node: '>=18.17'} engines: {node: '>=18.17'}
unicorn-magic@0.1.0: unicorn-magic@0.1.0:
@@ -6892,8 +6892,8 @@ snapshots:
'@babel/runtime': 7.24.8 '@babel/runtime': 7.24.8
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1) '@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.6(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1) '@mui/material': 5.16.6(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/system': 5.16.5(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1) '@mui/system': 5.16.6(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.5(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1) '@mui/utils': 5.16.6(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/react-transition-group': 4.4.10 '@types/react-transition-group': 4.4.10
clsx: 2.1.1 clsx: 2.1.1
prop-types: 15.8.1 prop-types: 15.8.1
@@ -7217,7 +7217,7 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.17.2': '@rollup/rollup-win32-x64-msvc@4.17.2':
optional: true optional: true
'@shikijs/core@1.12.0': '@shikijs/core@1.12.1':
dependencies: dependencies:
'@types/hast': 3.0.4 '@types/hast': 3.0.4
@@ -11138,9 +11138,9 @@ snapshots:
shell-quote@1.8.1: {} shell-quote@1.8.1: {}
shiki@1.12.0: shiki@1.12.1:
dependencies: dependencies:
'@shikijs/core': 1.12.0 '@shikijs/core': 1.12.1
'@types/hast': 3.0.4 '@types/hast': 3.0.4
side-channel@1.0.6: side-channel@1.0.6:
@@ -11604,7 +11604,7 @@ snapshots:
tslib@2.6.2: {} tslib@2.6.2: {}
tsx@4.16.2: tsx@4.16.5:
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
get-tsconfig: 4.7.5 get-tsconfig: 4.7.5
@@ -11708,7 +11708,7 @@ snapshots:
dependencies: dependencies:
'@fastify/busboy': 2.1.1 '@fastify/busboy': 2.1.1
undici@6.19.4: {} undici@6.19.5: {}
unicorn-magic@0.1.0: {} unicorn-magic@0.1.0: {}

View File

@@ -20,6 +20,6 @@
"picocolors": "1.0.1", "picocolors": "1.0.1",
"tar": "7.4.3", "tar": "7.4.3",
"telegram": "2.23.2", "telegram": "2.23.2",
"undici": "6.19.4" "undici": "6.19.5"
} }
} }

View File

@@ -19,7 +19,7 @@ jobs:
echo ::set-output name=version::snapshot echo ::set-output name=version::snapshot
fi fi
echo ::set-output name=docker_platforms::linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/s390x echo ::set-output name=docker_platforms::linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/s390x,linux/riscv64
echo ::set-output name=docker_image::${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }} echo ::set-output name=docker_image::${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }}
# https://github.com/crazy-max/ghaction-docker-buildx # https://github.com/crazy-max/ghaction-docker-buildx

View File

@@ -106,6 +106,7 @@ func parseUsers(authFile string) (users []*url.Userinfo, err error) {
if err != nil { if err != nil {
return return
} }
defer file.Close()
scanner := bufio.NewScanner(file) scanner := bufio.NewScanner(file)
for scanner.Scan() { for scanner.Scan() {
line := strings.TrimSpace(scanner.Text()) line := strings.TrimSpace(scanner.Text())
@@ -175,7 +176,7 @@ func parseIP(s string, port string) (ips []string) {
} }
return return
} }
defer file.Close()
scanner := bufio.NewScanner(file) scanner := bufio.NewScanner(file)
for scanner.Scan() { for scanner.Scan() {
line := strings.TrimSpace(scanner.Text()) line := strings.TrimSpace(scanner.Text())

View File

@@ -382,8 +382,8 @@ define KernelPackage/phy-aquantia
TITLE:=Aquantia Ethernet PHYs TITLE:=Aquantia Ethernet PHYs
DEPENDS:=+kmod-libphy +kmod-hwmon-core +kmod-lib-crc-ccitt DEPENDS:=+kmod-libphy +kmod-hwmon-core +kmod-lib-crc-ccitt
KCONFIG:=CONFIG_AQUANTIA_PHY KCONFIG:=CONFIG_AQUANTIA_PHY
FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia.ko@lt6.6 \ FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia.ko@lt6.1 \
$(LINUX_DIR)/drivers/net/phy/aquantia/aquantia.ko@ge6.6 $(LINUX_DIR)/drivers/net/phy/aquantia/aquantia.ko@ge6.1
AUTOLOAD:=$(call AutoLoad,18,aquantia,1) AUTOLOAD:=$(call AutoLoad,18,aquantia,1)
endef endef
@@ -731,8 +731,7 @@ define KernelPackage/r8169
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +!LINUX_5_4:kmod-mdio-devres DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +!LINUX_5_4:kmod-mdio-devres
KCONFIG:= \ KCONFIG:= \
CONFIG_R8169 \ CONFIG_R8169 \
CONFIG_R8169_NAPI=y \ CONFIG_R8169_LEDS=y@ge6.6
CONFIG_R8169_VLAN=n
FILES:=$(LINUX_DIR)/drivers/net/ethernet/realtek/r8169.ko FILES:=$(LINUX_DIR)/drivers/net/ethernet/realtek/r8169.ko
AUTOLOAD:=$(call AutoProbe,r8169) AUTOLOAD:=$(call AutoProbe,r8169)
endef endef

View File

@@ -0,0 +1,58 @@
#
# Copyright (C) 2015-2016 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=leigod-acc
PKG_VERSION:=1.3.0.30
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
TITLE:=Powerful Leigod Game Accelerater
DEPENDS:=@(x86_64||arm||mipsel||aarch64)
URL:=https://www.leigod.com/
endef
define Package/$(PKG_NAME)/description
leigod-acc is a powerful game accelerater
endef
ifeq ($(ARCH),x86_64)
acc-arch:=amd64
endif
ifeq ($(ARCH),mipsel)
acc-arch:=mipsle
endif
ifeq ($(ARCH),arm)
acc-arch:=arm
endif
ifeq ($(ARCH),aarch64)
acc-arch:=arm64
endif
define Build/Prepare
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin/leigod
$(INSTALL_BIN) ./files/acc-gw.linux.$(acc-arch) $(1)/usr/sbin/leigod/acc-gw.linux.$(acc-arch)
$(INSTALL_BIN) ./files/leigod_uninstall.sh $(1)/usr/sbin/leigod/leigod_uninstall.sh
$(INSTALL_BIN) ./files/plugin_common.sh $(1)/usr/sbin/leigod/plugin_common.sh
$(INSTALL_BIN) ./files/update_plugin $(1)/usr/sbin/leigod/update_plugin
$(INSTALL_DATA) ./files/version $(1)/usr/sbin/leigod/version
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,24 @@
#!/bin/sh
# this script is use to install leigod plugin
ver_name="version"
init_file_name="acc"
binary_prefix="acc-gw.linux"
common_file_name="plugin_common.sh"
download_base_url="http://119.3.40.126/router_plugin"
# include common file
. ${common_file_name}
# preinstall_check
# check and set env
preinstall_check
if [ ${is_openwrt} ]; then
echo "remove openwrt config"
remove_openwrt_series_config
remove_openwrt_series_init
fi
# remove_binary remove binary
remove_binary

View File

@@ -0,0 +1,502 @@
# this script is use to install leigod plugin
# sbin_dir="/usr/sbin/leigod"
ver_name="version"
init_file_name="acc"
binary_prefix="acc-gw.linux"
common_file_name="plugin_common.sh"
uninstall_file_name="leigod_uninstall.sh"
download_base_url="http://119.3.40.126/router_plugin"
# get_device_os
# current support os: Linux
get_device_os() {
os=$(uname)
if [ $? == "0" ]; then
return 0
fi
echo "os cant be get"
return -1
}
# get_device_arch,
# current support arch: arm64 arm x86_64 mips
get_device_arch() {
arch=$(uname -m)
if [ $? == "0" ]; then
return 0
fi
echo "arch cant be get"
return -1
}
# get_xiaomi_name check if is xiaomi
get_xiaomi_name() {
local name=$(uci get misc.hardware.displayName)
if [[ $? == "0" && ${name} != "" ]]; then
echo "router is xiaomi series, name: ${name}"
sbin_dir="/userdisk/appdata/leigod"
init_dir="/userdisk/appdata/leigod"
is_xiaomi=true
return 0
fi
local name=$(uci get misc.hardware.model)
if [[ $? == "0" && ${name} != "" ]]; then
echo "router is xiaomi series, name: ${name}"
sbin_dir="/userdisk/appdata/leigod"
init_dir="/userdisk/appdata/leigod"
is_xiaomi=true
return 0
fi
local name=$(uci get misc.hardware.model)
if [[ $? == "0" && ${name} != "" ]]; then
echo "router is xiaomi series, name: ${name}"
sbin_dir="/userdisk/appdata/leigod"
init_dir="/userdisk/appdata/leigod"
is_xiaomi=true
return 0
fi
echo "router is not xiaomi, use general openwrt"
sbin_dir="/usr/sbin/leigod"
init_dir="/etc/init.d"
# stop openwrt service first
echo "stop openwrt acc service first, in casue install failed"
/etc/init.d/acc stop
sleep 1
show_openwrt_suggestion
return 0
}
# get_asus_name get asus name
get_merlin_party() {
if [[ -d "/koolshare" ]]; then
echo "router is merlin series, name: $(nvram get build_name)"
nvram set 3rd-party=merlin
is_merlin=true
sbin_dir="/koolshare/leigod/acc"
init_dir="/koolshare/init.d"
echo "message"
return 0
elif [[ -d "/jffs/softcenter" ]]; then
echo "router is swrt series, name: $(nvram get build_name)"
is_swrt=true
nvram set 3rd-party=swrt
sbin_dir="/jffs/softcenter/leigod/acc"
init_dir="/jffs/softcenter/init.d"
return 0
fi
# check merlin
echo "route is not merlin, use general asus"
return 0
}
# get_device_firmware get device firmware
# current support firmware: openwrt merlin
get_device_firmware() {
# openwrt file exist
if [ -f "/etc/openwrt_release" ]; then
echo "firmware is openwrt series"
is_openwrt=true
get_xiaomi_name
elif [[ -f "/etc/image_version" ]] || [[ -d "/koolshare" ]] || [[ -d "/jffs/softcenter" ]]; then
echo "firmware is asus series"
is_asus=true
echo "stop asus acc service first, in casue install failed"
PIDS=$(ps | grep acc | grep -v grep | awk '{print $1}')
# check if process exist
get_merlin_party
fi
}
# install_openwrt_package install openwrt
install_binary() {
# create sbin dir
mkdir -p ${sbin_dir}
# create name
local acc_name=${binary_prefix}.${arch}
local download_bin_url=${download_base_url}/${acc_name}
echo "install ${acc_name} to ${sbin_dir}"
# download file
curl -s -o ${sbin_dir}/${acc_name} ${download_bin_url}
if [ $? != "0" ]; then
echo "download and install binary failed"
return -1
fi
echo "install binary success"
chmod +x ${sbin_dir}/${acc_name}
if [ $? != "0" ]; then
echo "add binary permission failed"
return -1
fi
echo "add acc binary permission success"
# download common file
local download_common_url=${download_base_url}/${common_file_name}
curl -s -o ${sbin_dir}/${common_file_name} ${download_common_url}
if [ $? != "0" ]; then
echo "download and install common file failed"
return -1
fi
# remote uninstall_file_name
local remote_uninstall_file_name=${download_base_url}/"plugin_uninstall.sh"
curl -s -o ${sbin_dir}/${uninstall_file_name} ${remote_uninstall_file_name}
if [ $? != "0" ]; then
echo "download and install uninstall file failed"
return -1
fi
echo "add uninstall permission success"
local ver_file=${sbin_dir}/${ver_name}
touch ${ver_file}
if [ $? != "0" ]; then
echo "create version file failed"
return -1
fi
# add version to file
echo "version=1.3.0.30" > ${ver_file}
echo "add version file success"
}
# remove_binary remove binary
remove_binary() {
rm -r ${sbin_dir}
}
# install xiaomi monitor
install_xiaomi_monitor() {
local cron_path="/etc/crontabs/root"
local monitor_file_name="plugin_monitor.sh"
local download_monitor_url=${download_base_url}/${monitor_file_name}
curl -o ${sbin_dir}/${monitor_file_name} ${download_monitor_url}
if [ $? != "0" ]; then
echo "download monitor file failed"
return -1
fi
chmod +x ${sbin_dir}/${monitor_file_name}
# download
echo "download monitor file success"
echo "*/1 * * * * ${sbin_dir}/${monitor_file_name}" >> ${cron_path}
if [ $? != "0" ]; then
echo "add monitor to cron failed"
return -1
fi
echo "add monitor to cron success"
}
# install_openwrt_series_config save openwrt config
install_openwrt_series_config() {
# create accelerator config
touch /etc/config/accelerator
if [ $? != "0" ]; then
echo "make acc config file failed"
return -1
fi
if [ ${install_env} == "test" ]; then
# use uci to add config
uci set accelerator.base=system
uci set accelerator.bind=bind
uci set accelerator.device=hardware
uci set accelerator.Phone=acceleration
uci set accelerator.PC=acceleration
uci set accelerator.Game=acceleration
uci set accelerator.Unknown=acceleration
uci set accelerator.base.url='https://test-opapi.nn.com/speed/router/plug/check'
uci set accelerator.base.heart='https://test-opapi.nn.com/speed/router/heartbeat'
uci set accelerator.base.base_url='https://test-opapi.nn.com/speed'
uci commit accelerator
elif [ ${install_env} == "test1" ]; then
# use uci to add config
uci set accelerator.base=system
uci set accelerator.bind=bind
uci set accelerator.device=hardware
uci set accelerator.Phone=acceleration
uci set accelerator.PC=acceleration
uci set accelerator.Game=acceleration
uci set accelerator.Unknown=acceleration
uci set accelerator.base.url='https://test1-opapi.nn.com/speed/router/plug/check'
uci set accelerator.base.heart='https://test1-opapi.nn.com/speed/router/heartbeat'
uci set accelerator.base.base_url='https://test1-opapi.nn.com/speed'
uci commit accelerator
else
# use uci to add config
uci set accelerator.base=system
uci set accelerator.bind=bind
uci set accelerator.device=hardware
uci set accelerator.Phone=acceleration
uci set accelerator.PC=acceleration
uci set accelerator.Game=acceleration
uci set accelerator.Unknown=acceleration
uci set accelerator.base.url='https://opapi.nn.com/speed/router/plug/check'
uci set accelerator.base.heart='https://opapi.nn.com/speed/router/heartbeat'
uci set accelerator.base.base_url='https://opapi.nn.com/speed'
uci commit accelerator
fi
if [ $? != "0" ]; then
echo "create openwrt config unit failed"
return -1
fi
echo "create openwrt config unit success"
}
# install_openwrt_series_luasrc install openwrt lua src
install_openwrt_series_luasrc() {
lua_base="/usr/lib/lua/luci"
# download index file
curl --create-dirs -o ${lua_base}/controller/acc.lua ${download_base_url}/openwrt/controller/acc.lua
if [ $? != "0" ]; then
echo "download acc.lua failed"
return -1
fi
# download service view file
curl --create-dirs -o ${lua_base}/model/cbi/leigod/service.lua ${download_base_url}/openwrt/model/cbi/leigod/service.lua
if [ $? != "0" ]; then
echo "download service.lua failed"
return -1
fi
# download device view file
curl --create-dirs -o ${lua_base}/model/cbi/leigod/device.lua ${download_base_url}/openwrt/model/cbi/leigod/device.lua
if [ $? != "0" ]; then
echo "download device.lua failed"
return -1
fi
# download notice view file
curl --create-dirs -o ${lua_base}/model/cbi/leigod/notice.lua ${download_base_url}/openwrt/model/cbi/leigod/notice.lua
if [ $? != "0" ]; then
echo "download notice.lua failed"
return -1
fi
# download service view file
curl --create-dirs -o ${lua_base}/view/leigod/notice.htm ${download_base_url}/openwrt/view/leigod/notice.htm
if [ $? != "0" ]; then
echo "download notice.htm failed"
return -1
fi
# download service view file
curl --create-dirs -o ${lua_base}/view/leigod/service.htm ${download_base_url}/openwrt/view/leigod/service.htm
if [ $? != "0" ]; then
echo "download service.htm failed"
return -1
fi
# download service translate file
curl --create-dirs -o ${lua_base}/i18n/acc.zh-cn.lmo ${download_base_url}/openwrt/po/zh-cn/acc.zh-cn.lmo
if [ $? != "0" ]; then
echo "download acc.zh-cn.lmo failed"
return -1
fi
echo "download lua src success"
}
install_openwrt_series_web() {
local luci_base="/usr/lib/lua/luci"
}
# remove_openwrt_series_config remove openwrt config
remove_openwrt_series_config() {
rm /etc/config/accelerator
}
# install asus series config
install_asus_series_config() {
mkdir -p ${sbin_dir}/config
if [ ${install_env} == "test" ]; then
# install test asus config
echo "
[base]
url="https://test-opapi.nn.com/speed/router/plug/check"
channel="2"
appid="nnMobile_d0k3duup"
heart="https://test-opapi.nn.com/speed/router/heartbeat"
base_url="https://test-opapi.nn.com/speed"
[update]
domain="https://test-opapi.nn.com/nn-version/version/plug/upgrade"
[device]
" > ${sbin_dir}/config/accelerator
elif [ ${install_env} == "test1" ]; then
# install test1 asus config
echo "
[base]
url="https://test1-opapi.nn.com/speed/router/plug/check"
channel="2"
appid="nnMobile_d0k3duup"
heart="https://test1-opapi.nn.com/speed/router/heartbeat"
base_url="https://test1-opapi.nn.com/speed"
[update]
domain="https://test1-opapi.nn.com/nn-version/version/plug/upgrade"
[device]
" > ${sbin_dir}/config/accelerator
else
# install formel asus config
echo "
[base]
url="https://opapi.nn.com/speed/router/plug/check"
channel="2"
appid="nnMobile_d0k3duup"
heart="https://opapi.nn.com/speed/router/heartbeat"
base_url="https://opapi.nn.com/speed"
[update]
domain="https://opapi.nn.com/nn-version/version/plug/upgrade"
[device]
" > ${sbin_dir}/config/accelerator
fi
echo "create asus series config success"
}
# remove_asus_series_config remove asus config
remove_asus_series_config() {
rm -r ${init_dir}
}
# install_openwrt_init install openwrt to init
install_openwrt_series_init() {
local remote_init_name="openwrt_init.sh"
local download_init_url=${download_base_url}/${remote_init_name}
# download init file
curl -o ${init_dir}/${init_file_name} ${download_init_url}
if [ $? != "0" ]; then
echo "download init file failed"
return -1
fi
echo "download init file success"
# add permission to file
chmod +x ${init_dir}/${init_file_name}
if [ $? != "0" ]; then
echo "add init permission failed"
return -1
fi
echo "add init file permission success"
${init_dir}/${init_file_name} enable
echo "set accelerator autostart success"
${init_dir}/${init_file_name} start
if [ $? != "0" ]; then
echo "start accelerator failed"
return -1
fi
echo "start accelerator success"
}
# remove_openwrt_series_init remove openwrt init
remove_openwrt_series_init() {
${init_dir}/${init_file_name} disable
${init_dir}/${init_file_name} stop
rm ${init_dir}/${init_file_name}
}
# install merlin init
install_merlin_init() {
local remote_init_name="asus_init.sh"
local download_init_url=${download_base_url}/${remote_init_name}
# download init file
curl -o ${sbin_dir}/${init_file_name} ${download_init_url}
if [ $? != "0" ]; then
echo "download init file failed"
return -1
fi
# add permission
chmod +x ${sbin_dir}/${init_file_name}
# create link
local link_init_name="S99LeigodAcc.sh"
local link_init_file=${init_dir}/${link_init_name}
ln -sf ${sbin_dir}/${init_file_name} ${link_init_file}
if [ $? != "0" ]; then
echo "create merlin init link failed"
return -1
fi
echo "create merlin link file success"
${link_init_file} start
echo "acc start success"
}
# show_openwrt_suggestion show openwrt install suggest
show_openwrt_suggestion() {
echo "
雷神OpenWrt插件安装建议:
当前雷神路由器支持两种加速模式,
1. tproxy加速模式(速度更快, CPU占用率更低)
2. tun加速模式(需要依赖少, 安装灵活)
需要您根据以上的加速模式, 安装对应的依赖库,
如下列出两种模式对应的安装依赖:
1. TProxy模式: libpcap iptables kmod-ipt-nat iptables-mod-tproxy kmod-ipt-tproxy kmod-netem(可选) tc-full(可选) kmod-ipt-ipset ipset curl
2. Tun模式: libpcap iptables kmod-tun kmod-ipt-nat kmod-ipt-ipset ipset curl
如何安装依赖:
1. 升级依赖: opkg update
2. 安装依赖: opkg install xxx
为了安装方便, 请选择一个模式, 复制以下命令到终端运行:
Tproxy模式:
opkg update
opkg install libpcap iptables kmod-ipt-nat iptables-mod-tproxy kmod-ipt-tproxy kmod-netem tc-full kmod-ipt-ipset ipset
Tun模式:
opkg update
opkg install libpcap iptables kmod-tun kmod-ipt-nat kmod-ipt-ipset ipset curl
关于steamdeck的支持说明
steamdeck设备请选择加速电脑游戏
关于手机设备的支持:
1. 安卓支持说明
当前代理仅支持ipv4代理, 请更改dhcp配置更改完配置请重启路由器
配置路径在 /etc/config/dhcp
config dhcp 'lan'
... 此处是一些其他配置
ra 'disable'
dhcpv6 'disable'
list ra_flags 'none'
... 此处是一些其他配置
2. 关于ios设备的支持说明
ios设备, 安装完插件后, 为了精准识别, 请在ios上选择忘记wifi, 然后重新连接即可
"
}
# preinstall_check check env
preinstall_check() {
# check os
get_device_os
if [ ${os} != "Linux" ]; then
echo "current os not support, os: ${os}"
return -1
fi
# check arch
get_device_arch
if [[ ${arch} != "x86_64" && ${arch} != "aarch64" && ${arch} != "arm" && ${arch} != "mips" && ${arch} != "armv7l" ]];then
echo "current arch not support, arch: ${arch}"
return -1
fi
# fix arch
if [ ${arch} == "x86_64" ]; then
echo "match x86_64 -> amd64"
arch="amd64"
elif [ ${arch} == "aarch64" ]; then
echo "match aarch64 -> arm64"
arch="arm64"
elif [ ${arch} == "mips" ]; then
echo "match mips -> mipsle"
arch="mipsle"
elif [ ${arch} == "armv7l" ]; then
arch="arm"
fi
# support plugin
echo "current system support plugin, system: ${os}-${arch}"
get_device_firmware
return 0
}
# show_install_success show install has been installed
show_install_success() {
echo "install success"
echo "雷神路由器插件安装已完成"
echo "请加群632342113体验"
}

View File

@@ -0,0 +1,175 @@
#!/usr/bin/lua
local util = require "luci.util"
local string = require "string"
local io = require "io"
local json = require "luci.jsonc"
local uci = require "luci.model.uci".cursor()
local client = require "luci.httpclient"
local helper = require "luci.helper"
-- get cloud version
function get_cloud_version()
-- get cloud url
local url = uci:get("easyupdate", "main", "domain")
-- get request channel
local channel = uci:get("easyupdate", "main", "channel")
-- appid
local appid = uci:get("easyupdate", "main", "appid")
-- read brand and model from file
local brand, model = helper.get_board_info()
-- platfrom
local platform = 11
-- create http request options
local options = {}
-- create http request method
options.method = "POST"
-- create http request headers
options.headers = {}
options.headers['appId'] = appid
options.headers['reqChannel'] = channel
options.headers['Content-Type'] = 'application/json'
-- create http request body
local body = {
--
['appId'] = 'spRouterPlugin_fhem2shgq9s5',
['brand'] = brand,
['model'] = model,
['platform'] = platform,
}
-- marshal to json
local buf = util.serialize_json(body)
options.body = buf
-- begin to query
local status, _, buffer, _ = client.request_raw(url, options)
-- check if query success
if not status then
io.write("status is nil \n")
return ""
end
-- check if request success
if status ~= 200 and status ~=206 then
io.write("status is not success, status: " .. status .. "\n")
return ""
end
-- begin to parse response
local info = json.parse(buffer)
-- get ret data
local data = info['retData']
-- check if data is nil
if data == nil then
io.write("response ret data is nil \n")
return ""
end
-- store url in config
local fw_url = data['url']
local version = data['versionName']
io.write("fw_url: " .. fw_url .. ", version: " .. version .. "\n")
-- get version success
return version, fw_url
end
-- get local version
function get_local_version()
-- run command to get acc version
local cmd = 'opkg info acc'
local buf = util.exec(cmd)
-- check exec result
if buf == nil then
io.write("exec command failed \n")
return ""
end
io.write("buf: " .. buf .. "\n")
-- read line
for line in string.gmatch(buf, "[^\r\n]+") do
io.write("read line: " .. line .. "\n")
line = string.gsub(line, " ", "")
local valueSl = string.gmatch(line, "[^:]+")
local key = valueSl()
local value = valueSl()
if key == "Version" then
io.write("get local version: " .. value .. "\n")
return value
end
end
io.write("local version cant found \n")
end
-- get file base name
function get_file_base_name(filepath)
local name = string.gmatch(filepath, "([^/]+)$")
io.write("get file base name: " .. name .. "\n")
return name
end
-- download cloud version
function download_cloud_app(url, name)
io.write("download app, url: " .. url .. ", name: " .. name .. "\n")
-- run download
local cmd = 'curl -s -o /tmp/' .. name ..' -w %{http_code}' .. ' ' .. url
-- exec download
local code = util.exec(cmd)
if code ~= "200" then
io.write("download cloud app failed, code: " .. code .. "\n")
return false
end
io.write("download cloud app success \n")
return code
end
-- install package name in tmp dir
function install_package(name)
io.write("install package, package name: " .. name .. "\n")
local cmd = "opkg install " .. "/tmp/" .. name .. " " .. "--force-overwrite"
local code = util.exec(cmd)
io.write("install package finish, package name: " .. name .. "\n")
return code
end
-- remove pkg
function remove_pkg(name)
io.write("remove package, package name: " .. name .. "\n")
local cmd = "rm -rf " .. "/tmp/" .. name
local code = util.exec(cmd)
io.write("remove package finish, package name: " .. name .. "\n")
return code
end
-- check network state
io.write("check network state \n")
while true do
local state_code = helper.get_network_state()
if state_code == 200 then
io.write("network available \n")
break
end
if state_code ~= nil then
io.write("network is not available, code: " .. state_code .. "\n")
end
end
io.write("network success")
-- exec command
local local_version = get_local_version()
local cloud_version, url = get_cloud_version()
-- check if need update
if local_version >= cloud_version then
io.write("local version is new, dont need update, local ver: " .. local_version ..
", cloud version:" .. cloud_version .. "\n")
return
end
-- need update
io.write("local version is lower, need update, local version: " .. local_version ..
", cloud version: " .. cloud_version .. "\n")
-- download url
local name = "acc.ipk"
local result = download_cloud_app(url, name)
if not result then
return
end
-- install package
install_package(name)
remove_pkg(name)

View File

@@ -0,0 +1 @@
version=1.3.0.30

View File

@@ -0,0 +1,18 @@
#
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Luci for Leigod Game Accelerater
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+libpcap +iptables +kmod-ipt-nat +iptables-mod-tproxy +kmod-ipt-tproxy +kmod-tun +kmod-netem +tc-full +kmod-ipt-ipset +ipset +curl +miniupnpd +conntrack +conntrackd +leigod-acc
PKG_VERSION:=1
PKG_RELEASE:=2
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@@ -0,0 +1,74 @@
module("luci.controller.acc", package.seeall)
function index()
require("luci.i18n")
entry({ "admin", "services", "acc" }, alias("admin", "services", "acc", "service"), translate("Leigod Acc"), 50)
entry({ "admin", "services", "acc", "service" }, cbi("leigod/service"), translate("Leigod Service"), 30).i18n = "acc"
entry({ "admin", "services", "acc", "device" }, cbi("leigod/device"), translate("Leigod Device"), 50).i18n = "acc"
entry({ "admin", "services", "acc", "notice" }, cbi("leigod/notice"), translate("Leigod Notice"), 80).i18n = "acc"
entry({ "admin", "services", "acc", "status" }, call("get_acc_status")).leaf = true
entry({ "admin", "services", "acc", "start_acc_service" }, call("start_acc_service"))
entry({ "admin", "services", "acc", "stop_acc_service" }, call("stop_acc_service"))
end
-- get_acc_status get acc status
function get_acc_status()
-- util module
local util = require "luci.util"
local uci = require "luci.model.uci".cursor()
local translate = luci.i18n.translate
-- init result
local resp = {}
-- init state
resp.service = translate("Acc Service Disabled")
resp.state = {}
-- check if exist
local exist = util.exec("ps | grep acc-gw | grep -v grep")
-- check if program is running
if exist ~= "" then
resp.service = translate("Acc Service Enabled")
end
-- get uci
local results = uci:get_all("accelerator")
for _, typ in pairs({ "Phone", "PC", "Game", "Unknown" }) do
local state = uci:get("accelerator", typ, "state")
-- check state
local state_text = "None"
if state == nil or state == '0' then
elseif state == '1' then
state_text = translate("Acc Catalog Started")
elseif state == '2' then
state_text = translate("Acc Catalog Stopped")
elseif state == '3' then
state_text = translate("Acc Catalog Paused")
end
-- store text
resp.state[translate(typ .. "_Catalog")] = state_text
end
luci.http.prepare_content("application/json")
luci.http.write_json(resp)
end
-- start_acc_service
function start_acc_service()
-- util module
local util = require "luci.util"
util.exec("/etc/init.d/acc enable")
util.exec("/etc/init.d/acc restart")
local resp = {}
resp.result = "OK"
luci.http.prepare_content("application/json")
luci.http.write_json(resp)
end
-- start_acc_service
function stop_acc_service()
-- util module
local util = require "luci.util"
util.exec("/etc/init.d/acc stop")
util.exec("/etc/init.d/acc disable")
local resp = {}
resp.result = "OK"
luci.http.prepare_content("application/json")
luci.http.write_json(resp)
end

View File

@@ -0,0 +1,157 @@
local uci = require "luci.model.uci".cursor()
local util = require "luci.util"
local fs = require "nixio.fs"
local pairs = pairs
local io = io
-- config
m = Map("accelerator")
m.title = translate("Leigod Device Config")
m.description = translate("Control Device Config")
-- get neigh info
neigh = m:section(NamedSection, "base", "system", translate("Neigh Device"))
neigh_tab = neigh:option(ListValue, "neigh", translate("acc interface"))
local sys_dir = util.exec("ls /sys/class/net")
if sys_dir ~= nil then
neigh_tab:value("br-lan")
for ifc in string.gmatch(sys_dir, "[^\n]+") do
neigh_tab:value(ifc)
end
end
-- range all device
device = m:section(NamedSection, "device", "hardware", translate("Device Info"))
device:tab("none_catalog", translate("None_Catalog"))
device:tab("phone_catalog", translate("Phone_Catalog"))
device:tab("pc_catalog", translate("PC_Catalog"))
device:tab("game_catalog", translate("Game_Catalog"))
device:tab("vr_catalog", translate("VR_Catalog"))
device:tab("unknown_catalog", translate("Unknown_Catalog"))
local dhcp_map = {}
-- check dhcp file
if fs.access("/tmp/dhcp.leases") then
for line in io.lines("/tmp/dhcp.leases") do
-- check if read empty line
if line == "" then
break
end
-- split line
local valueSl = string.gmatch(line, "[^ ]+")
-- read time
valueSl()
-- read mac
local mac = valueSl()
-- get ip
local ip = valueSl()
-- get host name
local hostname = valueSl()
-- key
local key = string.gsub(mac, ":", "")
-- store key
dhcp_map[key] = {
["key"] = key,
["mac"] = mac,
["ip"] = ip,
["name"] = hostname
}
end
end
ifc = uci:get("accelerator", "base", "neigh")
if ifc == nil then
ifc = "br-lan"
end
local arp_map = {}
-- check if arp exist
if fs.access("/proc/net/arp") then
-- read all item from arp
for line in io.lines("/proc/net/arp") do
-- check if line is not exist
if line == "" then
break
end
-- split item
local valueSl = string.gmatch(line, "[^ ]+")
-- get ip
local ip = valueSl()
-- get type
valueSl()
-- get flag
local flag = valueSl()
-- get mac
local mac = valueSl()
-- get mask
valueSl()
-- get device
local dev = valueSl()
-- get key
local key = string.gsub(mac, ":", "")
-- check if device and flag state
if dev == ifc and flag == "0x2" then
-- get current name
local name = mac
if dhcp_map[key] ~= nil and dhcp_map[key] ~= "*" then
name = dhcp_map[key].name
end
arp_map[key] = {
["key"] = key,
["mac"] = mac,
["ip"] = ip,
["name"] = name
}
end
end
end
-- get device config
for key, item in pairs(arp_map) do
local typ = uci:get("accelerator", "device", key)
-- get device catalog from type
local catalog = "none_catalog"
-- default to unknown device
if typ == nil then
typ = 9
else
typ = tonumber(typ)
end
if typ == nil then
catalog = "unknown_catalog"
elseif typ >= 1 and typ <= 3 then
catalog = "game_catalog"
elseif typ >= 4 and typ <= 6 then
catalog = "pc_catalog"
elseif typ >= 7 and typ <= 8 then
catalog = "phone_catalog"
elseif typ >= 20 and typ <= 21 then
catalog = "vr_catalog"
else
catalog = "unknown_catalog"
end
-- device type
device_typ = device:taboption(catalog, ListValue, key, item.name)
device_typ:value("0", "None")
device_typ:value("1", "XBox")
device_typ:value("2", "Switch")
device_typ:value("3", "Play Station")
device_typ:value("4", "Steam Deck")
device_typ:value("5", "Windows")
device_typ:value("6", "MacBook")
device_typ:value("7", "Android")
device_typ:value("8", "iPhone")
device_typ:value("20", "Oculus")
device_typ:value("21", "HTC Vive")
device_typ:value("22", "Pico")
device_typ:value("9", "Unknown")
end
-- set
device.write = function()
util.exec("/etc/init.d/acc restart")
end
return m

View File

@@ -0,0 +1,10 @@
local uci = require "luci.model.uci".cursor()
-- config
m = Map("accelerator")
m.title = translate("Leigod Notice")
m.description = translate("Leigod Accelerator Usage")
m:section(SimpleSection).template = "leigod/notice"
return m

View File

@@ -0,0 +1,10 @@
local uci = require "luci.model.uci".cursor()
-- config
m = Map("accelerator")
m.title = translate("Leigod Accelerator Config")
m.description = translate("Control Accelerator Config")
m:section(SimpleSection).template = "leigod/service"
return m

View File

@@ -0,0 +1,74 @@
<fieldset>
<legend><%:Declare%></legend>
此插件为 LEDE/QWRT 官方合作版插件, 需要配合雷神手机APP使用
</p>
<legend><%:Upgrade Info%></legend>
<p>
2024-8-1 <br>
支持LEDE/QWRT性能优化 <br>
2024-7-25 <br>
支持非桥接模式下的旁路由 <br>
2024-6-5 <br>
扩充ipset容量, 以支持大容量代理ip库 <br>
2024-1-22 <br>
新增自动选择低延迟线路 <br>
新增下载不限速(switch除外) <br>
设备名为*时, 显示mac地址 <br>
<hr/>
2023-11-28 <br>
新增对mips设备的支持 <br>
新增对旁路由的支持 <br>
解决翻译异常的问题 <br>
设备管理页面可以显示未识别设备 <br>
</p>
<legend><%:Install Dependence%></legend>
<p>
插件运行需要借助一些依赖才能运行, 一般第三方固件默认已经集成了大部分的依赖, <br>
如果使用的是openwrt官方的固件, 则需要确保依赖安装好了, 以下列出依赖包和注意事项 <br>
libpcap <br>
iptables <br>
kmod-ipt-nat <br>
iptables-mod-tproxy <br>
kmod-ipt-tproxy <br>
kmod-netem(非必须, 针对于一些icmp测速的游戏使用, 只影响界面显示, 实际游戏效果不影响) <br>
tc-full(非必须, 同kmod-netem) <br>
kmod-ipt-ipset <br>
ipset <br>
curl(谨慎更新, 某些三方固件升级curl, 会导致curl出现问题) <br>
</p>
<legend><%:Bridge Mode%></legend>
<p>
加速插件无法探知当前插件应该使用什么模式, <br>
当前默认使用网桥作为流量转发的设备, <br>
如果使用旁路由模式或者docker时, 此时默认设备不是网桥, <br>
此时需要手动调整接口, <br>
改变接口的地址在 设备管理->路由设备, 选择对应的设备 <br>
</p>
<legend><%:Acc Mode%></legend>
<p>
当前雷神路由器支持两种加速模式, tproxy 和 tun <br>
当前默认采用的是tproxy模式, 原因在于tproxy有更好的性能<br>
tun模式暂时屏蔽, 后续luci会完善一键切换模式
</p>
<legend><%:Acc Usage%></legend>
<p>
当前雷神加速插件是根据设备类型进行加速的, 也就是说, 如果加速了相应的类型后, 理论上只要连接该路由器的设备都将获得加速效果<br>
当前支持的设备类型有以下几种: <br>
手机: Android iPhone <br>
电脑: Windows MacOS SteamDeck <br>
主机: XBox Switch PlayStation <br>
未识别: Others <br>
可以在设备管理中, 插件自己的设备是否被成功识别成对应的设备, 如果不是, 可以选择对应的设备, 这样设备就能成功加速了 <br>
</p>
<p>
一些特殊的说明: <br>
关于ios设备, 最好是在安装插件之前, 先忘记网络, 等安装完插件后, 再重新连接网络 <br>
关于android设备, 需要关闭dhcpv6后, 手机重连网络, 以下给出一个 /etc/config/dhcp 的配置 <br>
config dhcp 'lan' <br>
... 此处是一些其他配置 <br>
ra 'disable' <br>
dhcpv6 'disable' <br>
list ra_flags 'none' <br>
... 此处是一些其他配置 <br>
</p>
</fieldset>

View File

@@ -0,0 +1,61 @@
<!-- acc service state -->
<fieldset class="cbi-section">
<table class="cbi-section-table" id="acc_service_state_table">
<tr class="cbi-section-table-title">
<th class="cbi-section-table-cell"><%:Acc_Service_Name%></th>
<th class="cbi-section-table-cell"><%:Acc_Service_Status%></th>
<th class="cbi-section-table-cell"><%:Acc_Service_Operate%></th>
</tr>
<tr>
<td><%:Acc_Service%></td>
<td id="acc_service_state_cell"><%:Acc_Service_Status%></td>
<td id="acc_service_state_button"><%:Acc_Service_Operate%></td>
</tr>
</table>
</fieldset>
<!-- acc catalog state -->
<fieldset class="cbi-section">
<legend><%:Acc Catalog State%></legend>
<table class="cbi-section-table" id="acc_catalog_state_table">
<tr class="cbi-section-table-title">
<th class="cbi-section-table-cell"><%:Acc_Catalog%></th>
<th class="cbi-section-table-cell"><%:Acc_Catalog_Status%></th>
</tr>
</table>
</fieldset>
<script type="text/javascript">//<![CDATA[
// start acc service
function start_acc_service() {
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "acc", "start_acc_service")%>', null, function(x) {});
}
// start acc service
function stop_acc_service() {
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "acc", "stop_acc_service")%>', null, function(x) {});
}
XHR.poll(5, '<%=url('admin/services/acc/status')%>', null, function(x, st) {
var service_cell = document.getElementById("acc_service_state_cell");
var button_cell = document.getElementById("acc_service_state_button");
if (st && service_cell && button_cell) {
service_cell.innerHTML = st["service"];
if (st["service"] == "Acc Service Enabled" || st["service"] == "已启动" || st["service"] == "加速服务已启动")
button_cell.innerHTML = '<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Stop Acc Service%>" onclick="return stop_acc_service()"/>';
else
button_cell.innerHTML = '<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Start Acc Service%>" onclick="return start_acc_service()"/>';
}
var catalog_table = document.getElementById("acc_catalog_state_table");
if (st && catalog_table) {
while(catalog_table.rows.length > 1)
catalog_table.deleteRow(1);
var status_map = st["state"];
for (var typ in status_map) {
var tr = catalog_table.insertRow(-1);
tr.insertCell(-1).innerHTML = typ;
tr.insertCell(-1).innerHTML = status_map[typ];
}
}
});
//]]></script>

View File

@@ -0,0 +1,123 @@
msgid "Leigod Acc"
msgstr "雷神加速器"
msgid "Leigod Service"
msgstr "服务控制"
msgid "Leigod Device"
msgstr "设备管理"
msgid "Leigod Notice"
msgstr "加速公告"
msgid "Leigod Accelerator Config"
msgstr "加速器配置"
msgid "Control Accelerator Config"
msgstr "控制加速配置选项"
msgid "Acc_Service_Name"
msgstr "服务名称"
msgid "Acc_Service_Status"
msgstr "启动状态"
msgid "Acc_Service_Operate"
msgstr "加速设置"
msgid "Acc Catalog State"
msgstr "加速状态"
msgid "Acc_Catalog"
msgstr "加速设备"
msgid "Acc_Catalog_Status"
msgstr "加速状态"
msgid "Declare"
msgstr "说明"
msgid "Upgrade Info"
msgstr "更新内容"
msgid "Install Dependence"
msgstr "安装依赖"
msgid "Bridge Mode"
msgstr "旁路由模式"
msgid "Acc Mode"
msgstr "加速模式"
msgid "Acc Usage"
msgstr "使用说明"
msgid "Leigod Accelerator Usage"
msgstr "雷神加速插件使用"
msgid "Leigod Device Config"
msgstr "设备管理配置"
msgid "Control Device Config"
msgstr "控制和改变设备类型"
msgid "Neigh Device"
msgstr "路由设置"
msgid "acc interface"
msgstr "代理接口"
msgid "Device Info"
msgstr "设备信息"
msgid "None_Catalog"
msgstr "未分类设备"
msgid "Phone_Catalog"
msgstr "手机设备"
msgid "None_Catalog"
msgstr "未分类设备"
msgid "None"
msgstr "无数据"
msgid "PC_Catalog"
msgstr "PC 设备"
msgid "Game_Catalog"
msgstr "游戏机"
msgid "VR_Catalog"
msgstr "VR 设备"
msgid "Unknown_Catalog"
msgstr "未识别设备"
msgid "acc_service"
msgstr "雷神加速器服务"
msgid "Acc_Service"
msgstr "雷神加速器服务"
msgid "Stop Acc Service"
msgstr "停止加速服务"
msgid "Start Acc Service"
msgstr "启动加速服务"
msgid "Acc Service Disabled"
msgstr "加速服务已被禁用"
msgid "Acc Service Enabled"
msgstr "已启动"
msgid "Acc Catalog Started"
msgstr "该设备类别加速已启用"
msgid "Acc Catalog Stopped"
msgstr "该设备类别加速已停止"
msgid "Acc Catalog Paused"
msgstr "该设备类别加速已暂停"

View File

@@ -0,0 +1,18 @@
config system 'base'
option url 'https://opapi.nn.com/speed/router/plug/check'
option heart 'https://opapi.nn.com/speed/router/heartbeat'
option base_url 'https://opapi.nn.com/speed'
config bind 'bind'
config hardware 'device'
config acceleration 'Phone'
config acceleration 'PC'
config acceleration 'Game'
config acceleration 'Unknown'

View File

@@ -0,0 +1,162 @@
#!/bin/sh /etc/rc.common
# start prio
START=50
# use proc to start service
USE_PROCD=1
# package name
PACKAGE_NAME="acc.ipk"
# binary dir
sbin_dir="/usr/sbin/leigod"
# binary name
binary_prefix="acc-gw.linux"
# download acceleration binary
download_acc_binary() {
echo "begin to download file... ..."
# create download
local url="http://119.3.40.126/${PACKAGE_NAME}"
echo "download path: ${url}"
local path="/tmp/${PACKAGE_NAME}"
local code=$(curl --connect-timeout 2 -L -s -k -o "${path}" -w "%{http_code}" "${url}")
for i in $(seq 1 2)
do
if [ "$?" != "0" -o "${code}" != "200" -o ! -f "${path}" ]; then
echo "download failed: ${code}"
rm -f ${path}
sleep 5
continue
fi
echo "download success"
break
done
echo "download file success... ..."
}
# mkdir acc dir
mk_acc_dir() {
echo "begin to mkdir... ..."
# should make sure dir exist
local cmd="mkdir -p ${BINARY_DIR}"
echo "exec mkdir dir: ${cmd}"
local code=`$cmd`
echo "mkdir success... ..."
}
# decompress file
decompress_file() {
echo "begin to decompress file... ..."
# compress file path
local path="/tmp/${PACKAGE_NAME}"
# decompress command
local cmd="tar -zxvf ${path} -C ${BINARY_DIR}"
local code=`${cmd}`
echo "decompress file success... ..."
}
# install ipk
install_package() {
echo "begin to overwrite package"
# local cmd = "opkg install /tmp/${PACKAGE_NAME} --force-overwrite"
# `$cmd`
echo "overwrite finish, begin to start"
}
# main
prepare_env() {
# mkdir
mk_acc_dir
# download file
download_acc_binary
# decompress file
install_package
}
main() {
prepare_env
}
# get_device_arch,
# current support arch: arm64 arm x86_64 mips
get_device_arch() {
arch=$(uname -m)
if [ $? != "0" ]; then
echo "arch cant be get"
return -1
fi
# fix arch
if [ ${arch} == "x86_64" ]; then
echo "match x86_64 -> amd64"
arch="amd64"
elif [ ${arch} == "aarch64" ]; then
echo "match aarch64 -> arm64"
arch="arm64"
elif [ ${arch} == "mips" ]; then
echo "match mips -> mipsle"
arch="mipsle"
elif [ ${arch} == "armv7l" ]; then
echo "match armv7l -> arm"
arch="arm"
fi
return 0
}
# get_xiaomi_name check if is xiaomi
get_xiaomi_name() {
local name=$(uci get misc.hardware.displayName)
if [[ $? == "0" && ${name} != "" ]]; then
echo "router is xiaomi series, name: ${name}"
sbin_dir="/userdisk/appdata/leigod"
init_dir="/userdisk/appdata/leigod"
args="--mode tun"
is_xiaomi=true
return 0
fi
local name=$(uci get misc.hardware.model)
if [[ $? == "0" && ${name} != "" ]]; then
echo "router is xiaomi series, name: ${name}"
sbin_dir="/userdisk/appdata/leigod"
init_dir="/userdisk/appdata/leigod"
args="--mode tun"
is_xiaomi=true
return 0
fi
echo "router is not xiaomi, use general openwrt"
sbin_dir="/usr/sbin/leigod"
init_dir="/etc/init.d"
show_openwrt_suggestion
return 0
}
# run service as daemon
start_service_daemon() {
# open once instance
procd_open_instance
# run binary
local cmd="${sbin_dir}/${binary_prefix}.${arch} ${args}"
echo "start service: ${cmd}"
procd_set_param command ${cmd}
# auto start when failed
procd_set_param respawn
# close instance
procd_close_instance
# start check update
# update_plugin &
# start led light
# /etc/init.d/internetled start
}
# proc start service
start_service() {
# prepare env
# prepare_env
# run service as daemon
get_device_arch
get_xiaomi_name
start_service_daemon
}

View File

@@ -0,0 +1,24 @@
#!/bin/sh
# check if file exist
if [ ! -f /etc/config/accelerator ]; then
echo "file not exist, should create..."
touch /etc/config/accelerator
uci set accelerator.base=system
uci set accelerator.device=hardware
uci set accelerator.Phone=acceleration
uci set accelerator.PC=acceleration
uci set accelerator.Game=acceleration
uci set accelerator.Unknown=acceleration
uci commit accelerator
fi
uci set accelerator.base.url='https://opapi.nn.com/speed/router/plug/check'
uci set accelerator.base.heart='https://opapi.nn.com/speed/router/heartbeat'
uci set accelerator.base.base_url='https://opapi.nn.com/speed'
uci commit accelerator
echo "Fistboot Disable "
/etc/init.d/acc stop
/etc/init.d/acc disable

View File

@@ -16,14 +16,16 @@
package congestion package congestion
import ( import (
"fmt"
"math" "math"
"sync"
"time" "time"
"github.com/enfein/mieru/pkg/mathext" "github.com/enfein/mieru/pkg/mathext"
) )
const ( const (
InfiniteBandwidth int64 = math.MaxInt64 infiniteBandwidth int64 = math.MaxInt64
) )
// BandwidthSample contains a single data point of network bandwidth. // BandwidthSample contains a single data point of network bandwidth.
@@ -41,6 +43,10 @@ type BandwidthSample struct {
isAppLimited bool isAppLimited bool
} }
func (bs BandwidthSample) String() string {
return fmt.Sprintf("BandwidthSample{bandwidth=%v, rtt=%v, isAppLimited=%v}", bs.bandwidth, bs.rtt.Truncate(time.Microsecond), bs.isAppLimited)
}
// BandwidthSamplerInterface is an interface common to any class that can // BandwidthSamplerInterface is an interface common to any class that can
// provide bandwidth samples from the information per individual acknowledged packet. // provide bandwidth samples from the information per individual acknowledged packet.
type BandwidthSamplerInterface interface { type BandwidthSamplerInterface interface {
@@ -109,7 +115,7 @@ func NewConnectionStateOnSentPacketFromSampler(sendTime time.Time, size int64, s
totalBytesSentAtLastAckedPacket: sampler.totalBytesSentAtLastAckedPacket, totalBytesSentAtLastAckedPacket: sampler.totalBytesSentAtLastAckedPacket,
lastAckedPacketSentTime: sampler.lastAckedPacketSentTime, lastAckedPacketSentTime: sampler.lastAckedPacketSentTime,
lastAckedPacketAckTime: sampler.lastAckedPacketAckTime, lastAckedPacketAckTime: sampler.lastAckedPacketAckTime,
totalBytesAckedAtTheLastAckedPacket: sampler.totalBytesSentAtLastAckedPacket, totalBytesAckedAtTheLastAckedPacket: sampler.totalBytesAcked,
isAppLimited: sampler.isAppLimited, isAppLimited: sampler.isAppLimited,
} }
} }
@@ -197,6 +203,7 @@ func NewConnectionStateOnSentPacketFromSampler(sendTime time.Time, size int64, s
// Note that while the scenario above is not the only scenario when the // Note that while the scenario above is not the only scenario when the
// connection is app-limited, the approach works in other cases too. // connection is app-limited, the approach works in other cases too.
type BandwidthSampler struct { type BandwidthSampler struct {
mu sync.Mutex
totalBytesSent int64 totalBytesSent int64
totalBytesAcked int64 totalBytesAcked int64
totalBytesSentAtLastAckedPacket int64 totalBytesSentAtLastAckedPacket int64
@@ -217,6 +224,9 @@ func NewBandwidthSampler() BandwidthSamplerInterface {
} }
func (bs *BandwidthSampler) OnPacketSent(sentTime time.Time, packetNumber int64, bytes int64, bytesInFlight int64, hasRetransmittableData bool) { func (bs *BandwidthSampler) OnPacketSent(sentTime time.Time, packetNumber int64, bytes int64, bytesInFlight int64, hasRetransmittableData bool) {
bs.mu.Lock()
defer bs.mu.Unlock()
bs.lastSentPacket = packetNumber bs.lastSentPacket = packetNumber
if !hasRetransmittableData { if !hasRetransmittableData {
return return
@@ -242,6 +252,9 @@ func (bs *BandwidthSampler) OnPacketSent(sentTime time.Time, packetNumber int64,
} }
func (bs *BandwidthSampler) OnPacketAcknowledged(ackTime time.Time, packetNumber int64) BandwidthSample { func (bs *BandwidthSampler) OnPacketAcknowledged(ackTime time.Time, packetNumber int64) BandwidthSample {
bs.mu.Lock()
defer bs.mu.Unlock()
sentPacket := bs.connectionStateMap.GetEntry(packetNumber) sentPacket := bs.connectionStateMap.GetEntry(packetNumber)
if sentPacket == nil { if sentPacket == nil {
return BandwidthSample{} return BandwidthSample{}
@@ -253,29 +266,44 @@ func (bs *BandwidthSampler) OnPacketAcknowledged(ackTime time.Time, packetNumber
} }
func (bs *BandwidthSampler) OnPacketLost(packetNumber int64) { func (bs *BandwidthSampler) OnPacketLost(packetNumber int64) {
bs.mu.Lock()
defer bs.mu.Unlock()
bs.connectionStateMap.Remove(packetNumber) bs.connectionStateMap.Remove(packetNumber)
} }
func (bs *BandwidthSampler) OnAppLimited() { func (bs *BandwidthSampler) OnAppLimited() {
bs.mu.Lock()
defer bs.mu.Unlock()
bs.isAppLimited = true bs.isAppLimited = true
bs.endOfAppLimitedPhase = bs.lastSentPacket bs.endOfAppLimitedPhase = bs.lastSentPacket
} }
func (bs *BandwidthSampler) RemoveObsoletePackets(leastUnacked int64) { func (bs *BandwidthSampler) RemoveObsoletePackets(leastUnacked int64) {
bs.mu.Lock()
defer bs.mu.Unlock()
for !bs.connectionStateMap.IsEmpty() && bs.connectionStateMap.FirstPacket() < leastUnacked { for !bs.connectionStateMap.IsEmpty() && bs.connectionStateMap.FirstPacket() < leastUnacked {
bs.connectionStateMap.Remove(bs.connectionStateMap.FirstPacket()) bs.connectionStateMap.Remove(bs.connectionStateMap.FirstPacket())
} }
} }
func (bs *BandwidthSampler) TotalBytesAcked() int64 { func (bs *BandwidthSampler) TotalBytesAcked() int64 {
bs.mu.Lock()
defer bs.mu.Unlock()
return bs.totalBytesAcked return bs.totalBytesAcked
} }
func (bs *BandwidthSampler) IsAppLimited() bool { func (bs *BandwidthSampler) IsAppLimited() bool {
bs.mu.Lock()
defer bs.mu.Unlock()
return bs.isAppLimited return bs.isAppLimited
} }
func (bs *BandwidthSampler) EndOfAppLimitedPhase() int64 { func (bs *BandwidthSampler) EndOfAppLimitedPhase() int64 {
bs.mu.Lock()
defer bs.mu.Unlock()
return bs.endOfAppLimitedPhase return bs.endOfAppLimitedPhase
} }
@@ -300,9 +328,9 @@ func (bs *BandwidthSampler) onPacketAcknowledgedInner(ackTime time.Time, packetN
// Infinite rate indicates that the sampler is supposed to discard the // Infinite rate indicates that the sampler is supposed to discard the
// current send rate sample and use only the ack rate. // current send rate sample and use only the ack rate.
sendRate := InfiniteBandwidth sendRate := infiniteBandwidth
if sentPacket.sentTime.After(sentPacket.lastAckedPacketSentTime) { if sentPacket.sentTime.After(sentPacket.lastAckedPacketSentTime) {
sendRate = bandwidthFromBytesAndTimeDelta(sentPacket.totalBytesSent-sentPacket.totalBytesSentAtLastAckedPacket, sentPacket.sentTime.Sub(sentPacket.lastAckedPacketSentTime)) sendRate = BandwidthFromBytesAndTimeDelta(sentPacket.totalBytesSent-sentPacket.totalBytesSentAtLastAckedPacket, sentPacket.sentTime.Sub(sentPacket.lastAckedPacketSentTime))
} }
// During the slope calculation, ensure that ack time of the current packet is // During the slope calculation, ensure that ack time of the current packet is
@@ -311,7 +339,7 @@ func (bs *BandwidthSampler) onPacketAcknowledgedInner(ackTime time.Time, packetN
if !ackTime.After(sentPacket.lastAckedPacketAckTime) { if !ackTime.After(sentPacket.lastAckedPacketAckTime) {
return BandwidthSample{} return BandwidthSample{}
} }
ackRate := bandwidthFromBytesAndTimeDelta(bs.totalBytesAcked-sentPacket.totalBytesAckedAtTheLastAckedPacket, ackTime.Sub(sentPacket.lastAckedPacketAckTime)) ackRate := BandwidthFromBytesAndTimeDelta(bs.totalBytesAcked-sentPacket.totalBytesAckedAtTheLastAckedPacket, ackTime.Sub(sentPacket.lastAckedPacketAckTime))
sample := BandwidthSample{ sample := BandwidthSample{
bandwidth: mathext.Min(sendRate, ackRate), bandwidth: mathext.Min(sendRate, ackRate),
@@ -321,7 +349,7 @@ func (bs *BandwidthSampler) onPacketAcknowledgedInner(ackTime time.Time, packetN
return sample return sample
} }
func bandwidthFromBytesAndTimeDelta(bytes int64, duration time.Duration) int64 { func BandwidthFromBytesAndTimeDelta(bytes int64, duration time.Duration) int64 {
if duration <= 0 { if duration <= 0 {
return 0 return 0
} }

View File

@@ -17,8 +17,10 @@ package congestion
import ( import (
mrand "math/rand" mrand "math/rand"
"sync"
"time" "time"
"github.com/enfein/mieru/pkg/log"
"github.com/enfein/mieru/pkg/mathext" "github.com/enfein/mieru/pkg/mathext"
) )
@@ -114,17 +116,22 @@ var (
) )
type AckedPacketInfo struct { type AckedPacketInfo struct {
packetNumber int64 PacketNumber int64
bytesAcked int64 BytesAcked int64
receiveTimestamp time.Time ReceiveTimestamp time.Time
} }
type LostPacketInfo struct { type LostPacketInfo struct {
packetNumber int64 PacketNumber int64
bytesLost int64 BytesLost int64
} }
type BBRSender struct { type BBRSender struct {
mu sync.Mutex
// Additional context of this BBRSender. Used in the log.
logContext string
rttStats *RTTStats rttStats *RTTStats
// Replaces unacked_packets_->bytes_in_flight(). // Replaces unacked_packets_->bytes_in_flight().
@@ -283,8 +290,9 @@ type BBRSender struct {
minRTTSinceLastProbeRTT time.Duration minRTTSinceLastProbeRTT time.Duration
} }
func NewBBRSender() *BBRSender { func NewBBRSender(logContext string) *BBRSender {
return &BBRSender{ return &BBRSender{
logContext: logContext,
rttStats: NewRTTStats(), rttStats: NewRTTStats(),
mode: modeStartUp, mode: modeStartUp,
sampler: NewBandwidthSampler(), sampler: NewBandwidthSampler(),
@@ -318,6 +326,9 @@ func (b *BBRSender) InSlowStart() bool {
} }
func (b *BBRSender) OnPacketSent(sentTime time.Time, bytesInFlight int64, packetNumber int64, bytes int64, hasRetransmittableData bool) { func (b *BBRSender) OnPacketSent(sentTime time.Time, bytesInFlight int64, packetNumber int64, bytes int64, hasRetransmittableData bool) {
b.mu.Lock()
defer b.mu.Unlock()
b.lastSentPacket = packetNumber b.lastSentPacket = packetNumber
b.bytesInFlight = bytesInFlight b.bytesInFlight = bytesInFlight
@@ -333,12 +344,14 @@ func (b *BBRSender) OnPacketSent(sentTime time.Time, bytesInFlight int64, packet
} }
func (b *BBRSender) CanSend(bytesInFlight int64) bool { func (b *BBRSender) CanSend(bytesInFlight int64) bool {
b.mu.Lock()
defer b.mu.Unlock()
return bytesInFlight < b.GetCongestionWindow() return bytesInFlight < b.GetCongestionWindow()
} }
func (b *BBRSender) PacingRate(bytesInFlight int64) int64 { func (b *BBRSender) PacingRate(bytesInFlight int64) int64 {
if b.pacingRate <= 0 { if b.pacingRate <= 0 {
return int64(highGain * float64(bandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.GetMinRTT()))) return int64(highGain * float64(BandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.GetMinRTT())))
} }
return b.pacingRate return b.pacingRate
} }
@@ -359,10 +372,6 @@ func (b *BBRSender) GetCongestionWindow() int64 {
return b.congestionWindow return b.congestionWindow
} }
func (b *BBRSender) GetSlowStartThreshold() int64 {
return 0
}
func (b *BBRSender) InRecovery() bool { func (b *BBRSender) InRecovery() bool {
return b.recoveryState != stateNotInRecovery return b.recoveryState != stateNotInRecovery
} }
@@ -381,16 +390,19 @@ func (b *BBRSender) AdjustNetworkParameters(bandwidth int64, rtt time.Duration)
} }
func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time, ackedPackets []AckedPacketInfo, lostPackets []LostPacketInfo) { func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time, ackedPackets []AckedPacketInfo, lostPackets []LostPacketInfo) {
b.mu.Lock()
defer b.mu.Unlock()
totalBytesAckedBefore := b.sampler.TotalBytesAcked() totalBytesAckedBefore := b.sampler.TotalBytesAcked()
isRoundStart := false isRoundStart := false
isMinRTTExpired := false isMinRTTExpired := false
b.bytesInFlight = priorInFlight b.bytesInFlight = priorInFlight
for _, p := range ackedPackets { for _, p := range ackedPackets {
b.bytesInFlight -= p.bytesAcked b.bytesInFlight -= p.BytesAcked
} }
for _, p := range lostPackets { for _, p := range lostPackets {
b.bytesInFlight -= p.bytesLost b.bytesInFlight -= p.BytesLost
} }
b.bytesInFlight = mathext.Max(b.bytesInFlight, 0) b.bytesInFlight = mathext.Max(b.bytesInFlight, 0)
@@ -398,7 +410,7 @@ func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time,
// Input the new data into the BBR model of the connection. // Input the new data into the BBR model of the connection.
if len(ackedPackets) > 0 { if len(ackedPackets) > 0 {
lastAckedPacket := ackedPackets[len(ackedPackets)-1].packetNumber lastAckedPacket := ackedPackets[len(ackedPackets)-1].PacketNumber
isRoundStart = b.UpdateRoundTripCounter(lastAckedPacket) isRoundStart = b.UpdateRoundTripCounter(lastAckedPacket)
isMinRTTExpired = b.UpdateBandwidthAndMinRTT(eventTime, ackedPackets) isMinRTTExpired = b.UpdateBandwidthAndMinRTT(eventTime, ackedPackets)
b.UpdateRecoveryState(lastAckedPacket, len(lostPackets) > 0, isRoundStart) b.UpdateRecoveryState(lastAckedPacket, len(lostPackets) > 0, isRoundStart)
@@ -433,7 +445,7 @@ func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time,
bytesAcked := b.sampler.TotalBytesAcked() - totalBytesAckedBefore bytesAcked := b.sampler.TotalBytesAcked() - totalBytesAckedBefore
var bytesLost int64 var bytesLost int64
for _, lost := range lostPackets { for _, lost := range lostPackets {
bytesLost += lost.bytesLost bytesLost += lost.BytesLost
} }
// After the model is updated, recalculate the pacing rate and congestion // After the model is updated, recalculate the pacing rate and congestion
@@ -449,9 +461,9 @@ func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time,
// no more than 2 packets. // no more than 2 packets.
var leastUnacked int64 var leastUnacked int64
if len(ackedPackets) > 0 { if len(ackedPackets) > 0 {
leastUnacked = ackedPackets[len(ackedPackets)-1].packetNumber - 2 leastUnacked = ackedPackets[len(ackedPackets)-1].PacketNumber - 2
} else if len(lostPackets) > 0 { } else if len(lostPackets) > 0 {
leastUnacked = lostPackets[len(lostPackets)-1].packetNumber + 1 leastUnacked = lostPackets[len(lostPackets)-1].PacketNumber + 1
} }
b.sampler.RemoveObsoletePackets(leastUnacked) b.sampler.RemoveObsoletePackets(leastUnacked)
} }
@@ -505,7 +517,7 @@ func (b *BBRSender) EnterProbeBandwidthMode(now time.Time) {
func (b *BBRSender) DiscardLostPackets(lostPackets []LostPacketInfo) { func (b *BBRSender) DiscardLostPackets(lostPackets []LostPacketInfo) {
for _, lost := range lostPackets { for _, lost := range lostPackets {
b.sampler.OnPacketLost(lost.packetNumber) b.sampler.OnPacketLost(lost.PacketNumber)
} }
} }
@@ -521,7 +533,14 @@ func (b *BBRSender) UpdateRoundTripCounter(lastAckedPacket int64) bool {
func (b *BBRSender) UpdateBandwidthAndMinRTT(now time.Time, ackedPackets []AckedPacketInfo) bool { func (b *BBRSender) UpdateBandwidthAndMinRTT(now time.Time, ackedPackets []AckedPacketInfo) bool {
sampleMinRTT := infDuration sampleMinRTT := infDuration
for _, acked := range ackedPackets { for _, acked := range ackedPackets {
bandwidthSample := b.sampler.OnPacketAcknowledged(now, acked.packetNumber) bandwidthSample := b.sampler.OnPacketAcknowledged(now, acked.PacketNumber)
if log.IsLevelEnabled(log.TraceLevel) {
log.Tracef("[BBRSender %s] Acknowledged packet %d produced %v", b.logContext, acked.PacketNumber, bandwidthSample)
}
if bandwidthSample.bandwidth < 0 {
log.Debugf("[BBRSender %s] Acknowledged packet %d produced negative bandwidth %d B/s. Sample is dropped.", b.logContext, acked.PacketNumber, bandwidthSample.bandwidth)
continue
}
b.lastSampleIsAppLimited = bandwidthSample.isAppLimited b.lastSampleIsAppLimited = bandwidthSample.isAppLimited
if bandwidthSample.rtt > 0 { if bandwidthSample.rtt > 0 {
sampleMinRTT = mathext.Min(sampleMinRTT, bandwidthSample.rtt) sampleMinRTT = mathext.Min(sampleMinRTT, bandwidthSample.rtt)
@@ -739,7 +758,7 @@ func (b *BBRSender) CalculatePacingRate() {
// Pace at the rate of initial window / RTT as soon as RTT measurements are // Pace at the rate of initial window / RTT as soon as RTT measurements are
// available. // available.
if b.pacingRate <= 0 && b.rttStats.MinRTT() > 0 { if b.pacingRate <= 0 && b.rttStats.MinRTT() > 0 {
b.pacingRate = bandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.rttStats.MinRTT()) b.pacingRate = BandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.rttStats.MinRTT())
} }
// Slow the pacing rate in STARTUP once loss has ever been detected. // Slow the pacing rate in STARTUP once loss has ever been detected.

View File

@@ -0,0 +1,148 @@
// Copyright (C) 2024 mieru authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package congestion_test
import (
"context"
"encoding/binary"
"io"
"sync"
"testing"
"time"
"github.com/enfein/mieru/pkg/congestion"
"github.com/enfein/mieru/pkg/log"
"github.com/enfein/mieru/pkg/testtool"
)
type sender struct {
ctx context.Context
rwc io.ReadWriteCloser
nextSend int64
nextAck int64
bbr *congestion.BBRSender
}
type receiver struct {
ctx context.Context
rwc io.ReadWriteCloser
ackSend uint64
}
func (s *sender) Run(t *testing.T) {
t.Helper()
var wg sync.WaitGroup
wg.Add(2)
go func() {
loop:
for {
select {
case <-s.ctx.Done():
wg.Done()
break loop
default:
b := make([]byte, 8)
inFlight := (s.nextSend - s.nextAck) * 8
if s.bbr.CanSend(inFlight) {
binary.BigEndian.PutUint64(b, uint64(s.nextSend))
s.rwc.Write(b)
s.bbr.OnPacketSent(time.Now(), inFlight, s.nextSend, 8, true)
s.nextSend++
} else {
time.Sleep(time.Millisecond)
}
}
}
}()
go func() {
loop:
for {
select {
case <-s.ctx.Done():
wg.Done()
break loop
default:
b := make([]byte, 8)
inFlight := (s.nextSend - s.nextAck) * 8
if _, err := io.ReadFull(s.rwc, b); err != nil {
t.Logf("error read ack: %v", err)
time.Sleep(time.Millisecond)
continue
}
now := time.Now()
s.nextAck = int64(binary.BigEndian.Uint64(b))
s.bbr.OnCongestionEvent(inFlight, now, []congestion.AckedPacketInfo{{
PacketNumber: s.nextAck - 1,
BytesAcked: 8,
ReceiveTimestamp: now,
}}, nil)
}
}
}()
wg.Wait()
}
func (r *receiver) Start(t *testing.T) {
t.Helper()
go func() {
for {
select {
case <-r.ctx.Done():
return
default:
b := make([]byte, 8)
if _, err := io.ReadFull(r.rwc, b); err != nil {
t.Logf("error read data: %v", err)
time.Sleep(time.Millisecond)
continue
}
r.ackSend = binary.BigEndian.Uint64(b)
binary.BigEndian.PutUint64(b, r.ackSend+1)
if _, err := r.rwc.Write(b); err != nil {
t.Logf("error write ack: %v", err)
return
}
}
}
}()
}
func TestBBRSender(t *testing.T) {
log.SetOutputToTest(t)
log.SetLevel("DEBUG")
e1, e2 := testtool.BufPipe()
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second))
defer cancel()
s := &sender{
ctx: ctx,
rwc: e1,
bbr: congestion.NewBBRSender("Test"),
}
r := &receiver{
ctx: ctx,
rwc: e2,
}
r.Start(t)
s.Run(t)
t.Logf("nextSend: %v", s.nextSend)
t.Logf("nextAck: %v", s.nextAck)
t.Logf("ackSend: %v", r.ackSend)
t.Logf("Estimated bandwidth: %d B/s", s.bbr.BandwidthEstimate())
}

View File

@@ -15,7 +15,11 @@
package congestion package congestion
import "github.com/enfein/mieru/pkg/deque" import (
"sync"
"github.com/enfein/mieru/pkg/deque"
)
// PacketNumberIndexedQueue is a queue of mostly continuous numbered entries // PacketNumberIndexedQueue is a queue of mostly continuous numbered entries
// which supports the following operations: // which supports the following operations:
@@ -39,6 +43,7 @@ import "github.com/enfein/mieru/pkg/deque"
// Because of that, it is not a general-purpose container and should not be used // Because of that, it is not a general-purpose container and should not be used
// as one. // as one.
type PacketNumberIndexedQueue[T any] struct { type PacketNumberIndexedQueue[T any] struct {
mu sync.Mutex
entries *deque.Deque[EntryWrapper[T]] entries *deque.Deque[EntryWrapper[T]]
numberOfPresentEntries int numberOfPresentEntries int
firstPacket int64 firstPacket int64
@@ -48,7 +53,7 @@ func NewPacketNumberIndexedQueue[T any]() *PacketNumberIndexedQueue[T] {
return &PacketNumberIndexedQueue[T]{ return &PacketNumberIndexedQueue[T]{
entries: deque.New[EntryWrapper[T]](0), entries: deque.New[EntryWrapper[T]](0),
numberOfPresentEntries: 0, numberOfPresentEntries: 0,
firstPacket: 0, firstPacket: -1,
} }
} }
@@ -62,8 +67,11 @@ type EntryWrapper[T any] struct {
// Returns the pointer to the entry in case of success, or nil if the entry // Returns the pointer to the entry in case of success, or nil if the entry
// does not exist. // does not exist.
func (p *PacketNumberIndexedQueue[T]) GetEntry(packetNumber int64) *T { func (p *PacketNumberIndexedQueue[T]) GetEntry(packetNumber int64) *T {
entry := p.getEntryWrapper(packetNumber) p.mu.Lock()
if entry == nil { defer p.mu.Unlock()
entry, idx := p.getEntryWrapper(packetNumber)
if idx < 0 {
return nil return nil
} }
return &entry.data return &entry.data
@@ -74,7 +82,10 @@ func (p *PacketNumberIndexedQueue[T]) GetEntry(packetNumber int64) *T {
// true if the element has been inserted successfully, false if it was already // true if the element has been inserted successfully, false if it was already
// in the queue or inserted out of order. // in the queue or inserted out of order.
func (p *PacketNumberIndexedQueue[T]) Emplace(packetNumber int64, args T) bool { func (p *PacketNumberIndexedQueue[T]) Emplace(packetNumber int64, args T) bool {
if p.IsEmpty() { p.mu.Lock()
defer p.mu.Unlock()
if p.numberOfPresentEntries == 0 {
p.entries.PushBack(EntryWrapper[T]{data: args, present: true}) p.entries.PushBack(EntryWrapper[T]{data: args, present: true})
p.numberOfPresentEntries = 1 p.numberOfPresentEntries = 1
p.firstPacket = packetNumber p.firstPacket = packetNumber
@@ -100,11 +111,15 @@ func (p *PacketNumberIndexedQueue[T]) Emplace(packetNumber int64, args T) bool {
// Remove removes data associated with packetNumber and frees the slots in the // Remove removes data associated with packetNumber and frees the slots in the
// queue as necessary. // queue as necessary.
func (p *PacketNumberIndexedQueue[T]) Remove(packetNumber int64) bool { func (p *PacketNumberIndexedQueue[T]) Remove(packetNumber int64) bool {
entry := p.getEntryWrapper(packetNumber) p.mu.Lock()
if entry == nil { defer p.mu.Unlock()
entry, idx := p.getEntryWrapper(packetNumber)
if idx < 0 {
return false return false
} }
entry.present = false entry.present = false
p.entries.Set(idx, entry)
p.numberOfPresentEntries-- p.numberOfPresentEntries--
if packetNumber == p.firstPacket { if packetNumber == p.firstPacket {
@@ -113,50 +128,54 @@ func (p *PacketNumberIndexedQueue[T]) Remove(packetNumber int64) bool {
return true return true
} }
func (p *PacketNumberIndexedQueue[T]) IsEmpty() bool {
p.mu.Lock()
defer p.mu.Unlock()
return p.numberOfPresentEntries == 0
}
func (p *PacketNumberIndexedQueue[T]) FirstPacket() int64 { func (p *PacketNumberIndexedQueue[T]) FirstPacket() int64 {
return p.firstPacket return p.firstPacket
} }
func (p *PacketNumberIndexedQueue[T]) LastPacket() int64 { func (p *PacketNumberIndexedQueue[T]) LastPacket() int64 {
if p.IsEmpty() { if p.numberOfPresentEntries == 0 {
return 0 return -1
} }
return p.firstPacket + int64(p.entries.Len()) - 1 return p.firstPacket + int64(p.entries.Len()) - 1
} }
func (p *PacketNumberIndexedQueue[T]) EntrySlotsUsed() int { func (p *PacketNumberIndexedQueue[T]) entrySlotsUsed() int {
return p.entries.Len() return p.entries.Len()
} }
func (p *PacketNumberIndexedQueue[T]) IsEmpty() bool { // cleanup cleans up unused slots in the front.
return p.numberOfPresentEntries == 0
}
// cleanup cleans up unused slots in the front after removing an element.
func (p *PacketNumberIndexedQueue[T]) cleanup() { func (p *PacketNumberIndexedQueue[T]) cleanup() {
for p.entries.Len() > 0 && !p.entries.Front().present { for p.entries.Len() > 0 && !p.entries.Front().present {
p.entries.PopFront() p.entries.PopFront()
p.firstPacket++ p.firstPacket++
} }
if p.entries.Len() == 0 { if p.entries.Len() == 0 {
p.firstPacket = 0 p.firstPacket = -1
} }
} }
func (p *PacketNumberIndexedQueue[T]) getEntryWrapper(packetNumber int64) *EntryWrapper[T] { // getEntryWrapper returns a copy of the wrapper and the index in the deque.
// If not found, index -1 is returned.
func (p *PacketNumberIndexedQueue[T]) getEntryWrapper(packetNumber int64) (EntryWrapper[T], int) {
if packetNumber < p.firstPacket { if packetNumber < p.firstPacket {
return nil return EntryWrapper[T]{}, -1
} }
offset := packetNumber - p.firstPacket offset := packetNumber - p.firstPacket
if offset >= int64(p.entries.Len()) { if offset >= int64(p.entries.Len()) {
return nil return EntryWrapper[T]{}, -1
} }
entry := p.entries.At(int(offset)) entry := p.entries.At(int(offset))
if !entry.present { if !entry.present {
return nil return EntryWrapper[T]{}, -1
} }
return &entry return entry, int(offset)
} }

View File

@@ -29,7 +29,7 @@ func TestPacketNumberIndexedQueue(t *testing.T) {
for i := 0; i < total; i++ { for i := 0; i < total; i++ {
clockTime := time.Now().UnixMilli() clockTime := time.Now().UnixMilli()
packets[i] = clockTime packets[i] = clockTime
time.Sleep(10 * time.Millisecond) time.Sleep(5 * time.Millisecond)
} }
for i := 0; i < total; i++ { for i := 0; i < total; i++ {
@@ -58,15 +58,18 @@ func TestPacketNumberIndexedQueue(t *testing.T) {
if queue.LastPacket() != packets[total-1] { if queue.LastPacket() != packets[total-1] {
t.Errorf("Got unexpected last packet %v, want %v", queue.LastPacket(), packets[total-1]) t.Errorf("Got unexpected last packet %v, want %v", queue.LastPacket(), packets[total-1])
} }
if queue.EntrySlotsUsed() <= total { if queue.entrySlotsUsed() <= total {
t.Errorf("Queue has %d slots, want more than %d", queue.EntrySlotsUsed(), total) t.Errorf("Queue has %d slots, want more than %d", queue.entrySlotsUsed(), total)
} }
for i := total - 1; i >= 0; i-- { for i := 0; i < total; i++ {
if ok := queue.Remove(packets[i]); !ok { if ok := queue.Remove(packets[i]); !ok {
t.Fatalf("Remove() failed on packet %d", i) t.Fatalf("Remove() failed on packet %d", i)
} }
} }
if ok := queue.Remove(packets[0]); ok {
t.Errorf("Remove() is successful with removed packet")
}
if !queue.IsEmpty() { if !queue.IsEmpty() {
t.Errorf("Queue is not empty after removing all the packets") t.Errorf("Queue is not empty after removing all the packets")
} }

View File

@@ -0,0 +1,69 @@
// Copyright (C) 2024 mieru authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package congestion
import (
"testing"
"time"
)
func TestMinFilter(t *testing.T) {
filter := NewWindowedFilter(5, 0, MinFilter[int])
for i := 1; i <= 10; i++ {
filter.Update(i, int64(i))
}
best := filter.GetBest()
second := filter.GetSecondBest()
third := filter.GetThirdBest()
t.Logf("MinFilter: %d %d %d", best, second, third)
if best >= second {
t.Errorf("with MinFilter, got best >= second")
}
if best >= third {
t.Errorf("with MinFilter, got best >= third")
}
if second >= third {
t.Errorf("with MinFilter, got second >= third")
}
filter.Reset(0, time.Now().UnixNano())
if filter.GetBest() != 0 || filter.GetSecondBest() != 0 || filter.GetThirdBest() != 0 {
t.Errorf("got non-zero after Reset()")
}
}
func TestMaxFilter(t *testing.T) {
filter := NewWindowedFilter(5, 0, MaxFilter[int])
for i := 10; i >= 1; i-- {
filter.Update(i, int64(11-i))
}
best := filter.GetBest()
second := filter.GetSecondBest()
third := filter.GetThirdBest()
t.Logf("MaxFilter: %d %d %d", best, second, third)
if best <= second {
t.Errorf("with MaxFilter, got best <= second")
}
if best <= third {
t.Errorf("with MaxFilter, got best <= third")
}
if second <= third {
t.Errorf("with MaxFilter, got second <= third")
}
filter.Reset(0, time.Now().UnixNano())
if filter.GetBest() != 0 || filter.GetSecondBest() != 0 || filter.GetThirdBest() != 0 {
t.Errorf("got non-zero after Reset()")
}
}

View File

@@ -19,20 +19,26 @@ import (
"bytes" "bytes"
"errors" "errors"
"io" "io"
"sync"
) )
// BufPipe is like net.Pipe() but with an internal buffer. // BufPipe is like net.Pipe() but with an internal buffer.
func BufPipe() (io.ReadWriteCloser, io.ReadWriteCloser) { func BufPipe() (io.ReadWriteCloser, io.ReadWriteCloser) {
var buf1, buf2 bytes.Buffer var buf1, buf2 bytes.Buffer
var lock1, lock2 sync.Mutex
ep1 := &ioEndpoint{ ep1 := &ioEndpoint{
direction: forward, direction: forward,
buf1: &buf1, buf1: &buf1,
buf2: &buf2, buf2: &buf2,
lock1: &lock1,
lock2: &lock2,
} }
ep2 := &ioEndpoint{ ep2 := &ioEndpoint{
direction: backward, direction: backward,
buf1: &buf1, buf1: &buf1,
buf2: &buf2, buf2: &buf2,
lock1: &lock1,
lock2: &lock2,
} }
return ep1, ep2 return ep1, ep2
} }
@@ -48,6 +54,8 @@ type ioEndpoint struct {
direction ioDirection direction ioDirection
buf1 *bytes.Buffer // forward writes to here buf1 *bytes.Buffer // forward writes to here
buf2 *bytes.Buffer // backward writes to here buf2 *bytes.Buffer // backward writes to here
lock1 *sync.Mutex // lock of buf1
lock2 *sync.Mutex // lock of buf2
closed bool closed bool
} }
@@ -56,9 +64,13 @@ func (e *ioEndpoint) Read(b []byte) (n int, err error) {
return 0, io.EOF return 0, io.EOF
} }
if e.direction == forward { if e.direction == forward {
e.lock2.Lock()
n, err = e.buf2.Read(b) n, err = e.buf2.Read(b)
e.lock2.Unlock()
} else { } else {
e.lock1.Lock()
n, err = e.buf1.Read(b) n, err = e.buf1.Read(b)
e.lock1.Unlock()
} }
if errors.Is(err, io.EOF) { if errors.Is(err, io.EOF) {
err = nil err = nil
@@ -66,14 +78,20 @@ func (e *ioEndpoint) Read(b []byte) (n int, err error) {
return return
} }
func (e *ioEndpoint) Write(b []byte) (int, error) { func (e *ioEndpoint) Write(b []byte) (n int, err error) {
if e.closed { if e.closed {
return 0, io.ErrClosedPipe return 0, io.ErrClosedPipe
} }
if e.direction == forward { if e.direction == forward {
return e.buf1.Write(b) e.lock1.Lock()
n, err = e.buf1.Write(b)
e.lock1.Unlock()
} else {
e.lock2.Lock()
n, err = e.buf2.Write(b)
e.lock2.Unlock()
} }
return e.buf2.Write(b) return
} }
func (e *ioEndpoint) Close() error { func (e *ioEndpoint) Close() error {

View File

@@ -11,7 +11,7 @@ import subprocess
# This constant comes from the oldest glibc version in # This constant comes from the oldest glibc version in
# //chrome/installer/linux/debian/dist_package_versions.json and # //chrome/installer/linux/debian/dist_package_versions.json and
# //chrome/installer/linux/rpm/dist_package_provides.json # //chrome/installer/linux/rpm/dist_package_provides.json
MAX_ALLOWED_GLIBC_VERSION = [2, 28] MAX_ALLOWED_GLIBC_VERSION = [2, 26]
VERSION_PATTERN = re.compile("GLIBC_([0-9\.]+)") VERSION_PATTERN = re.compile("GLIBC_([0-9\.]+)")
SECTION_PATTERN = re.compile(r"^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$") SECTION_PATTERN = re.compile(r"^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$")

View File

@@ -303,9 +303,17 @@ def hacks_and_patches(install_root: str, script_dir: str, arch: str) -> None:
os.remove(qtchooser_conf) os.remove(qtchooser_conf)
# __GLIBC_MINOR__ is used as a feature test macro. Replace it with the # __GLIBC_MINOR__ is used as a feature test macro. Replace it with the
# earliest supported version of glibc (2.28). # earliest supported version of glibc (2.26).
features_h = os.path.join(install_root, "usr", "include", "features.h") features_h = os.path.join(install_root, "usr", "include", "features.h")
replace_in_file(features_h, r"(#define\s+__GLIBC_MINOR__)", r"\1 28 //") replace_in_file(features_h, r"(#define\s+__GLIBC_MINOR__)", r"\1 26 //")
# fcntl64() was introduced in glibc 2.28. Make sure to use fcntl() instead.
fcntl_h = os.path.join(install_root, "usr", "include", "fcntl.h")
replace_in_file(
fcntl_h,
r"#ifndef __USE_FILE_OFFSET64(\nextern int fcntl)",
r"#if 1\1",
)
# Do not use pthread_cond_clockwait as it was introduced in glibc 2.30. # Do not use pthread_cond_clockwait as it was introduced in glibc 2.30.
cppconfig_h = os.path.join( cppconfig_h = os.path.join(

View File

@@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=ddns-go PKG_NAME:=ddns-go
PKG_VERSION:=6.6.6 PKG_VERSION:=6.6.7
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=95367d8680c27a78024be339aaad77d73cda05e7005b8d9c342182e4f97c7bcc PKG_HASH:=a2b8625ec499cfa822924bf4109b74b362438c92a7c632b7574817de8deee744
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE

View File

@@ -432,11 +432,11 @@ return view.extend({
ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]); ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);
ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss); ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);
ss.tab('field_other', _('Other Fields')); ss.tab('field_other', _('Other fields'));
ss.tab('field_host', _('Host Fields')); ss.tab('field_host', _('Host fields'));
ss.tab('field_port', _('Port Fields')); ss.tab('field_port', _('Port fields'));
ss.tab('field_source_ip', _('SRC-IP Fields')); ss.tab('field_source_ip', _('SRC-IP fields'));
ss.tab('field_source_port', _('SRC-Port Fields')); ss.tab('field_source_port', _('SRC-Port fields'));
so = ss.taboption('field_other', form.Value, 'label', _('Label')); so = ss.taboption('field_other', form.Value, 'label', _('Label'));
so.load = L.bind(hp.loadDefaultLabel, this, data[0]); so.load = L.bind(hp.loadDefaultLabel, this, data[0]);
@@ -764,11 +764,11 @@ return view.extend({
ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]); ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);
ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss); ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);
ss.tab('field_other', _('Other Fields')); ss.tab('field_other', _('Other fields'));
ss.tab('field_host', _('Host Fields')); ss.tab('field_host', _('Host fields'));
ss.tab('field_port', _('Port Fields')); ss.tab('field_port', _('Port fields'));
ss.tab('field_source_ip', _('SRC-IP Fields')); ss.tab('field_source_ip', _('SRC-IP fields'));
ss.tab('field_source_port', _('SRC-Port Fields')); ss.tab('field_source_port', _('SRC-Port fields'));
so = ss.taboption('field_other', form.Value, 'label', _('Label')); so = ss.taboption('field_other', form.Value, 'label', _('Label'));
so.load = L.bind(hp.loadDefaultLabel, this, data[0]); so.load = L.bind(hp.loadDefaultLabel, this, data[0]);

View File

@@ -869,7 +869,7 @@ msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:436 #: htdocs/luci-static/resources/view/homeproxy/client.js:436
#: htdocs/luci-static/resources/view/homeproxy/client.js:768 #: htdocs/luci-static/resources/view/homeproxy/client.js:768
msgid "Host Fields" msgid "Host fields"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/node.js:709 #: htdocs/luci-static/resources/view/homeproxy/node.js:709
@@ -1391,7 +1391,7 @@ msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:435 #: htdocs/luci-static/resources/view/homeproxy/client.js:435
#: htdocs/luci-static/resources/view/homeproxy/client.js:767 #: htdocs/luci-static/resources/view/homeproxy/client.js:767
msgid "Other Fields" msgid "Other fields"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:389 #: htdocs/luci-static/resources/view/homeproxy/client.js:389
@@ -1488,7 +1488,7 @@ msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:437 #: htdocs/luci-static/resources/view/homeproxy/client.js:437
#: htdocs/luci-static/resources/view/homeproxy/client.js:769 #: htdocs/luci-static/resources/view/homeproxy/client.js:769
msgid "Port Fields" msgid "Port fields"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:537 #: htdocs/luci-static/resources/view/homeproxy/client.js:537
@@ -1756,12 +1756,12 @@ msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:438 #: htdocs/luci-static/resources/view/homeproxy/client.js:438
#: htdocs/luci-static/resources/view/homeproxy/client.js:770 #: htdocs/luci-static/resources/view/homeproxy/client.js:770
msgid "SRC-IP Fields" msgid "SRC-IP fields"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/client.js:439 #: htdocs/luci-static/resources/view/homeproxy/client.js:439
#: htdocs/luci-static/resources/view/homeproxy/client.js:771 #: htdocs/luci-static/resources/view/homeproxy/client.js:771
msgid "SRC-Port Fields" msgid "SRC-Port fields"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/homeproxy/node.js:515 #: htdocs/luci-static/resources/view/homeproxy/node.js:515

View File

@@ -890,7 +890,7 @@ msgstr "主机名"
#: htdocs/luci-static/resources/view/homeproxy/client.js:436 #: htdocs/luci-static/resources/view/homeproxy/client.js:436
#: htdocs/luci-static/resources/view/homeproxy/client.js:768 #: htdocs/luci-static/resources/view/homeproxy/client.js:768
msgid "Host Fields" msgid "Host fields"
msgstr "主机字段" msgstr "主机字段"
#: htdocs/luci-static/resources/view/homeproxy/node.js:709 #: htdocs/luci-static/resources/view/homeproxy/node.js:709
@@ -1419,7 +1419,7 @@ msgstr "仅代理中国大陆"
#: htdocs/luci-static/resources/view/homeproxy/client.js:435 #: htdocs/luci-static/resources/view/homeproxy/client.js:435
#: htdocs/luci-static/resources/view/homeproxy/client.js:767 #: htdocs/luci-static/resources/view/homeproxy/client.js:767
msgid "Other Fields" msgid "Other fields"
msgstr "其他字段" msgstr "其他字段"
#: htdocs/luci-static/resources/view/homeproxy/client.js:389 #: htdocs/luci-static/resources/view/homeproxy/client.js:389
@@ -1516,7 +1516,7 @@ msgstr "端口 %s 已存在!"
#: htdocs/luci-static/resources/view/homeproxy/client.js:437 #: htdocs/luci-static/resources/view/homeproxy/client.js:437
#: htdocs/luci-static/resources/view/homeproxy/client.js:769 #: htdocs/luci-static/resources/view/homeproxy/client.js:769
msgid "Port Fields" msgid "Port fields"
msgstr "端口字段" msgstr "端口字段"
#: htdocs/luci-static/resources/view/homeproxy/client.js:537 #: htdocs/luci-static/resources/view/homeproxy/client.js:537
@@ -1784,13 +1784,13 @@ msgstr "规则集 URL"
#: htdocs/luci-static/resources/view/homeproxy/client.js:438 #: htdocs/luci-static/resources/view/homeproxy/client.js:438
#: htdocs/luci-static/resources/view/homeproxy/client.js:770 #: htdocs/luci-static/resources/view/homeproxy/client.js:770
msgid "SRC-IP Fields" msgid "SRC-IP fields"
msgstr "源 IP 字段" msgstr "源 IP 字段"
#: htdocs/luci-static/resources/view/homeproxy/client.js:439 #: htdocs/luci-static/resources/view/homeproxy/client.js:439
#: htdocs/luci-static/resources/view/homeproxy/client.js:771 #: htdocs/luci-static/resources/view/homeproxy/client.js:771
msgid "SRC-Port Fields" msgid "SRC-Port fields"
msgstr "源端口 字段" msgstr "源端口字段"
#: htdocs/luci-static/resources/view/homeproxy/node.js:515 #: htdocs/luci-static/resources/view/homeproxy/node.js:515
msgid "SSH" msgid "SSH"

View File

@@ -926,6 +926,16 @@ run_redir() {
_args="${_args} udp_redir_port=${UDP_REDIR_PORT}" _args="${_args} udp_redir_port=${UDP_REDIR_PORT}"
config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g") config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g")
} }
local protocol=$(config_n_get $node protocol)
local default_node=$(config_n_get $node default_node)
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
[ "${DNS_MODE}" != "sing-box" ] && [ "${DNS_MODE}" != "udp" ] && [ "$protocol" = "_shunt" ] && [ "$default_node" = "_direct" ] && {
DNS_MODE="sing-box"
v2ray_dns_mode="tcp"
echolog "* 当前TCP节点采用Sing-Box分流且默认节点为直连远程DNS过滤模式将默认使用Sing-Box(TCP),防止环回!"
}
[ "${DNS_MODE}" = "sing-box" ] && { [ "${DNS_MODE}" = "sing-box" ] && {
resolve_dns=1 resolve_dns=1
config_file=$(echo $config_file | sed "s/.json/_DNS.json/g") config_file=$(echo $config_file | sed "s/.json/_DNS.json/g")
@@ -934,11 +944,8 @@ run_redir() {
[ "${DNS_CACHE}" == "0" ] && _args="${_args} dns_cache=0" [ "${DNS_CACHE}" == "0" ] && _args="${_args} dns_cache=0"
resolve_dns_port=${dns_listen_port} resolve_dns_port=${dns_listen_port}
_args="${_args} dns_listen_port=${resolve_dns_port}" _args="${_args} dns_listen_port=${resolve_dns_port}"
local local_dns=$(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n1) local local_dns=$(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n1)
_args="${_args} direct_dns_udp_server=${local_dns}" _args="${_args} direct_dns_udp_server=${local_dns}"
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
_args="${_args} remote_dns_protocol=${v2ray_dns_mode}" _args="${_args} remote_dns_protocol=${v2ray_dns_mode}"
case "$v2ray_dns_mode" in case "$v2ray_dns_mode" in
tcp) tcp)
@@ -981,6 +988,16 @@ run_redir() {
_args="${_args} udp_redir_port=${UDP_REDIR_PORT}" _args="${_args} udp_redir_port=${UDP_REDIR_PORT}"
config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g") config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g")
} }
local protocol=$(config_n_get $node protocol)
local default_node=$(config_n_get $node default_node)
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
[ "${DNS_MODE}" != "xray" ] && [ "${DNS_MODE}" != "udp" ] && [ "$protocol" = "_shunt" ] && [ "$default_node" = "_direct" ] && {
DNS_MODE="xray"
v2ray_dns_mode="tcp"
echolog "* 当前TCP节点采用Xray分流且默认节点为直连远程DNS过滤模式将默认使用Xray(TCP),防止环回!"
}
[ "${DNS_MODE}" = "xray" ] && { [ "${DNS_MODE}" = "xray" ] && {
resolve_dns=1 resolve_dns=1
config_file=$(echo $config_file | sed "s/.json/_DNS.json/g") config_file=$(echo $config_file | sed "s/.json/_DNS.json/g")
@@ -992,7 +1009,6 @@ run_redir() {
resolve_dns_port=${dns_listen_port} resolve_dns_port=${dns_listen_port}
_args="${_args} dns_listen_port=${resolve_dns_port}" _args="${_args} dns_listen_port=${resolve_dns_port}"
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}" _args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query") remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
_args="${_args} remote_dns_doh=${remote_dns_doh}" _args="${_args} remote_dns_doh=${remote_dns_doh}"

View File

@@ -18,16 +18,12 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
if (version == 2) if (version == 2)
{ {
return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion2, return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion2, PerformanceEntryVersion2, PerformanceDetailVersion2>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
PerformanceEntryVersion2,
PerformanceDetailVersion2>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
} }
if (version == 1) if (version == 1)
{ {
return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion1, return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion1, PerformanceEntryVersion1, PerformanceDetailVersion1>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
PerformanceEntryVersion1,
PerformanceDetailVersion1>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
} }
throw new NotImplementedException($"Unknown Performance metrics data format version {version}"); throw new NotImplementedException($"Unknown Performance metrics data format version {version}");

View File

@@ -234,7 +234,7 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
{ {
performanceEntry = null; performanceEntry = null;
if (_entryDetailIndex > MaxFrameDetailCount) if (_entryDetailIndex >= MaxFrameDetailCount)
{ {
return false; return false;
} }
@@ -245,7 +245,7 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
EntryCountOffset = (uint)CurrentHeader.GetEntryCountOffset(), EntryCountOffset = (uint)CurrentHeader.GetEntryCountOffset(),
}; };
uint baseEntryOffset = (uint)(Unsafe.SizeOf<THeader>() + GetEntriesSize() + Unsafe.SizeOf<IPerformanceDetailEntry>() * _entryDetailIndex); uint baseEntryOffset = (uint)(Unsafe.SizeOf<THeader>() + GetEntriesSize() + Unsafe.SizeOf<TEntryDetail>() * _entryDetailIndex);
ref TEntryDetail entryDetail = ref EntriesDetail[_entryDetailIndex]; ref TEntryDetail entryDetail = ref EntriesDetail[_entryDetailIndex];

View File

@@ -9,5 +9,6 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types
public byte Sm0TpcIndex; public byte Sm0TpcIndex;
public byte Sm1GpcIndex; public byte Sm1GpcIndex;
public byte Sm1TpcIndex; public byte Sm1TpcIndex;
public uint Reserved;
} }
} }

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -1,95 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#FF4B55;" d="M473.655,423.724H38.346c-21.177,0-38.345-17.167-38.345-38.345V126.622 c0-21.177,17.167-38.345,38.345-38.345h435.309c21.177,0,38.345,17.167,38.345,38.345V385.38 C512,406.557,494.833,423.724,473.655,423.724z"/>
<path style="fill:#41479B;" d="M0.001,126.622v120.582c0.017,4.861,3.961,8.797,8.826,8.797h238.344 c4.875,0,8.828-3.953,8.828-8.828V97.104c0-4.874-3.95-8.825-8.823-8.828H38.346C17.169,88.277,0.001,105.444,0.001,126.622z"/>
<path style="fill:#F5F5F5;" d="M150.069,141.849V88.277h-44.138v53.573L26.845,90.035c-9.234,2.9-16.954,9.203-21.711,17.434 l65.022,42.601H0.001v44.138h70.153L0.001,240.169v7.033c0.017,4.861,3.961,8.797,8.826,8.797H24.16l81.77-53.572V256h44.138 v-53.573L231.838,256h15.333c4.875,0,8.828-3.953,8.828-8.828v-7.002l-70.155-45.963h70.155V150.07h-70.155l70.155-45.964v-7.002 c0-4.874-3.95-8.825-8.823-8.828h-15.338L150.069,141.849z"/>
<g>
<polygon style="fill:#FF4B55;" points="255.999,158.897 141.241,158.897 141.241,88.277 114.758,88.277 114.758,158.897 0,158.897 0,185.38 114.758,185.38 114.758,256.001 141.241,256.001 141.241,185.38 255.999,185.38 "/>
<path style="fill:#FF4B55;" d="M8.228,102.903l72.661,47.166h16.214l-82.495-53.55C12.239,98.39,10.098,100.533,8.228,102.903z"/>
<path style="fill:#FF4B55;" d="M166.283,150.07l88.374-57.366c-1.536-2.599-4.246-4.427-7.485-4.427h-1.909l-95.194,61.793H166.283 z"/>
<path style="fill:#FF4B55;" d="M89.474,194.208L1.269,251.462c1.519,2.663,4.273,4.537,7.559,4.537h1.665l95.195-61.793H89.474 V194.208z"/>
<path style="fill:#FF4B55;" d="M255.859,247.866l-82.666-53.658H156.98l93.873,60.934 C253.666,253.837,255.594,251.102,255.859,247.866z"/>
</g>
<path style="fill:#F5F5F5;" d="M320.945,174.03c-1.741,0-3.153,1.411-3.153,3.153v116.65c0,9.458,6.305,40.985,66.207,50.443 c59.902-9.458,66.207-40.985,66.207-50.443v-116.65c0-1.741-1.411-3.153-3.153-3.153L320.945,174.03L320.945,174.03z"/>
<path style="fill:#73AF00;" d="M383.999,344.276c50.004-7.895,62.651-31.16,65.469-44.138H318.531 C321.348,313.115,333.995,336.38,383.999,344.276z"/>
<path style="fill:#82AFFF;" d="M424.984,240.237c0,0,3.153-3.153,0-9.458l-40.985-1.834l-40.985,1.834c-3.153,6.305,0,9.458,0,9.458 c-3.153,3.153-3.153,6.305-3.153,6.305h6.305l6.831,11.297l31.001,17.078L415,257.84l6.831-11.297h6.305 C428.137,246.542,428.137,243.389,424.984,240.237z"/>
<path style="fill:#F5F5F5;" d="M415.002,257.839c0,0-1.971-4.335-7.225-3.809c0,0-2.89-3.809-7.751-2.759 c0,0-5.649-3.284-8.932,2.759c0,0-10.444-1.062-11.002,6.891c0,0,16.256,24.504,16.651,24.767 c0.394,0.263,19.442,0.131,19.442,0.131l8.802-9.711l-8.671-12.489L415.002,257.839z"/>
<path style="fill:#F0C850;" d="M384.394,265.589c0,0-13.79-22.528-15.764-24.434c-1.905-1.839-5.649-3.546-9.459-0.394 c0,0-11.428-0.919-9.853,7.751l3.284,13.137c0,0-2.89,9.064-4.204,9.984c-1.313,0.919-6.174,3.415-6.174,3.415l2.759,10.903 l36.781-1.839L384.394,265.589z"/>
<path style="fill:#965032;" d="M400.288,255.738l-0.043,0.019l-1.017-2.401c-0.082-0.194-0.238-0.348-0.434-0.425 s-0.413-0.074-0.609,0.012l-6.842,3.017l-8.138-13.322c0.361-0.31,0.518-0.817,0.348-1.289c-0.22-0.616-0.897-0.936-1.512-0.717 l-1.814,0.649L379,237.655c-0.14-0.413-0.585-0.628-0.999-0.495c-0.413,0.141-0.634,0.588-0.494,1.001l1.236,3.654l-1.939,0.694 c-0.615,0.222-0.935,0.899-0.714,1.512c0.172,0.483,0.628,0.786,1.113,0.786c0.068,0,0.138-0.023,0.207-0.035l2.682,16.153 l-1.73,0.762c-0.377,0.167-0.564,0.597-0.424,0.985l0.981,2.732c0.024,0.46,0.022,1.236-0.135,2.218l-11.006-18.879 c0.462-0.289,0.693-0.851,0.502-1.383c-0.222-0.616-0.893-0.939-1.512-0.717l-1.814,0.649l-1.227-3.626 c-0.139-0.413-0.587-0.634-0.999-0.495c-0.413,0.141-0.634,0.588-0.494,1.001l1.236,3.654l-1.939,0.694 c-0.615,0.222-0.935,0.899-0.714,1.512c0.158,0.441,0.559,0.701,0.995,0.748l4.777,29.814c-0.617,0.259-1.222,0.522-1.901,0.764 c0,0-2.233,10.641-0.525,11.166c1.708,0.525,19.31,5.911,19.31,5.911s24.302-11.56,24.828-11.822 c0.525-0.263,1.577-7.882,1.577-7.882L400.288,255.738z M398.797,256.378l-2.035,0.874l-0.674-1.663l1.999-0.882L398.797,256.378z M386.497,259.818l1.673-0.737l0.643,1.585l-1.771,0.761L386.497,259.818z M385.588,262.05l-1.978,0.85l-0.622-1.534l2.062-0.909 L385.588,262.05z M390.26,260.045l-0.649-1.6l1.788-0.788l0.655,1.618L390.26,260.045z M392.84,257.021l1.806-0.797l0.669,1.649 l-1.814,0.779L392.84,257.021z M381.736,243.255l8.152,13.346l-3.897,1.718l-5.005-14.796L381.736,243.255z M378.922,244.262 l0.578-0.207l5.042,14.904l-2.963,1.306L378.922,244.262z M381.546,262.001l0.617,1.521l-1.945,0.835l-0.548-1.528L381.546,262.001z M366.295,249.325l11.938,20.479c-0.601,1.737-1.735,3.753-3.723,5.732l-8.797-26.004L366.295,249.325z M363.348,250.38l0.882-0.316 l9.009,26.632c-1.366,1.133-3.065,2.228-5.156,3.231L363.348,250.38z"/>
<path style="fill:#FF4B55;" d="M427.842,226c-0.837-1.33-3.524-0.76-3.524-0.76s-0.767-1.534-2.794-1.682 c-2.027-0.148-2.399,1.657-2.399,1.657s-0.38-0.282-2.613-0.216s-1.773,3.744-1.773,3.744s-0.854,0-3.744-0.919 c-2.89-0.92-4.794-0.263-4.794-0.263c-0.131-1.511-0.919-2.627-0.919-2.627c-2.43,0.985-4.335-0.131-4.794-0.985 c-0.46-0.854,0.723-2.167,0.723-3.284s-1.544-1.067-2.086-2.052s0-1.527,1.429-2.167s2.759-3.005,1.871-4.926 s-3.448-1.577-3.448-1.577c0.887,0.148,1.625,1.823,0.198,2.167s-2.709-4.877-2.709-4.877c3.3,2.217,5.715,0.887,6.404-1.035 c0.69-1.922-1.133-3.251-1.133-3.251c-1.429,2.315-3.892,0.296-2.561-1.182c1.33-1.478,1.444-3.957,1.444-3.957 c-2.956,1.446-4.794-0.394-4.794-0.394c3.875-2.692,2.759-6.503,2.759-6.503c-1.444-0.657-4.532-0.131-4.532-0.131 c0.657-1.314,0.525-3.679,0.525-3.679c-1.642-0.263-3.481,0.788-3.481,0.788c0.525-1.838-0.198-5.057-0.198-5.057 c-1.182,0.198-3.415,0.854-3.415,0.854c-0.919-2.102-3.481-3.35-3.481-3.35s-2.561,1.248-3.481,3.35c0,0-2.233-0.657-3.415-0.854 c0,0-0.723,3.219-0.198,5.057c0,0-1.839-1.05-3.481-0.788c0,0-0.131,2.365,0.525,3.679c0,0-3.087-0.525-4.532,0.131 c0,0-1.117,3.809,2.759,6.503c0,0-1.839,1.839-4.794,0.394c0,0,0.115,2.479,1.444,3.957c1.33,1.478-1.133,3.498-2.561,1.182 c0,0-1.823,1.33-1.133,3.251s3.104,3.251,6.404,1.035c0,0-1.281,5.221-2.709,4.877s-0.69-2.019,0.198-2.167 c0,0-2.561-0.345-3.448,1.577c-0.887,1.921,0.444,4.286,1.871,4.926c1.429,0.64,1.971,1.182,1.429,2.167 c-0.542,0.985-2.086,0.936-2.086,2.052s1.182,2.43,0.723,3.284c-0.46,0.854-2.365,1.971-4.794,0.985c0,0-0.788,1.117-0.919,2.627 c0,0-1.905-0.657-4.794,0.263c-2.89,0.919-3.744,0.919-3.744,0.919s0.46-3.678-1.773-3.744s-2.613,0.216-2.613,0.216 s-0.371-1.805-2.399-1.657c-2.027,0.149-2.794,1.682-2.794,1.682s-2.687-0.569-3.524,0.76c-0.837,1.33-0.936,3.35,0.64,4.188 c1.577,0.838,5.763,4.335,5.763,4.335l5.911,2.561l20.69-9.163l10.837,2.857l10.837-2.857l20.69,9.163l5.911-2.561 c0,0,4.188-3.498,5.763-4.335C428.778,229.35,428.68,227.331,427.842,226z"/>
<path style="fill:#F5F5F5;" d="M377.546,192.612c0,0,0.223,2.782,4.34,2.04C381.885,194.652,381.775,191.759,377.546,192.612z"/>
<path style="fill:#FF4B55;" d="M362.313,302.503c0,0-2.956-0.098-6.009,2.167c-3.054,2.266-4.401,0.657-7.455,0.657 s-3.777,3.186-3.777,3.186s-5.911,1.478-3.546,5.813c1.495,2.742,3.576,2.684,4.908,2.272c-0.067,1.842,0.352,3.866,2.481,4.231 c4.04,0.69,5.813-1.478,4.926-4.828c0,0,0.492,3.448,3.153,3.35c2.66-0.098,4.434-1.577,4.138-5.123s4.434-1.379,8.078-6.601 L362.313,302.503z"/>
<g>
<path style="fill:#82AFFF;" d="M345.039,315.179c0,0-1.839,2.43-1.313,4.794c0,0-3.94-1.248-1.839-7.094 C341.886,312.88,344.58,312.158,345.039,315.179z"/>
<path style="fill:#82AFFF;" d="M351.229,318.365c0,0-1.084,3.054,0.394,5.763c0,0-4.926-0.148-3.94-6.207 C347.683,317.922,349.259,316.296,351.229,318.365z"/>
<path style="fill:#82AFFF;" d="M356.156,318.069c0,0,0.887,2.561,0,5.025c0,0,4.04-0.246,3.35-6.059 C359.505,317.034,357.338,316.246,356.156,318.069z"/>
</g>
<g>
<path style="fill:#FF4B55;" d="M352.56,259.153c-0.373-3.038-19.409-4.828-18.227,11.166c0,0-2.112-0.039-3.15,1.928 s-3.264,1.484-3.932,0.779c0,0,0.148,3.561,4.562,3.412c0,0-1.397,1.1-1.199,2.708s1.359,3.635,1.286,5.02 s-1.385,3.314-1.385,3.314s3.388-1.162,3.61-3.585s-0.321-4.451,0.346-5.687c0,0-0.321,1.706,1.187,3.858 c1.508,2.152,1.582,4.772,0.964,6.404c0,0,3.758-1.855,3.041-5.44s-1.484-3.264-1.138-5.267c0,0,3.907,3.981,3.24,7.369 c0,0,1.249-1.496,1.138-4.314s-2.068-4.715-2.068-4.715S353.84,269.596,352.56,259.153z"/>
<path style="fill:#FF4B55;" d="M405.686,302.503c0,0,2.956-0.098,6.009,2.167c3.054,2.266,4.401,0.657,7.455,0.657 s3.777,3.186,3.777,3.186s5.911,1.478,3.546,5.813c-1.495,2.742-3.576,2.684-4.908,2.272c0.067,1.842-0.352,3.866-2.481,4.231 c-4.04,0.69-5.813-1.478-4.926-4.828c0,0-0.492,3.448-3.153,3.35c-2.66-0.098-4.434-1.577-4.138-5.123s-4.434-1.379-8.078-6.601 L405.686,302.503z"/>
</g>
<g>
<path style="fill:#82AFFF;" d="M422.961,315.179c0,0,1.839,2.43,1.313,4.794c0,0,3.94-1.248,1.839-7.094 C426.113,312.88,423.42,312.158,422.961,315.179z"/>
<path style="fill:#82AFFF;" d="M416.769,318.365c0,0,1.084,3.054-0.394,5.763c0,0,4.926-0.148,3.94-6.207 C420.317,317.922,418.74,316.296,416.769,318.365z"/>
<path style="fill:#82AFFF;" d="M411.844,318.069c0,0-0.887,2.561,0,5.025c0,0-4.04-0.246-3.35-6.059 C408.493,317.034,410.662,316.246,411.844,318.069z"/>
</g>
<path style="fill:#FF4B55;" d="M415.44,259.153c0.373-3.038,19.409-4.828,18.227,11.166c0,0,2.112-0.039,3.15,1.928 s3.264,1.484,3.932,0.779c0,0-0.148,3.561-4.562,3.412c0,0,1.397,1.1,1.199,2.708s-1.361,3.635-1.286,5.02 c0.074,1.385,1.385,3.314,1.385,3.314s-3.388-1.162-3.61-3.585s0.321-4.451-0.346-5.687c0,0,0.321,1.706-1.187,3.858 c-1.508,2.152-1.582,4.772-0.964,6.404c0,0-3.758-1.855-3.041-5.44s1.484-3.264,1.138-5.267c0,0-3.907,3.981-3.24,7.369 c0,0-1.249-1.496-1.138-4.314c0.111-2.819,2.068-4.715,2.068-4.715S414.159,269.596,415.44,259.153z"/>
<path style="fill:#FFE15A;" d="M423.227,231.894c-0.724-0.487-1.703-0.284-2.185,0.447c-0.997,1.505-2.311,2.386-4.014,2.691 c-5.641,0.979-13.773-4.575-16.135-6.312c-3.423-2.516-7.651-2.953-10.458-1.224c-1.12,0.371-4.544,1.45-6.434,1.45 c-1.89,0-5.314-1.08-6.434-1.45c-2.807-1.729-7.036-1.292-10.458,1.224c-2.361,1.737-10.494,7.29-16.135,6.312 c-1.704-0.305-3.017-1.185-4.014-2.691c-0.482-0.729-1.461-0.932-2.185-0.447c-0.726,0.48-0.925,1.46-0.445,2.183 c1.478,2.236,3.527,3.599,6.091,4.057c0.648,0.117,1.31,0.169,1.984,0.169c6.016,0,12.823-4.292,16.568-7.041 c2.785-2.045,5.907-2.041,7.313-0.856c0.355,0.301,0.759,0.776,0.662,1.333c-0.052,0.305-0.253,0.579-0.587,0.81 c0.081-0.483-0.066-0.998-0.439-1.373c-0.616-0.616-1.613-0.616-2.229,0c-0.802,0.798-0.889,2.093-0.214,3.147 c0.679,1.056,2.142,1.828,3.88,1.185c0.883-0.329,1.589-0.958,2.078-1.728c2.396-0.697,4.565-0.702,4.565-0.702 s2.169,0.004,4.565,0.702c0.489,0.77,1.195,1.399,2.078,1.728c1.738,0.643,3.2-0.129,3.88-1.185 c0.675-1.053,0.588-2.349-0.214-3.147c-0.616-0.616-1.613-0.616-2.229,0c-0.373,0.375-0.519,0.889-0.439,1.373 c-0.334-0.231-0.534-0.505-0.587-0.81c-0.097-0.557,0.307-1.032,0.662-1.333c1.406-1.185,4.527-1.188,7.313,0.856 c3.745,2.75,10.552,7.041,16.568,7.041c0.674,0,1.336-0.052,1.984-0.169c2.564-0.459,4.613-1.823,6.091-4.057 C424.152,233.352,423.954,232.374,423.227,231.894z"/>
<g>
<path style="fill:#82AFFF;" d="M343.83,233.635c0,0-0.259-3.523-0.371-4.673s-2.262-2.003-3.079-0.853 C339.564,229.257,339.343,231.372,343.83,233.635z"/>
<path style="fill:#82AFFF;" d="M344.591,232.503c0,0,3.104-2.513,2.709-3.842c-0.394-1.33-1.231-2.019-2.266-1.625 C343.998,227.429,343.507,229.842,344.591,232.503z"/>
<path style="fill:#82AFFF;" d="M350.65,230.532c0.446-0.446,0.591-2.611-0.64-2.857c-1.231-0.246-2.857,1.675-2.759,4.04 C347.251,231.715,349.812,231.369,350.65,230.532z"/>
<path style="fill:#82AFFF;" d="M349.369,231.763c-1.429,0.457-2.808,1.675-2.808,1.675s2.561,1.871,4.335,1.281 C352.67,234.128,351.833,230.976,349.369,231.763z"/>
</g>
<path style="fill:#F5F5F5;" d="M390.453,192.612c0,0-0.223,2.782-4.34,2.04C386.113,194.652,386.225,191.759,390.453,192.612z"/>
<g>
<path style="fill:#82AFFF;" d="M424.169,233.635c0,0,0.259-3.523,0.371-4.673c0.111-1.15,2.262-2.003,3.079-0.853 C428.435,229.259,428.657,231.372,424.169,233.635z"/>
<path style="fill:#82AFFF;" d="M423.409,232.503c0,0-3.104-2.513-2.709-3.842c0.394-1.33,1.231-2.019,2.266-1.625 C424.001,227.429,424.492,229.842,423.409,232.503z"/>
<path style="fill:#82AFFF;" d="M417.35,230.532c-0.446-0.446-0.591-2.611,0.64-2.857c1.231-0.246,2.857,1.675,2.759,4.04 C420.748,231.715,418.187,231.369,417.35,230.532z"/>
<path style="fill:#82AFFF;" d="M418.63,231.763c1.429,0.457,2.808,1.675,2.808,1.675s-2.561,1.871-4.335,1.281 C415.329,234.128,416.167,230.976,418.63,231.763z"/>
</g>
<g>
<path style="fill:#464655;" d="M382.369,199.169l1.25,1.25c0.21,0.21,0.551,0.21,0.76,0l1.25-1.25 c0.339-0.339,0.099-0.918-0.381-0.918h-2.5C382.27,198.251,382.031,198.83,382.369,199.169z"/>
<path style="fill:#464655;" d="M381.715,204.294c-0.927,0-1.729-0.332-2.274-0.946c-0.564-0.638-0.803-1.515-0.661-2.408 c0.051-0.299,0.351-0.48,0.632-0.456c0.301,0.05,0.505,0.332,0.457,0.634c-0.09,0.564,0.054,1.108,0.397,1.496 c0.354,0.397,0.895,0.581,1.559,0.573c1.386-0.055,1.618-1.41,1.628-1.465l-0.007-2.473c0-0.305,0.246-0.551,0.551-0.551 s0.551,0.246,0.551,0.551v2.559c-0.134,0.884-0.856,2.408-2.68,2.482C381.819,204.294,381.766,204.294,381.715,204.294z"/>
<path style="fill:#464655;" d="M386.284,204.294c-0.051,0-0.103,0-0.156-0.003c-1.824-0.074-2.546-1.598-2.674-2.396l-0.007-2.645 c0-0.305,0.246-0.551,0.551-0.551s0.551,0.246,0.551,0.551v2.559c0.019,0.055,0.277,1.327,1.621,1.379 c0.683,0.012,1.204-0.169,1.559-0.573c0.343-0.388,0.488-0.932,0.397-1.496c-0.047-0.301,0.156-0.585,0.457-0.634 c0.288-0.036,0.584,0.154,0.632,0.456c0.143,0.893-0.097,1.77-0.66,2.408C388.012,203.962,387.211,204.294,386.284,204.294z"/>
</g>
<g>
<path style="fill:#F5F5F5;" d="M402.916,284.375c0,0-3.94-6.305-8.538-2.102c-4.598,4.204-6.305,9.327-11.56,8.932 c-2.883-0.216-4.356-1.533-5.121-2.684c1.396-1.149,2.386-2.894,1.312-5.461c-2.365-5.649-11.034-3.94-13.399,2.233 c0,0,2.759-9.064-6.831-6.042c0,0-1.182-6.305-6.699-4.598c-3,0.929-4.11,2.775-4.522,4.279c-1.161-0.27-2.652-0.262-4.017,0.843 l6.962,18.785l10.509,0.131l2.365,3.546l13.793,8.67l2.496,5.255h8.67c0,0,0.657-5.386,5.255-6.962 c4.598-1.577,12.085-4.861,12.874-7.751c0.788-2.89,0.788-2.89,0.788-2.89l8.407,0.131c0.919-0.657,7.094-10.772,7.094-10.772 l2.866-13.027C424.037,274.665,405.931,272.315,402.916,284.375z"/>
<path style="fill:#F5F5F5;" d="M425.641,274.785l-0.024,0.109c0.073,0.01,0.156,0.023,0.156,0.023L425.641,274.785z"/>
</g>
<g>
<path style="fill:#FFE15A;" d="M368.424,304.516c-3.406-1.373-4.622-3.297-5.043-4.322c-0.391-0.948-0.314-1.62-0.207-1.866 c0.217-0.502,0.48-0.822,0.725-0.884c0.231-0.055,0.523,0.077,0.576,0.11c0.11,0.126,0.169,0.526,0.063,0.625 c-0.634,0.597-0.663,1.594-0.067,2.229c0.599,0.634,1.593,0.662,2.229,0.067c0.648-0.609,1.02-1.462,1.045-2.401 c0.03-1.006-0.339-2.01-0.982-2.688c-0.646-0.683-1.971-1.305-3.383-1.053c-0.291,0.051-0.619,0.17-0.954,0.332 c0.221-2.184-0.621-3.302-1.239-3.753c-1.039-0.755-2.518-0.772-3.763-0.043c-1.273,0.748-1.961,2.057-1.793,3.411 c0.108,0.865,0.975,1.383,1.821,1.266c0.864-0.105,1.543-0.997,1.437-1.859c0.179-0.163,0.414-0.218,0.406-0.256 c0.003,0.003,0.211,0.348-0.04,1.46c-0.393,1.742-1.314,2.814-2.74,3.19c-1.775,0.49-4.049-0.258-5.393-1.734 c-1.869-2.057-5.781-12.971-8.107-20.241c9.971-4.729,11.196-12.586,11.007-16.964c-0.288-6.669-4.278-13.492-8.715-14.899 c-1.746-0.551-4.361-0.665-6.259,0.314c-1.075,0.561-1.821,1.419-2.157,2.487c-0.685,2.179,0.686,3.981,2.326,4.569 c1.698,0.609,3.412-0.124,4.071-1.746c0.327-0.807-0.03-1.73-0.836-2.057c-0.811-0.335-1.694,0.058-2.019,0.862 c-0.066,0.036-0.285-0.046-0.448-0.231c-0.118-0.136-0.143-0.268-0.085-0.449c0.052-0.167,0.171-0.413,0.605-0.638 c1.03-0.538,2.752-0.456,3.852-0.108c2.539,0.803,6.246,5.77,6.516,12.029c0.161,3.741-0.974,10.598-10.388,14.505 c-0.755,0.314-1.144,1.149-0.9,1.928c0.615,1.967,6.098,19.341,9.204,22.755c1.671,1.838,4.196,2.906,6.611,2.906 c0.654,0,1.301-0.077,1.92-0.241c1.053-0.279,1.932-0.822,2.697-1.504c0.076,0.578,0.21,1.17,0.454,1.762 c0.609,1.484,2.3,4.243,7.02,6.145c9.547,3.83,10.454,6.391,10.402,7.318c-0.029,0.508-0.32,0.772-0.557,0.905 c-0.103,0.058-0.205,0.095-0.292,0.117c0.352-0.483,0.416-1.145,0.105-1.703c-0.425-0.76-1.383-1.032-2.144-0.607 c-1.073,0.6-1.821,2.014-1.18,3.559c0.5,1.201,1.671,1.928,3.023,1.928c0.217,0,0.439-0.019,0.663-0.059 c1.963-0.332,3.413-1.961,3.529-3.959C381.31,310.253,374.103,306.794,368.424,304.516z"/>
<path style="fill:#FFE15A;" d="M399.575,304.516c3.406-1.373,4.622-3.297,5.043-4.322c0.391-0.948,0.314-1.62,0.207-1.866 c-0.217-0.502-0.48-0.822-0.725-0.884c-0.231-0.055-0.523,0.077-0.576,0.11c-0.11,0.126-0.169,0.526-0.063,0.625 c0.635,0.597,0.663,1.594,0.067,2.229c-0.599,0.634-1.593,0.662-2.229,0.067c-0.648-0.609-1.02-1.462-1.045-2.401 c-0.029-1.006,0.339-2.01,0.982-2.688c0.646-0.683,1.971-1.305,3.383-1.053c0.291,0.051,0.619,0.17,0.954,0.332 c-0.221-2.184,0.621-3.302,1.239-3.753c1.039-0.755,2.518-0.772,3.763-0.043c1.273,0.748,1.961,2.057,1.793,3.411 c-0.108,0.865-0.975,1.383-1.821,1.266c-0.864-0.105-1.543-0.997-1.437-1.859c-0.179-0.163-0.414-0.218-0.406-0.256 c-0.003,0.003-0.211,0.348,0.04,1.46c0.393,1.742,1.314,2.814,2.74,3.19c1.775,0.49,4.049-0.258,5.393-1.734 c1.869-2.057,5.781-12.971,8.107-20.241c-9.971-4.729-11.196-12.586-11.007-16.964c0.288-6.669,4.278-13.492,8.715-14.899 c1.746-0.551,4.361-0.665,6.259,0.314c1.075,0.561,1.821,1.419,2.157,2.487c0.685,2.179-0.686,3.981-2.326,4.569 c-1.698,0.609-3.412-0.124-4.071-1.746c-0.327-0.807,0.03-1.73,0.836-2.057c0.811-0.335,1.694,0.058,2.019,0.862 c0.066,0.036,0.285-0.046,0.448-0.231c0.118-0.136,0.143-0.268,0.085-0.449c-0.052-0.167-0.171-0.413-0.605-0.638 c-1.03-0.538-2.752-0.456-3.852-0.108c-2.539,0.803-6.246,5.77-6.516,12.029c-0.161,3.741,0.974,10.598,10.388,14.505 c0.755,0.314,1.144,1.149,0.9,1.928c-0.615,1.967-6.098,19.341-9.204,22.755c-1.671,1.838-4.196,2.906-6.611,2.906 c-0.654,0-1.301-0.077-1.92-0.241c-1.053-0.279-1.932-0.822-2.697-1.504c-0.076,0.578-0.21,1.17-0.454,1.762 c-0.609,1.484-2.3,4.243-7.02,6.145c-9.547,3.83-10.454,6.391-10.402,7.318c0.03,0.508,0.32,0.772,0.557,0.905 c0.103,0.058,0.205,0.095,0.292,0.117c-0.352-0.483-0.416-1.145-0.105-1.703c0.425-0.76,1.383-1.032,2.144-0.607 c1.073,0.6,1.821,2.014,1.18,3.559c-0.5,1.201-1.671,1.928-3.023,1.928c-0.217,0-0.439-0.019-0.663-0.059 c-1.963-0.332-3.413-1.961-3.529-3.959C386.688,310.253,393.896,306.794,399.575,304.516z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,193 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#FF4B55;" d="M511.808,123.616c-1.472-19.776-18.112-35.328-38.208-35.328H38.272 c-20.096,0-36.608,15.488-38.208,35.328H0v264.832h0.128c1.472,19.776,18.048,35.264,38.144,35.264H473.6 c20.224,0,36.672-15.616,38.208-35.328H512V123.616H511.808z"/>
<rect y="123.62" style="fill:#41479B;" width="512" height="264.83"/>
<circle style="fill:#F5F5F5;" cx="256" cy="256.03" r="114.82"/>
<g>
<path style="fill:#82AFFF;" d="M233.984,316.32l-17.728,3.008c-2.176,0.384-4.288-1.28-4.288-3.584v-6.72h22.016L233.984,316.32 L233.984,316.32z"/>
<path style="fill:#82AFFF;" d="M277.888,316.32l17.728,3.008c2.176,0.384,4.288-1.28,4.288-3.584v-6.72h-22.016V316.32 L277.888,316.32z"/>
</g>
<g>
<path style="fill:#965032;" d="M252.288,197.216h-1.472c-1.792,0-3.52-1.024-4.288-2.688l-2.688-5.376l2.496-1.216l2.688,5.376 c0.384,0.704,1.088,1.088,1.92,1.088h1.472v2.816L252.288,197.216L252.288,197.216z"/>
<rect x="219.945" y="195.396" transform="matrix(-0.4472 -0.8944 0.8944 -0.4472 149.6537 485.9717)" style="fill:#965032;" width="10.112" height="2.688"/>
<path style="fill:#965032;" d="M260.992,239.52l-7.488-7.488c-1.6-1.6-2.624-3.904-2.624-6.208v-2.496 c0-0.896-0.192-1.92-0.576-2.688l-1.92-3.712c-0.384-0.832-1.216-1.28-1.984-1.28h-6.528c-1.92,0-3.584-1.088-4.48-2.816 l-2.624-5.312l2.496-1.216l2.624,5.312c0.384,0.832,1.216,1.28,1.984,1.28h6.528c1.92,0,3.584,1.088,4.48,2.816l1.92,3.712 c0.576,1.216,0.896,2.624,0.896,3.904v2.496c0,1.6,0.576,3.072,1.792,4.224l2.816,2.816v-12.8c0-3.52-1.216-6.912-3.392-9.6 c-2.624-3.2-4.032-7.232-4.032-11.328v-10.624h2.688v10.624c0,3.52,1.216,6.912,3.392,9.6c2.624,3.2,4.032,7.232,4.032,11.328 L260.992,239.52L260.992,239.52z"/>
<path style="fill:#965032;" d="M254.4,232.416h-4.096c-2.496,0-4.8-1.6-5.696-3.904l-1.024-2.816l2.624-1.024l1.024,2.816 c0.512,1.28,1.728,2.112,3.072,2.112h4.096V232.416L254.4,232.416z"/>
<rect x="257.922" y="183.324" transform="matrix(-0.915 -0.4035 0.4035 -0.915 414.7991 492.3181)" style="fill:#965032;" width="2.688" height="38.271"/>
<polygon style="fill:#965032;" points="272,215.648 258.688,215.648 258.688,212.832 269.184,212.832 269.184,199.52 272,199.52 "/>
</g>
<g>
<path style="fill:#73AF00;" d="M246.784,228.832h-11.008c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h11.008c3.008,0,5.504,2.496,5.504,5.504l0,0C252.288,226.464,249.792,228.832,246.784,228.832z"/>
<path style="fill:#73AF00;" d="M272.384,228.832h-11.008c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h11.008c3.008,0,5.504,2.496,5.504,5.504l0,0C277.888,226.464,275.52,228.832,272.384,228.832z"/>
<path style="fill:#73AF00;" d="M283.392,217.824H268.8c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h14.592c3.008,0,5.504,2.496,5.504,5.504l0,0C288.896,215.456,286.4,217.824,283.392,217.824z"/>
<path style="fill:#73AF00;" d="M287.104,203.232h-25.6c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504h25.6 c3.008,0,5.504,2.496,5.504,5.504l0,0C292.608,200.736,290.112,203.232,287.104,203.232z"/>
<path style="fill:#73AF00;" d="M272.384,188.64h-7.296c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h7.296c3.008,0,5.504,2.496,5.504,5.504l0,0C277.888,186.144,275.52,188.64,272.384,188.64z"/>
<path style="fill:#73AF00;" d="M224.832,195.936h-3.712c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h3.712c3.008,0,5.504,2.496,5.504,5.504l0,0C230.272,193.44,227.904,195.936,224.832,195.936z"/>
<path style="fill:#73AF00;" d="M250.496,192.224h-11.008c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h11.008c3.008,0,5.504,2.496,5.504,5.504l0,0C255.872,189.856,253.504,192.224,250.496,192.224z"/>
<path style="fill:#73AF00;" d="M246.784,210.528h-22.016c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h22.016c3.008,0,5.504,2.496,5.504,5.504l0,0C252.288,208.16,249.792,210.528,246.784,210.528z"/>
<path style="fill:#73AF00;" d="M310.912,287.136H201.024c-4.032,0-7.296,3.328-7.296,7.296s3.328,7.296,7.296,7.296h29.312 c0,4.032,3.328,7.296,7.296,7.296h36.608c4.032,0,7.296-3.328,7.296-7.296h29.312c4.032,0,7.296-3.328,7.296-7.296 C318.208,290.336,314.88,287.136,310.912,287.136z"/>
</g>
<path style="fill:#BE7855;" d="M328.896,222.112c-0.32-0.512-1.728,0.128-2.624-0.192c-11.072-4.096-25.92-11.584-35.584-16.704 l-1.92-3.072l-18.368-8.896c-1.216-0.576-2.624-0.128-3.2,1.024l-0.896,1.6c-0.704,1.216-0.192,2.816,1.024,3.392l17.472,9.088 l4.992-0.384l19.2,9.92c0,0,13.12,6.72,13.824,7.232s1.088,3.2,2.432,3.008C326.08,227.808,330.112,224.544,328.896,222.112z"/>
<g>
<path style="fill:#FFBE3C;" d="M207.616,292.512c0,0,1.216,5.376,0.128,6.016c-1.088,0.576-7.232,0.576-7.104-0.704 c0.192-1.28,1.024-5.888,1.024-5.888L207.616,292.512z"/>
<path style="fill:#FFBE3C;" d="M217.728,289.632c0,0-1.024,4.032,1.024,4.224s13.184,0.128,13.504-0.192 c0.32-0.32,0.704-1.088,0.704-1.088l-10.432-2.88h-4.8L217.728,289.632L217.728,289.632z"/>
</g>
<path style="fill:#EAF3F5;" d="M206.272,239.264c0,0-2.688,6.528-3.712,28.928c-0.32,6.016,0.512,4.608-2.496,23.808l3.52,1.792 c1.024,0.512,2.304,0.512,3.328-0.128l3.392-2.112c0,0-1.728-21.504,3.776-33.92c0,0,2.88,5.312,2.88,9.28 s-0.192,22.976-0.192,22.976s6.4,1.088,9.28,0.832c0,0-1.792-41.408-3.712-51.072L206.272,239.264z"/>
<g>
<path style="fill:#965032;" d="M206.912,236.512c0,0-1.088,0.832-0.512,2.688c0,0,8.384,3.584,16.192,0.512 c0,0,0.896-1.28-0.192-2.816L206.912,236.512z"/>
<path style="fill:#965032;" d="M195.712,216.736c-4.8,1.792-12.032,6.208-11.52,9.728s2.88,2.688,3.712,1.792 s3.008-3.584,3.712-4.096c0.704-0.512,11.904-6.272,11.904-6.272l29.824-15.296c0,0,0.192-1.472-1.472-2.688 C231.68,199.84,213.504,210.016,195.712,216.736z"/>
</g>
<path style="fill:#FFBE3C;" d="M209.728,199.456l-0.192,1.28c0,0-0.512,8.128,2.176,10.176c0,0,0.576,1.728-0.32,2.496 c-0.896,0.832-9.984,5.376-9.984,5.376s-2.304,4.928-2.304,7.616c0,0-2.176-0.896-1.984-1.92c0.192-1.088,1.472-3.904,1.088-5.312 s-1.92-1.024-1.92-1.024s-0.704,0.832,0.512,1.28l-0.384,1.728l-4.928,2.88l1.088,1.28c0,0,0.128,10.112,6.016,11.392 c0,0,3.072,0.192,6.912-6.912c0,0,1.984,3.52,1.28,6.592c0,0,6.528,3.52,15.424,0.512l0.128-6.208c0,0,1.408,9.472,6.08,8.576 c0,0,12.992-4.992,10.816-6.912c-4.992-4.416-11.072-0.704-11.072-0.704c-0.32-6.4-0.832-14.72-1.728-15.616 c-1.408-1.472-5.632-0.704-6.4-2.624c-0.832-1.92-0.576-5.312,0.32-9.216s-3.712-6.592-3.712-6.592L209.728,199.456z"/>
<path style="fill:#464655;" d="M209.6,200.736c0,0,4.672,1.216,8.32-0.32l1.6,4.032h0.896c0,0,2.176-7.296-0.704-7.296 c0,0,0-2.432-5.12-2.304C210.176,194.912,208.576,197.856,209.6,200.736z"/>
<g>
<path style="fill:#965032;" d="M304.896,292.512c0,0-1.216,5.376-0.128,6.016c1.088,0.576,7.232,0.576,7.104-0.704 c-0.192-1.28-1.024-5.888-1.024-5.888L304.896,292.512z"/>
<path style="fill:#965032;" d="M294.784,289.632c0,0,1.024,4.032-1.024,4.224c-2.048,0.192-13.184,0.128-13.504-0.192 c-0.32-0.32-0.704-1.088-0.704-1.088l10.368-2.88h4.864L294.784,289.632L294.784,289.632z"/>
</g>
<path style="fill:#EAF3F5;" d="M306.112,239.264c0,0,2.688,6.528,3.712,28.928c0.32,6.016-0.512,4.608,2.496,23.808l-3.52,1.792 c-1.024,0.512-2.304,0.512-3.328-0.128l-3.392-2.112c0,0,1.728-21.504-3.776-33.92c0,0-2.88,5.312-2.88,9.28 s0.192,22.976,0.192,22.976s-6.4,1.088-9.28,0.832c0,0,1.792-41.408,3.712-51.072L306.112,239.264z"/>
<path style="fill:#BE7855;" d="M305.6,236.512c0,0,1.088,0.832,0.512,2.688c0,0-8.384,3.584-16.192,0.512 c0,0-0.896-1.28,0.192-2.816L305.6,236.512z"/>
<path style="fill:#965032;" d="M302.784,199.456l0.192,1.28c0,0,0.512,8.128-2.176,10.176c0,0-0.576,1.728,0.32,2.496 c0.896,0.832,9.984,5.376,9.984,5.376s2.304,4.928,2.304,7.616c0,0,2.176-0.896,1.984-1.92c-0.192-1.088-1.472-3.904-1.088-5.312 c0.384-1.408,1.92-1.024,1.92-1.024s0.704,0.832-0.512,1.28l0.384,1.728l4.928,2.88l-1.088,1.28c0,0-0.128,10.112-6.016,11.392 c0,0-3.072,0.192-6.912-6.912c0,0-1.984,3.52-1.28,6.592c0,0-6.528,3.52-15.424,0.512l-0.128-6.208c0,0-1.408,9.472-6.08,8.576 c0,0-12.992-4.992-10.816-6.912c4.992-4.416,11.072-0.704,11.072-0.704c0.32-6.4,0.832-14.72,1.728-15.616 c1.408-1.472,5.632-0.704,6.4-2.624c0.832-1.92,0.576-5.312-0.32-9.216s3.712-6.592,3.712-6.592L302.784,199.456z"/>
<path style="fill:#464655;" d="M302.912,200.736c0,0-4.672,1.216-8.32-0.32l-1.6,4.032h-0.896c0,0-2.176-7.296,0.704-7.296 c0,0,0-2.432,5.12-2.304C302.272,194.912,303.872,197.856,302.912,200.736z"/>
<path style="fill:#EAF3F5;" d="M224.512,203.744c-0.384-0.896,0.32-1.216,0.32-1.216s4.608-2.496,5.184-2.496 c0.896,0.128,1.984,1.6,1.984,3.008c0,1.28,1.728,4.8,5.312,5.696c0,0-4.48,6.08-10.688,5.184 C226.496,213.92,226.88,209.824,224.512,203.744z"/>
<path style="fill:#82AFFF;" d="M230.976,232.16c-1.408,0-2.496,1.216-2.496,2.624v30.272c0,7.296,3.392,33.024,27.52,40.32 c24-7.296,27.52-33.024,27.52-40.32v-30.272c0-1.472-1.088-2.624-2.496-2.624H230.976L230.976,232.16z"/>
<path style="fill:#FFE15A;" d="M283.392,265.12v-30.272c0-1.472-1.088-2.624-2.496-2.624h-25.024v25.6L280,281.952 C282.688,274.848,283.392,268.32,283.392,265.12z"/>
<path style="fill:#EAF3F5;" d="M228.48,265.12v-30.272c0-1.472,1.088-2.624,2.496-2.624H256v25.6l-24.128,24.128 C229.12,274.848,228.48,268.32,228.48,265.12z"/>
<polygon style="fill:#8C5A28;" points="239.68,281.12 246.08,287.84 263.808,287.84 267.52,283.04 263.232,284.832 248.896,284.832 "/>
<path style="fill:#F5F5F5;" d="M246.592,272.416l-1.024,9.792l-4.416-1.728C241.216,280.544,243.2,275.808,246.592,272.416z"/>
<g>
<rect x="255.3" y="268.64" style="fill:#8C5A28;" width="0.704" height="16.704"/>
<rect x="261.31" y="270.05" style="fill:#8C5A28;" width="0.704" height="15.232"/>
<rect x="249.28" y="270.05" style="fill:#8C5A28;" width="0.704" height="15.232"/>
</g>
<g>
<path style="fill:#F5F5F5;" d="M257.792,283.616h-4.416c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h4.416c0.32,0,0.512,0.192,0.512,0.512v2.368C258.432,283.424,258.112,283.616,257.792,283.616z"/>
<path style="fill:#F5F5F5;" d="M257.792,279.008h-4.416c-0.32,0-0.512-0.192-0.512-0.512V276c0-0.32,0.192-0.512,0.512-0.512h4.416 c0.32,0,0.512,0.192,0.512,0.512v2.432C258.432,278.752,258.112,279.008,257.792,279.008z"/>
<path style="fill:#F5F5F5;" d="M257.792,274.656h-4.416c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h4.416c0.32,0,0.512,0.192,0.512,0.512v2.368C258.432,274.464,258.112,274.656,257.792,274.656z"/>
<path style="fill:#F5F5F5;" d="M263.488,283.616h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v2.368C264,283.424,263.808,283.616,263.488,283.616z"/>
<path style="fill:#F5F5F5;" d="M263.488,279.328h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.92c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.92C264,279.136,263.808,279.328,263.488,279.328z"/>
<path style="fill:#F5F5F5;" d="M263.488,275.104h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.408c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.408C264,274.848,263.808,275.104,263.488,275.104z"/>
<path style="fill:#F5F5F5;" d="M251.392,283.616h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v2.368C252.032,283.424,251.712,283.616,251.392,283.616z"/>
<path style="fill:#F5F5F5;" d="M251.392,279.328h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.92c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.92C252.032,279.136,251.712,279.328,251.392,279.328z"/>
<path style="fill:#F5F5F5;" d="M251.392,275.104h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.408c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.408C252.032,274.848,251.712,275.104,251.392,275.104z"/>
</g>
<g>
<polygon style="fill:#FF4B55;" points="261.312,270.048 261.312,272.032 258.432,271.008 "/>
<polygon style="fill:#FF4B55;" points="249.28,270.048 249.28,272.032 246.4,271.008 "/>
<polygon style="fill:#FF4B55;" points="255.296,268.64 255.296,270.56 252.416,269.536 "/>
</g>
<path style="fill:#4173CD;" d="M277.696,287.136h-43.584c0.576,1.216,1.408,2.496,2.176,3.712h39.296 C276.416,289.504,277.12,288.352,277.696,287.136z"/>
<path style="fill:#73AF00;" d="M275.584,290.72h-39.296l0,0c1.728,2.624,3.904,5.12,6.4,7.296h26.432 C271.68,295.84,273.792,293.344,275.584,290.72L275.584,290.72z"/>
<path style="fill:#FFE15A;" d="M242.688,298.016c3.52,3.072,7.808,5.696,13.184,7.296c5.376-1.6,9.728-4.224,13.184-7.296H242.688z"/>
<path style="fill:#BE7855;" d="M251.2,259.936c0,0-0.32,0.128-0.576,0.128c-0.192-0.128-0.704-0.128-0.384-1.024 c0.128-0.384,0.384-1.024,0.192-1.216s-0.32-0.384-0.512-0.576c-0.384-0.384-0.832-0.896-1.28-1.472 c-1.024-1.088-2.112-2.304-3.392-3.52c-0.704-0.576-1.28-1.216-1.984-1.92c-0.704-0.576-1.408-1.28-2.176-1.92 c-0.384-0.192-1.024-0.384-1.472-0.512c-0.512-0.192-0.832-0.576-1.088-0.896c-0.704-0.576-1.408-1.28-1.984-1.92 c-1.28-1.216-2.496-2.368-3.52-3.392s-1.792-1.792-2.304-2.432c-0.512-0.576-0.512-1.472,0.128-1.984l1.6-1.6 c0.576-0.512,1.472-0.512,1.984,0c0.576,0.576,1.408,1.408,2.432,2.368c1.024,0.96,2.112,2.304,3.328,3.584 c0.576,0.704,1.216,1.408,1.792,2.112c0.32,0.384,0.704,0.704,0.832,1.216c0.192,0.512,0.32,1.088,0.512,1.472 c0.512,0.832,1.216,1.472,1.792,2.176s1.216,1.408,1.792,2.112c1.216,1.408,2.304,2.624,3.392,3.584 c0.512,0.512,1.024,0.896,1.408,1.28c0.192,0.192,0.384,0.384,0.576,0.576c0.128,0.192,0.704-0.128,1.216-0.192 c0.896-0.192,0.896,0.192,0.896,0.384c0,0.32-0.128,0.576-0.128,0.576L251.2,259.936z"/>
<path style="fill:#965032;" d="M233.28,262.816c-0.32,0-0.576-0.128-0.832-0.32c-0.576-0.512-0.704-1.28-0.32-1.92l12.992-17.728 c0.384-0.576,1.28-0.704,1.92-0.32c0.576,0.512,0.704,1.28,0.32,1.92l-12.992,17.728 C234.112,262.624,233.728,262.816,233.28,262.816z"/>
<polygon style="fill:#F5F5F5;" points="243.712,241.76 250.496,246.24 253.376,242.208 247.104,237.152 "/>
<path style="fill:#965032;" d="M261.824,240.032l17.408,21.504c0,0,2.432,0.128,2.112-1.792l-17.984-21.12L261.824,240.032z"/>
<path style="fill:#EAF3F5;" d="M257.92,243.04c0,0,4.928-0.896,6.912-3.904l2.816,3.328c0,0-4.608,3.2-4.992,6.72 C262.592,249.056,258.88,248.032,257.92,243.04z"/>
<g>
<path style="fill:#965032;" d="M276.672,240.864c-0.32,0-0.576-0.192-0.832-0.512c-0.512-0.896-0.576-1.792-0.32-2.496 c0.512-1.024,1.472-1.28,1.728-1.408c0.512-0.128,1.024,0.192,1.088,0.576c0.128,0.512-0.192,1.024-0.576,1.088 c-0.128,0-0.384,0.192-0.512,0.384s0,0.576,0.192,1.024c0.192,0.384,0.128,1.024-0.384,1.216 C276.992,240.864,276.8,240.864,276.672,240.864z"/>
<path style="fill:#965032;" d="M262.4,254.112c0-0.32-0.192-0.576-0.512-0.832c-0.896-0.512-1.792-0.576-2.496-0.32 c-1.024,0.512-1.28,1.472-1.408,1.728c-0.128,0.512,0.192,1.024,0.576,1.088c0.512,0.128,1.024-0.192,1.088-0.576 c0-0.128,0.192-0.384,0.384-0.512c0.192-0.128,0.576,0,1.024,0.192c0.384,0.192,1.024,0.128,1.216-0.384 C262.4,254.432,262.4,254.24,262.4,254.112z"/>
</g>
<polygon style="fill:#EAF3F5;" points="277.312,238.816 260.928,254.944 264.704,259.232 280.768,243.104 "/>
<path style="fill:#FFBE3C;" d="M194.112,215.712c1.088-0.32,2.112,1.216,1.088,2.304s-3.904,3.008-4.672,2.816 C188.928,220.512,187.776,217.12,194.112,215.712z"/>
<path style="fill:#965032;" d="M318.272,217.248c-1.024-0.32-1.92,1.216-1.024,2.304c0.896,1.088,3.584,3.008,4.416,2.816 C323.2,222.048,324.096,218.72,318.272,217.248z"/>
<path style="fill:#464655;" d="M280.896,232.16c1.408,0,2.496,1.216,2.496,2.624v30.272c0,7.296-3.392,33.024-27.52,40.32 c-24-7.296-27.52-33.024-27.52-40.32v-30.272c0-1.472,1.088-2.624,2.496-2.624H280.896 M280.896,230.304h-49.92 c-2.432,0-4.288,1.984-4.288,4.48v30.272c0,1.728,0.192,11.008,4.928,20.928c4.992,10.624,13.184,17.92,23.872,21.12l0.512,0.192 l0.512-0.192c10.688-3.2,18.88-10.496,23.872-21.12c4.672-9.92,4.928-19.2,4.928-20.928v-30.272 C285.184,232.352,283.328,230.304,280.896,230.304L280.896,230.304z"/>
<path style="fill:#EAF3F5;" d="M299.904,305.824c-7.808-2.624-16.128-1.408-24,3.776c-10.112,6.72-16.704,6.72-19.904,6.72 c-3.2,0-9.92,0-19.904-6.72c-7.872-5.184-16.192-6.528-24-3.776v7.808c4.928-2.304,11.776-3.328,19.904,2.112 c11.904,7.872,20.416,7.872,24,7.872c3.584,0,12.096,0,24-7.872c8.128-5.376,14.976-4.416,19.904-2.112V305.824z"/>
<path style="fill:#965032;" d="M255.872,347.552c-51.52,0-93.376-41.92-93.376-93.376s41.92-93.376,93.376-93.376 s93.44,41.856,93.44,93.312S307.392,347.552,255.872,347.552z M255.872,164.448c-49.472,0-89.728,40.192-89.728,89.728 s40.192,89.728,89.728,89.728s89.728-40.256,89.728-89.792S305.408,164.448,255.872,164.448z"/>
<g>
<path style="fill:#73AF00;" d="M153.792,261.92c0,0-0.384-11.392,10.624-11.392c0,0,0.192,4.48-3.712,6.528 C157.504,258.528,153.792,261.92,153.792,261.92z"/>
<path style="fill:#73AF00;" d="M174.976,261.92c0,0,0.384-11.392-10.624-11.392c0,0-0.192,4.48,3.712,6.528 C171.392,258.528,174.976,261.92,174.976,261.92z"/>
<path style="fill:#73AF00;" d="M358.016,250.464c0,0,0.384,11.392-10.624,11.392c0,0-0.192-4.48,3.712-6.528 C354.304,253.856,358.016,250.464,358.016,250.464z"/>
<path style="fill:#73AF00;" d="M336.832,250.464c0,0-0.384,11.392,10.624,11.392c0,0,0.192-4.48-3.712-6.528 C340.416,253.856,336.832,250.464,336.832,250.464z"/>
<path style="fill:#73AF00;" d="M261.632,358.304c0,0-11.392,0.384-11.392-10.624c0,0,4.48-0.192,6.528,3.712 C258.304,354.656,261.632,358.304,261.632,358.304z"/>
<path style="fill:#73AF00;" d="M261.632,337.056c0,0-11.392-0.384-11.392,10.624c0,0,4.48,0.192,6.528-3.712 C258.304,340.704,261.632,337.056,261.632,337.056z"/>
<path style="fill:#73AF00;" d="M250.176,154.144c0,0,11.392-0.384,11.392,10.624c0,0-4.48,0.192-6.528-3.712 C253.504,157.728,250.176,154.144,250.176,154.144z"/>
<path style="fill:#73AF00;" d="M250.176,175.328c0,0,11.392,0.384,11.392-10.624c0,0-4.48-0.192-6.528,3.712 C253.504,171.616,250.176,175.328,250.176,175.328z"/>
<path style="fill:#73AF00;" d="M187.776,332.448c0,0-8.384-7.808-0.576-15.616c0,0,3.328,3.008,1.92,7.232 C188.032,327.456,187.776,332.448,187.776,332.448z"/>
<path style="fill:#73AF00;" d="M202.816,317.408c0,0-7.808-8.384-15.616-0.576c0,0,3.008,3.328,7.232,1.92 C197.824,317.664,202.816,317.408,202.816,317.408z"/>
<path style="fill:#73AF00;" d="M324.096,179.936c0,0,8.384,7.808,0.576,15.616c0,0-3.328-3.008-1.92-7.232 C323.776,184.928,324.096,179.936,324.096,179.936z"/>
<path style="fill:#73AF00;" d="M309.12,194.912c0,0,7.808,8.384,15.616,0.576c0,0-3.008-3.328-7.232-1.92 C313.984,194.72,309.12,194.912,309.12,194.912z"/>
<path style="fill:#73AF00;" d="M332.096,324.32c0,0-7.808,8.384-15.616,0.576c0,0,3.008-3.328,7.232-1.92 C327.232,324.128,332.096,324.32,332.096,324.32z"/>
<path style="fill:#73AF00;" d="M317.12,309.344c0,0-8.384,7.808-0.576,15.616c0,0,3.328-3.008,1.92-7.232 C317.376,314.336,317.12,309.344,317.12,309.344z"/>
<path style="fill:#73AF00;" d="M179.712,188.064c0,0,7.808-8.384,15.616-0.576c0,0-3.008,3.328-7.232,1.92 C184.576,188.256,179.712,188.064,179.712,188.064z"/>
<path style="fill:#73AF00;" d="M194.688,203.04c0,0,8.384-7.808,0.576-15.616c0,0-3.328,3.008-1.92,7.232 C194.496,198.112,194.688,203.04,194.688,203.04z"/>
<path style="fill:#73AF00;" d="M163.776,300.512c0,0-4.672-10.432,5.376-14.592c0,0,1.92,4.096-1.024,7.424 C165.888,296.032,163.776,300.512,163.776,300.512z"/>
<path style="fill:#73AF00;" d="M183.424,292.448c0,0-4.032-10.688-14.208-6.528c0,0,1.472,4.224,5.888,4.608 C178.688,290.72,183.424,292.448,183.424,292.448z"/>
<path style="fill:#73AF00;" d="M348.032,211.808c0,0,4.672,10.432-5.376,14.592c0,0-1.92-4.096,1.024-7.424 C345.92,216.352,348.032,211.808,348.032,211.808z"/>
<path style="fill:#73AF00;" d="M328.384,219.936c0,0,4.032,10.688,14.208,6.528c0,0-1.472-4.224-5.888-4.608 C333.12,221.664,328.384,219.936,328.384,219.936z"/>
<path style="fill:#73AF00;" d="M300.288,348.32c0,0-10.368,4.672-14.592-5.376c0,0,4.096-1.92,7.424,1.024 C295.808,346.208,300.288,348.32,300.288,348.32z"/>
<path style="fill:#73AF00;" d="M292.096,328.736c0,0-10.688,4.032-6.528,14.208c0,0,4.224-1.472,4.608-5.888 C290.432,333.408,292.096,328.736,292.096,328.736z"/>
<path style="fill:#73AF00;" d="M211.584,164.064c0,0,10.432-4.672,14.592,5.376c0,0-4.096,1.92-7.424-1.024 C216.128,166.112,211.584,164.064,211.584,164.064z"/>
<path style="fill:#73AF00;" d="M219.712,183.648c0,0,10.688-4.032,6.528-14.208c0,0-4.224,1.472-4.608,5.888 C221.376,179.04,219.712,183.648,219.712,183.648z"/>
<path style="fill:#73AF00;" d="M222.08,352.736c0,0-10.688-4.032-6.528-14.208c0,0,4.224,1.472,4.608,5.888 C220.416,348.064,222.08,352.736,222.08,352.736z"/>
<path style="fill:#73AF00;" d="M230.208,333.152c0,0-10.432-4.672-14.592,5.376c0,0,4.096,1.92,7.424-1.024 C225.728,335.264,230.208,333.152,230.208,333.152z"/>
<path style="fill:#73AF00;" d="M289.728,159.712c0,0,10.688,4.032,6.528,14.208c0,0-4.224-1.472-4.608-5.888 C291.392,164.32,289.728,159.712,289.728,159.712z"/>
<path style="fill:#73AF00;" d="M281.6,179.232c0,0,10.432,4.672,14.592-5.376c0,0-4.096-1.92-7.424,1.024 C286.08,177.248,281.6,179.232,281.6,179.232z"/>
<path style="fill:#73AF00;" d="M352.384,289.952c0,0-4.032,10.688-14.208,6.528c0,0,1.472-4.224,5.888-4.608 C347.776,291.616,352.384,289.952,352.384,289.952z"/>
<path style="fill:#73AF00;" d="M332.8,281.824c0,0-4.672,10.432,5.376,14.592c0,0,1.92-4.096-1.024-7.424 C334.912,286.304,332.8,281.824,332.8,281.824z"/>
<path style="fill:#73AF00;" d="M159.424,222.432c0,0,4.032-10.688,14.208-6.528c0,0-1.472,4.224-5.888,4.608 C164.096,220.704,159.424,222.432,159.424,222.432z"/>
<path style="fill:#73AF00;" d="M179.008,230.56c0,0,4.672-10.432-5.376-14.592c0,0-1.92,4.096,1.024,7.424 C176.896,226.016,179.008,230.56,179.008,230.56z"/>
<path style="fill:#73AF00;" d="M156.928,281.76c0,0-2.624-11.072,8.192-13.312c0,0,1.088,4.416-2.432,7.104 C159.808,277.728,156.928,281.76,156.928,281.76z"/>
<path style="fill:#73AF00;" d="M177.728,277.664c0,0-1.92-11.328-12.608-9.216c0,0,0.704,4.48,4.928,5.632 C173.504,275.04,177.728,277.664,177.728,277.664z"/>
<path style="fill:#73AF00;" d="M354.88,230.624c0,0,2.624,11.072-8.192,13.312c0,0-1.088-4.416,2.368-7.104 C352,234.656,354.88,230.624,354.88,230.624z"/>
<path style="fill:#73AF00;" d="M334.08,234.848c0,0,1.92,11.328,12.608,9.216c0,0-0.704-4.48-4.928-5.632 C338.432,237.408,334.08,234.848,334.08,234.848z"/>
<path style="fill:#73AF00;" d="M281.408,355.232c0,0-11.072,2.624-13.312-8.192c0,0,4.416-1.088,7.104,2.432 C277.376,352.224,281.408,355.232,281.408,355.232z"/>
<path style="fill:#73AF00;" d="M277.312,334.432c0,0-11.328,1.92-9.216,12.608c0,0,4.48-0.704,5.632-4.928 C274.688,338.656,277.312,334.432,277.312,334.432z"/>
<path style="fill:#73AF00;" d="M230.4,157.216c0,0,11.072-2.624,13.312,8.192c0,0-4.416,1.088-7.104-2.432 C234.432,160.16,230.4,157.216,230.4,157.216z"/>
<path style="fill:#73AF00;" d="M234.496,178.016c0,0,11.328-1.92,9.216-12.608c0,0-4.48,0.704-5.632,4.928 C237.12,173.728,234.496,178.016,234.496,178.016z"/>
<path style="fill:#73AF00;" d="M203.904,344.224c0,0-9.728-6.016-3.584-15.232c0,0,3.904,2.304,3.328,6.72 C203.2,339.36,203.904,344.224,203.904,344.224z"/>
<path style="fill:#73AF00;" d="M215.68,326.624c0,0-9.28-6.72-15.424,2.496c0,0,3.584,2.688,7.488,0.512 C210.88,327.84,215.68,326.624,215.68,326.624z"/>
<path style="fill:#73AF00;" d="M307.904,168.16c0,0,9.728,6.016,3.584,15.232c0,0-3.904-2.304-3.328-6.72 C308.608,173.024,307.904,168.16,307.904,168.16z"/>
<path style="fill:#73AF00;" d="M296.128,185.76c0,0,9.28,6.72,15.424-2.496c0,0-3.584-2.688-7.488-0.512 C300.928,184.608,296.128,185.76,296.128,185.76z"/>
<path style="fill:#73AF00;" d="M344,308.128c0,0-6.016,9.728-15.232,3.584c0,0,2.304-3.904,6.72-3.328 C339.072,308.96,344,308.128,344,308.128z"/>
<path style="fill:#73AF00;" d="M326.272,296.352c0,0-6.72,9.28,2.496,15.424c0,0,2.688-3.584,0.512-7.488 C327.488,301.216,326.272,296.352,326.272,296.352z"/>
<path style="fill:#73AF00;" d="M167.808,204.256c0,0,6.016-9.728,15.232-3.584c0,0-2.304,3.904-6.72,3.328 C172.672,203.424,167.808,204.256,167.808,204.256z"/>
<path style="fill:#73AF00;" d="M185.472,216.032c0,0,6.72-9.28-2.496-15.424c0,0-2.688,3.584-0.512,7.488 C184.32,211.232,185.472,216.032,185.472,216.032z"/>
<path style="fill:#73AF00;" d="M174.208,317.664c0,0-6.72-9.28,2.496-15.424c0,0,2.688,3.584,0.512,7.488 C175.424,312.8,174.208,317.664,174.208,317.664z"/>
<path style="fill:#73AF00;" d="M191.808,305.952c0,0-6.016-9.728-15.232-3.584c0,0,2.304,3.904,6.72,3.328 C186.88,305.12,191.808,305.952,191.808,305.952z"/>
<path style="fill:#73AF00;" d="M337.6,194.72c0,0,6.72,9.28-2.496,15.424c0,0-2.688-3.584-0.512-7.488 C336.384,199.52,337.6,194.72,337.6,194.72z"/>
<path style="fill:#73AF00;" d="M320,206.56c0,0,6.016,9.728,15.232,3.584c0,0-2.304-3.904-6.72-3.328 C324.928,207.264,320,206.56,320,206.56z"/>
<path style="fill:#73AF00;" d="M317.376,337.952c0,0-9.28,6.72-15.424-2.496c0,0,3.584-2.688,7.488-0.512 C312.576,336.736,317.376,337.952,317.376,337.952z"/>
<path style="fill:#73AF00;" d="M305.6,320.224c0,0-9.728,6.016-3.584,15.232c0,0,3.904-2.304,3.328-6.72 C304.768,325.152,305.6,320.224,305.6,320.224z"/>
<path style="fill:#73AF00;" d="M194.432,174.56c0,0,9.28-6.72,15.424,2.496c0,0-3.584,2.688-7.488,0.512 C199.296,175.648,194.432,174.56,194.432,174.56z"/>
<path style="fill:#73AF00;" d="M206.208,192.16c0,0,9.728-6.016,3.584-15.232c0,0-3.904,2.304-3.328,6.72 C206.976,187.232,206.208,192.16,206.208,192.16z"/>
<path style="fill:#73AF00;" d="M241.6,357.408c0,0-11.328-1.92-9.216-12.608c0,0,4.48,0.704,5.632,4.928 C238.976,353.248,241.6,357.408,241.6,357.408z"/>
<path style="fill:#73AF00;" d="M245.696,336.608c0,0-11.072-2.624-13.312,8.192c0,0,4.416,1.088,7.104-2.368 C241.728,339.552,245.696,336.608,245.696,336.608z"/>
<path style="fill:#73AF00;" d="M270.208,154.912c0,0,11.328,1.92,9.216,12.608c0,0-4.48-0.704-5.632-4.928 C272.768,159.264,270.208,154.912,270.208,154.912z"/>
<path style="fill:#73AF00;" d="M266.112,175.712c0,0,11.072,2.624,13.312-8.192c0,0-4.416-1.088-7.104,2.432 C270.08,172.832,266.112,175.712,266.112,175.712z"/>
<path style="fill:#73AF00;" d="M357.184,270.56c0,0-1.92,11.328-12.608,9.216c0,0,0.704-4.48,4.928-5.632 C352.896,273.056,357.184,270.56,357.184,270.56z"/>
<path style="fill:#73AF00;" d="M336.384,266.336c0,0-2.624,11.072,8.192,13.312c0,0,1.088-4.416-2.432-7.104 C339.328,270.304,336.384,266.336,336.384,266.336z"/>
<path style="fill:#73AF00;" d="M154.688,241.952c0,0,1.92-11.328,12.608-9.216c0,0-0.704,4.48-4.928,5.632 C158.912,239.328,154.688,241.952,154.688,241.952z"/>
<path style="fill:#73AF00;" d="M175.488,246.048c0,0,2.624-11.072-8.192-13.312c0,0-1.088,4.416,2.432,7.104 C172.48,242.016,175.488,246.048,175.488,246.048z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -1,81 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
<path style="fill:#73AF00;" d="M473.655,88.276H38.345C17.167,88.276,0,105.444,0,126.621v73.471h512v-73.471 C512,105.444,494.833,88.276,473.655,88.276z"/>
<path style="fill:#FF4B55;" d="M0,385.38c0,21.177,17.167,38.345,38.345,38.345h435.31c21.177,0,38.345-17.167,38.345-38.345 v-73.471H0V385.38z"/>
<g>
<rect y="200.089" style="fill:#F5F5F5;" width="512" height="111.81"/>
<path style="fill:#F5F5F5;" d="M1.388,194.176h0.078c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.827c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.389,1.388h11.502c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.79c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h2.935 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.621,1.388-1.389,1.388h-5.792c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.622-1.388-1.389-1.388H1.388c-0.767,0-1.388,0.621-1.388,1.388v5.939C0,193.553,0.621,194.176,1.388,194.176z M7.137,194.176h0.079c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388H7.137 c-0.767,0-1.389,0.622-1.389,1.388v0.079C5.748,193.553,6.37,194.176,7.137,194.176z M1.388,182.531h34.423 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388H1.388c-0.767,0-1.388,0.621-1.388,1.388v0.152 C0,181.91,0.621,182.531,1.388,182.531z M35.811,194.176h-5.79c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.621-1.388,1.389-1.388h8.647c0.767,0,1.389-0.622,1.389-1.388v-3.081c0-0.767,0.621-1.388,1.388-1.388h0.077 c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.079c0.767,0,1.388-0.621,1.388-1.388v-8.94 c0-0.767,0.621-1.388,1.388-1.388h0.077c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.115 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.042c0.767,0,1.388,0.621,1.388,1.388v11.797 c0,0.767-0.621,1.388-1.388,1.388H41.447c-0.767,0-1.388-0.621-1.388-1.388v-3.008c0-0.767-0.621-1.388-1.389-1.388h-5.79 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h2.933c0.767,0,1.389,0.622,1.389,1.388v0.079 C37.201,193.553,36.578,194.176,35.811,194.176z"/>
<path style="fill:#F5F5F5;" d="M58.618,194.176h0.115c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388 h5.754c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.388,1.388h11.502c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.79c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h2.935 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.621,1.388-1.388,1.388h-5.792c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388H58.618c-0.767,0-1.388,0.621-1.388,1.388v5.939C57.23,193.553,57.852,194.176,58.618,194.176z M64.331,194.176h0.078c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388h-0.078 c-0.767,0-1.388,0.622-1.388,1.388v0.079C62.943,193.553,63.564,194.176,64.331,194.176z M58.618,182.531h34.387 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388H58.618c-0.767,0-1.388,0.621-1.388,1.388v0.152 C57.23,181.91,57.852,182.531,58.618,182.531z M93.006,194.176h-5.827c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.621-1.388,1.389-1.388h8.648c0.767,0,1.388-0.622,1.388-1.388v-3.081c0-0.767,0.621-1.388,1.389-1.388h0.115 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.621-1.388,1.389-1.388h0.042c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.078c0.767,0,1.388,0.621,1.388,1.388v11.797 c0,0.767-0.621,1.388-1.388,1.388H98.604c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.388-1.388h-5.754 c-0.767,0-1.388,0.621-1.388,1.388v0.151c0,0.767,0.621,1.388,1.388,1.388h2.935c0.767,0,1.389,0.622,1.389,1.388v0.079 C94.394,193.553,93.773,194.176,93.006,194.176z"/>
<path style="fill:#F5F5F5;" d="M115.814,194.176h0.077c0.767,0,1.388-0.621,1.388-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388 h5.792c0.767,0,1.388,0.621,1.388,1.388v3.008c0,0.767,0.622,1.388,1.389,1.388h11.538c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.621-1.388-1.389-1.388h-5.79c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h2.935 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.621,1.388-1.389,1.388h-5.827c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388h-11.502c-0.767,0-1.388,0.621-1.388,1.388v5.939 C114.424,193.553,115.047,194.176,115.814,194.176z M121.526,194.176h0.078c0.767,0,1.388-0.621,1.388-1.388v-0.079 c0-0.767-0.621-1.388-1.388-1.388h-0.078c-0.767,0-1.388,0.622-1.388,1.388v0.079C120.137,193.553,120.759,194.176,121.526,194.176 z M115.814,182.531h34.424c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388h-34.424 c-0.767,0-1.388,0.621-1.388,1.388v0.152C114.424,181.91,115.047,182.531,115.814,182.531z M150.238,194.176h-5.827 c-0.767,0-1.389-0.621-1.389-1.388v-5.939c0-0.767,0.621-1.388,1.389-1.388h8.646c0.767,0,1.388-0.622,1.388-1.388v-3.081 c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.389,1.388h0.115 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.116c0.767,0,1.388,0.621,1.388,1.388v8.94 c0,0.767,0.622,1.388,1.388,1.388h0.042c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.078 c0.767,0,1.388,0.621,1.388,1.388v11.797c0,0.767-0.622,1.388-1.388,1.388h-11.54c-0.767,0-1.389-0.621-1.389-1.388v-3.008 c0-0.767-0.621-1.388-1.388-1.388h-5.79c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h2.973 c0.767,0,1.389,0.622,1.389,1.388v0.079C151.627,193.553,151.005,194.176,150.238,194.176z"/>
<path style="fill:#F5F5F5;" d="M173.007,194.176h0.077c0.767,0,1.388-0.621,1.388-1.388v-3.008c0-0.767,0.622-1.388,1.388-1.388 h5.79c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.389,1.388h11.54c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.827c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h2.935 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.621,1.388-1.388,1.388h-5.79c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.622-1.388-1.389-1.388h-11.502c-0.767,0-1.389,0.621-1.389,1.388v5.939 C171.619,193.553,172.241,194.176,173.007,194.176z M178.72,194.176h0.077c0.767,0,1.388-0.621,1.388-1.388v-0.079 c0-0.767-0.621-1.388-1.388-1.388h-0.077c-0.767,0-1.389,0.622-1.389,1.388v0.079C177.331,193.553,177.953,194.176,178.72,194.176z M173.007,182.531h34.387c0.767,0,1.388-0.621,1.388-1.388v-0.152c0-0.767-0.621-1.388-1.388-1.388h-34.387 c-0.767,0-1.389,0.621-1.389,1.388v0.152C171.619,181.91,172.241,182.531,173.007,182.531z M207.395,194.176h-5.827 c-0.767,0-1.388-0.621-1.388-1.388v-5.939c0-0.767,0.621-1.388,1.388-1.388h8.721c0.767,0,1.389-0.622,1.389-1.388v-3.081 c0-0.767,0.621-1.388,1.388-1.388h0.078c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.042 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.116c0.767,0,1.388,0.621,1.388,1.388v8.94 c0,0.767,0.621,1.388,1.388,1.388h0.079c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.077 c0.767,0,1.388,0.621,1.388,1.388v11.797c0,0.767-0.621,1.388-1.388,1.388h-11.501c-0.767,0-1.388-0.621-1.388-1.388v-3.008 c0-0.767-0.621-1.388-1.389-1.388h-5.827c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.622,1.388,1.389,1.388h2.935 c0.767,0,1.388,0.622,1.388,1.388v0.079C208.783,193.553,208.162,194.176,207.395,194.176z"/>
<path style="fill:#F5F5F5;" d="M230.2,194.176h0.079c0.767,0,1.388-0.621,1.388-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388h5.79 c0.767,0,1.388,0.621,1.388,1.388v3.008c0,0.767,0.622,1.388,1.389,1.388h11.54c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.827c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h2.97 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.622,1.388-1.388,1.388h-5.79c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.621-1.388-1.389-1.388h-11.54c-0.767,0-1.389,0.621-1.389,1.388v5.939C228.812,193.553,229.433,194.176,230.2,194.176z M235.95,194.176h0.042c0.767,0,1.389-0.621,1.389-1.388v-0.079c0-0.767-0.622-1.388-1.389-1.388h-0.042 c-0.767,0-1.388,0.622-1.388,1.388v0.079C234.561,193.553,235.183,194.176,235.95,194.176z M230.2,182.531h34.425 c0.767,0,1.388-0.621,1.388-1.388v-0.152c0-0.767-0.622-1.388-1.388-1.388H230.2c-0.767,0-1.389,0.621-1.389,1.388v0.152 C228.812,181.91,229.433,182.531,230.2,182.531z M264.626,194.176h-5.827c-0.767,0-1.388-0.621-1.388-1.388v-5.939 c0-0.767,0.621-1.388,1.388-1.388h8.684c0.767,0,1.388-0.622,1.388-1.388v-3.081c0-0.767,0.622-1.388,1.389-1.388h0.077 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.388,1.388h0.079c0.767,0,1.388-0.621,1.388-1.388v-8.94 c0-0.767,0.622-1.388,1.389-1.388h0.077c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.388,1.388h0.077 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.622,1.388-1.389,1.388h-11.502c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.388-1.388h-5.827 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.622,1.388,1.389,1.388h2.97c0.767,0,1.388,0.622,1.388,1.388v0.079 C266.014,193.553,265.393,194.176,264.626,194.176z"/>
<path style="fill:#F5F5F5;" d="M287.395,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.79c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.622,1.388,1.388,1.388h11.54c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.621-1.388-1.389-1.388h-5.792c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h2.9 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.622,1.388-1.389,1.388h-5.754c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388h-11.54c-0.767,0-1.389,0.621-1.389,1.388v5.939C286.006,193.553,286.628,194.176,287.395,194.176 z M293.144,194.176h0.042c0.767,0,1.389-0.621,1.389-1.388v-0.079c0-0.767-0.622-1.388-1.389-1.388h-0.042 c-0.767,0-1.388,0.622-1.388,1.388v0.079C291.756,193.553,292.377,194.176,293.144,194.176z M287.395,182.531h34.425 c0.767,0,1.388-0.621,1.388-1.388v-0.152c0-0.767-0.622-1.388-1.388-1.388h-34.425c-0.767,0-1.389,0.621-1.389,1.388v0.152 C286.006,181.91,286.628,182.531,287.395,182.531z M321.82,194.176h-5.79c-0.767,0-1.388-0.621-1.388-1.388v-5.939 c0-0.767,0.621-1.388,1.388-1.388h8.646c0.767,0,1.388-0.622,1.388-1.388v-3.081c0-0.767,0.622-1.388,1.389-1.388h0.079 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.077c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.621-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.078 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.622,1.388-1.389,1.388h-11.505c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.388-1.388h-5.826 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.622,1.388,1.389,1.388h2.97c0.767,0,1.388,0.622,1.388,1.388v0.079 C323.209,193.553,322.586,194.176,321.82,194.176z"/>
<path style="fill:#F5F5F5;" d="M344.589,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388 h5.826c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.388,1.388h11.505c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.792c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h2.973 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.621,1.388-1.388,1.388h-5.865c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.622-1.388-1.389-1.388H344.59c-0.767,0-1.389,0.621-1.389,1.388v5.939C343.2,193.553,343.822,194.176,344.589,194.176z M350.302,194.176h0.116c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388h-0.116 c-0.767,0-1.388,0.622-1.388,1.388v0.079C348.913,193.553,349.535,194.176,350.302,194.176z M344.589,182.531h34.424 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388h-34.424c-0.767,0-1.389,0.621-1.389,1.388v0.152 C343.2,181.91,343.822,182.531,344.589,182.531z M379.015,194.176h-5.79c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.621-1.388,1.389-1.388h8.646c0.767,0,1.389-0.622,1.389-1.388v-3.081c0-0.767,0.621-1.388,1.389-1.388h0.079 c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.077c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.04c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.622,1.388-1.389,1.388h-11.502c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.389-1.388h-5.754 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h2.899c0.767,0,1.389,0.622,1.389,1.388v0.079 C380.403,193.553,379.782,194.176,379.015,194.176z"/>
<path style="fill:#F5F5F5;" d="M401.82,194.176h0.042c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.792c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.388,1.388h11.538c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.622-1.388-1.389-1.388h-5.752c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h2.933 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.621,1.388-1.389,1.388h-5.825c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.621-1.388-1.389-1.388H401.82c-0.767,0-1.389,0.621-1.389,1.388v5.939C400.43,193.553,401.053,194.176,401.82,194.176z M407.532,194.176h0.079c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388h-0.079 c-0.767,0-1.388,0.622-1.388,1.388v0.079C406.143,193.553,406.764,194.176,407.532,194.176z M401.82,182.531h34.462 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388H401.82c-0.767,0-1.389,0.621-1.389,1.388v0.152 C400.43,181.91,401.053,182.531,401.82,182.531z M436.281,194.176h-5.865c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.622-1.388,1.389-1.388h8.647c0.767,0,1.389-0.622,1.389-1.388v-3.081c0-0.767,0.622-1.388,1.389-1.388h0.115 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.389,1.388h0.077c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.621-1.388,1.388-1.388h0.042c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.621-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.621,1.388-1.389,1.388h-11.54c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.389-1.388h-5.79 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h3.008c0.767,0,1.389,0.622,1.389,1.388v0.079 C437.671,193.553,437.048,194.176,436.281,194.176z"/>
<path style="fill:#F5F5F5;" d="M459.013,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.79c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.389,1.388h11.54c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.621-1.388-1.389-1.388h-5.754c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.622,1.388,1.388,1.388h2.935 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.622,1.388-1.388,1.388h-5.865c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388h-11.502c-0.767,0-1.389,0.621-1.389,1.388v5.939 C457.625,193.553,458.247,194.176,459.013,194.176z M464.726,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-0.079 c0-0.767-0.621-1.388-1.389-1.388h-0.079c-0.767,0-1.388,0.622-1.388,1.388v0.079C463.338,193.553,463.959,194.176,464.726,194.176 z M459.013,182.531h34.388c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388h-34.388 c-0.767,0-1.389,0.621-1.389,1.388v0.152C457.625,181.91,458.247,182.531,459.013,182.531z M493.401,194.176h-5.79 c-0.767,0-1.389-0.621-1.389-1.388v-5.939c0-0.767,0.621-1.388,1.389-1.388h8.721c0.767,0,1.389-0.622,1.389-1.388v-3.081 c0-0.767,0.621-1.388,1.388-1.388h0.004c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.152 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.389-1.388h0.004c0.767,0,1.389,0.621,1.389,1.388v8.94 c0,0.767,0.622,1.388,1.389,1.388h0.079c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.151 c0.767,0,1.389,0.621,1.389,1.388v11.797c0,0.767-0.622,1.388-1.389,1.388h-11.502c-0.767,0-1.388-0.621-1.388-1.388v-3.008 c0-0.767-0.622-1.388-1.389-1.388h-5.864c-0.767,0-1.388,0.621-1.388,1.388v0.151c0,0.767,0.621,1.388,1.388,1.388h2.933 c0.767,0,1.389,0.622,1.389,1.388v0.079C494.79,193.553,494.168,194.176,493.401,194.176z"/>
<path style="fill:#F5F5F5;" d="M1.388,203.035h22.963c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 H1.388C0.621,197.178,0,197.8,0,198.566v3.081C0,202.414,0.621,203.035,1.388,203.035z M30.022,203.035h22.927 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388H30.022c-0.767,0-1.389,0.622-1.389,1.388v3.081 C28.632,202.414,29.255,203.035,30.022,203.035z"/>
<path style="fill:#F5F5F5;" d="M58.618,203.035h22.927c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 H58.618c-0.767,0-1.388,0.622-1.388,1.388v3.081C57.23,202.414,57.852,203.035,58.618,203.035z M87.179,203.035h23 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388h-23c-0.767,0-1.389,0.622-1.389,1.388v3.081 C85.79,202.414,86.412,203.035,87.179,203.035z"/>
<path style="fill:#F5F5F5;" d="M115.814,203.035h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388 h-22.963c-0.767,0-1.388,0.622-1.388,1.388v3.081C114.424,202.414,115.047,203.035,115.814,203.035z M144.41,203.035h22.963 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.622-1.388-1.388-1.388H144.41c-0.767,0-1.389,0.622-1.389,1.388v3.081 C143.021,202.414,143.644,203.035,144.41,203.035z"/>
<path style="fill:#F5F5F5;" d="M173.007,203.035h22.963c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 h-22.963c-0.767,0-1.389,0.622-1.389,1.388v3.081C171.619,202.414,172.241,203.035,173.007,203.035z M201.568,203.035h23 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388h-23c-0.767,0-1.388,0.622-1.388,1.388v3.081 C200.179,202.414,200.8,203.035,201.568,203.035z"/>
<path style="fill:#F5F5F5;" d="M230.2,203.035h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 H230.2c-0.767,0-1.389,0.622-1.389,1.388v3.081C228.812,202.414,229.433,203.035,230.2,203.035z M258.797,203.035h22.965 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388h-22.965c-0.767,0-1.388,0.622-1.388,1.388v3.081 C257.409,202.414,258.03,203.035,258.797,203.035z"/>
<path style="fill:#F5F5F5;" d="M287.395,203.035h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388 h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081C286.006,202.414,286.628,203.035,287.395,203.035z M316.03,203.035h22.927 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388H316.03c-0.767,0-1.388,0.622-1.388,1.388v3.081 C314.641,202.414,315.263,203.035,316.03,203.035z"/>
<path style="fill:#F5F5F5;" d="M344.589,203.035h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081C343.2,202.414,343.822,203.035,344.589,203.035z M373.224,203.035h22.925 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388h-22.925c-0.767,0-1.389,0.622-1.389,1.388v3.081 C371.836,202.414,372.457,203.035,373.224,203.035z"/>
<path style="fill:#F5F5F5;" d="M401.82,203.035h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388 H401.82c-0.767,0-1.389,0.622-1.389,1.388v3.081C400.43,202.414,401.053,203.035,401.82,203.035z M430.417,203.035h22.965 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081 C429.027,202.414,429.65,203.035,430.417,203.035z"/>
<path style="fill:#F5F5F5;" d="M459.013,203.035h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388 h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081C457.625,202.414,458.247,203.035,459.013,203.035z M487.612,203.035h23 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388h-23c-0.767,0-1.389,0.622-1.389,1.388v3.081 C486.222,202.414,486.844,203.035,487.612,203.035z"/>
<path style="fill:#F5F5F5;" d="M510.611,317.826h-0.077c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.622,1.389-1.389,1.389 h-5.827c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.389-1.388H487.65c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.79c0.767,0,1.388-0.622,1.388-1.389v-0.152c0-0.767-0.621-1.388-1.388-1.388h-2.935 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.792c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.538c0.767,0,1.389-0.622,1.389-1.389v-5.939C512,318.448,511.378,317.826,510.611,317.826z M504.863,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.621,1.389,1.389,1.389h0.079 c0.767,0,1.389-0.622,1.389-1.389v-0.079C506.252,318.448,505.63,317.826,504.863,317.826z M510.611,329.47h-34.423 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h34.423c0.767,0,1.389-0.622,1.389-1.388v-0.153 C512,330.092,511.378,329.47,510.611,329.47z M476.189,317.826h5.79c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389h-8.647c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.622,1.388-1.389,1.388h-0.077 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.079c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.622,1.388-1.388,1.388h-0.078c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388h-0.115 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.389,1.388h-0.042c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388h11.502c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.79 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388h-2.933c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C474.799,318.448,475.422,317.826,476.189,317.826z"/>
<path style="fill:#F5F5F5;" d="M453.382,317.826h-0.115c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.622,1.389-1.389,1.389 h-5.754c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388h-11.502c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.622,1.389,1.389,1.389h5.79c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.622-1.388-1.389-1.388h-2.935 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.621-1.388,1.388-1.388h5.792c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C454.77,318.448,454.148,317.826,453.382,317.826z M447.669,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.622,1.389,1.389,1.389h0.077 c0.767,0,1.389-0.622,1.389-1.389v-0.079C449.057,318.448,448.436,317.826,447.669,317.826z M453.382,329.47h-34.387 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h34.387c0.767,0,1.389-0.622,1.389-1.388v-0.153 C454.77,330.092,454.148,329.47,453.382,329.47z M418.994,317.826h5.827c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.622,1.389-1.389,1.389h-8.647c-0.767,0-1.389,0.621-1.389,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.115 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.115c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.388,1.388h-0.042c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.115 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388h-0.078c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.622-1.388,1.388-1.388h11.575c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.389,1.389h5.754 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.935c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C417.605,318.448,418.227,317.826,418.994,317.826z"/>
<path style="fill:#F5F5F5;" d="M396.186,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.792c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.622-1.388-1.389-1.388h-11.538c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.621,1.389,1.389,1.389h5.79c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.621-1.388-1.389-1.388h-2.935 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.827c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C397.576,318.448,396.953,317.826,396.186,317.826 z M390.474,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.622,1.389,1.389,1.389h0.077 c0.767,0,1.388-0.622,1.388-1.389v-0.079C391.863,318.448,391.242,317.826,390.474,317.826z M396.186,329.47h-34.424 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h34.424c0.767,0,1.389-0.622,1.389-1.388v-0.153 C397.576,330.092,396.953,329.47,396.186,329.47z M361.762,317.826h5.827c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.622,1.389-1.389,1.389h-8.646c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.622,1.388-1.389,1.388h-0.079 c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.115c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.388,1.388h-0.116c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.042 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.389,1.388h-0.077c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388h11.54c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.79 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388h-2.973c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C360.373,318.448,360.995,317.826,361.762,317.826z"/>
<path style="fill:#F5F5F5;" d="M338.993,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.622,1.389-1.388,1.389 h-5.79c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.622-1.388-1.389-1.388h-11.54c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.827c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.622-1.388-1.389-1.388h-2.935 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.621-1.388,1.388-1.388h5.79c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C340.381,318.448,339.759,317.826,338.993,317.826 z M333.28,317.826h-0.077c-0.767,0-1.388,0.621-1.388,1.388v0.079c0,0.767,0.622,1.389,1.388,1.389h0.077 c0.767,0,1.389-0.622,1.389-1.389v-0.079C334.668,318.448,334.047,317.826,333.28,317.826z M338.993,329.47h-34.388 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h34.388c0.767,0,1.389-0.622,1.389-1.388v-0.153 C340.381,330.092,339.759,329.47,338.993,329.47z M304.605,317.826h5.827c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.622,1.389-1.389,1.389h-8.721c-0.767,0-1.389,0.621-1.389,1.388v3.081c0,0.767-0.621,1.388-1.388,1.388h-0.077 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.042c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388h-0.115c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.079 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.622,1.388-1.389,1.388h-0.077c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.622-1.388,1.389-1.388h11.502c0.767,0,1.388,0.621,1.388,1.388v3.008c0,0.767,0.622,1.389,1.389,1.389h5.827 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.935c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C303.217,318.448,303.838,317.826,304.605,317.826z"/>
<path style="fill:#F5F5F5;" d="M281.8,317.826h-0.079c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.79c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.622-1.388-1.389-1.388h-11.54c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.827c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.622-1.388-1.389-1.388h-2.97 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.622-1.388,1.388-1.388h5.79c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.54c0.767,0,1.389-0.622,1.389-1.389v-5.939C283.188,318.448,282.567,317.826,281.8,317.826z M276.05,317.826h-0.042c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.621,1.389,1.389,1.389h0.042 c0.767,0,1.388-0.622,1.388-1.389v-0.079C277.439,318.448,276.817,317.826,276.05,317.826z M281.8,329.47h-34.424 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.622,1.388,1.388,1.388H281.8c0.767,0,1.389-0.622,1.389-1.388v-0.153 C283.188,330.092,282.567,329.47,281.8,329.47z M247.374,317.826h5.827c0.767,0,1.388,0.621,1.388,1.388v5.939 c0,0.767-0.621,1.389-1.388,1.389h-8.684c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.077 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.079c-0.767,0-1.388,0.621-1.388,1.388v8.94 c0,0.767-0.622,1.388-1.389,1.388h-0.077c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.388-1.388h-0.078 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.621,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.621-1.388,1.389-1.388h11.502c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.827 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.622-1.388-1.389-1.388h-2.97c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C245.986,318.448,246.607,317.826,247.374,317.826z"/>
<path style="fill:#F5F5F5;" d="M224.605,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.79c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.622-1.388-1.388-1.388h-11.54c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.792c0.767,0,1.388-0.622,1.388-1.389v-0.152c0-0.767-0.621-1.388-1.388-1.388h-2.899 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.754c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.54c0.767,0,1.389-0.622,1.389-1.389v-5.939C225.994,318.448,225.372,317.826,224.605,317.826z M218.856,317.826h-0.042c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.622,1.389,1.389,1.389h0.042 c0.767,0,1.388-0.622,1.388-1.389v-0.079C220.244,318.448,219.623,317.826,218.856,317.826z M224.605,329.47H190.18 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h34.424c0.767,0,1.389-0.622,1.389-1.388v-0.153 C225.994,330.092,225.372,329.47,224.605,329.47z M190.18,317.826h5.79c0.767,0,1.388,0.621,1.388,1.388v5.939 c0,0.767-0.621,1.389-1.388,1.389h-8.646c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.079 c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.078c-0.767,0-1.388,0.621-1.388,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.077 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.622,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.622-1.388,1.389-1.388h11.505c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.825 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.97c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C188.791,318.448,189.414,317.826,190.18,317.826z"/>
<path style="fill:#F5F5F5;" d="M167.411,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.826c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388h-11.505c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.621,1.389,1.389,1.389h5.792c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.621-1.388-1.389-1.388h-2.973 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.621-1.388,1.389-1.388h5.865c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C168.8,318.448,168.178,317.826,167.411,317.826z M161.698,317.826h-0.116c-0.767,0-1.388,0.621-1.388,1.388v0.079c0,0.767,0.621,1.389,1.388,1.389h0.116 c0.767,0,1.388-0.622,1.388-1.389v-0.079C163.087,318.448,162.465,317.826,161.698,317.826z M167.411,329.47h-34.424 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h34.424c0.767,0,1.389-0.622,1.389-1.388v-0.153 C168.8,330.092,168.178,329.47,167.411,329.47z M132.985,317.826h5.79c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389h-8.646c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.079 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.078c-0.767,0-1.388,0.621-1.388,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388h-0.115 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388h-0.04c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.621-1.388,1.389-1.388h11.502c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.754 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.899c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C131.597,318.448,132.218,317.826,132.985,317.826z"/>
<path style="fill:#F5F5F5;" d="M110.18,317.826h-0.042c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.792c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388H87.254c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.752c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.621-1.388-1.389-1.388h-2.933 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.621-1.388,1.388-1.388H95.9c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.505c0.767,0,1.389-0.622,1.389-1.389v-5.939C111.57,318.448,110.947,317.826,110.18,317.826z M104.468,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.621,1.389,1.389,1.389h0.079 c0.767,0,1.388-0.622,1.388-1.389v-0.079C105.857,318.448,105.235,317.826,104.468,317.826z M110.18,329.47H75.719 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h34.462c0.767,0,1.389-0.622,1.389-1.388v-0.153 C111.57,330.092,110.947,329.47,110.18,329.47z M75.719,317.826h5.865c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389h-8.648c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.115 c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388H67.19c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.388,1.388H64.37c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.115 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388h-0.079c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388h11.54c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.79 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388H75.72c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C74.329,318.448,74.952,317.826,75.719,317.826z"/>
<path style="fill:#F5F5F5;" d="M52.986,317.826h-0.079c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.621,1.389-1.389,1.389 h-5.79c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388H30.022c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.621,1.389,1.389,1.389h5.754c0.767,0,1.388-0.622,1.388-1.389v-0.152c0-0.767-0.621-1.388-1.388-1.388h-2.935 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.865c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.502c0.767,0,1.388-0.622,1.388-1.389v-5.939C54.375,318.448,53.753,317.826,52.986,317.826z M47.274,317.826h-0.079c-0.767,0-1.388,0.621-1.388,1.388v0.079c0,0.767,0.621,1.389,1.388,1.389h0.079 c0.767,0,1.388-0.622,1.388-1.389v-0.079C48.662,318.448,48.041,317.826,47.274,317.826z M52.986,329.47H18.599 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h34.387c0.767,0,1.388-0.622,1.388-1.388v-0.153 C54.375,330.092,53.753,329.47,52.986,329.47z M18.599,317.826h5.79c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389H15.67c-0.767,0-1.389,0.621-1.389,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.004 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388H9.956c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388H7.175c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388H4.317 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388H1.388c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388H12.89c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.389,1.389h5.864 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388H18.6c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C17.21,318.448,17.832,317.826,18.599,317.826z"/>
<path style="fill:#F5F5F5;" d="M510.611,308.966h-22.963c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081C512,309.588,511.378,308.966,510.611,308.966z M481.978,308.966h-22.927 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081 C483.367,309.588,482.745,308.966,481.978,308.966z"/>
<path style="fill:#F5F5F5;" d="M453.382,308.966h-22.927c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.622,1.388,1.389,1.388 h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081C454.77,309.588,454.148,308.966,453.382,308.966z M424.821,308.966h-23 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.622,1.388,1.388,1.388h23c0.767,0,1.389-0.621,1.389-1.388v-3.081 C426.21,309.588,425.588,308.966,424.821,308.966z"/>
<path style="fill:#F5F5F5;" d="M396.186,308.966h-22.963c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388 h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081C397.576,309.588,396.953,308.966,396.186,308.966z M367.59,308.966h-22.963 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081 C368.979,309.588,368.356,308.966,367.59,308.966z"/>
<path style="fill:#F5F5F5;" d="M338.993,308.966H316.03c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081C340.381,309.588,339.759,308.966,338.993,308.966z M310.432,308.966h-23 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.622,1.388,1.389,1.388h23c0.767,0,1.389-0.621,1.389-1.388v-3.081 C311.821,309.588,311.2,308.966,310.432,308.966z"/>
<path style="fill:#F5F5F5;" d="M281.8,308.966h-22.965c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 H281.8c0.767,0,1.389-0.621,1.389-1.388v-3.081C283.188,309.588,282.567,308.966,281.8,308.966z M253.203,308.966h-22.965 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081 C254.591,309.588,253.97,308.966,253.203,308.966z"/>
<path style="fill:#F5F5F5;" d="M224.605,308.966H201.64c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081C225.994,309.588,225.372,308.966,224.605,308.966z M195.97,308.966h-22.927 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.622,1.388,1.389,1.388h22.927c0.767,0,1.388-0.621,1.388-1.388v-3.081 C197.359,309.588,196.737,308.966,195.97,308.966z"/>
<path style="fill:#F5F5F5;" d="M167.411,308.966h-22.965c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388 h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081C168.8,309.588,168.178,308.966,167.411,308.966z M138.776,308.966h-22.925 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388h22.925c0.767,0,1.389-0.621,1.389-1.388v-3.081 C140.164,309.588,139.543,308.966,138.776,308.966z"/>
<path style="fill:#F5F5F5;" d="M110.18,308.966H87.254c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081C111.57,309.588,110.947,308.966,110.18,308.966z M81.583,308.966H58.618 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081 C82.972,309.588,82.35,308.966,81.583,308.966z"/>
<path style="fill:#F5F5F5;" d="M52.986,308.966H30.022c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388 h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081C54.375,309.588,53.753,308.966,52.986,308.966z M24.388,308.966h-23 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h23c0.767,0,1.389-0.621,1.389-1.388v-3.081 C25.778,309.588,25.156,308.966,24.388,308.966z"/>
</g>
<g>
<path style="fill:#FF4B55;" d="M248.698,214.275c2.62,0.698,5.414-0.071,7.334-2.026c2.898,2.934,7.647,3.004,10.649,0.141 c1.956-1.886,2.759-4.75,2.06-7.334c-2.548,4.121-7.925,5.448-12.046,2.863c-0.21-0.141-0.489-0.28-0.663-0.419 c-3.875,2.863-9.357,2.095-12.291-1.745c-0.106-0.211-0.314-0.49-0.454-0.698C242.239,209.107,244.683,213.296,248.698,214.275z"/>
<path style="fill:#FF4B55;" d="M264.966,295.855c9.386-5.153,17.219-13.272,21.514-23.966c7.314-18.33,2.708-39.02-11.283-52.44 c-0.481-0.461-1.212,0.156-0.863,0.724c13.799,22.503,8.363,52.074-12.99,68.278l1.021-65.367c0.014-0.887-0.382-1.732-1.071-2.291 l-3.473-2.807c-1.064-0.86-2.584-0.855-3.642,0.01l-3.422,2.797c-0.683,0.558-1.073,1.398-1.059,2.28l0.992,65.414 c-21.356-16.195-26.804-45.794-13.026-68.312c0.348-0.568-0.383-1.185-0.863-0.723c-13.964,13.42-18.599,34.109-11.286,52.438 c4.295,10.692,12.127,18.812,21.516,23.965c-5.975,2.047-12.255,3.134-18.605,2.952c-0.671-0.019-0.806,0.925-0.163,1.119 c8.068,2.449,16.366,2.617,24.168,0.868l3.063,5.943c0.212,0.41,0.799,0.412,1.012,0.001l3.084-5.941 c7.802,1.746,16.103,1.575,24.177-0.874c0.642-0.194,0.508-1.138-0.163-1.119C277.246,298.988,270.951,297.902,264.966,295.855z"/>
<path style="fill:#FF4B55;" d="M303.171,235.086c-4.804-8.975-12.782-15.778-22.28-19.111c-0.595-0.209-1.059,0.577-0.573,0.978 c20.966,17.271,25.169,48.032,8.954,70.302c-0.839,1.118-1.747,2.305-2.62,3.281C306.559,279.852,313.927,254.99,303.171,235.086z"/>
<path style="fill:#FF4B55;" d="M222.755,287.255c-16.213-22.27-12.044-53.03,8.918-70.301c0.487-0.401,0.022-1.186-0.573-0.978 c-9.485,3.334-17.408,10.135-22.243,19.11c-10.824,19.904-3.386,44.765,16.552,55.449 C224.467,289.559,223.559,288.373,222.755,287.255z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -1,131 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#41479B;" d="M473.655,423.75H38.345C17.167,423.75,0,406.582,0,385.405V126.646 c0-21.177,17.167-38.345,38.345-38.345h435.31c21.177,0,38.345,17.167,38.345,38.345v258.759 C512,406.582,494.833,423.75,473.655,423.75z"/>
<path style="fill:#F5F5F5;" d="M8.828,255.975h15.334l81.77-53.574v53.574h44.138v-53.574l81.77,53.574h15.334 c4.875,0,8.828-3.953,8.828-8.828v-7.002l-70.155-45.963H256v-44.138h-70.155L256,104.081v-7.002c0-4.559-3.456-8.309-7.891-8.777 h-16.348l-81.693,53.523V88.301H105.93v53.523L26.894,90.041c-9.242,2.888-16.973,9.186-21.741,17.415l65.002,42.588H0v44.138 h70.155L0,240.145v7.002C0,252.022,3.953,255.975,8.828,255.975z"/>
<g>
<polygon style="fill:#FF4B55;" points="256,158.871 141.241,158.871 141.241,88.25 114.759,88.25 114.759,158.871 0,158.871 0,185.354 114.759,185.354 114.759,255.975 141.241,255.975 141.241,185.354 256,185.354 "/>
<path style="fill:#FF4B55;" d="M8.254,102.894l72.636,47.149h16.214L14.643,96.516C12.271,98.385,10.126,100.525,8.254,102.894z"/>
<path style="fill:#FF4B55;" d="M166.283,150.044l88.374-57.366c-1.536-2.599-4.246-4.427-7.485-4.427h-1.909l-95.194,61.793 H166.283z"/>
<path style="fill:#FF4B55;" d="M89.474,194.182L1.269,251.437c1.519,2.663,4.273,4.537,7.559,4.537h1.665l95.196-61.793H89.474 V194.182z"/>
<path style="fill:#FF4B55;" d="M255.86,247.841l-82.666-53.658H156.98l93.874,60.935 C253.666,253.812,255.595,251.076,255.86,247.841z"/>
</g>
<g>
<path style="fill:#FFE15A;" d="M383.828,172.193c0,0-3.691-14.766-14.766-22.15c0,0,11.074,18.457,11.074,33.224L383.828,172.193z"/>
<path style="fill:#FFE15A;" d="M366.754,156.158c0,0,7.73,4.729,11.882,12.459l-3.346,7.73 C375.292,176.345,372.523,165.387,366.754,156.158z"/>
<path style="fill:#FFE15A;" d="M358.218,157.888c0,0,13.382,4.153,19.726,12.806l-3.807,5.768 C374.137,176.461,369.062,166.656,358.218,157.888z"/>
<path style="fill:#FFE15A;" d="M356.257,164.579c0,0,14.074,2.191,20.419,8.883l-1.615,6.345 C375.061,179.807,367.331,170.578,356.257,164.579z"/>
<path style="fill:#FFE15A;" d="M356.718,169.194c0,0,13.612,1.385,19.842,8.536c6.229,7.153-2.307,4.96-2.307,4.96 S367.101,174.5,356.718,169.194z"/>
<path style="fill:#FFE15A;" d="M383.828,172.193c0,0,3.691-14.766,14.766-22.15c0,0-11.074,18.457-11.074,33.224L383.828,172.193z"/>
<path style="fill:#FFE15A;" d="M400.901,156.158c0,0-7.73,4.729-11.882,12.459l3.346,7.73 C392.365,176.345,395.134,165.387,400.901,156.158z"/>
<path style="fill:#FFE15A;" d="M409.438,157.888c0,0-13.382,4.153-19.726,12.806l3.807,5.768 C393.518,176.461,398.594,166.656,409.438,157.888z"/>
<path style="fill:#FFE15A;" d="M411.4,164.579c0,0-14.074,2.191-20.419,8.883l1.615,6.345 C392.596,179.807,400.324,170.578,411.4,164.579z"/>
<path style="fill:#FFE15A;" d="M410.937,169.194c0,0-13.612,1.385-19.842,8.536c-6.229,7.153,2.307,4.96,2.307,4.96 S400.555,174.5,410.937,169.194z"/>
<path style="fill:#FFE15A;" d="M383.828,150.044c0,0-3.691,7.767,0,11.651C387.52,157.811,383.828,150.044,383.828,150.044z"/>
<path style="fill:#FFE15A;" d="M380.15,151.972c0,0-0.495,8.586,4.386,10.794C386.495,157.779,380.15,151.972,380.15,151.972z"/>
<path style="fill:#FFE15A;" d="M387.506,151.972c0,0,0.495,8.586-4.386,10.794C381.161,157.779,387.506,151.972,387.506,151.972z"/>
<path style="fill:#FFE15A;" d="M388.715,156.925c0,0-3.221,7.975-8.578,7.884C380.498,159.463,388.715,156.925,388.715,156.925z"/>
<path style="fill:#FFE15A;" d="M378.941,156.925c0,0,3.221,7.975,8.578,7.884C387.158,159.463,378.941,156.925,378.941,156.925z"/>
</g>
<ellipse style="fill:#FFD255;" cx="383.82" cy="175.89" rx="11.08" ry="14.766"/>
<g>
<path style="fill:#73AF00;" d="M358.526,190.958l-2.538-3.923c0,0-7.383,1.769-9.152-3.768l-2.846-0.231 c0,0,0.384-3.768,3.691-4.307c0,0,1.999-2.461,5.537-1.999c3.538,0.461,5.384,3.46,7.422,4.23c2.038,0.769,2.269,3.307,2.269,3.307 l15.535,15.919c0,0-4.46,5.692-8.46,7.537S351.296,200.572,358.526,190.958z"/>
<path style="fill:#73AF00;" d="M408.977,193.88c0,0,6.461,4.384,6.691,16.497h-10.729c0,0,0.116-8.191-1.961-12.574L408.977,193.88 z"/>
<path style="fill:#73AF00;" d="M407.593,194.343c0,0,8.075,2.654,13.036-3.691l-8.422-1.153L407.593,194.343z"/>
<path style="fill:#73AF00;" d="M405.17,185.46l8.2,2.764c1.034,0.349,1.399,1.629,0.674,2.445 c-3.111,3.505-12.397,11.903-27.37,11.903c-19.496,0-24.533-12.267-24.764-13.19c-0.231-0.922-1.269-8.422-1.269-8.422l8.306-0.922 L405.17,185.46z"/>
</g>
<g>
<polygon style="fill:#FF4B55;" points="325.44,298.403 346.913,298.403 335.838,319.854 324.764,305.088 "/>
<polygon style="fill:#FF4B55;" points="442.216,298.403 420.744,298.403 431.818,319.854 442.892,305.088 "/>
</g>
<g>
<path style="fill:#FFD25A;" d="M325.351,334.621c-10.593,0-18.699-5.685-19.117-5.981l8.536-12.052 c0.071,0.046,7.223,4.906,14.516,2.697c7.38-2.228,12.225-10.937,14.991-17.856l13.71,5.486 c-5.816,14.542-14.112,23.479-24.651,26.569C330.58,334.293,327.893,334.621,325.351,334.621z"/>
<path style="fill:#FFD25A;" d="M442.305,334.621c10.593,0,18.699-5.685,19.117-5.981l-8.536-12.052 c-0.071,0.046-7.223,4.906-14.516,2.697c-7.38-2.228-12.225-10.937-14.991-17.856l-13.71,5.486 c5.816,14.542,14.112,23.479,24.651,26.569C437.076,334.293,439.764,334.621,442.305,334.621z"/>
</g>
<path style="fill:#FF4B55;" d="M431.818,257.098h-95.98v-35.47c0-4.875,3.953-8.828,8.828-8.828h78.325 c4.875,0,8.828,3.953,8.828,8.828L431.818,257.098L431.818,257.098z"/>
<g>
<path style="fill:#FFE15A;" d="M362.025,238.641l-1.153-7.383c-5.422-0.231-8.536-6.575-8.536-6.575l-4.384,2.422 C352.565,238.179,362.025,238.641,362.025,238.641z"/>
<path style="fill:#FFE15A;" d="M419.82,231.027c1.615-1.23,5.153-1.692,5.153-1.692c-2.538-2.615-5.306-0.769-5.306-0.769 c2.307-2.153,1-5.229,1-5.229c0,1-1.615,1.692-1.615,1.692c0.077-1.999-1.999-3.923-1.999-3.923l-1.077,1.769 c-0.692-1.692-3.153-2.999-3.153-2.999l-1,4.153c-2.307-1.999-6.383-1.846-6.383-1.846l0.769,1.923 c-2.461,0.076-9.152,1.461-13.075,1.922s-7.075-0.615-7.075-2.383c0-1.482,3.428-1.665,4.911-1.687 c1.049,0.234,2.368,0.612,4.222,1.169c3.46,1.038,5.487-0.466,5.487-0.466c-1.212-0.461-1.346-1-1.346-1 c2.595-1.5,5.03-1.13,5.03-1.13c-0.865-1.903-4.615-1.788-4.615-1.788c0.981-0.519,1.73-2.134,1.73-2.134 c-0.231,0.231-2.362,0.754-5.272,1.144c-2.19,0.295-4.247,1.96-5.097,2.73c-2.31-0.177-8.342-0.25-7.281,3.933 c1.308,5.153,11.69,3.307,18.073,2.307s9.69-0.153,11.074,0.692c1.385,0.846-0.589,3.712-7.075,2.538 c-5.605-1.014-8.692-1.043-10.387-0.865c-1.879,0.12-3.481,0.626-4.61,0.865c-2.538,0.538-12.306,3.999-14.151-1 c-1.846-5-10.844,8.152-10.844,8.152l0.703,0.836l-2.395-0.567c-3.23,4.326-12.92,5.653-12.92,5.653s-1.442-2.595-2.654-2.942 c-1.212-0.346-1.73,1.557-1.73,1.557s-1.442,0.057-1.557,1.385c-0.116,1.326,1.038,1.442,1.038,1.442s-1.385,2.019,0.922,2.595 c0,0-0.173,2.826,3.23,0.865c10.11,1.274,17.482-3.917,20.674-6.749c2.087,0.134,5.339,0.067,7.839-1.23 c3.999-2.077,8.614-4.692,11.305-3.691c0,0,2.154,6.614-6.306,6.767c0,0-1.251-1.582-2.51-1.582c-0.543,0-1.108,0.652-0.934,1.238 c0,0-1.476-0.087-1.737,0.782c-0.213,0.708,0.303,1.519,1.389,1.389c0,0-0.738,1.086,0,1.737s1.651,0,1.651,0 s-0.391,1.346,0.521,1.476c0.78,0.111,1.813-1.163,2.109-1.55c1.354,0.211,10.591,1.276,12.586-8.413c0,0,4.615,1.999,9.152,1.615 s8.999,0.308,8.614,2.538c-0.503,1.617-1.495,1.51-1.495,1.51c-1.086-0.435-2.91-0.391-3.17,1.173 c-0.26,1.564,1.867,1.607,1.867,1.607c0.608,1.433,2.345,0.825,2.345,0.825c1.519,1.086,2.519-0.087,2.519-0.087 c0.652,0.565,1.324,0.67,1.954,0.13c0.608-0.521,0.267-3.996,0.209-5.236c-0.096-2.063-0.385-7.459-3.384-7.537 c-2.999-0.077-6.845,1.692-12.151-2.769c-0.277-0.233-0.547-0.381-0.821-0.579c2.511,0.233,4.31,0.914,6.051,1.194 C411.207,232.873,418.206,232.257,419.82,231.027z"/>
<path style="fill:#FFE15A;" d="M347.95,227.104c0,0-1.471,0.04-2.191-0.173c-1.235-0.364-1.385-2.307-0.057-2.654 c0,0-1.597-1.085-0.865-2.307c0.586-0.978,2.079-0.975,2.598-0.398c0,0-0.487-1.609,0.921-2.14c1.12-0.423,2.019,0.865,2.019,2.538 c0,0,1.674-1.362,2.538-0.461c0.602,0.628,0.429,1.453-0.577,3.172C351.309,226.436,347.95,227.104,347.95,227.104z"/>
</g>
<g>
<path style="fill:#41479B;" d="M346.131,226.393c0,0-0.781,1.346-3.04,0.521c0,0,1.954-0.913,2.215-1.694L346.131,226.393z"/>
<path style="fill:#41479B;" d="M345.305,222.441c0,0-1.216-0.781-2.562-0.738c0,0,1.997-1.476,3.691-0.173L345.305,222.441z"/>
<path style="fill:#41479B;" d="M348.129,220.356c0,0,0.391-1.433-0.391-2.215c0,0,1.607,0.695,1.824,1.997L348.129,220.356z"/>
<path style="fill:#41479B;" d="M351.69,221.833c0,0,0.781-1.737,0.087-2.562c0,0,2.084,1.216,1.216,3.214L351.69,221.833z"/>
<path style="fill:#41479B;" d="M347.62,241.134c0,0-0.836-1.711-1.914-1.705c0,0,2.268-0.825,3.249,1.12L347.62,241.134z"/>
<path style="fill:#41479B;" d="M345.793,243.315c0,0-1.491-1.186-2.462-0.716c0,0,1.693-1.72,3.414-0.386L345.793,243.315z"/>
<path style="fill:#41479B;" d="M346.84,246.391c0,0-1.905-0.021-2.383,0.946c0,0,0.28-2.397,2.458-2.4L346.84,246.391z"/>
<path style="fill:#41479B;" d="M348.582,248.37c0,0-0.781,1.346-3.04,0.521c0,0,1.954-0.913,2.215-1.694L348.582,248.37z"/>
<path style="fill:#41479B;" d="M382.909,247.686c0,0-0.64,1.102-2.49,0.427c0,0,1.502-0.536,1.715-1.177L382.909,247.686z"/>
</g>
<path style="fill:#FFD255;" d="M363.372,223.874c0,0-4.154,7.075-3.155,17.304c0,0,12.247-1.788,17.554-14.016 c0,0,1.293-0.523,1.797-1.779c0.429-1.068,0.394-2.827-1.663-2.817c0,0,0.616-1.23,1.365-1.519c0,0-1.326-0.519-2.884-0.173 c0,0,1.212-1.212,1.212-2.769c0,0-1.846,1.212-2.999,1.326c0,0-0.116-1.903,0.346-2.134c0,0-2.422,0.231-3.634,1.5 c0,0-0.808-1.096-0.75-2.25c0,0-2.25,0.981-3.115,2.422c0,0-0.692-0.75-0.634-1.5c0,0-1.615,1.961-1.961,2.999 c0,0-1.522-0.418-2.191,0.808C362.176,222.163,362.286,223.136,363.372,223.874z"/>
<g>
<path style="fill:#41479B;" d="M381.063,242.535c0,0-0.492-0.927-1.969-1.129c0,0,1.882-0.868,3.069,0.376L381.063,242.535z"/>
<path style="fill:#41479B;" d="M411.595,246.052c0,0-1.079,0.341-1.585,1.867c0,0-0.553-2.167,1.001-3.182L411.595,246.052z"/>
<path style="fill:#41479B;" d="M413.859,246.849c0,0-1.022,0.993-0.973,2.601c0,0-1.261-1.847-0.149-3.332L413.859,246.849z"/>
<path style="fill:#41479B;" d="M418.745,246.762c0,0-0.309,1.052,0.625,2.174c0,0-1.933-0.615-1.97-2.298L418.745,246.762z"/>
<path style="fill:#41479B;" d="M416.449,247.171c0,0-0.82,0.78-0.602,2.374c0,0-1.525-1.34-0.575-2.934L416.449,247.171z"/>
<path style="fill:#41479B;" d="M379.489,244.431c0,0-0.988-0.354-2.216,0.49c0,0,0.807-1.909,2.522-1.788L379.489,244.431z"/>
<path style="fill:#41479B;" d="M380.839,246.531c0,0-1.015-0.266-2.165,0.682c0,0,0.177-1.842,1.897-1.87L380.839,246.531z"/>
</g>
<path style="fill:#F5F5F5;" d="M431.818,263.047c-8.006,0-8.006,7.221-16.011,7.221s-8.006-7.221-16.011-7.221 c-8,0-8,7.221-16,7.221c-7.993,0-7.993-7.221-15.986-7.221s-7.992,7.221-15.983,7.221c-7.994,0-7.994-7.221-15.989-7.221v-13.332 c7.994,0,7.994,7.221,15.989,7.221c7.992,0,7.992-7.221,15.983-7.221c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221 c8.006,0,8.006,7.221,16.011,7.221s8.006-7.221,16.011-7.221V263.047z"/>
<path style="fill:#41479B;" d="M415.807,270.269c-8.006,0-8.006-7.221-16.011-7.221c-8,0-8,7.221-16,7.221 c-7.993,0-7.993-7.221-15.986-7.221s-7.992,7.221-15.983,7.221c-7.978,0-8-7.186-15.944-7.217c0.11,3.192,0.477,7.93,1.412,13.497 c6.494,0.86,7.085,7.051,14.531,7.051c7.992,0,7.992-7.222,15.983-7.222c7.993,0,7.993,7.222,15.986,7.222c8,0,8-7.222,16-7.222 c8.006,0,8.006,7.222,16.011,7.222c7.457,0,8.05-6.193,14.553-7.051c0.936-5.567,1.302-10.305,1.412-13.497 C423.818,263.083,423.796,270.269,415.807,270.269z"/>
<path style="fill:#F5F5F5;" d="M415.807,283.601c-8.006,0-8.006-7.222-16.011-7.222c-8,0-8,7.222-16,7.222 c-7.993,0-7.993-7.222-15.986-7.222s-7.992,7.222-15.983,7.222c-7.446,0-8.038-6.191-14.531-7.051 c0.742,4.412,1.848,9.331,3.479,14.418c3.599,2.066,5.166,5.965,11.052,5.965c7.992,0,7.992-7.221,15.983-7.221 c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221c8.006,0,8.006,7.221,16.011,7.221c5.899,0,7.465-3.907,11.076-5.971 c1.63-5.085,2.735-10.003,3.478-14.412C423.857,277.408,423.264,283.601,415.807,283.601z"/>
<path style="fill:#41479B;" d="M415.807,296.932c-8.006,0-8.006-7.221-16.011-7.221c-8,0-8,7.221-16,7.221 c-7.993,0-7.993-7.221-15.986-7.221s-7.992,7.221-15.983,7.221c-5.885,0-7.453-3.9-11.052-5.965 c2.031,6.338,4.884,12.911,8.866,19.041c0.671,0.138,1.363,0.256,2.186,0.256c7.992,0,7.992-7.222,15.983-7.222 c7.993,0,7.993,7.222,15.986,7.222c8,0,8-7.222,16-7.222c8.006,0,8.006,7.222,16.011,7.222c0.832,0,1.533-0.118,2.21-0.258 c3.982-6.132,6.835-12.706,8.866-19.044C423.273,293.025,421.706,296.932,415.807,296.932z"/>
<path style="fill:#F5F5F5;" d="M415.807,310.264c-8.006,0-8.006-7.222-16.011-7.222c-8,0-8,7.222-16,7.222 c-7.993,0-7.993-7.222-15.986-7.222s-7.992,7.222-15.983,7.222c-0.823,0-1.515-0.118-2.186-0.256 c2.53,3.895,5.526,7.599,9.054,10.951c2.444-2.065,4.386-4.585,9.116-4.585c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221 c4.749,0,6.691,2.532,9.149,4.6c3.535-3.357,6.537-7.066,9.071-10.968C417.34,310.146,416.639,310.264,415.807,310.264z"/>
<path style="fill:#41479B;" d="M408.945,320.974c-2.457-2.068-4.399-4.6-9.149-4.6c-8,0-8,7.221-16,7.221 c-7.993,0-7.993-7.221-15.986-7.221c-4.73,0-6.671,2.52-9.116,4.585c6.43,6.11,14.628,11.034,25.133,13.661 C394.324,331.997,402.517,327.078,408.945,320.974z"/>
<g>
<path style="fill:#F5F5F5;" d="M399.796,249.715c-8,0-8,7.221-16,7.221c-7.993,0-7.993-7.221-15.986-7.221 s-7.992,7.221-15.983,7.221c-7.994,0-7.994-7.221-15.989-7.221c0,4.555,0,8.511,0,11.074c0,0.625,0.014,1.395,0.044,2.262 c7.944,0.031,7.967,7.217,15.944,7.217c7.992,0,7.992-7.221,15.983-7.221c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221 c8.006,0,8.006,7.221,16.011,7.221c7.989,0,8.011-7.186,15.967-7.217c0.03-0.868,0.044-1.638,0.044-2.262c0-2.563,0-6.52,0-11.074 c-8.006,0-8.006,7.221-16.011,7.221C407.801,256.937,407.801,249.715,399.796,249.715z"/>
<path style="fill:#F5F5F5;" d="M428.127,212.8c2.039,0,3.691,1.653,3.691,3.691v33.224v7.383c0,1.399,0,2.678,0,3.691 c0,0.625-0.014,1.395-0.044,2.262c-0.11,3.192-0.477,7.93-1.412,13.497c-0.742,4.409-1.848,9.327-3.478,14.412 c-2.031,6.339-4.884,12.914-8.866,19.044c-2.535,3.903-5.537,7.613-9.071,10.968c-6.428,6.103-14.621,11.022-25.117,13.646 c-10.505-2.626-18.703-7.551-25.133-13.661c-3.528-3.352-6.524-7.055-9.054-10.951c-3.982-6.131-6.835-12.703-8.866-19.041 c-1.631-5.087-2.738-10.007-3.479-14.418c-0.936-5.567-1.302-10.305-1.412-13.497c-0.03-0.868-0.044-1.638-0.044-2.262 c0-1.013,0-2.293,0-3.691v-7.383V216.49c0-2.039,1.653-3.691,3.691-3.691h88.596 M428.127,210.031H339.53 c-3.562,0-6.461,2.898-6.461,6.461v33.224v7.383v3.691c0,0.651,0.014,1.453,0.046,2.358c0.105,3.014,0.441,7.863,1.449,13.86 c0.858,5.106,2.061,10.086,3.573,14.804c2.34,7.299,5.429,13.929,9.181,19.704c2.763,4.253,5.949,8.106,9.468,11.451 c7.342,6.977,16.214,11.801,26.369,14.34l0.672,0.168l0.671-0.168c10.147-2.537,19.013-7.357,26.353-14.325 c3.528-3.35,6.72-7.208,9.487-11.468c3.753-5.777,6.841-12.407,9.181-19.709c1.512-4.714,2.713-9.693,3.572-14.797 c1.009-5.997,1.345-10.848,1.449-13.86c0.031-0.905,0.046-1.707,0.046-2.358v-3.691v-7.383v-33.224 C434.586,212.929,431.689,210.031,428.127,210.031L428.127,210.031z"/>
</g>
<polygon style="fill:#73AF00;" points="383.828,312.296 373.698,319.345 377.272,307.532 367.438,300.077 379.775,299.827 383.828,288.169 387.881,299.827 400.217,300.077 390.385,307.532 393.959,319.345 "/>
<path style="fill:#FFE15A;" d="M383.828,290.447l3.517,10.115l10.708,0.218l-8.535,6.47l3.102,10.251l-8.791-6.116l-8.791,6.116 l3.102-10.251l-8.534-6.47l10.708-0.218L383.828,290.447 M383.828,285.892l-1.412,4.064l-3.175,9.133l-9.667,0.198l-4.301,0.087 l3.428,2.6l7.704,5.842l-2.799,9.255l-1.246,4.118l3.532-2.457l7.936-5.523l7.936,5.523l3.532,2.457l-1.246-4.118l-2.799-9.255 l7.704-5.842l3.428-2.6l-4.301-0.087l-9.667-0.198l-3.175-9.133L383.828,285.892L383.828,285.892z"/>
<polygon style="fill:#73AF00;" points="361.581,283.502 351.451,290.551 355.025,278.739 345.191,271.284 357.528,271.032 361.581,259.374 365.633,271.032 377.971,271.284 368.137,278.739 371.711,290.551 "/>
<path style="fill:#FFE15A;" d="M361.581,261.653l3.517,10.115l10.708,0.218l-8.534,6.47l3.102,10.251l-8.791-6.116l-8.791,6.116 l3.102-10.251l-8.534-6.47l10.708-0.218L361.581,261.653 M361.581,257.098l-1.412,4.064l-3.175,9.133l-9.667,0.198l-4.301,0.087 l3.428,2.6l7.704,5.842l-2.799,9.255l-1.246,4.118l3.532-2.457l7.936-5.523l7.936,5.523l3.532,2.457l-1.246-4.118l-2.799-9.255 l7.704-5.842l3.428-2.6l-4.301-0.087l-9.667-0.198l-3.175-9.133L361.581,257.098L361.581,257.098z"/>
<polygon style="fill:#73AF00;" points="405.879,283.502 395.75,290.551 399.322,278.739 389.49,271.284 401.826,271.032 405.879,259.374 409.932,271.032 422.269,271.284 412.436,278.739 416.009,290.551 "/>
<g>
<path style="fill:#FFE15A;" d="M405.879,261.653l3.517,10.115l10.707,0.218l-8.534,6.47l3.102,10.251l-8.791-6.116l-8.791,6.116 l3.102-10.251l-8.534-6.47l10.708-0.218L405.879,261.653 M405.879,257.098l-1.412,4.064l-3.175,9.133l-9.667,0.198l-4.301,0.087 l3.428,2.6l7.704,5.842l-2.799,9.255l-1.246,4.118l3.532-2.457l7.936-5.523l7.936,5.523l3.532,2.457l-1.246-4.118l-2.799-9.255 l7.704-5.842l3.428-2.6l-4.301-0.087l-9.667-0.198l-3.175-9.133L405.879,257.098L405.879,257.098z"/>
<path style="fill:#FFE15A;" d="M442.216,298.403c-9.161,23.326-31.85,39.908-58.388,39.908s-49.227-16.583-58.388-39.908 l-13.738,5.375c11.317,28.814,39.345,49.3,72.126,49.3s60.809-20.486,72.126-49.3L442.216,298.403z"/>
</g>
<g>
<polygon style="fill:#F5F5F5;" points="391.211,212.8 380.137,212.8 376.445,201.725 387.52,201.725 "/>
<path style="fill:#F5F5F5;" d="M409.668,212.8h-7.383l-2.461-7.383h3.37c2.397,0,4.524,1.534,5.282,3.807L409.668,212.8z"/>
<path style="fill:#F5F5F5;" d="M369.062,212.8h-7.383l-0.842-2.525c-0.797-2.39,0.982-4.858,3.502-4.858h2.261L369.062,212.8z"/>
</g>
<g>
<path style="fill:#41479B;" d="M402.285,212.8h-11.074l-3.691-11.074h8.414c1.589,0,2.999,1.016,3.502,2.525L402.285,212.8z"/>
<path style="fill:#41479B;" d="M380.137,212.8h-11.074l-2.494-7.48c-0.589-1.768,0.727-3.594,2.591-3.594h7.286L380.137,212.8z"/>
</g>
<path style="fill:#509664;" d="M410.937,187.19c-2.884,4.153-10.959,9.113-24.11,9.113c-10.836,0-17.805-6.543-20.132-9.123 c-0.567-0.628-0.863-1.431-0.863-2.278v-2.518c0-1.084,0.562-2.07,1.498-2.614c2.344-1.364,7.762-3.54,18.458-3.54 C399.055,176.231,410.937,187.19,410.937,187.19z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 20 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,113 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#41479B;" d="M473.655,423.724H38.345C17.167,423.724,0,406.557,0,385.379V126.621 c0-21.177,17.167-38.345,38.345-38.345h435.31c21.177,0,38.345,17.167,38.345,38.345V385.38 C512,406.557,494.833,423.724,473.655,423.724z"/>
<path style="fill:#F5F5F5;" d="M8.828,256h15.334l81.77-53.574V256h44.138v-53.574L231.839,256h15.334 c4.875,0,8.828-3.953,8.828-8.828v-7.002l-70.154-45.963H256v-44.138h-70.155L256,104.106v-7.002c0-4.875-3.95-8.826-8.825-8.828 h-15.337l-81.769,53.574V88.276h-44.138v53.574L26.844,90.034c-2.287,0.718-4.482,1.647-6.562,2.761 c-0.02,0.011-0.041,0.021-0.062,0.032c-0.471,0.253-0.936,0.52-1.395,0.792c-0.056,0.033-0.114,0.064-0.17,0.097 c-0.445,0.267-0.882,0.546-1.314,0.83c-0.066,0.044-0.135,0.085-0.201,0.129c-0.431,0.287-0.854,0.585-1.273,0.889 c-0.062,0.045-0.126,0.088-0.188,0.134c-0.423,0.31-0.836,0.631-1.246,0.958c-0.053,0.043-0.108,0.084-0.161,0.127 c-0.414,0.334-0.82,0.68-1.22,1.031c-0.043,0.039-0.088,0.075-0.131,0.115c-0.405,0.36-0.801,0.728-1.191,1.103 c-0.034,0.033-0.07,0.066-0.105,0.099c-0.395,0.385-0.781,0.778-1.16,1.178c-0.025,0.026-0.051,0.053-0.076,0.081 c-0.384,0.409-0.76,0.828-1.127,1.255c-0.017,0.02-0.033,0.039-0.05,0.058c-0.372,0.435-0.735,0.877-1.087,1.33 c-0.009,0.011-0.019,0.023-0.028,0.035c-0.356,0.458-0.704,0.924-1.039,1.398c-0.004,0.007-0.01,0.013-0.014,0.021 c-0.34,0.479-0.669,0.966-0.985,1.461c-0.001,0.001-0.002,0.003-0.003,0.004c-0.32,0.499-0.628,1.005-0.925,1.518l65.024,42.599H0 v44.138h70.154L0,240.17v7.008C0.003,252.051,3.954,256,8.828,256z"/>
<g>
<polygon style="fill:#FF4B55;" points="256,158.897 141.241,158.897 141.241,88.276 114.759,88.276 114.759,158.897 0,158.897 0,185.379 114.759,185.379 114.759,256 141.241,256 141.241,185.379 256,185.379 "/>
<path style="fill:#FF4B55;" d="M8.228,102.903l72.661,47.166h16.214l-82.496-53.55C12.238,98.389,10.098,100.533,8.228,102.903z"/>
<path style="fill:#FF4B55;" d="M166.283,150.069l88.374-57.366c-1.536-2.599-4.246-4.427-7.485-4.427h-1.909l-95.194,61.793 H166.283z"/>
<path style="fill:#FF4B55;" d="M89.474,194.207L1.269,251.463C2.79,254.125,5.542,256,8.828,256h1.665l95.196-61.793H89.474z"/>
<path style="fill:#FF4B55;" d="M255.86,247.866l-82.666-53.66H156.98l93.874,60.935 C253.666,253.837,255.595,251.102,255.86,247.866z"/>
</g>
<g>
<path style="fill:#73AF00;" d="M387.207,177.365c-0.199,0-0.402-0.063-0.575-0.193c-0.138-0.106-13.838-10.783-5.769-28.879 c0.214-0.48,0.777-0.692,1.259-0.482c0.48,0.216,0.695,0.777,0.482,1.259c-7.443,16.687,4.662,26.19,5.181,26.586 c0.418,0.318,0.499,0.915,0.18,1.333C387.777,177.235,387.495,177.365,387.207,177.365z"/>
<path style="fill:#73AF00;" d="M379.316,161.734c-0.038,0-0.074-0.002-0.111-0.006c-0.523-0.062-0.896-0.534-0.836-1.056 c0.396-3.422,1.683-5.81,3.828-7.096c3.449-2.073,7.761-0.417,7.941-0.344c0.489,0.192,0.729,0.742,0.537,1.231 c-0.192,0.489-0.746,0.733-1.231,0.541c-0.038-0.014-3.638-1.382-6.276,0.209c-1.604,0.969-2.583,2.879-2.905,5.679 C380.205,161.377,379.791,161.734,379.316,161.734z"/>
<path style="fill:#73AF00;" d="M381.902,149.46c-0.082-0.21-2.141-5.098-11.447-3.018c-10.539,2.361-10.661,16.264-10.661,16.403 c0,0.478,0.355,0.884,0.831,0.945c0.041,0.006,0.082,0.008,0.121,0.008c0.428,0,0.811-0.288,0.92-0.711 c3.928-14.962,18.557-12.449,19.178-12.34c0.352,0.063,0.69-0.067,0.907-0.331C381.973,150.147,382.031,149.781,381.902,149.46z"/>
<path style="fill:#73AF00;" d="M379.71,157.21c0,0-6.348-4.046-8.967,1.111c-2.618,5.158-0.634,10.712,0.397,12.934 c0,0,3.784-4.183,7.38-4.761c4.444-0.714,5.555-6.269,2.46-9.046C377.282,154.131,379.71,157.21,379.71,157.21z"/>
<path style="fill:#73AF00;" d="M386.645,147.731c-0.09,5.554,3.005,6.282,3.005,6.282 C391.651,148.914,386.645,147.731,386.645,147.731z"/>
<path style="fill:#73AF00;" d="M385.676,159.396c0.042-5.27,3.616-5.863,3.616-5.863 C391.458,158.433,385.676,159.396,385.676,159.396z"/>
</g>
<path style="fill:#FF4B55;" d="M406.292,155.147c0,0-5.054-0.747-6.993-1.663c-1.613-0.761-3.719-2.599-6.444-2.24 c-2.083,0-3.772,1.688-3.772,3.772c0,2.083,1.431,4.579,8.917,4.025c3.629-0.269,6.721,1.389,6.721,1.389 C404.246,158.446,406.292,155.147,406.292,155.147z"/>
<path style="fill:#FFE15A;" d="M401.047,156.801c0,0-7.752,0.537-9.454-0.717c-1.571-1.158-1.161-3.002,0.448-3.181 C394.461,152.633,401.047,156.801,401.047,156.801z"/>
<path style="fill:#B49B91;" d="M416.131,165.581l-17.14,10.712l-1.964-1.905l9.402-9.106l2.201,0.893l2.143-2.857l-5.118-2.678 c0,0-13.569,12.794-25.113,13.866c-3.884,0.361-7.842,0.107-10.929-1.164l-6.925,9.972l14.52,12.378l21.305-0.833l17.615-23.924 l3.094,1.428l2.618-3.094L416.131,165.581z"/>
<path style="fill:#9B8278;" d="M368.365,194.424c-4.768,0-8.648-3.88-8.648-8.646c0-4.768,3.88-8.648,8.648-8.648 c4.767,0,8.646,3.88,8.646,8.648C377.012,190.545,373.132,194.424,368.365,194.424z M368.365,179.987 c-3.193,0-5.791,2.598-5.791,5.791s2.598,5.79,5.791,5.79s5.79-2.596,5.79-5.79S371.559,179.987,368.365,179.987z"/>
<g>
<path style="fill:#73AF00;" d="M404.387,202.439c0,0,1.587-1.032,3.174-5.871l-3.253,0.476c0,0,0.634-2.698-0.079-4.682 l-3.65,2.857c0,0-1.666-3.491-2.38-3.967c0,0-2.539,3.571-3.967,4.046c0,0-1.428-5.158-2.857-6.189l-2.46,3.491l-3.65-2.857 c0,0,0,2.46-0.079,3.016c-0.079,0.555-4.761-4.919-4.761-4.919s-2.063,0.873-4.84,5.316l-3.491-3.571l-1.428,4.682l-4.84-1.27 l0.793,2.777l-4.205-0.318c0,0,0.714,4.126,2.777,5.555L404.387,202.439z"/>
<path style="fill:#73AF00;" d="M362.333,220.094c0,0-13.092,16.663-37.849,14.759l26.899,3.69l13.806-13.092L362.333,220.094z"/>
</g>
<g>
<path style="fill:#FFE15A;" d="M319.604,232.353c2.618,1.905,18.806,6.547,30.47,0.952c0,0,0.238,2.738-1.071,4.285 c0,0,8.569-3.452,13.212-9.879s-9.641,13.806-9.641,13.806l-21.9,4.046l-8.927-7.38L319.604,232.353z"/>
<path style="fill:#FFE15A;" d="M317.882,172.349c-2.908,0.244-6.053,1.995-7.662,4.122c-0.876-0.372-2.823-0.537-4.436,0.537 c-2.148,1.432-6.118,6.604-9.45,5.236c0,0-0.298,4.879,4.879,4.702c0,0-1.31,2.024-1.071,5.237 c0.238,3.213-2.083,5.356-2.083,5.356s10.474,1.487,10.891-6.665c0.051-0.996,0.102-1.874,0.15-2.657 c5.466,2.952,7.617-1.215,7.617-1.215s-3.285-3.103,0.059-7.52c3.343-4.418,12.533,5.996,12.533,5.996 C329.489,181.311,329.115,171.405,317.882,172.349z"/>
</g>
<g>
<path style="fill:#73AF00;" d="M358.365,199.82c0,0-3.015,2.063-12.378,0.159c0,0,2.063-4.602,1.111-7.3 c0,0-2.539,2.38-8.728,4.761s-13.806,9.998-16.029,14.918c0,0,13.92-32.088,2.738-35.35c-3.836-1.119-7.135,0.695-8.302,2.474 c0.564,0.666,1.106,1.615,1.161,2.882c0.119,2.738-2.618,21.186-6.665,33.921c0,0-1.191-4.404-3.094-6.547 c-1.903-2.143-3.332-5.594-3.332-5.594s-3.213,2.143-2.738,6.07c0,0-1.785-1.428-5.237-0.476s-4.761-1.31-4.761-1.31 s-2.857,7.617,5.594,11.545c0,0-2.261,1.071-3.332,1.905c-1.071,0.833-2.738,0.833-2.738,0.833s2.976,5.475,9.283,6.07 c6.308,0.595,9.207,2.393,11.188,5.633c6.428,10.514,18.727,18.488,38.802,6.189c0,0-28.565,8.887-29.835-9.363 c-1.111-15.965,16.345-19.202,18.091-15.711s-0.159,6.507-0.159,6.507s9.522-2.221,4.919-10.951 C343.924,211.087,353.287,212.516,358.365,199.82z"/>
<path style="fill:#73AF00;" d="M450.052,232.353c-2.618,1.905-19.162,9.046-30.589-2.38 c-11.426-11.426-15.882-28.582-15.235-26.662h-11.426l3.809,34.279l42.372,7.975l8.927-7.38L450.052,232.353z"/>
<path style="fill:#73AF00;" d="M451.774,172.349c2.908,0.244,6.053,1.995,7.662,4.122c0.876-0.372,2.823-0.537,4.436,0.537 c2.148,1.432,6.118,6.604,9.45,5.236c0,0,0.298,4.879-4.879,4.702c0,0,1.31,2.024,1.071,5.237 c-0.238,3.213,2.083,5.356,2.083,5.356s-10.474,1.487-10.891-6.665c-0.051-0.996-0.102-1.874-0.15-2.657 c-5.466,2.952-7.617-1.215-7.617-1.215s3.284-3.103-0.059-7.52c-3.343-4.418-12.533,5.996-12.533,5.996 C440.168,181.311,440.542,171.405,451.774,172.349z"/>
</g>
<path style="fill:#FFE15A;" d="M411.29,199.82c0,0,3.015,2.063,12.378,0.159c0,0-2.063-4.602-1.111-7.3c0,0,2.539,2.38,8.728,4.761 s13.806,9.998,16.029,14.918c0,0-13.92-32.088-2.738-35.35c3.836-1.119,7.135,0.695,8.302,2.474 c-0.564,0.666-1.106,1.615-1.161,2.882c-0.119,2.738,2.618,21.186,6.665,33.921c0,0,1.191-4.404,3.094-6.547 s3.332-5.594,3.332-5.594s3.213,2.143,2.738,6.07c0,0,1.785-1.428,5.237-0.476s4.761-1.31,4.761-1.31s2.857,7.617-5.594,11.545 c0,0,2.261,1.071,3.332,1.905c1.071,0.833,2.738,0.833,2.738,0.833s-2.976,5.475-9.283,6.07c-6.308,0.595-9.207,2.393-11.188,5.633 c-6.428,10.514-18.727,18.488-38.802,6.189c0,0,28.565,8.887,29.835-9.363c1.111-15.965-16.345-19.202-18.091-15.711 s0.159,6.507,0.159,6.507s-9.522-2.221-4.919-10.951C425.732,211.087,416.369,212.516,411.29,199.82z"/>
<g>
<path style="fill:#73AF00;" d="M403.197,226.482c4.682,6.824,11.188,13.013,30.073,18.884s23.933,6.744,33.829,14.749 c0,0,1.88,1.985,2.6,5.167c0.845,3.738-4.919,14.52-4.919,14.52s0.555-2.539-2.936-7.458s-24.122-13.806-34.913-16.504 c-10.792-2.698-29.439-15.215-24.28-24.598L403.197,226.482z"/>
<path style="fill:#73AF00;" d="M467.082,260.086c0.008,0.01,0.011,0.02,0.019,0.03c-0.012-0.013-0.022-0.026-0.034-0.039 L467.082,260.086z"/>
</g>
<g>
<path style="fill:#FFE15A;" d="M466.605,283.295c0,0,0.476,3.452-2.38,6.428c-2.857,2.976-4.879,5.118-4.761,7.617 c0,0-4.285-3.094-3.571-9.998c0,0-5.594,4.642-14.045,0.119c0,0,0.833-8.45,11.784-9.522c0,0-4.285-3.332,1.31-8.45 c0,0,0.65,2.289,5.713,3.452c4.404,1.012,12.239-4.511,6.445-12.824C477.079,271.393,471.961,279.129,466.605,283.295z"/>
<path style="fill:#FFE15A;" d="M399.111,220.213c0,0,2.413,3.945,8.689,7.776c7.538,4.602,8.213,6.744,8.213,6.744l-5.118-0.119 c0,0,6.547,3.571,8.332,8.094c0,0-2.738,0.476-5.832-0.358c0,0,2.499,2.261,1.31,9.522h-12.736L399.111,220.213z"/>
</g>
<path style="fill:#73AF00;" d="M373.759,252.825v-30.47c0,0-10.342,17.693-19.275,30.47H373.759z"/>
<path style="fill:#FFE15A;" d="M364.863,221.72c-2.539,4.602-10.474,19.758-29.359,25.63c-18.886,5.871-22.337,4.761-32.234,12.765 c0,0-1.88,1.985-2.6,5.167c-0.845,3.738,4.919,14.52,4.919,14.52s-0.555-2.539,2.936-7.458s24.006-14.324,34.913-16.504 c15.085-3.016,28.733-19.202,26.511-29.676C367.729,215.69,364.863,221.72,364.863,221.72z"/>
<g>
<path style="fill:#73AF00;" d="M303.288,260.086c-0.008,0.01-0.011,0.02-0.019,0.03c0.012-0.013,0.022-0.026,0.034-0.039 L303.288,260.086z"/>
<path style="fill:#73AF00;" d="M303.765,283.295c0,0-0.476,3.452,2.38,6.428c2.857,2.976,4.879,5.118,4.761,7.617 c0,0,4.285-3.094,3.571-9.998c0,0,5.594,4.642,14.045,0.119c0,0-0.833-8.45-11.784-9.522c0,0,4.285-3.332-1.309-8.45 c0,0-0.65,2.289-5.713,3.452c-4.404,1.012-12.239-4.511-6.445-12.824C293.291,271.393,298.409,279.129,303.765,283.295z"/>
</g>
<path style="fill:#FFE15A;" d="M330.118,334.078c0,0,2.698,12.14,2.857,24.678c0,0,11.823,0.397,17.536-8.49 c0,0-11.426-5.951-17.536-17.457L330.118,334.078z"/>
<path style="fill:#73AF00;" d="M327.578,307.258c-0.476-5.713,2.063-20.155,13.647-30.628l0.284-12.826c0,0-3.451,0.359-6.511,3.038 l-6.547,10.145l-6.07,22.972L327.578,307.258z"/>
<path style="fill:#FFE15A;" d="M327.895,311.384c0,0,0,12.22,5.078,21.425l-2.857,1.269c0,0-10.236-8.054-12.378-24.598 c0,0-9.165,6.07-12.537-6.348c0,0,9.839,3.968,13.013-5.078c2.863-8.162,5.758-23.02,16.783-31.212 c-5.241,8.055-13.133,28.673-7.023,35.974c1.618,1.933,6.269,3.571,11.359,1.397C339.001,308.273,337.065,314.477,327.895,311.384z"/>
<path style="fill:#FFCE5A;" d="M329.378,336.245l-1.672-3.072c-0.292-0.537-0.094-1.21,0.444-1.503l3.051-1.658 c0.537-0.292,1.209-0.094,1.502,0.444l1.672,3.072c0.292,0.537,0.094,1.21-0.444,1.503l-3.051,1.658 C330.343,336.981,329.671,336.782,329.378,336.245z"/>
<g>
<path style="fill:#FFE15A;" d="M432.636,334.078c0,0-2.698,12.14-2.857,24.678c0,0-11.823,0.397-17.536-8.49 c0,0,11.426-5.951,17.536-17.457L432.636,334.078z"/>
<path style="fill:#FFE15A;" d="M435.175,307.258c0.476-5.713-2.063-20.155-13.647-30.628l-0.284-12.826 c0,0,3.451,0.359,6.511,3.038l6.547,10.145l6.07,22.972L435.175,307.258z"/>
</g>
<path style="fill:#73AF00;" d="M423.42,304.212c5.09,2.174,9.741,0.536,11.359-1.397c6.11-7.3-1.782-27.918-7.023-35.974 c11.026,8.192,13.919,23.05,16.783,31.212c3.174,9.046,13.013,5.078,13.013,5.078c-3.372,12.418-12.537,6.348-12.537,6.348 c-2.143,16.544-12.378,24.598-12.378,24.598l-2.857-1.269c5.078-9.205,5.078-21.425,5.078-21.425 C425.688,314.477,423.752,308.273,423.42,304.212z"/>
<path style="fill:#FFCE5A;" d="M433.375,336.245l1.672-3.072c0.292-0.537,0.094-1.21-0.444-1.503l-3.051-1.658 c-0.537-0.292-1.209-0.094-1.502,0.444l-1.672,3.072c-0.292,0.537-0.094,1.21,0.444,1.503l3.051,1.658 C432.41,336.981,433.082,336.782,433.375,336.245z"/>
<path style="fill:#4173CD;" d="M343.289,249.016c-2.103,0-3.809,1.705-3.809,3.809v41.896c0,11.426,3.809,53.322,41.896,68.557 c38.088-15.235,41.896-57.131,41.896-68.557v-41.896c0-2.103-1.705-3.809-3.809-3.809H343.289z"/>
<path style="fill:#FFE15A;" d="M379.068,249.016l-36.121,69.231c0.904,3.202,2.031,6.516,3.446,9.864l34.984-67.053l34.984,67.053 c1.415-3.349,2.542-6.663,3.446-9.864l-36.121-69.231H379.068L379.068,249.016z"/>
<path style="fill:#73AF00;" d="M416.36,328.111l-34.984-67.053l-34.984,67.053l0,0c5.762,13.639,16.188,27.649,34.984,35.167 C400.172,355.761,410.599,341.75,416.36,328.111L416.36,328.111z"/>
<path style="fill:#FFE15A;" d="M395.54,332.451l2.304,1.105c-0.966,1.428-2.977,3.738-6.823,5.831 c-2.905,1.581-5.713,3.452-7.741,4.886V312.84l9.522-0.979v-3.809l-9.522-0.979v-4.734c0-1.052-0.853-1.905-1.905-1.905 c-0.897,0-1.614,0.633-1.816,1.469c-0.633-0.454-1.367-0.777-2.202-0.777c-2.131,0-3.866,1.735-3.866,3.866 c0,1.003,0.407,1.9,1.037,2.589l-4.578,0.471v3.809l9.522,0.979v31.433c-2.027-1.433-4.835-3.305-7.741-4.886 c-3.847-2.092-5.857-4.403-6.823-5.831l2.304-1.105l-8.689-11.069v15.235l2.929-1.405c1.159,1.867,3.608,4.881,8.46,7.519 c4.059,2.209,7.998,5.079,9.559,6.254l1.905,1.476l1.905-1.476c1.561-1.175,5.501-4.045,9.559-6.254 c4.852-2.638,7.302-5.652,8.46-7.519l2.929,1.405v-15.235L395.54,332.451z M377.357,306.955c-1.082,0-1.962-0.879-1.962-1.962 s0.879-1.962,1.962-1.962s1.962,0.879,1.962,1.962S378.44,306.955,377.357,306.955z"/>
<path style="fill:#F5F5F5;" d="M384.319,298.53h-5.885c-1.53,0-2.771-1.24-2.771-2.771v-9.694c0-1.53,1.24-2.771,2.771-2.771h5.885 c1.53,0,2.771,1.24,2.771,2.771v9.694C387.09,297.29,385.849,298.53,384.319,298.53z"/>
<path style="fill:#B49B91;" d="M408.038,249.016c-7.617-11.426-7.617-34.279-7.617-34.279s0-15.235-19.043-15.235 c-9.647,0-14.398,3.91-16.746,7.767c-9.14,3.672-13.724,11.276-13.724,11.276c3.896,1.949,7.339,2.877,10.463,3.115 c6.209,7.389,8.275,14.524,8.824,19.656c-3.576,3.652-5.559,12.46-0.243,19.125c0,0,11.267-2.618,20.779-11.426h17.306v0.001 H408.038z"/>
<g>
<path style="fill:#9B8278;" d="M390.729,249.016h14.215C404.228,241.994,397.325,243.125,390.729,249.016z"/>
<path style="fill:#9B8278;" d="M404.589,241.826c-4.163-11.818-4.169-27.089-4.169-27.089s-0.001-0.248-0.04-0.675 c-4.959-0.673-10.035-0.308-19.956,3.532c-10.563,4.088-15.734,4.205-19.055,4.067c6.209,7.389,8.275,14.524,8.824,19.656 l0.153,8.096c0,0,5.951,0.873,19.043-6.666C395.921,238.988,401.457,238.666,404.589,241.826z"/>
<path style="fill:#9B8278;" d="M384.312,213.071c7.725-1.931,12.654-1.732,15.83-0.605c-0.851-4.243-4.349-12.964-18.765-12.964 c-9.647,0-14.398,3.91-16.746,7.767l-5.789,8.103C358.841,215.373,366.082,217.629,384.312,213.071z"/>
</g>
<path style="fill:#FFE15A;" d="M368.79,197.837c0.75,0.748,2.988,6.144,2.527,6.946c-0.297,0.515-6.257,1.997-7.223,1.241 c-0.862-0.674-1.87-6.486-1.293-7.157C363.324,198.261,368.163,197.213,368.79,197.837z"/>
<path style="fill:#73AF00;" d="M376.454,197.549c0.692,0.793,2.26,6.068,1.639,6.741c-0.399,0.433-7.042,0.957-7.965,0.127 c-0.822-0.74-1.004-6.227-0.278-6.761C370.506,197.171,375.876,196.887,376.454,197.549z"/>
<path style="fill:#FFE15A;" d="M383.706,197.348c0.717,0.747,2.353,5.707,1.711,6.337c-0.413,0.405-7.284,0.882-8.241,0.099 c-0.853-0.698-1.054-5.852-0.305-6.353C377.553,196.979,383.108,196.725,383.706,197.348z"/>
<g>
<path style="fill:#73AF00;" d="M391.078,197.694c0.634,0.815,1.831,6.019,1.165,6.623c-0.428,0.387-7.09,0.405-7.951-0.465 c-0.768-0.776-0.568-6.08,0.193-6.542C385.172,196.892,390.548,197.013,391.078,197.694z"/>
<path style="fill:#73AF00;" d="M406.29,200.847c0.491,0.909,0.444,5.743-0.313,6.228c-0.487,0.311-6.485-0.758-7.191-1.758 c-0.63-0.892,0.444-6.09,1.271-6.421C400.803,198.598,405.88,200.088,406.29,200.847z"/>
</g>
<path style="fill:#FFE15A;" d="M399.299,198.786c0.601,0.828,1.059,5.681,0.334,6.194c-0.466,0.33-7.33-0.234-8.162-1.131 c-0.743-0.801-0.2-5.803,0.614-6.175C392.822,197.336,398.797,198.095,399.299,198.786z"/>
<circle style="fill:#9B8278;" cx="368.36" cy="185.78" r="2.59"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 11 KiB

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