summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vscode/c_cpp_properties.json22
-rw-r--r--.vscode/settings.json63
-rw-r--r--Cargo.toml20
-rw-r--r--book/.gitignore1
-rw-r--r--book/book.toml6
-rw-r--r--book/src/SUMMARY.md4
-rw-r--r--book/src/chapter_1.md1
-rw-r--r--book/src/performance.md10
-rw-r--r--console/Cargo.toml11
-rw-r--r--console/src/lib.rs100
-rw-r--r--game.json21
-rw-r--r--packer/packed.pngbin944566 -> 1268654 bytes
-rw-r--r--packer/src/bin/benchmark.rs12
-rw-r--r--packer/src/lib.rs58
-rw-r--r--render/Cargo.toml14
-rw-r--r--render/dhat-heap.json15424
-rw-r--r--render/examples/black.rs19
-rw-r--r--render/examples/bmp.rs3
-rw-r--r--render/examples/res/bunny.pngbin0 -> 438 bytes
-rw-r--r--render/shaders/sprite.wgsl16
-rw-r--r--render/src/instance.rs19
-rw-r--r--render/src/lib.rs1
-rw-r--r--render/src/renderer.rs22
-rw-r--r--render/src/texture.rs137
-rw-r--r--resources/Cargo.toml18
-rw-r--r--resources/src/lib.rs13
-rw-r--r--resources/src/texture.rs394
-rw-r--r--scripts/Cargo.toml2
-rw-r--r--scripts/src/libs/system.rs2
-rw-r--r--shell-spec.txt13
-rw-r--r--sprites/Cargo.toml8
-rw-r--r--sprites/src/lib.rs150
-rw-r--r--src/lib.rs1
-rw-r--r--src/main.rs160
-rw-r--r--sys/Cargo.toml8
-rw-r--r--sys/build.rs8
-rw-r--r--sys/src/lib.rs98
-rw-r--r--sys/src/renderer.rs49
-rw-r--r--sys/src/window.rs116
-rw-r--r--textures/Cargo.toml13
-rw-r--r--textures/src/lib.rs96
-rw-r--r--todos.txt2
-rw-r--r--tvg/src/colors.rs171
-rw-r--r--tvg/src/commands.rs153
-rw-r--r--tvg/src/header.rs8
-rw-r--r--tvg/src/lib.rs19
-rw-r--r--tvg/src/path.rs20
-rw-r--r--tvg/src/render.rs506
48 files changed, 17323 insertions, 689 deletions
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
new file mode 100644
index 0000000..5a53dc7
--- /dev/null
+++ b/.vscode/c_cpp_properties.json
@@ -0,0 +1,22 @@
+{
+ "configurations": [
+ {
+ "name": "Win32",
+ "includePath": [
+ "${workspaceFolder}/**"
+ ],
+ "defines": [
+ "_DEBUG",
+ "UNICODE",
+ "_UNICODE"
+ ],
+ "windowsSdkVersion": "10.0.19041.0",
+ "compilerPath": "cl.exe",
+ "cStandard": "c17",
+ "cppStandard": "c++20",
+ "intelliSenseMode": "windows-msvc-x64",
+ "compilerArgs": []
+ }
+ ],
+ "version": 4
+} \ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c2985e2
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,63 @@
+{
+ "files.associations": {
+ "algorithm": "cpp",
+ "atomic": "cpp",
+ "bit": "cpp",
+ "cctype": "cpp",
+ "charconv": "cpp",
+ "chrono": "cpp",
+ "clocale": "cpp",
+ "cmath": "cpp",
+ "compare": "cpp",
+ "concepts": "cpp",
+ "cstddef": "cpp",
+ "cstdint": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cstring": "cpp",
+ "ctime": "cpp",
+ "cwchar": "cpp",
+ "exception": "cpp",
+ "format": "cpp",
+ "forward_list": "cpp",
+ "initializer_list": "cpp",
+ "iomanip": "cpp",
+ "ios": "cpp",
+ "iosfwd": "cpp",
+ "istream": "cpp",
+ "iterator": "cpp",
+ "limits": "cpp",
+ "locale": "cpp",
+ "map": "cpp",
+ "memory": "cpp",
+ "new": "cpp",
+ "optional": "cpp",
+ "ostream": "cpp",
+ "ratio": "cpp",
+ "sstream": "cpp",
+ "stdexcept": "cpp",
+ "streambuf": "cpp",
+ "string": "cpp",
+ "system_error": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "typeinfo": "cpp",
+ "utility": "cpp",
+ "vector": "cpp",
+ "xfacet": "cpp",
+ "xiosbase": "cpp",
+ "xlocale": "cpp",
+ "xlocbuf": "cpp",
+ "xlocinfo": "cpp",
+ "xlocmes": "cpp",
+ "xlocmon": "cpp",
+ "xlocnum": "cpp",
+ "xloctime": "cpp",
+ "xmemory": "cpp",
+ "xstddef": "cpp",
+ "xstring": "cpp",
+ "xtr1common": "cpp",
+ "xtree": "cpp",
+ "xutility": "cpp"
+ }
+} \ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index d481405..8138b5c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,5 +1,5 @@
[workspace]
-members = ["render", "resources", "tvg"]
+members = ["packer", "textures", "tvg", "scripts", "sprites", "sys", "console"]
resolver = "2"
[package]
@@ -10,7 +10,19 @@ rust-version = "1.65"
publish = false
[dependencies]
-alligator_render = { path = "render" }
+alligator_scripts = { path = "scripts" }
+alligator_sprites = { path = "sprites" }
+alligator_sys = { path = "sys" }
+alligator_textures = { path = "textures" }
-[lib]
-crate-type = ["cdylib", "lib"]
+clap = "4"
+serde = "1"
+serde_json = "1"
+sha3 = "0.10"
+
+[profile.release]
+#strip = "symbols"
+opt-level = 'z'
+#lto = true
+panic = 'abort'
+#codegen-units = 1
diff --git a/book/.gitignore b/book/.gitignore
new file mode 100644
index 0000000..7585238
--- /dev/null
+++ b/book/.gitignore
@@ -0,0 +1 @@
+book
diff --git a/book/book.toml b/book/book.toml
new file mode 100644
index 0000000..8185223
--- /dev/null
+++ b/book/book.toml
@@ -0,0 +1,6 @@
+[book]
+authors = ["Mica White"]
+language = "en"
+multilingual = false
+src = "src"
+title = "The Alligator Book"
diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md
new file mode 100644
index 0000000..570263b
--- /dev/null
+++ b/book/src/SUMMARY.md
@@ -0,0 +1,4 @@
+# Summary
+
+- [Chapter 1](./chapter_1.md)
+- [Performance](./performance.md)
diff --git a/book/src/chapter_1.md b/book/src/chapter_1.md
new file mode 100644
index 0000000..b743fda
--- /dev/null
+++ b/book/src/chapter_1.md
@@ -0,0 +1 @@
+# Chapter 1
diff --git a/book/src/performance.md b/book/src/performance.md
new file mode 100644
index 0000000..d769a6f
--- /dev/null
+++ b/book/src/performance.md
@@ -0,0 +1,10 @@
+# Performance
+
+Here are some tips to make your game perform more quickly
+
+## Scripts
+
+Generally, one large WebAssembly script will perform better than many small
+scripts. There is overhead that comes from calling a script, and more scripts
+will result in more overhead. Try to have as few scripts as possible. Ideally,
+you should have no more than 20 scripts enabled at the same time.
diff --git a/console/Cargo.toml b/console/Cargo.toml
new file mode 100644
index 0000000..0d23054
--- /dev/null
+++ b/console/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "alligator_console"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+smol = "2"
+log = "0.4"
+pollster = "0.3" \ No newline at end of file
diff --git a/console/src/lib.rs b/console/src/lib.rs
new file mode 100644
index 0000000..afab4af
--- /dev/null
+++ b/console/src/lib.rs
@@ -0,0 +1,100 @@
+use std::net::Ipv6Addr;
+
+use log::Level;
+use pollster::FutureExt;
+use smol::channel::{Receiver, Sender};
+use smol::io::AsyncWriteExt;
+use smol::net::{TcpListener, TcpStream};
+
+pub struct Console {
+ tcp_socket: TcpStream,
+ messages: Receiver<ConsoleMessage>,
+ sender: Sender<ConsoleMessage>,
+}
+
+pub enum ConsoleMessage {
+ RuntimeLog {
+ message: String,
+ level: Level,
+ file: String,
+ line: u32,
+ },
+ ScriptLog {
+ message: String,
+ level: Level,
+ file: String,
+ line: u32,
+ },
+}
+
+pub struct ConsoleLogger(Sender<ConsoleMessage>);
+
+impl Console {
+ pub async fn new(port: u16) -> Result<Self, std::io::Error> {
+ let tcp_listener = TcpListener::bind((Ipv6Addr::LOCALHOST, port)).await?;
+ let tcp_socket = tcp_listener.accept().await?.0;
+ let (sender, reciever) = smol::channel::unbounded();
+ Ok(Self {
+ tcp_socket,
+ messages: reciever,
+ sender,
+ })
+ }
+
+ pub fn sender(&self) -> Sender<ConsoleMessage> {
+ self.sender.clone()
+ }
+
+ pub fn logger(&self) -> ConsoleLogger {
+ ConsoleLogger(self.sender())
+ }
+
+ pub async fn flush(&mut self) -> std::io::Result<()> {
+ while let Ok(message) = self.messages.try_recv() {
+ match message {
+ ConsoleMessage::RuntimeLog {
+ message,
+ level,
+ file,
+ line,
+ } => {
+ let msg = format!("runtimelog {level} {file}:{line} {message}\n");
+ self.tcp_socket.write(msg.as_bytes()).await?;
+ }
+ ConsoleMessage::ScriptLog {
+ message,
+ level,
+ file,
+ line,
+ } => {
+ let msg = format!("scriptlog {level} {file}:{line} {message}\n");
+ self.tcp_socket.write(msg.as_bytes()).await?;
+ }
+ }
+ }
+
+ self.tcp_socket.flush().await?;
+
+ Ok(())
+ }
+}
+
+impl log::Log for ConsoleLogger {
+ fn enabled(&self, _: &log::Metadata) -> bool {
+ true
+ }
+
+ fn log(&self, record: &log::Record) {
+ let _ = self
+ .0
+ .send(ConsoleMessage::RuntimeLog {
+ message: record.args().to_string(),
+ level: record.level(),
+ file: record.file().map(str::to_string).unwrap_or_default(),
+ line: record.line().unwrap_or_default(),
+ })
+ .block_on();
+ }
+
+ fn flush(&self) {}
+}
diff --git a/game.json b/game.json
new file mode 100644
index 0000000..9014385
--- /dev/null
+++ b/game.json
@@ -0,0 +1,21 @@
+{
+ "alligator_version": 0,
+ "scenes": {
+ "black": {
+ "initial_sprites": {},
+ "initial_scripts": []
+ }
+ },
+ "textures": {},
+ "scripts": {},
+ "default_scene": "black",
+ "default_textures_size_target": 0,
+ "sprite_manager_capacity": 0,
+ "default_window_width": 640,
+ "default_window_height": 480,
+ "default_atlas_width": 640,
+ "default_atlas_height": 480,
+ "default_window_mode": "Windowed",
+ "window_title": "Black.exe",
+ "vsync": true
+} \ No newline at end of file
diff --git a/packer/packed.png b/packer/packed.png
index 1a913a2..9602cdb 100644
--- a/packer/packed.png
+++ b/packer/packed.png
Binary files differ
diff --git a/packer/src/bin/benchmark.rs b/packer/src/bin/benchmark.rs
index bb83992..4d898d5 100644
--- a/packer/src/bin/benchmark.rs
+++ b/packer/src/bin/benchmark.rs
@@ -10,17 +10,19 @@ fn main() -> Result<(), exun::RawUnexpected> {
let start = Instant::now();
let mut packer = RectanglePacker::new();
- packer.add_texture("gator".into(), Arc::new(img1.to_rgb8()));
- packer.add_texture("bunny".into(), Arc::new(img2.to_rgb8()));
- packer.add_texture("ghost".into(), Arc::new(img3.to_rgb8()));
+ packer.add_texture("gator".into(), Arc::new(img1.to_rgba8()));
+ packer.add_texture("bunny".into(), Arc::new(img2.to_rgba8()));
+ packer.add_texture("ghost".into(), Arc::new(img3.to_rgba8()));
println!("{} milliseconds", start.elapsed().as_secs_f32() * 1000.0);
let start = Instant::now();
- let packed = packer.output();
+ let packed = packer.output(1, 1);
println!("{} milliseconds", start.elapsed().as_secs_f32() * 1000.0);
let mut file = File::create("packed.png")?;
- packed?.0.write_to(&mut file, ImageOutputFormat::Bmp)?;
+ packed?
+ .get_full_atlas()
+ .write_to(&mut file, ImageOutputFormat::Bmp)?;
Ok(())
}
diff --git a/packer/src/lib.rs b/packer/src/lib.rs
index 328f90e..6715a9e 100644
--- a/packer/src/lib.rs
+++ b/packer/src/lib.rs
@@ -3,7 +3,7 @@ use std::ops::Deref;
use std::sync::Arc;
use exun::RawUnexpected;
-use image::{GenericImage, RgbImage};
+use image::{GenericImage, RgbaImage};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Rectangle {
@@ -15,14 +15,14 @@ pub struct Rectangle {
#[derive(Debug, Clone, PartialEq, Eq)]
struct Texture {
- id: Box<str>,
+ id: Arc<str>,
x: u32,
y: u32,
- texture: Arc<RgbImage>,
+ texture: Arc<RgbaImage>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
-struct ImageRect(Arc<RgbImage>, Box<str>);
+struct ImageRect(Arc<RgbaImage>, Arc<str>);
#[derive(Debug, Default, Clone)]
pub struct RectanglePacker {
@@ -30,6 +30,12 @@ pub struct RectanglePacker {
textures: Vec<ImageRect>,
}
+#[derive(Debug, Clone)]
+pub struct TextureAtlas {
+ atlas: RgbaImage,
+ ids: HashMap<Arc<str>, Rectangle>,
+}
+
impl PartialOrd for ImageRect {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
@@ -77,15 +83,19 @@ impl RectanglePacker {
self.textures.shrink_to_fit()
}
- pub fn add_texture(&mut self, name: Box<str>, texture: Arc<RgbImage>) {
+ pub fn add_texture(&mut self, name: Arc<str>, texture: Arc<RgbaImage>) {
if texture.width() > self.min_width {
self.min_width = texture.width() + 1;
}
self.textures.push(ImageRect(texture, name));
}
- fn pack(&mut self) -> (Vec<Texture>, u32, u32) {
- let image_width = self.min_width;
+ fn pack(&mut self, min_width: u32) -> (Vec<Texture>, u32, u32) {
+ let image_width = self.min_width.max(min_width);
+
+ // to make sure padding is rounded up and not down, 64 is added
+ // to make sure some padding is always present, minimum is 1 pixel
+ let horizontal_padding = ((image_width + 64) / 128).max(1);
let mut x_position = 0;
let mut y_position = 0;
@@ -97,7 +107,9 @@ impl RectanglePacker {
for texture in &self.textures {
// loop to the next row if we've gone off the edge
if (x_position + texture.0.width()) > image_width {
- y_position += largest_row_height;
+ let vertical_padding = ((largest_row_height + 64) / 128).max(1);
+
+ y_position += largest_row_height + vertical_padding;
x_position = 0;
largest_row_height = 0;
}
@@ -106,7 +118,7 @@ impl RectanglePacker {
let x = x_position;
let y = y_position;
- x_position += texture.0.width();
+ x_position += texture.0.width() + horizontal_padding;
if texture.0.height() > largest_row_height {
largest_row_height = texture.0.height();
@@ -120,17 +132,23 @@ impl RectanglePacker {
});
}
- let total_height = y_position + largest_row_height;
+ let vertical_padding = ((largest_row_height + 64) / 128).max(1);
+ let total_height = y_position + largest_row_height + vertical_padding;
(rectangles, image_width, total_height)
}
- pub fn output(&mut self) -> Result<(RgbImage, HashMap<Box<str>, Rectangle>), RawUnexpected> {
- let (rectangles, image_width, image_height) = self.pack();
- let mut image = RgbImage::new(image_width, image_height);
+ pub fn output(
+ &mut self,
+ min_width: u32,
+ min_height: u32,
+ ) -> Result<TextureAtlas, RawUnexpected> {
+ let (rectangles, image_width, image_height) = self.pack(min_width);
+ let image_height = image_height.max(min_height);
+ let mut atlas = RgbaImage::new(image_width, image_height);
let mut ids = HashMap::with_capacity(rectangles.len());
for rectangle in rectangles {
- image.copy_from(rectangle.texture.deref(), rectangle.x, rectangle.y)?;
+ atlas.copy_from(rectangle.texture.deref(), rectangle.x, rectangle.y)?;
ids.insert(
rectangle.id,
Rectangle {
@@ -142,6 +160,16 @@ impl RectanglePacker {
);
}
- Ok((image, ids))
+ Ok(TextureAtlas { atlas, ids })
+ }
+}
+
+impl TextureAtlas {
+ pub fn get_full_atlas(&self) -> &RgbaImage {
+ &self.atlas
+ }
+
+ pub fn get_texture_rect(&self, id: &str) -> Option<Rectangle> {
+ self.ids.get(id).cloned()
}
}
diff --git a/render/Cargo.toml b/render/Cargo.toml
index 086a993..1cb523c 100644
--- a/render/Cargo.toml
+++ b/render/Cargo.toml
@@ -8,30 +8,22 @@ publish = false
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-alligator_resources = { path = "../resources" }
-
bytemuck = { version = "1", features = ["derive"] }
thiserror = "1"
profiling = "1"
-wgpu = "0.15"
+wgpu = "0.18"
winit = "0.28"
image = "0.24"
cgmath = "0.18"
pollster = "0.2"
log = "0.4"
-parking_lot = "0.12"
-texture_packer = { git="https://github.com/botahamec/piston_texture_packer", branch="u16" }
-tracy-client = { version = "0.15", optional = true }
-dhat = { version = "0.3", optional = true }
+[dev-dependencies]
+tracy-client = "0.15"
[lib]
crate-type = ["cdylib", "lib"]
-[features]
-dhat = ["dep:dhat"]
-profile-with-tracy = ["tracy-client", "profiling/profile-with-tracy"]
-
[[example]]
name = "black"
diff --git a/render/dhat-heap.json b/render/dhat-heap.json
new file mode 100644
index 0000000..2b694d3
--- /dev/null
+++ b/render/dhat-heap.json
@@ -0,0 +1,15424 @@
+{
+"dhatFileVersion": 2,
+"mode": "rust-heap",
+"verb": "Allocated",
+"bklt": true,
+"bkacc": false,
+"tu": "µs",
+"Mtu": "s",
+"tuth": 10,
+"cmd": "C:\\Users\\epice\\Projects\\alligator\\target\\release\\examples\\black.exe",
+"pid": 7632,
+"tg": 397502,
+"te": 405798,
+"pps": [
+{
+"tb": 30,
+"tbk": 1,
+"tl": 6,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 8,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 30739,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 18,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 5,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 2893,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 131,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 1352,
+"mb": 32,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 7,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 65,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 9,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 30352,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 6,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 29391,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 128,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 18,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 7,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2327,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 84,
+"tbk": 2,
+"tl": 68,
+"mb": 56,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 8,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 344,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6879,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 3168,
+"tbk": 1,
+"tl": 30799,
+"mb": 3168,
+"mbk": 1,
+"gb": 3168,
+"gbk": 1,
+"eb": 3168,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 14,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 2,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 84,
+"tbk": 3,
+"tl": 400412,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": [
+1,
+2
+]
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 9,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 101153,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 128,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1023,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 75,
+"tbk": 1,
+"tl": 0,
+"mb": 75,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 2,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 10,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1084,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": [
+1,
+2,
+3,
+4,
+5,
+6,
+7,
+8
+]
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 37387,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 30618,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 35722,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 128,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 80,
+"tbk": 5,
+"tl": 26753,
+"mb": 80,
+"mbk": 5,
+"gb": 80,
+"gbk": 5,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 54,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 6,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 1,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 17915,
+"mb": 52,
+"mbk": 1,
+"gb": 52,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6618,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 4,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 19,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 6,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 320,
+"tbk": 2,
+"tl": 10855,
+"mb": 320,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 4,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 3,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 10,
+"tbk": 1,
+"tl": 2,
+"mb": 10,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 320,
+"tbk": 4,
+"tl": 1382,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 6,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1564,
+"tbk": 4,
+"tl": 79158,
+"mb": 1232,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 10,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 7,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 3,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 1016,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 19,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 8,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 157,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 9,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 2,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 8,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 31340,
+"mb": 52,
+"mbk": 1,
+"gb": 52,
+"gbk": 1,
+"eb": 52,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 259,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 7,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 43,
+"tbk": 1,
+"tl": 10,
+"mb": 43,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 620,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 18074,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 10,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 6,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 16754,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 3,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 9404,
+"mb": 96,
+"mbk": 1,
+"gb": 96,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 7,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 6,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 3,
+"tl": 696,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 79,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4321,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 3,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 34510,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 6,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 4,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 15,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 4,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 97968,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 5,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 775,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 992,
+"tbk": 5,
+"tl": 5570,
+"mb": 512,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 9,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 7,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 101391,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 36502,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2025,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 8,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 99087,
+"mb": 96,
+"mbk": 1,
+"gb": 96,
+"gbk": 1,
+"eb": 96,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 56,
+"tbk": 3,
+"tl": 1,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1024,
+"tbk": 1,
+"tl": 195,
+"mb": 1024,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 1024,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 9,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 10,
+"tbk": 1,
+"tl": 3,
+"mb": 10,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 10,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 88,
+"tbk": 1,
+"tl": 581,
+"mb": 88,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 896,
+"tbk": 3,
+"tl": 6164,
+"mb": 512,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 4,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 7,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 13,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 30064,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 1,
+"tl": 1863,
+"mb": 40,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 2,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 11,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 8,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 5,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 1,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 12,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 10,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 23,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3409,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 11,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 397524,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": [
+1,
+2,
+3,
+4,
+5,
+6,
+7,
+8
+]
+},
+{
+"tb": 9,
+"tbk": 1,
+"tl": 2,
+"mb": 9,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 3,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 88,
+"tbk": 1,
+"tl": 2600,
+"mb": 88,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2859,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 512,
+"tbk": 1,
+"tl": 402132,
+"mb": 512,
+"mbk": 1,
+"gb": 512,
+"gbk": 1,
+"eb": 512,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 5950,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 9,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 2,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 18964,
+"mb": 52,
+"mbk": 1,
+"gb": 52,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 8,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 9,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 4,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 64,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 70,
+"tbk": 3,
+"tl": 826,
+"mb": 40,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 50,
+"tbk": 1,
+"tl": 3271,
+"mb": 50,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 11,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 1,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 8,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 7,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 11,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 100876,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 6,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 3,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 68,
+"tbk": 1,
+"tl": 108,
+"mb": 68,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 305,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 6,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 7,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 7,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 2,
+"tl": 87,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 7,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 37444,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 30410,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 112,
+"tbk": 7,
+"tl": 32233,
+"mb": 112,
+"mbk": 7,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 513,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 4042,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 5,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 28641,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 22824,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 28,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 11,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 80,
+"tbk": 5,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 9,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 3389,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 3077,
+"mb": 32,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 15,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 59996,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 36447,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 530,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 26043,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 6,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 1,
+"tl": 105,
+"mb": 40,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 60,
+"tbk": 2,
+"tl": 97053,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 2055,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 9,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6682,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 373,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 80,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 624,
+"tbk": 3,
+"tl": 1086,
+"mb": 336,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 2,
+"tl": 43976,
+"mb": 14,
+"mbk": 2,
+"gb": 14,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 5,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 18240,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 2,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 7,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 180,
+"tbk": 1,
+"tl": 3925,
+"mb": 180,
+"mbk": 1,
+"gb": 180,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 3,
+"tl": 21624,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 4,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 532,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 3456,
+"tbk": 6,
+"tl": 1066,
+"mb": 1536,
+"mbk": 1,
+"gb": 1536,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 3380,
+"tbk": 1,
+"tl": 1883,
+"mb": 3380,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 3,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 6,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 36775,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 112,
+"tbk": 3,
+"tl": 405518,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 5,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 1,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 5,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 2,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 15,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 19,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 29631,
+"mb": 32,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 4,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 68,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 17,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 10,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 31216,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 30162,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 44310,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1564,
+"tbk": 4,
+"tl": 1776,
+"mb": 1232,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 10,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 6,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 18019,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 3,
+"tl": 55546,
+"mb": 24,
+"mbk": 3,
+"gb": 24,
+"gbk": 3,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 10,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6816,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 11,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 11,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 8,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 4,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 84,
+"tbk": 1,
+"tl": 17114,
+"mb": 84,
+"mbk": 1,
+"gb": 84,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 2,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 1,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 11,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 7,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 214223,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 8,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 10,
+"tbk": 1,
+"tl": 4,
+"mb": 10,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 115103,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6749,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 7,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 69,
+"tbk": 2,
+"tl": 37242,
+"mb": 38,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 12,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 6,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 9,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 1,
+"tl": 24610,
+"mb": 224,
+"mbk": 1,
+"gb": 224,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 127,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 73,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 26,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 416,
+"tbk": 1,
+"tl": 20854,
+"mb": 416,
+"mbk": 1,
+"gb": 416,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1280,
+"tbk": 1,
+"tl": 101034,
+"mb": 1280,
+"mbk": 1,
+"gb": 1280,
+"gbk": 1,
+"eb": 1280,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 8,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 0,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 62,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 5,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 6864,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 3387,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 620,
+"tbk": 2,
+"tl": 3774,
+"mb": 620,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 7,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 576,
+"tbk": 3,
+"tl": 19663,
+"mb": 576,
+"mbk": 3,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 6340,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 397469,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": [
+1,
+2,
+3,
+4,
+5,
+6,
+7,
+8
+]
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 2,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 2,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 77299,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 21,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 644,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 433,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 101445,
+"mb": 96,
+"mbk": 1,
+"gb": 96,
+"gbk": 1,
+"eb": 96,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 50,
+"tbk": 1,
+"tl": 12512,
+"mb": 50,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 17,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 8,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 71615,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 2,
+"tl": 23824,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 54,
+"tbk": 1,
+"tl": 6,
+"mb": 54,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 20,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 11,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 5,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 160,
+"tbk": 10,
+"tl": 13879,
+"mb": 144,
+"mbk": 9,
+"gb": 144,
+"gbk": 9,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 5822,
+"mb": 96,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 574,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 31120,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 8,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 320,
+"tbk": 1,
+"tl": 195,
+"mb": 320,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 98,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 92,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 34,
+"tbk": 1,
+"tl": 7,
+"mb": 34,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 34,
+"tbk": 1,
+"tl": 5,
+"mb": 34,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 10,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 4,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 10,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 30311,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 1274,
+"tbk": 1,
+"tl": 1844,
+"mb": 1274,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 9338,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 62,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 6,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 402337,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 4,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7512,
+"tbk": 1,
+"tl": 214497,
+"mb": 7512,
+"mbk": 1,
+"gb": 7512,
+"gbk": 1,
+"eb": 7512,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 30208,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 23047,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1008,
+"tbk": 6,
+"tl": 3449,
+"mb": 512,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 8,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 960,
+"tbk": 4,
+"tl": 5569,
+"mb": 512,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 9,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 646,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 216,
+"tbk": 1,
+"tl": 3030,
+"mb": 216,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 136,
+"tbk": 1,
+"tl": 145,
+"mb": 136,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 5,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 7,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 6,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 672,
+"tbk": 3,
+"tl": 296686,
+"mb": 672,
+"mbk": 3,
+"gb": 672,
+"gbk": 3,
+"eb": 672,
+"ebk": 3,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 241,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 8,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 4451,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2461,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 536,
+"tbk": 23,
+"tl": 1806645,
+"mb": 536,
+"mbk": 23,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1228800,
+"tbk": 1,
+"tl": 28871,
+"mb": 1228800,
+"mbk": 1,
+"gb": 1228800,
+"gbk": 1,
+"eb": 1228800,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 1,
+"tl": 20344,
+"mb": 224,
+"mbk": 1,
+"gb": 224,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 483,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 3,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 80,
+"tbk": 5,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 36555,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 5,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 6,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 6,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 35837,
+"mb": 96,
+"mbk": 1,
+"gb": 96,
+"gbk": 1,
+"eb": 96,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 6267,
+"mb": 32,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1076,
+"tbk": 1,
+"tl": 1205,
+"mb": 1076,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 1076,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 11,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 6,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 95,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 34221,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 65,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 1,
+"tl": 1,
+"mb": 7,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2923,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 11,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 136,
+"tbk": 1,
+"tl": 3380,
+"mb": 136,
+"mbk": 1,
+"gb": 136,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 1,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2080,
+"tbk": 1,
+"tl": 587,
+"mb": 2080,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 2080,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 9,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 6,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 22885,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 7,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 1,
+"tl": 6114,
+"mb": 7,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 6,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 11,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 14,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 8,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 36154,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 5,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 136,
+"tbk": 2,
+"tl": 1500,
+"mb": 68,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 12,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 4,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 100810,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 8,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 11,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2407,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 4,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 536,
+"tbk": 2,
+"tl": 1236,
+"mb": 536,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 34326,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 18,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 39,
+"tbk": 1,
+"tl": 7,
+"mb": 39,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 2,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 3,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 4,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 2,
+"tl": 97589,
+"mb": 12,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 992,
+"tbk": 1,
+"tl": 36025,
+"mb": 992,
+"mbk": 1,
+"gb": 992,
+"gbk": 1,
+"eb": 992,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 12,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 15,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 0,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 6,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 8,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 3050,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 46,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 402614,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 56,
+"tbk": 3,
+"tl": 588,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 3,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 0,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 280,
+"tbk": 3,
+"tl": 72430,
+"mb": 280,
+"mbk": 3,
+"gb": 280,
+"gbk": 3,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 13,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 160,
+"tbk": 1,
+"tl": 31615,
+"mb": 160,
+"mbk": 1,
+"gb": 160,
+"gbk": 1,
+"eb": 160,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 11,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 8,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 15,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 6,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 7,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 35,
+"tbk": 2,
+"tl": 402676,
+"mb": 18,
+"mbk": 1,
+"gb": 18,
+"gbk": 1,
+"eb": 18,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 10,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 44,
+"tbk": 5,
+"tl": 110998,
+"mb": 44,
+"mbk": 5,
+"gb": 44,
+"gbk": 5,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 98307,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 1344,
+"tbk": 3,
+"tl": 2923,
+"mb": 768,
+"mbk": 1,
+"gb": 768,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2152,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 7,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 3,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 212,
+"tbk": 1,
+"tl": 29768,
+"mb": 212,
+"mbk": 1,
+"gb": 212,
+"gbk": 1,
+"eb": 212,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 6,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 12,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 20,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 7,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 13,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 70,
+"tbk": 3,
+"tl": 12198,
+"mb": 40,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 4,
+"tl": 203,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5090,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 17,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 5,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 112,
+"tbk": 3,
+"tl": 62,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 4,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 35,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 20,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 1,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 10,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 7,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 8,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 2,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 104,
+"tbk": 2,
+"tl": 1307,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 38,
+"tbk": 1,
+"tl": 5,
+"mb": 38,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 9,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2880,
+"tbk": 4,
+"tl": 5092,
+"mb": 1536,
+"mbk": 1,
+"gb": 1536,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 10,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 134611,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 1,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 80,
+"tbk": 1,
+"tl": 682,
+"mb": 80,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 4,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 44,
+"tbk": 1,
+"tl": 2,
+"mb": 44,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 5200,
+"tbk": 1,
+"tl": 27649,
+"mb": 5200,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 712,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 232,
+"tbk": 2,
+"tl": 580,
+"mb": 116,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 4,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 3,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 100928,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 98604,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 128,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 8,
+"tl": 10794,
+"mb": 128,
+"mbk": 8,
+"gb": 128,
+"gbk": 8,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 10,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 621,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 2,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 26,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1088,
+"tbk": 7,
+"tl": 42730,
+"mb": 576,
+"mbk": 2,
+"gb": 576,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 38,
+"tbk": 1,
+"tl": 6,
+"mb": 38,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 8,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 11,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 4,
+"tbk": 1,
+"tl": 1,
+"mb": 4,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 416,
+"tbk": 1,
+"tl": 205,
+"mb": 416,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 378478,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 4,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 8,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 10,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 6267,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 5,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 2,
+"tl": 1291,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 6,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 10,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 59725,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 5440,
+"tbk": 7,
+"tl": 42730,
+"mb": 2880,
+"mbk": 2,
+"gb": 2880,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 14,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 5,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 5,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 17,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 8,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 3,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 11,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 3012,
+"tbk": 7,
+"tl": 92,
+"mb": 1608,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 11,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 8,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 6,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 2,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 2,
+"tl": 182,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 30,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 10,
+"tbk": 1,
+"tl": 2,
+"mb": 10,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 3,
+"tbk": 1,
+"tl": 22946,
+"mb": 3,
+"mbk": 1,
+"gb": 3,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 2,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 31250,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 8,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 192,
+"tbk": 3,
+"tl": 36379,
+"mb": 144,
+"mbk": 2,
+"gb": 144,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 2,
+"tl": 5479,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1344,
+"tbk": 3,
+"tl": 3261,
+"mb": 768,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1243,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 84,
+"tbk": 1,
+"tl": 1522,
+"mb": 84,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 78,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 26,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 11,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 4,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 20,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 5,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 13,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 7,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 347380,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 13,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 184,
+"tbk": 1,
+"tl": 402161,
+"mb": 184,
+"mbk": 1,
+"gb": 184,
+"gbk": 1,
+"eb": 184,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 14087,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 59835,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 83,
+"tbk": 7,
+"tl": 167785,
+"mb": 83,
+"mbk": 7,
+"gb": 83,
+"gbk": 7,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 0,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 8,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 576,
+"tbk": 2,
+"tl": 643,
+"mb": 384,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 4,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 304,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 2,
+"tl": 44624,
+"mb": 7,
+"mbk": 2,
+"gb": 7,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 18118,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 7,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 144,
+"tbk": 2,
+"tl": 101,
+"mb": 72,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 212819,
+"mb": 21,
+"mbk": 1,
+"gb": 21,
+"gbk": 1,
+"eb": 21,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 20388,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 7,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 15,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 207,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 34175,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 29908,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 5,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 8,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 14,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 12,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 4,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 22,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 2,
+"tl": 59569,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 7,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 62,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2545,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 4,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 320,
+"tbk": 1,
+"tl": 156,
+"mb": 320,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 73,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 4,
+"tbk": 1,
+"tl": 389670,
+"mb": 4,
+"mbk": 1,
+"gb": 4,
+"gbk": 1,
+"eb": 4,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 10,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 10,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 3,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 4,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 9,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 5,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 292,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2496,
+"tbk": 2,
+"tl": 5480,
+"mb": 1664,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 3,
+"tl": 67711,
+"mb": 24,
+"mbk": 3,
+"gb": 24,
+"gbk": 3,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 9474,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 37591,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1280,
+"tbk": 1,
+"tl": 100983,
+"mb": 1280,
+"mbk": 1,
+"gb": 1280,
+"gbk": 1,
+"eb": 1280,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 320,
+"tbk": 2,
+"tl": 42430,
+"mb": 320,
+"mbk": 2,
+"gb": 320,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 144,
+"tbk": 1,
+"tl": 10,
+"mb": 144,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 688,
+"tbk": 1,
+"tl": 7540,
+"mb": 688,
+"mbk": 1,
+"gb": 688,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 12,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 4,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 2,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 5656,
+"tbk": 1,
+"tl": 218257,
+"mb": 5656,
+"mbk": 1,
+"gb": 5656,
+"gbk": 1,
+"eb": 5656,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 8,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 18560,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 9,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 724,
+"tbk": 1,
+"tl": 18366,
+"mb": 724,
+"mbk": 1,
+"gb": 724,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 212,
+"tbk": 1,
+"tl": 36223,
+"mb": 212,
+"mbk": 1,
+"gb": 212,
+"gbk": 1,
+"eb": 212,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 4,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 9,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 80,
+"tbk": 5,
+"tl": 23436,
+"mb": 80,
+"mbk": 5,
+"gb": 80,
+"gbk": 5,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 0,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 10,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 7,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 1,
+"tl": 98404,
+"mb": 224,
+"mbk": 1,
+"gb": 224,
+"gbk": 1,
+"eb": 224,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 4510,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 97401,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 11,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 2,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1280,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 10,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 137,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 10,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 10,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 192,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 144,
+"tbk": 1,
+"tl": 101087,
+"mb": 144,
+"mbk": 1,
+"gb": 144,
+"gbk": 1,
+"eb": 144,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 30679,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 212,
+"tbk": 2,
+"tl": 22362,
+"mb": 160,
+"mbk": 1,
+"gb": 160,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 1,
+"tl": 0,
+"mb": 7,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 30112,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 7051,
+"tbk": 291,
+"tl": 66269446,
+"mb": 7051,
+"mbk": 291,
+"gb": 7051,
+"gbk": 291,
+"eb": 7051,
+"ebk": 291,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 9,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 6,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 16,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 28684,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 24,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 257,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 62,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 134547,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 20,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 536,
+"tbk": 23,
+"tl": 21101,
+"mb": 536,
+"mbk": 23,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 10,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 28910,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 0,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 31530,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 7,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 594,
+"mb": 96,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 9,
+"tbk": 1,
+"tl": 2,
+"mb": 9,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 3,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 7,
+"tl": 1715,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 402642,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 2,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 7,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 3,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 288,
+"tbk": 1,
+"tl": 390299,
+"mb": 288,
+"mbk": 1,
+"gb": 288,
+"gbk": 1,
+"eb": 288,
+"ebk": 1,
+"fs": [
+1,
+9,
+10
+]
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 12269,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 18,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 31683,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 6941,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 276,
+"tbk": 1,
+"tl": 2391,
+"mb": 276,
+"mbk": 1,
+"gb": 276,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 0,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 3,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 98019,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 256,
+"tbk": 1,
+"tl": 373,
+"mb": 256,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 4216,
+"tbk": 7,
+"tl": 89,
+"mb": 2328,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 4,
+"tbk": 1,
+"tl": 2805,
+"mb": 4,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 800,
+"tbk": 1,
+"tl": 3242,
+"mb": 800,
+"mbk": 1,
+"gb": 800,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 37484,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 9,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 181,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 84,
+"tbk": 3,
+"tl": 12234,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 2,
+"tl": 44264,
+"mb": 7,
+"mbk": 2,
+"gb": 7,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2976,
+"tbk": 1,
+"tl": 18173,
+"mb": 2976,
+"mbk": 1,
+"gb": 2976,
+"gbk": 1,
+"eb": 2976,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4835,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 5563,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 10,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 34,
+"tbk": 1,
+"tl": 8,
+"mb": 34,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 4,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 130,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 320,
+"tbk": 2,
+"tl": 44174,
+"mb": 320,
+"mbk": 2,
+"gb": 320,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 6,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 98,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 13,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2400,
+"tbk": 1,
+"tl": 214276,
+"mb": 2400,
+"mbk": 1,
+"gb": 2400,
+"gbk": 1,
+"eb": 2400,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 1920,
+"tbk": 4,
+"tl": 441,
+"mb": 1024,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 20,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2032,
+"tbk": 7,
+"tl": 586,
+"mb": 1024,
+"mbk": 1,
+"gb": 1024,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 9,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 674,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 2,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 17388,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 0,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 36414,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 5,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 7,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 6,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 2,
+"tl": 97343,
+"mb": 16,
+"mbk": 1,
+"gb": 4,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 8,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 0,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 4,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 9,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 7609,
+"mb": 52,
+"mbk": 1,
+"gb": 52,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4125,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 36614,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 2,
+"tl": 64,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 9,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 2,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 9,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12048,
+"tbk": 1,
+"tl": 98216,
+"mb": 12048,
+"mbk": 1,
+"gb": 12048,
+"gbk": 1,
+"eb": 12048,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 6,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 14,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 1,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 29508,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 2,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 3,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 8,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 1,
+"tl": 0,
+"mb": 7,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 30462,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 1,
+"tl": 63,
+"mb": 36,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 10,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 20,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 5,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 5,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 2,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2048,
+"tbk": 4,
+"tl": 10181,
+"mb": 1280,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 24557,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 6,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 10,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 24964,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 240,
+"tbk": 4,
+"tl": 1210,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 3,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 3,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 7,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 68,
+"tbk": 2,
+"tl": 383,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 3,
+"tl": 10748,
+"mb": 96,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 32,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 36274,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 4,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 3,
+"tl": 22003,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 0,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 65,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 2,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 6,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 8,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 9115,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 688,
+"tbk": 1,
+"tl": 3970,
+"mb": 688,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 14,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 5,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 1,
+"tl": 1,
+"mb": 36,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 2,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 8,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 7,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 5,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 1,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 8,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 27,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 7,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 41,
+"tbk": 1,
+"tl": 212665,
+"mb": 41,
+"mbk": 1,
+"gb": 41,
+"gbk": 1,
+"eb": 41,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 90,
+"tbk": 6,
+"tl": 551,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 88,
+"tbk": 1,
+"tl": 4767,
+"mb": 88,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25628,
+"tbk": 8,
+"tl": 234396,
+"mb": 19232,
+"mbk": 2,
+"gb": 12816,
+"gbk": 1,
+"eb": 12816,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 1,
+"tl": 9708,
+"mb": 7,
+"mbk": 1,
+"gb": 7,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 1,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 3,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 7,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 8,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 620,
+"tbk": 2,
+"tl": 4100,
+"mb": 620,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 2,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 9,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 736,
+"tbk": 1,
+"tl": 28405,
+"mb": 736,
+"mbk": 1,
+"gb": 736,
+"gbk": 1,
+"eb": 736,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 11217,
+"mb": 32,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 10,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 2,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 8,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 2,
+"tl": 3234,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 130,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 28351,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 425,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 6,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 257,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 0,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 5,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 34371,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 11,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 12,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 1,
+"tl": 9,
+"mb": 40,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2912,
+"tbk": 3,
+"tl": 22004,
+"mb": 1664,
+"mbk": 1,
+"gb": 1664,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 34,
+"tbk": 1,
+"tl": 6,
+"mb": 34,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 15,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 640,
+"tbk": 4,
+"tl": 10402,
+"mb": 448,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 57,
+"tbk": 1,
+"tl": 100759,
+"mb": 57,
+"mbk": 1,
+"gb": 57,
+"gbk": 1,
+"eb": 57,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 98155,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 586,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 5,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 24,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 36666,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 4,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 392590,
+"mb": 52,
+"mbk": 1,
+"gb": 52,
+"gbk": 1,
+"eb": 52,
+"ebk": 1,
+"fs": [
+1,
+2,
+3,
+4,
+5,
+6
+]
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 4,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 3,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 29300,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 29089,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 100,
+"tbk": 1,
+"tl": 277,
+"mb": 100,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 11,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 2,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 2,
+"tl": 0,
+"mb": 4,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 2,
+"tl": 36076,
+"mb": 32,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 31494,
+"mb": 64,
+"mbk": 1,
+"gb": 64,
+"gbk": 1,
+"eb": 64,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 6944,
+"tbk": 5,
+"tl": 5570,
+"mb": 3584,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 140,
+"tbk": 2,
+"tl": 42518,
+"mb": 140,
+"mbk": 2,
+"gb": 140,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 3,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 6,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 8,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 212742,
+"mb": 22,
+"mbk": 1,
+"gb": 22,
+"gbk": 1,
+"eb": 22,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 8,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 532,
+"tbk": 2,
+"tl": 877,
+"mb": 416,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3206,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 496,
+"tbk": 1,
+"tl": 349047,
+"mb": 496,
+"mbk": 1,
+"gb": 496,
+"gbk": 1,
+"eb": 496,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 13,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 4,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 21,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 928,
+"tbk": 1,
+"tl": 31393,
+"mb": 928,
+"mbk": 1,
+"gb": 928,
+"gbk": 1,
+"eb": 928,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 11,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 80,
+"tbk": 5,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 13,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 99158,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 5,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 8,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 7,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 268,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 9,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 23,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 10,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4576,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 536,
+"tbk": 2,
+"tl": 1247,
+"mb": 536,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 25584,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 6,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 34074,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 6,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 25,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 0,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 986,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 4,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1216,
+"tbk": 1,
+"tl": 21632,
+"mb": 1216,
+"mbk": 1,
+"gb": 1216,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 2,
+"tl": 3,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 14,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 84,
+"tbk": 1,
+"tl": 1456,
+"mb": 84,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 1,
+"tl": 1351,
+"mb": 96,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 5,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 2,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 6,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 6,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 59779,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 1566,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 160,
+"tbk": 1,
+"tl": 29452,
+"mb": 160,
+"mbk": 1,
+"gb": 160,
+"gbk": 1,
+"eb": 160,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 4,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 10,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 632,
+"tbk": 2,
+"tl": 232,
+"mb": 632,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 6,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 8,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 30903,
+"mb": 12,
+"mbk": 1,
+"gb": 12,
+"gbk": 1,
+"eb": 12,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 9,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 270,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 7,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 3,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 5,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 449,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 192,
+"tbk": 2,
+"tl": 16687,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 120,
+"tbk": 1,
+"tl": 5,
+"mb": 120,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 23101,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 638,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 94,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 1,
+"tl": 392531,
+"mb": 40,
+"mbk": 1,
+"gb": 40,
+"gbk": 1,
+"eb": 40,
+"ebk": 1,
+"fs": [
+1,
+2,
+3,
+4,
+5,
+6,
+7,
+8
+]
+},
+{
+"tb": 248,
+"tbk": 1,
+"tl": 398749,
+"mb": 248,
+"mbk": 1,
+"gb": 248,
+"gbk": 1,
+"eb": 248,
+"ebk": 1,
+"fs": [
+1,
+2,
+3,
+4,
+5,
+6,
+7,
+8
+]
+},
+{
+"tb": 210,
+"tbk": 14,
+"tl": 129,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 13,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 3,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 9,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1008,
+"tbk": 6,
+"tl": 68,
+"mb": 512,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 5882,
+"mb": 48,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1248,
+"tbk": 1,
+"tl": 36719,
+"mb": 1248,
+"mbk": 1,
+"gb": 1248,
+"gbk": 1,
+"eb": 1248,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 496,
+"tbk": 5,
+"tl": 67,
+"mb": 256,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 1356,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 10,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 51,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2016,
+"tbk": 9,
+"tl": 333634,
+"mb": 2016,
+"mbk": 9,
+"gb": 2016,
+"gbk": 9,
+"eb": 2016,
+"ebk": 9,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 2,
+"tl": 386,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 9,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 17501,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 4,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 5,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 1,
+"tl": 402585,
+"mb": 40,
+"mbk": 1,
+"gb": 40,
+"gbk": 1,
+"eb": 40,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 7,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 7,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 6,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 6,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 214345,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 44,
+"tbk": 1,
+"tl": 234509,
+"mb": 44,
+"mbk": 1,
+"gb": 44,
+"gbk": 1,
+"eb": 44,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 35931,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 2,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 68,
+"tbk": 1,
+"tl": 16952,
+"mb": 68,
+"mbk": 1,
+"gb": 68,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 6,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2032,
+"tbk": 7,
+"tl": 3857,
+"mb": 1024,
+"mbk": 1,
+"gb": 1024,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 6392,
+"mb": 32,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 9,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 1,
+"tl": 7,
+"mb": 36,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 8,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 2,
+"tl": 36012,
+"mb": 14,
+"mbk": 2,
+"gb": 14,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 427,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 388753,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 10,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 62,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 53,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 14,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 112,
+"tbk": 7,
+"tl": 57138,
+"mb": 112,
+"mbk": 7,
+"gb": 112,
+"gbk": 7,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 10,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 10,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 3,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 1,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 5,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 12,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 37539,
+"mb": 12,
+"mbk": 1,
+"gb": 12,
+"gbk": 1,
+"eb": 12,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 2,
+"tl": 15,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 29863,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 3,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 14,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 168,
+"tbk": 3,
+"tl": 117,
+"mb": 96,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 412,
+"tbk": 3,
+"tl": 276,
+"mb": 344,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 27,
+"tbk": 1,
+"tl": 8,
+"mb": 27,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1504,
+"tbk": 1,
+"tl": 30033,
+"mb": 1504,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 6,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 9,
+"tbk": 1,
+"tl": 4,
+"mb": 9,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 5,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 42640,
+"tbk": 1,
+"tl": 213048,
+"mb": 42640,
+"mbk": 1,
+"gb": 42640,
+"gbk": 1,
+"eb": 42640,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 1,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 4,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 23,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 26,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1310,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 5,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 4,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 11,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 40,
+"tbk": 1,
+"tl": 47,
+"mb": 40,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 2,
+"tl": 1490,
+"mb": 32,
+"mbk": 2,
+"gb": 32,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 3,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 6,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 7,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 1,
+"tl": 18613,
+"mb": 224,
+"mbk": 1,
+"gb": 224,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 402557,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 7,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 30856,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 1536,
+"tbk": 3,
+"tl": 21512,
+"mb": 896,
+"mbk": 1,
+"gb": 896,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 3,
+"tl": 697,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 0,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 60,
+"tbk": 4,
+"tl": 65,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 20793,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 496,
+"tbk": 5,
+"tl": 711,
+"mb": 256,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 7,
+"tbk": 1,
+"tl": 0,
+"mb": 7,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 8,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 5,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 3,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 6,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 6,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 12,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 10,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 344,
+"tbk": 2,
+"tl": 944,
+"mb": 344,
+"mbk": 2,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 46,
+"tbk": 1,
+"tl": 7,
+"mb": 46,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 104,
+"tbk": 2,
+"tl": 768,
+"mb": 52,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 416,
+"tbk": 1,
+"tl": 20298,
+"mb": 416,
+"mbk": 1,
+"gb": 416,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 246,
+"mb": 32,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 1,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 8,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 5,
+"tbk": 1,
+"tl": 38631,
+"mb": 5,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 3,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 97560,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 11,
+"tbk": 1,
+"tl": 1,
+"mb": 11,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 88,
+"tbk": 1,
+"tl": 5878,
+"mb": 88,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 1,
+"tl": 99021,
+"mb": 224,
+"mbk": 1,
+"gb": 224,
+"gbk": 1,
+"eb": 224,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 10,
+"tbk": 1,
+"tl": 1,
+"mb": 10,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 60,
+"tbk": 2,
+"tl": 31015,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 48,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 9,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 18,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 4,
+"tbk": 1,
+"tl": 0,
+"mb": 4,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 4,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 9,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 31,
+"tbk": 1,
+"tl": 6,
+"mb": 31,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 5,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 3,
+"tl": 6164,
+"mb": 128,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 6,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 8,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 96,
+"tbk": 2,
+"tl": 1721,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 520,
+"tbk": 1,
+"tl": 100676,
+"mb": 520,
+"mbk": 1,
+"gb": 520,
+"gbk": 1,
+"eb": 520,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 128,
+"tbk": 1,
+"tl": 2264,
+"mb": 128,
+"mbk": 1,
+"gb": 128,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 30560,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 12,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 160,
+"tbk": 1,
+"tl": 90,
+"mb": 160,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 1,
+"tl": 7,
+"mb": 36,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 14162,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 864,
+"tbk": 1,
+"tl": 30258,
+"mb": 864,
+"mbk": 1,
+"gb": 864,
+"gbk": 1,
+"eb": 864,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 111,
+"mb": 8,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 1763,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 8,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 25,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 28595,
+"mb": 16,
+"mbk": 1,
+"gb": 16,
+"gbk": 1,
+"eb": 16,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 17,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 8,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 29,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 2,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 4,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 52,
+"tbk": 1,
+"tl": 9548,
+"mb": 52,
+"mbk": 1,
+"gb": 52,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 6,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 10,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 3,
+"tl": 71825,
+"mb": 36,
+"mbk": 3,
+"gb": 36,
+"gbk": 3,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 5,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 724,
+"tbk": 1,
+"tl": 35618,
+"mb": 724,
+"mbk": 1,
+"gb": 724,
+"gbk": 1,
+"eb": 724,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 31,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 13,
+"tbk": 1,
+"tl": 4,
+"mb": 13,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 8,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 5,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 52,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 9,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 21,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 23,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 5,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 28455,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 2,
+"tl": 42335,
+"mb": 14,
+"mbk": 2,
+"gb": 14,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 3,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 9,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 8,
+"tbk": 1,
+"tl": 30011,
+"mb": 8,
+"mbk": 1,
+"gb": 8,
+"gbk": 1,
+"eb": 8,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 48,
+"tbk": 1,
+"tl": 3929,
+"mb": 48,
+"mbk": 1,
+"gb": 48,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 7,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 29,
+"tbk": 1,
+"tl": 4,
+"mb": 29,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 29814,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 7,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16000,
+"tbk": 1,
+"tl": 31309,
+"mb": 16000,
+"mbk": 1,
+"gb": 16000,
+"gbk": 1,
+"eb": 16000,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 15,
+"tbk": 1,
+"tl": 9,
+"mb": 15,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 352,
+"tbk": 1,
+"tl": 1787,
+"mb": 352,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1864,
+"tbk": 1,
+"tl": 78022,
+"mb": 1864,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 5,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 1,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 11,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 4,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 36,
+"tbk": 1,
+"tl": 59,
+"mb": 36,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 19,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 5,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 2184,
+"tbk": 2,
+"tl": 39166,
+"mb": 2184,
+"mbk": 2,
+"gb": 2184,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 7,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 18,
+"tbk": 1,
+"tl": 5,
+"mb": 18,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 6,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 8,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1888,
+"tbk": 1,
+"tl": 134477,
+"mb": 1888,
+"mbk": 1,
+"gb": 1888,
+"gbk": 1,
+"eb": 1888,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 4,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 4,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 25,
+"tbk": 1,
+"tl": 7,
+"mb": 25,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 9,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 0,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 11,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 6,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 21,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1736,
+"tbk": 1,
+"tl": 101339,
+"mb": 1736,
+"mbk": 1,
+"gb": 1736,
+"gbk": 1,
+"eb": 1736,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 4,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1280,
+"tbk": 1,
+"tl": 34272,
+"mb": 1280,
+"mbk": 1,
+"gb": 1280,
+"gbk": 1,
+"eb": 1280,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 4,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 100,
+"tbk": 1,
+"tl": 270,
+"mb": 100,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 26,
+"tbk": 1,
+"tl": 8,
+"mb": 26,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 33,
+"tbk": 1,
+"tl": 6,
+"mb": 33,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 28,
+"tbk": 1,
+"tl": 6,
+"mb": 28,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 2,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 10,
+"mb": 24,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 60,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 3,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 12,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 23,
+"tbk": 1,
+"tl": 8,
+"mb": 23,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 5,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 24,
+"tbk": 1,
+"tl": 402101,
+"mb": 24,
+"mbk": 1,
+"gb": 24,
+"gbk": 1,
+"eb": 24,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 19,
+"tbk": 1,
+"tl": 5,
+"mb": 19,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 224,
+"tbk": 1,
+"tl": 29956,
+"mb": 224,
+"mbk": 1,
+"gb": 224,
+"gbk": 1,
+"eb": 224,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 180,
+"tbk": 1,
+"tl": 1628,
+"mb": 180,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 6,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 30,
+"tbk": 1,
+"tl": 12,
+"mb": 30,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 16,
+"tbk": 1,
+"tl": 4,
+"mb": 16,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 6,
+"tbk": 2,
+"tl": 39270,
+"mb": 6,
+"mbk": 2,
+"gb": 6,
+"gbk": 2,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 17,
+"tbk": 1,
+"tl": 5,
+"mb": 17,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 22,
+"tbk": 1,
+"tl": 4,
+"mb": 22,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 20,
+"tbk": 1,
+"tl": 1291,
+"mb": 20,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 64,
+"tbk": 1,
+"tl": 436,
+"mb": 64,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 14,
+"tbk": 1,
+"tl": 7,
+"mb": 14,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 34124,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 32,
+"tbk": 1,
+"tl": 30499,
+"mb": 32,
+"mbk": 1,
+"gb": 32,
+"gbk": 1,
+"eb": 32,
+"ebk": 1,
+"fs": []
+},
+{
+"tb": 160,
+"tbk": 1,
+"tl": 98,
+"mb": 160,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 1120,
+"tbk": 3,
+"tl": 21624,
+"mb": 640,
+"mbk": 1,
+"gb": 640,
+"gbk": 1,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 21,
+"tbk": 1,
+"tl": 3759,
+"mb": 21,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+},
+{
+"tb": 12,
+"tbk": 1,
+"tl": 1,
+"mb": 12,
+"mbk": 1,
+"gb": 0,
+"gbk": 0,
+"eb": 0,
+"ebk": 0,
+"fs": []
+}
+],
+"ftbl": [
+"[root]",
+"0x7ffe9a1ae858: CallWindowProcW (???:0:0)",
+"0x7ffe9a1ae3dc: DispatchMessageW (???:0:0)",
+"0x7ffe9a1c2cc7: InitDManipHook (???:0:0)",
+"0x7ffe9bd10e64: KiUserCallbackDispatcher (???:0:0)",
+"0x7ffe99581ec4: NtUserCreateWindowEx (???:0:0)",
+"0x7ffe9a1a7d8b: CreateWindowExW (???:0:0)",
+"0x7ffe9a1a7958: CreateWindowExW (???:0:0)",
+"0x7ffe9a1a77a2: CreateWindowExW (???:0:0)",
+"0x7ffe9a1ade1b: SendMessageW (???:0:0)",
+"0x7ffe9a1acbc3: GetWindowTextW (???:0:0)"
+]
+} \ No newline at end of file
diff --git a/render/examples/black.rs b/render/examples/black.rs
index 655cbde..c1cc538 100644
--- a/render/examples/black.rs
+++ b/render/examples/black.rs
@@ -1,31 +1,28 @@
-#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+//#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
-use std::sync::Arc;
+//#[global_allocator]
+//static ALLOC: dhat::Alloc = dhat::Alloc;
use alligator_render::{RenderWindowConfig, Renderer};
-use alligator_resources::texture::{TextureManager, TextureManagerConfig};
fn update(_renderer: &mut Renderer) {}
fn main() {
+ //let _profiler = dhat::Profiler::new_heap();
let start = std::time::Instant::now();
// configure the render window
let render_config = RenderWindowConfig {
- //vsync: false,
+ vsync: false,
//mode: alligator_render::config::WindowMode::BorderlessFullscreen,
title: "Black Screen.exe",
..Default::default()
};
- let texture_config = TextureManagerConfig {
- initial_capacity: 0,
- max_size: 0,
- };
-
- let texture_manager = Arc::new(TextureManager::new(&texture_config));
- let renderer = Renderer::new(&render_config, texture_manager).unwrap();
+ let renderer = Renderer::new(&render_config).unwrap();
println!("Startup time: {:?}", start.elapsed());
+ //drop(_profiler);
+
renderer.run(update);
}
diff --git a/render/examples/bmp.rs b/render/examples/bmp.rs
index 9d864d0..373a68c 100644
--- a/render/examples/bmp.rs
+++ b/render/examples/bmp.rs
@@ -3,7 +3,6 @@
use std::{num::NonZeroU32, sync::Arc};
use alligator_render::{Instance, RenderWindowConfig, Renderer};
-use alligator_resources::texture::{ImageFormat, TextureManager, TextureManagerConfig};
#[profiling::function]
fn update(renderer: &mut Renderer) {
@@ -29,7 +28,7 @@ fn main() {
};
let texture_manager = Arc::new(TextureManager::new(&texture_config));
- let mut renderer = Renderer::new(&render_config, texture_manager.clone()).unwrap();
+ let mut renderer = Renderer::new(&render_config).unwrap();
// render the alligator
let gator = include_bytes!("res/gator.ff");
diff --git a/render/examples/res/bunny.png b/render/examples/res/bunny.png
new file mode 100644
index 0000000..87ba72d
--- /dev/null
+++ b/render/examples/res/bunny.png
Binary files differ
diff --git a/render/shaders/sprite.wgsl b/render/shaders/sprite.wgsl
index 276a8ef..1e7f1a2 100644
--- a/render/shaders/sprite.wgsl
+++ b/render/shaders/sprite.wgsl
@@ -11,42 +11,30 @@ struct InstanceInput {
@location(2) size: vec2<f32>,
@location(3) texture_coordinates: vec2<f32>,
@location(4) texture_size: vec2<f32>,
- @location(5) texture_atlas_index: u32,
- @location(6) rotation: f32,
- @location(7) z_index: f32,
}
struct VertexOutput {
@builtin(position) clip_position: vec4<f32>,
@location(0) texture_coordinates: vec2<f32>,
- @location(1) texture_atlas_index: u32
}
@vertex
fn vs_main(model: VertexInput, instance: InstanceInput) -> VertexOutput {
var out: VertexOutput;
- // rotate the sprite
- let rotation = -instance.rotation;
- let a = vec2<f32>(cos(rotation), sin(rotation));
- let b = vec2<f32>(-a[1], a[0]);
- let rotation_mat = mat2x2<f32>(a, b);
- let rotated = rotation_mat * model.position;
-
// scale the sprite
- let scaled = rotated * instance.size;
+ let scaled = model.position * instance.size;
// move the sprite
let position2d = scaled + instance.position;
// camera stuff
- let position4d = vec4<f32>(position2d, instance.z_index, 1.0);
+ let position4d = vec4<f32>(position2d, 0.0, 1.0);
let position = camera * position4d;
let tex_coords = vec2<f32>(model.position[0] + 0.5, 1.0 - (model.position[1] + 0.5));
out.clip_position = position;
- out.texture_atlas_index = instance.texture_atlas_index;
out.texture_coordinates = tex_coords * instance.texture_size + instance.texture_coordinates;
return out;
}
diff --git a/render/src/instance.rs b/render/src/instance.rs
index e346cae..15317c7 100644
--- a/render/src/instance.rs
+++ b/render/src/instance.rs
@@ -18,12 +18,6 @@ pub struct Instance {
pub texture_coordinates: [f32; 2],
/// The size of the sprite's texture
pub texture_size: [f32; 2],
- /// The index of the texture atlas to use
- pub texture_atlas_index: u32,
- /// Rotation, in radians
- pub rotation: f32,
- /// z-index
- pub z_index: f32,
}
impl Default for Instance {
@@ -31,11 +25,8 @@ impl Default for Instance {
Self {
position: [0.0; 2],
size: [1.0; 2],
- rotation: 0.0,
- z_index: 0.0,
texture_coordinates: [0.0; 2],
texture_size: [1.0; 2],
- texture_atlas_index: 0,
}
}
}
@@ -150,18 +141,10 @@ impl InstanceBuffer {
self.expand_buffer(device);
}
- // the instances must be sorted by z-index before being handed to the GPU
- let sorted = {
- profiling::scope!("depth sorting");
- let mut sorted = self.instances.clone();
- sorted.sort_by(|a, b| a.z_index.total_cmp(&b.z_index));
- sorted
- };
-
queue.write_buffer(
&self.instance_buffer,
0 as wgpu::BufferAddress,
- bytemuck::cast_slice(&sorted),
+ bytemuck::cast_slice(&self.instances),
);
}
}
diff --git a/render/src/lib.rs b/render/src/lib.rs
index 0d76cc8..6f96fc2 100644
--- a/render/src/lib.rs
+++ b/render/src/lib.rs
@@ -1,4 +1,3 @@
-#![feature(nonzero_min_max)]
#![feature(type_alias_impl_trait)]
#![warn(clippy::pedantic)]
#![warn(clippy::nursery)]
diff --git a/render/src/renderer.rs b/render/src/renderer.rs
index f5b486d..4b4f60d 100644
--- a/render/src/renderer.rs
+++ b/render/src/renderer.rs
@@ -4,7 +4,6 @@ use std::{convert::TryInto, sync::Arc};
use crate::{
vertex::SQUARE, Camera, Instance, InstanceBuffer, RenderWindowConfig, TextureAtlas, Vertex,
};
-use alligator_resources::texture::TextureManager;
use pollster::FutureExt;
use thiserror::Error;
use wgpu::{include_wgsl, util::DeviceExt};
@@ -90,7 +89,7 @@ fn get_adapter(
let adapter = adapter.or_else(|| {
instance
- .enumerate_adapters(wgpu::Backends::PRIMARY)
+ .enumerate_adapters(wgpu::Backends::VULKAN)
.find(|adapter| !surface.get_capabilities(adapter).formats.is_empty())
});
@@ -148,20 +147,14 @@ impl Renderer {
/// panic on some platforms.
// TODO make it possible to use without a window (ie, use a bitmap in memory as a surface)
// TODO this function needs to be smaller
- pub fn new(
- config: &RenderWindowConfig,
- textures: Arc<TextureManager>,
- ) -> Result<Self, NewRendererError> {
+ pub fn new(config: &RenderWindowConfig) -> Result<Self, NewRendererError> {
// build the window
let event_loop = EventLoop::new();
let window = config.to_window().build(&event_loop)?;
let event_loop = Some(event_loop);
// the instance's main purpose is to create an adapter and a surface
- let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
- backends: wgpu::Backends::VULKAN,
- dx12_shader_compiler: wgpu::Dx12Compiler::Fxc, // TODO support DXC
- });
+ let instance = wgpu::Instance::new(wgpu::InstanceDescriptor::default());
// the surface is the part of the screen we'll draw to
let surface =
@@ -220,7 +213,6 @@ impl Renderer {
// TODO make this configurable
let (textures, texture_layout) = TextureAtlas::new(
&device,
- textures,
window.inner_size().width,
window.inner_size().height,
);
@@ -311,7 +303,7 @@ impl Renderer {
}
/// Get a reference to the texture atlas
- pub const fn textures(&self) -> &TextureAtlas {
+ pub const fn texture_atlas(&self) -> &TextureAtlas {
&self.textures
}
@@ -358,10 +350,12 @@ impl Renderer {
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(wgpu::Color::BLACK),
- store: true,
+ store: wgpu::StoreOp::Discard,
},
})],
depth_stencil_attachment: None,
+ timestamp_writes: None,
+ occlusion_query_set: None,
});
render_pass.set_pipeline(&self.render_pipeline);
@@ -421,7 +415,7 @@ impl Renderer {
// https://github.com/gfx-rs/wgpu/issues/1783#issuecomment-1328463201
if self.window.inner_size().width != 0 && self.window.inner_size().height != 0 {
match self.render() {
- Ok(_) => {}
+ Ok(()) => {}
// reconfigure the surface if it's been lost
Err(wgpu::SurfaceError::Lost) => {
self.reconfigure();
diff --git a/render/src/texture.rs b/render/src/texture.rs
index 76e77a8..90d23d1 100644
--- a/render/src/texture.rs
+++ b/render/src/texture.rs
@@ -1,30 +1,10 @@
use std::error::Error;
-use std::num::NonZeroU32;
-use std::sync::Arc;
-use alligator_resources::texture::{LoadError, Rgba16Texture, TextureId, TextureManager};
-use image::{EncodableLayout, GenericImage, RgbaImage};
-use texture_packer::TexturePacker;
-use texture_packer::{
- exporter::{ExportResult, ImageExporter},
- TexturePackerConfig,
-};
+use image::{EncodableLayout, RgbaImage};
use thiserror::Error;
-/// The texture did not fit in the texture atlas
-#[derive(Debug, Error)]
-#[error("{:?}", .0)]
-pub struct PackError(PackErrorInternal);
-
-// TODO this can be removed when a new texture packer is made
-type PackErrorInternal = impl std::fmt::Debug;
-
#[derive(Error, Debug)]
pub enum TextureError {
- #[error("{:?}", .0)]
- TextureTooLarge(#[from] PackError),
- #[error("{}", .0)]
- BadImage(#[from] LoadError),
#[error("Unexpected Error (this is a bug in alligator_render): {}", .0)]
Unexpected(#[source] Box<dyn Error>),
}
@@ -39,46 +19,18 @@ const fn extent_3d(width: u32, height: u32) -> wgpu::Extent3d {
}
/// A texture atlas, usable by the renderer
-// TODO make this Debug
// TODO make these resizable
+#[derive(Debug)]
pub struct TextureAtlas {
- textures: Arc<TextureManager>,
- packer: TexturePacker<'static, Rgba16Texture, TextureId>,
diffuse_texture: wgpu::Texture,
diffuse_bind_group: wgpu::BindGroup,
image: RgbaImage,
- width: u32,
- height: u32,
- changed: bool,
-}
-
-macro_rules! texture_info {
- ($name: ident, $prop: ident, $divisor: ident) => {
- pub fn $name(&mut self, id: TextureId) -> Result<f32, TextureError> {
- let frame = match self.texture_frame(id) {
- Some(frame) => frame,
- None => {
- self.load_texture(id)?;
- self.texture_frame(id).unwrap()
- }
- };
- let property = frame.frame.$prop;
- let value = property as f32 / self.$divisor as f32;
- Ok(value)
- }
- };
}
impl TextureAtlas {
/// Creates a new texture atlas, with the given size
- // TODO why is this u32?
// TODO this is still too large
- pub fn new(
- device: &wgpu::Device,
- textures: Arc<TextureManager>,
- width: u32,
- height: u32,
- ) -> (Self, wgpu::BindGroupLayout) {
+ pub fn new(device: &wgpu::Device, width: u32, height: u32) -> (Self, wgpu::BindGroupLayout) {
let atlas_size = extent_3d(width, height);
let diffuse_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Diffuse Texture"),
@@ -137,26 +89,14 @@ impl TextureAtlas {
(
Self {
- textures,
- packer: TexturePacker::new_skyline(TexturePackerConfig {
- max_width: width,
- max_height: height,
- allow_rotation: false,
- trim: false,
- texture_padding: 0,
- ..Default::default()
- }),
diffuse_texture,
diffuse_bind_group,
- width,
- height,
image: RgbaImage::from_raw(
width,
height,
vec![0; 4 * width as usize * height as usize],
)
.unwrap(),
- changed: true,
},
texture_bind_group_layout,
)
@@ -167,68 +107,7 @@ impl TextureAtlas {
&self.diffuse_bind_group
}
- /// Load a new subtexture from memory
- pub fn load_texture(&mut self, id: TextureId) -> Result<TextureId, TextureError> {
- self.changed = true;
- let img = self.textures.load_texture(id)?;
- self.packer.pack_own(id, img).map_err(PackError)?;
- Ok(id)
- }
-
- /// Get the frame for s particular subtexture
- fn texture_frame(&self, id: TextureId) -> Option<&texture_packer::Frame<TextureId>> {
- self.packer.get_frame(&id)
- }
-
- texture_info!(texture_width, w, width);
- texture_info!(texture_height, h, height);
- texture_info!(texture_x, x, width);
- texture_info!(texture_y, y, height);
-
- /// Fill the cached image
- fn fill_image(&mut self) -> ExportResult<()> {
- let atlas = {
- profiling::scope!("export atlas");
- ImageExporter::export(&self.packer)?
- };
- profiling::scope!("copy image");
- self.image
- .copy_from(&atlas, 0, 0)
- .expect("image cache is too small");
- Ok(())
- }
-
- /// Clear the texture atlas, and give it a new size
- pub fn clear(&mut self, width: u32, height: u32) {
- self.changed = true;
- self.width = width;
- self.height = height;
- self.packer = TexturePacker::new_skyline(TexturePackerConfig {
- max_width: self.width,
- max_height: self.height,
- ..Default::default()
- });
- }
-
- /// Fill the GPU texture atlas
- #[profiling::function]
- pub(crate) fn fill_textures(&mut self, queue: &wgpu::Queue) {
- // saves time if nothing changed since the last time we did this
- // FIXME This doesn't do much good once we get procedurally generated animation
- // We'll have to create our own texture packer, with mutable subtextures,
- // and more efficient algorithms. This'll also make frame times more consistent
- if !self.changed {
- return;
- }
-
- let atlas_size = extent_3d(self.width, self.height);
-
- // put the packed texture into the base image
- if let Err(e) = self.fill_image() {
- log::error!("{}", e);
- }
-
- // copy that to the gpu
+ pub(crate) fn fill_textures(&self, queue: &wgpu::Queue) {
queue.write_texture(
wgpu::ImageCopyTexture {
texture: &self.diffuse_texture,
@@ -239,12 +118,10 @@ impl TextureAtlas {
self.image.as_bytes(),
wgpu::ImageDataLayout {
offset: 0,
- bytes_per_row: NonZeroU32::new(atlas_size.width * 4),
- rows_per_image: NonZeroU32::new(atlas_size.height),
+ bytes_per_row: Some(self.image.width() * 4),
+ rows_per_image: Some(self.image.height()),
},
- atlas_size,
+ extent_3d(self.image.width(), self.image.height()),
);
-
- self.changed = false;
}
}
diff --git a/resources/Cargo.toml b/resources/Cargo.toml
deleted file mode 100644
index fea7f39..0000000
--- a/resources/Cargo.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[package]
-name = "alligator_resources"
-version = "0.1.0"
-edition = "2021"
-publish = false
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-image = "0.24"
-thiserror = "1"
-exun = "0.1"
-texture_packer = { git = "https://github.com/botahamec/piston_texture_packer", branch = "u16" }
-profiling = "1"
-bytemuck = { version = "1", features = ["extern_crate_alloc"] }
-parking_lot = "0.12"
-log = "0.4"
-dashmap = "5"
diff --git a/resources/src/lib.rs b/resources/src/lib.rs
deleted file mode 100644
index 9cbbba0..0000000
--- a/resources/src/lib.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-#![feature(new_uninit, let_chains)]
-#![warn(clippy::nursery, clippy::pedantic)]
-#![allow(clippy::module_name_repetitions)]
-
-pub mod texture;
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
-pub enum Priority {
- Unnecessary,
- Possible(u8),
- Eventual(u8),
- Urgent,
-}
diff --git a/resources/src/texture.rs b/resources/src/texture.rs
deleted file mode 100644
index 3a5bf3e..0000000
--- a/resources/src/texture.rs
+++ /dev/null
@@ -1,394 +0,0 @@
-use std::cmp::Reverse;
-use std::mem;
-use std::path::Path;
-use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
-use std::sync::Arc;
-
-use dashmap::DashMap;
-use image::ImageBuffer;
-use parking_lot::Mutex;
-use thiserror::Error;
-
-use crate::Priority;
-
-/// The next texture ID
-static NEXT_TEXTURE_ID: AtomicUsize = AtomicUsize::new(0);
-
-/// A unique identifier for a texture
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
-pub struct TextureId(usize);
-
-impl TextureId {
- fn new() -> Self {
- Self(NEXT_TEXTURE_ID.fetch_add(1, Ordering::Relaxed))
- }
-}
-
-/// These are the formats supported by the renderer.
-// TODO make these feature-enabled
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
-#[non_exhaustive]
-pub enum ImageFormat {
- Bmp,
- Ico,
- Farbfeld,
-}
-
-impl From<ImageFormat> for image::ImageFormat {
- fn from(format: ImageFormat) -> Self {
- match format {
- ImageFormat::Bmp => Self::Bmp,
- ImageFormat::Ico => Self::Ico,
- ImageFormat::Farbfeld => Self::Farbfeld,
- }
- }
-}
-
-#[derive(Debug, Error)]
-#[error("{}", .0)]
-pub struct DecodingError(#[from] image::error::DecodingError);
-
-#[allow(clippy::missing_const_for_fn)]
-fn convert_image_decoding(e: image::ImageError) -> DecodingError {
- if let image::ImageError::Decoding(de) = e {
- de.into()
- } else {
- unreachable!("No other error should be possible")
- }
-}
-
-#[derive(Debug, Error)]
-pub enum LoadError {
- #[error("{}", .0)]
- Decoding(#[from] DecodingError),
- #[error("{}", .0)]
- Io(#[from] std::io::Error),
-}
-
-fn convert_image_load_error(e: image::ImageError) -> LoadError {
- match e {
- image::ImageError::Decoding(de) => LoadError::Decoding(de.into()),
- image::ImageError::IoError(ioe) => ioe.into(),
- _ => unreachable!("No other error should be possible"),
- }
-}
-
-pub type Rgba16Texture = image::ImageBuffer<image::Rgba<u16>, Box<[u16]>>;
-
-fn vec_image_to_box(vec_image: image::ImageBuffer<image::Rgba<u16>, Vec<u16>>) -> Rgba16Texture {
- let width = vec_image.width();
- let height = vec_image.height();
- let buf = vec_image.into_raw().into_boxed_slice();
- ImageBuffer::from_raw(width, height, buf).expect("image buffer is too small")
-}
-
-/// Get the size, in bytes, of the texture
-#[allow(clippy::missing_const_for_fn)]
-fn texture_size(image: &Rgba16Texture) -> usize {
- image.len() * mem::size_of::<image::Rgba<u16>>()
-}
-
-/// A texture from disk
-struct TextureFile {
- path: Box<Path>,
- texture: Option<Arc<Rgba16Texture>>,
-}
-
-impl TextureFile {
- /// This doesn't load the texture
- #[allow(clippy::missing_const_for_fn)]
- fn new(path: impl AsRef<Path>) -> Self {
- Self {
- path: path.as_ref().into(),
- texture: None,
- }
- }
-
- const fn is_loaded(&self) -> bool {
- self.texture.is_some()
- }
-
- fn load(&mut self) -> Result<&Rgba16Texture, LoadError> {
- if self.texture.is_none() {
- log::warn!("{} was not pre-loaded", self.path.to_string_lossy());
- let texture = image::open(&self.path).map_err(convert_image_load_error)?;
- let texture = texture.to_rgba16();
- let texture = Arc::new(vec_image_to_box(texture));
- self.texture = Some(texture);
- }
-
- Ok(self.texture.as_ref().expect("the texture wasn't loaded"))
- }
-
- fn loaded_texture(&self) -> Option<&Rgba16Texture> {
- self.texture.as_deref()
- }
-
- fn is_used(&self) -> bool {
- let Some(arc) = &self.texture else { return false };
- Arc::strong_count(arc) > 1
- }
-
- /// Unloads the texture from memory if it isn't being used
- fn unload(&mut self) {
- if !self.is_used() {
- self.texture = None;
- }
- }
-
- /// The amount of heap memory used, in bytes. This returns 0 if the texture
- /// hasn't been loaded yet.
- fn allocated_size(&self) -> usize {
- self.texture.as_ref().map_or(0, |t| texture_size(t))
- }
-}
-
-enum TextureBuffer {
- Memory(Arc<Rgba16Texture>),
- Disk(TextureFile),
-}
-
-struct Texture {
- priority: Priority,
- queued_priority: Arc<Mutex<Option<Priority>>>,
- buffer: TextureBuffer,
-}
-
-impl Texture {
- fn from_buffer(texture: Rgba16Texture) -> Self {
- Self {
- priority: Priority::Urgent, // indicates that it can't be unloaded
- queued_priority: Arc::new(Mutex::new(None)),
- buffer: TextureBuffer::Memory(Arc::new(texture)),
- }
- }
-
- fn from_path(path: impl AsRef<Path>, priority: Priority) -> Self {
- Self {
- priority,
- queued_priority: Arc::new(Mutex::new(None)),
- buffer: TextureBuffer::Disk(TextureFile::new(path)),
- }
- }
-
- const fn priority(&self) -> Priority {
- self.priority
- }
-
- fn _set_priority(buffer: &TextureBuffer, src: &mut Priority, priority: Priority) -> bool {
- // memory textures and textures in use should always be urgent
- if let TextureBuffer::Disk(disk) = buffer && !disk.is_used() {
- *src = priority;
- true
- } else {
- false
- }
- }
-
- fn unqueue_priority(&mut self) {
- let mut queued_priority = self.queued_priority.lock();
- let unqueued_priority = queued_priority.unwrap_or(Priority::Unnecessary);
-
- if Self::_set_priority(&self.buffer, &mut self.priority, unqueued_priority) {
- *queued_priority = None;
- }
- }
-
- fn set_priority(&mut self, priority: Priority) {
- Self::_set_priority(&self.buffer, &mut self.priority, priority);
- }
-
- fn load_texture(&mut self) -> Result<&Rgba16Texture, LoadError> {
- match &mut self.buffer {
- TextureBuffer::Memory(ref texture) => Ok(texture),
- TextureBuffer::Disk(file) => file.load(),
- }
- }
-
- /// If the texture is loaded, return it.
- fn loaded_texture(&self) -> Option<&Rgba16Texture> {
- match &self.buffer {
- TextureBuffer::Memory(ref texture) => Some(texture),
- TextureBuffer::Disk(file) => file.loaded_texture(),
- }
- }
-
- fn unload(&mut self) {
- if let TextureBuffer::Disk(file) = &mut self.buffer {
- file.unload();
- }
- }
-
- /// The amount of heap memory used for the texture, if any
- fn allocated_size(&self) -> usize {
- match &self.buffer {
- TextureBuffer::Memory(texture) => texture_size(texture),
- TextureBuffer::Disk(file) => file.allocated_size(),
- }
- }
-
- const fn is_loaded(&self) -> bool {
- match &self.buffer {
- TextureBuffer::Memory(_) => true,
- TextureBuffer::Disk(file) => file.is_loaded(),
- }
- }
-}
-
-pub struct TextureManager {
- textures: DashMap<TextureId, Texture>,
- max_size: usize,
- needs_atlas_update: AtomicBool,
-}
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
-pub struct TextureManagerConfig {
- /// The initial capacity of the texture manager. This defaults to 500 textures.
- pub initial_capacity: usize,
- /// The maximum amount of heap usage acceptable. Defaults to 10 MiB.
- pub max_size: usize,
-}
-
-impl Default for TextureManagerConfig {
- fn default() -> Self {
- Self {
- initial_capacity: 500,
- max_size: 10 * 1024 * 1024, // 10 MiB
- }
- }
-}
-
-impl TextureManager {
- /// Create a new `TextureManager` with the given config options.
- #[must_use]
- pub fn new(config: &TextureManagerConfig) -> Self {
- let textures = DashMap::with_capacity(config.initial_capacity);
-
- Self {
- textures,
- max_size: config.max_size,
- needs_atlas_update: AtomicBool::new(false),
- }
- }
-
- /// Load textures into memory that will be needed soon. Unload unnecessary textures
- pub fn cache_files(&self) {
- let mut textures: Vec<_> = self
- .textures
- .iter_mut()
- .map(|mut t| {
- t.value_mut().unqueue_priority();
- t
- })
- .collect();
- textures.sort_by_key(|t2| Reverse(t2.priority()));
-
- let max_size = self.max_size;
- let mut total_size = 0;
-
- for texture in &mut textures {
- drop(texture.load_texture());
- total_size += texture.allocated_size();
- if total_size > max_size && texture.priority() != Priority::Urgent {
- texture.unload();
- return;
- }
- }
- }
-
- /// Loads a texture from memory in the given format.
- ///
- /// # Errors
- ///
- /// This returns `Expected(DecodingError)` if the given buffer was invalid
- /// for the given format.
- pub fn load_from_memory(
- &self,
- buf: &[u8],
- format: ImageFormat,
- ) -> Result<TextureId, DecodingError> {
- let id = TextureId::new();
- let texture = image::load_from_memory_with_format(buf, format.into());
- let texture = texture.map_err(convert_image_decoding)?;
- let texture = texture.into_rgba16();
- let texture = vec_image_to_box(texture);
- let texture = Texture::from_buffer(texture);
-
- self.textures.insert(id, texture);
- self.needs_atlas_update.store(true, Ordering::Release);
-
- Ok(id)
- }
-
- /// Loads a texture from disk.
- ///
- /// # Errors
- ///
- /// This returns an error if `priority` is set to [`Priority::Urgent`] but
- /// there was an error in loading the file to a texture.
- pub fn load_from_file(
- &self,
- path: impl AsRef<Path>,
- priority: Priority,
- ) -> Result<TextureId, LoadError> {
- let id = TextureId::new();
- let mut texture = Texture::from_path(path, priority);
-
- if priority == Priority::Urgent {
- match texture.load_texture() {
- Ok(_) => {
- self.textures.insert(id, texture);
- self.needs_atlas_update.store(true, Ordering::Release);
- }
- Err(e) => {
- self.textures.insert(id, texture);
- return Err(e);
- }
- }
- } else {
- self.textures.insert(id, texture);
- }
-
- Ok(id)
- }
-
- /// Loads a texture from disk.
- ///
- /// # Errors
- ///
- /// This returns an error if `priority` is set to [`Priority::Urgent`] but
- /// there was an error in loading the file to a texture.
- pub fn set_priority(&self, id: TextureId, priority: Priority) -> Result<(), LoadError> {
- let mut texture = self.textures.get_mut(&id).expect("invalid texture id");
- texture.set_priority(priority);
-
- if !texture.is_loaded() && priority == Priority::Urgent {
- let mut texture = self.textures.get_mut(&id).expect("invalid texture id");
- texture.load_texture()?;
- self.needs_atlas_update.store(true, Ordering::Release);
- }
-
- Ok(())
- }
-
- /// This returns `true` if a texture has been set to have an urgent
- /// priority since the last time this function was called.
- pub fn needs_atlas_update(&self) -> bool {
- self.needs_atlas_update.fetch_and(false, Ordering::AcqRel)
- }
-
- /// Load a texture into memory, if it hasn't been already. Then return a
- /// copy of the texture.
- ///
- /// # Errors
- ///
- /// This returns an error if an error occurs in loading the texture from
- /// disk, such as the file not existing, or not being a valid texture.
- pub fn load_texture(&self, id: TextureId) -> Result<Rgba16Texture, LoadError> {
- self.textures
- .get_mut(&id)
- .expect("the TextureId was invalid")
- .load_texture()
- .cloned()
- }
-}
diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml
index 45dbd47..88aa2c7 100644
--- a/scripts/Cargo.toml
+++ b/scripts/Cargo.toml
@@ -1,5 +1,5 @@
[package]
-name = "scripts"
+name = "alligator_scripts"
version = "0.1.0"
edition = "2021"
diff --git a/scripts/src/libs/system.rs b/scripts/src/libs/system.rs
index e2d0ddb..9c5a50c 100644
--- a/scripts/src/libs/system.rs
+++ b/scripts/src/libs/system.rs
@@ -1,5 +1,5 @@
+use std::borrow::Cow;
use std::mem::align_of;
-use std::{borrow::Cow, process::Command};
use chrono::Offset;
use wasmtime::{Caller, Memory};
diff --git a/shell-spec.txt b/shell-spec.txt
new file mode 100644
index 0000000..dda23c7
--- /dev/null
+++ b/shell-spec.txt
@@ -0,0 +1,13 @@
+# Alligator Shell Specification
+
+Default Port Number: 26009
+Using TCP Protocol
+
+## Runtime to Editor
+
+runtimelog [trace|debug|info|warn|error] FILE:LINE MSG
+scriptlog [trace|debug|info|warn|error] FILE:LINE MSG
+
+## Editor to Runtime
+
+stop
diff --git a/sprites/Cargo.toml b/sprites/Cargo.toml
new file mode 100644
index 0000000..df780e9
--- /dev/null
+++ b/sprites/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "alligator_sprites"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/sprites/src/lib.rs b/sprites/src/lib.rs
new file mode 100644
index 0000000..40a5fe6
--- /dev/null
+++ b/sprites/src/lib.rs
@@ -0,0 +1,150 @@
+use std::collections::HashMap;
+use std::sync::Arc;
+
+#[derive(Debug, Default, Clone)]
+pub struct SpriteManager {
+ sprites: HashMap<Arc<str>, Sprite>,
+ sprite_list: Vec<(u8, Arc<str>)>,
+}
+
+#[derive(Debug, Clone)]
+pub struct Sprite {
+ texture: Arc<str>,
+ x: f32,
+ y: f32,
+ z: u8,
+ width: f32,
+ height: f32,
+}
+
+impl SpriteManager {
+ pub fn new() -> Self {
+ Self {
+ sprites: HashMap::new(),
+ sprite_list: Vec::new(),
+ }
+ }
+
+ pub fn with_capacity(capacity: usize) -> Self {
+ Self {
+ sprites: HashMap::with_capacity(capacity),
+ sprite_list: Vec::with_capacity(capacity),
+ }
+ }
+
+ pub fn add_sprite(&mut self, name: Arc<str>, sprite: Sprite) {
+ let z = sprite.z;
+ self.sprites.insert(name.clone(), sprite);
+ self.sprite_list.push((z, name));
+ }
+
+ pub fn clear(&mut self) {
+ self.sprites.clear();
+ self.sprite_list.clear();
+ }
+
+ pub fn remove_sprite(&mut self, name: Arc<str>) {
+ self.sprites.remove(&name);
+ self.sprite_list.retain(|(_, n)| name != n.clone());
+ }
+
+ pub fn get_mut_sprite(&mut self, name: &str) -> Option<&mut Sprite> {
+ self.sprites.get_mut(name)
+ }
+
+ pub fn set_sprite_z(&mut self, name: Arc<str>, new_z: u8) -> Option<()> {
+ let sprite = self.sprites.get_mut(&name)?;
+ sprite.z = new_z;
+
+ for (depth, n) in &mut self.sprite_list {
+ if n.clone() == name {
+ *depth = new_z;
+ }
+ }
+ Some(())
+ }
+
+ fn sort(&mut self) {
+ // in case it's unclear, this is insertion sort
+ // the list is usually already sorted, so this is the most efficient algorithm
+ for i in 0..self.sprite_list.len() {
+ let t = self.sprite_list[i].clone();
+ let mut j = i;
+ while j > 0 && self.sprite_list[j - 1].0 > t.0 {
+ self.sprite_list[j] = self.sprite_list[j - 1].clone();
+ j -= 1;
+ }
+
+ self.sprite_list[j] = t;
+ }
+ }
+
+ pub fn sorted_sprites(&mut self) -> Vec<Sprite> {
+ self.sort();
+ let mut sprites = Vec::new();
+ for (_, sprite) in &self.sprite_list {
+ // i don't like accessing the hashmap every time, but i can't think
+ // of anything better
+ sprites.push(self.sprites[sprite].clone());
+ }
+
+ sprites
+ }
+}
+
+impl Sprite {
+ pub fn new(x: f32, y: f32, z: u8, width: f32, height: f32, texture: Arc<str>) -> Self {
+ Self {
+ texture,
+ x,
+ y,
+ z,
+ width,
+ height,
+ }
+ }
+
+ pub fn x(&self) -> f32 {
+ self.x
+ }
+
+ pub fn y(&self) -> f32 {
+ self.y
+ }
+
+ pub fn z(&self) -> u8 {
+ self.z
+ }
+
+ pub fn width(&self) -> f32 {
+ self.width
+ }
+
+ pub fn height(&self) -> f32 {
+ self.height
+ }
+
+ pub fn texture_name(&self) -> &Arc<str> {
+ &self.texture
+ }
+
+ pub fn set_x(&mut self, x: f32) {
+ self.x = x;
+ }
+
+ pub fn set_y(&mut self, y: f32) {
+ self.y = y;
+ }
+
+ pub fn set_width(&mut self, width: f32) {
+ self.width = width;
+ }
+
+ pub fn set_height(&mut self, height: f32) {
+ self.height = height;
+ }
+
+ pub fn set_texture(&mut self, texture_name: Arc<str>) {
+ self.texture = texture_name;
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
deleted file mode 100644
index cdfa927..0000000
--- a/src/lib.rs
+++ /dev/null
@@ -1 +0,0 @@
-pub use alligator_render as render;
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..717599d
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,160 @@
+use std::collections::HashMap;
+use std::fs::File;
+use std::io::Read;
+use std::num::NonZeroU32;
+use std::path::Path;
+
+use alligator_scripts::ScriptManager;
+use alligator_sprites::SpriteManager;
+use alligator_sys::{Renderer, RendererConfig, Window, WindowConfig, WindowEvent};
+use alligator_textures::TextureManager;
+
+use serde::Deserialize;
+use sha3::{Digest, Sha3_256};
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
+enum ScriptType {
+ Wasm,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
+enum ConfigWindowMode {
+ Windowed,
+ BorderlessFullscreen,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+struct ConfigScript {
+ path: Box<Path>,
+ script_type: ScriptType,
+ hash: Option<String>,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+struct ConfigSprite {
+ texture: String,
+ x: f32,
+ y: f32,
+ z: f32,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+struct ConfigTexture {
+ size: usize,
+ path: Box<Path>,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+struct Scene {
+ initial_sprites: HashMap<String, ConfigSprite>,
+ initial_scripts: Vec<String>,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+pub struct Config {
+ alligator_version: usize,
+ scenes: HashMap<String, Scene>,
+ textures: HashMap<String, ConfigTexture>,
+ scripts: HashMap<String, ConfigScript>,
+ default_scene: String,
+ sprite_manager_capacity: u32,
+ default_window_width: NonZeroU32,
+ default_window_height: NonZeroU32,
+ default_window_mode: ConfigWindowMode,
+ window_title: String,
+ vsync: bool,
+}
+
+fn texture_manager(config: &Config) -> TextureManager {
+ let mut textures = TextureManager::new(config.default_textures_size_target);
+ for (key, texture) in config.textures.iter() {
+ textures.add_texture(
+ key.clone().into(),
+ texture.path.clone().into(),
+ texture.size,
+ );
+ }
+
+ textures
+}
+
+fn sprite_manager(config: &Config) -> SpriteManager {
+ SpriteManager::with_capacity(config.sprite_manager_capacity as usize)
+}
+
+fn script_manager(config: &Config) -> ScriptManager {
+ let mut scripts = ScriptManager::new();
+ for (key, script) in config.scripts.iter() {
+ let path = script.path.clone();
+ let trusted = if let Some(hash) = &script.hash {
+ let mut bytes = Vec::new();
+ let mut msg = File::open(&path).unwrap();
+ msg.read_to_end(&mut bytes).unwrap();
+ let mut hasher = Sha3_256::new();
+ hasher.update(bytes);
+ let result = hasher.finalize();
+ hash.as_bytes() == &result[..]
+ } else {
+ false
+ };
+
+ scripts
+ .add_wasm_script(key.clone().into_boxed_str(), path, trusted)
+ .unwrap();
+ }
+
+ scripts
+}
+
+fn window(config: &Config) -> Window {
+ let config = WindowConfig {
+ title: config.window_title.clone(),
+ default_width: config.default_window_width.get(),
+ default_height: config.default_window_height.get(),
+ default_x: 100,
+ default_y: 100,
+ borderless_fullscreen: config.default_window_mode == ConfigWindowMode::BorderlessFullscreen,
+ visible: false,
+ };
+
+ Window::new(config)
+}
+
+fn renderer(config: &Config, window: &Window) -> Renderer {
+ let config = RendererConfig {
+ width: config.default_window_width.get(),
+ height: config.default_window_height.get(),
+ instance_capacity: config.sprite_manager_capacity,
+ fullscreen: false,
+ vsync: config.vsync,
+ };
+
+ Renderer::new(window, config)
+}
+
+fn main() {
+ std::env::set_current_dir(std::env::current_exe().unwrap().parent().unwrap()).unwrap();
+ let config = File::open("game.json").unwrap();
+ let config: Config = serde_json::from_reader(config).unwrap();
+
+ let textures = texture_manager(&config);
+ let sprites = sprite_manager(&config);
+ let scripts = script_manager(&config);
+ let mut window = window(&config);
+
+ window.wait_for_resume();
+
+ let mut renderer = renderer(&config, &window);
+ window.set_visible(true);
+
+ window.run(move |window, event| match event {
+ Some(WindowEvent::RedrawRequest) => {
+ renderer.render_frame();
+ }
+ Some(WindowEvent::CloseRequest) => {
+ std::process::exit(0);
+ }
+ Some(_) => (),
+ None => window.request_redraw(),
+ })
+}
diff --git a/sys/Cargo.toml b/sys/Cargo.toml
new file mode 100644
index 0000000..bb1a70d
--- /dev/null
+++ b/sys/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "alligator_sys"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/sys/build.rs b/sys/build.rs
new file mode 100644
index 0000000..c33a20f
--- /dev/null
+++ b/sys/build.rs
@@ -0,0 +1,8 @@
+fn main() {
+ let out_dir = std::env::var("OUT_DIR").unwrap();
+ eprintln!("{out_dir}");
+ println!("cargo:rustc-link-lib=d3d11");
+ println!("cargo:rustc-link-search=native=./");
+ println!("cargo:rustc-link-lib-static=alligator_backend");
+ println!("cargo:rerun-if-changed=alligator_backend.lib");
+}
diff --git a/sys/src/lib.rs b/sys/src/lib.rs
new file mode 100644
index 0000000..f3fae9c
--- /dev/null
+++ b/sys/src/lib.rs
@@ -0,0 +1,98 @@
+use std::ffi::{c_uchar, c_uint, c_void};
+use std::os::raw::c_char;
+
+mod renderer;
+mod window;
+
+pub use renderer::Renderer;
+pub use window::{Window, WindowConfig, WindowEvent};
+
+type CRenderer = *mut ();
+type CWindow = *mut ();
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+#[repr(C)]
+pub struct RendererConfig {
+ pub width: c_uint,
+ pub height: c_uint,
+ pub instance_capacity: c_uint,
+ pub fullscreen: bool,
+ pub vsync: bool,
+}
+
+#[repr(C)]
+pub struct Vertex {
+ x: f32,
+ y: f32,
+ z: f32,
+ curve_a: f32,
+ curve_b: f32,
+ color1_r: f32,
+ color1_g: f32,
+ color1_b: f32,
+ color1_a: f32,
+ normal_x: f32,
+ normal_y: f32,
+ normal_z: f32,
+}
+
+#[derive(Debug, Clone, Copy)]
+#[repr(C)]
+struct CWindowConfig {
+ default_width: c_uint,
+ default_height: c_uint,
+ default_x: c_uint,
+ default_y: c_uint,
+ title: *const c_char,
+ visible: bool,
+ borderless_fullscreen: bool,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+#[repr(C)]
+pub enum CWindowEvent {
+ AboutToWait,
+ Other,
+ CloseRequest,
+ ScaleFactorChange,
+ Resume,
+ RedrawRequest,
+}
+
+#[link(name = "alligator_backend", kind = "static")]
+extern "C" {
+ fn new_renderer(config: RendererConfig, window: CWindow) -> CRenderer;
+ fn resize_renderer(renderer: CRenderer, width: c_uint, height: c_uint);
+ fn set_vsync(renderer: CRenderer, vsync: bool);
+ fn create_vertex_buffer(renderer: CRenderer, count: c_uint, instances: *const Vertex);
+ fn set_camera(
+ renderer: CRenderer,
+ x: f32,
+ y: f32,
+ zoom: f32,
+ rotation: f32,
+ width: f32,
+ height: f32,
+ );
+ fn render_frame(renderer: CRenderer);
+ fn destroy_renderer(renderer: CRenderer);
+
+ fn create_window(config: CWindowConfig) -> CWindow;
+ fn set_visible(window: CWindow, visible: bool);
+ fn resize_window(window: CWindow, width: c_uint, height: c_uint);
+ fn set_fullscreen(window: CWindow, fullscreen: bool);
+ fn set_title(window: CWindow, title: *const c_char);
+ fn wait_for_event(window: CWindow);
+ fn pop_event(window: CWindow) -> bool;
+ fn wait_for_resume(window: CWindow);
+ fn set_event_handler(window: CWindow, closure: *mut c_void);
+ fn run_event_handler(window: CWindow, event: CWindowEvent);
+ fn request_redraw(window: CWindow);
+ fn destroy_window(window: CWindow);
+}
+
+#[no_mangle]
+unsafe extern "C" fn alligator_run_closure(closure: *mut c_void, event: CWindowEvent) {
+ let closure: &mut &mut dyn FnMut(CWindowEvent) = unsafe { &mut *closure.cast() };
+ closure(event)
+}
diff --git a/sys/src/renderer.rs b/sys/src/renderer.rs
new file mode 100644
index 0000000..05d111b
--- /dev/null
+++ b/sys/src/renderer.rs
@@ -0,0 +1,49 @@
+use crate::{RendererConfig, Vertex, Window};
+
+pub struct Renderer {
+ ptr: *mut (),
+}
+
+impl Drop for Renderer {
+ fn drop(&mut self) {
+ unsafe { crate::destroy_renderer(self.ptr) }
+ }
+}
+
+impl Renderer {
+ pub fn new(window: &Window, config: RendererConfig) -> Self {
+ let ptr = unsafe { crate::new_renderer(config, window.ptr) };
+ Self { ptr }
+ }
+
+ pub fn resize(&mut self, width: u32, height: u32) {
+ unsafe { crate::resize_renderer(self.ptr, width, height) }
+ }
+
+ pub fn set_vsync(&mut self, vsync: bool) {
+ unsafe { crate::set_vsync(self.ptr, vsync) }
+ }
+
+ pub fn create_vertex_buffer(&mut self, vertices: &[Vertex]) {
+ assert!(vertices.len() < (u32::MAX as usize), "Too many triangles!");
+ let ptr = vertices.as_ptr();
+ let len = vertices.len();
+ unsafe { crate::create_vertex_buffer(self.ptr, len as u32, ptr) }
+ }
+
+ pub fn set_camera(
+ &mut self,
+ x: f32,
+ y: f32,
+ zoom: f32,
+ rotation: f32,
+ width: f32,
+ height: f32,
+ ) {
+ unsafe { crate::set_camera(self.ptr, x, y, zoom, rotation, width, height) }
+ }
+
+ pub fn render_frame(&mut self) {
+ unsafe { crate::render_frame(self.ptr) }
+ }
+}
diff --git a/sys/src/window.rs b/sys/src/window.rs
new file mode 100644
index 0000000..19de5e7
--- /dev/null
+++ b/sys/src/window.rs
@@ -0,0 +1,116 @@
+use std::ffi::{c_void, CString};
+use std::ops::ControlFlow;
+
+use crate::{CWindowConfig, CWindowEvent};
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct WindowConfig {
+ pub title: String,
+ pub default_width: u32,
+ pub default_height: u32,
+ pub default_x: u32,
+ pub default_y: u32,
+ pub visible: bool,
+ pub borderless_fullscreen: bool,
+}
+
+pub struct Window {
+ pub(crate) ptr: *mut (),
+}
+
+pub enum WindowEvent {
+ Other = 1,
+ CloseRequest,
+ ScaleFactorChange,
+ Resume,
+ RedrawRequest,
+}
+
+impl Drop for Window {
+ fn drop(&mut self) {
+ unsafe { crate::destroy_window(self.ptr) }
+ }
+}
+
+impl Window {
+ pub fn new(config: WindowConfig) -> Self {
+ let title = CString::new(config.title.as_bytes()).unwrap();
+ let config = CWindowConfig {
+ default_width: config.default_width,
+ default_height: config.default_height,
+ default_x: config.default_x,
+ default_y: config.default_y,
+ visible: config.visible,
+ borderless_fullscreen: config.borderless_fullscreen,
+ title: title.as_ptr(),
+ };
+
+ let window = unsafe { crate::create_window(config) };
+
+ Self { ptr: window }
+ }
+
+ pub fn set_visible(&mut self, visible: bool) {
+ unsafe { crate::set_visible(self.ptr, visible) }
+ }
+
+ pub fn set_title(&mut self, title: &str) {
+ let string = CString::new(title.to_string().as_bytes()).unwrap();
+ let bytes = string.as_ptr();
+ unsafe { crate::set_title(self.ptr, bytes) }
+ }
+
+ pub fn resize(&mut self, width: u32, height: u32) {
+ unsafe { crate::resize_window(self.ptr, width, height) }
+ }
+
+ pub fn set_fullscreen(&mut self, fullscreen: bool) {
+ unsafe { crate::set_fullscreen(self.ptr, fullscreen) }
+ }
+
+ fn translate_event(event: CWindowEvent) -> Option<WindowEvent> {
+ let event = match event {
+ CWindowEvent::AboutToWait => return None,
+ CWindowEvent::Other => WindowEvent::Other,
+ CWindowEvent::CloseRequest => WindowEvent::CloseRequest,
+ CWindowEvent::ScaleFactorChange => WindowEvent::ScaleFactorChange,
+ CWindowEvent::Resume => WindowEvent::Resume,
+ CWindowEvent::RedrawRequest => WindowEvent::RedrawRequest,
+ };
+ Some(event)
+ }
+
+ pub fn wait_for_event(&self) {
+ unsafe { crate::wait_for_event(self.ptr) }
+ }
+
+ pub fn pop_event(&self) -> bool {
+ unsafe { crate::pop_event(self.ptr) }
+ }
+
+ pub fn wait_for_resume(&mut self) {
+ unsafe { crate::wait_for_resume(self.ptr) }
+ }
+
+ pub fn run(&mut self, mut handler: impl FnMut(&mut Window, Option<WindowEvent>)) -> ! {
+ let window_ptr = self.ptr;
+
+ unsafe {
+ let closure = |c_event: CWindowEvent| {
+ handler(self, Self::translate_event(c_event));
+ };
+ let closure_data: Box<Box<dyn FnMut(CWindowEvent)>> = Box::new(Box::new(closure));
+ crate::set_event_handler(window_ptr, Box::into_raw(closure_data) as *mut _);
+ }
+
+ loop {
+ if !self.pop_event() {
+ unsafe { crate::run_event_handler(window_ptr, CWindowEvent::AboutToWait) };
+ }
+ }
+ }
+
+ pub fn request_redraw(&mut self) {
+ unsafe { crate::request_redraw(self.ptr) }
+ }
+}
diff --git a/textures/Cargo.toml b/textures/Cargo.toml
new file mode 100644
index 0000000..e550a92
--- /dev/null
+++ b/textures/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "alligator_textures"
+version = "0.1.0"
+edition = "2021"
+publish = false
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+packer = { path = "../packer" }
+
+image = "0.24"
+exun = "0.2"
diff --git a/textures/src/lib.rs b/textures/src/lib.rs
new file mode 100644
index 0000000..c1b56a8
--- /dev/null
+++ b/textures/src/lib.rs
@@ -0,0 +1,96 @@
+use std::collections::HashMap;
+use std::path::Path;
+use std::sync::Arc;
+
+use exun::{RawUnexpected, ResultErrorExt};
+use image::RgbaImage;
+use packer::{RectanglePacker, TextureAtlas};
+
+type ExunResult<T> = Result<T, RawUnexpected>;
+
+pub struct TextureManager {
+ textures: HashMap<Arc<str>, TextureMetadata>,
+ loaded_textures: HashMap<Arc<str>, Arc<RgbaImage>>,
+ packer: RectanglePacker,
+ target_size: usize,
+ current_size: usize,
+}
+
+struct TextureMetadata {
+ path: Arc<Path>,
+ size: usize,
+}
+
+impl TextureManager {
+ pub fn new(target_size: usize) -> Self {
+ Self {
+ textures: HashMap::new(),
+ loaded_textures: HashMap::new(),
+ packer: RectanglePacker::new(),
+ target_size,
+ current_size: 0,
+ }
+ }
+
+ pub fn add_texture(&mut self, name: Arc<str>, path: Arc<Path>, size: usize) {
+ self.textures.insert(name, TextureMetadata { path, size });
+ }
+
+ pub fn try_preload(&mut self, name: Arc<str>) -> ExunResult<Option<bool>> {
+ let Some(metadata) = self.textures.get(&name) else {
+ return Ok(None);
+ };
+
+ if self.current_size + metadata.size < self.target_size {
+ self.load(name)?;
+ Ok(Some(true))
+ } else {
+ Ok(Some(false))
+ }
+ }
+
+ pub fn load(&mut self, name: Arc<str>) -> ExunResult<Option<()>> {
+ let Some(metadata) = self.textures.get(&name) else {
+ return Ok(None);
+ };
+
+ self.current_size += metadata.size;
+ let texture = image::open(&metadata.path).unexpect()?.to_rgba8();
+ self.loaded_textures.insert(name, Arc::new(texture));
+
+ Ok(Some(()))
+ }
+
+ pub fn unload(&mut self, name: Arc<str>) -> Option<()> {
+ self.loaded_textures.remove(&name)?;
+ Some(())
+ }
+
+ pub fn pack_texture(&mut self, name: Arc<str>) -> ExunResult<()> {
+ if !self.loaded_textures.contains_key(&name) {
+ self.load(name.clone())?;
+ }
+
+ self.packer.add_texture(
+ name.clone(),
+ self.loaded_textures
+ .get(&name)
+ .expect("we checked to make sure it was loaded")
+ .clone(),
+ );
+
+ Ok(())
+ }
+
+ pub fn reset_packer(&mut self) {
+ self.packer = RectanglePacker::new();
+ }
+
+ pub fn reload_texture_atlas(
+ &mut self,
+ min_width: u32,
+ min_height: u32,
+ ) -> ExunResult<TextureAtlas> {
+ self.packer.output(min_width, min_height)
+ }
+}
diff --git a/todos.txt b/todos.txt
new file mode 100644
index 0000000..8880a50
--- /dev/null
+++ b/todos.txt
@@ -0,0 +1,2 @@
+Use DirectX12 directly
+GPU accelerated vector graphics
diff --git a/tvg/src/colors.rs b/tvg/src/colors.rs
index 494e6aa..0dd8831 100644
--- a/tvg/src/colors.rs
+++ b/tvg/src/colors.rs
@@ -5,13 +5,16 @@ use num_enum::TryFromPrimitive;
use crate::TvgError;
+const GAMMA: f32 = 2.2;
+const INVERT_GAMMA: f32 = 1.0 / GAMMA;
+
/// The color table encodes the palette for this file.
///
/// It’s binary content is defined by the `color_encoding` field in the header.
/// For the three defined color encodings, each will yield a list of
/// `color_count` RGBA tuples.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub(crate) struct ColorTable<C: Color> {
+pub struct ColorTable<C: Color> {
colors: Box<[C]>,
}
@@ -59,12 +62,17 @@ impl<C: Color> ColorTable<C> {
}
/// Returns the number of colors in the table.
- fn len(&self) -> usize {
+ pub fn len(&self) -> usize {
self.colors.len()
}
+ /// Returns `true` if the color table has no colors in it
+ pub fn is_empty(&self) -> bool {
+ self.colors.is_empty()
+ }
+
/// Returns a reference to a color, or `None` if out-of-bounds.
- fn get(&self, index: usize) -> Option<&C> {
+ pub fn get(&self, index: usize) -> Option<&C> {
self.colors.get(index)
}
@@ -128,10 +136,68 @@ pub trait Color: Sized {
/// Convert from the RGBA16 format to this format. This may be lossy.
fn from_rgba16_lossy(red: u16, green: u16, blue: u16, alpha: u16) -> Self;
+ /// Convert from the RGBAF32 format to this format. This may be lossy.
+ fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self;
+
fn red_u16(&self) -> u16;
fn blue_u16(&self) -> u16;
fn green_u16(&self) -> u16;
fn alpha_u16(&self) -> u16;
+
+ fn red_f32(&self) -> f32;
+ fn green_f32(&self) -> f32;
+ fn blue_f32(&self) -> f32;
+ fn alpha_f32(&self) -> f32;
+}
+
+fn to_color_space(val: f32) -> f32 {
+ val.powf(INVERT_GAMMA)
+}
+
+fn to_linear(val: f32) -> f32 {
+ val.powf(GAMMA)
+}
+
+pub(crate) fn blend<C: Color + Clone>(dest: &mut C, src: &C) {
+ fn lerp_color(src: f32, dst: f32, src_alpha: f32, dst_alpha: f32, alpha: f32) -> f32 {
+ let src = to_linear(src);
+ let dst = to_linear(dst);
+
+ let val = (1.0 / alpha) * (src_alpha * src + (1.0 - src_alpha) * dst_alpha * dst);
+
+ to_color_space(val)
+ }
+
+ if src.alpha_f32() == 1.0 || dest.alpha_u16() == 0 {
+ *dest = src.clone();
+ return;
+ } else if src.alpha_u16() == 0 {
+ return;
+ }
+
+ let src_a = src.alpha_f32();
+ let dst_a = dest.alpha_f32();
+ let alpha = src_a + (1.0 - src_a) * dst_a;
+ let red = lerp_color(src.red_f32(), dest.red_f32(), src_a, dst_a, alpha);
+ let green = lerp_color(src.green_f32(), dest.green_f32(), src_a, dst_a, alpha);
+ let blue = lerp_color(src.blue_f32(), dest.blue_f32(), src_a, dst_a, alpha);
+
+ *dest = C::from_rgbaf32_lossy(red, green, blue, alpha);
+}
+
+pub(crate) fn lerp<C: Color>(first: &C, second: &C, f: f64) -> C {
+ fn lerp_color(a: f32, b: f32, f: f64) -> f32 {
+ a + (b - a) * f as f32
+ }
+
+ let f = f.clamp(0.0, 1.0);
+
+ let red = to_color_space(lerp_color(first.red_f32(), second.red_f32(), f));
+ let green = to_color_space(lerp_color(first.green_f32(), second.green_f32(), f));
+ let blue = to_color_space(lerp_color(first.blue_f32(), second.blue_f32(), f));
+ let alpha = lerp_color(first.alpha_f32(), second.alpha_f32(), f);
+
+ C::from_rgbaf32_lossy(red, green, blue, alpha)
}
/// Each color value is encoded as a sequence of four bytes.
@@ -172,6 +238,15 @@ impl Color for Rgba8888 {
}
}
+ fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self {
+ Self {
+ red: (red * u8::MAX as f32) as u8,
+ green: (green * u8::MAX as f32) as u8,
+ blue: (blue * u8::MAX as f32) as u8,
+ alpha: (alpha * u8::MAX as f32) as u8,
+ }
+ }
+
fn red_u16(&self) -> u16 {
(self.red as u16) << 8
}
@@ -187,6 +262,22 @@ impl Color for Rgba8888 {
fn alpha_u16(&self) -> u16 {
(self.alpha as u16) << 8
}
+
+ fn red_f32(&self) -> f32 {
+ self.red as f32 / u8::MAX as f32
+ }
+
+ fn green_f32(&self) -> f32 {
+ self.green as f32 / u8::MAX as f32
+ }
+
+ fn blue_f32(&self) -> f32 {
+ self.blue as f32 / u8::MAX as f32
+ }
+
+ fn alpha_f32(&self) -> f32 {
+ self.alpha as f32 / u8::MAX as f32
+ }
}
/// Each color value is encoded as a sequence of 2 bytes.
@@ -224,6 +315,14 @@ impl Color for Rgb565 {
}
}
+ fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self {
+ Self {
+ red: (red * (0b011111) as f32) as u8,
+ green: (green * (0b111111) as f32) as u8,
+ blue: (blue * (0b011111) as f32) as u8,
+ }
+ }
+
fn red_u16(&self) -> u16 {
(self.red as u16) << 11
}
@@ -239,6 +338,22 @@ impl Color for Rgb565 {
fn alpha_u16(&self) -> u16 {
0
}
+
+ fn red_f32(&self) -> f32 {
+ self.red as f32 / (0b011111) as f32
+ }
+
+ fn green_f32(&self) -> f32 {
+ self.green as f32 / (0b111111) as f32
+ }
+
+ fn blue_f32(&self) -> f32 {
+ self.blue as f32 / (0b011111) as f32
+ }
+
+ fn alpha_f32(&self) -> f32 {
+ 0.0
+ }
}
/// Each color value is encoded as a sequence of 16 bytes.
@@ -279,6 +394,15 @@ impl Color for RgbaF32 {
}
}
+ fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self {
+ Self {
+ red,
+ green,
+ blue,
+ alpha,
+ }
+ }
+
fn red_u16(&self) -> u16 {
(self.red * (u16::MAX as f32)) as u16
}
@@ -294,6 +418,22 @@ impl Color for RgbaF32 {
fn alpha_u16(&self) -> u16 {
(self.alpha * (u16::MAX as f32)) as u16
}
+
+ fn red_f32(&self) -> f32 {
+ self.red
+ }
+
+ fn green_f32(&self) -> f32 {
+ self.green
+ }
+
+ fn blue_f32(&self) -> f32 {
+ self.blue
+ }
+
+ fn alpha_f32(&self) -> f32 {
+ self.alpha
+ }
}
/// Each color value is encoded as a sequence of 8 bytes.
@@ -334,6 +474,15 @@ impl Color for Rgba16 {
}
}
+ fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self {
+ Self {
+ red: (red * u16::MAX as f32) as u16,
+ green: (green * u16::MAX as f32) as u16,
+ blue: (blue * u16::MAX as f32) as u16,
+ alpha: (alpha * u16::MAX as f32) as u16,
+ }
+ }
+
fn red_u16(&self) -> u16 {
self.red
}
@@ -349,4 +498,20 @@ impl Color for Rgba16 {
fn alpha_u16(&self) -> u16 {
self.alpha
}
+
+ fn red_f32(&self) -> f32 {
+ self.red as f32 / u16::MAX as f32
+ }
+
+ fn green_f32(&self) -> f32 {
+ self.green as f32 / u16::MAX as f32
+ }
+
+ fn blue_f32(&self) -> f32 {
+ self.blue as f32 / u16::MAX as f32
+ }
+
+ fn alpha_f32(&self) -> f32 {
+ self.alpha as f32 / u16::MAX as f32
+ }
}
diff --git a/tvg/src/commands.rs b/tvg/src/commands.rs
index f316a53..c21099b 100644
--- a/tvg/src/commands.rs
+++ b/tvg/src/commands.rs
@@ -1,24 +1,101 @@
use std::io::{self, Read};
+use std::ops::{Add, Mul, Sub};
use byteorder::ReadBytesExt;
use raise::yeet;
-use crate::{header::TvgHeader, path::Path, read_unit, read_varuint, Decode, Point, TvgError};
+use crate::{
+ colors::{self, Color, ColorTable},
+ header::TvgHeader,
+ path::Path,
+ read_unit, read_varuint, Decode, TvgError,
+};
+
+/// A X and Y coordinate pair.
+#[derive(Debug, Clone, Copy)]
+pub struct Vector {
+ /// Horizontal distance of the point to the origin.
+ pub x: f64,
+ /// Vertical distance of the point to the origin.
+ pub y: f64,
+}
+
+impl Vector {
+ pub fn magnitude(&self) -> f64 {
+ (self.x * self.x + self.y * self.y).sqrt()
+ }
+
+ pub fn scale(&self, scale: f64) -> Vector {
+ Vector {
+ x: self.x * scale,
+ y: self.y * scale,
+ }
+ }
+}
+
+impl Mul for Vector {
+ type Output = f64;
+
+ fn mul(self, rhs: Self) -> Self::Output {
+ self.x * rhs.x + self.y * rhs.y
+ }
+}
+
+/// A X and Y coordinate pair.
+#[derive(Debug, Clone, Copy)]
+pub struct Point {
+ /// Horizontal distance of the point to the origin.
+ pub x: f64,
+ /// Vertical distance of the point to the origin.
+ pub y: f64,
+}
+
+impl Sub for Point {
+ type Output = Vector;
+
+ fn sub(self, rhs: Self) -> Self::Output {
+ Vector {
+ x: self.x - rhs.x,
+ y: self.y - rhs.y,
+ }
+ }
+}
+
+impl Add<Vector> for Point {
+ type Output = Self;
+
+ fn add(self, vector: Vector) -> Self::Output {
+ Self {
+ x: self.x + vector.x,
+ y: self.y + vector.y,
+ }
+ }
+}
+
+impl Decode for Point {
+ fn read(reader: &mut impl Read, header: &TvgHeader) -> io::Result<Self> {
+ Ok(Self {
+ x: read_unit(reader, header)?,
+ y: read_unit(reader, header)?,
+ })
+ }
+}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Rectangle {
/// Horizontal distance of the left side to the origin.
- x: f64,
+ pub x: f64,
/// Vertical distance of the upper side to the origin.
- y: f64,
+ pub y: f64,
/// Horizontal extent of the rectangle.
- width: f64,
+ pub width: f64,
/// Vertical extent of the rectangle.
- height: f64,
+ pub height: f64,
}
impl Decode for Rectangle {
fn read(reader: &mut impl Read, header: &TvgHeader) -> io::Result<Self> {
+ let x = 5;
Ok(Self {
x: read_unit(reader, header)?,
y: read_unit(reader, header)?,
@@ -203,6 +280,72 @@ impl Style {
color_index_1: read_varuint(reader)?,
})
}
+
+ fn linear_get_color_at<C: Color + Clone>(
+ &self,
+ color_table: &ColorTable<C>,
+ point: Point,
+ ) -> Option<C> {
+ let Self::LinearGradient {
+ point_0,
+ point_1,
+ color_index_0,
+ color_index_1 } = self else { panic!() };
+
+ // TODO remove these unwraps
+ let color_0 = color_table.get(*color_index_0 as usize)?;
+ let color_1 = color_table.get(*color_index_1 as usize)?;
+
+ let direction = *point_1 - *point_0;
+ let delta = point - *point_0;
+
+ if direction * delta <= 0.0 {
+ return Some(color_0.clone());
+ } else if direction * (point - *point_1) >= 0.0 {
+ return Some(color_1.clone());
+ }
+
+ let gradient_length = direction.magnitude();
+ let proj = (direction * delta) / (direction * direction);
+ let gradient_position = direction.scale(proj).magnitude();
+ let f = gradient_position / gradient_length;
+
+ Some(colors::lerp(color_0, color_1, f))
+ }
+
+ fn radial_get_color_at<C: Color>(
+ &self,
+ color_table: &ColorTable<C>,
+ point: Point,
+ ) -> Option<C> {
+ let Self::RadialGradient {
+ point_0,
+ point_1,
+ color_index_0,
+ color_index_1 } = self else { panic!() };
+
+ // TODO remove these unwraps
+ let color_0 = color_table.get(*color_index_0 as usize)?;
+ let color_1 = color_table.get(*color_index_1 as usize)?;
+
+ let distance_max = (*point_1 - *point_0).magnitude();
+ let distance_is = (point - *point_0).magnitude();
+ let f = distance_is / distance_max;
+
+ Some(colors::lerp(color_0, color_1, f))
+ }
+
+ pub fn get_color_at<C: Color + Clone>(
+ &self,
+ color_table: &ColorTable<C>,
+ point: Point,
+ ) -> Option<C> {
+ match self {
+ Self::FlatColored { color_index } => color_table.get(*color_index as usize).cloned(),
+ Self::LinearGradient { .. } => self.linear_get_color_at(color_table, point),
+ Self::RadialGradient { .. } => self.radial_get_color_at(color_table, point),
+ }
+ }
}
/// TinyVG files contain a sequence of draw commands that must be executed in
diff --git a/tvg/src/header.rs b/tvg/src/header.rs
index b3be494..d444f66 100644
--- a/tvg/src/header.rs
+++ b/tvg/src/header.rs
@@ -135,6 +135,14 @@ impl TvgHeader {
pub fn color_count(&self) -> u32 {
self.color_count
}
+
+ pub fn width(&self) -> u32 {
+ self.width
+ }
+
+ pub fn height(&self) -> u32 {
+ self.height
+ }
}
fn read_unsigned_unit<R: Read>(
diff --git a/tvg/src/lib.rs b/tvg/src/lib.rs
index 5c9e1d2..16a95bd 100644
--- a/tvg/src/lib.rs
+++ b/tvg/src/lib.rs
@@ -10,6 +10,7 @@ pub mod colors;
mod commands;
mod header;
mod path;
+mod render;
pub use header::SUPPORTED_VERSION;
@@ -146,24 +147,6 @@ fn read_unit(reader: &mut impl Read, header: &TvgHeader) -> io::Result<f64> {
Ok((value as f64) / fractional)
}
-/// A X and Y coordinate pair.
-#[derive(Debug, Clone, Copy)]
-pub struct Point {
- /// Horizontal distance of the point to the origin.
- x: f64,
- /// Vertical distance of the point to the origin.
- y: f64,
-}
-
-impl Decode for Point {
- fn read(reader: &mut impl Read, header: &TvgHeader) -> io::Result<Self> {
- Ok(Self {
- x: read_unit(reader, header)?,
- y: read_unit(reader, header)?,
- })
- }
-}
-
fn read_varuint(reader: &mut impl Read) -> io::Result<u32> {
let mut count = 0;
let mut result = 0;
diff --git a/tvg/src/path.rs b/tvg/src/path.rs
index 2bc0448..a576eb8 100644
--- a/tvg/src/path.rs
+++ b/tvg/src/path.rs
@@ -4,7 +4,7 @@ use byteorder::ReadBytesExt;
use num_enum::TryFromPrimitive;
use raise::yeet;
-use crate::{header::TvgHeader, read_unit, read_varuint, Decode, Point, TvgError};
+use crate::{commands::Point, header::TvgHeader, read_unit, read_varuint, Decode, TvgError};
/// Returns an error if the padding isn't zero
fn check_padding(padding: u8) -> Result<(), TvgError> {
@@ -17,7 +17,7 @@ fn check_padding(padding: u8) -> Result<(), TvgError> {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive)]
#[repr(u8)]
-enum Sweep {
+pub(crate) enum Sweep {
Right = 0,
Left = 1,
}
@@ -47,7 +47,7 @@ enum InstructionKind {
}
#[derive(Debug, Clone, Copy)]
-enum InstructionData {
+pub(crate) enum InstructionData {
/// The line instruction draws a straight line to the position.
Line {
/// The end point of the line.
@@ -231,11 +231,11 @@ impl InstructionData {
}
#[derive(Debug, Clone)]
-struct Instruction {
+pub(crate) struct Instruction {
/// The width of the line the "pen" makes, if it makes one at all.
- line_width: Option<f64>,
+ pub(crate) line_width: Option<f64>,
/// The arguments to the instruction.
- data: InstructionData,
+ pub(crate) data: InstructionData,
}
impl Instruction {
@@ -258,11 +258,11 @@ impl Instruction {
}
#[derive(Debug, Clone)]
-struct Segment {
+pub(crate) struct Segment {
/// The starting point of the segment.
- start: Point,
+ pub(crate) start: Point,
/// The list of instructions for tha segment.
- instructions: Box<[Instruction]>,
+ pub(crate) instructions: Box<[Instruction]>,
}
impl Segment {
@@ -294,7 +294,7 @@ impl Segment {
/// outline of the shape.
#[derive(Debug, Clone)]
pub struct Path {
- segments: Box<[Segment]>,
+ pub(crate) segments: Box<[Segment]>,
}
impl Path {
diff --git a/tvg/src/render.rs b/tvg/src/render.rs
new file mode 100644
index 0000000..f8c15a1
--- /dev/null
+++ b/tvg/src/render.rs
@@ -0,0 +1,506 @@
+use crate::{
+ colors::{self, blend, lerp, Color, ColorTable},
+ commands::{Command, Point, Rectangle, Style, Vector},
+ header::TvgHeader,
+ path::{Instruction, InstructionData, Path, Sweep},
+ TvgFile,
+};
+
+fn distance(p0: Point, p1: Point) -> f64 {
+ (p0 - p1).magnitude().abs()
+}
+
+fn rotation_matrix(angle: f64) -> [[f64; 2]; 2] {
+ let s = angle.sin();
+ let c = angle.cos();
+ [[c, -s], [s, c]]
+}
+
+fn apply_matrix(matrix: [[f64; 2]; 2], vector: Vector) -> Vector {
+ Vector {
+ x: vector.x * matrix[0][0] + vector.y * matrix[0][1],
+ y: vector.x * matrix[1][0] + vector.y * matrix[1][1],
+ }
+}
+
+fn apply_matrix_point(matrix: [[f64; 2]; 2], point: Point) -> Point {
+ Point {
+ x: point.x * matrix[0][0] + point.y * matrix[0][1],
+ y: point.x * matrix[1][0] + point.y * matrix[1][1],
+ }
+}
+
+fn lerp_f64(a: f64, b: f64, x: f64) -> f64 {
+ a + (b - a) * x
+}
+
+fn lerp_and_reduce(vals: &[f64], f: f64) -> Vec<f64> {
+ let mut result = Vec::with_capacity(vals.len() - 1);
+ for i in 0..(vals.len() - 1) {
+ result.push(lerp_f64(vals[i], vals[i + 1], f));
+ }
+ result
+}
+
+fn lerp_and_reduce_to_one(vals: &[f64], f: f64) -> f64 {
+ if vals.len() == 1 {
+ vals[0]
+ } else {
+ lerp_and_reduce_to_one(&lerp_and_reduce(vals, f), f)
+ }
+}
+
+/// A version of [`Point`] that uses usizes for a PixMap
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+struct UPoint {
+ x: usize,
+ y: usize,
+}
+
+impl UPoint {
+ fn new(x: usize, y: usize) -> UPoint {
+ Self { x, y }
+ }
+}
+
+struct FrameBuffer<C: Color> {
+ width: usize,
+ height: usize,
+ pixels: Box<[C]>,
+ scale_x: f64,
+ scale_y: f64,
+}
+
+impl<C: Color + Clone + Default> FrameBuffer<C> {
+ fn new(width: usize, height: usize, scale_x: f64, scale_y: f64) -> Self {
+ let pixel_count = width * height;
+ Self {
+ width,
+ height,
+ pixels: vec![C::default(); pixel_count].into_boxed_slice(),
+ scale_x,
+ scale_y,
+ }
+ }
+
+ fn point_to_upoint(&self, point: Point) -> UPoint {
+ todo!()
+ }
+
+ fn upoint_to_point(&self, upoint: UPoint) -> Point {
+ todo!()
+ }
+
+ /// Blends the new color with the given pixel. Returns `None` if the destination is invalid
+ fn set_pixel(&mut self, x: usize, y: usize, color: C) -> Option<()> {
+ if x >= self.width || y >= self.height {
+ return None;
+ }
+
+ let offset = y * self.width + x;
+ let destination_pixel = self.pixels.get_mut(offset)?;
+
+ blend(destination_pixel, &color);
+
+ Some(())
+ }
+
+ fn draw_line(
+ &mut self,
+ color_table: ColorTable<C>,
+ style: Style,
+ width_start: f64,
+ width_end: f64,
+ line_start: Point,
+ line_end: Point,
+ ) -> Option<()> {
+ let mut min_x = usize::MAX;
+ let mut min_y = usize::MAX;
+ let mut max_x = usize::MIN;
+ let mut max_y = usize::MIN;
+
+ let max_width = f64::max(width_start, width_end);
+
+ let points = [line_start, line_end];
+ for pt in points {
+ min_x = usize::min(min_x, (self.scale_x * (pt.x - max_width)).floor() as usize);
+ min_y = usize::min(min_y, (self.scale_y * (pt.y - max_width)).floor() as usize);
+ max_x = usize::max(max_x, (self.scale_x * (pt.x - max_width)).floor() as usize);
+ max_y = usize::max(max_y, (self.scale_y * (pt.y - max_width)).floor() as usize);
+ }
+
+ // limit to framebuffer size
+ min_x = usize::min(min_x, self.width);
+ min_y = usize::min(min_y, self.height);
+ max_x = usize::min(max_x, self.width);
+ max_y = usize::min(max_y, self.height);
+
+ for y in min_y..=max_y {
+ for x in min_x..=max_x {
+ let point = self.upoint_to_point(UPoint { x, y });
+ let dist = todo!() as f64;
+
+ if dist >= 0.0 {
+ self.set_pixel(x, y, style.get_color_at(&color_table, point)?);
+ }
+ }
+ }
+
+ Some(())
+ }
+}
+
+#[derive(Debug, Default)]
+struct PathMaker {
+ points: Vec<Point>,
+ width: Vec<f64>,
+}
+
+impl PathMaker {
+ fn new(width: f64, start: Point) -> Self {
+ let points = vec![start];
+ let width = vec![width];
+
+ Self { points, width }
+ }
+
+ fn render_line(&mut self, width: f64, to_point: Point) {
+ self.points.push(to_point);
+ self.width.push(width);
+ }
+
+ fn render_horizontal_line(&mut self, width: f64, x: f64) {
+ self.points.push(Point {
+ x,
+ y: self.points.last().unwrap().y,
+ });
+ self.width.push(width);
+ }
+
+ fn render_vertical_line(&mut self, width: f64, y: f64) {
+ self.points.push(Point {
+ x: self.points.last().unwrap().x,
+ y,
+ });
+ self.width.push(width);
+ }
+
+ fn render_cubic_bezier(
+ &mut self,
+ control_0: Point,
+ control_1: Point,
+ point: Point,
+ start_width: f64,
+ end_width: f64,
+ ) {
+ const BEZIER_POLY_COUNT: usize = 16;
+
+ let previous = self.points.last().unwrap();
+ let oct0x = [previous.x, control_0.x, control_1.x, point.x];
+ let oct0y = [previous.y, control_0.y, control_1.y, point.y];
+
+ for i in 1..BEZIER_POLY_COUNT {
+ let f = i as f64 / BEZIER_POLY_COUNT as f64;
+ let x = lerp_and_reduce_to_one(&oct0x, f);
+ let y = lerp_and_reduce_to_one(&oct0y, f);
+
+ self.points.push(Point { x, y });
+ self.width.push(lerp_f64(start_width, end_width, f));
+ }
+
+ self.points.push(point);
+ self.width.push(end_width);
+ }
+
+ fn render_quadratic_bezier(
+ &mut self,
+ control: Point,
+ target: Point,
+ start_width: f64,
+ end_width: f64,
+ ) {
+ const BEZIER_POLY_COUNT: usize = 16;
+
+ let previous = self.points.last().unwrap();
+ let oct0x = [previous.x, control.x, target.x];
+ let oct0y = [previous.y, control.y, target.y];
+
+ for i in 1..BEZIER_POLY_COUNT {
+ let f = i as f64 / BEZIER_POLY_COUNT as f64;
+ let x = lerp_and_reduce_to_one(&oct0x, f);
+ let y = lerp_and_reduce_to_one(&oct0y, f);
+
+ self.points.push(Point { x, y });
+ self.width.push(lerp_f64(start_width, end_width, f));
+ }
+
+ self.points.push(target);
+ self.width.push(end_width);
+ }
+
+ fn render_circle(
+ &mut self,
+ p0: Point,
+ p1: Point,
+ mut radius: f64,
+ large_arc: bool,
+ turn_left: bool,
+ end_width: f64,
+ ) {
+ const CIRCLE_POLY_COUNT: usize = 100;
+
+ let start_width = *self.width.last().unwrap();
+ let left_side = turn_left == large_arc;
+ let delta = (p1 - p0).scale(0.5);
+ let midpoint = p0 + delta;
+
+ let radius_vec = if left_side {
+ Vector {
+ x: -delta.y,
+ y: delta.x,
+ }
+ } else {
+ Vector {
+ x: delta.y,
+ y: -delta.x,
+ }
+ };
+
+ let len_squared = radius_vec.x * radius_vec.x + radius_vec.y * radius_vec.y;
+ if (len_squared - 0.03 > radius * radius) || radius < 0.0 {
+ radius = len_squared.sqrt();
+ }
+
+ let to_center = radius_vec.scale(f64::max(0.0, radius * radius / len_squared - 1.0).sqrt());
+ let center = midpoint + to_center;
+ let angle = len_squared.sqrt().clamp(-1.0, 1.0).asin() * 2.0;
+ let arc = if large_arc {
+ std::f64::consts::TAU - angle
+ } else {
+ angle
+ };
+
+ let position = p0 - center;
+ for i in 0..CIRCLE_POLY_COUNT {
+ let arc = if turn_left { -arc } else { arc };
+ let step_matrix = rotation_matrix(i as f64 * arc / CIRCLE_POLY_COUNT as f64);
+ let point = center + apply_matrix(step_matrix, position);
+ self.points.push(point);
+ self.width.push(lerp_f64(
+ start_width,
+ end_width,
+ i as f64 / CIRCLE_POLY_COUNT as f64,
+ ));
+ }
+
+ self.points.push(p1);
+ }
+
+ fn render_ellipse(
+ &mut self,
+ p0: Point,
+ p1: Point,
+ radius_x: f64,
+ radius_y: f64,
+ rotation: f64,
+ large_arc: bool,
+ turn_left: bool,
+ end_width: f64,
+ ) {
+ let radius_min = distance(p0, p1) / 2.0;
+ let radius_max = (radius_x * radius_x + radius_y * radius_y).sqrt();
+ let upscale = if radius_max < radius_min {
+ radius_min / radius_max
+ } else {
+ 1.0
+ };
+
+ let ratio = radius_x / radius_y;
+ let rotation = rotation_matrix(-rotation.to_radians());
+ let transform = [
+ [rotation[0][0] / upscale, rotation[0][1] / upscale],
+ [
+ rotation[1][0] / upscale * ratio,
+ rotation[1][1] / upscale * ratio,
+ ],
+ ];
+ let transform_back = [
+ [rotation[1][1] * upscale, -rotation[0][1] / ratio * upscale],
+ [-rotation[1][0] * upscale, rotation[0][0] / ratio * upscale],
+ ];
+
+ let mut tmp = PathMaker::default();
+ tmp.render_circle(
+ apply_matrix_point(transform, p0),
+ apply_matrix_point(transform, p1),
+ radius_x * upscale,
+ large_arc,
+ turn_left,
+ end_width,
+ );
+
+ for i in 0..tmp.points.len() {
+ let point = tmp.points[i];
+ self.points.push(apply_matrix_point(transform_back, point));
+ self.width.push(tmp.width[i]);
+ }
+ }
+
+ fn close(&mut self, width: f64) {
+ self.points.push(self.points[0]);
+ self.width.push(width)
+ }
+}
+
+fn render_path(path: Path, width: f64) {
+ for segment in path.segments.iter() {
+ let mut path_maker = PathMaker::new(width, segment.start);
+ for instruction in segment.instructions.iter() {
+ let line_width = instruction
+ .line_width
+ .unwrap_or(*path_maker.width.last().unwrap());
+ let data = instruction.data;
+ match data {
+ InstructionData::Line { position } => path_maker.render_line(line_width, position),
+ InstructionData::HorizontalLine { x } => {
+ path_maker.render_horizontal_line(line_width, x)
+ }
+ InstructionData::VerticalLine { y } => {
+ path_maker.render_vertical_line(line_width, y)
+ }
+ InstructionData::CubicBezier {
+ control_0,
+ control_1,
+ point_1,
+ } => path_maker.render_cubic_bezier(
+ control_0,
+ control_1,
+ point_1,
+ *path_maker.width.last().unwrap(),
+ line_width,
+ ),
+ InstructionData::ArcCircle {
+ large_arc,
+ sweep,
+ radius,
+ target,
+ } => path_maker.render_circle(
+ *path_maker.points.last().unwrap(),
+ target,
+ radius,
+ large_arc,
+ sweep == Sweep::Left,
+ line_width,
+ ),
+ InstructionData::ArcEllipse {
+ large_arc,
+ sweep,
+ radius_x,
+ radius_y,
+ rotation,
+ target,
+ } => path_maker.render_ellipse(
+ *path_maker.points.last().unwrap(),
+ target,
+ radius_x,
+ radius_y,
+ rotation,
+ large_arc,
+ sweep == Sweep::Left,
+ line_width,
+ ),
+ InstructionData::ClosePath => path_maker.close(line_width),
+ InstructionData::QuadraticBezier { control, target } => path_maker
+ .render_quadratic_bezier(
+ control,
+ target,
+ *path_maker.width.last().unwrap(),
+ line_width,
+ ),
+ }
+ }
+ }
+}
+
+pub enum AntiAliasing {
+ X1 = 1,
+ X4 = 2,
+ X9 = 3,
+ X16 = 4,
+ X25 = 6,
+ X49 = 7,
+ X64 = 8,
+}
+
+pub fn render<C: Color + Clone + Default>(
+ file: &TvgFile<C>,
+ width: u32,
+ height: u32,
+ scale_x: f32,
+ scale_y: f32,
+ anti_alias: AntiAliasing,
+) {
+ let mut framebuffer: FrameBuffer<C> = FrameBuffer::new(
+ width as usize,
+ height as usize,
+ scale_x.into(),
+ scale_y.into(),
+ );
+ let header = &file.header;
+ let color_table = &file.color_table;
+
+ for command in file.commands.iter() {
+ match command {
+ Command::EndOfDocument => break,
+ Command::FillPolygon {
+ fill_style,
+ polygon,
+ } => {
+ todo!()
+ }
+ Command::FillRectangles {
+ fill_style,
+ rectangles,
+ } => todo!(),
+ Command::FillPath { fill_style, path } => todo!(),
+ Command::DrawLines {
+ line_style,
+ line_width,
+ lines,
+ } => todo!(),
+ Command::DrawLineLoop {
+ line_style,
+ line_width,
+ points,
+ } => todo!(),
+ Command::DrawLineStrip {
+ line_style,
+ line_width,
+ points,
+ } => todo!(),
+ Command::DrawLinePath {
+ line_style,
+ line_width,
+ path,
+ } => todo!(),
+ Command::OutlineFillPolygon {
+ fill_style,
+ line_style,
+ line_width,
+ points,
+ } => todo!(),
+ Command::OutlineFillRectangles {
+ fill_style,
+ line_style,
+ line_width,
+ rectangles,
+ } => todo!(),
+ Command::OutlineFillPath {
+ fill_style,
+ line_style,
+ line_width,
+ path,
+ } => todo!(),
+ }
+ }
+}