From 0550191c7ac23702a8578ee31cc7b46662c8d569 Mon Sep 17 00:00:00 2001 From: popertots Date: Wed, 18 Mar 2026 15:45:25 +0000 Subject: [PATCH] Fix update_wandering_targets target validation logic - Restored original target selection logic that validates is_standable_tile - Fixed target position z-level checking (check floor tile then standable) - Re-added check for completed paths (path_index >= path.len) - This was the cause of 50,297 failed paths - entities targeting invalid positions --- last_24h_diff.patch | 2380 ++++ pathfinding_benchmark_baseline.csv | 11281 +++++++++++++++++++ pathfinding_benchmark_current.csv | 25 + src/entities/shared_systems/pathfinding.rs | 42 +- 4 files changed, 13707 insertions(+), 21 deletions(-) create mode 100644 last_24h_diff.patch create mode 100644 pathfinding_benchmark_baseline.csv create mode 100644 pathfinding_benchmark_current.csv diff --git a/last_24h_diff.patch b/last_24h_diff.patch new file mode 100644 index 0000000..285c625 --- /dev/null +++ b/last_24h_diff.patch @@ -0,0 +1,2380 @@ +diff --git a/Cargo.lock b/Cargo.lock +index 38f3aec..58598e8 100644 +--- a/Cargo.lock ++++ b/Cargo.lock +@@ -400,9 +400,9 @@ dependencies = [ + + [[package]] + name = "avif-serialize" +-version = "0.8.3" ++version = "0.8.8" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" ++checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" + dependencies = [ + "arrayvec", + ] +@@ -415,9 +415,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + + [[package]] + name = "bevy" +-version = "0.18.0" ++version = "0.18.1" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "ec689b5a79452b6f777b889bbff22d3216b82a8d2ab7814d4a0eb571e9938d97" ++checksum = "1fd310426290cec560221f9750c2f4484be4a8eeea7de3483c423329b465c40e" + dependencies = [ + "bevy_internal", + ] +@@ -1175,9 +1175,9 @@ dependencies = [ + + [[package]] + name = "bevy_platform" +-version = "0.18.0" ++version = "0.18.1" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "9b29ea749a8e85f98186ab662f607b885b97c804bb14cdb0cdf838164496d474" ++checksum = "ec6b36504169b644acd26a5469fd8d371aa6f1d73ee5c01b1b1181ae1cefbf9b" + dependencies = [ + "critical-section", + "foldhash 0.2.0", +@@ -1249,9 +1249,9 @@ checksum = "4f98cbc6d34bbdb58240b72ed1731931b4991a893b3a3238bb7c42ae054aa676" + + [[package]] + name = "bevy_rand" +-version = "0.14.0" ++version = "0.14.2" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "41e6e263026d08a4ca27c83257ed582939162534e6658ead164886d610df9b13" ++checksum = "526ba09324b96fb64f275a0cb4f6112d36b6c916ce2f14e38d5a8739dd2ac7f9" + dependencies = [ + "bevy_app", + "bevy_ecs", +@@ -2331,13 +2331,16 @@ dependencies = [ + name = "dorf" + version = "0.1.0" + dependencies = [ ++ "ahash", + "bevy", + "bevy_platform", + "bevy_rand", + "image", ++ "nohash-hasher", + "noise", + "rand 0.10.0", + "rayon", ++ "rustc-hash 2.1.1", + ] + + [[package]] +@@ -3023,9 +3026,9 @@ checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + + [[package]] + name = "image" +-version = "0.25.9" ++version = "0.25.10" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" ++checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" + dependencies = [ + "bytemuck", + "byteorder-lite", +@@ -3041,8 +3044,8 @@ dependencies = [ + "rayon", + "rgb", + "tiff", +- "zune-core 0.5.1", +- "zune-jpeg 0.5.12", ++ "zune-core", ++ "zune-jpeg", + ] + + [[package]] +@@ -3057,9 +3060,9 @@ dependencies = [ + + [[package]] + name = "imgref" +-version = "1.11.0" ++version = "1.12.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" ++checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + + [[package]] + name = "indexmap" +@@ -3431,9 +3434,9 @@ dependencies = [ + + [[package]] + name = "moxcms" +-version = "0.7.5" ++version = "0.8.1" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "ddd32fa8935aeadb8a8a6b6b351e40225570a37c43de67690383d87ef170cd08" ++checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" + dependencies = [ + "num-traits", + "pxfm", +@@ -3566,6 +3569,12 @@ dependencies = [ + "libc", + ] + ++[[package]] ++name = "nohash-hasher" ++version = "0.2.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" ++ + [[package]] + name = "noise" + version = "0.9.0" +@@ -4415,9 +4424,9 @@ dependencies = [ + + [[package]] + name = "ravif" +-version = "0.12.0" ++version = "0.13.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" ++checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" + dependencies = [ + "avif-serialize", + "imgref", +@@ -4536,9 +4545,9 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + + [[package]] + name = "rgb" +-version = "0.8.50" ++version = "0.8.53" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" ++checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" + + [[package]] + name = "rodio" +@@ -4993,16 +5002,16 @@ dependencies = [ + + [[package]] + name = "tiff" +-version = "0.10.3" ++version = "0.11.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" ++checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" + dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", +- "zune-jpeg 0.4.21", ++ "zune-jpeg", + ] + + [[package]] +@@ -6468,12 +6477,6 @@ dependencies = [ + "syn", + ] + +-[[package]] +-name = "zune-core" +-version = "0.4.12" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +- + [[package]] + name = "zune-core" + version = "0.5.1" +@@ -6489,20 +6492,11 @@ dependencies = [ + "simd-adler32", + ] + +-[[package]] +-name = "zune-jpeg" +-version = "0.4.21" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +-dependencies = [ +- "zune-core 0.4.12", +-] +- + [[package]] + name = "zune-jpeg" + version = "0.5.12" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" + dependencies = [ +- "zune-core 0.5.1", ++ "zune-core", + ] +diff --git a/Cargo.toml b/Cargo.toml +index 254d4bb..998fdd6 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -4,13 +4,16 @@ version = "0.1.0" + edition = "2021" + + [dependencies] +-bevy = { version = "0.18.0", features = ["wayland"] } ++bevy = { version = "0.18.1", features = ["wayland"] } + noise = "0.9.0" + rand = "0.10.0" +-bevy_rand = { version = "0.14.0", features = ["wyrand"] } +-image = "0.25.9" +-bevy_platform = "0.18.0" ++bevy_rand = { version = "0.14.2", features = ["wyrand"] } ++image = "0.25.10" ++bevy_platform = "0.18.1" + rayon = "1.11.0" ++rustc-hash = "2.1.1" ++ahash = "0.8.12" ++nohash-hasher = "0.2.0" + + # Enable max optimizations for dependencies, but not for our code: + [profile.dev.package."*"] +diff --git a/src/constants.rs b/src/constants.rs +index a0c34b2..853a18f 100644 +--- a/src/constants.rs ++++ b/src/constants.rs +@@ -3,3 +3,13 @@ pub const TILE_PIXELS: u32 = 16; + pub const TILE_SIZE: f32 = TILE_PIXELS as f32 * PIXEL_RATIO; + pub const ITILE_SIZE: i32 = TILE_SIZE as i32; + pub const SEED: u32 = 420; ++ ++// Pathfinding tier thresholds (in tiles) ++pub const PATHFINDER_TIER0_MAX_TILES: i32 = 10; // Very short paths: Vec-based ++pub const PATHFINDER_TIER1_MAX_TILES: i32 = 30; // Short paths: AHashMap scratchpad ++pub const PATHFINDER_TIER2_MAX_TILES: i32 = 100; // Medium paths: AHashMap scratchpad ++ // TIER3: > 100 tiles → Chunk waypoints + async ++ ++// Pathfinding configuration ++pub const PATHFINDER_MAX_NODES: usize = 5000; // Max nodes before partial path ++pub const PATHFINDER_ASYNC_THRESHOLD_TILES: i32 = 150; // Start async for very long paths +diff --git a/src/entities/item/prefabs/misc/misc_prefabs.rs b/src/entities/item/prefabs/misc/misc_prefabs.rs +index 39d9e16..f5d9706 100644 +--- a/src/entities/item/prefabs/misc/misc_prefabs.rs ++++ b/src/entities/item/prefabs/misc/misc_prefabs.rs +@@ -41,15 +41,7 @@ pub fn spawn_prefab( + }, + }) + .id(); +- let mut items = tilemap +- .item_tiles +- .get(&position.as_ivec3()) +- .unwrap_or(&Vec::new()) +- .clone(); +- items.push(meat.index_u32()); +- tilemap +- .item_tiles +- .insert(position.as_ivec3(), items.clone()); ++ tilemap.insert_item(position.as_ivec3(), meat.index_u32()); + return commands + .entity(meat) + .insert(VisibleGameEntity) +@@ -76,15 +68,7 @@ pub fn spawn_prefab( + }, + }) + .id(); +- let mut items = tilemap +- .item_tiles +- .get(&position.as_ivec3()) +- .unwrap_or(&Vec::new()) +- .clone(); +- items.push(coin.index_u32()); +- tilemap +- .item_tiles +- .insert(position.as_ivec3(), items.clone()); ++ tilemap.insert_item(position.as_ivec3(), coin.index_u32()); + commands + .entity(coin) + .insert(VisibleGameEntity) +diff --git a/src/entities/item/systems.rs b/src/entities/item/systems.rs +index 5bc0eef..fc3f536 100644 +--- a/src/entities/item/systems.rs ++++ b/src/entities/item/systems.rs +@@ -116,13 +116,13 @@ pub fn item_tile_management_system( + + for position in positions { + let items = match tilemap.item_tiles.get(&position) { +- Some(i) => i, ++ Some(i) => i.clone(), + None => continue, + }; + + // Clean up empty tiles + if items.is_empty() { +- tilemap.item_tiles.remove(&position); ++ tilemap.remove_item(&position); + rotation_timer.current_indices.remove(&position); + continue; + } +@@ -146,8 +146,8 @@ pub fn item_tile_management_system( + .copied() + .unwrap_or(0); + +- for &entity_id in items { +- if let Some(entity) = Entity::from_raw_u32(entity_id) { ++ for entity_id in &items { ++ if let Some(entity) = Entity::from_raw_u32(*entity_id) { + if let Ok(mut rotation_state) = item_query.get_mut(entity) { + rotation_state.should_be_visible = false; + } +diff --git a/src/entities/shared_components/ambulatory.rs b/src/entities/shared_components/ambulatory.rs +index 8c7ae65..5b41470 100644 +--- a/src/entities/shared_components/ambulatory.rs ++++ b/src/entities/shared_components/ambulatory.rs +@@ -9,3 +9,21 @@ pub struct Ambulatory { + pub target: Option, + pub step_recovery: u32, + } ++ ++#[derive(Component)] ++pub struct PendingPath { ++ pub start: IVec3, ++ pub goal: IVec3, ++ pub waypoint_path: Vec, ++ pub request_id: u64, ++} ++ ++#[derive(Resource, Default)] ++pub struct PathRequestCounter { ++ pub next_id: u64, ++} ++ ++#[derive(Resource, Default)] ++pub struct CompletedPaths { ++ pub paths: Vec<(u64, Vec)>, ++} +diff --git a/src/entities/shared_systems/pathfinding.rs b/src/entities/shared_systems/pathfinding.rs +index ee8c897..11f22c6 100644 +--- a/src/entities/shared_systems/pathfinding.rs ++++ b/src/entities/shared_systems/pathfinding.rs +@@ -1,15 +1,81 @@ +-use crate::constants::TILE_SIZE; ++use ahash::AHashMap; ++use ahash::AHashSet; ++use bevy::prelude::*; ++use rayon::prelude::*; ++use rustc_hash::FxHashMap; ++use rustc_hash::FxHashSet as HashSet; ++use std::{cell::RefCell, collections::BinaryHeap, time::Instant}; ++ ++// Thread-local storage for collecting metrics during parallel execution ++thread_local! { ++ static LOCAL_PATH_TIMES: RefCell> = const{ RefCell::new(Vec::new()) } ; ++ static LOCAL_PATH_LENGTHS: RefCell> = const{ RefCell::new(Vec::new()) }; ++ static LOCAL_NODES_EXPANDED: RefCell> = const{ RefCell::new(Vec::new()) }; ++ static LOCAL_FAILED_PATHS: RefCell = const{ RefCell::new(0) }; ++} ++ ++// Thread-local scratchpad for memory reuse (eliminates allocation overhead) ++// Cleared before each use but retains allocated capacity ++thread_local! { ++ static SCRATCH_G_SCORES_FX: RefCell> = RefCell::new(FxHashMap::default()); ++ static SCRATCH_CAME_FROM_FX: RefCell> = RefCell::new(FxHashMap::default()); ++ static SCRATCH_CLOSED_SET_FX: RefCell> = RefCell::new(HashSet::default()); ++ static SCRATCH_IN_OPEN_FX: RefCell> = RefCell::new(HashSet::default()); ++ static SCRATCH_G_SCORES_AH: RefCell> = RefCell::new(AHashMap::default()); ++ static SCRATCH_CAME_FROM_AH: RefCell> = RefCell::new(AHashMap::default()); ++ static SCRATCH_CLOSED_SET_AH: RefCell> = RefCell::new(AHashSet::default()); ++ static SCRATCH_IN_OPEN_AH: RefCell> = RefCell::new(AHashSet::default()); ++ static SCRATCH_TIER0_G_POS: RefCell> = RefCell::new(Vec::with_capacity(256)); ++ static SCRATCH_TIER0_G_VAL: RefCell> = RefCell::new(Vec::with_capacity(256)); ++ static SCRATCH_TIER0_CF_POS: RefCell> = RefCell::new(Vec::with_capacity(256)); ++ static SCRATCH_TIER0_CF_PREV: RefCell> = RefCell::new(Vec::with_capacity(256)); ++ static SCRATCH_TIER0_CLOSED: RefCell> = RefCell::new(Vec::with_capacity(256)); ++} ++ ++use crate::constants::{ ++ ITILE_SIZE, PATHFINDER_ASYNC_THRESHOLD_TILES, PATHFINDER_MAX_NODES, PATHFINDER_TIER0_MAX_TILES, ++ PATHFINDER_TIER1_MAX_TILES, PATHFINDER_TIER2_MAX_TILES, TILE_SIZE, ++}; + use crate::world::tiles::TileMap; + use crate::world::{chunks::ChunkMap, chunks::CHUNK_SIZE}; + use crate::{constants::*, entities::shared_components::Ambulatory}; + use bevy::{math::ivec3, prelude::*}; + use bevy_rand::prelude::*; + use rand::RngExt; +-use std::{ +- collections::{BinaryHeap, HashMap, HashSet}, +- process::exit, +-}; + ++/// Maximum nodes to expand before giving up (prevents runaway searches) ++const MAX_NODES: usize = 10000; ++ ++const ALLOWED_MOVES: [IVec3; 24] = [ ++ //Orthogonal moves ++ IVec3::new(-ITILE_SIZE, 0, 0), ++ IVec3::new(ITILE_SIZE, 0, 0), ++ IVec3::new(0, -ITILE_SIZE, 0), ++ IVec3::new(0, ITILE_SIZE, 0), ++ // Diagonal moves ++ IVec3::new(-ITILE_SIZE, -ITILE_SIZE, 0), ++ IVec3::new(-ITILE_SIZE, ITILE_SIZE, 0), ++ IVec3::new(ITILE_SIZE, -ITILE_SIZE, 0), ++ IVec3::new(ITILE_SIZE, ITILE_SIZE, 0), ++ // Diagonal with vertical moves ++ IVec3::new(-ITILE_SIZE, 0, ITILE_SIZE), ++ IVec3::new(-ITILE_SIZE, 0, -ITILE_SIZE), ++ IVec3::new(ITILE_SIZE, 0, ITILE_SIZE), ++ IVec3::new(ITILE_SIZE, 0, -ITILE_SIZE), ++ IVec3::new(0, -ITILE_SIZE, ITILE_SIZE), ++ IVec3::new(0, -ITILE_SIZE, -ITILE_SIZE), ++ IVec3::new(0, ITILE_SIZE, ITILE_SIZE), ++ IVec3::new(0, ITILE_SIZE, -ITILE_SIZE), ++ // Full 3D diagonal moves ++ IVec3::new(-ITILE_SIZE, -ITILE_SIZE, ITILE_SIZE), ++ IVec3::new(-ITILE_SIZE, -ITILE_SIZE, -ITILE_SIZE), ++ IVec3::new(-ITILE_SIZE, ITILE_SIZE, ITILE_SIZE), ++ IVec3::new(-ITILE_SIZE, ITILE_SIZE, -ITILE_SIZE), ++ IVec3::new(ITILE_SIZE, -ITILE_SIZE, ITILE_SIZE), ++ IVec3::new(ITILE_SIZE, -ITILE_SIZE, -ITILE_SIZE), ++ IVec3::new(ITILE_SIZE, ITILE_SIZE, ITILE_SIZE), ++ IVec3::new(ITILE_SIZE, ITILE_SIZE, -ITILE_SIZE), ++]; + #[derive(Clone, Eq, PartialEq, Debug)] + struct PathNode { + position: IVec3, +@@ -28,15 +94,122 @@ impl PartialOrd for PathNode { + Some(self.cmp(other)) + } + } ++/// Benchmark statistics for pathfinding performance analysis. ++/// Results are written to CSV on F8 keypress for comparison. ++#[derive(Resource, Default)] ++pub struct PathfindingBenchmark { ++ // Per-path metrics (collected via thread-local, merged at end) ++ pub path_calc_times_us: Vec, ++ pub path_lengths: Vec, ++ pub nodes_expanded: Vec, ++ ++ // System-level metrics ++ pub movement_system_times_us: Vec, ++ pub wander_system_times_us: Vec, ++ ++ // Counters ++ pub total_paths_calculated: u64, ++ pub total_failed_paths: u64, ++ ++ // Reporting config ++ pub report_every_n: u32, ++ pub sample_count: u32, ++} ++ ++impl PathfindingBenchmark { ++ pub fn new(report_every_n: u32) -> Self { ++ Self { ++ report_every_n, ++ ..Default::default() ++ } ++ } ++} ++ ++/// Individual path calculation metrics (returned from benchmarked function) ++#[derive(Clone, Debug)] ++pub struct PathMetrics { ++ pub duration_us: u128, ++ pub path_length: usize, ++ pub nodes_expanded: usize, ++ pub success: bool, ++} ++ ++/// CSV output row for benchmark comparison ++#[derive(Debug, Clone)] ++pub struct BenchmarkRow { ++ pub timestamp_ms: u128, ++ pub path_duration_us: u128, ++ pub path_length: usize, ++ pub nodes_expanded: usize, ++ pub success: bool, ++} + + pub struct PathfindingPlugin; + + impl Plugin for PathfindingPlugin { + fn build(&self, app: &mut App) { +- app.add_systems(FixedUpdate, (update_wandering_targets, movement).chain()); ++ app.insert_resource(PathfindingBenchmark::new(100)) ++ .insert_resource(crate::entities::shared_components::CompletedPaths::default()) ++ .insert_resource(crate::entities::shared_components::PathRequestCounter::default()) ++ .add_systems(FixedUpdate, (update_wandering_targets, movement).chain()) ++ .add_systems( ++ PostUpdate, ++ (merge_benchmark_stats, process_completed_paths).chain(), ++ ) ++ .add_systems(Update, bench_report_system); ++ } ++} ++ ++pub fn process_completed_paths( ++ mut completed: ResMut, ++ mut query: Query<( ++ Entity, ++ &mut crate::entities::shared_components::Ambulatory, ++ &mut crate::entities::shared_components::PendingPath, ++ )>, ++ mut commands: Commands, ++) { ++ for (request_id, path) in completed.paths.drain(..) { ++ for (entity, mut ambulatory, pending) in query.iter_mut() { ++ if pending.request_id == request_id { ++ ambulatory.current_path = Some(path.clone()); ++ commands ++ .entity(entity) ++ .remove::(); ++ } ++ } + } + } + ++/// Merge thread-local benchmark stats into the global resource. ++/// This must run after all parallel work is complete. ++pub fn merge_benchmark_stats(mut bench: ResMut) { ++ LOCAL_PATH_TIMES.with(|t| { ++ let mut times = t.borrow_mut(); ++ bench.path_calc_times_us.extend(times.iter()); ++ bench.total_paths_calculated += times.len() as u64; ++ times.clear(); ++ }); ++ ++ LOCAL_PATH_LENGTHS.with(|l| { ++ let mut lengths = l.borrow_mut(); ++ bench.path_lengths.extend(lengths.iter()); ++ lengths.clear(); ++ }); ++ ++ LOCAL_NODES_EXPANDED.with(|n| { ++ let mut nodes = n.borrow_mut(); ++ bench.nodes_expanded.extend(nodes.iter()); ++ nodes.clear(); ++ }); ++ ++ LOCAL_FAILED_PATHS.with(|f| { ++ let mut failed = f.borrow_mut(); ++ bench.total_failed_paths += *failed; ++ *failed = 0; ++ }); ++} ++ + pub fn update_wandering_targets( + mut query: Query<(&mut Ambulatory, &Transform)>, // add a 'with' here when behaviours are implemented + tilemap: Res, +@@ -104,7 +277,7 @@ pub fn movement(mut query: Query<(&mut Ambulatory, &mut Transform)>, tilemap: Re + if let Some(target) = ambulatory.target { + // Calculate path if needed + if ambulatory.current_path.is_none() { +- ambulatory.current_path = Some(calculate_path( ++ ambulatory.current_path = Some(calculate_path_benchmarked( + &tilemap, + transform.translation.as_ivec3(), + target.as_ivec3() - ivec3(0, 0, 1), +@@ -147,53 +320,49 @@ pub fn movement(mut query: Query<(&mut Ambulatory, &mut Transform)>, tilemap: Re + } + }); + } +- + fn is_standable_tile(tilemap: &TileMap, pos: IVec3) -> bool { + let mut can_i_stand_in_tile: bool = false; + let mut can_i_stand_on_tile_bellow: bool = false; + let mut can_i_stand_in_fixture: bool = false; + let mut can_i_stand_on_fixture_bellow: bool = false; + +- // Check if current position has a blocking floor tile + if let Some(current_floor_tile) = tilemap.floor_tiles.get(&pos) { +- can_i_stand_in_tile = current_floor_tile.1; ++ can_i_stand_in_tile = current_floor_tile.can_stand_in(); + } +- // Check if current position has a solid fixture tile (e.g., log) + if let Some(current_fixture_tile) = tilemap.fixture_tiles.get(&pos) { +- can_i_stand_in_fixture = current_fixture_tile.1; ++ can_i_stand_in_fixture = current_fixture_tile.can_stand_in(); + } + +- // Check if there's solid ground below (fixture or floor) + let pos_below = pos - IVec3::new(0, 0, ITILE_SIZE); + + if let Some(below_floor_tile) = tilemap.floor_tiles.get(&pos_below) { +- can_i_stand_on_tile_bellow = below_floor_tile.2; ++ can_i_stand_on_tile_bellow = below_floor_tile.can_stand_on(); + } + + if let Some(below_fixture_tile) = tilemap.fixture_tiles.get(&pos_below) { +- can_i_stand_on_fixture_bellow = below_fixture_tile.2; ++ can_i_stand_on_fixture_bellow = below_fixture_tile.can_stand_on(); + } +- return (can_i_stand_in_tile || can_i_stand_in_fixture) +- && (can_i_stand_on_tile_bellow || can_i_stand_on_fixture_bellow); ++ (can_i_stand_in_tile || can_i_stand_in_fixture) ++ && (can_i_stand_on_tile_bellow || can_i_stand_on_fixture_bellow) + } + ++/// Original calculate_path - kept for reference, not currently used. ++/// Use calculate_path_benchmarked for actual gameplay. ++#[allow(dead_code)] + fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { +- if !is_standable_tile(tilemap, start) { +- println!("Start pos invalid: {}", start); +- println!("Bugger (1)"); +- exit(0); +- } +- if !is_standable_tile(tilemap, goal) { +- println!("Goal pos invalid: {}", goal); +- println!("Bugger (2)"); +- exit(0); ++ // Graceful failure instead of exit(0) ++ if !is_standable_tile(tilemap, start) || !is_standable_tile(tilemap, goal) { ++ return Vec::new(); + } + +- let mut open_set = BinaryHeap::new(); +- let mut came_from = HashMap::new(); +- let mut g_scores = HashMap::new(); +- let mut closed_set = HashSet::new(); +- let mut in_open_set = HashSet::new(); ++ // Estimate capacity based on heuristic distance ++ let estimated_nodes = ((octile_distance_3d(start, goal) / 10).max(64) as usize).min(2048); ++ ++ let mut open_set = BinaryHeap::with_capacity(estimated_nodes); ++ let mut came_from = FxHashMap::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ let mut g_scores = FxHashMap::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ let mut closed_set = HashSet::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ let mut in_open_set = HashSet::with_capacity_and_hasher(estimated_nodes, Default::default()); + + let start_node = PathNode { + position: start, +@@ -205,7 +374,8 @@ fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { + in_open_set.insert(start); + g_scores.insert(start, 0); + +- let allowed_moves = vec![ ++ // Static move vectors - computed once ++ const ALLOWED_MOVES: [IVec3; 24] = [ + // Orthogonal moves + IVec3::new(-ITILE_SIZE, 0, 0), + IVec3::new(ITILE_SIZE, 0, 0), +@@ -216,7 +386,7 @@ fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { + IVec3::new(-ITILE_SIZE, ITILE_SIZE, 0), + IVec3::new(ITILE_SIZE, -ITILE_SIZE, 0), + IVec3::new(ITILE_SIZE, ITILE_SIZE, 0), +- // Diagonal with vertical moves (left/negative preference) ++ // Diagonal with vertical moves + IVec3::new(-ITILE_SIZE, 0, ITILE_SIZE), + IVec3::new(-ITILE_SIZE, 0, -ITILE_SIZE), + IVec3::new(ITILE_SIZE, 0, ITILE_SIZE), +@@ -242,13 +412,12 @@ fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { + in_open_set.remove(¤t); + + if current == goal { +- // println!("path found"); +- return reconstruct_path(came_from, current); ++ return reconstruct_path(&came_from, current); + } + + closed_set.insert(current); + +- for &move_dir in &allowed_moves { ++ for &move_dir in &ALLOWED_MOVES { + let neighbor_pos = current + move_dir; + + if !is_standable_tile(tilemap, neighbor_pos) || closed_set.contains(&neighbor_pos) { +@@ -272,12 +441,8 @@ fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { + // 2D Movement (Dwarf Fortress style) + (1, 0, 0) | (0, 1, 0) => 10, // Orthogonal movement + (1, 1, 0) => 14, // Diagonal movement (~√2 × 10) +- +- // Vertical Movement (Raw climbing - very expensive) +- // (0, 0, 1) => 50, // Pure vertical climb/fall +- + // 3D Movement (Climbing diagonally - even more expensive) +- (1, 0, 1) | (0, 1, 1) => 52, // Orthogonal + vertical climb ++ (1, 0, 1) | (0, 1, 1) => 42, // Orthogonal + vertical climb + (1, 1, 1) => 56, // Diagonal + vertical climb + + // TODO: Implement stairs and ramps for efficient vertical movement +@@ -294,7 +459,7 @@ fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { + _ => continue, + }; + +- let new_g = g_scores.get(¤t).unwrap_or(&i32::MAX) + movement_cost; ++ let new_g = *g_scores.get(¤t).unwrap_or(&i32::MAX) + movement_cost; + + if new_g < *g_scores.get(&neighbor_pos).unwrap_or(&i32::MAX) { + came_from.insert(neighbor_pos, current); +@@ -302,7 +467,6 @@ fn calculate_path(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { + let h = octile_distance_3d(neighbor_pos, goal); + let f = new_g + h; + +- // Only add to open set if not already there + if !in_open_set.contains(&neighbor_pos) { + let neighbor_node = PathNode { + position: neighbor_pos, +@@ -362,7 +526,7 @@ fn octile_distance_3d(a: IVec3, b: IVec3) -> i32 { + } + } + +-fn reconstruct_path(came_from: HashMap, mut current: IVec3) -> Vec { ++fn reconstruct_path(came_from: &FxHashMap, mut current: IVec3) -> Vec { + let mut path = vec![Vec3::new( + current.x as f32, + current.y as f32, +@@ -381,3 +545,1080 @@ fn reconstruct_path(came_from: HashMap, mut current: IVec3) -> Vec + path.reverse(); + path + } ++ ++/// Benchmark reporting system - press F8 to dump stats to console and CSV ++pub fn bench_report_system( ++ keys: Res>, ++ mut bench: ResMut, ++) { ++ if keys.just_pressed(KeyCode::F8) { ++ println!("\n=== PATHFINDING BENCHMARK REPORT ==="); ++ report_stat("path_calc", &bench.path_calc_times_us); ++ report_stat( ++ "path_length", ++ &bench ++ .path_lengths ++ .iter() ++ .map(|&l| l as u128) ++ .collect::>(), ++ ); ++ report_stat( ++ "nodes_expanded", ++ &bench ++ .nodes_expanded ++ .iter() ++ .map(|&n| n as u128) ++ .collect::>(), ++ ); ++ ++ if !bench.movement_system_times_us.is_empty() { ++ report_stat("movement_system", &bench.movement_system_times_us); ++ } ++ if !bench.wander_system_times_us.is_empty() { ++ report_stat("wander_system", &bench.wander_system_times_us); ++ } ++ ++ let total = bench.total_paths_calculated; ++ let failed = bench.total_failed_paths; ++ println!( ++ "[BENCH] total_paths={} failed_paths={} success_rate={:.1}%", ++ total, ++ failed, ++ if total > 0 { ++ 100.0 * (total - failed) as f64 / total as f64 ++ } else { ++ 100.0 ++ } ++ ); ++ ++ // Write CSV to file ++ if let Err(e) = write_benchmark_csv(&bench, "pathfinding_benchmark_baseline.csv") { ++ eprintln!("Failed to write benchmark CSV: {}", e); ++ } ++ ++ println!("=====================================\n"); ++ } ++} ++ ++fn report_stat(label: &str, times: &[u128]) { ++ if times.is_empty() { ++ return; ++ } ++ let sum: u128 = times.iter().sum(); ++ let avg = sum / times.len() as u128; ++ let min = *times.iter().min().unwrap(); ++ let max = *times.iter().max().unwrap(); ++ let mut sorted = times.to_vec(); ++ sorted.sort_unstable(); ++ let median = sorted[sorted.len() / 2]; ++ let p95_idx = (sorted.len() as f64 * 0.95) as usize; ++ let p95 = sorted[p95_idx.min(sorted.len().saturating_sub(1))]; ++ ++ println!( ++ "[BENCH][{}] n={} avg={}us median={}us min={}us max={}us p95={}us", ++ label, ++ times.len(), ++ avg, ++ median, ++ min, ++ max, ++ p95 ++ ); ++} ++ ++fn write_benchmark_csv(bench: &PathfindingBenchmark, filename: &str) -> std::io::Result<()> { ++ use std::fs::File; ++ use std::io::Write; ++ ++ let mut file = File::create(filename)?; ++ writeln!( ++ file, ++ "sample,path_duration_us,path_length,nodes_expanded,success" ++ )?; ++ ++ let n = bench.path_calc_times_us.len(); ++ for i in 0..n { ++ let duration = bench.path_calc_times_us.get(i).copied().unwrap_or(0); ++ let length = bench.path_lengths.get(i).copied().unwrap_or(0); ++ let nodes = bench.nodes_expanded.get(i).copied().unwrap_or(0); ++ let success = i < (n - bench.total_failed_paths as usize); ++ writeln!(file, "{},{},{},{},{}", i, duration, length, nodes, success)?; ++ } ++ ++ // Summary stats at the end ++ writeln!(file, "# Summary")?; ++ if !bench.path_calc_times_us.is_empty() { ++ let avg: u128 = ++ bench.path_calc_times_us.iter().sum::() / bench.path_calc_times_us.len() as u128; ++ writeln!(file, "# avg_duration_us,{}", avg)?; ++ } ++ writeln!(file, "# total_paths,{}", bench.total_paths_calculated)?; ++ writeln!(file, "# failed_paths,{}", bench.total_failed_paths)?; ++ ++ Ok(()) ++} ++ ++fn calculate_movement_cost(move_dir: IVec3) -> i32 { ++ match ( ++ move_dir.x.abs() / ITILE_SIZE, ++ move_dir.y.abs() / ITILE_SIZE, ++ move_dir.z.abs() / ITILE_SIZE, ++ ) { ++ (1, 0, 0) | (0, 1, 0) => 10, ++ (1, 1, 0) => 14, ++ (1, 0, 1) | (0, 1, 1) => 52, ++ (1, 1, 1) => 56, ++ _ => 0, ++ } ++} ++ ++fn calculate_path_tier0(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ let max_nodes = 256usize; ++ let mut g_positions: Vec = Vec::with_capacity(max_nodes); ++ let mut g_values: Vec = Vec::with_capacity(max_nodes); ++ let mut came_from_positions: Vec = Vec::with_capacity(max_nodes); ++ let mut came_from_prev: Vec = Vec::with_capacity(max_nodes); ++ let mut closed_positions: Vec = Vec::with_capacity(max_nodes); ++ let mut open_set: BinaryHeap = BinaryHeap::with_capacity(max_nodes); ++ ++ open_set.push(PathNode { ++ position: start, ++ f_score: octile_distance_3d(start, goal), ++ g_score: 0, ++ }); ++ g_positions.push(start); ++ g_values.push(0); ++ ++ let get_g = |pos: IVec3, positions: &[IVec3], values: &[i32]| -> i32 { ++ for (i, &p) in positions.iter().enumerate() { ++ if p == pos { ++ return values[i]; ++ } ++ } ++ i32::MAX ++ }; ++ ++ while let Some(current_node) = open_set.pop() { ++ let current = current_node.position; ++ ++ if current == goal { ++ let mut path = vec![Vec3::new( ++ current.x as f32, ++ current.y as f32, ++ current.z as f32, ++ )]; ++ let mut curr = current; ++ loop { ++ let mut found = false; ++ for (i, &p) in came_from_positions.iter().enumerate() { ++ if p == curr { ++ let prev = came_from_prev[i]; ++ path.push(Vec3::new(prev.x as f32, prev.y as f32, prev.z as f32)); ++ curr = prev; ++ found = true; ++ break; ++ } ++ } ++ if !found { ++ break; ++ } ++ } ++ path.reverse(); ++ return path; ++ } ++ ++ if closed_positions.len() > 500 { ++ return vec![Vec3::new(start.x as f32, start.y as f32, start.z as f32)]; ++ } ++ ++ closed_positions.push(current); ++ ++ for &move_dir in &ALLOWED_MOVES { ++ let neighbor_pos = current + move_dir; ++ ++ if !is_standable_tile(tilemap, neighbor_pos) ++ || closed_positions.iter().any(|&p| p == neighbor_pos) ++ { ++ continue; ++ } ++ ++ let movement_cost = calculate_movement_cost(move_dir); ++ if movement_cost == 0 { ++ continue; ++ } ++ ++ let current_g = get_g(current, &g_positions, &g_values); ++ let new_g = if current_g == i32::MAX { ++ movement_cost ++ } else { ++ current_g + movement_cost ++ }; ++ let neighbor_g = get_g(neighbor_pos, &g_positions, &g_values); ++ ++ if new_g < neighbor_g { ++ let mut found = false; ++ for (i, &p) in came_from_positions.iter().enumerate() { ++ if p == neighbor_pos { ++ came_from_prev[i] = current; ++ found = true; ++ break; ++ } ++ } ++ if !found { ++ came_from_positions.push(neighbor_pos); ++ came_from_prev.push(current); ++ } ++ ++ let mut g_found = false; ++ for (i, &p) in g_positions.iter().enumerate() { ++ if p == neighbor_pos { ++ g_values[i] = new_g; ++ g_found = true; ++ break; ++ } ++ } ++ if !g_found { ++ g_positions.push(neighbor_pos); ++ g_values.push(new_g); ++ } ++ ++ let h = octile_distance_3d(neighbor_pos, goal); ++ open_set.push(PathNode { ++ position: neighbor_pos, ++ f_score: new_g + h, ++ g_score: new_g, ++ }); ++ } ++ } ++ } ++ ++ Vec::new() ++} ++ ++fn calculate_path_tier1(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ let estimated_nodes = ((octile_distance_3d(start, goal) / 10).max(16) as usize).min(2048); ++ ++ let mut open_set = BinaryHeap::with_capacity(estimated_nodes); ++ let mut came_from = FxHashMap::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ let mut g_scores = FxHashMap::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ let mut closed_set = HashSet::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ let mut in_open_set = HashSet::with_capacity_and_hasher(estimated_nodes, Default::default()); ++ ++ let start_node = PathNode { ++ position: start, ++ f_score: octile_distance_3d(start, goal), ++ g_score: 0, ++ }; ++ ++ open_set.push(start_node); ++ in_open_set.insert(start); ++ g_scores.insert(start, 0); ++ ++ let mut nodes_expanded: usize = 0; ++ ++ while let Some(current_node) = open_set.pop() { ++ let current = current_node.position; ++ ++ in_open_set.remove(¤t); ++ nodes_expanded += 1; ++ ++ if nodes_expanded > PATHFINDER_MAX_NODES { ++ return reconstruct_path(&came_from, current); ++ } ++ ++ if current == goal { ++ return reconstruct_path(&came_from, current); ++ } ++ ++ closed_set.insert(current); ++ ++ for &move_dir in &ALLOWED_MOVES { ++ let neighbor_pos = current + move_dir; ++ ++ if !is_standable_tile(tilemap, neighbor_pos) || closed_set.contains(&neighbor_pos) { ++ continue; ++ } ++ ++ let movement_cost = calculate_movement_cost(move_dir); ++ if movement_cost == 0 { ++ continue; ++ } ++ ++ let new_g = *g_scores.get(¤t).unwrap_or(&i32::MAX) + movement_cost; ++ ++ if new_g < *g_scores.get(&neighbor_pos).unwrap_or(&i32::MAX) { ++ came_from.insert(neighbor_pos, current); ++ g_scores.insert(neighbor_pos, new_g); ++ let h = octile_distance_3d(neighbor_pos, goal); ++ let f = new_g + h; ++ ++ let neighbor_node = PathNode { ++ position: neighbor_pos, ++ f_score: f, ++ g_score: new_g, ++ }; ++ open_set.push(neighbor_node); ++ in_open_set.insert(neighbor_pos); ++ } ++ } ++ } ++ ++ Vec::new() ++} ++ ++fn calculate_path_tier2(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ let estimated_nodes = ((octile_distance_3d(start, goal) / 10).max(64) as usize).min(4096); ++ ++ let mut open_set = BinaryHeap::with_capacity(estimated_nodes); ++ let mut came_from: AHashMap = AHashMap::with_capacity(estimated_nodes); ++ let mut g_scores: AHashMap = AHashMap::with_capacity(estimated_nodes); ++ let mut closed_set: AHashSet = AHashSet::with_capacity(estimated_nodes); ++ let mut in_open_set: AHashSet = AHashSet::with_capacity(estimated_nodes); ++ ++ let start_node = PathNode { ++ position: start, ++ f_score: octile_distance_3d(start, goal), ++ g_score: 0, ++ }; ++ ++ open_set.push(start_node); ++ in_open_set.insert(start); ++ g_scores.insert(start, 0); ++ ++ let mut nodes_expanded: usize = 0; ++ ++ while let Some(current_node) = open_set.pop() { ++ let current = current_node.position; ++ ++ in_open_set.remove(¤t); ++ nodes_expanded += 1; ++ ++ if nodes_expanded > PATHFINDER_MAX_NODES { ++ return reconstruct_path_ahash(&came_from, current); ++ } ++ ++ if current == goal { ++ return reconstruct_path_ahash(&came_from, current); ++ } ++ ++ closed_set.insert(current); ++ ++ for &move_dir in &ALLOWED_MOVES { ++ let neighbor_pos = current + move_dir; ++ ++ if !is_standable_tile(tilemap, neighbor_pos) || closed_set.contains(&neighbor_pos) { ++ continue; ++ } ++ ++ let movement_cost = calculate_movement_cost(move_dir); ++ if movement_cost == 0 { ++ continue; ++ } ++ ++ let new_g = *g_scores.get(¤t).unwrap_or(&i32::MAX) + movement_cost; ++ ++ if new_g < *g_scores.get(&neighbor_pos).unwrap_or(&i32::MAX) { ++ came_from.insert(neighbor_pos, current); ++ g_scores.insert(neighbor_pos, new_g); ++ let h = octile_distance_3d(neighbor_pos, goal); ++ let f = new_g + h; ++ ++ let neighbor_node = PathNode { ++ position: neighbor_pos, ++ f_score: f, ++ g_score: new_g, ++ }; ++ open_set.push(neighbor_node); ++ in_open_set.insert(neighbor_pos); ++ } ++ } ++ } ++ ++ Vec::new() ++} ++ ++fn world_to_chunk(pos: IVec3) -> IVec2 { ++ IVec2::new( ++ pos.x.div_euclid(CHUNK_SIZE * ITILE_SIZE), ++ pos.y.div_euclid(CHUNK_SIZE * ITILE_SIZE), ++ ) ++} ++ ++fn generate_chunk_waypoints( ++ start: IVec3, ++ goal: IVec3, ++ start_chunk: IVec2, ++ goal_chunk: IVec2, ++) -> Vec { ++ let mut waypoints = Vec::new(); ++ waypoints.push(start); ++ ++ let dx = goal_chunk.x - start_chunk.x; ++ let dy = goal_chunk.y - start_chunk.y; ++ let steps = dx.abs().max(dy.abs()); ++ ++ if steps > 1 { ++ for i in 1..steps { ++ let t = i as f32 / steps as f32; ++ let chunk_x = start_chunk.x as f32 + t * dx as f32; ++ let chunk_y = start_chunk.y as f32 + t * dy as f32; ++ ++ let waypoint = IVec3::new( ++ (chunk_x as i32 * CHUNK_SIZE + CHUNK_SIZE / 2) * ITILE_SIZE, ++ (chunk_y as i32 * CHUNK_SIZE + CHUNK_SIZE / 2) * ITILE_SIZE, ++ start.z, ++ ); ++ waypoints.push(waypoint); ++ } ++ } ++ ++ waypoints.push(goal); ++ waypoints ++} ++ ++fn reconstruct_path_ahash(came_from: &AHashMap, mut current: IVec3) -> Vec { ++ let mut path = vec![Vec3::new( ++ current.x as f32, ++ current.y as f32, ++ current.z as f32, ++ )]; ++ ++ while let Some(&previous) = came_from.get(¤t) { ++ path.push(Vec3::new( ++ previous.x as f32, ++ previous.y as f32, ++ previous.z as f32, ++ )); ++ current = previous; ++ } ++ ++ path.reverse(); ++ path ++} ++ ++fn calculate_path_tier3(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ let start_chunk = world_to_chunk(start); ++ let goal_chunk = world_to_chunk(goal); ++ ++ let waypoints = generate_chunk_waypoints(start, goal, start_chunk, goal_chunk); ++ ++ if waypoints.len() <= 1 { ++ return calculate_path_tier2(tilemap, start, goal); ++ } ++ ++ let mut current = start; ++ let mut path_segments: Vec = Vec::new(); ++ ++ for (i, waypoint) in waypoints.iter().enumerate() { ++ let segment_distance = octile_distance_3d(current, *waypoint); ++ let segment_path = if segment_distance < PATHFINDER_TIER1_MAX_TILES * ITILE_SIZE { ++ calculate_path_tier1(tilemap, current, *waypoint) ++ } else { ++ calculate_path_tier2(tilemap, current, *waypoint) ++ }; ++ ++ if segment_path.is_empty() { ++ break; ++ } ++ ++ if i > 0 && !path_segments.is_empty() { ++ path_segments.pop(); ++ } ++ path_segments.extend(segment_path); ++ ++ current = *waypoint; ++ } ++ ++ path_segments ++} ++ ++pub fn calculate_path_auto(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ if !is_standable_tile(tilemap, start) || !is_standable_tile(tilemap, goal) { ++ return Vec::new(); ++ } ++ ++ let estimated_tiles = octile_distance_3d(start, goal) / ITILE_SIZE; ++ ++ let result = if estimated_tiles < PATHFINDER_TIER0_MAX_TILES { ++ calculate_path_tier0(tilemap, start, goal) ++ } else if estimated_tiles < PATHFINDER_TIER1_MAX_TILES { ++ calculate_path_tier1(tilemap, start, goal) ++ } else if estimated_tiles < PATHFINDER_TIER2_MAX_TILES { ++ calculate_path_tier2(tilemap, start, goal) ++ } else { ++ calculate_path_tier3(tilemap, start, goal) ++ }; ++ ++ if result.is_empty() { ++ vec![Vec3::new(start.x as f32, start.y as f32, start.z as f32)] ++ } else { ++ result ++ } ++} ++ ++pub fn calculate_path_benchmarked(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ let timer = Instant::now(); ++ let mut nodes_expanded: usize = 0; ++ ++ if !is_standable_tile(tilemap, start) { ++ LOCAL_FAILED_PATHS.with(|f| { ++ *f.borrow_mut() += 1; ++ }); ++ return Vec::new(); ++ } ++ if !is_standable_tile(tilemap, goal) { ++ LOCAL_FAILED_PATHS.with(|f| { ++ *f.borrow_mut() += 1; ++ }); ++ return Vec::new(); ++ } ++ ++ let estimated_tiles = octile_distance_3d(start, goal) / ITILE_SIZE; ++ ++ let (result, tier_nodes) = if estimated_tiles < PATHFINDER_TIER0_MAX_TILES { ++ calculate_path_tier0_with_metrics(tilemap, start, goal) ++ } else if estimated_tiles < PATHFINDER_TIER1_MAX_TILES { ++ calculate_path_tier1_with_metrics(tilemap, start, goal) ++ } else if estimated_tiles < PATHFINDER_TIER2_MAX_TILES { ++ calculate_path_tier2_with_metrics(tilemap, start, goal) ++ } else { ++ calculate_path_tier3_with_metrics(tilemap, start, goal) ++ }; ++ ++ nodes_expanded = tier_nodes; ++ ++ let elapsed = timer.elapsed().as_micros(); ++ let path_len = result.len(); ++ ++ LOCAL_PATH_TIMES.with(|t| { ++ t.borrow_mut().push(elapsed); ++ }); ++ LOCAL_PATH_LENGTHS.with(|l| { ++ l.borrow_mut().push(path_len); ++ }); ++ LOCAL_NODES_EXPANDED.with(|n| { ++ n.borrow_mut().push(nodes_expanded); ++ }); ++ ++ if result.is_empty() { ++ vec![Vec3::new(start.x as f32, start.y as f32, start.z as f32)] ++ } else { ++ result ++ } ++} ++ ++fn calculate_path_tier0_with_metrics( ++ tilemap: &TileMap, ++ start: IVec3, ++ goal: IVec3, ++) -> (Vec, usize) { ++ // Use scratchpad for TIER0 - no HashMap overhead, linear search in cached arrays ++ SCRATCH_TIER0_G_POS.with(|sgp| { ++ SCRATCH_TIER0_G_VAL.with(|sgv| { ++ SCRATCH_TIER0_CF_POS.with(|scp| { ++ SCRATCH_TIER0_CF_PREV.with(|scpr| { ++ SCRATCH_TIER0_CLOSED.with(|scl| { ++ let mut g_positions = sgp.borrow_mut(); ++ let mut g_values = sgv.borrow_mut(); ++ let mut came_from_positions = scp.borrow_mut(); ++ let mut came_from_prev = scpr.borrow_mut(); ++ let mut closed_positions = scl.borrow_mut(); ++ ++ g_positions.clear(); ++ g_values.clear(); ++ came_from_positions.clear(); ++ came_from_prev.clear(); ++ closed_positions.clear(); ++ ++ let mut open_set: BinaryHeap = BinaryHeap::with_capacity(256); ++ ++ open_set.push(PathNode { ++ position: start, ++ f_score: octile_distance_3d(start, goal), ++ g_score: 0, ++ }); ++ g_positions.push(start); ++ g_values.push(0); ++ ++ let mut nodes_expanded: usize = 0; ++ ++ while let Some(current_node) = open_set.pop() { ++ let current = current_node.position; ++ nodes_expanded += 1; ++ ++ if nodes_expanded > 300 { ++ let mut path = vec![Vec3::new( ++ current.x as f32, ++ current.y as f32, ++ current.z as f32, ++ )]; ++ for (i, &pos) in came_from_positions.iter().enumerate() { ++ if pos == current { ++ let mut prev = came_from_prev[i]; ++ loop { ++ path.push(Vec3::new( ++ prev.x as f32, ++ prev.y as f32, ++ prev.z as f32, ++ )); ++ let mut found = false; ++ for (j, &p) in came_from_positions.iter().enumerate() { ++ if p == prev { ++ prev = came_from_prev[j]; ++ found = true; ++ break; ++ } ++ } ++ if !found { ++ break; ++ } ++ } ++ path.reverse(); ++ return (path, nodes_expanded); ++ } ++ } ++ return ( ++ vec![Vec3::new(start.x as f32, start.y as f32, start.z as f32)], ++ nodes_expanded, ++ ); ++ } ++ ++ if current == goal { ++ let mut path = vec![Vec3::new( ++ current.x as f32, ++ current.y as f32, ++ current.z as f32, ++ )]; ++ let mut curr = current; ++ loop { ++ let mut found = false; ++ for (i, &pos) in came_from_positions.iter().enumerate() { ++ if pos == curr { ++ let prev = came_from_prev[i]; ++ path.push(Vec3::new( ++ prev.x as f32, ++ prev.y as f32, ++ prev.z as f32, ++ )); ++ curr = prev; ++ found = true; ++ break; ++ } ++ } ++ if !found { ++ break; ++ } ++ } ++ path.reverse(); ++ return (path, nodes_expanded); ++ } ++ ++ closed_positions.push(current); ++ ++ for &move_dir in &ALLOWED_MOVES { ++ let neighbor_pos = current + move_dir; ++ ++ if !is_standable_tile(tilemap, neighbor_pos) ++ || closed_positions.iter().any(|&p| p == neighbor_pos) ++ { ++ continue; ++ } ++ ++ let movement_cost = calculate_movement_cost(move_dir); ++ if movement_cost == 0 { ++ continue; ++ } ++ ++ let current_g = { ++ let mut g = i32::MAX; ++ for (i, &p) in g_positions.iter().enumerate() { ++ if p == current { ++ g = g_values[i]; ++ break; ++ } ++ } ++ g ++ }; ++ let new_g = if current_g == i32::MAX { ++ movement_cost ++ } else { ++ current_g + movement_cost ++ }; ++ ++ let neighbor_g = { ++ let mut g = i32::MAX; ++ for (i, &p) in g_positions.iter().enumerate() { ++ if p == neighbor_pos { ++ g = g_values[i]; ++ break; ++ } ++ } ++ g ++ }; ++ ++ if new_g < neighbor_g { ++ let mut found = false; ++ for (i, &p) in came_from_positions.iter().enumerate() { ++ if p == neighbor_pos { ++ came_from_prev[i] = current; ++ found = true; ++ break; ++ } ++ } ++ if !found { ++ came_from_positions.push(neighbor_pos); ++ came_from_prev.push(current); ++ } ++ ++ let mut g_found = false; ++ for (i, &p) in g_positions.iter().enumerate() { ++ if p == neighbor_pos { ++ g_values[i] = new_g; ++ g_found = true; ++ break; ++ } ++ } ++ if !g_found { ++ g_positions.push(neighbor_pos); ++ g_values.push(new_g); ++ } ++ ++ let h = octile_distance_3d(neighbor_pos, goal); ++ open_set.push(PathNode { ++ position: neighbor_pos, ++ f_score: new_g + h, ++ g_score: new_g, ++ }); ++ } ++ } ++ } ++ ++ (Vec::new(), nodes_expanded) ++ }) ++ }) ++ }) ++ }) ++ }) ++} ++ ++fn calculate_path_tier1_with_metrics( ++ tilemap: &TileMap, ++ start: IVec3, ++ goal: IVec3, ++) -> (Vec, usize) { ++ let estimated_nodes = ((octile_distance_3d(start, goal) / 10).max(16) as usize).min(2048); ++ ++ // Use scratchpad for memory reuse ++ SCRATCH_G_SCORES_AH.with(|sg| { ++ SCRATCH_CAME_FROM_AH.with(|sc| { ++ SCRATCH_CLOSED_SET_AH.with(|scls| { ++ SCRATCH_IN_OPEN_AH.with(|sios| { ++ let mut g_scores = sg.borrow_mut(); ++ let mut came_from = sc.borrow_mut(); ++ let mut closed_set = scls.borrow_mut(); ++ let mut in_open_set = sios.borrow_mut(); ++ ++ // Clear but retain capacity ++ g_scores.clear(); ++ came_from.clear(); ++ closed_set.clear(); ++ in_open_set.clear(); ++ ++ // Reserve capacity if needed ++ if g_scores.capacity() < estimated_nodes { ++ g_scores.reserve(estimated_nodes); ++ came_from.reserve(estimated_nodes); ++ closed_set.reserve(estimated_nodes); ++ in_open_set.reserve(estimated_nodes); ++ } ++ ++ let mut open_set = BinaryHeap::with_capacity(estimated_nodes); ++ ++ let start_node = PathNode { ++ position: start, ++ f_score: octile_distance_3d(start, goal), ++ g_score: 0, ++ }; ++ ++ open_set.push(start_node); ++ in_open_set.insert(start); ++ g_scores.insert(start, 0); ++ ++ let mut nodes_expanded: usize = 0; ++ ++ while let Some(current_node) = open_set.pop() { ++ let current = current_node.position; ++ ++ in_open_set.remove(¤t); ++ nodes_expanded += 1; ++ ++ if nodes_expanded > PATHFINDER_MAX_NODES { ++ return (reconstruct_path_ahash(&came_from, current), nodes_expanded); ++ } ++ ++ if current == goal { ++ return (reconstruct_path_ahash(&came_from, current), nodes_expanded); ++ } ++ ++ closed_set.insert(current); ++ ++ for &move_dir in &ALLOWED_MOVES { ++ let neighbor_pos = current + move_dir; ++ ++ if !is_standable_tile(tilemap, neighbor_pos) ++ || closed_set.contains(&neighbor_pos) ++ { ++ continue; ++ } ++ ++ let movement_cost = calculate_movement_cost(move_dir); ++ if movement_cost == 0 { ++ continue; ++ } ++ ++ let new_g = ++ *g_scores.get(¤t).unwrap_or(&i32::MAX) + movement_cost; ++ ++ if new_g < *g_scores.get(&neighbor_pos).unwrap_or(&i32::MAX) { ++ came_from.insert(neighbor_pos, current); ++ g_scores.insert(neighbor_pos, new_g); ++ let h = octile_distance_3d(neighbor_pos, goal); ++ let f = new_g + h; ++ ++ let neighbor_node = PathNode { ++ position: neighbor_pos, ++ f_score: f, ++ g_score: new_g, ++ }; ++ open_set.push(neighbor_node); ++ in_open_set.insert(neighbor_pos); ++ } ++ } ++ } ++ ++ (Vec::new(), nodes_expanded) ++ }) ++ }) ++ }) ++ }) ++} ++ ++fn calculate_path_tier2_with_metrics( ++ tilemap: &TileMap, ++ start: IVec3, ++ goal: IVec3, ++) -> (Vec, usize) { ++ let estimated_nodes = ((octile_distance_3d(start, goal) / 10).max(64) as usize).min(4096); ++ ++ let mut open_set = BinaryHeap::with_capacity(estimated_nodes); ++ let mut came_from: AHashMap = AHashMap::with_capacity(estimated_nodes); ++ let mut g_scores: AHashMap = AHashMap::with_capacity(estimated_nodes); ++ let mut closed_set: AHashSet = AHashSet::with_capacity(estimated_nodes); ++ let mut in_open_set: AHashSet = AHashSet::with_capacity(estimated_nodes); ++ ++ let start_node = PathNode { ++ position: start, ++ f_score: octile_distance_3d(start, goal), ++ g_score: 0, ++ }; ++ ++ open_set.push(start_node); ++ in_open_set.insert(start); ++ g_scores.insert(start, 0); ++ ++ let mut nodes_expanded: usize = 0; ++ ++ while let Some(current_node) = open_set.pop() { ++ let current = current_node.position; ++ ++ in_open_set.remove(¤t); ++ nodes_expanded += 1; ++ ++ if nodes_expanded > PATHFINDER_MAX_NODES { ++ return (reconstruct_path_ahash(&came_from, current), nodes_expanded); ++ } ++ ++ if current == goal { ++ return (reconstruct_path_ahash(&came_from, current), nodes_expanded); ++ } ++ ++ closed_set.insert(current); ++ ++ for &move_dir in &ALLOWED_MOVES { ++ let neighbor_pos = current + move_dir; ++ ++ if !is_standable_tile(tilemap, neighbor_pos) || closed_set.contains(&neighbor_pos) { ++ continue; ++ } ++ ++ let movement_cost = calculate_movement_cost(move_dir); ++ if movement_cost == 0 { ++ continue; ++ } ++ ++ let new_g = *g_scores.get(¤t).unwrap_or(&i32::MAX) + movement_cost; ++ ++ if new_g < *g_scores.get(&neighbor_pos).unwrap_or(&i32::MAX) { ++ came_from.insert(neighbor_pos, current); ++ g_scores.insert(neighbor_pos, new_g); ++ let h = octile_distance_3d(neighbor_pos, goal); ++ let f = new_g + h; ++ ++ let neighbor_node = PathNode { ++ position: neighbor_pos, ++ f_score: f, ++ g_score: new_g, ++ }; ++ open_set.push(neighbor_node); ++ in_open_set.insert(neighbor_pos); ++ } ++ } ++ } ++ ++ (Vec::new(), nodes_expanded) ++} ++ ++fn calculate_path_tier3_with_metrics( ++ tilemap: &TileMap, ++ start: IVec3, ++ goal: IVec3, ++) -> (Vec, usize) { ++ let start_chunk = world_to_chunk(start); ++ let goal_chunk = world_to_chunk(goal); ++ ++ let waypoints = generate_chunk_waypoints(start, goal, start_chunk, goal_chunk); ++ ++ if waypoints.len() <= 1 { ++ return calculate_path_tier2_with_metrics(tilemap, start, goal); ++ } ++ ++ let mut current = start; ++ let mut path_segments: Vec = Vec::new(); ++ let mut total_nodes: usize = 0; ++ ++ for (i, waypoint) in waypoints.iter().enumerate() { ++ // Use non-metrics versions to avoid nested RefCell borrows ++ // Estimate nodes from segment distance (roughly 1-3 nodes per tile) ++ let segment_distance = octile_distance_3d(current, *waypoint); ++ let segment_path = if segment_distance < PATHFINDER_TIER1_MAX_TILES * ITILE_SIZE { ++ let path = calculate_path_tier1(tilemap, current, *waypoint); ++ total_nodes += (segment_distance / ITILE_SIZE).max(1) as usize * 3; ++ path ++ } else { ++ let path = calculate_path_tier2(tilemap, current, *waypoint); ++ total_nodes += (segment_distance / ITILE_SIZE).max(1) as usize * 5; ++ path ++ }; ++ ++ if segment_path.is_empty() { ++ break; ++ } ++ ++ if i > 0 && !path_segments.is_empty() { ++ path_segments.pop(); ++ } ++ path_segments.extend(segment_path); ++ ++ current = *waypoint; ++ } ++ ++ (path_segments, total_nodes) ++} ++ ++pub fn calculate_path_async(tilemap: &TileMap, start: IVec3, goal: IVec3) -> Vec { ++ if !is_standable_tile(tilemap, start) || !is_standable_tile(tilemap, goal) { ++ return Vec::new(); ++ } ++ ++ let estimated_tiles = octile_distance_3d(start, goal) / ITILE_SIZE; ++ ++ if estimated_tiles > PATHFINDER_ASYNC_THRESHOLD_TILES { ++ let start_chunk = world_to_chunk(start); ++ let goal_chunk = world_to_chunk(goal); ++ ++ let dx = goal_chunk.x - start_chunk.x; ++ let dy = goal_chunk.y - start_chunk.y; ++ let steps = dx.abs().max(dy.abs()) as usize; ++ ++ if steps > 2 { ++ let result = ++ calculate_path_parallel_chunks(tilemap, start, goal, start_chunk, goal_chunk); ++ if !result.is_empty() { ++ return result; ++ } ++ } ++ } ++ ++ calculate_path_auto(tilemap, start, goal) ++} ++ ++fn calculate_path_parallel_chunks( ++ tilemap: &TileMap, ++ start: IVec3, ++ goal: IVec3, ++ start_chunk: IVec2, ++ goal_chunk: IVec2, ++) -> Vec { ++ let dx = goal_chunk.x - start_chunk.x; ++ let dy = goal_chunk.y - start_chunk.y; ++ let steps = dx.abs().max(dy.abs()) as usize; ++ ++ if steps == 0 { ++ return Vec::new(); ++ } ++ ++ let waypoints: Vec = (0..=steps) ++ .map(|i| { ++ let t = if steps == 0 { ++ 0.0f32 ++ } else { ++ i as f32 / steps as f32 ++ }; ++ let chunk_x = start_chunk.x as f32 + t * dx as f32; ++ let chunk_y = start_chunk.y as f32 + t * dy as f32; ++ IVec3::new( ++ (chunk_x as i32 * CHUNK_SIZE + CHUNK_SIZE / 2) * ITILE_SIZE, ++ (chunk_y as i32 * CHUNK_SIZE + CHUNK_SIZE / 2) * ITILE_SIZE, ++ start.z, ++ ) ++ }) ++ .collect(); ++ ++ let num_segments = waypoints.len().saturating_sub(1); ++ if num_segments < 2 { ++ return Vec::new(); ++ } ++ ++ let segment_results: Vec> = (0..num_segments) ++ .into_par_iter() ++ .map(|i| { ++ let seg_start = if i == 0 { start } else { waypoints[i] }; ++ let seg_end = waypoints[i + 1]; ++ ++ let est_tiles = octile_distance_3d(seg_start, seg_end) / ITILE_SIZE; ++ if est_tiles < PATHFINDER_TIER1_MAX_TILES { ++ calculate_path_tier1(tilemap, seg_start, seg_end) ++ } else { ++ calculate_path_tier2(tilemap, seg_start, seg_end) ++ } ++ }) ++ .collect(); ++ ++ let mut full_path = Vec::new(); ++ for (i, segment) in segment_results.iter().enumerate() { ++ if segment.is_empty() { ++ break; ++ } ++ ++ if i > 0 && !full_path.is_empty() { ++ full_path.pop(); ++ } ++ full_path.extend(segment.clone()); ++ } ++ ++ if full_path.is_empty() { ++ Vec::new() ++ } else { ++ full_path ++ } ++} +diff --git a/src/world/chunks/management.rs b/src/world/chunks/management.rs +index f066456..300c4c4 100644 +--- a/src/world/chunks/management.rs ++++ b/src/world/chunks/management.rs +@@ -6,7 +6,7 @@ use crate::world::{tiles::TileMap, CurrentWorldSpriteState, TerrainSpriteState}; + + pub const CHUNK_SIZE: i32 = 8; + +-pub const Z_BELOW: f32 = 45.0; ++pub const Z_BELOW: f32 = 5.0; + pub const Z_ABOVE: f32 = 15.0; + pub const Z_TOTAL: f32 = Z_ABOVE + Z_BELOW; + +diff --git a/src/world/generation/forestry.rs b/src/world/generation/forestry.rs +index 9fc597c..4decbb3 100644 +--- a/src/world/generation/forestry.rs ++++ b/src/world/generation/forestry.rs +@@ -11,8 +11,8 @@ use std::hash::{Hash, Hasher}; + use crate::{ + constants::{SEED, TILE_SIZE}, + world::{ +- tiles::TileMap, ChunkForrestryEvent, FixtureTilePrefab, TextureIDs, Textures, +- VisibleGameEntity, ++ tiles::{FixtureTileData, TileMap}, ++ ChunkForrestryEvent, FixtureTilePrefab, TextureIDs, Textures, VisibleGameEntity, + }, + }; + +@@ -26,8 +26,7 @@ pub fn generate_chunk_forrestry( + let start = Instant::now(); + let count = events.len(); + +- let collected_tilemap_updates: Mutex> = +- Mutex::new(Vec::<(IVec3, (i32, bool, bool, [u32; 8]))>::new()); ++ let collected_tilemap_updates: Mutex> = Mutex::new(Vec::new()); + + events.par_read().for_each(|event| { + let floor_positions = &event.floor_tiles; +@@ -87,10 +86,10 @@ pub fn generate_chunk_forrestry( + } + } + +- collected_tilemap_updates +- .lock() +- .unwrap() +- .push((trunk_ivec, (1, false, true, [0; 8]))); ++ collected_tilemap_updates.lock().unwrap().push(( ++ trunk_ivec, ++ FixtureTileData::new(1, false, true, [0; 8]), ++ )); + + log_positions.insert(trunk_ivec); + } +@@ -144,10 +143,14 @@ pub fn generate_chunk_forrestry( + )) + .id(); + commands.entity(leaf).insert(VisibleGameEntity); +- collected_tilemap_updates +- .lock() +- .unwrap() +- .push((ivec, (5, false, true, [0; 8]))); ++ collected_tilemap_updates.lock().unwrap().push( ++ ( ++ ivec, ++ FixtureTileData::new( ++ 5, false, true, [0; 8], ++ ), ++ ), ++ ); + } + } + } +@@ -164,7 +167,7 @@ pub fn generate_chunk_forrestry( + + let collected_updates = collected_tilemap_updates.into_inner().unwrap(); + for (ivec, data) in collected_updates { +- tilemap.fixture_tiles.insert(ivec, data); ++ tilemap.insert_fixture(ivec, data); + } + if count > 0 { + println!( +diff --git a/src/world/generation/terrain.rs b/src/world/generation/terrain.rs +index fb46146..673ee7e 100644 +--- a/src/world/generation/terrain.rs ++++ b/src/world/generation/terrain.rs +@@ -7,8 +7,9 @@ use noise::{NoiseFn, Perlin}; + use crate::{ + constants::{SEED, TILE_SIZE}, + world::{ +- tiles::TileMap, ChunkForrestryEvent, ChunkTerrainEvent, FloorTilePrefab, +- TileOcclusionEvent, CHUNK_SIZE, Z_ABOVE, Z_BELOW, ++ tiles::{FloorTileData, TileMap}, ++ ChunkForrestryEvent, ChunkTerrainEvent, FloorTilePrefab, TileOcclusionEvent, CHUNK_SIZE, ++ Z_ABOVE, Z_BELOW, + }, + }; + +@@ -50,8 +51,7 @@ pub fn generate_chunk_terrain( + let start_y = chunk_pos.y * CHUNK_SIZE; + + let mut surface_positions: Vec<(Vec3, String)> = Vec::new(); +- let mut local_tilemap_updates: HashMap = +- HashMap::new(); ++ let mut local_tilemap_updates: HashMap = HashMap::new(); + + // Generate tiles for this chunk + for local_y in 0..CHUNK_SIZE { +@@ -84,23 +84,26 @@ pub fn generate_chunk_terrain( + commands.command_scope(|mut cmd| { + FloorTilePrefab::air(position).spawn(&mut cmd); + }); +- local_tilemap_updates +- .insert(pos_ivec, (0, true, false, true, 0, [0; 8])); +- // Air tile ++ local_tilemap_updates.insert( ++ pos_ivec, ++ FloorTileData::new(0, true, false, true, 0, [0; 8]), ++ ); + } else if cave_value < 0.8 { + commands.command_scope(|mut cmd| { + FloorTilePrefab::rock(position).spawn(&mut cmd); + }); +- local_tilemap_updates +- .insert(pos_ivec, (2, false, true, false, 50, [0; 8])); +- // Rock tile ++ local_tilemap_updates.insert( ++ pos_ivec, ++ FloorTileData::new(2, false, true, false, 50, [0; 8]), ++ ); + } else { + commands.command_scope(|mut cmd| { + FloorTilePrefab::dirt(position).spawn(&mut cmd); + }); +- local_tilemap_updates +- .insert(pos_ivec, (1, false, true, false, 85, [0; 8])); +- // Dirt tile ++ local_tilemap_updates.insert( ++ pos_ivec, ++ FloorTileData::new(1, false, true, false, 85, [0; 8]), ++ ); + } + } else if noise_position.z > position.z { + if (generate_surface_terrain(world_x, world_y) * TILE_SIZE).round() +@@ -109,23 +112,28 @@ pub fn generate_chunk_terrain( + commands.command_scope(|mut cmd| { + FloorTilePrefab::grass(position).spawn(&mut cmd); + }); +- local_tilemap_updates +- .insert(pos_ivec, (1, false, true, false, 100, [0; 8])); // Dirt tile (grass) +- surface_positions.push((position, ("grass").to_string())); ++ local_tilemap_updates.insert( ++ pos_ivec, ++ FloorTileData::new(1, false, true, false, 100, [0; 8]), ++ ); ++ surface_positions.push((position, "grass".to_string())); + } else { + commands.command_scope(|mut cmd| { + FloorTilePrefab::dirt(position).spawn(&mut cmd); + }); +- local_tilemap_updates +- .insert(pos_ivec, (1, false, true, false, 85, [0; 8])); +- // Dirt tile ++ local_tilemap_updates.insert( ++ pos_ivec, ++ FloorTileData::new(1, false, true, false, 85, [0; 8]), ++ ); + } + } else { + commands.command_scope(|mut cmd| { + FloorTilePrefab::air(position).spawn(&mut cmd); + }); +- local_tilemap_updates.insert(pos_ivec, (0, true, false, true, 0, [0; 8])); +- // Air tile ++ local_tilemap_updates.insert( ++ pos_ivec, ++ FloorTileData::new(0, true, false, true, 0, [0; 8]), ++ ); + } + } + } +@@ -151,7 +159,7 @@ pub fn generate_chunk_terrain( + .unwrap() + .into_iter() + .map(|(pos, data)| { +- tilemap.floor_tiles.insert(pos, data); ++ tilemap.insert_floor(pos, data); + pos + }) + .collect(); +diff --git a/src/world/mod.rs b/src/world/mod.rs +index a0cb751..d94211f 100644 +--- a/src/world/mod.rs ++++ b/src/world/mod.rs +@@ -69,8 +69,8 @@ impl Plugin for WorldPlugin { + } + + fn setup_initial_chunks(mut event_writer: MessageWriter) { +- for x in -5..=5 { +- for y in -5..=5 { ++ for x in -15..=15 { ++ for y in -15..=15 { + event_writer.write(GenerateChunkEvent { + chunk_position: IVec2::new(x, y), + }); +diff --git a/src/world/tiles/tilemap.rs b/src/world/tiles/tilemap.rs +index 8b3d811..f3fd9ef 100644 +--- a/src/world/tiles/tilemap.rs ++++ b/src/world/tiles/tilemap.rs +@@ -1,9 +1,240 @@ ++use ahash::AHashMap; + use bevy::prelude::*; +-use bevy_platform::collections::hash_map::HashMap; ++use std::sync::Arc; + +-#[derive(Resource, Default, Clone)] ++/// Packed floor tile data for efficient storage. ~35 bytes vs 76 bytes tuple. ++#[derive(Clone, Copy, Debug)] ++pub struct FloorTileData { ++ pub id: u8, ++ /// bit0=can_stand_in, bit1=can_stand_on, bit2=visibly_transparent ++ pub flags: u8, ++ pub astar_weight: u8, ++ pub visible_range: [u32; 8], ++} ++ ++impl Default for FloorTileData { ++ fn default() -> Self { ++ Self { ++ id: 0, ++ flags: 0b001, ++ astar_weight: 0, ++ visible_range: [0; 8], ++ } ++ } ++} ++ ++impl FloorTileData { ++ pub fn new( ++ id: u8, ++ can_stand_in: bool, ++ can_stand_on: bool, ++ visibly_transparent: bool, ++ astar_weight: u8, ++ visible_range: [u32; 8], ++ ) -> Self { ++ let mut flags = 0u8; ++ if can_stand_in { ++ flags |= 0b001; ++ } ++ if can_stand_on { ++ flags |= 0b010; ++ } ++ if visibly_transparent { ++ flags |= 0b100; ++ } ++ Self { ++ id, ++ flags, ++ astar_weight, ++ visible_range, ++ } ++ } ++ ++ #[inline] ++ pub fn can_stand_in(&self) -> bool { ++ self.flags & 0b001 != 0 ++ } ++ #[inline] ++ pub fn can_stand_on(&self) -> bool { ++ self.flags & 0b010 != 0 ++ } ++ #[inline] ++ pub fn visibly_transparent(&self) -> bool { ++ self.flags & 0b100 != 0 ++ } ++ ++ #[inline] ++ pub fn set_can_stand_in(&mut self, value: bool) { ++ if value { ++ self.flags |= 0b001; ++ } else { ++ self.flags &= !0b001; ++ } ++ } ++ ++ #[inline] ++ pub fn set_can_stand_on(&mut self, value: bool) { ++ if value { ++ self.flags |= 0b010; ++ } else { ++ self.flags &= !0b010; ++ } ++ } ++ ++ #[inline] ++ pub fn set_visibly_transparent(&mut self, value: bool) { ++ if value { ++ self.flags |= 0b100; ++ } else { ++ self.flags &= !0b100; ++ } ++ } ++ ++ pub fn from_tuple(tuple: (i32, bool, bool, bool, i32, [u32; 8])) -> Self { ++ Self::new( ++ tuple.0 as u8, ++ tuple.1, ++ tuple.2, ++ tuple.3, ++ tuple.4 as u8, ++ tuple.5, ++ ) ++ } ++ ++ pub fn to_tuple(&self) -> (i32, bool, bool, bool, i32, [u32; 8]) { ++ ( ++ self.id as i32, ++ self.can_stand_in(), ++ self.can_stand_on(), ++ self.visibly_transparent(), ++ self.astar_weight as i32, ++ self.visible_range, ++ ) ++ } ++} ++ ++/// Packed fixture tile data. ~18 bytes vs 48 bytes tuple. ++#[derive(Clone, Copy, Debug)] ++pub struct FixtureTileData { ++ pub id: u8, ++ /// bit0=can_stand_in, bit1=can_stand_on ++ pub flags: u8, ++ pub visible_range: [u32; 8], ++} ++ ++impl Default for FixtureTileData { ++ fn default() -> Self { ++ Self { ++ id: 0, ++ flags: 0, ++ visible_range: [0; 8], ++ } ++ } ++} ++ ++impl FixtureTileData { ++ pub fn new(id: u8, can_stand_in: bool, can_stand_on: bool, visible_range: [u32; 8]) -> Self { ++ let mut flags = 0u8; ++ if can_stand_in { ++ flags |= 0b001; ++ } ++ if can_stand_on { ++ flags |= 0b010; ++ } ++ Self { ++ id, ++ flags, ++ visible_range, ++ } ++ } ++ ++ #[inline] ++ pub fn can_stand_in(&self) -> bool { ++ self.flags & 0b001 != 0 ++ } ++ #[inline] ++ pub fn can_stand_on(&self) -> bool { ++ self.flags & 0b010 != 0 ++ } ++ ++ pub fn from_tuple(tuple: (i32, bool, bool, [u32; 8])) -> Self { ++ Self::new(tuple.0 as u8, tuple.1, tuple.2, tuple.3) ++ } ++ ++ pub fn to_tuple(&self) -> (i32, bool, bool, [u32; 8]) { ++ ( ++ self.id as i32, ++ self.can_stand_in(), ++ self.can_stand_on(), ++ self.visible_range, ++ ) ++ } ++} ++ ++/// Tile map with Arc-wrapped HashMaps for async pathfinding access. ++/// Uses copy-on-write: Arc::make_mut clones only if other Arcs exist. ++#[derive(Resource, Clone, Default)] + pub struct TileMap { +- pub floor_tiles: HashMap, //id, canStandIn, canStandOn, visiblyTransparent, astar_weight, visible_range +- pub fixture_tiles: HashMap, // id, canStandIn, canStandOn, visible_range +- pub item_tiles: HashMap>, // Entity.id's of items on this tile ++ pub floor_tiles: Arc>, ++ pub fixture_tiles: Arc>, ++ pub item_tiles: Arc>>, ++} ++ ++impl TileMap { ++ pub fn new() -> Self { ++ Self::default() ++ } ++ ++ #[inline] ++ pub fn get_floor(&self, pos: &IVec3) -> Option<&FloorTileData> { ++ self.floor_tiles.get(pos) ++ } ++ ++ #[inline] ++ pub fn get_fixture(&self, pos: &IVec3) -> Option<&FixtureTileData> { ++ self.fixture_tiles.get(pos) ++ } ++ ++ #[inline] ++ pub fn has_floor(&self, pos: &IVec3) -> bool { ++ self.floor_tiles.contains_key(pos) ++ } ++ ++ #[inline] ++ pub fn has_fixture(&self, pos: &IVec3) -> bool { ++ self.fixture_tiles.contains_key(pos) ++ } ++ ++ #[inline] ++ pub fn insert_floor(&mut self, pos: IVec3, tile: FloorTileData) { ++ Arc::make_mut(&mut self.floor_tiles).insert(pos, tile); ++ } ++ ++ #[inline] ++ pub fn insert_fixture(&mut self, pos: IVec3, tile: FixtureTileData) { ++ Arc::make_mut(&mut self.fixture_tiles).insert(pos, tile); ++ } ++ ++ #[inline] ++ pub fn insert_item(&mut self, pos: IVec3, entity_id: u32) { ++ Arc::make_mut(&mut self.item_tiles) ++ .entry(pos) ++ .or_default() ++ .push(entity_id); ++ } ++ ++ #[inline] ++ pub fn remove_item(&mut self, pos: &IVec3) -> Option> { ++ Arc::make_mut(&mut self.item_tiles).remove(pos) ++ } ++ ++ #[inline] ++ pub fn get_floor_mut(&mut self, pos: &IVec3) -> Option<&mut FloorTileData> { ++ Arc::make_mut(&mut self.floor_tiles).get_mut(pos) ++ } ++ ++ #[inline] ++ pub fn get_fixture_mut(&mut self, pos: &IVec3) -> Option<&mut FixtureTileData> { ++ Arc::make_mut(&mut self.fixture_tiles).get_mut(pos) ++ } + } +diff --git a/src/world/tiles/visibility.rs b/src/world/tiles/visibility.rs +index c742685..c56ce8b 100644 +--- a/src/world/tiles/visibility.rs ++++ b/src/world/tiles/visibility.rs +@@ -36,8 +36,8 @@ pub fn compute_visibility_of_game_entities( + return; + } + } +- +- let entity_z = (transform.translation.z / TILE_SIZE) - 1.0; ++ let scaled_z = transform.translation.z / TILE_SIZE; ++ let entity_z = scaled_z - 1.0; + // if same z-level, always visible + if z_index.0 == entity_z { + sprite.color = Color::WHITE; +@@ -59,11 +59,11 @@ pub fn compute_visibility_of_game_entities( + + // if visible, calculate saturation + *visibility = Visibility::Visible; +- let saturation = +- ((z_index.0 - (transform.translation.z / TILE_SIZE) + 1.) / 8.0).clamp(0.0, 1.0); ++ let saturation = ((z_index.0 - scaled_z + 1.) / 8.0).clamp(0.0, 1.0); + +- sprite.color = Color::hsv(194.7, saturation, 1.0 - (saturation / 2.0)); +- sprite.color.set_alpha(1.0 - saturation); ++ let mut c = Color::hsv(194.7, saturation, 1.0 - (saturation / 2.0)); ++ c.set_alpha(1.0 - saturation); ++ sprite.color = c; + }); + } + +@@ -100,8 +100,8 @@ pub fn handle_tile_occlusion_updates( + for (_, mut tile, pos) in floor_tiles.iter_mut() { + if let Some(visibility) = update_map.get(&pos.translation.as_ivec3()) { + tile.visible_range = *visibility; +- if let Some(tile_data) = tilemap.floor_tiles.get_mut(&pos.translation.as_ivec3()) { +- tile_data.5 = *visibility; ++ if let Some(tile_data) = tilemap.get_floor_mut(&pos.translation.as_ivec3()) { ++ tile_data.visible_range = *visibility; + } + } + } +@@ -115,8 +115,11 @@ pub fn handle_tile_occlusion_updates( + } + } + ++#[inline(always)] + pub fn calculate_visibility(pos: IVec3, tilemap: &TileMap) -> [u32; 8] { + let mut visible_range = [0u32; 8]; ++ let z_total = Z_TOTAL as i32; ++ let z_below = Z_BELOW as i32; + + let touches_air = 'neighbor_check: { + for x_offset in -1..=1 { +@@ -131,7 +134,7 @@ pub fn calculate_visibility(pos: IVec3, tilemap: &TileMap) -> [u32; 8] { + pos.z + z_offset * ITILE_SIZE, + ); + match tilemap.floor_tiles.get(&neighbor_pos) { +- Some(&(id, _, _, _, _, _)) if id == 0 => break 'neighbor_check true, ++ Some(tile) if tile.id == 0 => break 'neighbor_check true, + None => {} + _ => {} + } +@@ -145,45 +148,42 @@ pub fn calculate_visibility(pos: IVec3, tilemap: &TileMap) -> [u32; 8] { + return visible_range; + } + +- let base_camera_index = (pos.z / ITILE_SIZE) + Z_BELOW as i32; ++ let base_camera_index = (pos.z / ITILE_SIZE) + z_below; + +- if base_camera_index >= 0 && base_camera_index <= Z_TOTAL as i32 { +- if touches_air { +- let z2 = base_camera_index as usize; +- visible_range[z2 / 32] |= 1 << (z2 % 32); +- } ++ if base_camera_index >= 0 && base_camera_index <= z_total { ++ let z2 = base_camera_index as usize; ++ visible_range[z2 / 32] |= 1 << (z2 % 32); + } + + let mut occluded = false; ++ let mut check_pos = pos; + + for z_offset in 1..=(Z_TOTAL as i32 + Z_BELOW as i32 + 1) { +- let check_z = pos.z + z_offset * ITILE_SIZE; +- let camera_z_index = (check_z / ITILE_SIZE) + Z_BELOW as i32; ++ check_pos.z = pos.z + z_offset * ITILE_SIZE; ++ let camera_z_index = (check_pos.z / ITILE_SIZE) + z_below; + + if camera_z_index < 0 { +- match tilemap.floor_tiles.get(&IVec3::new(pos.x, pos.y, check_z)) { +- Some(&(_, _, _, visibly_transparent, _, _)) => occluded = !visibly_transparent, +- None => occluded = false, ++ if let Some(tile) = tilemap.floor_tiles.get(&check_pos) { ++ occluded = !tile.visibly_transparent(); ++ } else { ++ occluded = false; + } + continue; + } + +- if camera_z_index > Z_TOTAL as i32 { ++ if camera_z_index > z_total { + break; + } + + if !occluded { + let z2 = camera_z_index as usize; +- visible_range[z2 / 32] |= 1 << ((z2 % 32) as u32); ++ visible_range[z2 / 32] |= 1 << (z2 % 32); + } + +- let tile = tilemap.floor_tiles.get(&IVec3::new(pos.x, pos.y, check_z)); +- +- match tile { +- Some(&(_, _, _, visibly_transparent, _, _)) => { +- occluded = !visibly_transparent; +- } +- None => occluded = false, ++ if let Some(tile) = tilemap.floor_tiles.get(&check_pos) { ++ occluded = !tile.visibly_transparent(); ++ } else { ++ occluded = false; + } + } + diff --git a/pathfinding_benchmark_baseline.csv b/pathfinding_benchmark_baseline.csv new file mode 100644 index 0000000..c155aaf --- /dev/null +++ b/pathfinding_benchmark_baseline.csv @@ -0,0 +1,11281 @@ +sample,path_duration_us,path_length,nodes_expanded,success +0,186,0,120,true +1,178,0,99,true +2,187,1,21,true +3,102,0,94,true +4,7116,77,1838,true +5,10088,83,2428,true +6,4978,105,3926,true +7,2137,63,1953,true +8,1549,101,1071,true +9,160,0,140,true +10,3597,72,2640,true +11,580,0,262,true +12,298,0,112,true +13,305,0,113,true +14,77,0,115,true +15,55,1,21,true +16,83,0,110,true +17,62,1,12,true +18,85,0,110,true +19,93,0,107,true +20,92,0,125,true +21,68,0,98,true +22,140,1,15,true +23,1429,48,928,true +24,3836,43,1319,true +25,274,0,123,true +26,2289,104,1665,true +27,73,35,51,true +28,192,0,100,true +29,5202,115,3970,true +30,92,0,119,true +31,65,1,12,true +32,109,0,130,true +33,71,1,21,true +34,64,1,24,true +35,47,1,18,true +36,249,26,72,true +37,1146,98,161,true +38,2614,92,1507,true +39,157,30,120,true +40,713,44,278,true +41,179,1,18,true +42,188,1,18,true +43,123,0,104,true +44,135,0,125,true +45,19153,52,5001,true +46,894,54,407,true +47,3608,117,4392,true +48,2395,84,2595,true +49,5267,112,4469,true +50,1852,62,1728,true +51,93,1,21,true +52,249,31,168,true +53,17253,59,48,true +54,597,0,255,true +55,225,0,122,true +56,182,0,104,true +57,166,0,95,true +58,225,0,114,true +59,129,0,116,true +60,142,0,121,true +61,92,0,116,true +62,6153,68,1764,true +63,784,29,165,true +64,847,0,257,true +65,586,95,303,true +66,347,34,319,true +67,3409,81,2883,true +68,1599,63,943,true +69,108,0,125,true +70,219,0,122,true +71,288,1,18,true +72,385,0,116,true +73,208,0,131,true +74,148,0,96,true +75,144,0,104,true +76,208,1,24,true +77,201,0,100,true +78,5397,117,4848,true +79,451,47,664,true +80,1504,61,1418,true +81,102,0,116,true +82,111,1,18,true +83,9824,47,5001,true +84,702,47,353,true +85,4981,95,2897,true +86,172,0,102,true +87,77,1,24,true +88,311,1,12,true +89,369,0,136,true +90,455,0,107,true +91,268,1,15,true +92,92,0,98,true +93,381,0,252,true +94,147,1,24,true +95,61,1,24,true +96,233,0,123,true +97,1689,82,1234,true +98,5630,51,5001,true +99,136,0,106,true +100,569,29,317,true +101,136,1,9,true +102,243,0,121,true +103,280,0,112,true +104,185,0,109,true +105,156,0,112,true +106,213,1,18,true +107,511,1,15,true +108,110,0,126,true +109,217,0,111,true +110,225,0,113,true +111,425,0,255,true +112,141,0,88,true +113,227,0,115,true +114,79,0,111,true +115,201,0,110,true +116,3270,42,980,true +117,237,1,24,true +118,5289,41,5001,true +119,3710,81,5001,true +120,121,1,18,true +121,2372,76,2791,true +122,2096,84,1778,true +123,238,27,106,true +124,2255,60,1423,true +125,112,1,9,true +126,485,1,12,true +127,241,0,115,true +128,385,0,255,true +129,176,1,18,true +130,146,0,118,true +131,108,0,127,true +132,200,1,18,true +133,193,0,112,true +134,163,0,109,true +135,131,0,109,true +136,245,0,129,true +137,214,0,140,true +138,299,1,18,true +139,331,1,18,true +140,197,0,89,true +141,181,0,119,true +142,105,0,98,true +143,232,0,99,true +144,102,1,12,true +145,194,0,96,true +146,68,0,92,true +147,226,0,113,true +148,407,0,115,true +149,249,0,123,true +150,174,1,18,true +151,406,0,257,true +152,140,1,24,true +153,123,1,9,true +154,136,0,102,true +155,208,0,120,true +156,223,0,102,true +157,224,0,97,true +158,455,0,247,true +159,110,0,93,true +160,172,0,115,true +161,100,0,92,true +162,111,0,112,true +163,81,0,105,true +164,201,0,103,true +165,379,0,237,true +166,70,0,86,true +167,127,1,9,true +168,180,0,108,true +169,229,0,127,true +170,123,1,21,true +171,73,0,99,true +172,136,0,103,true +173,243,0,98,true +174,322,0,248,true +175,117,1,21,true +176,137,0,108,true +177,206,1,18,true +178,184,0,126,true +179,142,0,112,true +180,91,1,24,true +181,102,0,116,true +182,64,1,9,true +183,132,0,99,true +184,68,0,90,true +185,151,0,121,true +186,86,1,12,true +187,298,0,260,true +188,294,0,264,true +189,54,1,21,true +190,136,0,100,true +191,146,1,24,true +192,113,1,18,true +193,241,0,92,true +194,138,1,18,true +195,301,0,250,true +196,68,1,24,true +197,98,0,107,true +198,300,0,245,true +199,134,0,123,true +200,118,0,127,true +201,79,1,24,true +202,121,1,18,true +203,147,0,118,true +204,100,0,96,true +205,351,0,268,true +206,141,0,107,true +207,106,1,18,true +208,121,0,112,true +209,265,0,122,true +210,232,0,98,true +211,178,0,95,true +212,160,0,111,true +213,125,1,18,true +214,108,0,107,true +215,121,1,18,true +216,112,1,18,true +217,124,0,109,true +218,254,0,125,true +219,149,0,81,true +220,127,0,121,true +221,109,0,104,true +222,318,0,259,true +223,140,0,113,true +224,115,1,21,true +225,172,0,98,true +226,161,0,127,true +227,103,0,101,true +228,113,1,18,true +229,122,0,114,true +230,168,0,127,true +231,144,0,130,true +232,311,0,261,true +233,125,1,18,true +234,111,0,105,true +235,92,0,93,true +236,130,0,115,true +237,144,0,97,true +238,110,0,120,true +239,108,0,138,true +240,237,0,115,true +241,167,0,80,true +242,117,1,18,true +243,327,0,245,true +244,81,0,96,true +245,127,1,18,true +246,218,1,21,true +247,104,0,112,true +248,104,0,118,true +249,244,1,15,true +250,62,1,24,true +251,111,1,18,true +252,109,0,105,true +253,110,1,18,true +254,180,0,94,true +255,154,0,118,true +256,140,0,115,true +257,108,1,24,true +258,86,1,12,true +259,87,1,24,true +260,122,0,84,true +261,80,0,109,true +262,136,0,107,true +263,68,1,9,true +264,242,0,95,true +265,147,0,80,true +266,151,0,107,true +267,274,0,108,true +268,119,1,24,true +269,143,0,104,true +270,156,0,114,true +271,154,0,124,true +272,140,1,24,true +273,94,1,12,true +274,130,0,92,true +275,148,0,122,true +276,72,0,100,true +277,356,0,264,true +278,106,0,118,true +279,131,0,91,true +280,161,0,112,true +281,274,1,15,true +282,229,1,15,true +283,226,1,15,true +284,344,0,283,true +285,109,0,118,true +286,214,1,18,true +287,136,0,136,true +288,85,1,24,true +289,217,0,87,true +290,168,0,80,true +291,132,1,15,true +292,104,0,95,true +293,149,0,123,true +294,295,0,257,true +295,162,0,124,true +296,161,0,121,true +297,143,0,113,true +298,287,1,21,true +299,84,0,90,true +300,269,1,21,true +301,130,0,93,true +302,309,0,238,true +303,92,1,21,true +304,180,1,12,true +305,134,0,99,true +306,134,0,102,true +307,115,0,102,true +308,97,0,109,true +309,1784,77,1178,true +310,165,0,113,true +311,135,0,111,true +312,91,1,18,true +313,166,0,112,true +314,90,0,95,true +315,92,0,95,true +316,104,0,90,true +317,281,0,243,true +318,149,0,121,true +319,168,0,131,true +320,84,0,92,true +321,118,0,109,true +322,118,1,18,true +323,116,0,95,true +324,178,0,122,true +325,109,1,21,true +326,92,0,99,true +327,146,1,24,true +328,178,0,125,true +329,80,1,18,true +330,136,0,105,true +331,191,0,107,true +332,170,0,100,true +333,124,0,111,true +334,195,0,118,true +335,122,1,18,true +336,148,0,87,true +337,125,1,18,true +338,137,0,116,true +339,319,0,249,true +340,62,1,24,true +341,127,0,91,true +342,236,0,139,true +343,214,0,103,true +344,176,0,92,true +345,159,0,93,true +346,79,1,21,true +347,301,1,15,true +348,593,1,15,true +349,288,0,253,true +350,74,0,100,true +351,137,0,124,true +352,128,0,103,true +353,166,0,131,true +354,284,0,245,true +355,175,1,18,true +356,249,0,127,true +357,91,1,12,true +358,224,0,115,true +359,156,0,126,true +360,203,0,130,true +361,153,1,21,true +362,116,0,104,true +363,414,0,259,true +364,94,0,116,true +365,193,0,112,true +366,118,0,114,true +367,143,0,119,true +368,137,1,24,true +369,129,0,92,true +370,188,1,18,true +371,141,0,110,true +372,81,0,110,true +373,231,0,116,true +374,205,0,105,true +375,364,0,265,true +376,161,0,106,true +377,198,0,109,true +378,94,0,93,true +379,365,0,257,true +380,97,0,119,true +381,93,0,103,true +382,94,0,93,true +383,141,0,113,true +384,173,0,112,true +385,61,1,12,true +386,176,0,102,true +387,252,1,15,true +388,83,0,97,true +389,231,0,112,true +390,113,1,18,true +391,238,1,15,true +392,188,1,18,true +393,98,0,91,true +394,524,0,264,true +395,127,1,24,true +396,173,0,139,true +397,187,1,24,true +398,137,0,112,true +399,165,0,114,true +400,143,0,125,true +401,97,0,111,true +402,213,0,131,true +403,252,0,108,true +404,116,1,18,true +405,149,0,110,true +406,108,0,108,true +407,199,0,126,true +408,122,0,118,true +409,89,0,105,true +410,2004,54,777,true +411,213,0,129,true +412,218,0,105,true +413,229,0,127,true +414,230,0,121,true +415,189,0,92,true +416,87,0,104,true +417,136,0,104,true +418,85,0,113,true +419,100,1,21,true +420,258,0,108,true +421,192,0,100,true +422,149,0,104,true +423,137,0,109,true +424,181,0,126,true +425,344,0,264,true +426,170,1,21,true +427,150,0,124,true +428,106,0,95,true +429,409,0,282,true +430,136,1,18,true +431,128,1,24,true +432,112,1,24,true +433,90,0,102,true +434,160,0,114,true +435,134,0,102,true +436,115,1,21,true +437,68,1,21,true +438,104,0,127,true +439,162,0,113,true +440,192,0,94,true +441,77,0,106,true +442,146,1,24,true +443,1780,64,811,true +444,128,1,18,true +445,108,1,18,true +446,93,1,12,true +447,322,1,12,true +448,237,0,111,true +449,148,0,118,true +450,148,1,9,true +451,163,0,122,true +452,233,0,107,true +453,128,1,18,true +454,155,0,101,true +455,194,1,12,true +456,75,0,99,true +457,156,0,113,true +458,121,1,18,true +459,102,0,98,true +460,121,0,104,true +461,151,1,18,true +462,191,1,24,true +463,216,0,123,true +464,544,0,277,true +465,204,0,99,true +466,161,0,108,true +467,324,0,258,true +468,113,0,132,true +469,125,0,109,true +470,142,0,98,true +471,205,0,104,true +472,463,0,277,true +473,262,1,15,true +474,117,0,123,true +475,179,0,106,true +476,491,0,272,true +477,396,1,15,true +478,130,0,111,true +479,94,0,86,true +480,98,0,127,true +481,154,0,113,true +482,470,0,247,true +483,168,0,126,true +484,191,1,15,true +485,290,0,120,true +486,182,0,142,true +487,135,1,21,true +488,174,0,123,true +489,280,0,245,true +490,147,1,21,true +491,157,0,107,true +492,134,0,86,true +493,103,0,101,true +494,125,1,21,true +495,81,1,12,true +496,111,0,112,true +497,211,0,121,true +498,208,0,117,true +499,59,1,21,true +500,249,1,12,true +501,123,1,12,true +502,98,0,110,true +503,129,1,18,true +504,74,1,18,true +505,73,1,24,true +506,142,0,113,true +507,467,0,125,true +508,7833,97,132,true +509,162,1,21,true +510,255,1,24,true +511,175,1,18,true +512,197,1,24,true +513,191,0,115,true +514,699,60,334,true +515,407,0,248,true +516,200,1,18,true +517,194,0,92,true +518,153,0,114,true +519,182,0,111,true +520,129,1,12,true +521,72,1,24,true +522,138,0,106,true +523,67,0,92,true +524,116,1,18,true +525,89,0,92,true +526,210,0,113,true +527,117,1,24,true +528,96,0,107,true +529,200,0,114,true +530,340,1,12,true +531,222,0,92,true +532,157,0,107,true +533,113,0,101,true +534,338,0,123,true +535,389,1,15,true +536,99,0,110,true +537,243,0,111,true +538,153,0,117,true +539,213,1,18,true +540,178,0,114,true +541,293,0,260,true +542,85,1,24,true +543,166,0,100,true +544,97,0,100,true +545,116,1,18,true +546,330,0,249,true +547,227,0,129,true +548,3853,85,3048,true +549,130,0,113,true +550,127,0,92,true +551,168,1,24,true +552,117,1,18,true +553,223,1,15,true +554,116,1,18,true +555,83,0,98,true +556,396,0,245,true +557,6887,79,5001,true +558,87,0,107,true +559,211,1,18,true +560,131,1,18,true +561,243,0,142,true +562,135,0,100,true +563,199,0,112,true +564,87,0,103,true +565,119,1,18,true +566,111,0,111,true +567,306,0,264,true +568,151,1,18,true +569,239,1,15,true +570,78,0,98,true +571,170,0,124,true +572,269,0,101,true +573,92,1,12,true +574,118,0,107,true +575,309,0,229,true +576,328,1,12,true +577,122,0,122,true +578,185,1,18,true +579,169,0,123,true +580,113,0,87,true +581,166,0,115,true +582,223,0,109,true +583,138,1,15,true +584,155,0,104,true +585,167,0,99,true +586,96,0,127,true +587,388,0,114,true +588,195,0,110,true +589,137,0,108,true +590,181,0,88,true +591,79,0,104,true +592,122,0,92,true +593,108,0,110,true +594,245,0,113,true +595,173,0,121,true +596,410,0,276,true +597,288,0,253,true +598,81,0,98,true +599,180,0,115,true +600,151,0,128,true +601,150,0,100,true +602,169,0,111,true +603,230,0,102,true +604,680,0,264,true +605,97,1,18,true +606,93,0,92,true +607,104,0,100,true +608,117,1,18,true +609,14329,120,72,true +610,262,0,121,true +611,168,0,95,true +612,401,0,259,true +613,96,0,127,true +614,201,0,103,true +615,137,0,113,true +616,192,0,112,true +617,149,0,130,true +618,103,1,21,true +619,155,0,113,true +620,132,0,110,true +621,243,0,117,true +622,28841,261,156,true +623,198,1,18,true +624,394,0,264,true +625,188,0,110,true +626,143,0,126,true +627,80,0,90,true +628,92,0,99,true +629,62,1,18,true +630,149,0,107,true +631,289,0,238,true +632,96,0,110,true +633,148,0,110,true +634,307,0,255,true +635,197,0,114,true +636,91,0,112,true +637,256,0,108,true +638,226,0,113,true +639,157,0,111,true +640,203,0,121,true +641,123,1,24,true +642,79,0,110,true +643,182,0,93,true +644,149,0,115,true +645,123,0,115,true +646,381,0,228,true +647,125,0,90,true +648,227,0,109,true +649,353,1,12,true +650,91,0,96,true +651,161,0,108,true +652,290,0,246,true +653,369,0,272,true +654,87,0,104,true +655,154,0,113,true +656,64,1,18,true +657,66,1,24,true +658,25347,154,93,true +659,478,0,245,true +660,761,99,218,true +661,62,1,12,true +662,89,0,110,true +663,106,1,18,true +664,199,0,108,true +665,108,0,142,true +666,102,1,18,true +667,127,0,93,true +668,72,0,101,true +669,213,0,119,true +670,162,0,119,true +671,137,0,107,true +672,51,1,21,true +673,147,0,122,true +674,381,0,239,true +675,170,0,112,true +676,4758,85,3934,true +677,134,0,103,true +678,174,0,116,true +679,832,50,638,true +680,135,1,21,true +681,130,0,103,true +682,198,0,112,true +683,78,0,109,true +684,131,18,26,true +685,142,0,111,true +686,147,0,139,true +687,216,0,123,true +688,134,0,103,true +689,150,0,113,true +690,122,0,85,true +691,148,0,111,true +692,99,0,104,true +693,229,0,124,true +694,137,0,104,true +695,298,0,255,true +696,347,0,124,true +697,80,0,97,true +698,71,0,96,true +699,187,0,106,true +700,179,0,105,true +701,232,1,15,true +702,204,0,126,true +703,157,0,109,true +704,162,0,104,true +705,136,0,106,true +706,218,1,15,true +707,153,0,128,true +708,136,0,115,true +709,146,0,107,true +710,119,0,125,true +711,157,0,119,true +712,197,0,120,true +713,383,1,15,true +714,103,0,110,true +715,217,0,133,true +716,159,0,102,true +717,213,1,18,true +718,252,0,111,true +719,110,0,111,true +720,86,0,93,true +721,138,0,98,true +722,245,1,24,true +723,141,0,107,true +724,160,0,95,true +725,72,1,15,true +726,211,0,113,true +727,119,0,100,true +728,143,0,108,true +729,68,1,18,true +730,142,0,118,true +731,141,0,100,true +732,252,1,18,true +733,301,0,124,true +734,179,0,104,true +735,119,0,116,true +736,195,0,119,true +737,201,1,12,true +738,157,1,24,true +739,210,0,121,true +740,220,0,127,true +741,160,0,98,true +742,182,0,106,true +743,288,0,252,true +744,167,0,106,true +745,110,1,21,true +746,176,1,18,true +747,235,1,15,true +748,119,0,130,true +749,147,0,112,true +750,105,0,92,true +751,163,0,109,true +752,112,0,106,true +753,292,0,140,true +754,128,1,18,true +755,449,0,243,true +756,75,1,12,true +757,10696,98,96,true +758,102,0,114,true +759,180,0,109,true +760,170,0,92,true +761,163,1,18,true +762,73,0,98,true +763,216,0,118,true +764,181,0,97,true +765,261,0,110,true +766,236,0,113,true +767,184,0,119,true +768,71,1,18,true +769,337,0,245,true +770,169,0,138,true +771,284,0,91,true +772,160,0,105,true +773,136,1,24,true +774,203,0,121,true +775,191,0,88,true +776,200,0,108,true +777,99,0,121,true +778,222,1,18,true +779,200,0,109,true +780,85,0,100,true +781,208,0,110,true +782,161,0,120,true +783,210,0,127,true +784,366,1,15,true +785,159,0,130,true +786,115,0,98,true +787,415,0,257,true +788,284,0,255,true +789,132,1,24,true +790,199,0,111,true +791,203,1,18,true +792,362,0,262,true +793,3186,119,2541,true +794,205,24,39,true +795,150,0,96,true +796,75,1,15,true +797,116,1,18,true +798,245,0,124,true +799,141,0,115,true +800,229,0,113,true +801,167,0,95,true +802,631,0,234,true +803,18935,163,102,true +804,134,0,102,true +805,155,0,111,true +806,66,1,12,true +807,239,0,105,true +808,237,0,140,true +809,296,0,259,true +810,502,1,15,true +811,79,0,97,true +812,73,0,92,true +813,4324,83,2471,true +814,124,0,95,true +815,94,0,116,true +816,127,1,18,true +817,173,1,18,true +818,103,1,18,true +819,89,0,101,true +820,338,1,15,true +821,292,0,136,true +822,180,0,109,true +823,336,1,15,true +824,89,0,112,true +825,56,1,21,true +826,277,0,250,true +827,155,1,24,true +828,222,1,12,true +829,86,0,77,true +830,137,0,116,true +831,252,0,110,true +832,218,1,15,true +833,104,0,132,true +834,172,1,18,true +835,127,0,101,true +836,111,1,18,true +837,74,1,9,true +838,143,0,108,true +839,24932,193,156,true +840,112,1,15,true +841,204,1,18,true +842,15872,104,66,true +843,129,0,88,true +844,306,0,91,true +845,124,0,102,true +846,210,1,18,true +847,194,0,103,true +848,90,0,104,true +849,137,0,110,true +850,389,0,250,true +851,198,0,109,true +852,157,0,115,true +853,98,0,92,true +854,226,0,121,true +855,226,0,117,true +856,388,1,15,true +857,78,0,101,true +858,54,1,21,true +859,75,0,106,true +860,127,0,126,true +861,128,0,103,true +862,182,1,18,true +863,170,0,96,true +864,161,1,21,true +865,132,0,103,true +866,205,0,102,true +867,201,0,109,true +868,157,0,113,true +869,485,0,231,true +870,420,0,270,true +871,282,1,21,true +872,289,0,255,true +873,149,0,113,true +874,238,1,15,true +875,99,0,125,true +876,206,1,18,true +877,170,0,124,true +878,220,1,15,true +879,77,0,98,true +880,237,0,130,true +881,232,0,107,true +882,70,1,18,true +883,167,0,120,true +884,137,0,104,true +885,6386,79,4734,true +886,341,44,271,true +887,293,0,259,true +888,86,0,113,true +889,140,0,94,true +890,115,1,15,true +891,217,0,116,true +892,92,0,112,true +893,118,1,12,true +894,67,0,92,true +895,178,1,15,true +896,132,1,9,true +897,138,1,18,true +898,103,1,24,true +899,267,0,122,true +900,122,0,116,true +901,261,0,119,true +902,3591,67,2009,true +903,263,0,113,true +904,241,0,111,true +905,217,0,107,true +906,159,0,117,true +907,131,0,105,true +908,186,1,24,true +909,117,1,24,true +910,337,1,15,true +911,116,0,103,true +912,109,1,18,true +913,929,0,264,true +914,111,0,110,true +915,185,0,77,true +916,79,0,110,true +917,11926,92,96,true +918,397,0,231,true +919,249,1,18,true +920,208,1,24,true +921,327,0,233,true +922,148,0,119,true +923,131,0,112,true +924,99,0,97,true +925,127,0,126,true +926,245,0,109,true +927,273,0,97,true +928,157,0,108,true +929,61,1,12,true +930,134,0,104,true +931,468,0,127,true +932,354,1,15,true +933,138,0,109,true +934,180,0,84,true +935,118,1,21,true +936,87,0,95,true +937,182,0,111,true +938,9758,110,99,true +939,104,0,102,true +940,115,0,95,true +941,142,0,113,true +942,103,1,21,true +943,146,0,115,true +944,308,0,264,true +945,270,0,115,true +946,18693,174,141,true +947,75,1,21,true +948,121,0,97,true +949,117,0,126,true +950,5130,140,3999,true +951,4739,93,2997,true +952,351,1,12,true +953,72,1,24,true +954,142,1,18,true +955,165,0,111,true +956,262,0,126,true +957,4296,77,2068,true +958,98,0,100,true +959,241,0,119,true +960,173,0,97,true +961,281,0,253,true +962,178,0,116,true +963,199,0,114,true +964,75,0,105,true +965,222,0,102,true +966,127,0,109,true +967,322,0,101,true +968,249,0,141,true +969,122,0,120,true +970,233,0,96,true +971,138,0,108,true +972,71,0,98,true +973,104,1,18,true +974,153,0,116,true +975,102,0,86,true +976,167,0,110,true +977,211,0,104,true +978,194,0,93,true +979,189,0,135,true +980,188,1,18,true +981,307,0,250,true +982,363,1,15,true +983,60,1,12,true +984,129,0,102,true +985,206,0,92,true +986,172,0,112,true +987,181,1,18,true +988,315,0,142,true +989,147,0,116,true +990,119,1,12,true +991,132,0,103,true +992,118,0,123,true +993,231,0,115,true +994,206,1,18,true +995,403,0,267,true +996,233,0,112,true +997,137,0,112,true +998,135,0,104,true +999,157,0,119,true +1000,205,1,18,true +1001,254,0,106,true +1002,195,0,97,true +1003,136,0,104,true +1004,66,0,93,true +1005,540,0,265,true +1006,148,0,110,true +1007,211,1,18,true +1008,198,1,18,true +1009,146,1,24,true +1010,295,0,236,true +1011,207,0,101,true +1012,147,0,117,true +1013,294,0,263,true +1014,91,0,123,true +1015,156,0,123,true +1016,78,0,94,true +1017,155,0,108,true +1018,74,0,97,true +1019,300,0,123,true +1020,286,0,254,true +1021,62,1,12,true +1022,225,0,115,true +1023,87,0,105,true +1024,142,0,107,true +1025,163,1,24,true +1026,279,0,235,true +1027,146,1,21,true +1028,99,0,93,true +1029,106,0,108,true +1030,142,0,107,true +1031,115,1,18,true +1032,130,0,121,true +1033,249,0,107,true +1034,148,0,119,true +1035,140,0,102,true +1036,197,0,119,true +1037,59,1,21,true +1038,132,0,105,true +1039,124,0,97,true +1040,224,1,15,true +1041,140,0,126,true +1042,135,0,116,true +1043,102,0,110,true +1044,165,1,18,true +1045,151,1,18,true +1046,105,0,85,true +1047,230,0,115,true +1048,23423,152,78,true +1049,205,0,110,true +1050,128,0,116,true +1051,181,0,124,true +1052,233,0,110,true +1053,182,1,21,true +1054,172,0,92,true +1055,387,0,234,true +1056,438,0,237,true +1057,115,0,122,true +1058,66,1,24,true +1059,205,1,15,true +1060,124,1,21,true +1061,90,0,98,true +1062,186,1,12,true +1063,286,0,255,true +1064,123,0,109,true +1065,176,1,15,true +1066,143,0,113,true +1067,753,0,256,true +1068,207,1,18,true +1069,134,1,24,true +1070,123,1,24,true +1071,127,1,21,true +1072,112,0,95,true +1073,150,0,110,true +1074,195,0,101,true +1075,143,0,91,true +1076,78,0,108,true +1077,90,1,24,true +1078,131,0,112,true +1079,97,0,93,true +1080,136,0,110,true +1081,135,1,18,true +1082,113,1,15,true +1083,255,0,109,true +1084,219,0,112,true +1085,74,0,100,true +1086,284,0,245,true +1087,254,1,18,true +1088,102,1,24,true +1089,135,1,21,true +1090,3602,103,1662,true +1091,85,0,105,true +1092,86,0,93,true +1093,254,0,111,true +1094,118,1,12,true +1095,273,0,227,true +1096,64,1,12,true +1097,206,0,122,true +1098,379,0,253,true +1099,180,0,102,true +1100,122,0,107,true +1101,135,0,111,true +1102,148,0,114,true +1103,62,1,15,true +1104,459,0,267,true +1105,181,1,18,true +1106,430,0,257,true +1107,56,1,21,true +1108,182,0,115,true +1109,299,0,235,true +1110,141,0,95,true +1111,132,0,106,true +1112,77,0,90,true +1113,162,0,110,true +1114,150,1,18,true +1115,212,0,110,true +1116,140,0,108,true +1117,121,1,12,true +1118,136,0,90,true +1119,681,0,252,true +1120,87,0,93,true +1121,89,0,108,true +1122,160,0,122,true +1123,340,1,12,true +1124,156,0,115,true +1125,156,0,92,true +1126,143,0,114,true +1127,90,0,109,true +1128,148,0,142,true +1129,496,0,256,true +1130,130,1,24,true +1131,123,0,125,true +1132,132,0,140,true +1133,151,0,99,true +1134,131,0,109,true +1135,197,0,113,true +1136,113,0,86,true +1137,144,0,123,true +1138,206,1,18,true +1139,217,0,113,true +1140,20066,164,126,true +1141,155,0,125,true +1142,131,1,12,true +1143,55,1,18,true +1144,232,0,108,true +1145,125,0,111,true +1146,102,0,105,true +1147,182,1,18,true +1148,87,1,24,true +1149,147,0,114,true +1150,128,0,138,true +1151,243,1,15,true +1152,227,1,24,true +1153,287,0,101,true +1154,108,1,24,true +1155,298,0,264,true +1156,932,112,535,true +1157,67,0,89,true +1158,174,1,15,true +1159,308,0,106,true +1160,165,0,119,true +1161,97,0,109,true +1162,137,0,109,true +1163,169,0,122,true +1164,180,0,121,true +1165,91,0,101,true +1166,100,0,106,true +1167,426,0,264,true +1168,99,0,87,true +1169,213,1,18,true +1170,265,0,116,true +1171,116,1,18,true +1172,184,0,140,true +1173,149,0,105,true +1174,160,0,110,true +1175,91,0,109,true +1176,256,1,12,true +1177,244,0,120,true +1178,150,0,122,true +1179,127,0,99,true +1180,317,0,113,true +1181,281,0,241,true +1182,99,0,132,true +1183,147,0,120,true +1184,79,1,18,true +1185,292,0,242,true +1186,109,1,24,true +1187,150,0,103,true +1188,268,1,15,true +1189,85,0,103,true +1190,498,0,249,true +1191,226,0,115,true +1192,149,0,125,true +1193,135,0,109,true +1194,130,1,24,true +1195,118,1,18,true +1196,105,0,125,true +1197,99,0,125,true +1198,113,1,12,true +1199,339,0,119,true +1200,192,0,104,true +1201,159,0,107,true +1202,159,0,108,true +1203,288,0,109,true +1204,147,1,21,true +1205,317,0,257,true +1206,159,1,18,true +1207,143,0,106,true +1208,225,0,102,true +1209,121,1,24,true +1210,170,0,112,true +1211,218,0,93,true +1212,230,0,94,true +1213,141,1,18,true +1214,302,0,244,true +1215,86,0,106,true +1216,222,0,90,true +1217,118,1,21,true +1218,121,1,18,true +1219,254,0,110,true +1220,103,0,106,true +1221,78,1,18,true +1222,92,0,103,true +1223,143,1,24,true +1224,446,0,255,true +1225,140,1,21,true +1226,121,1,9,true +1227,224,0,115,true +1228,153,0,127,true +1229,68,1,18,true +1230,130,0,98,true +1231,5168,94,4532,true +1232,231,0,107,true +1233,189,0,97,true +1234,414,0,242,true +1235,80,0,92,true +1236,119,0,106,true +1237,477,1,21,true +1238,122,0,106,true +1239,150,0,122,true +1240,175,1,24,true +1241,136,1,21,true +1242,67,0,90,true +1243,294,0,133,true +1244,192,0,129,true +1245,125,1,24,true +1246,117,0,80,true +1247,83,0,104,true +1248,154,0,130,true +1249,112,1,18,true +1250,116,1,24,true +1251,226,0,117,true +1252,295,0,233,true +1253,74,0,97,true +1254,239,0,108,true +1255,96,0,100,true +1256,346,0,255,true +1257,318,0,253,true +1258,103,0,87,true +1259,78,0,97,true +1260,182,1,18,true +1261,299,0,252,true +1262,90,0,120,true +1263,143,0,100,true +1264,103,1,24,true +1265,71,0,88,true +1266,71,0,104,true +1267,109,1,18,true +1268,118,0,113,true +1269,97,0,104,true +1270,98,0,102,true +1271,157,0,109,true +1272,161,0,107,true +1273,129,0,97,true +1274,109,0,119,true +1275,280,0,258,true +1276,142,0,111,true +1277,555,0,231,true +1278,113,1,21,true +1279,308,0,111,true +1280,252,0,131,true +1281,73,1,21,true +1282,99,1,18,true +1283,142,1,24,true +1284,160,0,109,true +1285,84,1,18,true +1286,81,1,18,true +1287,250,1,18,true +1288,294,0,249,true +1289,137,0,112,true +1290,173,1,21,true +1291,309,0,114,true +1292,155,1,15,true +1293,213,1,18,true +1294,195,0,130,true +1295,125,0,119,true +1296,175,1,21,true +1297,96,1,24,true +1298,233,0,119,true +1299,579,1,18,true +1300,343,0,95,true +1301,170,0,107,true +1302,79,0,108,true +1303,288,0,110,true +1304,416,0,255,true +1305,294,0,235,true +1306,116,0,102,true +1307,211,0,107,true +1308,275,0,111,true +1309,265,0,105,true +1310,200,1,18,true +1311,400,0,229,true +1312,309,0,115,true +1313,179,0,112,true +1314,109,1,18,true +1315,153,1,24,true +1316,154,0,80,true +1317,73,1,21,true +1318,132,1,18,true +1319,260,1,12,true +1320,97,0,109,true +1321,413,0,93,true +1322,2703,107,1772,true +1323,226,1,24,true +1324,144,1,18,true +1325,477,0,250,true +1326,93,0,109,true +1327,85,0,98,true +1328,154,0,110,true +1329,130,0,110,true +1330,473,0,246,true +1331,226,0,117,true +1332,349,0,246,true +1333,99,0,109,true +1334,161,0,104,true +1335,75,1,18,true +1336,90,0,106,true +1337,92,0,108,true +1338,357,0,129,true +1339,317,0,110,true +1340,128,0,100,true +1341,365,0,251,true +1342,124,0,105,true +1343,90,1,18,true +1344,116,1,18,true +1345,165,0,119,true +1346,106,1,12,true +1347,141,0,101,true +1348,409,0,276,true +1349,220,1,15,true +1350,141,1,24,true +1351,208,1,18,true +1352,96,0,119,true +1353,201,0,103,true +1354,124,1,12,true +1355,94,0,92,true +1356,136,0,126,true +1357,85,0,109,true +1358,137,1,9,true +1359,376,0,260,true +1360,96,0,114,true +1361,116,1,12,true +1362,111,0,100,true +1363,108,1,15,true +1364,205,0,126,true +1365,167,0,113,true +1366,185,0,97,true +1367,286,0,258,true +1368,113,0,99,true +1369,269,0,129,true +1370,257,0,121,true +1371,141,0,105,true +1372,167,0,115,true +1373,125,1,24,true +1374,108,1,12,true +1375,75,0,99,true +1376,108,0,90,true +1377,218,1,15,true +1378,136,1,15,true +1379,99,1,24,true +1380,137,0,108,true +1381,153,0,121,true +1382,392,0,253,true +1383,90,0,107,true +1384,113,1,18,true +1385,94,0,116,true +1386,96,0,125,true +1387,373,0,234,true +1388,151,0,104,true +1389,129,0,97,true +1390,185,0,98,true +1391,104,0,100,true +1392,153,0,125,true +1393,146,0,99,true +1394,160,0,140,true +1395,149,0,86,true +1396,195,0,92,true +1397,176,1,18,true +1398,376,1,18,true +1399,131,0,107,true +1400,148,0,122,true +1401,313,0,276,true +1402,121,0,115,true +1403,231,1,18,true +1404,241,0,93,true +1405,251,0,111,true +1406,359,1,15,true +1407,233,0,99,true +1408,153,0,119,true +1409,97,0,97,true +1410,212,1,18,true +1411,1751,58,867,true +1412,146,0,117,true +1413,151,0,127,true +1414,119,0,118,true +1415,129,0,109,true +1416,233,1,15,true +1417,140,0,111,true +1418,346,0,259,true +1419,127,0,123,true +1420,166,0,112,true +1421,131,0,123,true +1422,105,0,95,true +1423,170,0,123,true +1424,203,0,108,true +1425,142,0,123,true +1426,257,0,113,true +1427,156,0,86,true +1428,155,0,107,true +1429,90,0,105,true +1430,292,0,247,true +1431,157,1,24,true +1432,151,0,119,true +1433,86,0,110,true +1434,235,0,115,true +1435,122,0,111,true +1436,93,0,105,true +1437,178,0,132,true +1438,111,1,18,true +1439,306,0,254,true +1440,346,0,246,true +1441,72,0,92,true +1442,233,0,104,true +1443,140,0,121,true +1444,351,1,18,true +1445,706,40,220,true +1446,194,0,98,true +1447,207,1,12,true +1448,70,0,92,true +1449,87,1,12,true +1450,83,1,12,true +1451,170,0,112,true +1452,668,0,264,true +1453,154,1,24,true +1454,317,0,117,true +1455,268,0,131,true +1456,308,0,93,true +1457,115,1,21,true +1458,97,0,109,true +1459,213,1,15,true +1460,115,1,18,true +1461,9704,97,5001,true +1462,213,0,100,true +1463,270,0,126,true +1464,178,1,18,true +1465,144,0,105,true +1466,218,0,112,true +1467,115,1,18,true +1468,111,1,18,true +1469,241,0,114,true +1470,97,0,113,true +1471,105,0,112,true +1472,170,0,116,true +1473,112,0,104,true +1474,157,0,122,true +1475,68,0,93,true +1476,157,0,138,true +1477,246,0,113,true +1478,212,1,18,true +1479,207,1,18,true +1480,166,0,101,true +1481,115,1,24,true +1482,105,1,9,true +1483,298,0,252,true +1484,370,1,15,true +1485,184,0,121,true +1486,7813,47,5001,true +1487,251,0,124,true +1488,138,0,95,true +1489,135,1,24,true +1490,176,0,124,true +1491,110,0,104,true +1492,112,1,18,true +1493,116,0,93,true +1494,146,0,121,true +1495,99,1,24,true +1496,144,1,18,true +1497,123,0,96,true +1498,193,1,18,true +1499,151,1,18,true +1500,244,0,140,true +1501,231,0,103,true +1502,131,0,97,true +1503,62,0,85,true +1504,210,0,112,true +1505,156,0,104,true +1506,170,0,108,true +1507,71,0,80,true +1508,166,0,137,true +1509,205,0,121,true +1510,324,1,15,true +1511,286,0,238,true +1512,132,0,107,true +1513,125,0,118,true +1514,2281,49,1060,true +1515,187,0,101,true +1516,122,0,98,true +1517,117,1,24,true +1518,249,0,119,true +1519,118,0,111,true +1520,149,0,90,true +1521,375,1,12,true +1522,222,1,15,true +1523,122,0,108,true +1524,142,0,97,true +1525,199,0,102,true +1526,186,0,115,true +1527,350,1,15,true +1528,83,0,110,true +1529,117,0,104,true +1530,172,0,96,true +1531,165,0,113,true +1532,414,1,15,true +1533,150,0,86,true +1534,38189,309,195,true +1535,391,0,122,true +1536,387,0,248,true +1537,89,0,104,true +1538,184,0,103,true +1539,166,1,15,true +1540,189,0,124,true +1541,167,1,18,true +1542,238,0,118,true +1543,327,0,116,true +1544,156,1,24,true +1545,135,0,105,true +1546,73,0,91,true +1547,157,1,12,true +1548,318,0,256,true +1549,80,0,91,true +1550,105,0,109,true +1551,317,1,15,true +1552,369,1,15,true +1553,135,1,24,true +1554,125,1,18,true +1555,204,0,109,true +1556,208,0,125,true +1557,203,0,128,true +1558,89,1,21,true +1559,137,0,106,true +1560,138,0,118,true +1561,313,0,106,true +1562,216,1,18,true +1563,56,1,21,true +1564,573,1,15,true +1565,124,1,18,true +1566,127,0,99,true +1567,189,0,118,true +1568,200,0,97,true +1569,241,0,111,true +1570,184,0,110,true +1571,220,0,84,true +1572,255,1,21,true +1573,148,1,24,true +1574,175,1,15,true +1575,112,0,94,true +1576,153,0,117,true +1577,178,1,24,true +1578,109,1,15,true +1579,111,0,97,true +1580,217,0,109,true +1581,153,0,100,true +1582,141,0,113,true +1583,261,0,105,true +1584,334,0,107,true +1585,217,0,107,true +1586,86,1,15,true +1587,188,0,125,true +1588,267,1,15,true +1589,79,1,12,true +1590,137,0,77,true +1591,79,0,91,true +1592,176,0,104,true +1593,113,1,18,true +1594,239,0,108,true +1595,398,0,242,true +1596,116,0,118,true +1597,78,0,95,true +1598,166,0,109,true +1599,340,1,15,true +1600,79,1,21,true +1601,135,1,24,true +1602,124,0,98,true +1603,255,0,115,true +1604,115,1,18,true +1605,157,0,111,true +1606,197,0,99,true +1607,66,1,12,true +1608,149,1,18,true +1609,135,0,104,true +1610,131,0,92,true +1611,109,0,109,true +1612,207,0,123,true +1613,117,0,97,true +1614,83,0,92,true +1615,134,0,113,true +1616,112,1,18,true +1617,509,0,274,true +1618,208,0,116,true +1619,208,0,97,true +1620,175,0,118,true +1621,113,0,103,true +1622,144,0,112,true +1623,18,3,4,true +1624,268,52,93,true +1625,279,0,129,true +1626,116,1,18,true +1627,5823,34,5001,true +1628,296,0,267,true +1629,309,0,264,true +1630,104,0,109,true +1631,168,0,104,true +1632,124,0,119,true +1633,130,0,101,true +1634,270,0,97,true +1635,318,0,262,true +1636,104,1,18,true +1637,153,0,93,true +1638,71,0,95,true +1639,127,0,95,true +1640,889,29,207,true +1641,406,0,127,true +1642,155,0,128,true +1643,85,0,97,true +1644,162,0,115,true +1645,175,0,104,true +1646,111,1,24,true +1647,251,0,125,true +1648,147,0,109,true +1649,99,0,105,true +1650,218,1,12,true +1651,286,0,116,true +1652,375,0,245,true +1653,78,0,104,true +1654,156,0,114,true +1655,290,0,251,true +1656,344,0,115,true +1657,148,0,105,true +1658,93,0,99,true +1659,214,1,21,true +1660,179,0,119,true +1661,571,0,238,true +1662,128,1,18,true +1663,115,1,24,true +1664,435,0,245,true +1665,144,0,107,true +1666,561,0,263,true +1667,222,0,121,true +1668,184,0,123,true +1669,142,0,108,true +1670,229,0,102,true +1671,2832,67,779,true +1672,119,1,21,true +1673,118,0,97,true +1674,119,0,92,true +1675,173,0,115,true +1676,138,0,107,true +1677,149,0,116,true +1678,127,0,127,true +1679,136,0,98,true +1680,206,0,88,true +1681,85,1,12,true +1682,216,1,24,true +1683,492,0,260,true +1684,197,0,107,true +1685,354,1,15,true +1686,68,0,88,true +1687,125,0,112,true +1688,143,1,21,true +1689,178,0,108,true +1690,238,0,111,true +1691,65,0,80,true +1692,127,0,99,true +1693,136,1,18,true +1694,18975,173,126,true +1695,146,1,18,true +1696,79,1,21,true +1697,91,0,107,true +1698,86,0,102,true +1699,427,0,255,true +1700,131,0,99,true +1701,87,0,98,true +1702,200,1,18,true +1703,206,1,15,true +1704,141,0,106,true +1705,245,0,121,true +1706,141,0,118,true +1707,110,1,18,true +1708,115,1,24,true +1709,55,1,24,true +1710,302,0,113,true +1711,169,1,24,true +1712,155,0,101,true +1713,219,1,15,true +1714,119,0,98,true +1715,170,0,121,true +1716,227,1,18,true +1717,239,0,105,true +1718,157,0,109,true +1719,87,0,105,true +1720,185,1,18,true +1721,178,1,18,true +1722,115,0,107,true +1723,83,1,24,true +1724,168,1,18,true +1725,103,0,108,true +1726,320,0,110,true +1727,113,0,106,true +1728,553,0,245,true +1729,143,0,122,true +1730,123,1,24,true +1731,179,0,108,true +1732,147,0,99,true +1733,193,1,12,true +1734,86,1,21,true +1735,2186,72,1012,true +1736,237,0,113,true +1737,263,0,93,true +1738,246,0,106,true +1739,371,0,122,true +1740,325,0,264,true +1741,97,0,113,true +1742,150,0,125,true +1743,360,1,12,true +1744,81,0,118,true +1745,72,0,89,true +1746,71,0,101,true +1747,134,0,109,true +1748,271,1,21,true +1749,242,1,15,true +1750,236,0,92,true +1751,119,1,18,true +1752,269,1,18,true +1753,109,0,126,true +1754,220,0,108,true +1755,143,0,113,true +1756,208,0,106,true +1757,162,0,93,true +1758,204,1,18,true +1759,128,0,114,true +1760,263,0,113,true +1761,229,0,107,true +1762,117,0,97,true +1763,613,0,264,true +1764,178,0,101,true +1765,239,0,121,true +1766,227,0,102,true +1767,191,1,18,true +1768,295,0,259,true +1769,172,0,132,true +1770,208,0,109,true +1771,189,1,18,true +1772,432,0,264,true +1773,191,0,112,true +1774,163,0,113,true +1775,113,0,85,true +1776,159,1,24,true +1777,268,0,109,true +1778,403,0,251,true +1779,68,1,21,true +1780,229,0,122,true +1781,140,0,105,true +1782,235,0,108,true +1783,93,0,109,true +1784,427,0,252,true +1785,181,1,18,true +1786,191,1,9,true +1787,179,0,104,true +1788,117,0,118,true +1789,397,0,248,true +1790,144,0,122,true +1791,238,1,12,true +1792,108,0,110,true +1793,129,1,24,true +1794,402,0,244,true +1795,72,0,87,true +1796,178,0,86,true +1797,90,0,105,true +1798,172,0,110,true +1799,105,0,93,true +1800,125,1,18,true +1801,73,1,9,true +1802,81,0,106,true +1803,55,1,18,true +1804,207,0,117,true +1805,195,0,108,true +1806,85,0,110,true +1807,169,0,122,true +1808,207,0,113,true +1809,232,0,112,true +1810,30976,276,162,true +1811,153,0,126,true +1812,189,0,91,true +1813,181,1,21,true +1814,188,0,108,true +1815,100,0,97,true +1816,236,0,100,true +1817,184,1,18,true +1818,2964,121,1783,true +1819,116,0,106,true +1820,136,0,132,true +1821,257,1,15,true +1822,132,0,112,true +1823,314,0,233,true +1824,79,0,95,true +1825,169,0,111,true +1826,189,0,105,true +1827,246,0,104,true +1828,414,0,247,true +1829,225,0,99,true +1830,238,0,137,true +1831,121,0,84,true +1832,132,0,140,true +1833,197,1,12,true +1834,129,0,99,true +1835,166,0,125,true +1836,73,0,92,true +1837,327,0,255,true +1838,104,1,18,true +1839,118,0,140,true +1840,87,0,92,true +1841,305,0,111,true +1842,381,1,12,true +1843,117,0,108,true +1844,128,0,127,true +1845,225,0,111,true +1846,92,1,21,true +1847,111,0,92,true +1848,286,0,90,true +1849,184,0,104,true +1850,212,0,115,true +1851,428,0,264,true +1852,100,0,120,true +1853,90,0,107,true +1854,132,0,98,true +1855,726,0,264,true +1856,252,0,117,true +1857,143,0,122,true +1858,5349,82,4608,true +1859,113,1,18,true +1860,212,0,114,true +1861,109,1,21,true +1862,321,0,242,true +1863,137,1,18,true +1864,270,1,15,true +1865,189,0,140,true +1866,155,0,108,true +1867,141,0,85,true +1868,6356,119,5001,true +1869,142,0,106,true +1870,67,0,92,true +1871,605,0,272,true +1872,137,0,103,true +1873,123,0,97,true +1874,125,0,107,true +1875,260,0,112,true +1876,70,0,97,true +1877,176,0,126,true +1878,556,24,337,true +1879,146,0,110,true +1880,129,1,12,true +1881,174,0,121,true +1882,93,0,116,true +1883,99,0,110,true +1884,211,1,24,true +1885,205,0,127,true +1886,90,1,12,true +1887,346,1,15,true +1888,185,1,18,true +1889,192,0,113,true +1890,130,1,21,true +1891,37,10,13,true +1892,85,1,12,true +1893,154,0,121,true +1894,136,0,109,true +1895,125,0,129,true +1896,162,0,109,true +1897,160,1,24,true +1898,220,1,18,true +1899,225,0,99,true +1900,619,0,108,true +1901,94,0,102,true +1902,112,0,109,true +1903,29114,217,141,true +1904,94,0,116,true +1905,131,0,113,true +1906,98,1,24,true +1907,420,0,127,true +1908,269,0,122,true +1909,128,0,91,true +1910,606,1,18,true +1911,214,0,123,true +1912,677,0,258,true +1913,186,0,111,true +1914,201,0,97,true +1915,127,0,99,true +1916,410,0,255,true +1917,103,0,126,true +1918,104,0,109,true +1919,79,1,24,true +1920,204,0,255,true +1921,49304,462,210,true +1922,194,0,109,true +1923,333,1,15,true +1924,185,1,18,true +1925,110,0,111,true +1926,123,0,116,true +1927,407,0,257,true +1928,156,1,24,true +1929,102,1,12,true +1930,199,0,93,true +1931,105,0,102,true +1932,111,0,101,true +1933,277,0,228,true +1934,81,0,100,true +1935,146,0,118,true +1936,98,0,119,true +1937,213,1,12,true +1938,99,0,101,true +1939,189,0,105,true +1940,81,0,99,true +1941,384,0,248,true +1942,77,0,104,true +1943,349,1,15,true +1944,148,0,117,true +1945,90,0,86,true +1946,155,0,95,true +1947,401,0,262,true +1948,258,1,15,true +1949,109,0,92,true +1950,166,0,104,true +1951,125,1,24,true +1952,192,0,90,true +1953,218,0,126,true +1954,187,1,18,true +1955,308,0,109,true +1956,193,0,140,true +1957,7316,64,5001,true +1958,2558,95,1165,true +1959,198,1,12,true +1960,96,0,99,true +1961,166,0,113,true +1962,117,0,101,true +1963,325,0,260,true +1964,97,0,121,true +1965,258,1,21,true +1966,163,0,112,true +1967,175,1,21,true +1968,337,0,238,true +1969,212,0,128,true +1970,195,1,15,true +1971,112,0,95,true +1972,263,0,130,true +1973,168,0,123,true +1974,187,0,95,true +1975,70,0,90,true +1976,108,0,99,true +1977,141,0,115,true +1978,200,0,138,true +1979,223,0,105,true +1980,135,1,24,true +1981,131,0,115,true +1982,200,0,116,true +1983,303,0,111,true +1984,128,0,139,true +1985,116,0,125,true +1986,102,0,129,true +1987,149,0,110,true +1988,147,0,112,true +1989,61,1,15,true +1990,144,0,98,true +1991,134,0,93,true +1992,168,0,140,true +1993,201,0,124,true +1994,143,1,24,true +1995,187,1,18,true +1996,544,31,324,true +1997,80,1,21,true +1998,99,0,99,true +1999,127,0,80,true +2000,89,0,87,true +2001,104,1,18,true +2002,277,0,245,true +2003,105,0,132,true +2004,378,1,18,true +2005,178,0,113,true +2006,211,1,12,true +2007,163,0,123,true +2008,254,0,99,true +2009,225,0,127,true +2010,208,0,115,true +2011,255,0,95,true +2012,252,0,105,true +2013,200,1,9,true +2014,83,0,92,true +2015,157,0,123,true +2016,132,0,122,true +2017,4316,132,3446,true +2018,203,1,18,true +2019,243,0,119,true +2020,83,0,101,true +2021,93,0,101,true +2022,184,0,96,true +2023,163,0,102,true +2024,166,0,98,true +2025,156,0,136,true +2026,224,0,103,true +2027,140,0,122,true +2028,130,0,119,true +2029,182,1,18,true +2030,3192,63,2368,true +2031,204,0,102,true +2032,180,0,92,true +2033,187,0,110,true +2034,200,0,108,true +2035,4745,125,4042,true +2036,360,0,140,true +2037,2211,55,750,true +2038,157,0,92,true +2039,123,1,18,true +2040,115,1,21,true +2041,707,0,264,true +2042,181,0,92,true +2043,632,0,230,true +2044,185,0,106,true +2045,451,0,264,true +2046,168,1,18,true +2047,140,0,119,true +2048,64,1,15,true +2049,214,0,105,true +2050,113,1,12,true +2051,110,0,132,true +2052,277,1,15,true +2053,260,1,18,true +2054,106,0,120,true +2055,344,0,248,true +2056,222,0,103,true +2057,163,0,86,true +2058,117,1,18,true +2059,216,0,94,true +2060,233,0,127,true +2061,210,0,124,true +2062,137,0,99,true +2063,932,38,182,true +2064,134,0,98,true +2065,692,0,257,true +2066,81,0,92,true +2067,309,0,113,true +2068,136,0,110,true +2069,9289,105,5001,true +2070,225,0,94,true +2071,322,0,105,true +2072,258,0,108,true +2073,193,1,24,true +2074,174,0,114,true +2075,357,0,116,true +2076,220,0,97,true +2077,187,0,112,true +2078,232,0,112,true +2079,130,0,110,true +2080,137,0,104,true +2081,413,0,252,true +2082,268,0,126,true +2083,79,0,101,true +2084,176,1,15,true +2085,130,1,18,true +2086,132,0,113,true +2087,301,0,98,true +2088,438,0,242,true +2089,58,1,12,true +2090,47451,379,213,true +2091,203,0,108,true +2092,72,0,92,true +2093,392,0,262,true +2094,561,0,239,true +2095,248,0,126,true +2096,207,0,98,true +2097,111,0,93,true +2098,90,0,97,true +2099,109,1,24,true +2100,90,1,24,true +2101,210,0,93,true +2102,97,0,87,true +2103,647,0,237,true +2104,222,0,102,true +2105,211,1,18,true +2106,246,1,12,true +2107,140,1,15,true +2108,249,0,97,true +2109,320,1,18,true +2110,118,0,100,true +2111,119,0,92,true +2112,436,0,271,true +2113,118,0,111,true +2114,97,0,94,true +2115,290,0,243,true +2116,252,0,132,true +2117,359,0,107,true +2118,28960,281,201,true +2119,425,0,258,true +2120,238,0,115,true +2121,141,0,107,true +2122,229,1,18,true +2123,199,1,18,true +2124,225,0,132,true +2125,137,1,24,true +2126,137,0,113,true +2127,122,1,24,true +2128,241,1,18,true +2129,182,1,24,true +2130,379,1,15,true +2131,109,0,124,true +2132,219,1,18,true +2133,252,0,110,true +2134,226,0,123,true +2135,170,0,109,true +2136,344,22,230,true +2137,201,0,108,true +2138,81,0,110,true +2139,385,0,253,true +2140,91,8,25,true +2141,105,0,91,true +2142,140,0,100,true +2143,235,0,127,true +2144,668,0,248,true +2145,112,0,126,true +2146,97,0,92,true +2147,141,0,94,true +2148,178,0,112,true +2149,156,0,94,true +2150,96,0,92,true +2151,192,1,18,true +2152,169,0,114,true +2153,144,1,9,true +2154,363,0,256,true +2155,113,1,18,true +2156,188,0,128,true +2157,124,0,124,true +2158,122,0,111,true +2159,161,0,112,true +2160,117,0,104,true +2161,124,0,107,true +2162,132,0,111,true +2163,71,0,97,true +2164,790,0,252,true +2165,198,0,138,true +2166,138,0,113,true +2167,219,0,105,true +2168,117,1,18,true +2169,277,1,12,true +2170,167,0,80,true +2171,189,0,119,true +2172,243,0,105,true +2173,165,1,18,true +2174,274,0,115,true +2175,163,0,140,true +2176,237,0,105,true +2177,396,0,247,true +2178,62,1,21,true +2179,352,1,15,true +2180,252,0,114,true +2181,307,0,110,true +2182,314,0,112,true +2183,150,0,97,true +2184,157,0,131,true +2185,252,0,104,true +2186,208,1,18,true +2187,242,0,115,true +2188,54056,459,264,true +2189,441,0,253,true +2190,91,0,86,true +2191,93,0,108,true +2192,148,1,24,true +2193,172,0,114,true +2194,362,0,274,true +2195,118,0,96,true +2196,232,0,135,true +2197,201,1,18,true +2198,90,0,105,true +2199,188,0,89,true +2200,71,1,15,true +2201,173,0,116,true +2202,200,0,115,true +2203,168,0,126,true +2204,161,0,109,true +2205,179,0,113,true +2206,477,1,15,true +2207,191,0,113,true +2208,115,1,18,true +2209,229,0,95,true +2210,149,1,12,true +2211,319,0,239,true +2212,67,0,88,true +2213,2907,43,1450,true +2214,205,1,18,true +2215,124,0,114,true +2216,125,0,127,true +2217,184,1,15,true +2218,100,0,126,true +2219,237,0,128,true +2220,189,0,93,true +2221,6493,44,5001,true +2222,201,0,120,true +2223,395,1,15,true +2224,137,1,9,true +2225,2737,83,1686,true +2226,165,0,113,true +2227,230,0,105,true +2228,73,0,95,true +2229,233,0,112,true +2230,212,0,104,true +2231,181,0,92,true +2232,191,1,21,true +2233,201,0,98,true +2234,391,0,249,true +2235,195,1,18,true +2236,306,0,135,true +2237,79,0,92,true +2238,239,1,18,true +2239,211,1,18,true +2240,434,0,251,true +2241,175,1,24,true +2242,257,0,107,true +2243,112,0,94,true +2244,642,0,257,true +2245,226,0,116,true +2246,150,0,97,true +2247,116,1,18,true +2248,128,0,93,true +2249,75,0,109,true +2250,217,1,21,true +2251,261,1,21,true +2252,98,1,21,true +2253,113,1,24,true +2254,197,1,21,true +2255,298,0,119,true +2256,224,0,110,true +2257,140,0,104,true +2258,222,1,18,true +2259,131,1,18,true +2260,332,0,270,true +2261,75,1,18,true +2262,167,0,124,true +2263,112,1,18,true +2264,100,0,97,true +2265,142,1,24,true +2266,70,0,90,true +2267,191,1,18,true +2268,112,0,112,true +2269,119,1,18,true +2270,242,0,100,true +2271,290,0,241,true +2272,56,1,21,true +2273,909,0,112,true +2274,559,1,15,true +2275,204,0,116,true +2276,220,0,122,true +2277,103,1,12,true +2278,84,0,97,true +2279,119,1,18,true +2280,159,0,88,true +2281,85,1,18,true +2282,91,0,113,true +2283,117,1,24,true +2284,112,1,18,true +2285,137,1,12,true +2286,6919,12,5001,true +2287,168,0,99,true +2288,219,0,119,true +2289,419,0,281,true +2290,151,0,90,true +2291,100,0,110,true +2292,1548,46,706,true +2293,254,0,110,true +2294,130,0,108,true +2295,130,0,115,true +2296,227,1,15,true +2297,210,0,121,true +2298,295,0,121,true +2299,241,0,113,true +2300,356,1,21,true +2301,151,0,115,true +2302,406,0,257,true +2303,102,0,130,true +2304,321,0,114,true +2305,204,0,117,true +2306,192,0,93,true +2307,141,1,24,true +2308,115,1,15,true +2309,242,0,113,true +2310,83,1,24,true +2311,150,0,91,true +2312,65,0,81,true +2313,161,0,103,true +2314,2272,60,1467,true +2315,113,1,18,true +2316,94,0,100,true +2317,319,0,108,true +2318,180,0,99,true +2319,211,1,15,true +2320,138,0,104,true +2321,185,0,114,true +2322,218,0,126,true +2323,150,0,105,true +2324,154,0,125,true +2325,199,0,115,true +2326,132,1,9,true +2327,207,0,108,true +2328,70,0,100,true +2329,415,0,256,true +2330,121,0,107,true +2331,218,1,18,true +2332,216,0,126,true +2333,288,0,250,true +2334,169,1,15,true +2335,236,0,104,true +2336,223,0,103,true +2337,201,1,24,true +2338,236,0,104,true +2339,227,0,121,true +2340,178,0,126,true +2341,210,0,107,true +2342,174,0,100,true +2343,147,0,94,true +2344,218,1,15,true +2345,219,0,124,true +2346,317,1,18,true +2347,140,0,106,true +2348,210,1,24,true +2349,151,1,18,true +2350,400,0,252,true +2351,70,0,92,true +2352,322,0,122,true +2353,188,1,12,true +2354,238,0,95,true +2355,81,0,107,true +2356,144,0,112,true +2357,263,0,120,true +2358,143,0,120,true +2359,395,0,252,true +2360,93,0,125,true +2361,176,0,108,true +2362,150,0,83,true +2363,327,0,114,true +2364,130,1,18,true +2365,165,1,24,true +2366,195,1,18,true +2367,282,0,120,true +2368,125,0,98,true +2369,121,0,104,true +2370,94,0,118,true +2371,112,0,115,true +2372,55,1,24,true +2373,331,0,259,true +2374,229,0,114,true +2375,83,0,105,true +2376,147,1,21,true +2377,128,1,24,true +2378,395,0,237,true +2379,175,1,18,true +2380,106,0,97,true +2381,217,0,97,true +2382,279,0,115,true +2383,284,1,21,true +2384,155,0,140,true +2385,180,1,18,true +2386,255,0,110,true +2387,265,1,21,true +2388,163,0,108,true +2389,135,0,104,true +2390,92,1,21,true +2391,159,0,124,true +2392,146,0,116,true +2393,118,0,106,true +2394,144,0,117,true +2395,175,1,21,true +2396,220,0,120,true +2397,208,0,106,true +2398,227,0,111,true +2399,288,0,246,true +2400,226,1,15,true +2401,99,0,124,true +2402,205,1,18,true +2403,204,0,111,true +2404,315,0,108,true +2405,232,0,97,true +2406,125,1,21,true +2407,68,1,24,true +2408,131,1,21,true +2409,93,0,101,true +2410,277,0,237,true +2411,135,0,126,true +2412,232,0,115,true +2413,127,0,102,true +2414,226,1,18,true +2415,178,0,105,true +2416,132,0,96,true +2417,199,0,117,true +2418,130,0,104,true +2419,151,0,122,true +2420,142,0,117,true +2421,219,1,15,true +2422,150,0,122,true +2423,313,1,12,true +2424,328,0,235,true +2425,62,1,12,true +2426,296,0,117,true +2427,157,0,119,true +2428,125,0,92,true +2429,96,0,104,true +2430,486,0,260,true +2431,175,0,115,true +2432,189,0,111,true +2433,349,0,261,true +2434,67,0,90,true +2435,156,0,114,true +2436,236,0,107,true +2437,217,0,122,true +2438,157,0,109,true +2439,188,1,18,true +2440,305,0,261,true +2441,137,0,116,true +2442,89,0,95,true +2443,135,1,18,true +2444,113,0,90,true +2445,58,1,18,true +2446,123,0,96,true +2447,84,0,117,true +2448,115,0,101,true +2449,284,0,114,true +2450,185,0,125,true +2451,150,0,103,true +2452,514,0,253,true +2453,146,0,126,true +2454,98,1,21,true +2455,151,0,84,true +2456,98,0,103,true +2457,1319,74,415,true +2458,184,0,107,true +2459,435,0,242,true +2460,106,1,18,true +2461,147,0,110,true +2462,83,0,116,true +2463,143,0,117,true +2464,90,0,86,true +2465,168,0,125,true +2466,138,0,113,true +2467,117,0,91,true +2468,5461,8,5001,true +2469,208,1,24,true +2470,85,0,101,true +2471,117,1,21,true +2472,134,0,134,true +2473,403,0,255,true +2474,81,0,104,true +2475,198,0,114,true +2476,106,1,21,true +2477,140,0,124,true +2478,124,0,140,true +2479,129,0,105,true +2480,242,0,108,true +2481,36653,362,258,true +2482,111,0,115,true +2483,219,1,15,true +2484,135,0,100,true +2485,103,0,101,true +2486,92,0,103,true +2487,339,1,18,true +2488,113,1,21,true +2489,138,0,127,true +2490,90,0,105,true +2491,394,0,245,true +2492,235,0,111,true +2493,149,1,18,true +2494,149,1,21,true +2495,142,0,99,true +2496,142,0,91,true +2497,75,0,104,true +2498,222,1,15,true +2499,112,1,18,true +2500,216,0,114,true +2501,184,0,92,true +2502,197,0,122,true +2503,217,1,18,true +2504,116,1,18,true +2505,108,1,21,true +2506,258,1,18,true +2507,142,0,119,true +2508,214,0,115,true +2509,214,0,110,true +2510,195,0,114,true +2511,150,0,129,true +2512,73,1,24,true +2513,243,1,15,true +2514,199,1,24,true +2515,268,0,107,true +2516,40032,374,213,true +2517,449,0,243,true +2518,27619,285,237,true +2519,136,0,110,true +2520,144,0,120,true +2521,142,0,100,true +2522,204,1,21,true +2523,132,0,82,true +2524,148,0,102,true +2525,315,0,114,true +2526,142,0,104,true +2527,136,1,18,true +2528,205,0,95,true +2529,105,0,104,true +2530,129,0,91,true +2531,282,0,247,true +2532,93,0,123,true +2533,442,0,259,true +2534,173,0,120,true +2535,280,0,117,true +2536,144,0,88,true +2537,161,0,98,true +2538,105,0,104,true +2539,96,0,116,true +2540,214,0,106,true +2541,161,0,106,true +2542,222,0,111,true +2543,80,0,105,true +2544,132,1,18,true +2545,160,0,99,true +2546,132,0,119,true +2547,156,0,131,true +2548,128,0,104,true +2549,92,0,96,true +2550,79,0,92,true +2551,168,0,92,true +2552,341,0,106,true +2553,262,1,12,true +2554,216,1,24,true +2555,383,0,237,true +2556,66,1,21,true +2557,115,0,97,true +2558,163,0,122,true +2559,250,0,109,true +2560,337,1,15,true +2561,163,1,15,true +2562,237,0,116,true +2563,992,71,625,true +2564,157,0,112,true +2565,116,0,110,true +2566,75,0,104,true +2567,5822,40,5001,true +2568,222,0,121,true +2569,689,0,253,true +2570,135,0,108,true +2571,134,0,112,true +2572,142,0,103,true +2573,168,0,109,true +2574,199,1,18,true +2575,401,0,236,true +2576,104,0,95,true +2577,127,0,115,true +2578,239,0,110,true +2579,220,0,88,true +2580,94,0,102,true +2581,201,1,24,true +2582,105,1,21,true +2583,106,0,104,true +2584,181,0,120,true +2585,251,0,110,true +2586,174,0,113,true +2587,108,0,110,true +2588,439,0,267,true +2589,701,0,270,true +2590,261,1,21,true +2591,77,0,104,true +2592,143,0,92,true +2593,90,0,107,true +2594,239,1,15,true +2595,155,0,108,true +2596,227,0,118,true +2597,179,0,85,true +2598,233,0,104,true +2599,189,0,92,true +2600,534,0,262,true +2601,160,0,106,true +2602,89,0,95,true +2603,166,0,106,true +2604,110,1,24,true +2605,132,0,105,true +2606,116,1,18,true +2607,281,0,104,true +2608,98,0,106,true +2609,172,0,135,true +2610,260,0,138,true +2611,175,0,115,true +2612,313,0,259,true +2613,106,0,114,true +2614,156,0,94,true +2615,191,0,113,true +2616,252,0,141,true +2617,200,0,113,true +2618,119,0,98,true +2619,163,0,107,true +2620,212,0,111,true +2621,395,0,245,true +2622,111,0,122,true +2623,103,0,113,true +2624,132,0,111,true +2625,77,0,110,true +2626,193,0,122,true +2627,225,0,104,true +2628,193,0,107,true +2629,41422,382,246,true +2630,123,1,12,true +2631,80,0,92,true +2632,334,1,15,true +2633,205,0,113,true +2634,535,0,256,true +2635,191,0,103,true +2636,131,0,122,true +2637,218,1,12,true +2638,118,0,103,true +2639,66,0,90,true +2640,150,1,24,true +2641,110,1,18,true +2642,103,1,9,true +2643,200,0,114,true +2644,162,0,127,true +2645,231,1,15,true +2646,153,0,108,true +2647,138,0,108,true +2648,169,0,121,true +2649,128,1,18,true +2650,250,1,18,true +2651,105,0,124,true +2652,135,0,103,true +2653,200,0,104,true +2654,92,0,92,true +2655,143,0,116,true +2656,147,0,115,true +2657,129,0,92,true +2658,132,0,95,true +2659,75,0,104,true +2660,337,0,256,true +2661,143,0,110,true +2662,130,1,24,true +2663,100,0,89,true +2664,169,0,101,true +2665,184,0,80,true +2666,83,0,112,true +2667,149,0,126,true +2668,155,0,128,true +2669,75,0,90,true +2670,98,0,102,true +2671,174,0,89,true +2672,244,0,97,true +2673,110,1,12,true +2674,77,1,12,true +2675,207,0,125,true +2676,116,1,18,true +2677,140,1,24,true +2678,100,1,24,true +2679,148,0,89,true +2680,131,0,103,true +2681,96,0,101,true +2682,254,0,123,true +2683,186,0,92,true +2684,111,1,21,true +2685,92,0,111,true +2686,354,0,243,true +2687,229,0,122,true +2688,154,0,110,true +2689,219,1,21,true +2690,87,0,100,true +2691,140,0,109,true +2692,118,0,140,true +2693,169,0,120,true +2694,307,0,245,true +2695,102,1,9,true +2696,150,0,107,true +2697,212,0,107,true +2698,182,1,24,true +2699,287,0,112,true +2700,142,0,112,true +2701,229,1,18,true +2702,130,1,15,true +2703,153,0,86,true +2704,203,0,99,true +2705,68,1,18,true +2706,265,0,126,true +2707,136,0,108,true +2708,122,0,113,true +2709,124,0,92,true +2710,155,0,97,true +2711,70,0,98,true +2712,371,0,271,true +2713,83,0,92,true +2714,11990,75,78,true +2715,117,1,18,true +2716,243,1,15,true +2717,97,0,126,true +2718,168,0,103,true +2719,219,0,116,true +2720,362,0,256,true +2721,157,0,113,true +2722,100,1,12,true +2723,156,0,121,true +2724,147,1,18,true +2725,212,0,114,true +2726,151,0,117,true +2727,567,0,252,true +2728,130,0,114,true +2729,119,0,116,true +2730,175,0,102,true +2731,216,1,18,true +2732,186,0,107,true +2733,33672,308,168,true +2734,211,0,115,true +2735,68,0,97,true +2736,391,0,248,true +2737,198,0,121,true +2738,154,1,24,true +2739,121,0,107,true +2740,160,0,130,true +2741,74,1,18,true +2742,178,1,18,true +2743,146,0,120,true +2744,195,0,112,true +2745,100,0,108,true +2746,80,0,101,true +2747,149,0,115,true +2748,116,0,106,true +2749,594,0,254,true +2750,676,0,264,true +2751,271,0,104,true +2752,200,0,113,true +2753,113,0,96,true +2754,166,1,24,true +2755,193,0,113,true +2756,187,0,113,true +2757,407,0,248,true +2758,189,1,18,true +2759,131,1,21,true +2760,150,0,125,true +2761,108,0,126,true +2762,83,1,24,true +2763,169,0,105,true +2764,102,0,99,true +2765,147,0,109,true +2766,64,1,12,true +2767,394,1,15,true +2768,189,1,18,true +2769,452,0,264,true +2770,159,0,104,true +2771,191,31,71,true +2772,160,0,125,true +2773,129,1,21,true +2774,144,0,112,true +2775,195,0,117,true +2776,74,1,12,true +2777,90,0,97,true +2778,167,0,100,true +2779,289,0,242,true +2780,108,0,104,true +2781,79,1,24,true +2782,292,0,243,true +2783,94,0,121,true +2784,144,0,115,true +2785,137,1,18,true +2786,80,1,21,true +2787,125,1,12,true +2788,217,0,128,true +2789,136,0,100,true +2790,301,0,116,true +2791,108,0,106,true +2792,349,0,256,true +2793,72,0,97,true +2794,117,1,18,true +2795,122,1,15,true +2796,143,0,99,true +2797,130,0,92,true +2798,73,0,91,true +2799,184,1,18,true +2800,153,1,24,true +2801,116,0,97,true +2802,262,1,15,true +2803,143,0,105,true +2804,140,0,112,true +2805,92,0,104,true +2806,125,1,18,true +2807,182,1,15,true +2808,165,0,118,true +2809,143,1,21,true +2810,135,1,24,true +2811,131,0,102,true +2812,140,0,113,true +2813,115,1,18,true +2814,131,1,18,true +2815,103,0,95,true +2816,132,0,113,true +2817,216,1,18,true +2818,99,0,104,true +2819,116,0,140,true +2820,333,0,114,true +2821,155,1,15,true +2822,157,0,110,true +2823,312,1,15,true +2824,162,1,21,true +2825,231,0,103,true +2826,176,0,109,true +2827,238,0,112,true +2828,150,0,110,true +2829,154,0,90,true +2830,204,0,91,true +2831,87,0,96,true +2832,162,1,18,true +2833,203,0,93,true +2834,476,0,264,true +2835,200,0,108,true +2836,188,0,119,true +2837,108,1,9,true +2838,194,1,21,true +2839,159,0,131,true +2840,142,0,115,true +2841,745,69,405,true +2842,493,0,268,true +2843,93,0,108,true +2844,200,1,18,true +2845,116,1,21,true +2846,136,0,111,true +2847,144,0,107,true +2848,127,0,92,true +2849,119,1,24,true +2850,102,1,18,true +2851,112,0,107,true +2852,327,0,108,true +2853,189,0,103,true +2854,435,0,246,true +2855,96,0,107,true +2856,487,1,15,true +2857,163,0,123,true +2858,134,1,18,true +2859,175,1,18,true +2860,119,0,98,true +2861,134,0,108,true +2862,25875,273,213,true +2863,179,1,24,true +2864,281,1,15,true +2865,102,0,92,true +2866,116,1,18,true +2867,187,1,18,true +2868,127,1,18,true +2869,122,0,107,true +2870,303,0,112,true +2871,122,1,21,true +2872,376,1,15,true +2873,84,1,21,true +2874,3431,100,2285,true +2875,91,0,112,true +2876,112,0,124,true +2877,159,0,113,true +2878,70,0,93,true +2879,313,0,257,true +2880,87,0,112,true +2881,25490,239,153,true +2882,448,0,277,true +2883,176,0,103,true +2884,176,0,109,true +2885,875,28,452,true +2886,130,0,118,true +2887,661,0,248,true +2888,165,0,125,true +2889,148,0,127,true +2890,142,0,120,true +2891,166,1,21,true +2892,249,0,110,true +2893,123,0,123,true +2894,132,0,97,true +2895,130,0,97,true +2896,154,0,121,true +2897,89,0,103,true +2898,151,0,115,true +2899,269,1,18,true +2900,146,0,127,true +2901,273,0,112,true +2902,362,0,275,true +2903,134,0,90,true +2904,79,1,18,true +2905,179,0,101,true +2906,125,0,100,true +2907,166,1,24,true +2908,191,0,106,true +2909,147,1,21,true +2910,86,0,92,true +2911,200,0,100,true +2912,300,0,242,true +2913,130,0,92,true +2914,110,1,18,true +2915,188,0,127,true +2916,105,0,104,true +2917,320,1,15,true +2918,287,1,24,true +2919,140,1,24,true +2920,154,0,122,true +2921,132,0,107,true +2922,117,1,21,true +2923,137,0,98,true +2924,322,0,242,true +2925,322,0,246,true +2926,97,0,117,true +2927,111,1,12,true +2928,112,0,121,true +2929,132,0,99,true +2930,246,1,15,true +2931,159,0,130,true +2932,135,1,18,true +2933,93,1,24,true +2934,138,1,18,true +2935,163,0,124,true +2936,128,1,24,true +2937,123,0,109,true +2938,618,0,250,true +2939,100,1,21,true +2940,2716,57,1541,true +2941,149,0,86,true +2942,136,0,110,true +2943,74,0,103,true +2944,142,0,120,true +2945,269,0,118,true +2946,495,0,250,true +2947,108,1,21,true +2948,166,0,97,true +2949,128,0,94,true +2950,223,0,113,true +2951,78,1,12,true +2952,160,0,115,true +2953,160,0,140,true +2954,241,0,121,true +2955,142,1,18,true +2956,241,0,109,true +2957,187,1,18,true +2958,116,1,18,true +2959,250,1,15,true +2960,144,0,108,true +2961,104,1,24,true +2962,131,0,90,true +2963,121,1,24,true +2964,237,0,127,true +2965,87,0,111,true +2966,75,0,94,true +2967,227,0,110,true +2968,72,0,92,true +2969,74,0,92,true +2970,137,0,109,true +2971,108,0,83,true +2972,176,0,119,true +2973,194,0,127,true +2974,287,0,136,true +2975,324,0,252,true +2976,112,0,123,true +2977,3815,96,2492,true +2978,4997,102,3255,true +2979,5180,104,4353,true +2980,307,0,254,true +2981,194,0,110,true +2982,123,1,21,true +2983,213,0,124,true +2984,319,20,121,true +2985,135,1,12,true +2986,404,0,253,true +2987,77,0,98,true +2988,110,0,96,true +2989,118,1,15,true +2990,138,1,21,true +2991,282,1,18,true +2992,94,0,92,true +2993,154,0,125,true +2994,227,1,15,true +2995,125,0,97,true +2996,296,0,242,true +2997,86,0,98,true +2998,111,1,18,true +2999,664,0,257,true +3000,241,0,116,true +3001,391,0,260,true +3002,225,1,15,true +3003,187,0,95,true +3004,146,0,80,true +3005,4043,144,2568,true +3006,103,1,18,true +3007,210,0,92,true +3008,80,0,87,true +3009,213,1,18,true +3010,146,1,21,true +3011,132,0,116,true +3012,105,0,95,true +3013,148,0,124,true +3014,68,0,93,true +3015,136,0,86,true +3016,149,1,24,true +3017,307,0,98,true +3018,30906,283,198,true +3019,150,0,124,true +3020,186,0,90,true +3021,169,0,120,true +3022,330,1,15,true +3023,68,1,24,true +3024,308,0,256,true +3025,118,0,100,true +3026,194,0,110,true +3027,149,0,119,true +3028,191,0,108,true +3029,98,1,15,true +3030,122,1,18,true +3031,360,0,264,true +3032,179,1,18,true +3033,70,1,24,true +3034,147,0,122,true +3035,250,0,113,true +3036,140,0,114,true +3037,293,1,24,true +3038,106,1,15,true +3039,132,0,132,true +3040,157,0,99,true +3041,90,0,111,true +3042,194,0,96,true +3043,140,0,87,true +3044,89,1,21,true +3045,276,0,107,true +3046,208,0,111,true +3047,391,0,264,true +3048,130,0,86,true +3049,103,0,107,true +3050,121,0,109,true +3051,170,1,24,true +3052,199,0,110,true +3053,172,0,92,true +3054,172,0,92,true +3055,140,0,103,true +3056,127,1,15,true +3057,324,0,255,true +3058,260,0,120,true +3059,282,0,247,true +3060,109,1,18,true +3061,124,0,113,true +3062,169,0,108,true +3063,461,27,155,true +3064,448,0,255,true +3065,70,1,12,true +3066,109,1,21,true +3067,87,0,97,true +3068,271,0,130,true +3069,131,1,21,true +3070,263,0,115,true +3071,90,1,24,true +3072,146,1,21,true +3073,173,0,112,true +3074,461,0,257,true +3075,87,0,114,true +3076,771,0,270,true +3077,195,0,103,true +3078,117,0,108,true +3079,122,0,128,true +3080,143,0,125,true +3081,129,0,127,true +3082,419,0,267,true +3083,320,0,113,true +3084,200,0,103,true +3085,119,0,107,true +3086,197,0,109,true +3087,21308,180,102,true +3088,80,1,21,true +3089,109,1,21,true +3090,70,1,12,true +3091,184,1,18,true +3092,135,0,104,true +3093,130,1,24,true +3094,337,1,15,true +3095,258,0,113,true +3096,79,0,88,true +3097,113,0,86,true +3098,129,0,92,true +3099,160,0,138,true +3100,128,0,97,true +3101,204,0,108,true +3102,84,0,110,true +3103,4322,78,2853,true +3104,199,0,123,true +3105,218,0,88,true +3106,141,1,18,true +3107,147,0,109,true +3108,144,1,15,true +3109,274,0,230,true +3110,73,0,92,true +3111,111,1,18,true +3112,394,0,237,true +3113,96,1,24,true +3114,123,0,97,true +3115,282,0,255,true +3116,246,0,109,true +3117,363,1,15,true +3118,154,0,92,true +3119,113,1,18,true +3120,102,0,98,true +3121,241,0,114,true +3122,127,0,119,true +3123,102,0,98,true +3124,160,0,108,true +3125,79,0,80,true +3126,127,0,94,true +3127,211,0,90,true +3128,314,0,263,true +3129,138,1,18,true +3130,162,0,109,true +3131,150,0,92,true +3132,94,0,110,true +3133,226,0,111,true +3134,3158,64,2118,true +3135,211,0,95,true +3136,80,0,110,true +3137,210,0,101,true +3138,489,0,228,true +3139,208,0,114,true +3140,161,0,89,true +3141,124,0,112,true +3142,147,0,104,true +3143,251,0,113,true +3144,324,0,117,true +3145,301,0,111,true +3146,157,0,123,true +3147,188,1,18,true +3148,344,0,108,true +3149,174,0,119,true +3150,299,0,273,true +3151,21137,201,114,true +3152,235,0,115,true +3153,249,0,125,true +3154,216,0,108,true +3155,105,0,104,true +3156,204,1,18,true +3157,150,1,18,true +3158,4066,97,3207,true +3159,123,0,108,true +3160,144,0,105,true +3161,277,1,18,true +3162,134,1,18,true +3163,168,0,113,true +3164,148,0,124,true +3165,80,0,95,true +3166,92,0,96,true +3167,194,0,112,true +3168,109,1,18,true +3169,175,0,96,true +3170,360,0,262,true +3171,94,0,111,true +3172,189,1,18,true +3173,156,1,24,true +3174,143,1,12,true +3175,105,0,108,true +3176,334,0,256,true +3177,125,0,120,true +3178,419,0,261,true +3179,165,0,107,true +3180,163,0,115,true +3181,162,0,124,true +3182,194,1,18,true +3183,251,0,107,true +3184,130,0,106,true +3185,121,0,127,true +3186,96,0,89,true +3187,227,1,15,true +3188,141,0,117,true +3189,131,0,109,true +3190,124,1,21,true +3191,146,0,86,true +3192,366,1,12,true +3193,293,0,260,true +3194,186,1,18,true +3195,128,0,117,true +3196,153,0,93,true +3197,217,0,110,true +3198,162,0,123,true +3199,137,1,18,true +3200,93,1,24,true +3201,178,0,80,true +3202,60,1,18,true +3203,210,0,122,true +3204,381,1,12,true +3205,131,0,116,true +3206,85,1,24,true +3207,121,0,103,true +3208,124,1,24,true +3209,233,0,112,true +3210,197,0,90,true +3211,276,0,97,true +3212,359,1,12,true +3213,267,1,15,true +3214,883,0,243,true +3215,213,0,126,true +3216,187,1,18,true +3217,123,1,18,true +3218,122,1,24,true +3219,210,1,15,true +3220,132,1,18,true +3221,296,0,259,true +3222,96,0,97,true +3223,218,0,113,true +3224,143,0,110,true +3225,118,1,18,true +3226,124,0,93,true +3227,276,0,106,true +3228,7610,78,2814,true +3229,93,0,100,true +3230,90,0,105,true +3231,142,0,107,true +3232,242,0,124,true +3233,373,1,12,true +3234,110,0,114,true +3235,123,1,24,true +3236,137,0,105,true +3237,203,0,120,true +3238,401,0,262,true +3239,417,0,236,true +3240,180,0,101,true +3241,777,0,234,true +3242,203,1,24,true +3243,162,0,107,true +3244,135,0,97,true +3245,168,0,111,true +3246,2929,83,2243,true +3247,174,1,15,true +3248,93,0,104,true +3249,229,0,108,true +3250,79,0,109,true +3251,208,1,24,true +3252,207,0,122,true +3253,408,1,15,true +3254,204,0,109,true +3255,178,0,111,true +3256,281,0,108,true +3257,231,0,116,true +3258,97,0,109,true +3259,346,0,245,true +3260,161,0,103,true +3261,135,0,92,true +3262,182,0,128,true +3263,132,1,24,true +3264,151,0,118,true +3265,255,0,104,true +3266,132,0,107,true +3267,108,0,104,true +3268,91,0,118,true +3269,156,1,21,true +3270,7044,42,48,true +3271,204,0,124,true +3272,150,0,111,true +3273,188,0,101,true +3274,162,0,117,true +3275,284,1,15,true +3276,110,0,123,true +3277,121,0,88,true +3278,194,0,94,true +3279,75,0,109,true +3280,100,0,88,true +3281,103,0,98,true +3282,147,1,24,true +3283,208,0,102,true +3284,256,1,24,true +3285,206,0,117,true +3286,239,0,109,true +3287,181,0,86,true +3288,89,0,96,true +3289,109,1,18,true +3290,341,0,240,true +3291,243,1,15,true +3292,250,1,15,true +3293,184,0,91,true +3294,232,0,125,true +3295,157,0,95,true +3296,156,0,117,true +3297,72,0,97,true +3298,116,1,24,true +3299,203,0,121,true +3300,214,0,99,true +3301,222,0,109,true +3302,119,1,24,true +3303,452,0,275,true +3304,96,0,102,true +3305,200,0,108,true +3306,79,0,107,true +3307,189,1,18,true +3308,124,1,18,true +3309,189,0,108,true +3310,582,0,263,true +3311,140,0,111,true +3312,2144,73,1140,true +3313,84,0,93,true +3314,720,90,212,true +3315,229,0,96,true +3316,135,0,107,true +3317,226,0,107,true +3318,109,0,119,true +3319,93,0,127,true +3320,470,0,253,true +3321,199,0,121,true +3322,326,0,254,true +3323,117,1,9,true +3324,113,1,18,true +3325,134,0,117,true +3326,128,1,21,true +3327,157,0,114,true +3328,232,1,18,true +3329,211,0,124,true +3330,127,0,99,true +3331,108,0,117,true +3332,211,0,138,true +3333,376,0,282,true +3334,212,0,119,true +3335,172,0,110,true +3336,100,0,133,true +3337,135,0,97,true +3338,366,0,264,true +3339,108,0,106,true +3340,236,0,131,true +3341,110,1,24,true +3342,99,0,99,true +3343,299,0,92,true +3344,199,0,107,true +3345,98,0,112,true +3346,205,0,108,true +3347,131,0,98,true +3348,156,0,105,true +3349,83,0,93,true +3350,200,0,114,true +3351,242,1,15,true +3352,174,1,18,true +3353,96,0,92,true +3354,676,0,245,true +3355,131,0,134,true +3356,113,0,98,true +3357,116,1,18,true +3358,143,0,118,true +3359,214,0,127,true +3360,1461,131,523,true +3361,103,1,24,true +3362,220,1,15,true +3363,79,0,105,true +3364,105,0,98,true +3365,185,1,21,true +3366,110,0,93,true +3367,123,0,113,true +3368,110,0,116,true +3369,90,0,97,true +3370,146,0,113,true +3371,130,0,106,true +3372,283,0,245,true +3373,248,0,103,true +3374,195,0,111,true +3375,90,0,95,true +3376,140,1,24,true +3377,206,1,18,true +3378,231,0,129,true +3379,117,0,105,true +3380,91,1,24,true +3381,220,1,21,true +3382,143,0,100,true +3383,414,1,15,true +3384,160,0,95,true +3385,75,0,92,true +3386,147,0,127,true +3387,149,0,115,true +3388,148,0,113,true +3389,106,1,12,true +3390,198,1,24,true +3391,138,0,80,true +3392,86,0,105,true +3393,104,0,109,true +3394,92,0,103,true +3395,125,0,95,true +3396,252,1,18,true +3397,144,0,126,true +3398,116,0,103,true +3399,452,0,275,true +3400,129,1,18,true +3401,142,0,115,true +3402,142,1,18,true +3403,156,0,130,true +3404,169,0,115,true +3405,118,0,108,true +3406,279,0,231,true +3407,119,0,109,true +3408,132,0,91,true +3409,129,1,21,true +3410,62,1,18,true +3411,131,1,18,true +3412,155,0,115,true +3413,85,1,24,true +3414,136,0,105,true +3415,105,0,97,true +3416,85,0,92,true +3417,118,0,78,true +3418,105,0,103,true +3419,179,0,112,true +3420,153,0,92,true +3421,113,1,18,true +3422,143,0,104,true +3423,244,1,18,true +3424,81,1,12,true +3425,307,0,251,true +3426,254,0,123,true +3427,157,0,107,true +3428,138,0,77,true +3429,67,0,90,true +3430,157,0,125,true +3431,166,0,94,true +3432,156,1,24,true +3433,295,0,227,true +3434,160,1,21,true +3435,167,0,114,true +3436,121,0,102,true +3437,230,0,113,true +3438,74,1,24,true +3439,360,1,15,true +3440,163,1,24,true +3441,201,0,102,true +3442,137,0,109,true +3443,330,0,272,true +3444,73,0,90,true +3445,123,0,125,true +3446,83,1,24,true +3447,125,1,24,true +3448,67,0,85,true +3449,165,0,103,true +3450,148,0,112,true +3451,150,0,128,true +3452,117,0,108,true +3453,553,0,254,true +3454,187,0,104,true +3455,200,0,98,true +3456,306,0,245,true +3457,102,1,24,true +3458,265,1,12,true +3459,124,0,98,true +3460,135,1,18,true +3461,153,0,113,true +3462,220,0,119,true +3463,131,0,97,true +3464,102,0,119,true +3465,170,0,122,true +3466,128,0,114,true +3467,99,0,126,true +3468,159,1,24,true +3469,90,0,105,true +3470,113,0,129,true +3471,303,0,240,true +3472,137,0,92,true +3473,135,1,15,true +3474,85,1,9,true +3475,203,0,125,true +3476,106,0,107,true +3477,440,0,231,true +3478,115,1,9,true +3479,233,0,112,true +3480,68,0,80,true +3481,159,1,24,true +3482,210,0,107,true +3483,165,0,102,true +3484,194,0,119,true +3485,162,0,96,true +3486,219,1,21,true +3487,175,0,116,true +3488,93,0,92,true +3489,203,0,113,true +3490,179,0,80,true +3491,98,0,93,true +3492,162,0,105,true +3493,235,1,18,true +3494,700,0,240,true +3495,135,0,137,true +3496,98,0,102,true +3497,201,0,107,true +3498,112,0,107,true +3499,255,0,110,true +3500,372,1,15,true +3501,161,0,109,true +3502,193,1,18,true +3503,188,0,109,true +3504,300,0,267,true +3505,73,0,94,true +3506,119,1,12,true +3507,99,1,18,true +3508,105,0,93,true +3509,157,0,108,true +3510,72,0,96,true +3511,193,1,18,true +3512,113,0,90,true +3513,472,1,15,true +3514,227,0,114,true +3515,244,0,128,true +3516,148,0,90,true +3517,226,1,18,true +3518,112,0,94,true +3519,108,1,18,true +3520,147,0,122,true +3521,227,1,18,true +3522,161,0,115,true +3523,254,0,127,true +3524,227,0,105,true +3525,281,0,234,true +3526,192,1,18,true +3527,193,1,15,true +3528,168,0,115,true +3529,124,0,98,true +3530,146,0,109,true +3531,428,0,235,true +3532,140,0,95,true +3533,99,0,108,true +3534,277,0,116,true +3535,204,0,101,true +3536,426,0,264,true +3537,200,0,92,true +3538,198,1,18,true +3539,362,0,245,true +3540,96,0,125,true +3541,136,0,108,true +3542,181,0,103,true +3543,97,1,21,true +3544,138,0,108,true +3545,410,0,255,true +3546,185,1,18,true +3547,318,0,106,true +3548,115,1,18,true +3549,162,0,121,true +3550,271,1,12,true +3551,115,1,12,true +3552,97,0,107,true +3553,421,0,237,true +3554,146,1,12,true +3555,238,0,111,true +3556,246,0,113,true +3557,151,0,113,true +3558,210,0,121,true +3559,4673,99,3023,true +3560,204,0,112,true +3561,218,0,101,true +3562,151,0,116,true +3563,128,0,130,true +3564,442,0,252,true +3565,238,0,122,true +3566,155,1,21,true +3567,154,1,18,true +3568,100,0,105,true +3569,112,0,127,true +3570,179,0,91,true +3571,61,0,80,true +3572,207,1,18,true +3573,642,0,237,true +3574,153,1,24,true +3575,147,0,107,true +3576,191,0,102,true +3577,128,0,86,true +3578,216,0,109,true +3579,178,0,86,true +3580,153,1,12,true +3581,132,0,97,true +3582,116,1,18,true +3583,166,0,124,true +3584,143,0,93,true +3585,138,0,127,true +3586,110,0,127,true +3587,404,0,255,true +3588,77,0,102,true +3589,142,1,15,true +3590,352,1,15,true +3591,213,0,96,true +3592,227,1,15,true +3593,174,0,111,true +3594,184,1,24,true +3595,137,1,12,true +3596,87,0,93,true +3597,650,0,254,true +3598,94,0,111,true +3599,125,1,18,true +3600,189,0,118,true +3601,220,0,104,true +3602,409,0,250,true +3603,203,0,102,true +3604,154,0,110,true +3605,322,0,127,true +3606,157,0,109,true +3607,353,0,248,true +3608,94,0,109,true +3609,89,1,18,true +3610,86,0,107,true +3611,248,0,87,true +3612,153,0,82,true +3613,223,1,18,true +3614,115,0,113,true +3615,122,0,80,true +3616,79,0,110,true +3617,83,1,21,true +3618,213,0,135,true +3619,243,1,18,true +3620,141,0,122,true +3621,140,0,116,true +3622,127,0,96,true +3623,170,1,24,true +3624,141,0,103,true +3625,179,0,102,true +3626,225,0,117,true +3627,163,0,90,true +3628,347,0,234,true +3629,94,1,12,true +3630,319,0,113,true +3631,104,0,110,true +3632,165,0,121,true +3633,135,0,105,true +3634,92,0,105,true +3635,294,0,252,true +3636,206,0,110,true +3637,129,0,121,true +3638,151,0,127,true +3639,136,0,98,true +3640,644,0,245,true +3641,81,0,85,true +3642,214,1,18,true +3643,138,0,97,true +3644,115,1,18,true +3645,110,0,95,true +3646,404,0,261,true +3647,250,0,122,true +3648,401,1,12,true +3649,238,0,113,true +3650,229,0,118,true +3651,121,0,99,true +3652,129,0,115,true +3653,205,0,100,true +3654,131,0,113,true +3655,273,0,110,true +3656,103,0,109,true +3657,140,0,101,true +3658,137,0,111,true +3659,68,1,24,true +3660,134,1,21,true +3661,142,0,107,true +3662,75,0,107,true +3663,403,0,258,true +3664,184,0,113,true +3665,113,1,24,true +3666,83,1,24,true +3667,137,0,115,true +3668,260,0,117,true +3669,122,0,111,true +3670,111,0,101,true +3671,137,0,113,true +3672,73,0,89,true +3673,182,0,132,true +3674,178,0,113,true +3675,111,1,18,true +3676,130,0,96,true +3677,78,0,101,true +3678,425,0,232,true +3679,186,1,18,true +3680,73,0,92,true +3681,320,0,111,true +3682,173,0,94,true +3683,135,1,12,true +3684,340,1,18,true +3685,251,0,132,true +3686,162,0,118,true +3687,163,0,116,true +3688,274,0,234,true +3689,10017,88,54,true +3690,225,0,118,true +3691,117,1,18,true +3692,396,0,268,true +3693,140,0,123,true +3694,89,0,99,true +3695,98,0,123,true +3696,136,1,18,true +3697,308,0,255,true +3698,148,1,21,true +3699,163,0,111,true +3700,354,0,258,true +3701,65,1,12,true +3702,268,0,125,true +3703,213,0,83,true +3704,86,0,105,true +3705,179,0,98,true +3706,364,0,264,true +3707,77,0,103,true +3708,102,1,15,true +3709,258,0,112,true +3710,159,0,85,true +3711,123,1,21,true +3712,92,1,24,true +3713,142,0,97,true +3714,112,0,114,true +3715,137,0,87,true +3716,200,0,122,true +3717,38635,346,222,true +3718,140,0,110,true +3719,72,0,98,true +3720,102,0,104,true +3721,220,1,15,true +3722,110,1,18,true +3723,108,1,18,true +3724,343,0,255,true +3725,146,0,127,true +3726,100,0,110,true +3727,127,0,113,true +3728,137,0,109,true +3729,143,0,120,true +3730,92,0,93,true +3731,105,0,125,true +3732,134,0,104,true +3733,61,0,81,true +3734,258,1,12,true +3735,147,0,111,true +3736,127,0,97,true +3737,129,0,92,true +3738,142,0,108,true +3739,193,1,12,true +3740,144,0,105,true +3741,112,1,18,true +3742,208,0,113,true +3743,86,0,109,true +3744,122,0,108,true +3745,321,0,256,true +3746,172,0,122,true +3747,208,0,131,true +3748,222,1,15,true +3749,72,0,88,true +3750,129,1,18,true +3751,162,0,140,true +3752,103,1,24,true +3753,193,0,117,true +3754,150,0,113,true +3755,98,0,100,true +3756,198,0,101,true +3757,286,0,250,true +3758,324,1,18,true +3759,149,0,124,true +3760,92,1,12,true +3761,97,1,24,true +3762,78,1,12,true +3763,115,0,97,true +3764,320,0,267,true +3765,104,0,123,true +3766,142,0,86,true +3767,89,0,100,true +3768,156,0,117,true +3769,155,0,132,true +3770,93,1,18,true +3771,119,0,97,true +3772,306,0,250,true +3773,147,0,106,true +3774,159,0,112,true +3775,128,1,18,true +3776,151,0,95,true +3777,104,0,110,true +3778,186,0,123,true +3779,270,0,92,true +3780,193,0,105,true +3781,85,0,111,true +3782,112,0,93,true +3783,140,1,24,true +3784,218,1,21,true +3785,123,0,89,true +3786,321,0,241,true +3787,111,1,18,true +3788,170,0,128,true +3789,90,0,95,true +3790,401,0,249,true +3791,80,1,21,true +3792,146,0,112,true +3793,172,0,127,true +3794,102,0,99,true +3795,210,0,123,true +3796,138,1,24,true +3797,73,0,92,true +3798,112,0,109,true +3799,132,0,90,true +3800,94,1,18,true +3801,246,0,126,true +3802,267,0,127,true +3803,159,0,97,true +3804,362,0,256,true +3805,150,0,98,true +3806,138,0,106,true +3807,289,0,259,true +3808,72,0,92,true +3809,90,0,106,true +3810,550,0,261,true +3811,322,0,114,true +3812,181,0,92,true +3813,147,0,122,true +3814,200,0,95,true +3815,138,1,18,true +3816,123,1,24,true +3817,205,1,18,true +3818,124,1,18,true +3819,138,0,112,true +3820,92,0,97,true +3821,129,1,12,true +3822,175,0,130,true +3823,148,0,117,true +3824,142,0,117,true +3825,94,0,100,true +3826,112,1,18,true +3827,181,0,124,true +3828,97,1,12,true +3829,155,0,107,true +3830,151,0,113,true +3831,140,0,117,true +3832,146,0,116,true +3833,156,0,135,true +3834,233,0,92,true +3835,99,0,80,true +3836,136,1,24,true +3837,178,1,21,true +3838,309,0,245,true +3839,80,1,12,true +3840,254,0,121,true +3841,143,0,115,true +3842,165,0,111,true +3843,254,0,122,true +3844,187,0,97,true +3845,246,1,18,true +3846,172,0,115,true +3847,172,0,120,true +3848,314,0,245,true +3849,277,0,241,true +3850,146,0,108,true +3851,99,0,121,true +3852,180,0,120,true +3853,119,0,94,true +3854,421,0,263,true +3855,212,1,21,true +3856,246,1,18,true +3857,156,0,107,true +3858,166,0,110,true +3859,125,0,92,true +3860,67,0,90,true +3861,99,0,92,true +3862,109,1,18,true +3863,288,0,231,true +3864,67,1,24,true +3865,187,0,123,true +3866,201,0,121,true +3867,421,1,15,true +3868,118,1,18,true +3869,479,0,265,true +3870,102,0,93,true +3871,84,0,92,true +3872,134,0,94,true +3873,81,0,106,true +3874,128,0,93,true +3875,243,0,119,true +3876,92,1,18,true +3877,135,0,103,true +3878,142,0,126,true +3879,64,1,18,true +3880,128,0,105,true +3881,292,0,95,true +3882,195,0,109,true +3883,287,0,255,true +3884,144,0,112,true +3885,131,0,111,true +3886,115,0,98,true +3887,138,0,114,true +3888,162,0,109,true +3889,97,1,24,true +3890,68,1,21,true +3891,396,0,253,true +3892,104,0,134,true +3893,154,0,95,true +3894,86,1,24,true +3895,156,0,110,true +3896,175,1,18,true +3897,160,1,24,true +3898,127,0,90,true +3899,305,0,110,true +3900,138,1,21,true +3901,338,0,234,true +3902,132,1,18,true +3903,676,0,245,true +3904,187,0,121,true +3905,173,0,133,true +3906,226,1,15,true +3907,166,0,109,true +3908,404,1,15,true +3909,78,0,98,true +3910,154,0,121,true +3911,187,1,18,true +3912,315,0,109,true +3913,207,0,100,true +3914,108,1,18,true +3915,293,0,117,true +3916,404,0,245,true +3917,103,1,12,true +3918,289,0,129,true +3919,148,0,119,true +3920,170,0,127,true +3921,276,1,24,true +3922,194,0,101,true +3923,231,0,88,true +3924,176,0,102,true +3925,143,0,115,true +3926,151,0,118,true +3927,117,0,86,true +3928,155,0,116,true +3929,94,0,108,true +3930,147,0,118,true +3931,93,1,12,true +3932,136,0,114,true +3933,65,0,82,true +3934,118,1,18,true +3935,236,0,123,true +3936,149,1,12,true +3937,159,0,139,true +3938,368,0,263,true +3939,182,0,117,true +3940,148,0,102,true +3941,233,1,15,true +3942,692,0,251,true +3943,338,0,119,true +3944,127,0,80,true +3945,65,1,15,true +3946,116,1,18,true +3947,389,0,255,true +3948,92,0,121,true +3949,110,1,21,true +3950,271,0,122,true +3951,213,1,12,true +3952,106,0,110,true +3953,204,0,87,true +3954,146,0,113,true +3955,282,1,12,true +3956,90,0,92,true +3957,161,0,113,true +3958,136,0,98,true +3959,108,0,100,true +3960,217,1,24,true +3961,106,0,96,true +3962,156,0,121,true +3963,227,0,106,true +3964,70,0,78,true +3965,121,0,113,true +3966,179,1,15,true +3967,289,0,261,true +3968,172,0,130,true +3969,159,0,102,true +3970,151,0,120,true +3971,233,0,108,true +3972,207,0,102,true +3973,70,0,93,true +3974,144,0,108,true +3975,193,0,125,true +3976,105,1,18,true +3977,119,1,18,true +3978,96,1,18,true +3979,92,0,107,true +3980,123,0,93,true +3981,92,0,104,true +3982,109,1,24,true +3983,385,0,229,true +3984,154,1,18,true +3985,2936,92,1927,true +3986,138,0,111,true +3987,65,0,81,true +3988,131,0,105,true +3989,198,1,21,true +3990,173,0,111,true +3991,135,1,18,true +3992,282,0,231,true +3993,62,1,24,true +3994,306,0,104,true +3995,99,0,92,true +3996,192,0,111,true +3997,117,0,97,true +3998,141,0,137,true +3999,483,0,245,true +4000,118,1,24,true +4001,193,0,114,true +4002,62,1,18,true +4003,324,0,247,true +4004,134,0,108,true +4005,206,0,117,true +4006,4522,101,3432,true +4007,235,0,112,true +4008,6185,50,5001,true +4009,135,0,108,true +4010,263,0,117,true +4011,99,0,91,true +4012,197,1,18,true +4013,153,0,106,true +4014,140,0,111,true +4015,249,0,93,true +4016,251,1,12,true +4017,113,0,116,true +4018,130,0,102,true +4019,78,1,24,true +4020,153,0,109,true +4021,203,0,98,true +4022,235,0,124,true +4023,154,0,109,true +4024,142,0,112,true +4025,179,0,126,true +4026,176,1,18,true +4027,135,1,24,true +4028,269,0,103,true +4029,208,0,121,true +4030,299,0,260,true +4031,77,1,9,true +4032,217,0,107,true +4033,110,0,106,true +4034,148,0,113,true +4035,298,0,249,true +4036,199,0,111,true +4037,137,0,92,true +4038,235,1,15,true +4039,362,0,125,true +4040,141,0,109,true +4041,99,0,128,true +4042,142,0,114,true +4043,332,0,236,true +4044,308,0,263,true +4045,378,1,15,true +4046,250,0,132,true +4047,223,0,125,true +4048,116,1,15,true +4049,147,0,109,true +4050,2891,113,2145,true +4051,104,1,24,true +4052,105,1,21,true +4053,78,1,18,true +4054,141,1,18,true +4055,110,1,15,true +4056,341,1,18,true +4057,110,0,113,true +4058,277,1,15,true +4059,137,0,92,true +4060,97,0,110,true +4061,337,0,252,true +4062,80,0,109,true +4063,136,0,107,true +4064,65,0,86,true +4065,143,0,115,true +4066,148,0,114,true +4067,148,0,124,true +4068,146,0,128,true +4069,198,1,12,true +4070,96,0,100,true +4071,467,0,258,true +4072,193,1,18,true +4073,311,0,245,true +4074,155,0,107,true +4075,165,0,115,true +4076,138,0,113,true +4077,137,1,21,true +4078,148,0,118,true +4079,178,1,18,true +4080,186,0,97,true +4081,189,0,92,true +4082,135,0,120,true +4083,130,0,132,true +4084,122,0,101,true +4085,248,1,21,true +4086,121,0,123,true +4087,211,0,125,true +4088,147,0,115,true +4089,138,0,99,true +4090,91,0,115,true +4091,141,0,129,true +4092,80,0,99,true +4093,56,1,18,true +4094,80,0,97,true +4095,195,0,99,true +4096,66,0,80,true +4097,122,1,12,true +4098,160,0,128,true +4099,130,0,96,true +4100,103,1,9,true +4101,352,1,15,true +4102,92,0,95,true +4103,100,0,120,true +4104,201,1,18,true +4105,289,0,105,true +4106,155,1,18,true +4107,119,1,12,true +4108,244,0,119,true +4109,174,0,102,true +4110,112,0,103,true +4111,113,1,15,true +4112,187,0,132,true +4113,326,0,261,true +4114,87,0,90,true +4115,148,0,121,true +4116,163,0,118,true +4117,179,0,124,true +4118,188,0,126,true +4119,99,0,108,true +4120,99,0,127,true +4121,115,1,18,true +4122,68,1,18,true +4123,148,1,18,true +4124,129,0,109,true +4125,121,1,18,true +4126,103,0,104,true +4127,167,0,119,true +4128,123,0,104,true +4129,236,0,100,true +4130,358,0,245,true +4131,591,0,256,true +4132,103,0,106,true +4133,142,0,101,true +4134,130,0,114,true +4135,96,0,101,true +4136,130,1,18,true +4137,154,0,121,true +4138,604,0,245,true +4139,233,0,129,true +4140,166,0,86,true +4141,124,1,12,true +4142,54,1,15,true +4143,276,0,231,true +4144,207,0,137,true +4145,206,1,18,true +4146,275,0,232,true +4147,227,0,119,true +4148,144,0,119,true +4149,301,0,260,true +4150,184,0,113,true +4151,79,0,105,true +4152,93,1,21,true +4153,131,0,89,true +4154,103,0,94,true +4155,117,1,18,true +4156,140,0,114,true +4157,141,0,118,true +4158,131,0,130,true +4159,146,0,108,true +4160,128,0,92,true +4161,153,0,128,true +4162,138,0,127,true +4163,123,0,122,true +4164,148,0,115,true +4165,100,0,96,true +4166,154,0,120,true +4167,98,1,18,true +4168,129,0,122,true +4169,116,1,18,true +4170,100,0,95,true +4171,124,1,21,true +4172,303,0,267,true +4173,75,0,102,true +4174,142,0,114,true +4175,75,0,108,true +4176,67,1,24,true +4177,282,0,231,true +4178,113,0,109,true +4179,131,0,94,true +4180,135,1,15,true +4181,127,1,21,true +4182,149,0,117,true +4183,102,0,120,true +4184,61,1,18,true +4185,214,1,21,true +4186,134,0,104,true +4187,282,0,248,true +4188,193,1,21,true +4189,115,0,108,true +4190,127,0,115,true +4191,115,1,18,true +4192,121,1,18,true +4193,165,0,128,true +4194,281,0,237,true +4195,232,0,109,true +4196,137,1,18,true +4197,232,1,15,true +4198,66,1,24,true +4199,108,0,90,true +4200,188,0,99,true +4201,210,0,114,true +4202,286,0,250,true +4203,89,1,21,true +4204,154,0,107,true +4205,148,0,86,true +4206,146,0,121,true +4207,157,0,120,true +4208,195,0,108,true +4209,111,1,18,true +4210,113,0,106,true +4211,122,0,140,true +4212,115,0,106,true +4213,150,0,124,true +4214,156,0,127,true +4215,4371,67,3378,true +4216,118,1,21,true +4217,134,0,102,true +4218,138,0,113,true +4219,81,1,24,true +4220,116,1,21,true +4221,119,0,109,true +4222,109,1,15,true +4223,109,1,24,true +4224,274,1,18,true +4225,91,0,90,true +4226,320,0,250,true +4227,127,1,24,true +4228,156,0,109,true +4229,251,0,126,true +4230,136,0,105,true +4231,78,0,92,true +4232,110,1,18,true +4233,434,0,260,true +4234,172,0,116,true +4235,119,0,94,true +4236,322,0,238,true +4237,105,0,118,true +4238,161,0,124,true +4239,178,0,102,true +4240,116,0,113,true +4241,148,0,102,true +4242,153,0,125,true +4243,105,0,102,true +4244,313,0,121,true +4245,153,0,105,true +4246,113,0,122,true +4247,144,0,119,true +4248,123,0,104,true +4249,236,0,106,true +4250,224,0,95,true +4251,388,1,21,true +4252,90,1,24,true +4253,92,1,12,true +4254,154,0,139,true +4255,148,0,123,true +4256,286,0,255,true +4257,92,0,121,true +4258,138,0,107,true +4259,59,0,79,true +4260,123,0,106,true +4261,180,0,121,true +4262,86,1,9,true +4263,211,0,92,true +4264,143,1,18,true +4265,132,0,94,true +4266,103,0,98,true +4267,108,1,24,true +4268,373,1,12,true +4269,182,0,95,true +4270,140,0,80,true +4271,81,0,96,true +4272,110,0,104,true +4273,97,0,124,true +4274,143,0,115,true +4275,140,0,113,true +4276,148,1,24,true +4277,401,0,256,true +4278,167,1,18,true +4279,129,0,104,true +4280,165,0,119,true +4281,172,0,94,true +4282,289,0,248,true +4283,2308,36,828,true +4284,78,0,86,true +4285,315,0,255,true +4286,143,0,118,true +4287,103,0,109,true +4288,249,1,21,true +4289,91,0,107,true +4290,99,0,111,true +4291,137,0,126,true +4292,140,0,109,true +4293,263,1,15,true +4294,146,0,126,true +4295,197,0,112,true +4296,136,0,103,true +4297,166,0,126,true +4298,251,0,140,true +4299,150,0,111,true +4300,90,0,104,true +4301,160,1,15,true +4302,334,0,262,true +4303,151,0,101,true +4304,112,1,18,true +4305,137,1,24,true +4306,238,0,104,true +4307,123,1,12,true +4308,752,0,275,true +4309,153,1,12,true +4310,174,1,21,true +4311,250,0,129,true +4312,106,0,94,true +4313,205,1,18,true +4314,683,99,286,true +4315,212,1,12,true +4316,151,0,85,true +4317,90,0,101,true +4318,119,0,111,true +4319,113,1,24,true +4320,111,1,24,true +4321,192,0,112,true +4322,111,0,117,true +4323,185,1,18,true +4324,245,0,127,true +4325,186,0,125,true +4326,124,0,92,true +4327,246,0,123,true +4328,273,0,230,true +4329,142,0,114,true +4330,93,0,111,true +4331,90,1,21,true +4332,104,0,108,true +4333,140,0,112,true +4334,258,1,18,true +4335,341,0,252,true +4336,91,1,21,true +4337,123,1,18,true +4338,428,0,254,true +4339,85,0,113,true +4340,112,1,18,true +4341,257,1,21,true +4342,109,0,107,true +4343,108,0,121,true +4344,118,0,110,true +4345,129,1,12,true +4346,84,0,108,true +4347,150,0,83,true +4348,331,0,254,true +4349,26126,171,138,true +4350,422,0,278,true +4351,68,1,24,true +4352,188,0,103,true +4353,116,0,102,true +4354,301,0,257,true +4355,154,0,132,true +4356,208,0,108,true +4357,261,0,122,true +4358,117,1,18,true +4359,141,1,18,true +4360,103,0,94,true +4361,256,0,116,true +4362,136,0,108,true +4363,66,0,92,true +4364,151,1,21,true +4365,284,0,245,true +4366,127,1,21,true +4367,111,0,110,true +4368,111,1,18,true +4369,118,0,110,true +4370,118,0,112,true +4371,134,1,18,true +4372,170,0,116,true +4373,143,0,106,true +4374,108,1,9,true +4375,122,0,94,true +4376,160,1,24,true +4377,125,0,111,true +4378,102,0,97,true +4379,333,0,238,true +4380,436,0,253,true +4381,318,0,237,true +4382,71,0,92,true +4383,231,0,110,true +4384,138,0,109,true +4385,138,1,18,true +4386,160,0,109,true +4387,138,0,107,true +4388,130,0,104,true +4389,637,0,236,true +4390,226,0,127,true +4391,245,0,114,true +4392,182,0,97,true +4393,193,0,108,true +4394,188,0,110,true +4395,78,0,104,true +4396,75,0,106,true +4397,78,1,24,true +4398,97,0,137,true +4399,58,1,24,true +4400,113,1,15,true +4401,123,0,114,true +4402,153,0,109,true +4403,433,0,245,true +4404,189,1,24,true +4405,78,0,98,true +4406,141,0,135,true +4407,4557,77,2722,true +4408,154,1,18,true +4409,77,0,98,true +4410,191,0,96,true +4411,187,0,100,true +4412,167,0,92,true +4413,169,0,93,true +4414,389,0,123,true +4415,255,0,90,true +4416,226,0,121,true +4417,85,0,99,true +4418,64,1,18,true +4419,110,0,109,true +4420,93,1,21,true +4421,227,0,245,true +4422,64,0,88,true +4423,59,1,24,true +4424,43,1,21,true +4425,338,0,103,true +4426,175,1,24,true +4427,74,1,18,true +4428,52,1,18,true +4429,233,0,245,true +4430,86,0,102,true +4431,279,0,261,true +4432,166,1,18,true +4433,312,0,277,true +4434,61,1,21,true +4435,601,0,247,true +4436,185,0,94,true +4437,143,0,107,true +4438,108,0,107,true +4439,99,0,120,true +4440,169,0,110,true +4441,155,0,105,true +4442,102,0,101,true +4443,157,1,24,true +4444,226,1,15,true +4445,216,0,94,true +4446,154,0,142,true +4447,246,0,96,true +4448,176,0,108,true +4449,78,1,12,true +4450,112,1,12,true +4451,78,1,18,true +4452,115,0,101,true +4453,105,0,94,true +4454,317,0,124,true +4455,270,0,87,true +4456,153,0,123,true +4457,137,0,105,true +4458,169,0,91,true +4459,77,0,109,true +4460,79,0,85,true +4461,147,1,18,true +4462,124,0,109,true +4463,135,0,96,true +4464,149,1,24,true +4465,223,0,108,true +4466,175,0,110,true +4467,96,0,102,true +4468,151,0,131,true +4469,149,0,102,true +4470,68,0,92,true +4471,319,0,257,true +4472,333,1,12,true +4473,117,1,15,true +4474,558,0,275,true +4475,182,0,100,true +4476,39213,216,138,true +4477,73,1,9,true +4478,244,1,18,true +4479,246,0,109,true +4480,96,1,12,true +4481,138,0,106,true +4482,142,0,140,true +4483,165,0,108,true +4484,244,0,102,true +4485,140,0,112,true +4486,104,0,124,true +4487,340,0,261,true +4488,168,0,116,true +4489,225,1,15,true +4490,68,1,24,true +4491,154,0,97,true +4492,124,0,95,true +4493,138,0,109,true +4494,77,0,91,true +4495,192,0,83,true +4496,68,0,85,true +4497,210,0,120,true +4498,98,0,108,true +4499,200,0,116,true +4500,92,0,106,true +4501,577,0,262,true +4502,165,0,128,true +4503,99,1,24,true +4504,318,0,129,true +4505,198,0,113,true +4506,100,0,127,true +4507,144,1,18,true +4508,109,0,102,true +4509,246,0,120,true +4510,137,0,93,true +4511,411,0,263,true +4512,299,0,263,true +4513,146,0,112,true +4514,140,1,18,true +4515,110,0,92,true +4516,365,1,12,true +4517,642,0,245,true +4518,210,0,109,true +4519,249,0,123,true +4520,141,0,113,true +4521,144,0,117,true +4522,93,0,88,true +4523,156,1,21,true +4524,136,0,109,true +4525,340,0,133,true +4526,111,1,15,true +4527,295,0,240,true +4528,166,0,125,true +4529,140,0,122,true +4530,341,1,15,true +4531,151,0,118,true +4532,131,1,15,true +4533,182,0,108,true +4534,87,1,12,true +4535,87,0,106,true +4536,307,0,242,true +4537,173,0,118,true +4538,162,0,100,true +4539,159,0,123,true +4540,162,0,124,true +4541,137,0,107,true +4542,149,0,106,true +4543,128,1,18,true +4544,294,0,112,true +4545,172,0,90,true +4546,144,0,104,true +4547,173,0,127,true +4548,1257,65,545,true +4549,72,0,93,true +4550,151,1,18,true +4551,181,1,12,true +4552,150,0,93,true +4553,239,0,108,true +4554,93,1,12,true +4555,153,0,112,true +4556,186,1,12,true +4557,5392,58,5001,true +4558,160,0,95,true +4559,99,0,101,true +4560,331,0,250,true +4561,181,1,15,true +4562,287,0,114,true +4563,119,1,21,true +4564,113,0,98,true +4565,129,0,93,true +4566,74,0,108,true +4567,170,0,122,true +4568,115,0,109,true +4569,191,0,124,true +4570,254,0,130,true +4571,129,0,96,true +4572,280,0,245,true +4573,110,1,18,true +4574,111,0,127,true +4575,81,1,24,true +4576,217,1,15,true +4577,83,0,110,true +4578,128,0,89,true +4579,70,0,94,true +4580,127,0,109,true +4581,270,0,121,true +4582,72,1,21,true +4583,124,0,113,true +4584,235,1,15,true +4585,87,0,113,true +4586,89,0,106,true +4587,396,0,250,true +4588,193,0,101,true +4589,226,0,140,true +4590,138,0,108,true +4591,175,0,95,true +4592,168,0,119,true +4593,350,1,18,true +4594,131,0,92,true +4595,224,0,101,true +4596,71,1,12,true +4597,346,0,238,true +4598,103,0,109,true +4599,226,1,24,true +4600,250,1,18,true +4601,142,1,24,true +4602,6376,62,5001,true +4603,81,0,111,true +4604,108,0,125,true +4605,111,1,18,true +4606,151,0,126,true +4607,262,0,114,true +4608,135,0,92,true +4609,154,0,111,true +4610,117,0,101,true +4611,286,0,245,true +4612,159,0,119,true +4613,106,0,95,true +4614,104,0,96,true +4615,772,0,255,true +4616,198,0,100,true +4617,153,0,90,true +4618,84,0,92,true +4619,1549,86,1128,true +4620,198,0,110,true +4621,198,0,94,true +4622,186,0,98,true +4623,127,0,111,true +4624,135,0,140,true +4625,362,1,15,true +4626,162,0,121,true +4627,305,0,117,true +4628,165,0,114,true +4629,274,1,18,true +4630,147,0,126,true +4631,157,0,86,true +4632,116,0,125,true +4633,198,0,106,true +4634,337,0,115,true +4635,250,1,18,true +4636,452,0,255,true +4637,203,1,18,true +4638,97,0,95,true +4639,203,1,12,true +4640,96,0,92,true +4641,210,1,18,true +4642,223,0,129,true +4643,176,1,9,true +4644,286,0,106,true +4645,314,0,113,true +4646,306,0,106,true +4647,122,0,88,true +4648,116,1,18,true +4649,122,0,125,true +4650,93,0,124,true +4651,99,1,15,true +4652,121,1,18,true +4653,205,0,95,true +4654,151,1,18,true +4655,212,0,126,true +4656,128,0,105,true +4657,220,0,108,true +4658,84,0,90,true +4659,256,1,15,true +4660,125,1,12,true +4661,227,1,15,true +4662,332,1,15,true +4663,280,0,243,true +4664,104,0,125,true +4665,102,0,92,true +4666,191,1,15,true +4667,142,0,107,true +4668,16842,165,162,true +4669,134,0,115,true +4670,128,0,108,true +4671,77,1,21,true +4672,184,0,125,true +4673,84,1,18,true +4674,148,0,99,true +4675,129,0,96,true +4676,138,0,110,true +4677,118,1,18,true +4678,98,0,96,true +4679,154,0,121,true +4680,136,0,100,true +4681,281,1,18,true +4682,167,0,133,true +4683,271,1,15,true +4684,197,0,129,true +4685,129,0,109,true +4686,150,0,122,true +4687,179,0,122,true +4688,119,0,92,true +4689,153,0,108,true +4690,83,0,99,true +4691,91,0,86,true +4692,138,0,118,true +4693,75,0,99,true +4694,122,0,97,true +4695,150,0,136,true +4696,148,0,110,true +4697,142,0,108,true +4698,121,0,103,true +4699,283,0,251,true +4700,243,0,120,true +4701,100,0,86,true +4702,354,1,15,true +4703,508,0,251,true +4704,141,0,122,true +4705,176,1,18,true +4706,387,0,244,true +4707,81,0,100,true +4708,144,0,126,true +4709,128,1,21,true +4710,155,0,129,true +4711,141,1,21,true +4712,229,0,127,true +4713,5613,93,4573,true +4714,224,0,92,true +4715,210,0,119,true +4716,97,0,104,true +4717,109,1,18,true +4718,148,0,113,true +4719,118,1,21,true +4720,306,0,282,true +4721,92,0,117,true +4722,122,0,113,true +4723,477,0,263,true +4724,153,0,123,true +4725,241,1,15,true +4726,194,0,106,true +4727,73,0,92,true +4728,192,1,18,true +4729,141,1,24,true +4730,113,1,18,true +4731,93,0,111,true +4732,189,0,116,true +4733,167,1,18,true +4734,186,0,95,true +4735,62,1,15,true +4736,245,1,21,true +4737,159,0,94,true +4738,159,0,106,true +4739,146,0,113,true +4740,154,0,103,true +4741,157,1,24,true +4742,150,0,124,true +4743,163,0,110,true +4744,144,0,106,true +4745,219,0,131,true +4746,189,0,102,true +4747,162,0,113,true +4748,63752,466,360,true +4749,103,0,113,true +4750,132,0,97,true +4751,117,0,108,true +4752,351,0,132,true +4753,122,0,80,true +4754,79,0,107,true +4755,146,1,18,true +4756,227,0,127,true +4757,131,0,96,true +4758,70,0,83,true +4759,73,0,105,true +4760,216,1,18,true +4761,124,0,103,true +4762,239,1,15,true +4763,113,1,24,true +4764,157,0,105,true +4765,335,0,255,true +4766,169,0,115,true +4767,439,0,252,true +4768,91,1,24,true +4769,150,0,125,true +4770,106,1,24,true +4771,331,0,275,true +4772,106,1,21,true +4773,166,0,127,true +4774,94,0,108,true +4775,385,1,15,true +4776,296,0,275,true +4777,70,1,24,true +4778,147,1,18,true +4779,137,0,90,true +4780,111,0,110,true +4781,67,1,24,true +4782,115,1,18,true +4783,131,1,18,true +4784,213,1,12,true +4785,72,0,93,true +4786,123,0,94,true +4787,122,0,125,true +4788,92,0,105,true +4789,173,0,111,true +4790,193,0,127,true +4791,267,1,15,true +4792,182,1,18,true +4793,169,0,114,true +4794,249,1,15,true +4795,122,0,95,true +4796,48800,362,249,true +4797,108,0,109,true +4798,74,1,12,true +4799,156,0,92,true +4800,130,0,105,true +4801,295,0,259,true +4802,93,0,117,true +4803,113,1,18,true +4804,138,0,110,true +4805,292,0,254,true +4806,103,1,18,true +4807,161,0,103,true +4808,100,0,94,true +4809,186,0,120,true +4810,156,0,115,true +4811,147,0,113,true +4812,129,0,110,true +4813,137,0,111,true +4814,140,1,15,true +4815,174,0,113,true +4816,144,0,110,true +4817,138,0,108,true +4818,132,0,127,true +4819,284,0,254,true +4820,71,0,94,true +4821,154,0,123,true +4822,94,0,90,true +4823,140,0,108,true +4824,60,1,21,true +4825,148,0,115,true +4826,91,0,97,true +4827,4039,112,3183,true +4828,119,0,103,true +4829,137,0,107,true +4830,118,1,18,true +4831,115,1,21,true +4832,113,1,15,true +4833,226,1,12,true +4834,136,0,113,true +4835,254,0,107,true +4836,90,0,105,true +4837,80,0,98,true +4838,94,1,12,true +4839,85,0,92,true +4840,143,0,107,true +4841,81,0,103,true +4842,168,0,123,true +4843,112,0,110,true +4844,136,0,108,true +4845,78,0,104,true +4846,5360,114,4673,true +4847,124,0,94,true +4848,117,0,111,true +4849,91,1,18,true +4850,105,0,123,true +4851,118,0,101,true +4852,127,0,88,true +4853,71,0,94,true +4854,232,1,15,true +4855,115,0,112,true +4856,78,0,94,true +4857,67,0,88,true +4858,92,1,24,true +4859,91,0,93,true +4860,227,1,15,true +4861,113,1,18,true +4862,124,1,18,true +4863,78,1,12,true +4864,100,0,100,true +4865,121,1,12,true +4866,104,0,111,true +4867,117,0,127,true +4868,93,0,120,true +4869,159,0,113,true +4870,134,0,103,true +4871,363,0,250,true +4872,92,0,106,true +4873,136,0,92,true +4874,74,0,99,true +4875,154,0,126,true +4876,138,0,108,true +4877,298,0,266,true +4878,115,1,18,true +4879,128,1,21,true +4880,142,0,108,true +4881,124,0,97,true +4882,92,0,107,true +4883,224,1,21,true +4884,127,1,18,true +4885,136,0,122,true +4886,29222,310,213,true +4887,309,0,112,true +4888,216,0,93,true +4889,182,0,113,true +4890,758,0,266,true +4891,134,0,101,true +4892,237,1,18,true +4893,98,0,113,true +4894,229,1,15,true +4895,262,1,15,true +4896,132,0,101,true +4897,117,1,18,true +4898,143,0,126,true +4899,104,0,99,true +4900,281,0,124,true +4901,99,0,112,true +4902,92,0,92,true +4903,186,1,24,true +4904,80,1,21,true +4905,454,0,233,true +4906,124,1,24,true +4907,111,1,15,true +4908,153,0,132,true +4909,422,0,231,true +4910,356,1,15,true +4911,168,0,111,true +4912,172,0,140,true +4913,150,0,98,true +4914,113,0,92,true +4915,106,0,101,true +4916,231,0,112,true +4917,85,0,111,true +4918,121,1,18,true +4919,130,1,18,true +4920,306,0,254,true +4921,110,0,112,true +4922,185,0,110,true +4923,231,0,107,true +4924,187,0,117,true +4925,142,0,114,true +4926,402,0,114,true +4927,151,1,18,true +4928,121,0,103,true +4929,231,1,15,true +4930,149,0,115,true +4931,161,1,24,true +4932,163,0,113,true +4933,263,0,117,true +4934,188,0,102,true +4935,81,1,18,true +4936,54,1,18,true +4937,92,0,101,true +4938,336,0,255,true +4939,70,0,94,true +4940,135,0,107,true +4941,132,0,98,true +4942,142,0,106,true +4943,136,0,91,true +4944,155,0,129,true +4945,131,1,18,true +4946,317,1,24,true +4947,296,0,251,true +4948,251,1,24,true +4949,125,0,111,true +4950,86,0,103,true +4951,119,1,21,true +4952,173,1,24,true +4953,129,1,24,true +4954,160,0,99,true +4955,117,1,18,true +4956,137,0,111,true +4957,92,0,108,true +4958,68,0,88,true +4959,178,0,98,true +4960,144,0,114,true +4961,103,0,124,true +4962,161,0,123,true +4963,157,0,102,true +4964,241,1,12,true +4965,109,0,126,true +4966,256,1,18,true +4967,132,0,100,true +4968,137,0,109,true +4969,83,0,94,true +4970,132,0,95,true +4971,142,0,102,true +4972,159,0,112,true +4973,327,0,254,true +4974,138,1,21,true +4975,102,0,107,true +4976,80,0,93,true +4977,111,0,94,true +4978,224,1,15,true +4979,86,1,9,true +4980,334,0,266,true +4981,129,1,18,true +4982,153,0,94,true +4983,150,1,18,true +4984,254,0,113,true +4985,149,0,114,true +4986,123,0,114,true +4987,161,0,106,true +4988,338,0,254,true +4989,71,0,97,true +4990,290,0,249,true +4991,137,0,102,true +4992,146,0,111,true +4993,143,0,100,true +4994,79,0,103,true +4995,117,1,18,true +4996,257,0,92,true +4997,339,0,121,true +4998,335,0,248,true +4999,180,0,110,true +5000,150,1,18,true +5001,110,1,18,true +5002,260,0,115,true +5003,150,0,80,true +5004,128,0,110,true +5005,173,0,101,true +5006,144,0,128,true +5007,134,0,98,true +5008,81,0,109,true +5009,148,0,100,true +5010,66,0,87,true +5011,134,0,90,true +5012,111,1,18,true +5013,322,0,255,true +5014,83,0,101,true +5015,181,0,113,true +5016,153,1,18,true +5017,90,1,12,true +5018,110,0,120,true +5019,337,0,248,true +5020,159,0,104,true +5021,187,0,123,true +5022,119,0,127,true +5023,89,1,24,true +5024,111,0,100,true +5025,300,0,283,true +5026,111,1,18,true +5027,147,0,121,true +5028,205,0,97,true +5029,328,0,248,true +5030,172,0,124,true +5031,197,0,126,true +5032,151,0,96,true +5033,180,0,104,true +5034,6360,125,5001,true +5035,103,0,94,true +5036,343,0,234,true +5037,71,0,93,true +5038,144,0,103,true +5039,142,0,118,true +5040,136,0,86,true +5041,166,0,107,true +5042,84,0,110,true +5043,137,1,24,true +5044,134,0,100,true +5045,134,0,100,true +5046,137,0,140,true +5047,166,1,18,true +5048,130,0,117,true +5049,129,0,100,true +5050,149,0,93,true +5051,99,0,108,true +5052,130,0,118,true +5053,277,1,12,true +5054,83,1,12,true +5055,198,0,140,true +5056,87,0,105,true +5057,162,0,105,true +5058,136,0,113,true +5059,131,0,102,true +5060,100,0,101,true +5061,60,1,18,true +5062,149,0,118,true +5063,137,1,15,true +5064,582,0,255,true +5065,109,1,21,true +5066,102,0,104,true +5067,292,0,245,true +5068,172,0,101,true +5069,140,0,102,true +5070,149,0,126,true +5071,115,1,15,true +5072,137,0,107,true +5073,132,0,80,true +5074,87,0,91,true +5075,112,0,95,true +5076,204,1,18,true +5077,90,0,116,true +5078,74,1,21,true +5079,122,1,24,true +5080,78,0,106,true +5081,149,0,119,true +5082,207,1,24,true +5083,110,0,90,true +5084,186,0,119,true +5085,264,1,15,true +5086,117,0,97,true +5087,119,0,93,true +5088,231,0,121,true +5089,140,0,110,true +5090,81,0,107,true +5091,130,1,18,true +5092,146,0,101,true +5093,258,0,113,true +5094,146,0,111,true +5095,141,1,18,true +5096,97,1,18,true +5097,75,1,18,true +5098,169,0,123,true +5099,149,0,105,true +5100,263,1,12,true +5101,67,0,92,true +5102,130,1,18,true +5103,465,0,235,true +5104,115,0,97,true +5105,143,1,24,true +5106,93,0,96,true +5107,121,1,18,true +5108,345,0,240,true +5109,98,0,126,true +5110,226,1,15,true +5111,113,1,18,true +5112,161,0,111,true +5113,318,0,247,true +5114,292,0,114,true +5115,74,0,83,true +5116,137,0,121,true +5117,142,1,18,true +5118,271,0,120,true +5119,186,0,97,true +5120,313,0,77,true +5121,166,0,78,true +5122,135,1,24,true +5123,194,0,117,true +5124,130,1,21,true +5125,239,0,127,true +5126,402,0,240,true +5127,93,1,21,true +5128,173,0,122,true +5129,151,0,120,true +5130,137,0,107,true +5131,132,1,21,true +5132,150,0,123,true +5133,156,0,126,true +5134,135,1,18,true +5135,290,1,18,true +5136,149,1,12,true +5137,135,0,123,true +5138,148,0,107,true +5139,293,0,249,true +5140,91,1,9,true +5141,201,0,128,true +5142,174,0,112,true +5143,74,0,106,true +5144,351,0,259,true +5145,93,1,21,true +5146,148,1,21,true +5147,179,0,121,true +5148,237,1,15,true +5149,141,0,100,true +5150,106,1,18,true +5151,128,0,126,true +5152,58,1,18,true +5153,216,1,18,true +5154,280,0,106,true +5155,212,0,109,true +5156,157,0,94,true +5157,155,0,125,true +5158,143,0,107,true +5159,67,1,18,true +5160,116,1,24,true +5161,237,1,15,true +5162,176,0,110,true +5163,159,0,129,true +5164,105,0,116,true +5165,226,0,111,true +5166,74,0,87,true +5167,147,1,18,true +5168,104,1,21,true +5169,92,1,12,true +5170,212,0,104,true +5171,84,0,107,true +5172,290,0,245,true +5173,94,0,120,true +5174,306,0,115,true +5175,193,1,24,true +5176,242,0,115,true +5177,160,0,122,true +5178,149,1,15,true +5179,213,0,107,true +5180,231,0,127,true +5181,244,1,18,true +5182,157,1,18,true +5183,175,0,110,true +5184,335,1,12,true +5185,243,1,15,true +5186,169,0,110,true +5187,233,0,98,true +5188,131,0,100,true +5189,299,0,115,true +5190,121,1,24,true +5191,162,0,100,true +5192,225,1,12,true +5193,86,0,80,true +5194,138,0,108,true +5195,194,0,127,true +5196,199,1,18,true +5197,143,0,109,true +5198,188,0,116,true +5199,136,0,126,true +5200,219,1,12,true +5201,122,1,18,true +5202,236,1,15,true +5203,127,1,9,true +5204,288,0,230,true +5205,97,0,102,true +5206,87,0,104,true +5207,324,0,119,true +5208,169,0,92,true +5209,185,1,9,true +5210,309,0,265,true +5211,64,1,24,true +5212,137,0,112,true +5213,246,0,106,true +5214,295,0,92,true +5215,121,0,97,true +5216,402,1,12,true +5217,153,1,21,true +5218,153,0,90,true +5219,256,0,108,true +5220,122,0,108,true +5221,116,0,113,true +5222,224,0,102,true +5223,163,0,121,true +5224,346,0,263,true +5225,79,0,110,true +5226,157,0,107,true +5227,142,0,115,true +5228,142,0,107,true +5229,143,0,127,true +5230,149,0,103,true +5231,131,0,126,true +5232,72,1,24,true +5233,146,0,114,true +5234,98,0,102,true +5235,74,1,21,true +5236,111,1,18,true +5237,144,0,128,true +5238,97,0,115,true +5239,5837,111,3531,true +5240,140,0,86,true +5241,345,0,258,true +5242,99,1,24,true +5243,137,0,106,true +5244,128,0,120,true +5245,340,0,254,true +5246,77,0,97,true +5247,262,1,15,true +5248,471,0,255,true +5249,136,0,110,true +5250,208,0,122,true +5251,205,0,127,true +5252,182,0,104,true +5253,178,1,12,true +5254,129,0,98,true +5255,225,1,24,true +5256,97,0,97,true +5257,138,0,102,true +5258,157,0,129,true +5259,136,0,108,true +5260,66,0,89,true +5261,99,0,90,true +5262,340,0,253,true +5263,116,1,18,true +5264,232,1,18,true +5265,224,1,24,true +5266,143,0,108,true +5267,277,0,245,true +5268,103,0,126,true +5269,187,0,113,true +5270,100,1,24,true +5271,125,0,128,true +5272,99,0,93,true +5273,122,0,101,true +5274,214,1,18,true +5275,112,1,18,true +5276,141,0,109,true +5277,128,0,92,true +5278,77,0,105,true +5279,327,0,249,true +5280,144,0,121,true +5281,159,0,124,true +5282,115,0,95,true +5283,98,0,102,true +5284,135,0,108,true +5285,138,0,119,true +5286,49,1,21,true +5287,137,0,103,true +5288,113,1,18,true +5289,117,0,104,true +5290,281,0,255,true +5291,77,0,103,true +5292,193,0,117,true +5293,99,1,24,true +5294,111,1,18,true +5295,389,1,15,true +5296,106,1,21,true +5297,81,1,21,true +5298,90,0,110,true +5299,130,1,18,true +5300,140,0,100,true +5301,178,0,102,true +5302,91,0,96,true +5303,143,1,18,true +5304,113,0,109,true +5305,125,0,102,true +5306,162,0,110,true +5307,143,0,104,true +5308,129,1,18,true +5309,356,1,15,true +5310,81,1,24,true +5311,341,0,249,true +5312,116,0,104,true +5313,211,0,129,true +5314,169,0,130,true +5315,71,1,18,true +5316,166,0,105,true +5317,168,0,108,true +5318,191,1,21,true +5319,225,0,102,true +5320,249,1,15,true +5321,141,1,18,true +5322,142,0,119,true +5323,67,0,87,true +5324,155,0,116,true +5325,124,0,119,true +5326,150,0,95,true +5327,263,1,15,true +5328,217,1,21,true +5329,148,0,105,true +5330,141,0,113,true +5331,224,1,21,true +5332,5846,100,4069,true +5333,135,0,105,true +5334,80,0,104,true +5335,161,0,126,true +5336,151,0,98,true +5337,163,0,104,true +5338,283,0,250,true +5339,199,1,15,true +5340,237,0,92,true +5341,146,1,24,true +5342,290,0,141,true +5343,187,0,119,true +5344,71,0,92,true +5345,132,1,18,true +5346,230,0,116,true +5347,144,0,93,true +5348,138,1,18,true +5349,578,0,245,true +5350,135,1,24,true +5351,201,1,21,true +5352,92,1,24,true +5353,112,1,18,true +5354,134,0,128,true +5355,478,1,18,true +5356,90,0,93,true +5357,131,0,111,true +5358,122,1,24,true +5359,148,1,12,true +5360,97,1,21,true +5361,155,1,21,true +5362,102,1,18,true +5363,109,0,97,true +5364,223,1,15,true +5365,184,0,80,true +5366,85,0,108,true +5367,98,0,107,true +5368,166,0,105,true +5369,121,1,21,true +5370,147,0,102,true +5371,182,1,18,true +5372,308,0,238,true +5373,75,0,98,true +5374,265,0,119,true +5375,438,0,226,true +5376,79,0,92,true +5377,116,0,114,true +5378,255,0,115,true +5379,191,1,24,true +5380,75,1,12,true +5381,157,0,129,true +5382,277,0,237,true +5383,66,1,24,true +5384,138,0,104,true +5385,255,1,21,true +5386,99,1,24,true +5387,141,1,18,true +5388,174,0,113,true +5389,121,0,125,true +5390,84,0,92,true +5391,528,0,263,true +5392,210,0,115,true +5393,142,0,93,true +5394,147,0,136,true +5395,188,0,108,true +5396,130,0,92,true +5397,136,0,105,true +5398,83,0,99,true +5399,163,0,112,true +5400,187,0,115,true +5401,186,0,104,true +5402,135,0,127,true +5403,113,0,98,true +5404,162,0,93,true +5405,153,0,103,true +5406,232,0,111,true +5407,159,0,124,true +5408,122,1,18,true +5409,229,1,15,true +5410,117,0,115,true +5411,415,0,280,true +5412,314,1,15,true +5413,138,0,110,true +5414,108,1,9,true +5415,162,0,114,true +5416,85,0,91,true +5417,189,0,106,true +5418,160,1,21,true +5419,359,0,125,true +5420,320,0,251,true +5421,159,0,119,true +5422,128,1,18,true +5423,206,1,18,true +5424,242,1,15,true +5425,109,1,24,true +5426,138,0,107,true +5427,83,0,101,true +5428,208,0,126,true +5429,79,1,18,true +5430,47,1,21,true +5431,81,0,94,true +5432,144,1,21,true +5433,146,0,113,true +5434,108,1,18,true +5435,138,0,112,true +5436,61,1,18,true +5437,124,0,85,true +5438,117,1,24,true +5439,127,0,104,true +5440,90,0,86,true +5441,125,1,18,true +5442,141,0,115,true +5443,131,1,12,true +5444,176,0,87,true +5445,392,0,264,true +5446,90,0,113,true +5447,262,0,98,true +5448,136,1,18,true +5449,125,1,24,true +5450,427,0,245,true +5451,169,0,121,true +5452,153,0,113,true +5453,102,1,21,true +5454,292,1,15,true +5455,141,0,107,true +5456,330,0,264,true +5457,78,0,102,true +5458,170,0,111,true +5459,142,0,112,true +5460,166,1,21,true +5461,175,0,104,true +5462,371,0,229,true +5463,71,1,21,true +5464,168,0,105,true +5465,347,1,18,true +5466,149,0,121,true +5467,128,1,18,true +5468,89,0,103,true +5469,216,0,140,true +5470,330,0,260,true +5471,118,1,18,true +5472,87,1,12,true +5473,74,1,18,true +5474,92,0,101,true +5475,140,1,12,true +5476,78,0,91,true +5477,117,0,85,true +5478,131,0,93,true +5479,106,0,93,true +5480,219,0,105,true +5481,189,0,111,true +5482,232,0,102,true +5483,248,0,127,true +5484,226,0,126,true +5485,127,0,94,true +5486,130,0,118,true +5487,184,0,114,true +5488,137,0,103,true +5489,127,0,115,true +5490,257,0,105,true +5491,81,0,92,true +5492,125,0,123,true +5493,134,1,24,true +5494,381,0,262,true +5495,192,0,114,true +5496,157,0,95,true +5497,110,0,110,true +5498,314,0,240,true +5499,132,0,102,true +5500,97,1,24,true +5501,388,0,259,true +5502,140,1,18,true +5503,512,1,15,true +5504,150,0,90,true +5505,201,0,123,true +5506,163,1,24,true +5507,176,1,12,true +5508,132,1,24,true +5509,184,0,112,true +5510,150,0,106,true +5511,149,0,126,true +5512,119,1,21,true +5513,322,0,111,true +5514,280,1,15,true +5515,90,0,109,true +5516,143,0,94,true +5517,112,1,12,true +5518,290,0,252,true +5519,81,1,24,true +5520,260,0,123,true +5521,269,0,138,true +5522,207,1,18,true +5523,292,0,119,true +5524,99,1,15,true +5525,338,0,252,true +5526,137,0,88,true +5527,78,0,105,true +5528,170,0,131,true +5529,283,0,133,true +5530,141,0,110,true +5531,214,0,116,true +5532,200,0,117,true +5533,518,0,255,true +5534,161,0,113,true +5535,217,0,101,true +5536,159,1,18,true +5537,3877,62,1069,true +5538,241,0,113,true +5539,398,0,262,true +5540,80,0,88,true +5541,300,0,98,true +5542,108,1,18,true +5543,186,0,94,true +5544,134,0,103,true +5545,60,1,18,true +5546,220,1,12,true +5547,140,0,112,true +5548,90,1,18,true +5549,94,0,123,true +5550,238,0,119,true +5551,129,0,100,true +5552,125,1,21,true +5553,306,0,92,true +5554,294,0,113,true +5555,124,0,128,true +5556,289,0,245,true +5557,182,0,137,true +5558,203,0,106,true +5559,111,1,18,true +5560,376,0,114,true +5561,264,0,94,true +5562,3845,82,3310,true +5563,148,0,119,true +5564,105,0,95,true +5565,121,1,18,true +5566,343,0,237,true +5567,394,0,231,true +5568,92,0,105,true +5569,216,0,125,true +5570,204,1,21,true +5571,159,0,106,true +5572,121,0,94,true +5573,219,0,99,true +5574,223,1,15,true +5575,124,1,18,true +5576,273,0,112,true +5577,192,0,101,true +5578,94,0,98,true +5579,222,0,112,true +5580,352,0,255,true +5581,143,1,12,true +5582,137,0,101,true +5583,96,0,95,true +5584,194,1,18,true +5585,211,0,120,true +5586,166,0,117,true +5587,219,0,92,true +5588,201,0,108,true +5589,263,0,118,true +5590,192,0,109,true +5591,147,0,119,true +5592,60,0,80,true +5593,131,1,18,true +5594,134,0,108,true +5595,86,0,110,true +5596,154,0,125,true +5597,123,0,92,true +5598,144,0,107,true +5599,132,0,140,true +5600,142,0,121,true +5601,136,0,113,true +5602,143,1,18,true +5603,155,1,12,true +5604,70,0,89,true +5605,168,0,125,true +5606,301,0,257,true +5607,117,0,104,true +5608,214,1,15,true +5609,312,0,113,true +5610,179,0,98,true +5611,165,0,109,true +5612,62,1,21,true +5613,292,0,250,true +5614,159,0,101,true +5615,174,0,118,true +5616,119,0,95,true +5617,111,1,18,true +5618,180,0,109,true +5619,336,0,119,true +5620,182,0,92,true +5621,105,1,18,true +5622,170,1,18,true +5623,140,0,112,true +5624,218,0,78,true +5625,80,0,98,true +5626,115,0,106,true +5627,199,0,140,true +5628,205,0,106,true +5629,207,0,109,true +5630,439,0,257,true +5631,6104,14,5001,true +5632,198,0,123,true +5633,258,1,15,true +5634,127,0,104,true +5635,108,0,94,true +5636,173,0,102,true +5637,134,1,24,true +5638,328,0,245,true +5639,103,0,116,true +5640,159,0,91,true +5641,142,0,101,true +5642,194,1,15,true +5643,346,1,15,true +5644,91,1,12,true +5645,117,0,88,true +5646,277,1,15,true +5647,121,0,124,true +5648,180,0,124,true +5649,35240,189,120,true +5650,142,1,24,true +5651,229,1,15,true +5652,282,0,232,true +5653,96,1,12,true +5654,217,1,24,true +5655,81,0,92,true +5656,136,0,110,true +5657,132,1,21,true +5658,116,0,97,true +5659,185,0,140,true +5660,106,1,21,true +5661,100,0,100,true +5662,214,0,105,true +5663,187,1,18,true +5664,144,0,107,true +5665,90,1,9,true +5666,186,0,101,true +5667,129,0,112,true +5668,498,0,262,true +5669,404,0,121,true +5670,140,0,106,true +5671,112,0,127,true +5672,311,0,253,true +5673,141,0,108,true +5674,131,0,120,true +5675,129,0,86,true +5676,148,0,128,true +5677,166,0,114,true +5678,220,0,127,true +5679,138,1,24,true +5680,110,1,18,true +5681,141,0,115,true +5682,433,0,266,true +5683,64,1,12,true +5684,184,0,120,true +5685,78,0,103,true +5686,135,0,102,true +5687,60,0,80,true +5688,648,0,277,true +5689,407,1,15,true +5690,62789,553,390,true +5691,184,1,24,true +5692,204,0,119,true +5693,181,1,24,true +5694,298,0,101,true +5695,187,1,18,true +5696,96,0,118,true +5697,45472,295,207,true +5698,157,1,24,true +5699,378,1,18,true +5700,89,0,114,true +5701,180,0,109,true +5702,90,0,115,true +5703,140,0,97,true +5704,290,1,18,true +5705,207,0,107,true +5706,100,0,86,true +5707,179,1,24,true +5708,78,1,9,true +5709,189,1,24,true +5710,226,0,113,true +5711,99,0,105,true +5712,89,0,109,true +5713,326,0,256,true +5714,257,0,120,true +5715,102,0,100,true +5716,103,0,124,true +5717,117,0,102,true +5718,72,0,100,true +5719,214,0,119,true +5720,165,0,78,true +5721,184,0,104,true +5722,344,0,251,true +5723,134,1,18,true +5724,144,0,102,true +5725,94,0,127,true +5726,212,0,105,true +5727,206,0,123,true +5728,148,0,125,true +5729,99,0,107,true +5730,357,0,259,true +5731,67,1,12,true +5732,167,0,110,true +5733,153,0,123,true +5734,112,0,86,true +5735,603,0,255,true +5736,212,0,99,true +5737,128,0,93,true +5738,77,0,100,true +5739,124,0,123,true +5740,213,1,18,true +5741,144,1,18,true +5742,117,0,113,true +5743,87,0,95,true +5744,85,0,97,true +5745,93,1,21,true +5746,138,0,115,true +5747,68,1,12,true +5748,159,0,99,true +5749,80,0,97,true +5750,231,1,15,true +5751,4999,113,4479,true +5752,90,0,106,true +5753,106,0,115,true +5754,211,0,114,true +5755,160,0,113,true +5756,118,1,18,true +5757,241,0,115,true +5758,65,0,80,true +5759,246,1,18,true +5760,340,0,248,true +5761,104,0,110,true +5762,111,1,18,true +5763,148,0,125,true +5764,129,0,103,true +5765,79,1,24,true +5766,308,1,18,true +5767,328,1,18,true +5768,184,0,110,true +5769,80,0,97,true +5770,172,1,18,true +5771,142,0,112,true +5772,147,1,21,true +5773,131,0,104,true +5774,147,0,109,true +5775,135,1,21,true +5776,81,1,21,true +5777,84,1,24,true +5778,121,0,82,true +5779,74,0,100,true +5780,199,1,18,true +5781,178,0,114,true +5782,561,0,252,true +5783,108,1,18,true +5784,159,0,117,true +5785,182,0,123,true +5786,146,0,118,true +5787,229,1,18,true +5788,64,1,24,true +5789,135,0,96,true +5790,241,1,12,true +5791,220,1,21,true +5792,93,0,104,true +5793,84,0,98,true +5794,233,0,113,true +5795,83,0,104,true +5796,108,0,92,true +5797,157,0,113,true +5798,112,0,100,true +5799,156,0,123,true +5800,222,0,108,true +5801,211,1,12,true +5802,90,0,104,true +5803,96,1,21,true +5804,97,0,95,true +5805,148,1,18,true +5806,105,1,21,true +5807,148,1,24,true +5808,131,0,97,true +5809,185,0,83,true +5810,74,0,105,true +5811,58,1,18,true +5812,136,0,108,true +5813,216,1,18,true +5814,84,0,104,true +5815,222,1,15,true +5816,134,1,18,true +5817,153,0,126,true +5818,161,0,113,true +5819,137,1,18,true +5820,445,0,256,true +5821,136,0,113,true +5822,86,1,21,true +5823,184,0,129,true +5824,195,0,86,true +5825,86,1,9,true +5826,162,1,24,true +5827,96,0,97,true +5828,83,0,93,true +5829,135,0,107,true +5830,130,1,21,true +5831,79,1,21,true +5832,135,1,18,true +5833,121,1,24,true +5834,141,0,111,true +5835,162,0,140,true +5836,239,1,15,true +5837,165,0,124,true +5838,84,0,85,true +5839,200,0,114,true +5840,140,0,107,true +5841,582,0,245,true +5842,131,0,99,true +5843,290,0,245,true +5844,93,0,117,true +5845,109,1,21,true +5846,150,0,119,true +5847,191,1,24,true +5848,170,0,94,true +5849,480,0,231,true +5850,176,0,110,true +5851,153,0,127,true +5852,142,0,109,true +5853,155,0,117,true +5854,92,0,100,true +5855,121,1,24,true +5856,59,1,12,true +5857,239,1,12,true +5858,134,1,24,true +5859,155,0,141,true +5860,207,0,108,true +5861,79,0,106,true +5862,128,0,129,true +5863,83,1,24,true +5864,121,1,18,true +5865,106,0,93,true +5866,91,0,110,true +5867,121,1,18,true +5868,395,0,255,true +5869,67,1,24,true +5870,142,0,103,true +5871,201,1,21,true +5872,106,0,107,true +5873,72,1,9,true +5874,173,0,116,true +5875,391,1,15,true +5876,201,0,132,true +5877,256,1,15,true +5878,123,0,98,true +5879,154,0,117,true +5880,6754,104,4979,true +5881,147,0,123,true +5882,91,0,105,true +5883,97,0,120,true +5884,371,1,18,true +5885,111,1,21,true +5886,197,0,99,true +5887,216,0,108,true +5888,112,0,102,true +5889,150,1,18,true +5890,127,1,18,true +5891,110,1,12,true +5892,72,0,100,true +5893,156,0,142,true +5894,275,0,127,true +5895,116,1,18,true +5896,151,0,120,true +5897,129,0,123,true +5898,186,0,120,true +5899,279,1,15,true +5900,110,0,110,true +5901,176,0,112,true +5902,70,0,91,true +5903,103,0,116,true +5904,59,1,18,true +5905,675,0,258,true +5906,109,0,95,true +5907,317,0,105,true +5908,181,1,24,true +5909,142,0,115,true +5910,325,0,256,true +5911,127,0,93,true +5912,167,0,112,true +5913,581,0,263,true +5914,142,1,21,true +5915,186,1,18,true +5916,70,1,21,true +5917,313,0,115,true +5918,226,0,104,true +5919,235,0,126,true +5920,184,1,21,true +5921,150,0,104,true +5922,154,0,120,true +5923,91,0,101,true +5924,92,0,108,true +5925,179,0,114,true +5926,118,1,24,true +5927,174,0,121,true +5928,295,1,18,true +5929,257,0,122,true +5930,457,0,256,true +5931,230,0,115,true +5932,233,1,24,true +5933,226,0,113,true +5934,91,0,106,true +5935,27168,227,129,true +5936,401,0,260,true +5937,260,1,12,true +5938,198,0,86,true +5939,205,0,93,true +5940,169,1,15,true +5941,165,0,80,true +5942,188,0,100,true +5943,203,0,95,true +5944,239,0,125,true +5945,181,0,104,true +5946,106,1,24,true +5947,193,1,21,true +5948,179,0,125,true +5949,100,0,107,true +5950,103,0,92,true +5951,148,0,113,true +5952,224,1,15,true +5953,186,0,103,true +5954,211,0,111,true +5955,108,0,92,true +5956,172,0,90,true +5957,103,0,108,true +5958,165,0,107,true +5959,131,0,85,true +5960,282,1,18,true +5961,111,1,21,true +5962,459,0,263,true +5963,94,0,101,true +5964,467,0,259,true +5965,182,0,103,true +5966,84,1,24,true +5967,128,0,125,true +5968,143,0,121,true +5969,77,0,102,true +5970,160,0,110,true +5971,154,0,112,true +5972,201,0,122,true +5973,144,0,103,true +5974,108,1,12,true +5975,207,0,113,true +5976,128,1,21,true +5977,127,0,94,true +5978,75,0,102,true +5979,173,0,97,true +5980,395,1,15,true +5981,142,0,112,true +5982,143,0,103,true +5983,131,0,93,true +5984,121,0,121,true +5985,118,1,12,true +5986,109,1,21,true +5987,182,0,105,true +5988,246,1,15,true +5989,286,0,245,true +5990,77,1,24,true +5991,135,0,107,true +5992,165,0,126,true +5993,153,0,113,true +5994,410,0,257,true +5995,118,1,18,true +5996,191,0,135,true +5997,149,0,119,true +5998,160,0,140,true +5999,103,1,21,true +6000,324,0,242,true +6001,72,0,97,true +6002,222,0,129,true +6003,203,0,101,true +6004,159,0,120,true +6005,168,0,117,true +6006,83,0,110,true +6007,155,0,109,true +6008,315,1,12,true +6009,147,1,24,true +6010,163,0,88,true +6011,160,0,125,true +6012,218,0,115,true +6013,134,0,100,true +6014,189,0,101,true +6015,128,0,94,true +6016,160,0,112,true +6017,241,0,109,true +6018,392,0,232,true +6019,140,1,24,true +6020,127,0,86,true +6021,138,0,107,true +6022,504,1,21,true +6023,157,1,24,true +6024,167,0,125,true +6025,124,0,103,true +6026,132,1,24,true +6027,125,1,18,true +6028,179,0,125,true +6029,137,0,103,true +6030,168,0,121,true +6031,293,0,243,true +6032,320,0,110,true +6033,140,0,104,true +6034,109,0,92,true +6035,86,1,9,true +6036,413,1,15,true +6037,181,0,113,true +6038,125,0,132,true +6039,103,0,86,true +6040,75,1,24,true +6041,118,1,18,true +6042,125,0,107,true +6043,106,0,115,true +6044,191,1,18,true +6045,274,0,122,true +6046,235,1,18,true +6047,122,1,18,true +6048,122,1,18,true +6049,231,1,24,true +6050,102,0,80,true +6051,124,0,92,true +6052,461,0,248,true +6053,273,0,111,true +6054,136,0,121,true +6055,143,1,12,true +6056,81,0,80,true +6057,413,0,252,true +6058,98,0,94,true +6059,141,0,105,true +6060,461,0,253,true +6061,186,0,100,true +6062,17303,177,129,true +6063,103,1,18,true +6064,147,0,140,true +6065,168,0,122,true +6066,134,0,108,true +6067,130,0,127,true +6068,286,0,236,true +6069,97,1,24,true +6070,156,0,117,true +6071,136,1,18,true +6072,464,0,257,true +6073,66,1,9,true +6074,238,1,18,true +6075,188,0,103,true +6076,299,0,111,true +6077,192,1,24,true +6078,175,1,21,true +6079,341,0,103,true +6080,81,1,18,true +6081,140,1,18,true +6082,288,0,253,true +6083,220,0,112,true +6084,214,1,12,true +6085,121,0,110,true +6086,161,0,120,true +6087,204,0,112,true +6088,89,0,103,true +6089,135,0,97,true +6090,56,1,18,true +6091,99,0,97,true +6092,232,1,15,true +6093,102,1,9,true +6094,143,0,115,true +6095,187,1,18,true +6096,119,0,86,true +6097,128,1,18,true +6098,166,0,100,true +6099,511,0,272,true +6100,231,1,21,true +6101,79,0,89,true +6102,277,0,106,true +6103,281,0,88,true +6104,156,1,15,true +6105,204,0,125,true +6106,432,0,245,true +6107,80,0,91,true +6108,427,0,245,true +6109,99,0,109,true +6110,91,0,97,true +6111,271,0,92,true +6112,218,1,12,true +6113,112,1,18,true +6114,178,1,21,true +6115,207,1,18,true +6116,193,0,105,true +6117,121,0,103,true +6118,131,0,92,true +6119,80,0,117,true +6120,125,1,18,true +6121,113,1,21,true +6122,303,0,112,true +6123,5435,82,3716,true +6124,416,0,244,true +6125,65,1,24,true +6126,212,1,18,true +6127,187,0,109,true +6128,154,0,103,true +6129,80,0,92,true +6130,238,1,18,true +6131,204,0,86,true +6132,185,1,21,true +6133,173,0,98,true +6134,205,1,18,true +6135,87,0,100,true +6136,1072,64,650,true +6137,137,0,108,true +6138,70,0,92,true +6139,110,0,119,true +6140,115,1,15,true +6141,143,0,115,true +6142,216,0,112,true +6143,226,0,122,true +6144,214,0,113,true +6145,235,0,114,true +6146,90,1,12,true +6147,136,1,18,true +6148,263,1,18,true +6149,269,0,108,true +6150,138,0,116,true +6151,108,1,18,true +6152,94,1,24,true +6153,192,0,115,true +6154,445,0,225,true +6155,100,0,94,true +6156,197,0,108,true +6157,78,0,89,true +6158,155,0,108,true +6159,143,0,115,true +6160,116,1,24,true +6161,135,0,93,true +6162,118,0,116,true +6163,191,0,124,true +6164,384,0,118,true +6165,191,1,24,true +6166,428,0,245,true +6167,260,0,109,true +6168,651,0,277,true +6169,136,1,21,true +6170,218,1,21,true +6171,281,0,238,true +6172,138,0,103,true +6173,104,1,24,true +6174,121,0,109,true +6175,100,1,24,true +6176,273,0,122,true +6177,116,0,103,true +6178,124,1,21,true +6179,125,0,90,true +6180,109,0,121,true +6181,157,0,104,true +6182,137,0,111,true +6183,131,1,18,true +6184,132,0,108,true +6185,180,0,99,true +6186,105,0,92,true +6187,339,0,239,true +6188,276,0,241,true +6189,73,1,24,true +6190,117,1,18,true +6191,116,0,102,true +6192,388,0,245,true +6193,125,0,117,true +6194,378,0,245,true +6195,83,0,92,true +6196,188,0,129,true +6197,93,1,24,true +6198,153,0,82,true +6199,86,0,80,true +6200,150,0,110,true +6201,165,0,92,true +6202,128,1,18,true +6203,186,0,127,true +6204,160,0,104,true +6205,116,1,24,true +6206,134,0,123,true +6207,149,0,116,true +6208,119,1,24,true +6209,155,0,115,true +6210,340,1,18,true +6211,147,0,111,true +6212,147,0,98,true +6213,140,0,103,true +6214,186,0,112,true +6215,225,1,15,true +6216,81,1,18,true +6217,86,0,107,true +6218,142,0,114,true +6219,134,1,18,true +6220,94,1,21,true +6221,233,0,105,true +6222,135,0,104,true +6223,244,1,18,true +6224,96,0,91,true +6225,212,0,113,true +6226,116,0,95,true +6227,132,0,93,true +6228,72,0,92,true +6229,200,0,114,true +6230,147,1,24,true +6231,743,0,255,true +6232,287,0,122,true +6233,262,1,15,true +6234,166,1,24,true +6235,100,0,87,true +6236,100,0,86,true +6237,124,1,12,true +6238,71,0,92,true +6239,150,0,133,true +6240,58,1,18,true +6241,352,0,244,true +6242,104,0,123,true +6243,351,0,124,true +6244,346,0,245,true +6245,166,1,24,true +6246,168,1,21,true +6247,225,0,126,true +6248,169,0,112,true +6249,186,0,119,true +6250,263,0,111,true +6251,157,0,99,true +6252,173,0,110,true +6253,109,0,89,true +6254,130,1,21,true +6255,129,0,86,true +6256,436,0,262,true +6257,238,0,117,true +6258,92,0,100,true +6259,205,0,99,true +6260,89,0,99,true +6261,136,0,100,true +6262,113,1,21,true +6263,142,0,90,true +6264,385,0,127,true +6265,93,1,12,true +6266,222,0,119,true +6267,397,0,229,true +6268,108,0,113,true +6269,136,1,21,true +6270,166,0,123,true +6271,102,0,104,true +6272,122,0,111,true +6273,248,0,121,true +6274,137,0,105,true +6275,100,1,18,true +6276,55,1,18,true +6277,135,0,110,true +6278,80,1,12,true +6279,197,0,132,true +6280,144,1,18,true +6281,200,1,18,true +6282,267,1,12,true +6283,199,0,97,true +6284,94,0,95,true +6285,154,0,132,true +6286,111,1,15,true +6287,397,0,261,true +6288,96,0,106,true +6289,135,1,24,true +6290,155,1,21,true +6291,132,0,123,true +6292,185,0,108,true +6293,696,0,267,true +6294,110,1,15,true +6295,273,0,229,true +6296,246,0,119,true +6297,124,0,92,true +6298,181,0,103,true +6299,129,1,12,true +6300,311,0,257,true +6301,43890,423,249,true +6302,117,0,108,true +6303,194,0,123,true +6304,394,0,258,true +6305,100,0,97,true +6306,313,0,102,true +6307,148,0,80,true +6308,108,1,15,true +6309,77,1,12,true +6310,91,0,107,true +6311,163,0,94,true +6312,217,0,122,true +6313,140,0,110,true +6314,207,1,15,true +6315,219,0,140,true +6316,147,0,104,true +6317,237,1,12,true +6318,184,1,18,true +6319,218,0,89,true +6320,166,0,87,true +6321,155,0,110,true +6322,131,0,94,true +6323,91,0,107,true +6324,143,0,122,true +6325,91,1,24,true +6326,179,0,99,true +6327,146,0,99,true +6328,108,0,97,true +6329,357,0,261,true +6330,124,0,119,true +6331,130,0,98,true +6332,179,1,24,true +6333,147,0,123,true +6334,129,0,92,true +6335,311,0,264,true +6336,127,0,113,true +6337,311,0,277,true +6338,213,0,118,true +6339,132,0,105,true +6340,84,0,97,true +6341,127,0,93,true +6342,75,0,86,true +6343,333,0,255,true +6344,92,0,114,true +6345,113,1,15,true +6346,346,0,248,true +6347,148,0,117,true +6348,84,1,24,true +6349,131,0,100,true +6350,112,0,123,true +6351,258,0,114,true +6352,155,0,85,true +6353,125,0,108,true +6354,172,0,132,true +6355,185,0,127,true +6356,445,0,255,true +6357,98,0,104,true +6358,156,0,115,true +6359,124,0,117,true +6360,138,1,18,true +6361,141,0,100,true +6362,180,0,127,true +6363,180,0,95,true +6364,298,0,254,true +6365,97,0,113,true +6366,185,0,113,true +6367,204,0,114,true +6368,197,0,113,true +6369,128,0,106,true +6370,231,0,120,true +6371,349,0,257,true +6372,93,0,100,true +6373,188,0,98,true +6374,214,0,107,true +6375,93,1,24,true +6376,129,0,118,true +6377,117,0,97,true +6378,109,1,21,true +6379,210,0,113,true +6380,189,0,98,true +6381,90,1,24,true +6382,168,0,96,true +6383,86,1,12,true +6384,109,0,100,true +6385,127,0,88,true +6386,75,0,107,true +6387,350,1,15,true +6388,143,0,122,true +6389,173,0,128,true +6390,263,1,15,true +6391,199,1,12,true +6392,104,0,85,true +6393,119,1,18,true +6394,434,0,241,true +6395,154,0,122,true +6396,136,0,104,true +6397,91,1,18,true +6398,225,0,91,true +6399,71,1,18,true +6400,102,0,125,true +6401,74,1,24,true +6402,227,1,15,true +6403,93,0,122,true +6404,115,1,21,true +6405,58,1,15,true +6406,150,0,122,true +6407,161,0,101,true +6408,230,0,125,true +6409,127,1,21,true +6410,187,0,94,true +6411,118,0,113,true +6412,100,0,116,true +6413,121,1,18,true +6414,125,0,123,true +6415,224,0,123,true +6416,127,0,98,true +6417,92,0,92,true +6418,213,1,15,true +6419,231,0,103,true +6420,128,1,18,true +6421,98,0,94,true +6422,128,0,93,true +6423,203,0,80,true +6424,65,1,21,true +6425,611,0,260,true +6426,157,1,24,true +6427,96,1,24,true +6428,345,0,275,true +6429,186,0,110,true +6430,142,0,114,true +6431,609,0,200,true +6432,127,0,116,true +6433,121,0,98,true +6434,454,0,261,true +6435,108,0,101,true +6436,351,0,120,true +6437,119,0,113,true +6438,309,0,261,true +6439,178,0,123,true +6440,383,0,257,true +6441,86,0,95,true +6442,141,0,116,true +6443,110,1,24,true +6444,153,1,24,true +6445,146,0,106,true +6446,157,0,112,true +6447,93,0,107,true +6448,112,1,18,true +6449,261,1,18,true +6450,136,1,18,true +6451,179,0,93,true +6452,121,1,18,true +6453,327,0,245,true +6454,154,1,24,true +6455,113,1,18,true +6456,129,0,98,true +6457,160,0,114,true +6458,162,1,12,true +6459,219,0,117,true +6460,296,1,15,true +6461,173,0,109,true +6462,161,1,18,true +6463,352,0,267,true +6464,110,1,15,true +6465,337,0,117,true +6466,84,0,100,true +6467,117,1,24,true +6468,188,0,86,true +6469,80,0,110,true +6470,129,1,15,true +6471,168,0,124,true +6472,111,1,21,true +6473,241,0,113,true +6474,211,0,86,true +6475,74,0,89,true +6476,157,0,118,true +6477,118,0,92,true +6478,163,0,103,true +6479,143,1,12,true +6480,230,0,107,true +6481,118,0,87,true +6482,206,0,118,true +6483,251,0,141,true +6484,121,0,89,true +6485,141,0,88,true +6486,79,0,107,true +6487,142,0,107,true +6488,93,0,112,true +6489,144,0,126,true +6490,213,1,12,true +6491,373,0,124,true +6492,379,1,15,true +6493,84,0,109,true +6494,148,1,15,true +6495,140,0,113,true +6496,224,1,24,true +6497,178,0,101,true +6498,93,0,116,true +6499,92,0,123,true +6500,180,1,18,true +6501,166,1,18,true +6502,255,0,138,true +6503,309,0,265,true +6504,269,1,24,true +6505,144,0,117,true +6506,236,0,94,true +6507,165,0,112,true +6508,178,1,24,true +6509,334,0,253,true +6510,98,0,103,true +6511,149,0,117,true +6512,80,0,109,true +6513,573,1,15,true +6514,249,1,21,true +6515,204,1,24,true +6516,118,0,111,true +6517,99,0,94,true +6518,135,0,102,true +6519,132,0,113,true +6520,148,1,18,true +6521,128,1,18,true +6522,109,1,21,true +6523,99,0,100,true +6524,198,0,116,true +6525,155,0,115,true +6526,227,0,112,true +6527,68,1,21,true +6528,188,0,120,true +6529,237,0,111,true +6530,93,1,18,true +6531,141,0,113,true +6532,218,0,103,true +6533,116,0,101,true +6534,6304,61,5001,true +6535,135,0,108,true +6536,73,0,107,true +6537,335,0,266,true +6538,74,1,24,true +6539,178,0,131,true +6540,99,1,9,true +6541,436,0,275,true +6542,140,0,118,true +6543,153,0,99,true +6544,264,0,113,true +6545,311,1,18,true +6546,230,1,15,true +6547,161,0,118,true +6548,119,1,18,true +6549,262,0,129,true +6550,314,0,224,true +6551,187,0,111,true +6552,142,0,112,true +6553,111,0,116,true +6554,104,0,116,true +6555,337,0,123,true +6556,128,1,18,true +6557,141,0,112,true +6558,146,0,118,true +6559,565,0,250,true +6560,214,0,110,true +6561,100,0,87,true +6562,113,1,18,true +6563,116,0,105,true +6564,98,0,107,true +6565,148,0,120,true +6566,231,0,103,true +6567,124,1,21,true +6568,295,0,240,true +6569,159,0,85,true +6570,150,0,92,true +6571,100,0,108,true +6572,108,0,127,true +6573,104,0,102,true +6574,141,0,101,true +6575,71,0,100,true +6576,195,0,105,true +6577,185,1,24,true +6578,93,0,92,true +6579,83,0,92,true +6580,3673,84,2818,true +6581,440,0,253,true +6582,89,0,118,true +6583,122,1,18,true +6584,106,0,94,true +6585,497,1,12,true +6586,222,0,114,true +6587,112,1,18,true +6588,134,0,105,true +6589,395,0,238,true +6590,118,1,18,true +6591,317,0,263,true +6592,3460,91,2613,true +6593,153,0,104,true +6594,98,0,104,true +6595,94,0,118,true +6596,135,0,97,true +6597,149,0,119,true +6598,109,0,105,true +6599,141,0,114,true +6600,84,0,107,true +6601,137,0,103,true +6602,210,0,140,true +6603,124,0,87,true +6604,162,0,109,true +6605,195,0,110,true +6606,233,0,104,true +6607,165,0,108,true +6608,274,0,105,true +6609,119,0,124,true +6610,279,1,12,true +6611,113,0,90,true +6612,224,1,18,true +6613,140,1,15,true +6614,163,0,123,true +6615,341,1,18,true +6616,103,1,12,true +6617,566,0,252,true +6618,320,0,242,true +6619,87,1,21,true +6620,110,1,15,true +6621,220,0,93,true +6622,163,0,121,true +6623,122,0,110,true +6624,282,0,93,true +6625,185,0,99,true +6626,187,1,21,true +6627,138,1,18,true +6628,360,1,21,true +6629,87,0,114,true +6630,185,0,125,true +6631,125,0,88,true +6632,92,0,94,true +6633,216,0,115,true +6634,115,0,110,true +6635,271,0,114,true +6636,157,0,107,true +6637,99,0,102,true +6638,127,1,18,true +6639,197,1,24,true +6640,169,0,140,true +6641,296,0,260,true +6642,159,0,129,true +6643,99,0,94,true +6644,117,0,85,true +6645,273,1,15,true +6646,121,0,119,true +6647,280,0,111,true +6648,146,0,116,true +6649,173,0,90,true +6650,106,1,18,true +6651,169,0,109,true +6652,81,1,9,true +6653,320,0,251,true +6654,274,1,15,true +6655,70,0,94,true +6656,136,0,103,true +6657,94,0,94,true +6658,233,0,110,true +6659,138,1,18,true +6660,140,0,113,true +6661,121,1,18,true +6662,112,0,116,true +6663,113,0,140,true +6664,108,1,9,true +6665,70,0,92,true +6666,144,0,119,true +6667,345,0,115,true +6668,151,0,95,true +6669,83,0,103,true +6670,408,0,132,true +6671,176,1,18,true +6672,91,1,24,true +6673,111,1,18,true +6674,125,1,18,true +6675,93,0,101,true +6676,136,0,106,true +6677,61,0,82,true +6678,175,0,137,true +6679,89,1,18,true +6680,99,1,24,true +6681,134,0,141,true +6682,136,0,95,true +6683,75,1,15,true +6684,123,1,15,true +6685,157,0,109,true +6686,182,0,119,true +6687,339,0,263,true +6688,132,1,21,true +6689,110,0,115,true +6690,111,0,113,true +6691,125,0,117,true +6692,283,0,245,true +6693,132,0,109,true +6694,78,0,109,true +6695,78,1,18,true +6696,138,0,107,true +6697,112,1,18,true +6698,89,0,91,true +6699,219,0,114,true +6700,185,0,92,true +6701,160,0,123,true +6702,153,1,24,true +6703,296,0,125,true +6704,235,0,97,true +6705,118,0,104,true +6706,105,0,139,true +6707,130,0,115,true +6708,376,0,249,true +6709,138,0,110,true +6710,155,0,114,true +6711,121,0,107,true +6712,187,0,111,true +6713,270,1,15,true +6714,283,0,249,true +6715,96,0,85,true +6716,210,1,18,true +6717,313,0,241,true +6718,67,0,86,true +6719,185,1,15,true +6720,214,0,108,true +6721,167,0,119,true +6722,89,0,111,true +6723,150,0,119,true +6724,255,0,106,true +6725,117,0,110,true +6726,117,0,97,true +6727,339,0,113,true +6728,203,0,127,true +6729,98,0,94,true +6730,213,0,114,true +6731,194,0,127,true +6732,138,0,97,true +6733,132,0,114,true +6734,6118,38,5001,true +6735,169,0,109,true +6736,201,0,110,true +6737,328,0,121,true +6738,135,0,110,true +6739,172,0,125,true +6740,98,0,98,true +6741,140,1,18,true +6742,117,0,92,true +6743,116,1,18,true +6744,6928,89,5001,true +6745,143,0,92,true +6746,415,1,18,true +6747,174,1,18,true +6748,324,0,259,true +6749,87,1,9,true +6750,121,0,101,true +6751,150,0,108,true +6752,224,0,106,true +6753,70,0,82,true +6754,211,0,118,true +6755,162,0,109,true +6756,122,0,107,true +6757,150,0,123,true +6758,156,0,101,true +6759,225,1,24,true +6760,84,0,90,true +6761,213,0,118,true +6762,668,0,253,true +6763,303,0,262,true +6764,143,0,113,true +6765,141,0,108,true +6766,160,1,24,true +6767,327,0,111,true +6768,187,0,109,true +6769,123,0,113,true +6770,239,0,115,true +6771,199,0,120,true +6772,160,0,108,true +6773,66,0,85,true +6774,292,0,258,true +6775,78,1,18,true +6776,191,0,123,true +6777,200,0,100,true +6778,211,1,15,true +6779,84,0,104,true +6780,224,1,15,true +6781,98,0,127,true +6782,263,0,110,true +6783,205,0,108,true +6784,302,0,255,true +6785,153,1,24,true +6786,283,0,122,true +6787,194,0,132,true +6788,473,0,272,true +6789,118,0,114,true +6790,136,0,102,true +6791,250,0,140,true +6792,351,0,247,true +6793,394,0,235,true +6794,68,0,90,true +6795,166,0,119,true +6796,149,0,112,true +6797,155,0,108,true +6798,79,0,108,true +6799,110,0,113,true +6800,83,0,86,true +6801,112,1,18,true +6802,184,1,18,true +6803,178,0,129,true +6804,146,0,119,true +6805,169,0,111,true +6806,179,0,126,true +6807,115,0,86,true +6808,103,0,99,true +6809,117,0,126,true +6810,282,0,241,true +6811,79,1,18,true +6812,346,1,15,true +6813,70,1,21,true +6814,258,0,139,true +6815,92,0,106,true +6816,287,0,253,true +6817,281,0,117,true +6818,343,1,15,true +6819,149,0,126,true +6820,340,0,120,true +6821,217,0,99,true +6822,189,0,97,true +6823,204,0,114,true +6824,70,0,90,true +6825,220,0,126,true +6826,187,0,127,true +6827,453,0,255,true +6828,179,0,106,true +6829,216,1,18,true +6830,159,1,21,true +6831,96,0,97,true +6832,6545,44,5001,true +6833,79,0,104,true +6834,140,0,103,true +6835,149,0,107,true +6836,125,1,24,true +6837,166,0,115,true +6838,123,1,18,true +6839,125,0,115,true +6840,110,0,90,true +6841,207,0,105,true +6842,226,0,121,true +6843,210,1,21,true +6844,142,0,100,true +6845,143,0,82,true +6846,92,0,103,true +6847,325,0,255,true +6848,110,1,18,true +6849,199,0,100,true +6850,112,1,18,true +6851,90,1,24,true +6852,134,0,131,true +6853,269,1,21,true +6854,72,0,90,true +6855,168,0,114,true +6856,200,0,116,true +6857,199,0,122,true +6858,218,0,109,true +6859,131,0,106,true +6860,60,0,80,true +6861,193,0,121,true +6862,121,1,24,true +6863,123,1,18,true +6864,141,0,111,true +6865,85,1,24,true +6866,224,1,21,true +6867,193,1,21,true +6868,157,0,101,true +6869,157,1,12,true +6870,68,0,92,true +6871,148,0,110,true +6872,590,0,257,true +6873,186,0,113,true +6874,128,0,100,true +6875,204,0,107,true +6876,254,0,140,true +6877,129,1,18,true +6878,169,0,107,true +6879,299,0,255,true +6880,141,1,12,true +6881,144,0,110,true +6882,243,0,121,true +6883,295,0,250,true +6884,86,0,116,true +6885,249,0,122,true +6886,175,0,115,true +6887,243,1,15,true +6888,116,0,98,true +6889,111,1,18,true +6890,84,0,92,true +6891,135,1,18,true +6892,284,0,244,true +6893,68,1,12,true +6894,200,0,94,true +6895,220,0,86,true +6896,91,0,104,true +6897,162,0,140,true +6898,168,0,123,true +6899,187,0,117,true +6900,376,1,15,true +6901,286,0,230,true +6902,75,0,93,true +6903,91,0,102,true +6904,203,1,24,true +6905,112,1,18,true +6906,136,0,107,true +6907,258,0,127,true +6908,153,0,109,true +6909,200,1,18,true +6910,132,0,101,true +6911,108,0,120,true +6912,156,0,105,true +6913,92,0,111,true +6914,343,0,257,true +6915,241,0,115,true +6916,161,0,90,true +6917,289,0,246,true +6918,245,1,18,true +6919,192,1,18,true +6920,161,0,114,true +6921,97,0,97,true +6922,122,1,18,true +6923,182,0,115,true +6924,130,0,99,true +6925,156,0,101,true +6926,91,1,21,true +6927,112,0,125,true +6928,290,0,240,true +6929,148,0,103,true +6930,189,0,139,true +6931,86,0,97,true +6932,105,1,12,true +6933,421,0,268,true +6934,143,0,122,true +6935,210,0,97,true +6936,186,1,24,true +6937,128,1,24,true +6938,98,0,92,true +6939,230,0,108,true +6940,256,1,15,true +6941,176,0,102,true +6942,123,0,116,true +6943,211,1,18,true +6944,216,0,92,true +6945,167,0,101,true +6946,238,1,9,true +6947,199,0,110,true +6948,282,0,228,true +6949,105,0,123,true +6950,197,0,119,true +6951,176,1,24,true +6952,446,0,252,true +6953,89,0,105,true +6954,168,0,122,true +6955,180,0,114,true +6956,148,0,119,true +6957,239,1,18,true +6958,218,0,112,true +6959,117,1,18,true +6960,311,0,88,true +6961,192,0,107,true +6962,172,0,124,true +6963,246,0,103,true +6964,223,0,124,true +6965,236,0,98,true +6966,336,1,12,true +6967,169,0,110,true +6968,364,0,250,true +6969,194,0,100,true +6970,130,0,126,true +6971,75,1,12,true +6972,103,0,115,true +6973,281,0,112,true +6974,159,0,117,true +6975,90,0,94,true +6976,169,1,21,true +6977,270,0,116,true +6978,200,0,97,true +6979,198,1,24,true +6980,150,0,106,true +6981,251,0,111,true +6982,195,1,21,true +6983,340,1,15,true +6984,81,0,90,true +6985,113,0,116,true +6986,112,1,18,true +6987,211,0,109,true +6988,118,0,107,true +6989,132,0,112,true +6990,176,0,115,true +6991,231,0,109,true +6992,157,0,102,true +6993,67,0,87,true +6994,106,0,104,true +6995,381,1,15,true +6996,97,1,24,true +6997,108,0,112,true +6998,106,1,21,true +6999,109,1,18,true +7000,140,0,109,true +7001,244,1,18,true +7002,376,1,18,true +7003,112,0,123,true +7004,287,0,252,true +7005,179,0,125,true +7006,153,0,112,true +7007,110,0,106,true +7008,104,1,9,true +7009,140,0,112,true +7010,170,0,120,true +7011,148,0,113,true +7012,195,1,18,true +7013,140,0,86,true +7014,111,0,107,true +7015,167,0,96,true +7016,156,0,131,true +7017,35712,296,207,true +7018,251,0,110,true +7019,108,1,18,true +7020,176,0,94,true +7021,185,0,104,true +7022,233,1,18,true +7023,290,0,92,true +7024,142,0,93,true +7025,92,0,86,true +7026,241,0,97,true +7027,66,1,12,true +7028,201,1,18,true +7029,192,1,12,true +7030,83,0,92,true +7031,282,0,249,true +7032,156,0,117,true +7033,117,0,105,true +7034,122,1,24,true +7035,141,0,90,true +7036,98,1,24,true +7037,106,1,18,true +7038,286,1,12,true +7039,204,0,119,true +7040,168,0,121,true +7041,119,0,104,true +7042,85,1,18,true +7043,303,1,15,true +7044,89,0,101,true +7045,160,0,105,true +7046,309,0,106,true +7047,168,1,18,true +7048,143,0,113,true +7049,81,0,110,true +7050,156,0,123,true +7051,132,0,95,true +7052,123,1,12,true +7053,71,0,93,true +7054,396,0,241,true +7055,309,0,114,true +7056,301,0,103,true +7057,132,0,106,true +7058,260,1,21,true +7059,132,1,21,true +7060,97,0,115,true +7061,168,1,24,true +7062,159,0,97,true +7063,217,1,12,true +7064,188,0,111,true +7065,117,1,18,true +7066,153,0,95,true +7067,94,0,109,true +7068,143,0,92,true +7069,207,0,135,true +7070,162,0,119,true +7071,113,1,15,true +7072,154,0,119,true +7073,115,1,18,true +7074,184,0,93,true +7075,191,0,109,true +7076,124,0,127,true +7077,81,0,97,true +7078,121,1,12,true +7079,251,1,18,true +7080,168,0,111,true +7081,140,1,18,true +7082,193,0,110,true +7083,132,0,99,true +7084,102,0,107,true +7085,232,1,15,true +7086,56,1,9,true +7087,135,0,107,true +7088,108,0,101,true +7089,325,0,254,true +7090,270,1,15,true +7091,90,0,94,true +7092,149,0,117,true +7093,308,0,262,true +7094,77,0,94,true +7095,453,0,233,true +7096,136,0,124,true +7097,229,1,15,true +7098,92,0,92,true +7099,644,0,246,true +7100,148,1,21,true +7101,338,0,115,true +7102,178,0,115,true +7103,86,0,101,true +7104,121,1,18,true +7105,305,1,12,true +7106,108,0,122,true +7107,90,0,110,true +7108,97,0,113,true +7109,194,1,18,true +7110,117,0,103,true +7111,182,0,140,true +7112,575,0,248,true +7113,93,1,21,true +7114,182,0,109,true +7115,103,0,102,true +7116,125,1,18,true +7117,119,0,92,true +7118,123,1,18,true +7119,232,0,112,true +7120,220,1,18,true +7121,89,0,99,true +7122,159,0,92,true +7123,62,1,12,true +7124,136,0,101,true +7125,162,0,122,true +7126,464,0,262,true +7127,160,0,107,true +7128,72,1,21,true +7129,184,0,121,true +7130,110,0,109,true +7131,122,0,105,true +7132,119,0,112,true +7133,144,0,107,true +7134,210,0,123,true +7135,203,0,106,true +7136,92,0,99,true +7137,79,0,97,true +7138,224,1,15,true +7139,351,0,234,true +7140,113,0,139,true +7141,104,0,90,true +7142,565,0,255,true +7143,153,0,109,true +7144,143,0,129,true +7145,109,0,125,true +7146,233,0,88,true +7147,90,0,92,true +7148,200,0,120,true +7149,208,0,102,true +7150,128,1,24,true +7151,132,0,94,true +7152,257,0,114,true +7153,169,0,111,true +7154,160,0,103,true +7155,108,0,90,true +7156,135,0,110,true +7157,92,0,109,true +7158,169,0,113,true +7159,149,0,104,true +7160,256,1,18,true +7161,131,0,95,true +7162,70,0,95,true +7163,123,1,18,true +7164,135,0,110,true +7165,161,0,127,true +7166,143,0,122,true +7167,433,0,267,true +7168,178,1,18,true +7169,119,0,97,true +7170,174,0,109,true +7171,105,1,12,true +7172,112,0,105,true +7173,149,0,121,true +7174,169,0,131,true +7175,74,1,18,true +7176,207,0,127,true +7177,351,1,12,true +7178,140,0,94,true +7179,236,1,15,true +7180,341,1,15,true +7181,66,1,21,true +7182,246,0,115,true +7183,349,0,242,true +7184,86,0,99,true +7185,157,1,21,true +7186,344,0,120,true +7187,174,1,12,true +7188,207,0,116,true +7189,108,0,108,true +7190,245,0,126,true +7191,121,0,86,true +7192,142,0,109,true +7193,296,0,102,true +7194,137,0,108,true +7195,78,0,108,true +7196,117,0,86,true +7197,135,0,92,true +7198,216,0,124,true +7199,298,0,251,true +7200,93,1,21,true +7201,146,0,96,true +7202,105,1,18,true +7203,224,0,114,true +7204,184,0,124,true +7205,327,0,122,true +7206,135,1,15,true +7207,116,0,106,true +7208,127,0,140,true +7209,180,0,113,true +7210,535,1,15,true +7211,90,0,104,true +7212,294,0,248,true +7213,149,0,115,true +7214,62,0,85,true +7215,132,0,107,true +7216,148,0,124,true +7217,166,0,97,true +7218,105,0,86,true +7219,162,0,111,true +7220,311,0,278,true +7221,140,1,18,true +7222,199,0,113,true +7223,83,0,94,true +7224,146,0,104,true +7225,347,0,252,true +7226,136,0,114,true +7227,396,1,15,true +7228,381,0,107,true +7229,127,1,21,true +7230,100,1,18,true +7231,142,0,78,true +7232,89,0,108,true +7233,165,0,140,true +7234,198,0,100,true +7235,233,24,109,true +7236,200,0,113,true +7237,238,0,123,true +7238,249,1,15,true +7239,59,1,21,true +7240,142,0,95,true +7241,354,0,255,true +7242,206,0,110,true +7243,115,1,24,true +7244,163,0,113,true +7245,295,0,263,true +7246,1569,42,882,true +7247,339,0,126,true +7248,117,1,12,true +7249,123,0,96,true +7250,137,0,140,true +7251,159,0,122,true +7252,439,0,252,true +7253,96,0,113,true +7254,146,0,116,true +7255,241,0,106,true +7256,168,0,118,true +7257,237,0,113,true +7258,193,0,99,true +7259,142,1,18,true +7260,155,1,12,true +7261,97,0,109,true +7262,217,0,110,true +7263,181,0,124,true +7264,127,1,15,true +7265,230,1,21,true +7266,216,1,18,true +7267,132,0,113,true +7268,113,0,127,true +7269,137,0,107,true +7270,78,0,111,true +7271,121,1,21,true +7272,148,1,9,true +7273,147,0,122,true +7274,137,0,102,true +7275,163,0,119,true +7276,326,0,230,true +7277,90,0,104,true +7278,150,0,118,true +7279,117,0,122,true +7280,156,0,111,true +7281,93,0,98,true +7282,91,1,24,true +7283,288,0,123,true +7284,124,0,110,true +7285,150,0,98,true +7286,80,1,9,true +7287,154,0,107,true +7288,93,0,108,true +7289,155,0,139,true +7290,78,1,24,true +7291,379,1,15,true +7292,110,1,15,true +7293,138,0,97,true +7294,238,0,110,true +7295,138,1,18,true +7296,166,0,98,true +7297,211,1,18,true +7298,156,0,109,true +7299,343,0,251,true +7300,331,0,238,true +7301,79,0,97,true +7302,111,1,24,true +7303,115,1,18,true +7304,119,0,107,true +7305,142,0,81,true +7306,71,0,92,true +7307,138,0,106,true +7308,162,0,102,true +7309,150,0,86,true +7310,169,0,108,true +7311,137,0,107,true +7312,180,1,12,true +7313,119,1,18,true +7314,113,1,18,true +7315,119,0,115,true +7316,175,0,114,true +7317,102,0,93,true +7318,125,0,115,true +7319,162,0,102,true +7320,189,0,123,true +7321,212,0,92,true +7322,129,0,87,true +7323,347,0,255,true +7324,294,0,99,true +7325,94,1,9,true +7326,290,0,251,true +7327,128,1,18,true +7328,124,0,89,true +7329,72,0,83,true +7330,258,0,112,true +7331,141,0,126,true +7332,112,0,90,true +7333,92,0,116,true +7334,93,0,97,true +7335,97,0,107,true +7336,83,0,97,true +7337,143,0,112,true +7338,149,0,129,true +7339,153,0,107,true +7340,186,0,115,true +7341,83,0,109,true +7342,153,0,120,true +7343,327,0,119,true +7344,94,0,124,true +7345,97,0,133,true +7346,179,0,88,true +7347,56,1,21,true +7348,205,1,18,true +7349,445,0,227,true +7350,238,1,15,true +7351,187,0,98,true +7352,91,0,109,true +7353,77,0,105,true +7354,121,0,113,true +7355,331,0,263,true +7356,37870,414,351,true +7357,94,1,24,true +7358,287,0,129,true +7359,216,0,123,true +7360,109,0,111,true +7361,119,1,18,true +7362,245,0,107,true +7363,319,0,273,true +7364,72,0,95,true +7365,156,1,18,true +7366,92,1,24,true +7367,425,0,248,true +7368,90,0,97,true +7369,178,1,18,true +7370,136,0,131,true +7371,81,0,89,true +7372,41427,388,300,true +7373,373,0,229,true +7374,110,0,114,true +7375,198,0,115,true +7376,64,1,18,true +7377,73,0,103,true +7378,324,0,247,true +7379,257,1,15,true +7380,270,0,115,true +7381,178,0,122,true +7382,241,1,18,true +7383,86,0,86,true +7384,91,0,109,true +7385,168,1,21,true +7386,105,0,98,true +7387,108,1,18,true +7388,89,0,121,true +7389,86,0,109,true +7390,153,0,133,true +7391,100,0,90,true +7392,324,0,109,true +7393,188,0,108,true +7394,92,0,99,true +7395,124,1,18,true +7396,125,0,103,true +7397,84,0,92,true +7398,414,0,273,true +7399,111,0,127,true +7400,472,1,18,true +7401,442,0,262,true +7402,138,1,18,true +7403,143,0,101,true +7404,159,0,100,true +7405,85,0,87,true +7406,194,1,12,true +7407,55,1,12,true +7408,235,0,117,true +7409,140,0,105,true +7410,137,0,107,true +7411,569,0,262,true +7412,231,0,121,true +7413,201,0,101,true +7414,89,0,95,true +7415,116,1,21,true +7416,154,0,107,true +7417,174,0,123,true +7418,256,0,116,true +7419,168,1,24,true +7420,458,0,262,true +7421,184,0,102,true +7422,436,0,231,true +7423,222,0,115,true +7424,62,1,12,true +7425,207,1,18,true +7426,117,1,21,true +7427,276,1,15,true +7428,80,0,85,true +7429,156,0,97,true +7430,146,0,124,true +7431,220,0,107,true +7432,141,1,12,true +7433,222,0,107,true +7434,163,0,90,true +7435,163,0,107,true +7436,317,0,255,true +7437,179,0,113,true +7438,93,1,18,true +7439,359,1,15,true +7440,45790,410,261,true +7441,204,0,123,true +7442,125,0,103,true +7443,129,0,124,true +7444,224,0,111,true +7445,78,0,107,true +7446,156,0,93,true +7447,157,0,123,true +7448,137,0,92,true +7449,211,0,123,true +7450,194,0,107,true +7451,200,0,112,true +7452,434,0,231,true +7453,127,1,18,true +7454,160,0,103,true +7455,254,0,112,true +7456,207,0,91,true +7457,84,0,100,true +7458,596,0,268,true +7459,109,1,24,true +7460,87,1,21,true +7461,86,0,98,true +7462,135,0,103,true +7463,89,0,103,true +7464,341,0,121,true +7465,212,0,140,true +7466,106,0,104,true +7467,117,1,24,true +7468,306,1,15,true +7469,182,1,15,true +7470,86,0,107,true +7471,425,0,236,true +7472,79,0,96,true +7473,77,0,92,true +7474,67,0,97,true +7475,327,0,113,true +7476,166,1,24,true +7477,136,1,18,true +7478,173,0,113,true +7479,102,1,12,true +7480,106,0,111,true +7481,156,1,15,true +7482,185,1,21,true +7483,181,1,12,true +7484,137,0,100,true +7485,230,0,101,true +7486,83,0,98,true +7487,151,0,132,true +7488,163,0,115,true +7489,377,0,233,true +7490,192,0,97,true +7491,149,0,123,true +7492,383,1,18,true +7493,397,0,244,true +7494,98,0,112,true +7495,155,0,107,true +7496,108,1,21,true +7497,223,0,109,true +7498,67,1,18,true +7499,187,0,92,true +7500,193,1,24,true +7501,340,1,21,true +7502,119,0,100,true +7503,113,0,101,true +7504,181,0,86,true +7505,149,0,115,true +7506,217,1,18,true +7507,227,0,124,true +7508,99,0,127,true +7509,67,1,18,true +7510,248,0,126,true +7511,135,0,107,true +7512,117,0,140,true +7513,142,0,113,true +7514,174,1,21,true +7515,71,1,24,true +7516,176,0,121,true +7517,137,1,24,true +7518,245,1,18,true +7519,130,0,104,true +7520,214,0,137,true +7521,286,0,252,true +7522,22060,204,216,true +7523,166,0,124,true +7524,154,1,18,true +7525,130,0,92,true +7526,121,1,24,true +7527,157,0,119,true +7528,94,0,99,true +7529,211,0,126,true +7530,91,0,103,true +7531,165,0,112,true +7532,73,0,99,true +7533,498,1,12,true +7534,99,0,96,true +7535,149,0,116,true +7536,116,0,97,true +7537,170,1,12,true +7538,129,1,24,true +7539,119,0,97,true +7540,156,0,117,true +7541,127,1,21,true +7542,217,1,18,true +7543,231,1,15,true +7544,237,1,12,true +7545,102,0,111,true +7546,113,0,93,true +7547,108,1,15,true +7548,712,46,415,true +7549,79,0,101,true +7550,79,0,97,true +7551,378,0,261,true +7552,6114,39,5001,true +7553,144,0,117,true +7554,117,1,24,true +7555,156,0,108,true +7556,352,0,257,true +7557,61,1,12,true +7558,111,0,114,true +7559,149,1,18,true +7560,127,1,21,true +7561,90,0,100,true +7562,116,1,18,true +7563,163,1,12,true +7564,341,1,15,true +7565,87,0,105,true +7566,151,0,99,true +7567,169,0,97,true +7568,250,1,15,true +7569,1104,40,412,true +7570,94,0,100,true +7571,189,0,114,true +7572,125,1,21,true +7573,116,0,120,true +7574,93,0,97,true +7575,189,0,112,true +7576,176,0,105,true +7577,128,1,18,true +7578,138,0,129,true +7579,81,1,24,true +7580,263,0,119,true +7581,146,0,78,true +7582,207,0,110,true +7583,471,0,254,true +7584,138,0,107,true +7585,241,0,125,true +7586,474,0,256,true +7587,109,0,103,true +7588,197,0,115,true +7589,2347,56,1924,true +7590,201,1,24,true +7591,108,1,9,true +7592,65,0,78,true +7593,143,1,9,true +7594,192,0,115,true +7595,203,1,12,true +7596,279,1,12,true +7597,96,0,99,true +7598,208,0,92,true +7599,67,0,92,true +7600,333,0,126,true +7601,74,0,96,true +7602,75,0,108,true +7603,102,0,126,true +7604,265,1,15,true +7605,268,0,121,true +7606,401,0,252,true +7607,122,0,126,true +7608,299,0,108,true +7609,168,0,99,true +7610,106,0,97,true +7611,86,0,109,true +7612,187,0,92,true +7613,391,1,15,true +7614,104,0,109,true +7615,156,1,12,true +7616,77,0,104,true +7617,112,1,18,true +7618,200,0,115,true +7619,129,0,112,true +7620,159,0,122,true +7621,157,0,90,true +7622,264,1,18,true +7623,153,0,106,true +7624,3747,97,2978,true +7625,118,1,12,true +7626,61,0,80,true +7627,137,1,18,true +7628,111,1,24,true +7629,300,0,254,true +7630,122,1,18,true +7631,155,0,94,true +7632,132,1,18,true +7633,165,0,115,true +7634,127,1,18,true +7635,368,0,252,true +7636,96,0,125,true +7637,90,0,92,true +7638,143,0,105,true +7639,318,0,106,true +7640,220,0,115,true +7641,207,1,18,true +7642,180,1,18,true +7643,14599,107,66,true +7644,179,0,109,true +7645,99,0,111,true +7646,157,0,88,true +7647,108,0,117,true +7648,131,0,101,true +7649,144,0,107,true +7650,142,1,21,true +7651,227,0,124,true +7652,218,0,103,true +7653,87,0,104,true +7654,131,1,18,true +7655,140,0,108,true +7656,106,0,101,true +7657,315,1,18,true +7658,116,0,104,true +7659,137,0,109,true +7660,89,0,88,true +7661,206,1,18,true +7662,210,0,103,true +7663,283,1,18,true +7664,87,0,94,true +7665,116,0,97,true +7666,341,0,254,true +7667,119,0,104,true +7668,134,1,21,true +7669,116,0,104,true +7670,311,0,263,true +7671,70,1,12,true +7672,163,0,121,true +7673,143,0,115,true +7674,191,0,135,true +7675,131,1,18,true +7676,566,0,245,true +7677,216,0,104,true +7678,180,1,24,true +7679,173,1,15,true +7680,434,1,15,true +7681,141,0,108,true +7682,131,0,95,true +7683,156,0,95,true +7684,74,0,100,true +7685,232,0,106,true +7686,140,0,96,true +7687,160,0,122,true +7688,132,0,104,true +7689,204,0,97,true +7690,115,1,21,true +7691,116,1,21,true +7692,241,0,95,true +7693,170,0,104,true +7694,420,0,259,true +7695,317,0,251,true +7696,73,1,24,true +7697,144,0,113,true +7698,143,0,104,true +7699,274,0,116,true +7700,174,0,93,true +7701,178,0,106,true +7702,194,0,113,true +7703,203,1,18,true +7704,212,0,109,true +7705,80,0,94,true +7706,113,1,15,true +7707,360,0,105,true +7708,144,0,104,true +7709,370,0,231,true +7710,70,1,12,true +7711,169,0,93,true +7712,99,0,105,true +7713,140,1,18,true +7714,105,1,18,true +7715,142,0,140,true +7716,153,0,115,true +7717,111,1,21,true +7718,100,1,18,true +7719,167,0,133,true +7720,203,0,127,true +7721,238,1,15,true +7722,245,0,127,true +7723,305,0,111,true +7724,109,1,18,true +7725,81,0,102,true +7726,135,1,24,true +7727,161,0,103,true +7728,295,0,127,true +7729,140,0,98,true +7730,144,0,99,true +7731,345,0,246,true +7732,161,0,112,true +7733,167,0,122,true +7734,191,0,102,true +7735,90,0,98,true +7736,178,0,124,true +7737,382,0,228,true +7738,123,0,95,true +7739,286,0,252,true +7740,227,1,18,true +7741,98,0,116,true +7742,100,0,108,true +7743,111,0,127,true +7744,146,0,120,true +7745,136,0,109,true +7746,119,0,106,true +7747,86,0,113,true +7748,117,0,80,true +7749,121,0,101,true +7750,192,0,87,true +7751,92,0,101,true +7752,132,0,105,true +7753,203,0,127,true +7754,143,0,121,true +7755,113,1,18,true +7756,72,1,12,true +7757,137,0,102,true +7758,130,1,18,true +7759,159,0,102,true +7760,122,0,104,true +7761,320,0,264,true +7762,470,0,249,true +7763,271,0,115,true +7764,165,0,112,true +7765,93,0,109,true +7766,125,1,24,true +7767,146,0,122,true +7768,149,0,103,true +7769,110,1,15,true +7770,197,1,18,true +7771,166,0,118,true +7772,142,1,18,true +7773,248,0,113,true +7774,138,1,24,true +7775,227,1,18,true +7776,99,1,21,true +7777,111,1,24,true +7778,394,0,262,true +7779,78,0,106,true +7780,151,0,99,true +7781,233,1,24,true +7782,387,1,18,true +7783,404,0,246,true +7784,98,0,88,true +7785,187,0,123,true +7786,96,0,102,true +7787,97,0,124,true +7788,136,1,18,true +7789,250,0,121,true +7790,123,0,103,true +7791,212,0,122,true +7792,244,0,121,true +7793,180,0,127,true +7794,229,0,103,true +7795,365,0,246,true +7796,191,0,84,true +7797,238,0,120,true +7798,109,0,107,true +7799,230,0,105,true +7800,109,0,97,true +7801,245,0,111,true +7802,186,0,127,true +7803,144,0,138,true +7804,93,0,110,true +7805,125,0,95,true +7806,72,0,97,true +7807,249,0,90,true +7808,173,1,24,true +7809,410,0,267,true +7810,97,0,123,true +7811,174,0,109,true +7812,93,0,100,true +7813,151,1,12,true +7814,191,0,116,true +7815,620,0,254,true +7816,148,1,21,true +7817,104,0,99,true +7818,118,1,18,true +7819,243,0,112,true +7820,116,0,76,true +7821,77,0,106,true +7822,210,1,21,true +7823,144,0,121,true +7824,121,0,109,true +7825,216,0,104,true +7826,210,0,109,true +7827,110,1,18,true +7828,205,0,108,true +7829,141,0,112,true +7830,65,0,85,true +7831,153,0,133,true +7832,455,0,249,true +7833,156,0,98,true +7834,197,1,18,true +7835,154,1,9,true +7836,161,0,100,true +7837,85,0,110,true +7838,335,1,15,true +7839,19027,145,81,true +7840,194,1,24,true +7841,174,1,18,true +7842,134,0,86,true +7843,204,0,116,true +7844,160,0,87,true +7845,195,0,97,true +7846,279,0,115,true +7847,227,0,112,true +7848,225,1,18,true +7849,495,0,231,true +7850,179,1,21,true +7851,173,0,127,true +7852,99,0,94,true +7853,123,0,123,true +7854,193,1,12,true +7855,140,0,85,true +7856,556,0,267,true +7857,239,0,117,true +7858,180,0,103,true +7859,99,1,12,true +7860,59,1,18,true +7861,295,1,15,true +7862,203,0,122,true +7863,467,0,264,true +7864,313,0,255,true +7865,192,0,132,true +7866,125,0,107,true +7867,115,1,18,true +7868,92,0,101,true +7869,113,0,118,true +7870,132,0,104,true +7871,123,1,24,true +7872,73,0,92,true +7873,341,1,15,true +7874,162,1,24,true +7875,185,0,105,true +7876,151,0,122,true +7877,178,0,126,true +7878,178,0,106,true +7879,211,1,18,true +7880,91,1,21,true +7881,60,1,12,true +7882,136,1,18,true +7883,109,1,18,true +7884,160,1,12,true +7885,346,0,240,true +7886,160,0,110,true +7887,255,1,21,true +7888,149,0,130,true +7889,138,1,18,true +7890,112,1,9,true +7891,128,0,107,true +7892,345,0,276,true +7893,149,0,123,true +7894,115,1,21,true +7895,142,0,104,true +7896,175,0,119,true +7897,100,1,9,true +7898,160,0,120,true +7899,132,0,125,true +7900,161,0,94,true +7901,78,1,12,true +7902,122,0,94,true +7903,186,0,125,true +7904,227,1,15,true +7905,89,0,112,true +7906,143,0,91,true +7907,210,0,117,true +7908,198,0,138,true +7909,160,0,112,true +7910,267,1,15,true +7911,176,1,15,true +7912,141,0,115,true +7913,315,0,110,true +7914,162,0,110,true +7915,325,0,140,true +7916,449,0,237,true +7917,377,0,262,true +7918,94,0,104,true +7919,245,0,119,true +7920,138,0,116,true +7921,115,0,107,true +7922,140,0,122,true +7923,108,0,127,true +7924,163,0,110,true +7925,85,0,95,true +7926,111,1,18,true +7927,149,0,119,true +7928,143,0,116,true +7929,137,0,119,true +7930,68,0,92,true +7931,100,0,99,true +7932,143,1,15,true +7933,113,0,116,true +7934,108,1,15,true +7935,116,1,21,true +7936,245,1,15,true +7937,132,0,111,true +7938,179,0,89,true +7939,296,0,255,true +7940,100,0,113,true +7941,212,1,18,true +7942,168,0,116,true +7943,149,0,115,true +7944,141,0,111,true +7945,206,0,114,true +7946,328,0,107,true +7947,85,0,98,true +7948,135,0,116,true +7949,115,0,126,true +7950,250,1,15,true +7951,136,0,107,true +7952,146,0,105,true +7953,112,0,112,true +7954,129,0,108,true +7955,210,1,18,true +7956,270,0,229,true +7957,162,0,113,true +7958,149,1,24,true +7959,159,0,114,true +7960,98,0,109,true +7961,179,0,109,true +7962,201,0,110,true +7963,135,0,108,true +7964,211,0,103,true +7965,110,0,99,true +7966,341,0,263,true +7967,176,0,119,true +7968,250,1,21,true +7969,155,0,101,true +7970,162,0,106,true +7971,206,0,92,true +7972,337,0,270,true +7973,290,0,257,true +7974,136,0,108,true +7975,74,0,109,true +7976,300,0,141,true +7977,229,1,21,true +7978,58,1,21,true +7979,129,1,21,true +7980,127,0,92,true +7981,206,1,18,true +7982,85,0,101,true +7983,104,1,21,true +7984,175,0,126,true +7985,118,1,21,true +7986,148,0,127,true +7987,1072,57,891,true +7988,96,1,24,true +7989,150,0,110,true +7990,206,0,114,true +7991,70,0,98,true +7992,100,0,101,true +7993,216,1,21,true +7994,154,0,108,true +7995,86,0,101,true +7996,140,0,110,true +7997,143,1,24,true +7998,243,0,95,true +7999,161,0,109,true +8000,96,1,9,true +8001,3547,81,2266,true +8002,127,0,112,true +8003,121,1,18,true +8004,134,1,18,true +8005,353,0,125,true +8006,349,0,122,true +8007,335,0,248,true +8008,97,0,111,true +8009,154,0,88,true +8010,94,0,107,true +8011,135,0,100,true +8012,147,0,116,true +8013,146,0,92,true +8014,74,0,92,true +8015,180,1,18,true +8016,187,0,97,true +8017,263,1,15,true +8018,688,0,231,true +8019,94,1,12,true +8020,121,0,105,true +8021,236,0,110,true +8022,142,0,90,true +8023,254,0,104,true +8024,194,0,92,true +8025,201,0,108,true +8026,153,0,100,true +8027,73,0,80,true +8028,320,0,109,true +8029,415,0,248,true +8030,153,0,130,true +8031,127,1,18,true +8032,117,0,92,true +8033,160,0,109,true +8034,466,1,15,true +8035,222,0,120,true +8036,155,0,107,true +8037,312,0,250,true +8038,102,0,101,true +8039,165,0,122,true +8040,119,0,97,true +8041,128,0,91,true +8042,91,0,106,true +8043,93,1,24,true +8044,93,0,99,true +8045,343,1,15,true +8046,97,1,9,true +8047,303,0,252,true +8048,226,0,113,true +8049,229,0,86,true +8050,229,1,15,true +8051,141,0,119,true +8052,180,0,91,true +8053,161,0,122,true +8054,132,0,102,true +8055,218,1,18,true +8056,74,1,21,true +8057,213,0,128,true +8058,149,1,24,true +8059,112,0,108,true +8060,344,0,127,true +8061,160,0,125,true +8062,87,0,92,true +8063,140,0,104,true +8064,156,0,116,true +8065,124,0,121,true +8066,112,0,110,true +8067,205,0,103,true +8068,149,0,114,true +8069,220,0,105,true +8070,146,0,122,true +8071,116,0,103,true +8072,269,1,24,true +8073,169,0,118,true +8074,420,0,139,true +8075,199,0,129,true +8076,137,0,94,true +8077,128,0,98,true +8078,129,1,18,true +8079,153,0,118,true +8080,106,0,101,true +8081,151,0,106,true +8082,115,0,91,true +8083,135,0,122,true +8084,185,1,12,true +8085,149,0,122,true +8086,142,0,108,true +8087,191,0,118,true +8088,441,0,242,true +8089,156,0,116,true +8090,105,0,98,true +8091,87,0,98,true +8092,146,0,122,true +8093,206,0,115,true +8094,141,0,123,true +8095,109,0,99,true +8096,129,0,121,true +8097,321,0,265,true +8098,311,0,238,true +8099,185,1,18,true +8100,210,0,112,true +8101,112,0,104,true +8102,90,1,18,true +8103,179,0,111,true +8104,89,0,100,true +8105,279,1,15,true +8106,214,0,137,true +8107,140,0,94,true +8108,123,0,110,true +8109,210,0,101,true +8110,169,0,108,true +8111,78,0,101,true +8112,406,0,255,true +8113,134,0,94,true +8114,212,1,24,true +8115,146,0,125,true +8116,136,1,15,true +8117,181,1,18,true +8118,157,0,140,true +8119,282,0,245,true +8120,64,1,24,true +8121,154,1,24,true +8122,256,0,107,true +8123,205,1,18,true +8124,73,0,90,true +8125,144,0,123,true +8126,81,1,24,true +8127,98,0,88,true +8128,116,1,18,true +8129,130,1,21,true +8130,127,0,90,true +8131,113,0,132,true +8132,159,0,121,true +8133,175,0,121,true +8134,123,1,18,true +8135,142,0,114,true +8136,132,0,109,true +8137,315,0,255,true +8138,147,0,96,true +8139,71,0,92,true +8140,305,0,282,true +8141,119,0,90,true +8142,142,0,119,true +8143,72,0,105,true +8144,118,0,100,true +8145,155,0,120,true +8146,307,0,257,true +8147,160,0,101,true +8148,149,0,123,true +8149,142,0,115,true +8150,200,0,97,true +8151,182,0,93,true +8152,224,0,111,true +8153,148,1,24,true +8154,121,0,125,true +8155,78,0,95,true +8156,344,0,119,true +8157,130,1,18,true +8158,125,0,108,true +8159,200,1,18,true +8160,429,0,254,true +8161,205,0,103,true +8162,173,0,113,true +8163,154,0,92,true +8164,73,0,87,true +8165,178,0,104,true +8166,106,0,81,true +8167,99,0,116,true +8168,236,1,21,true +8169,65,1,24,true +8170,201,1,18,true +8171,318,0,263,true +8172,100,1,12,true +8173,94,0,113,true +8174,214,1,24,true +8175,84,0,78,true +8176,163,0,116,true +8177,156,0,127,true +8178,116,1,18,true +8179,222,0,115,true +8180,142,0,103,true +8181,203,0,124,true +8182,142,0,86,true +8183,180,1,15,true +8184,86,1,21,true +8185,148,0,122,true +8186,173,0,101,true +8187,130,0,105,true +8188,117,0,109,true +8189,143,0,115,true +8190,300,0,248,true +8191,148,1,21,true +8192,167,0,115,true +8193,138,1,18,true +8194,290,0,128,true +8195,184,1,18,true +8196,229,0,121,true +8197,137,0,113,true +8198,138,0,106,true +8199,125,1,24,true +8200,282,1,12,true +8201,67,1,21,true +8202,296,0,245,true +8203,110,0,99,true +8204,249,0,111,true +8205,397,0,253,true +8206,103,1,9,true +8207,249,1,15,true +8208,258,0,112,true +8209,200,0,110,true +8210,160,0,88,true +8211,131,1,12,true +8212,85,0,109,true +8213,121,0,117,true +8214,146,0,126,true +8215,142,0,107,true +8216,1642,54,713,true +8217,349,1,15,true +8218,130,0,100,true +8219,64,0,87,true +8220,124,0,120,true +8221,97,0,98,true +8222,128,1,12,true +8223,138,0,107,true +8224,110,0,106,true +8225,144,0,113,true +8226,106,1,21,true +8227,170,0,109,true +8228,5673,77,5001,true +8229,56,1,18,true +8230,354,1,18,true +8231,147,0,110,true +8232,143,0,124,true +8233,476,0,257,true +8234,225,1,18,true +8235,59,1,21,true +8236,150,0,112,true +8237,256,0,121,true +8238,153,0,112,true +8239,87,1,21,true +8240,306,0,267,true +8241,73,0,89,true +8242,522,0,255,true +8243,146,0,117,true +8244,176,1,24,true +8245,159,1,24,true +8246,153,0,125,true +8247,115,1,18,true +8248,112,1,15,true +8249,117,1,21,true +8250,204,0,106,true +8251,85,0,109,true +8252,217,0,111,true +8253,454,0,255,true +8254,179,0,87,true +8255,79,0,88,true +8256,137,1,18,true +8257,187,0,77,true +8258,141,0,103,true +8259,238,0,115,true +8260,150,0,105,true +8261,80,1,18,true +8262,138,1,18,true +8263,125,0,90,true +8264,129,0,122,true +8265,157,0,122,true +8266,106,0,133,true +8267,117,1,21,true +8268,163,0,114,true +8269,150,1,12,true +8270,360,0,255,true +8271,96,0,111,true +8272,15191,127,78,true +8273,137,0,95,true +8274,138,1,21,true +8275,156,0,124,true +8276,138,0,92,true +8277,241,0,113,true +8278,178,1,24,true +8279,220,0,107,true +8280,372,1,15,true +8281,395,1,15,true +8282,262,0,114,true +8283,161,1,12,true +8284,275,0,117,true +8285,352,0,261,true +8286,423,0,248,true +8287,86,1,24,true +8288,135,1,21,true +8289,138,0,93,true +8290,293,0,264,true +8291,108,1,18,true +8292,568,0,260,true +8293,227,0,123,true +8294,90,0,108,true +8295,167,0,120,true +8296,99,0,97,true +8297,212,1,15,true +8298,87,0,85,true +8299,144,0,115,true +8300,110,1,21,true +8301,167,1,18,true +8302,225,1,21,true +8303,110,0,91,true +8304,205,0,126,true +8305,162,0,114,true +8306,85,0,94,true +8307,150,1,21,true +8308,162,0,112,true +8309,125,0,89,true +8310,73,0,105,true +8311,263,1,18,true +8312,73,1,24,true +8313,137,0,112,true +8314,167,0,104,true +8315,83,1,9,true +8316,104,0,113,true +8317,80,0,97,true +8318,153,0,110,true +8319,423,0,264,true +8320,72,0,93,true +8321,212,0,98,true +8322,174,0,101,true +8323,197,0,110,true +8324,3076,83,1929,true +8325,121,0,111,true +8326,121,1,24,true +8327,147,0,106,true +8328,156,0,119,true +8329,142,0,92,true +8330,217,1,21,true +8331,151,0,129,true +8332,337,0,278,true +8333,124,0,123,true +8334,242,0,117,true +8335,143,0,115,true +8336,155,0,121,true +8337,388,0,272,true +8338,173,0,112,true +8339,74,0,99,true +8340,290,0,251,true +8341,286,0,243,true +8342,102,0,121,true +8343,173,0,110,true +8344,115,0,112,true +8345,134,1,18,true +8346,193,0,101,true +8347,115,1,24,true +8348,137,0,98,true +8349,129,0,92,true +8350,515,1,15,true +8351,213,0,114,true +8352,111,1,18,true +8353,90,0,107,true +8354,270,1,24,true +8355,286,0,126,true +8356,169,1,21,true +8357,109,1,21,true +8358,185,0,108,true +8359,75,0,103,true +8360,206,0,102,true +8361,210,0,112,true +8362,78,0,108,true +8363,241,0,116,true +8364,224,0,126,true +8365,94,0,93,true +8366,90,1,18,true +8367,461,0,278,true +8368,235,0,122,true +8369,194,0,92,true +8370,391,0,240,true +8371,86,0,96,true +8372,155,0,131,true +8373,64,1,18,true +8374,137,0,107,true +8375,142,0,121,true +8376,1890,95,947,true +8377,138,0,108,true +8378,110,0,107,true +8379,647,0,249,true +8380,290,0,241,true +8381,118,0,123,true +8382,138,0,125,true +8383,91,0,100,true +8384,189,0,120,true +8385,118,0,96,true +8386,217,0,92,true +8387,78,0,109,true +8388,287,0,257,true +8389,256,0,109,true +8390,154,1,21,true +8391,185,0,101,true +8392,140,0,85,true +8393,123,1,12,true +8394,71,0,90,true +8395,83,1,21,true +8396,639,0,264,true +8397,188,0,111,true +8398,176,0,92,true +8399,218,0,117,true +8400,110,0,97,true +8401,98,1,24,true +8402,175,0,107,true +8403,224,1,18,true +8404,129,0,125,true +8405,138,0,129,true +8406,142,0,113,true +8407,154,0,108,true +8408,160,0,105,true +8409,75,1,15,true +8410,168,0,111,true +8411,364,0,235,true +8412,200,0,128,true +8413,106,1,18,true +8414,121,0,140,true +8415,394,0,232,true +8416,185,0,110,true +8417,132,0,104,true +8418,90,0,95,true +8419,110,0,94,true +8420,201,0,115,true +8421,254,0,127,true +8422,142,0,100,true +8423,110,1,24,true +8424,312,0,247,true +8425,180,1,24,true +8426,217,1,18,true +8427,119,1,18,true +8428,104,1,9,true +8429,132,0,97,true +8430,235,1,15,true +8431,84,0,103,true +8432,186,0,107,true +8433,122,1,24,true +8434,119,1,18,true +8435,154,0,113,true +8436,286,0,253,true +8437,166,0,118,true +8438,168,0,133,true +8439,208,0,116,true +8440,151,0,106,true +8441,60,1,21,true +8442,140,0,130,true +8443,91,0,102,true +8444,220,1,24,true +8445,93,0,96,true +8446,125,1,21,true +8447,184,0,93,true +8448,132,1,18,true +8449,149,0,123,true +8450,199,1,18,true +8451,154,0,127,true +8452,207,1,21,true +8453,338,0,234,true +8454,87,0,102,true +8455,350,0,263,true +8456,135,0,96,true +8457,406,0,258,true +8458,192,1,18,true +8459,110,0,91,true +8460,229,1,15,true +8461,94,0,114,true +8462,147,0,117,true +8463,140,0,113,true +8464,70,0,90,true +8465,295,0,254,true +8466,159,0,123,true +8467,264,0,113,true +8468,134,0,95,true +8469,654,0,255,true +8470,165,0,101,true +8471,146,0,114,true +8472,204,0,117,true +8473,129,1,12,true +8474,143,0,107,true +8475,252,0,112,true +8476,178,0,97,true +8477,117,0,125,true +8478,81,0,92,true +8479,150,0,115,true +8480,223,0,97,true +8481,186,0,94,true +8482,123,0,104,true +8483,125,0,121,true +8484,123,0,104,true +8485,121,0,97,true +8486,135,0,135,true +8487,117,1,15,true +8488,121,1,18,true +8489,124,0,104,true +8490,104,0,91,true +8491,115,1,18,true +8492,249,0,101,true +8493,147,0,109,true +8494,100,0,97,true +8495,148,1,18,true +8496,138,0,106,true +8497,363,0,256,true +8498,320,0,109,true +8499,117,1,21,true +8500,105,1,18,true +8501,94,0,92,true +8502,224,1,15,true +8503,137,0,104,true +8504,161,0,121,true +8505,185,0,107,true +8506,597,0,264,true +8507,188,0,90,true +8508,185,0,107,true +8509,167,1,24,true +8510,80,0,95,true +8511,47,1,21,true +8512,162,0,102,true +8513,306,0,264,true +8514,579,0,264,true +8515,352,1,15,true +8516,244,1,12,true +8517,197,0,79,true +8518,182,1,18,true +8519,150,0,127,true +8520,121,1,18,true +8521,199,0,86,true +8522,189,1,18,true +8523,195,0,108,true +8524,103,0,124,true +8525,349,0,272,true +8526,58,1,21,true +8527,243,0,101,true +8528,225,0,124,true +8529,146,0,114,true +8530,671,0,264,true +8531,210,0,124,true +8532,138,0,110,true +8533,87,1,24,true +8534,176,0,109,true +8535,65,0,87,true +8536,128,1,15,true +8537,201,0,113,true +8538,146,0,101,true +8539,110,0,98,true +8540,144,0,96,true +8541,172,1,18,true +8542,199,1,21,true +8543,155,0,127,true +8544,128,0,128,true +8545,166,0,140,true +8546,187,0,115,true +8547,280,0,104,true +8548,153,0,110,true +8549,216,1,15,true +8550,227,1,21,true +8551,112,0,110,true +8552,124,0,118,true +8553,108,0,140,true +8554,436,0,237,true +8555,290,0,244,true +8556,81,0,104,true +8557,124,0,86,true +8558,52,1,21,true +8559,143,0,119,true +8560,282,0,258,true +8561,170,1,21,true +8562,86,1,21,true +8563,170,0,110,true +8564,138,1,18,true +8565,110,1,18,true +8566,111,0,115,true +8567,123,1,9,true +8568,142,1,18,true +8569,225,1,12,true +8570,73,0,90,true +8571,125,0,106,true +8572,204,0,110,true +8573,125,1,18,true +8574,124,0,119,true +8575,146,0,93,true +8576,140,0,126,true +8577,396,0,245,true +8578,2115,115,1488,true +8579,134,0,102,true +8580,219,0,121,true +8581,146,0,122,true +8582,288,0,252,true +8583,109,1,18,true +8584,358,0,263,true +8585,131,0,104,true +8586,127,1,21,true +8587,147,1,12,true +8588,103,0,106,true +8589,124,0,111,true +8590,86,0,86,true +8591,260,1,15,true +8592,105,0,113,true +8593,150,0,127,true +8594,136,0,115,true +8595,483,0,262,true +8596,116,0,124,true +8597,132,1,18,true +8598,167,1,21,true +8599,155,0,112,true +8600,160,0,112,true +8601,80,0,113,true +8602,198,1,18,true +8603,201,0,103,true +8604,89,0,107,true +8605,112,1,18,true +8606,294,0,120,true +8607,151,0,104,true +8608,86,0,93,true +8609,169,0,89,true +8610,123,0,100,true +8611,178,0,110,true +8612,429,0,258,true +8613,203,0,120,true +8614,173,1,24,true +8615,134,1,18,true +8616,211,0,97,true +8617,334,0,122,true +8618,110,1,18,true +8619,225,0,105,true +8620,143,1,15,true +8621,441,0,250,true +8622,86,1,12,true +8623,191,0,109,true +8624,690,0,269,true +8625,132,1,24,true +8626,162,0,127,true +8627,148,0,97,true +8628,296,0,118,true +8629,141,0,103,true +8630,170,0,92,true +8631,127,0,92,true +8632,573,0,250,true +8633,206,0,112,true +8634,118,0,111,true +8635,263,0,81,true +8636,170,0,90,true +8637,294,0,124,true +8638,137,0,90,true +8639,134,0,92,true +8640,137,0,94,true +8641,118,1,18,true +8642,402,0,234,true +8643,320,0,243,true +8644,90,0,101,true +8645,217,0,108,true +8646,117,0,119,true +8647,93,0,92,true +8648,223,0,113,true +8649,134,0,100,true +8650,336,1,12,true +8651,185,1,24,true +8652,64,0,88,true +8653,131,1,18,true +8654,118,1,9,true +8655,269,0,80,true +8656,168,0,91,true +8657,181,0,107,true +8658,295,0,113,true +8659,248,0,113,true +8660,6014,81,5001,true +8661,52,1,18,true +8662,122,0,140,true +8663,87,1,18,true +8664,238,0,125,true +8665,75,0,109,true +8666,111,0,90,true +8667,442,0,241,true +8668,336,0,266,true +8669,72,1,24,true +8670,121,1,21,true +8671,131,0,88,true +8672,407,0,251,true +8673,154,0,130,true +8674,128,1,12,true +8675,214,0,137,true +8676,236,0,108,true +8677,182,1,24,true +8678,511,0,241,true +8679,172,0,90,true +8680,141,0,115,true +8681,60,0,81,true +8682,99,0,97,true +8683,207,0,120,true +8684,231,0,103,true +8685,109,1,15,true +8686,384,0,270,true +8687,106,1,12,true +8688,135,0,130,true +8689,262,1,12,true +8690,151,1,18,true +8691,124,0,93,true +8692,90,0,101,true +8693,100,1,24,true +8694,302,0,93,true +8695,325,0,260,true +8696,149,0,113,true +8697,182,0,113,true +8698,267,0,129,true +8699,136,0,107,true +8700,189,1,24,true +8701,162,0,107,true +8702,132,0,125,true +8703,445,1,12,true +8704,226,0,123,true +8705,256,0,116,true +8706,150,0,109,true +8707,219,0,115,true +8708,87,0,108,true +8709,118,1,21,true +8710,197,0,114,true +8711,180,0,99,true +8712,243,0,102,true +8713,252,0,107,true +8714,103,0,93,true +8715,102,0,105,true +8716,422,0,255,true +8717,141,0,92,true +8718,254,0,123,true +8719,512,0,267,true +8720,356,0,131,true +8721,236,0,112,true +8722,162,0,108,true +8723,167,0,115,true +8724,245,0,115,true +8725,229,0,121,true +8726,230,0,119,true +8727,80,0,107,true +8728,216,0,123,true +8729,141,0,134,true +8730,160,0,114,true +8731,103,0,113,true +8732,90,0,97,true +8733,378,0,118,true +8734,129,0,92,true +8735,75,0,93,true +8736,213,0,112,true +8737,119,0,112,true +8738,85,0,96,true +8739,99,1,21,true +8740,122,1,18,true +8741,148,0,140,true +8742,223,1,12,true +8743,205,0,105,true +8744,112,1,18,true +8745,169,0,123,true +8746,129,1,15,true +8747,144,0,126,true +8748,156,0,100,true +8749,109,0,109,true +8750,382,1,12,true +8751,141,0,110,true +8752,163,0,105,true +8753,169,1,9,true +8754,136,1,24,true +8755,134,1,18,true +8756,451,0,248,true +8757,116,1,18,true +8758,161,0,106,true +8759,206,0,126,true +8760,771,0,269,true +8761,175,0,113,true +8762,330,0,252,true +8763,151,0,97,true +8764,59,0,78,true +8765,170,0,131,true +8766,92,0,92,true +8767,155,0,115,true +8768,184,0,126,true +8769,142,0,108,true +8770,119,0,94,true +8771,72,0,100,true +8772,222,1,15,true +8773,74,0,88,true +8774,111,1,15,true +8775,248,0,105,true +8776,301,0,263,true +8777,100,0,113,true +8778,147,0,92,true +8779,147,1,18,true +8780,201,0,127,true +8781,163,0,124,true +8782,161,0,140,true +8783,312,0,266,true +8784,127,0,102,true +8785,474,0,252,true +8786,138,1,21,true +8787,372,1,15,true +8788,210,0,118,true +8789,112,0,104,true +8790,307,0,113,true +8791,127,0,101,true +8792,103,0,110,true +8793,86,1,24,true +8794,136,0,108,true +8795,81,0,105,true +8796,271,0,127,true +8797,4306,125,3305,true +8798,438,0,231,true +8799,117,0,114,true +8800,96,0,107,true +8801,235,0,115,true +8802,325,0,281,true +8803,103,0,104,true +8804,119,0,129,true +8805,94,0,92,true +8806,303,0,247,true +8807,134,0,120,true +8808,124,0,90,true +8809,237,1,15,true +8810,124,0,109,true +8811,173,0,110,true +8812,79,0,91,true +8813,148,0,124,true +8814,74,1,21,true +8815,125,1,18,true +8816,170,0,101,true +8817,299,0,247,true +8818,87,0,108,true +8819,123,1,18,true +8820,222,0,122,true +8821,109,1,18,true +8822,218,1,12,true +8823,125,1,21,true +8824,185,0,103,true +8825,125,0,115,true +8826,121,1,18,true +8827,110,0,119,true +8828,110,0,140,true +8829,181,0,126,true +8830,123,0,113,true +8831,128,1,21,true +8832,147,0,122,true +8833,237,0,101,true +8834,185,0,104,true +8835,195,1,18,true +8836,113,0,127,true +8837,75,0,92,true +8838,137,0,123,true +8839,160,0,109,true +8840,179,0,128,true +8841,117,1,21,true +8842,122,0,99,true +8843,205,0,102,true +8844,129,0,91,true +8845,72,0,97,true +8846,368,0,268,true +8847,94,1,12,true +8848,121,0,131,true +8849,292,0,261,true +8850,67,0,90,true +8851,148,0,115,true +8852,314,0,235,true +8853,524,1,18,true +8854,219,0,113,true +8855,134,0,115,true +8856,339,0,114,true +8857,113,1,15,true +8858,173,0,92,true +8859,162,0,108,true +8860,134,0,97,true +8861,303,0,265,true +8862,113,1,18,true +8863,241,0,113,true +8864,132,1,24,true +8865,125,0,119,true +8866,169,0,123,true +8867,121,1,12,true +8868,141,0,115,true +8869,109,1,18,true +8870,687,0,258,true +8871,117,1,18,true +8872,109,0,93,true +8873,182,0,115,true +8874,159,1,24,true +8875,64,0,80,true +8876,115,0,89,true +8877,441,0,260,true +8878,189,1,24,true +8879,294,0,251,true +8880,53,1,21,true +8881,142,0,111,true +8882,153,0,109,true +8883,226,0,103,true +8884,89,0,107,true +8885,224,1,18,true +8886,109,0,106,true +8887,98,0,105,true +8888,137,0,108,true +8889,65,0,89,true +8890,199,1,24,true +8891,92,0,112,true +8892,146,0,118,true +8893,147,0,116,true +8894,146,0,111,true +8895,226,1,15,true +8896,198,0,100,true +8897,173,0,96,true +8898,116,0,99,true +8899,140,0,113,true +8900,189,1,18,true +8901,286,0,244,true +8902,100,0,124,true +8903,118,1,21,true +8904,117,0,108,true +8905,112,0,110,true +8906,150,0,107,true +8907,1183,44,493,true +8908,103,1,21,true +8909,206,0,104,true +8910,130,1,21,true +8911,326,0,231,true +8912,136,0,107,true +8913,128,0,140,true +8914,134,0,106,true +8915,231,0,103,true +8916,72,0,87,true +8917,219,1,18,true +8918,333,1,15,true +8919,223,0,112,true +8920,85,0,98,true +8921,140,1,24,true +8922,103,1,18,true +8923,159,0,127,true +8924,116,0,133,true +8925,217,0,113,true +8926,230,0,116,true +8927,343,1,15,true +8928,230,0,90,true +8929,218,1,21,true +8930,108,0,99,true +8931,159,1,24,true +8932,136,0,111,true +8933,197,0,114,true +8934,212,0,98,true +8935,92,0,98,true +8936,118,0,125,true +8937,89,0,112,true +8938,325,0,253,true +8939,168,0,123,true +8940,289,0,251,true +8941,205,0,119,true +8942,402,0,229,true +8943,218,0,106,true +8944,104,0,108,true +8945,134,0,97,true +8946,77,0,105,true +8947,130,0,97,true +8948,229,0,111,true +8949,112,0,92,true +8950,131,0,114,true +8951,223,1,18,true +8952,178,0,126,true +8953,166,0,108,true +8954,287,0,245,true +8955,65,1,24,true +8956,154,0,108,true +8957,156,0,116,true +8958,143,0,124,true +8959,110,0,115,true +8960,238,0,121,true +8961,162,0,113,true +8962,127,0,92,true +8963,111,1,12,true +8964,73,0,97,true +8965,116,1,18,true +8966,117,0,106,true +8967,3287,97,1878,true +8968,217,0,103,true +8969,159,0,111,true +8970,187,0,111,true +8971,255,1,21,true +8972,194,0,120,true +8973,281,0,106,true +8974,257,0,100,true +8975,227,0,129,true +8976,191,1,18,true +8977,194,0,95,true +8978,199,0,119,true +8979,335,0,105,true +8980,186,0,100,true +8981,136,0,110,true +8982,237,0,93,true +8983,111,1,24,true +8984,170,0,123,true +8985,146,0,104,true +8986,153,0,124,true +8987,179,0,93,true +8988,175,1,18,true +8989,131,0,109,true +8990,124,0,118,true +8991,146,1,18,true +8992,154,0,95,true +8993,207,0,103,true +8994,362,1,15,true +8995,179,1,18,true +8996,317,0,263,true +8997,165,0,109,true +8998,163,0,98,true +8999,330,0,241,true +9000,111,1,18,true +9001,176,0,122,true +9002,263,0,140,true +9003,548,0,265,true +9004,77,0,101,true +9005,243,0,123,true +9006,117,1,18,true +9007,140,1,24,true +9008,93,0,105,true +9009,140,1,24,true +9010,169,1,21,true +9011,174,0,109,true +9012,104,0,98,true +9013,112,1,18,true +9014,179,0,109,true +9015,144,0,123,true +9016,293,0,262,true +9017,229,0,109,true +9018,294,0,255,true +9019,108,0,125,true +9020,75,0,92,true +9021,105,0,106,true +9022,131,1,18,true +9023,255,1,21,true +9024,161,0,118,true +9025,135,0,90,true +9026,650,0,265,true +9027,131,1,12,true +9028,184,1,24,true +9029,116,1,21,true +9030,121,1,21,true +9031,112,0,97,true +9032,193,0,94,true +9033,136,1,18,true +9034,321,0,250,true +9035,178,1,18,true +9036,186,0,103,true +9037,274,0,95,true +9038,184,0,105,true +9039,283,0,127,true +9040,191,1,15,true +9041,306,0,276,true +9042,159,0,89,true +9043,117,1,18,true +9044,292,0,264,true +9045,64,1,24,true +9046,159,0,123,true +9047,125,0,132,true +9048,83,1,24,true +9049,124,1,12,true +9050,73,0,101,true +9051,162,1,24,true +9052,121,0,125,true +9053,106,0,140,true +9054,172,0,112,true +9055,217,0,112,true +9056,103,0,105,true +9057,144,1,24,true +9058,97,0,92,true +9059,363,0,245,true +9060,235,0,113,true +9061,238,0,105,true +9062,204,1,24,true +9063,146,0,108,true +9064,163,0,105,true +9065,269,1,18,true +9066,441,0,231,true +9067,128,0,109,true +9068,90,0,104,true +9069,237,0,91,true +9070,197,0,110,true +9071,206,0,110,true +9072,189,0,114,true +9073,111,1,18,true +9074,325,0,245,true +9075,150,0,119,true +9076,108,0,94,true +9077,203,0,131,true +9078,52,1,21,true +9079,47,1,18,true +9080,72,0,86,true +9081,265,1,15,true +9082,135,0,104,true +9083,213,1,15,true +9084,80,0,104,true +9085,134,0,99,true +9086,147,0,114,true +9087,125,0,116,true +9088,149,0,116,true +9089,89,0,101,true +9090,151,0,117,true +9091,109,1,18,true +9092,136,0,106,true +9093,51,1,21,true +9094,118,1,24,true +9095,195,0,127,true +9096,153,1,15,true +9097,206,0,98,true +9098,345,0,257,true +9099,131,0,109,true +9100,128,0,140,true +9101,269,0,109,true +9102,169,0,95,true +9103,151,0,96,true +9104,300,0,109,true +9105,255,0,109,true +9106,296,0,253,true +9107,84,0,103,true +9108,246,0,98,true +9109,78,0,86,true +9110,287,0,248,true +9111,149,0,124,true +9112,180,1,18,true +9113,134,0,97,true +9114,182,0,100,true +9115,142,0,108,true +9116,130,0,127,true +9117,86,0,95,true +9118,408,0,250,true +9119,167,0,111,true +9120,124,1,24,true +9121,119,0,116,true +9122,147,1,21,true +9123,376,1,15,true +9124,84,0,102,true +9125,156,0,116,true +9126,89,0,94,true +9127,277,0,120,true +9128,195,0,91,true +9129,379,0,255,true +9130,175,1,21,true +9131,354,0,117,true +9132,199,0,110,true +9133,375,1,15,true +9134,146,1,18,true +9135,229,0,113,true +9136,155,0,107,true +9137,181,1,18,true +9138,201,0,93,true +9139,137,0,104,true +9140,352,0,136,true +9141,391,0,245,true +9142,185,0,130,true +9143,254,0,105,true +9144,111,0,98,true +9145,161,0,122,true +9146,260,1,18,true +9147,186,0,110,true +9148,151,0,122,true +9149,94,0,101,true +9150,109,0,93,true +9151,281,0,122,true +9152,182,0,100,true +9153,568,0,264,true +9154,148,1,12,true +9155,127,0,111,true +9156,200,1,24,true +9157,206,0,112,true +9158,84,1,9,true +9159,185,0,111,true +9160,123,1,24,true +9161,162,0,120,true +9162,136,1,18,true +9163,257,1,15,true +9164,55,1,21,true +9165,203,0,103,true +9166,141,0,97,true +9167,141,0,119,true +9168,75,0,101,true +9169,203,0,97,true +9170,213,0,118,true +9171,300,0,232,true +9172,213,0,109,true +9173,122,0,95,true +9174,184,1,24,true +9175,198,1,12,true +9176,172,0,127,true +9177,103,1,24,true +9178,281,1,18,true +9179,173,1,24,true +9180,142,0,95,true +9181,89,1,21,true +9182,340,0,253,true +9183,106,1,21,true +9184,122,1,9,true +9185,146,0,118,true +9186,195,0,103,true +9187,198,1,15,true +9188,309,0,255,true +9189,239,0,113,true +9190,89,0,98,true +9191,2858,63,1932,true +9192,131,0,97,true +9193,65,0,77,true +9194,122,0,100,true +9195,131,0,108,true +9196,74,1,15,true +9197,97,0,106,true +9198,283,1,21,true +9199,118,0,104,true +9200,206,0,113,true +9201,337,0,257,true +9202,85,0,105,true +9203,220,1,18,true +9204,162,0,87,true +9205,208,0,107,true +9206,159,0,92,true +9207,179,0,121,true +9208,113,1,12,true +9209,339,0,258,true +9210,175,1,15,true +9211,248,0,121,true +9212,184,0,95,true +9213,138,0,115,true +9214,249,0,114,true +9215,5066,103,3839,true +9216,119,0,104,true +9217,179,1,18,true +9218,144,0,102,true +9219,210,0,114,true +9220,223,0,101,true +9221,136,0,111,true +9222,131,0,98,true +9223,200,0,112,true +9224,350,0,237,true +9225,167,0,112,true +9226,214,0,107,true +9227,191,0,109,true +9228,93,0,92,true +9229,312,0,263,true +9230,141,1,21,true +9231,147,1,18,true +9232,135,0,114,true +9233,150,0,140,true +9234,193,1,18,true +9235,346,1,15,true +9236,97,0,106,true +9237,208,0,80,true +9238,79,0,104,true +9239,155,0,110,true +9240,105,0,107,true +9241,219,0,107,true +9242,91,0,100,true +9243,156,1,24,true +9244,358,0,252,true +9245,92,0,95,true +9246,146,1,21,true +9247,102,0,99,true +9248,75,0,104,true +9249,68,1,15,true +9250,360,1,15,true +9251,237,0,115,true +9252,184,0,121,true +9253,194,0,123,true +9254,218,0,110,true +9255,124,0,99,true +9256,365,1,15,true +9257,181,0,120,true +9258,146,0,106,true +9259,338,0,242,true +9260,79,0,115,true +9261,176,0,109,true +9262,182,0,125,true +9263,117,1,24,true +9264,108,1,18,true +9265,172,0,93,true +9266,138,0,113,true +9267,159,1,24,true +9268,117,1,21,true +9269,337,0,255,true +9270,91,0,98,true +9271,116,1,12,true +9272,100,1,24,true +9273,170,0,124,true +9274,186,1,18,true +9275,514,0,246,true +9276,288,0,119,true +9277,664,0,245,true +9278,159,1,24,true +9279,170,0,105,true +9280,124,1,18,true +9281,180,1,24,true +9282,230,0,102,true +9283,142,0,90,true +9284,116,0,132,true +9285,243,1,15,true +9286,84,1,24,true +9287,156,0,91,true +9288,74,0,85,true +9289,174,0,101,true +9290,153,0,100,true +9291,141,0,109,true +9292,274,1,21,true +9293,298,0,113,true +9294,250,0,108,true +9295,102,0,94,true +9296,192,1,18,true +9297,214,0,103,true +9298,483,1,12,true +9299,130,0,115,true +9300,78,1,24,true +9301,225,1,15,true +9302,197,0,90,true +9303,105,0,112,true +9304,299,0,263,true +9305,97,0,123,true +9306,204,0,114,true +9307,203,0,99,true +9308,200,0,97,true +9309,265,0,80,true +9310,161,0,90,true +9311,263,1,18,true +9312,224,0,97,true +9313,103,0,109,true +9314,148,1,12,true +9315,111,0,104,true +9316,229,0,113,true +9317,274,0,126,true +9318,258,0,129,true +9319,130,0,101,true +9320,339,1,12,true +9321,162,0,140,true +9322,233,1,15,true +9323,127,1,21,true +9324,154,0,104,true +9325,154,0,91,true +9326,131,1,21,true +9327,149,0,102,true +9328,333,0,119,true +9329,92,1,9,true +9330,125,0,94,true +9331,71,0,93,true +9332,132,0,96,true +9333,127,1,24,true +9334,212,1,18,true +9335,149,0,115,true +9336,205,0,103,true +9337,650,0,245,true +9338,102,1,12,true +9339,201,0,126,true +9340,156,1,18,true +9341,149,1,18,true +9342,89,1,24,true +9343,129,0,101,true +9344,84,0,99,true +9345,179,0,113,true +9346,161,0,108,true +9347,379,1,15,true +9348,112,1,24,true +9349,364,1,15,true +9350,155,1,24,true +9351,439,0,268,true +9352,317,0,119,true +9353,200,1,15,true +9354,91,1,18,true +9355,119,0,111,true +9356,141,0,112,true +9357,343,0,126,true +9358,157,0,108,true +9359,179,0,106,true +9360,90,0,109,true +9361,373,0,248,true +9362,106,0,113,true +9363,219,1,18,true +9364,108,1,21,true +9365,249,1,12,true +9366,137,0,105,true +9367,287,0,239,true +9368,161,0,126,true +9369,161,0,120,true +9370,110,1,18,true +9371,206,0,108,true +9372,184,0,104,true +9373,115,1,18,true +9374,100,0,94,true +9375,199,0,85,true +9376,123,0,112,true +9377,205,1,21,true +9378,257,0,127,true +9379,194,0,100,true +9380,108,0,114,true +9381,192,0,104,true +9382,83,0,104,true +9383,373,0,124,true +9384,115,0,108,true +9385,146,1,24,true +9386,257,0,124,true +9387,210,1,18,true +9388,204,0,114,true +9389,290,0,116,true +9390,167,0,108,true +9391,100,0,114,true +9392,89,1,9,true +9393,105,1,18,true +9394,96,1,18,true +9395,224,0,108,true +9396,108,1,9,true +9397,121,1,12,true +9398,156,0,116,true +9399,89,0,98,true +9400,220,1,21,true +9401,155,0,113,true +9402,187,1,12,true +9403,155,0,98,true +9404,135,0,95,true +9405,70,0,94,true +9406,318,0,255,true +9407,153,0,130,true +9408,436,0,257,true +9409,330,103,132,true +9410,117,0,86,true +9411,124,0,114,true +9412,118,1,18,true +9413,560,0,245,true +9414,124,1,21,true +9415,154,0,112,true +9416,203,0,107,true +9417,201,0,80,true +9418,98,0,96,true +9419,109,1,18,true +9420,208,0,110,true +9421,94,1,18,true +9422,68,0,86,true +9423,251,0,114,true +9424,178,0,115,true +9425,200,1,18,true +9426,130,0,104,true +9427,224,1,15,true +9428,422,0,265,true +9429,208,1,18,true +9430,238,0,113,true +9431,167,0,115,true +9432,3944,87,3124,true +9433,233,1,18,true +9434,169,0,100,true +9435,232,0,115,true +9436,517,0,251,true +9437,187,1,21,true +9438,161,0,91,true +9439,223,1,18,true +9440,90,0,113,true +9441,68,1,18,true +9442,94,0,117,true +9443,135,0,107,true +9444,118,1,21,true +9445,143,0,95,true +9446,173,0,117,true +9447,176,1,18,true +9448,136,0,111,true +9449,79,0,110,true +9450,300,0,111,true +9451,324,0,114,true +9452,147,0,80,true +9453,238,0,104,true +9454,128,0,93,true +9455,358,1,15,true +9456,231,0,130,true +9457,199,1,15,true +9458,109,1,18,true +9459,148,1,24,true +9460,138,0,109,true +9461,224,0,121,true +9462,140,0,111,true +9463,80,0,93,true +9464,725,0,259,true +9465,186,0,100,true +9466,244,0,128,true +9467,256,0,92,true +9468,187,1,18,true +9469,191,1,21,true +9470,157,0,108,true +9471,350,0,251,true +9472,121,0,92,true +9473,110,0,86,true +9474,124,0,113,true +9475,251,0,117,true +9476,144,0,121,true +9477,142,0,97,true +9478,280,0,240,true +9479,79,0,104,true +9480,140,0,119,true +9481,79,0,102,true +9482,181,1,15,true +9483,187,1,18,true +9484,119,0,104,true +9485,212,1,18,true +9486,85,1,12,true +9487,191,0,108,true +9488,389,0,249,true +9489,203,0,112,true +9490,147,0,107,true +9491,161,0,99,true +9492,230,1,15,true +9493,116,1,18,true +9494,212,1,12,true +9495,64,1,24,true +9496,172,0,119,true +9497,78,0,101,true +9498,352,0,260,true +9499,188,0,105,true +9500,144,0,121,true +9501,223,0,106,true +9502,195,0,102,true +9503,110,1,18,true +9504,290,0,105,true +9505,255,1,15,true +9506,293,0,255,true +9507,56,1,21,true +9508,146,0,125,true +9509,181,0,106,true +9510,144,1,15,true +9511,141,1,18,true +9512,155,0,126,true +9513,71,1,18,true +9514,227,1,15,true +9515,150,0,106,true +9516,94,0,90,true +9517,117,1,18,true +9518,136,0,122,true +9519,299,0,100,true +9520,119,1,24,true +9521,83,0,108,true +9522,312,0,263,true +9523,146,0,111,true +9524,92,0,86,true +9525,137,0,110,true +9526,379,0,275,true +9527,301,0,250,true +9528,176,0,127,true +9529,166,0,92,true +9530,166,0,88,true +9531,118,0,108,true +9532,141,0,135,true +9533,143,0,110,true +9534,157,1,18,true +9535,154,0,125,true +9536,260,1,18,true +9537,123,1,21,true +9538,186,1,24,true +9539,97,1,21,true +9540,98,0,111,true +9541,197,1,24,true +9542,219,0,107,true +9543,121,0,97,true +9544,115,0,130,true +9545,81,0,93,true +9546,199,0,139,true +9547,56,1,12,true +9548,675,0,253,true +9549,90,0,113,true +9550,197,1,12,true +9551,100,0,92,true +9552,121,0,109,true +9553,80,0,92,true +9554,695,0,254,true +9555,210,0,110,true +9556,86,0,112,true +9557,127,1,24,true +9558,112,1,24,true +9559,294,0,249,true +9560,74,1,24,true +9561,151,0,131,true +9562,85,0,97,true +9563,31061,276,153,true +9564,87,1,18,true +9565,379,1,15,true +9566,226,0,107,true +9567,231,0,115,true +9568,102,0,102,true +9569,129,1,18,true +9570,103,0,96,true +9571,477,1,15,true +9572,125,0,94,true +9573,258,1,18,true +9574,162,0,140,true +9575,141,1,24,true +9576,138,0,113,true +9577,56,1,18,true +9578,162,1,18,true +9579,181,0,103,true +9580,154,0,108,true +9581,174,1,18,true +9582,187,0,140,true +9583,172,0,124,true +9584,66,1,18,true +9585,172,0,86,true +9586,286,0,254,true +9587,79,0,108,true +9588,184,0,113,true +9589,252,0,123,true +9590,112,0,113,true +9591,165,0,92,true +9592,214,0,101,true +9593,93,0,94,true +9594,400,1,15,true +9595,138,0,102,true +9596,138,1,18,true +9597,194,0,140,true +9598,343,1,21,true +9599,165,0,120,true +9600,143,0,98,true +9601,140,0,111,true +9602,71,0,93,true +9603,113,1,18,true +9604,245,0,114,true +9605,319,0,235,true +9606,172,0,119,true +9607,131,0,96,true +9608,154,1,18,true +9609,135,0,104,true +9610,147,0,109,true +9611,75,0,97,true +9612,100,0,102,true +9613,103,0,124,true +9614,197,0,113,true +9615,189,0,113,true +9616,187,0,109,true +9617,249,0,140,true +9618,111,1,18,true +9619,148,1,24,true +9620,109,0,115,true +9621,100,1,21,true +9622,231,1,15,true +9623,211,0,119,true +9624,166,0,98,true +9625,109,1,18,true +9626,161,0,117,true +9627,192,0,128,true +9628,98,0,107,true +9629,154,1,18,true +9630,471,0,259,true +9631,113,0,96,true +9632,249,0,115,true +9633,115,1,24,true +9634,189,0,102,true +9635,138,0,113,true +9636,67,0,90,true +9637,397,0,262,true +9638,78,0,104,true +9639,232,1,15,true +9640,204,0,102,true +9641,175,0,111,true +9642,115,1,18,true +9643,141,1,24,true +9644,451,0,255,true +9645,72,1,21,true +9646,189,1,21,true +9647,91,1,12,true +9648,121,0,121,true +9649,144,0,115,true +9650,79,0,108,true +9651,142,0,97,true +9652,118,0,121,true +9653,142,0,112,true +9654,159,0,119,true +9655,116,0,109,true +9656,109,0,122,true +9657,138,0,108,true +9658,245,0,105,true +9659,188,0,98,true +9660,134,1,18,true +9661,119,1,24,true +9662,231,1,15,true +9663,97,0,92,true +9664,345,0,252,true +9665,205,0,115,true +9666,197,1,21,true +9667,219,0,97,true +9668,188,1,21,true +9669,427,0,248,true +9670,129,0,97,true +9671,175,0,103,true +9672,306,0,266,true +9673,67,1,24,true +9674,204,1,18,true +9675,290,0,253,true +9676,258,0,92,true +9677,219,1,24,true +9678,121,0,117,true +9679,129,0,100,true +9680,161,0,103,true +9681,140,0,108,true +9682,81,0,108,true +9683,186,0,92,true +9684,138,1,24,true +9685,165,0,109,true +9686,103,1,18,true +9687,132,0,95,true +9688,65,0,80,true +9689,224,0,121,true +9690,130,1,18,true +9691,138,0,108,true +9692,110,1,15,true +9693,173,0,118,true +9694,528,1,15,true +9695,239,0,111,true +9696,119,0,103,true +9697,318,0,266,true +9698,415,0,266,true +9699,144,0,97,true +9700,91,0,85,true +9701,165,0,110,true +9702,642,0,245,true +9703,150,1,12,true +9704,140,1,24,true +9705,211,0,107,true +9706,172,0,106,true +9707,144,0,122,true +9708,142,0,121,true +9709,117,0,100,true +9710,99,1,24,true +9711,146,0,102,true +9712,108,0,95,true +9713,242,0,113,true +9714,224,0,121,true +9715,214,0,109,true +9716,220,1,18,true +9717,338,0,124,true +9718,204,1,24,true +9719,140,1,12,true +9720,146,0,104,true +9721,123,0,115,true +9722,153,0,124,true +9723,118,0,124,true +9724,118,0,109,true +9725,147,0,128,true +9726,127,0,105,true +9727,156,0,113,true +9728,478,0,262,true +9729,188,0,121,true +9730,13656,70,45,true +9731,97,0,120,true +9732,135,0,137,true +9733,214,0,91,true +9734,81,0,97,true +9735,211,1,18,true +9736,174,0,97,true +9737,222,1,21,true +9738,233,0,102,true +9739,375,0,259,true +9740,84,0,93,true +9741,141,0,105,true +9742,117,0,102,true +9743,165,0,110,true +9744,125,1,15,true +9745,113,1,18,true +9746,382,0,234,true +9747,194,0,115,true +9748,318,0,236,true +9749,168,0,131,true +9750,115,0,129,true +9751,169,0,123,true +9752,243,0,97,true +9753,143,0,97,true +9754,73,0,80,true +9755,222,1,15,true +9756,129,1,24,true +9757,200,0,97,true +9758,226,0,114,true +9759,154,0,113,true +9760,149,1,18,true +9761,224,0,113,true +9762,136,0,125,true +9763,112,0,140,true +9764,66,1,21,true +9765,121,0,107,true +9766,255,1,24,true +9767,350,0,261,true +9768,80,1,24,true +9769,309,0,110,true +9770,225,1,18,true +9771,111,1,18,true +9772,110,1,21,true +9773,109,0,99,true +9774,299,0,102,true +9775,217,0,95,true +9776,112,0,121,true +9777,340,0,119,true +9778,125,0,114,true +9779,78,1,24,true +9780,339,1,15,true +9781,104,0,104,true +9782,137,0,92,true +9783,122,0,125,true +9784,238,1,15,true +9785,273,1,18,true +9786,68,1,21,true +9787,212,0,113,true +9788,151,0,121,true +9789,144,0,137,true +9790,99,1,24,true +9791,308,0,232,true +9792,198,0,106,true +9793,181,0,108,true +9794,206,0,127,true +9795,197,0,122,true +9796,206,0,91,true +9797,119,1,21,true +9798,313,0,250,true +9799,97,0,114,true +9800,157,0,105,true +9801,151,0,91,true +9802,94,0,104,true +9803,155,0,104,true +9804,231,0,115,true +9805,151,0,107,true +9806,213,1,12,true +9807,99,0,102,true +9808,267,1,12,true +9809,156,0,125,true +9810,97,0,104,true +9811,151,0,103,true +9812,136,0,108,true +9813,414,0,261,true +9814,87,0,104,true +9815,119,0,110,true +9816,201,0,107,true +9817,137,0,105,true +9818,173,0,123,true +9819,204,0,110,true +9820,180,0,125,true +9821,191,1,18,true +9822,188,0,113,true +9823,60,1,12,true +9824,144,0,109,true +9825,118,1,18,true +9826,109,0,104,true +9827,690,0,263,true +9828,123,0,99,true +9829,138,0,109,true +9830,137,0,125,true +9831,264,1,12,true +9832,219,0,109,true +9833,146,0,115,true +9834,281,0,137,true +9835,142,1,18,true +9836,284,0,251,true +9837,73,0,92,true +9838,136,0,112,true +9839,137,0,116,true +9840,131,1,24,true +9841,420,0,251,true +9842,289,0,93,true +9843,153,0,82,true +9844,219,0,140,true +9845,144,0,113,true +9846,84,0,108,true +9847,214,1,18,true +9848,129,0,105,true +9849,115,0,88,true +9850,153,0,139,true +9851,606,0,282,true +9852,217,0,112,true +9853,154,1,24,true +9854,149,0,123,true +9855,141,0,114,true +9856,161,0,112,true +9857,150,0,109,true +9858,113,0,111,true +9859,322,0,251,true +9860,180,0,94,true +9861,148,0,126,true +9862,103,0,91,true +9863,231,0,117,true +9864,162,0,109,true +9865,199,0,123,true +9866,326,0,124,true +9867,138,0,101,true +9868,148,0,92,true +9869,86,1,12,true +9870,397,0,245,true +9871,90,0,121,true +9872,200,0,138,true +9873,137,0,88,true +9874,127,1,12,true +9875,75,0,80,true +9876,146,1,18,true +9877,117,0,119,true +9878,568,1,21,true +9879,396,0,264,true +9880,92,0,99,true +9881,231,0,121,true +9882,262,0,112,true +9883,255,0,140,true +9884,265,1,15,true +9885,142,1,18,true +9886,97,1,12,true +9887,119,0,92,true +9888,130,0,126,true +9889,142,0,114,true +9890,119,1,9,true +9891,263,1,15,true +9892,178,1,21,true +9893,267,0,89,true +9894,237,0,121,true +9895,127,0,124,true +9896,144,0,107,true +9897,103,0,107,true +9898,269,1,12,true +9899,410,0,229,true +9900,167,0,123,true +9901,161,0,108,true +9902,99,0,109,true +9903,148,0,118,true +9904,283,0,102,true +9905,217,0,115,true +9906,230,0,120,true +9907,118,1,21,true +9908,85,1,18,true +9909,535,0,252,true +9910,115,0,110,true +9911,153,0,119,true +9912,174,0,116,true +9913,223,1,21,true +9914,225,1,24,true +9915,86,1,21,true +9916,180,1,24,true +9917,116,1,18,true +9918,414,1,15,true +9919,231,0,126,true +9920,327,0,124,true +9921,143,0,106,true +9922,222,0,107,true +9923,160,0,110,true +9924,91,0,110,true +9925,246,0,105,true +9926,335,0,113,true +9927,220,1,18,true +9928,298,0,245,true +9929,87,0,104,true +9930,78,1,12,true +9931,188,1,24,true +9932,148,0,88,true +9933,134,1,18,true +9934,353,1,15,true +9935,129,1,24,true +9936,130,0,97,true +9937,72,0,101,true +9938,109,1,21,true +9939,461,0,245,true +9940,109,1,24,true +9941,137,1,18,true +9942,195,0,111,true +9943,191,1,18,true +9944,118,1,21,true +9945,178,0,92,true +9946,231,0,115,true +9947,147,0,129,true +9948,115,0,108,true +9949,83,0,92,true +9950,207,1,12,true +9951,137,1,12,true +9952,205,1,18,true +9953,194,0,104,true +9954,172,1,18,true +9955,140,0,118,true +9956,163,0,107,true +9957,110,0,92,true +9958,134,0,86,true +9959,203,1,9,true +9960,100,0,110,true +9961,394,0,278,true +9962,214,0,120,true +9963,403,0,251,true +9964,99,0,126,true +9965,417,0,240,true +9966,214,1,21,true +9967,150,1,21,true +9968,12512,7,5001,true +9969,395,1,18,true +9970,326,0,108,true +9971,146,0,114,true +9972,115,0,107,true +9973,174,0,97,true +9974,116,0,107,true +9975,188,0,97,true +9976,155,0,99,true +9977,187,0,104,true +9978,287,1,15,true +9979,135,0,102,true +9980,344,1,15,true +9981,89,1,24,true +9982,121,1,18,true +9983,125,0,119,true +9984,135,1,18,true +9985,185,1,21,true +9986,172,0,92,true +9987,136,0,106,true +9988,100,1,24,true +9989,124,1,21,true +9990,90,1,9,true +9991,150,0,114,true +9992,99,1,24,true +9993,243,1,12,true +9994,248,0,113,true +9995,119,0,91,true +9996,137,0,99,true +9997,173,0,98,true +9998,252,1,18,true +9999,182,0,110,true +10000,127,0,104,true +10001,344,1,15,true +10002,211,0,112,true +10003,135,1,24,true +10004,337,0,104,true +10005,3135,82,1847,true +10006,148,1,18,true +10007,143,1,9,true +10008,141,1,12,true +10009,117,1,24,true +10010,189,0,112,true +10011,136,1,18,true +10012,153,0,106,true +10013,128,0,115,true +10014,408,0,255,true +10015,5646,104,4035,true +10016,78,0,86,true +10017,129,0,139,true +10018,121,0,86,true +10019,111,0,125,true +10020,132,0,109,true +10021,138,0,116,true +10022,222,1,12,true +10023,166,0,106,true +10024,143,0,109,true +10025,80,1,18,true +10026,144,0,108,true +10027,79,0,106,true +10028,166,0,114,true +10029,211,0,118,true +10030,244,1,12,true +10031,92,0,82,true +10032,301,0,257,true +10033,103,0,123,true +10034,170,0,121,true +10035,119,1,18,true +10036,134,0,126,true +10037,229,0,121,true +10038,174,0,119,true +10039,144,0,105,true +10040,206,1,18,true +10041,186,0,113,true +10042,124,1,24,true +10043,93,1,21,true +10044,153,0,113,true +10045,372,0,273,true +10046,78,0,94,true +10047,433,0,262,true +10048,134,0,103,true +10049,195,0,103,true +10050,75,0,104,true +10051,184,0,124,true +10052,172,0,94,true +10053,148,1,24,true +10054,125,0,91,true +10055,185,0,118,true +10056,60,1,21,true +10057,237,0,103,true +10058,111,0,94,true +10059,110,0,97,true +10060,94,0,96,true +10061,176,0,122,true +10062,159,0,124,true +10063,135,0,127,true +10064,142,0,101,true +10065,111,0,88,true +10066,140,0,140,true +10067,105,0,99,true +10068,208,0,119,true +10069,87,0,87,true +10070,159,0,108,true +10071,175,0,111,true +10072,113,1,18,true +10073,296,0,255,true +10074,134,1,12,true +10075,105,1,21,true +10076,217,0,127,true +10077,149,1,18,true +10078,110,1,18,true +10079,306,0,265,true +10080,100,0,127,true +10081,212,1,18,true +10082,146,0,123,true +10083,459,0,245,true +10084,225,1,15,true +10085,121,1,18,true +10086,232,0,124,true +10087,142,0,127,true +10088,432,0,245,true +10089,92,0,102,true +10090,300,0,105,true +10091,123,0,113,true +10092,294,0,99,true +10093,170,0,94,true +10094,320,1,15,true +10095,163,0,104,true +10096,124,0,101,true +10097,243,0,109,true +10098,155,1,21,true +10099,279,0,123,true +10100,167,0,124,true +10101,218,0,117,true +10102,91,0,120,true +10103,124,1,12,true +10104,191,1,24,true +10105,85,0,92,true +10106,96,0,100,true +10107,244,1,15,true +10108,419,0,264,true +10109,65,1,21,true +10110,128,1,15,true +10111,122,0,126,true +10112,238,0,128,true +10113,110,0,129,true +10114,204,0,111,true +10115,195,0,125,true +10116,140,0,132,true +10117,298,1,15,true +10118,222,1,18,true +10119,195,0,101,true +10120,257,0,113,true +10121,181,0,101,true +10122,125,1,12,true +10123,129,0,111,true +10124,230,1,18,true +10125,197,0,105,true +10126,269,0,117,true +10127,208,1,18,true +10128,129,0,91,true +10129,151,0,112,true +10130,153,0,117,true +10131,217,0,110,true +10132,123,0,108,true +10133,328,0,254,true +10134,188,0,111,true +10135,191,0,94,true +10136,181,1,18,true +10137,220,0,105,true +10138,136,1,15,true +10139,225,0,108,true +10140,249,0,112,true +10141,379,0,236,true +10142,106,0,104,true +10143,271,0,122,true +10144,174,0,127,true +10145,150,0,118,true +10146,172,0,118,true +10147,78,0,80,true +10148,143,0,115,true +10149,124,0,92,true +10150,362,1,12,true +10151,128,0,95,true +10152,429,0,273,true +10153,118,1,18,true +10154,134,0,122,true +10155,230,0,98,true +10156,91,0,78,true +10157,96,1,21,true +10158,230,0,94,true +10159,238,1,18,true +10160,147,0,111,true +10161,135,0,98,true +10162,347,1,15,true +10163,155,0,110,true +10164,102,1,24,true +10165,150,0,103,true +10166,113,0,124,true +10167,280,0,111,true +10168,140,0,119,true +10169,83,0,111,true +10170,142,0,109,true +10171,104,0,106,true +10172,108,0,138,true +10173,127,0,97,true +10174,294,0,245,true +10175,115,0,115,true +10176,141,0,96,true +10177,1002,69,724,true +10178,252,29,152,true +10179,328,1,15,true +10180,222,0,113,true +10181,199,0,131,true +10182,113,1,21,true +10183,79,0,96,true +10184,191,0,127,true +10185,99,1,24,true +10186,326,0,261,true +10187,130,1,15,true +10188,260,0,127,true +10189,141,1,18,true +10190,208,0,105,true +10191,98,0,95,true +10192,327,0,255,true +10193,122,0,115,true +10194,217,1,21,true +10195,86,0,94,true +10196,140,0,119,true +10197,77,0,110,true +10198,175,0,137,true +10199,97,0,103,true +10200,106,1,18,true +10201,140,0,112,true +10202,299,0,250,true +10203,191,0,94,true +10204,149,0,117,true +10205,130,0,92,true +10206,153,0,116,true +10207,111,0,104,true +10208,142,0,114,true +10209,157,1,21,true +10210,128,0,108,true +10211,312,0,255,true +10212,161,0,122,true +10213,188,0,115,true +10214,175,0,113,true +10215,146,0,116,true +10216,130,0,90,true +10217,148,0,91,true +10218,79,0,100,true +10219,314,0,111,true +10220,148,0,97,true +10221,277,0,232,true +10222,181,0,108,true +10223,330,0,251,true +10224,86,0,113,true +10225,137,0,103,true +10226,100,0,95,true +10227,132,0,115,true +10228,141,1,9,true +10229,102,0,105,true +10230,87,0,105,true +10231,109,1,18,true +10232,330,1,15,true +10233,113,1,18,true +10234,384,0,229,true +10235,115,1,18,true +10236,118,0,96,true +10237,112,0,110,true +10238,122,0,106,true +10239,379,0,264,true +10240,93,0,104,true +10241,89,1,24,true +10242,94,0,103,true +10243,178,1,18,true +10244,188,1,18,true +10245,103,0,94,true +10246,218,0,115,true +10247,100,1,21,true +10248,117,0,92,true +10249,290,0,231,true +10250,149,0,123,true +10251,117,1,12,true +10252,193,1,15,true +10253,172,0,92,true +10254,201,1,24,true +10255,77,0,100,true +10256,198,0,122,true +10257,242,0,117,true +10258,225,0,129,true +10259,197,1,12,true +10260,105,0,104,true +10261,214,0,111,true +10262,151,0,136,true +10263,2251,87,1204,true +10264,195,0,114,true +10265,73,0,108,true +10266,276,1,21,true +10267,128,0,108,true +10268,93,0,92,true +10269,227,1,21,true +10270,141,1,18,true +10271,132,1,24,true +10272,91,1,12,true +10273,153,0,121,true +10274,306,0,95,true +10275,189,0,104,true +10276,232,1,12,true +10277,91,0,124,true +10278,116,1,12,true +10279,128,0,124,true +10280,335,1,15,true +10281,210,1,21,true +10282,100,0,113,true +10283,188,1,18,true +10284,144,0,115,true +10285,241,0,108,true +10286,132,0,108,true +10287,113,0,110,true +10288,79,0,97,true +10289,341,1,15,true +10290,146,0,101,true +10291,195,0,104,true +10292,125,0,86,true +10293,188,1,18,true +10294,194,0,137,true +10295,213,0,103,true +10296,116,1,24,true +10297,77,0,104,true +10298,219,1,12,true +10299,134,0,113,true +10300,168,0,111,true +10301,128,1,18,true +10302,70,1,24,true +10303,132,0,105,true +10304,85,0,97,true +10305,341,0,236,true +10306,89,1,21,true +10307,353,1,15,true +10308,182,0,132,true +10309,226,1,15,true +10310,187,1,18,true +10311,136,1,18,true +10312,124,0,107,true +10313,94,0,114,true +10314,251,0,107,true +10315,185,1,12,true +10316,167,0,98,true +10317,292,0,254,true +10318,58,1,21,true +10319,90,1,21,true +10320,195,1,21,true +10321,115,1,18,true +10322,273,0,119,true +10323,173,0,118,true +10324,128,0,115,true +10325,162,0,107,true +10326,97,0,107,true +10327,160,0,118,true +10328,414,0,253,true +10329,99,0,113,true +10330,122,1,21,true +10331,201,0,107,true +10332,124,0,89,true +10333,73,0,92,true +10334,129,0,111,true +10335,249,0,125,true +10336,100,0,96,true +10337,146,0,114,true +10338,370,0,267,true +10339,85,0,94,true +10340,350,0,270,true +10341,117,1,18,true +10342,246,0,94,true +10343,197,0,106,true +10344,124,0,90,true +10345,187,0,116,true +10346,140,1,18,true +10347,157,0,108,true +10348,71,0,83,true +10349,188,1,18,true +10350,98,0,104,true +10351,212,0,130,true +10352,127,0,115,true +10353,151,0,104,true +10354,211,0,99,true +10355,96,1,24,true +10356,148,0,97,true +10357,135,0,104,true +10358,61,1,18,true +10359,118,1,18,true +10360,182,0,110,true +10361,312,0,266,true +10362,321,0,229,true +10363,193,0,109,true +10364,225,0,120,true +10365,121,0,117,true +10366,169,1,24,true +10367,138,0,110,true +10368,142,0,126,true +10369,194,0,92,true +10370,124,0,100,true +10371,224,1,12,true +10372,121,0,100,true +10373,252,1,18,true +10374,281,0,245,true +10375,83,0,105,true +10376,377,18,171,true +10377,179,0,109,true +10378,116,0,111,true +10379,116,1,18,true +10380,269,0,108,true +10381,162,1,24,true +10382,169,1,18,true +10383,123,1,24,true +10384,141,0,105,true +10385,151,0,110,true +10386,117,0,85,true +10387,245,0,117,true +10388,258,0,140,true +10389,144,1,21,true +10390,73,1,12,true +10391,104,0,111,true +10392,166,0,113,true +10393,151,0,113,true +10394,165,0,111,true +10395,60,0,79,true +10396,619,0,271,true +10397,118,0,104,true +10398,144,1,24,true +10399,123,0,98,true +10400,235,1,15,true +10401,352,0,231,true +10402,116,0,121,true +10403,104,0,114,true +10404,131,1,21,true +10405,288,1,15,true +10406,80,1,21,true +10407,106,1,18,true +10408,147,0,94,true +10409,150,0,112,true +10410,192,0,118,true +10411,327,0,119,true +10412,135,0,106,true +10413,51,1,21,true +10414,121,0,113,true +10415,100,0,109,true +10416,268,0,120,true +10417,150,0,80,true +10418,248,0,105,true +10419,132,0,108,true +10420,199,0,98,true +10421,220,0,114,true +10422,167,1,24,true +10423,287,0,110,true +10424,312,0,257,true +10425,62,1,9,true +10426,143,0,115,true +10427,143,1,18,true +10428,151,0,98,true +10429,213,1,18,true +10430,162,0,107,true +10431,340,1,15,true +10432,288,0,252,true +10433,244,0,105,true +10434,260,1,18,true +10435,214,0,101,true +10436,116,1,21,true +10437,154,0,115,true +10438,113,1,24,true +10439,142,0,102,true +10440,98,0,104,true +10441,127,0,125,true +10442,98,0,128,true +10443,195,0,107,true +10444,137,0,92,true +10445,178,0,112,true +10446,287,0,250,true +10447,134,0,95,true +10448,457,0,238,true +10449,97,1,24,true +10450,104,0,87,true +10451,108,0,97,true +10452,112,1,18,true +10453,341,0,252,true +10454,78,1,12,true +10455,124,1,18,true +10456,131,0,95,true +10457,148,1,24,true +10458,116,1,18,true +10459,129,1,18,true +10460,98,0,95,true +10461,141,0,97,true +10462,123,0,95,true +10463,112,1,24,true +10464,131,0,99,true +10465,129,0,97,true +10466,94,0,111,true +10467,98,1,12,true +10468,330,0,250,true +10469,242,0,115,true +10470,214,1,18,true +10471,188,0,96,true +10472,167,0,113,true +10473,138,0,123,true +10474,106,1,24,true +10475,137,1,18,true +10476,105,1,21,true +10477,150,0,121,true +10478,131,1,18,true +10479,298,0,125,true +10480,205,0,115,true +10481,118,1,21,true +10482,79,0,90,true +10483,204,1,18,true +10484,212,0,77,true +10485,78,0,104,true +10486,205,0,107,true +10487,99,0,86,true +10488,135,0,117,true +10489,141,0,113,true +10490,231,1,15,true +10491,382,0,273,true +10492,137,1,18,true +10493,379,0,248,true +10494,288,1,18,true +10495,232,0,123,true +10496,149,0,103,true +10497,157,0,112,true +10498,227,0,118,true +10499,125,1,18,true +10500,178,0,111,true +10501,80,0,80,true +10502,309,0,108,true +10503,220,1,15,true +10504,91,0,94,true +10505,157,0,112,true +10506,147,0,110,true +10507,195,1,12,true +10508,115,0,104,true +10509,116,0,117,true +10510,327,0,132,true +10511,10307,76,66,true +10512,445,0,255,true +10513,140,0,113,true +10514,179,0,111,true +10515,149,0,131,true +10516,127,0,114,true +10517,457,0,255,true +10518,129,0,97,true +10519,130,0,95,true +10520,75,0,110,true +10521,91,0,96,true +10522,277,0,231,true +10523,96,1,24,true +10524,129,1,18,true +10525,251,1,12,true +10526,173,0,109,true +10527,162,0,111,true +10528,113,0,99,true +10529,389,1,15,true +10530,245,0,115,true +10531,273,0,122,true +10532,245,0,140,true +10533,214,0,80,true +10534,93,0,102,true +10535,360,0,139,true +10536,178,0,108,true +10537,84,1,24,true +10538,163,0,113,true +10539,110,1,21,true +10540,155,1,18,true +10541,241,0,116,true +10542,87,0,96,true +10543,143,0,107,true +10544,328,0,253,true +10545,160,0,123,true +10546,127,0,125,true +10547,96,0,97,true +10548,286,1,15,true +10549,85,0,92,true +10550,180,0,110,true +10551,81,0,108,true +10552,193,0,103,true +10553,230,0,107,true +10554,129,0,125,true +10555,472,0,262,true +10556,184,0,118,true +10557,198,0,97,true +10558,220,0,108,true +10559,113,1,18,true +10560,127,0,96,true +10561,159,0,125,true +10562,307,0,258,true +10563,315,0,103,true +10564,140,0,101,true +10565,113,0,104,true +10566,199,0,107,true +10567,112,0,100,true +10568,155,1,18,true +10569,124,1,24,true +10570,245,0,130,true +10571,216,0,116,true +10572,121,1,24,true +10573,122,1,24,true +10574,159,0,86,true +10575,208,0,115,true +10576,346,1,15,true +10577,340,0,245,true +10578,113,0,119,true +10579,214,0,119,true +10580,93,1,21,true +10581,67,0,86,true +10582,194,0,100,true +10583,64,0,85,true +10584,401,0,254,true +10585,86,0,87,true +10586,118,0,103,true +10587,134,0,103,true +10588,143,1,18,true +10589,238,0,112,true +10590,106,0,106,true +10591,87,0,93,true +10592,136,0,121,true +10593,305,0,229,true +10594,91,0,90,true +10595,288,1,18,true +10596,138,0,103,true +10597,233,0,119,true +10598,98,0,91,true +10599,118,1,18,true +10600,123,0,118,true +10601,90,0,110,true +10602,128,1,21,true +10603,169,0,90,true +10604,92,0,102,true +10605,96,1,24,true +10606,172,1,21,true +10607,148,0,116,true +10608,409,0,263,true +10609,85,1,18,true +10610,181,0,124,true +10611,131,0,124,true +10612,103,1,9,true +10613,32923,323,219,true +10614,406,0,255,true +10615,137,0,131,true +10616,122,0,114,true +10617,146,0,116,true +10618,315,0,109,true +10619,7008,86,5001,true +10620,87,0,95,true +10621,227,0,112,true +10622,233,0,109,true +10623,94,0,95,true +10624,210,1,18,true +10625,263,0,112,true +10626,80,1,24,true +10627,238,0,121,true +10628,174,1,18,true +10629,166,0,100,true +10630,250,1,18,true +10631,74,0,101,true +10632,334,0,242,true +10633,71,1,24,true +10634,110,0,125,true +10635,96,0,127,true +10636,87,1,24,true +10637,157,0,115,true +10638,5189,104,3713,true +10639,429,0,257,true +10640,235,0,110,true +10641,92,1,15,true +10642,111,0,100,true +10643,521,1,15,true +10644,141,0,110,true +10645,147,0,122,true +10646,106,1,18,true +10647,129,0,121,true +10648,235,1,15,true +10649,232,0,125,true +10650,160,0,120,true +10651,60,1,12,true +10652,136,0,103,true +10653,188,0,105,true +10654,98,0,82,true +10655,124,1,24,true +10656,121,0,99,true +10657,136,0,95,true +10658,239,0,107,true +10659,123,1,18,true +10660,261,1,15,true +10661,77,1,24,true +10662,205,0,100,true +10663,445,0,243,true +10664,136,0,100,true +10665,358,0,119,true +10666,237,0,112,true +10667,79,0,94,true +10668,420,0,239,true +10669,159,0,114,true +10670,155,0,86,true +10671,111,0,107,true +10672,142,0,100,true +10673,150,1,18,true +10674,156,0,101,true +10675,73,0,79,true +10676,184,0,110,true +10677,92,1,24,true +10678,24007,208,141,true +10679,212,0,108,true +10680,195,0,140,true +10681,419,1,15,true +10682,333,0,255,true +10683,121,1,18,true +10684,160,1,21,true +10685,142,0,109,true +10686,131,1,18,true +10687,284,0,240,true +10688,136,0,98,true +10689,313,0,257,true +10690,136,1,21,true +10691,292,0,140,true +10692,148,0,96,true +10693,99,0,105,true +10694,167,0,108,true +10695,161,0,127,true +10696,104,0,93,true +10697,149,1,24,true +10698,87,0,92,true +10699,160,0,122,true +10700,97,1,12,true +10701,156,0,130,true +10702,117,1,18,true +10703,509,1,15,true +10704,198,0,90,true +10705,182,1,18,true +10706,156,0,114,true +10707,252,0,112,true +10708,327,0,264,true +10709,106,1,18,true +10710,128,0,116,true +10711,303,0,263,true +10712,97,1,12,true +10713,140,0,103,true +10714,162,0,118,true +10715,211,0,100,true +10716,172,0,103,true +10717,155,0,113,true +10718,141,0,107,true +10719,104,0,96,true +10720,115,0,117,true +10721,106,0,116,true +10722,91,1,24,true +10723,138,1,18,true +10724,73,1,18,true +10725,282,0,235,true +10726,103,0,119,true +10727,142,0,104,true +10728,105,0,117,true +10729,83,0,95,true +10730,166,0,121,true +10731,110,0,109,true +10732,110,0,111,true +10733,192,1,18,true +10734,149,0,120,true +10735,156,0,140,true +10736,173,0,103,true +10737,146,0,101,true +10738,119,0,101,true +10739,167,0,126,true +10740,370,0,267,true +10741,244,1,18,true +10742,134,1,18,true +10743,586,0,257,true +10744,111,0,100,true +10745,673,0,235,true +10746,113,0,107,true +10747,123,1,24,true +10748,163,0,128,true +10749,92,1,24,true +10750,314,0,253,true +10751,220,0,140,true +10752,189,0,138,true +10753,129,0,116,true +10754,98,0,98,true +10755,198,0,108,true +10756,115,0,104,true +10757,136,0,135,true +10758,115,1,21,true +10759,154,0,113,true +10760,227,0,93,true +10761,187,0,106,true +10762,81,0,95,true +10763,168,0,114,true +10764,72,0,100,true +10765,136,1,18,true +10766,216,0,108,true +10767,113,0,98,true +10768,151,0,121,true +10769,112,1,18,true +10770,89,1,24,true +10771,343,0,277,true +10772,314,0,127,true +10773,118,0,104,true +10774,113,1,21,true +10775,231,1,15,true +10776,70,1,21,true +10777,179,1,18,true +10778,109,1,18,true +10779,90,0,108,true +10780,283,0,132,true +10781,96,1,12,true +10782,556,0,259,true +10783,168,1,24,true +10784,271,0,122,true +10785,261,0,116,true +10786,125,1,24,true +10787,112,1,24,true +10788,282,1,18,true +10789,127,0,91,true +10790,192,0,109,true +10791,250,0,107,true +10792,108,0,97,true +10793,299,0,265,true +10794,103,0,100,true +10795,160,0,122,true +10796,106,1,24,true +10797,119,0,104,true +10798,293,0,111,true +10799,155,0,107,true +10800,125,0,98,true +10801,157,1,24,true +10802,103,0,106,true +10803,137,0,114,true +10804,227,1,12,true +10805,98,0,104,true +10806,176,0,107,true +10807,116,0,103,true +10808,110,1,18,true +10809,289,0,255,true +10810,153,0,104,true +10811,147,0,110,true +10812,84,0,86,true +10813,206,0,104,true +10814,157,0,116,true +10815,121,0,94,true +10816,185,0,114,true +10817,112,0,99,true +10818,216,0,97,true +10819,102,0,113,true +10820,224,1,12,true +10821,199,0,107,true +10822,262,0,114,true +10823,175,0,120,true +10824,162,0,93,true +10825,324,0,104,true +10826,195,0,108,true +10827,303,0,247,true +10828,87,0,106,true +10829,351,0,110,true +10830,96,0,113,true +10831,245,1,12,true +10832,123,0,116,true +10833,121,0,111,true +10834,255,0,110,true +10835,192,0,111,true +10836,211,0,106,true +10837,148,0,126,true +10838,140,0,109,true +10839,307,0,245,true +10840,174,0,105,true +10841,130,1,24,true +10842,169,0,129,true +10843,255,1,21,true +10844,346,0,260,true +10845,187,1,18,true +10846,144,0,94,true +10847,143,0,104,true +10848,111,0,110,true +10849,227,0,111,true +10850,325,0,115,true +10851,118,1,24,true +10852,135,1,24,true +10853,344,0,249,true +10854,246,0,121,true +10855,148,0,108,true +10856,231,0,96,true +10857,144,0,108,true +10858,166,0,142,true +10859,213,0,115,true +10860,83,0,98,true +10861,116,1,21,true +10862,184,0,105,true +10863,668,0,251,true +10864,136,1,12,true +10865,235,0,90,true +10866,125,0,108,true +10867,175,0,86,true +10868,123,0,109,true +10869,327,0,240,true +10870,116,0,110,true +10871,150,0,107,true +10872,461,0,253,true +10873,127,0,124,true +10874,232,0,113,true +10875,96,1,9,true +10876,289,0,110,true +10877,207,0,113,true +10878,109,1,12,true +10879,163,0,116,true +10880,165,0,116,true +10881,150,0,121,true +10882,112,0,120,true +10883,134,0,123,true +10884,97,0,92,true +10885,312,0,111,true +10886,118,1,24,true +10887,184,0,114,true +10888,94,0,109,true +10889,491,0,261,true +10890,137,1,15,true +10891,161,0,86,true +10892,93,1,12,true +10893,56,1,18,true +10894,138,1,15,true +10895,156,0,95,true +10896,214,0,108,true +10897,92,0,100,true +10898,163,0,106,true +10899,244,1,18,true +10900,213,0,113,true +10901,112,0,113,true +10902,299,0,252,true +10903,136,0,100,true +10904,117,1,18,true +10905,142,1,18,true +10906,265,1,15,true +10907,59,1,21,true +10908,216,1,18,true +10909,293,0,248,true +10910,308,0,263,true +10911,125,0,110,true +10912,151,0,121,true +10913,732,57,532,true +10914,74,1,24,true +10915,123,0,88,true +10916,72,0,92,true +10917,125,0,96,true +10918,161,0,115,true +10919,117,1,15,true +10920,149,0,102,true +10921,111,0,104,true +10922,127,0,124,true +10923,125,0,110,true +10924,113,1,21,true +10925,62,1,15,true +10926,142,0,106,true +10927,140,0,107,true +10928,132,1,24,true +10929,79,1,21,true +10930,89,1,24,true +10931,220,1,15,true +10932,100,0,130,true +10933,129,0,101,true +10934,225,1,15,true +10935,140,0,108,true +10936,74,0,103,true +10937,238,1,21,true +10938,271,0,109,true +10939,119,0,106,true +10940,96,1,21,true +10941,105,0,101,true +10942,149,0,109,true +10943,207,1,21,true +10944,121,0,105,true +10945,121,1,18,true +10946,156,0,114,true +10947,155,0,132,true +10948,163,0,113,true +10949,136,0,103,true +10950,496,1,15,true +10951,3482,97,2546,true +10952,397,0,255,true +10953,211,0,114,true +10954,226,0,121,true +10955,74,1,18,true +10956,137,1,18,true +10957,256,0,113,true +10958,181,0,103,true +10959,131,0,96,true +10960,226,1,15,true +10961,74,1,12,true +10962,85,1,18,true +10963,112,0,107,true +10964,124,0,123,true +10965,104,0,97,true +10966,137,0,100,true +10967,140,0,105,true +10968,132,0,104,true +10969,110,0,123,true +10970,112,0,85,true +10971,283,1,15,true +10972,128,0,113,true +10973,159,0,112,true +10974,308,0,245,true +10975,151,0,122,true +10976,77,0,106,true +10977,233,1,12,true +10978,200,0,130,true +10979,112,0,89,true +10980,150,0,122,true +10981,227,0,134,true +10982,90,0,92,true +10983,292,0,264,true +10984,97,0,127,true +10985,116,1,18,true +10986,140,0,115,true +10987,81,0,89,true +10988,134,0,98,true +10989,321,0,276,true +10990,128,0,92,true +10991,67,0,90,true +10992,132,1,18,true +10993,124,0,112,true +10994,104,0,101,true +10995,134,1,18,true +10996,286,0,252,true +10997,150,0,109,true +10998,130,1,18,true +10999,115,0,91,true +11000,104,0,113,true +11001,381,0,255,true +11002,77,0,106,true +11003,140,1,18,true +11004,103,0,94,true +11005,163,0,112,true +11006,99,0,108,true +11007,720,0,248,true +11008,205,0,140,true +11009,144,0,112,true +11010,89,1,24,true +11011,258,0,109,true +11012,100,1,18,true +11013,147,0,109,true +11014,213,1,15,true +11015,245,0,107,true +11016,153,0,122,true +11017,90,1,18,true +11018,111,0,127,true +11019,172,0,111,true +11020,119,1,21,true +11021,168,0,97,true +11022,149,0,80,true +11023,74,0,98,true +11024,350,0,249,true +11025,281,1,15,true +11026,119,0,119,true +11027,321,0,256,true +11028,189,0,119,true +11029,127,1,21,true +11030,128,0,99,true +11031,153,0,131,true +11032,144,0,121,true +11033,146,0,118,true +11034,214,0,132,true +11035,176,0,121,true +11036,136,0,110,true +11037,188,0,105,true +11038,131,0,107,true +11039,143,0,114,true +11040,106,0,97,true +11041,111,0,115,true +11042,298,0,112,true +11043,219,0,97,true +11044,174,0,102,true +11045,188,0,112,true +11046,117,0,113,true +11047,326,0,269,true +11048,94,1,24,true +11049,147,0,126,true +11050,167,1,21,true +11051,175,0,115,true +11052,75,0,97,true +11053,338,0,101,true +11054,255,0,112,true +11055,232,1,21,true +11056,106,1,18,true +11057,110,0,93,true +11058,118,0,127,true +11059,110,1,18,true +11060,146,1,9,true +11061,154,0,104,true +11062,216,1,18,true +11063,112,1,18,true +11064,161,0,119,true +11065,128,1,18,true +11066,163,0,108,true +11067,77,0,92,true +11068,77,1,21,true +11069,135,0,106,true +11070,170,0,119,true +11071,307,0,270,true +11072,141,1,18,true +11073,146,1,21,true +11074,142,0,111,true +11075,262,0,105,true +11076,104,0,106,true +11077,66,1,18,true +11078,149,0,122,true +11079,220,1,15,true +11080,117,1,18,true +11081,170,0,121,true +11082,187,0,112,true +11083,147,1,18,true +11084,94,0,97,true +11085,205,0,116,true +11086,489,1,12,true +11087,49,1,21,true +11088,248,1,15,true +11089,93,1,18,true +11090,87,0,93,true +11091,161,0,112,true +11092,151,0,115,true +11093,135,1,18,true +11094,235,1,15,true +11095,66,1,24,true +11096,99,0,92,true +11097,485,0,256,true +11098,127,0,115,true +11099,149,0,102,true +11100,86,0,92,true +11101,135,0,109,true +11102,165,0,115,true +11103,347,0,112,true +11104,113,1,18,true +11105,184,0,128,true +11106,84,1,9,true +11107,124,1,18,true +11108,173,1,24,true +11109,138,0,103,true +11110,148,1,18,true +11111,141,0,96,true +11112,100,0,101,true +11113,170,0,112,true +11114,96,0,107,true +11115,201,0,100,true +11116,301,0,100,true +11117,170,0,113,true +11118,117,0,110,true +11119,245,0,121,true +11120,307,0,103,true +11121,85,0,97,true +11122,163,0,112,true +11123,123,0,138,true +11124,144,0,115,true +11125,306,0,245,true +11126,579,0,252,true +11127,433,0,241,true +11128,86,0,110,true +11129,124,1,21,true +11130,132,0,87,true +11131,195,0,128,true +11132,141,0,98,true +11133,168,0,119,true +11134,74,1,15,true +11135,116,0,112,true +11136,531,0,265,true +11137,81,0,100,true +11138,151,0,106,true +11139,78,0,105,true +11140,292,0,245,true +11141,138,0,104,true +11142,137,1,18,true +11143,340,0,265,true +11144,122,1,24,true +11145,169,0,122,true +11146,185,0,112,true +11147,124,0,113,true +11148,208,0,96,true +11149,251,0,138,true +11150,185,0,130,true +11151,144,0,107,true +11152,140,0,95,true +11153,86,0,93,true +11154,117,1,18,true +11155,179,0,128,true +11156,213,1,18,true +11157,189,1,24,true +11158,409,0,242,true +11159,173,0,98,true +11160,148,0,116,true +11161,113,1,21,true +11162,245,0,117,true +11163,282,0,125,true +11164,312,0,127,true +11165,148,0,108,true +11166,70,0,88,true +11167,349,0,277,true +11168,72,1,21,true +11169,113,1,9,true +11170,359,0,256,true +11171,110,1,18,true +11172,161,0,107,true +11173,106,0,116,true +11174,106,0,140,true +11175,986,0,267,true +11176,112,0,91,true +11177,205,0,109,true +11178,136,0,110,true +11179,176,0,113,true +11180,137,0,107,true +11181,490,1,24,true +11182,156,0,103,true +11183,79,0,80,true +11184,309,0,98,true +11185,242,0,120,true +11186,153,0,114,true +11187,204,0,98,true +11188,140,0,119,true +11189,77,0,110,true +11190,287,0,252,true +11191,140,0,123,true +11192,71,1,24,true +11193,97,1,24,true +11194,587,0,267,true +11195,265,0,118,true +11196,294,0,254,true +11197,245,0,118,true +11198,220,0,115,true +11199,160,0,108,true +11200,334,0,262,true +11201,148,0,124,true +11202,260,0,104,true +11203,182,0,89,true +11204,174,0,114,true +11205,186,0,102,true +11206,188,0,113,true +11207,150,0,119,true +11208,199,0,123,true +11209,137,0,107,true +11210,148,0,115,true +11211,129,0,106,true +11212,110,0,118,true +11213,225,1,15,true +11214,438,0,257,true +11215,85,0,94,true +11216,326,0,258,true +11217,205,1,15,true +11218,153,0,116,true +11219,147,1,18,true +11220,148,0,108,true +11221,110,1,18,true +11222,128,0,90,true +11223,330,0,100,true +11224,104,1,21,true +11225,220,0,115,true +11226,303,0,261,true +11227,121,1,18,true +11228,151,0,128,true +11229,207,0,124,true +11230,147,1,21,true +11231,294,1,15,true +11232,102,0,127,true +11233,99,0,99,true +11234,124,0,94,true +11235,127,1,18,true +11236,86,1,24,true +11237,117,1,24,true +11238,244,0,107,true +11239,163,0,110,true +11240,94,1,24,true +11241,112,0,109,true +11242,102,1,24,true +11243,423,0,263,true +11244,153,0,127,true +11245,290,0,254,true +11246,118,0,109,true +11247,97,1,12,true +11248,204,0,115,true +11249,91,0,100,true +11250,137,0,116,true +11251,105,0,97,true +11252,153,0,104,true +11253,154,0,105,true +11254,113,1,12,true +11255,78,0,109,true +11256,115,1,18,true +11257,99,1,24,true +11258,122,1,12,true +11259,73,0,97,true +11260,157,1,21,true +11261,147,0,104,true +11262,148,1,18,true +11263,137,1,18,true +11264,111,1,24,true +11265,87,0,108,true +11266,84,1,24,true +11267,143,0,89,true +11268,81,0,98,true +11269,141,0,116,true +11270,299,0,240,true +11271,96,0,107,true +11272,207,0,113,true +11273,255,1,18,true +11274,140,0,105,true +11275,79,1,24,true +# Summary +# avg_duration_us,384 +# total_paths,11276 +# failed_paths,0 diff --git a/pathfinding_benchmark_current.csv b/pathfinding_benchmark_current.csv new file mode 100644 index 0000000..30e2f96 --- /dev/null +++ b/pathfinding_benchmark_current.csv @@ -0,0 +1,25 @@ +sample,path_duration_us,path_length,nodes_expanded,success +0,484,142,142,true +1,449,148,148,true +2,408,124,124,true +3,742,116,116,true +4,296,94,94,true +5,563,126,126,true +6,349,128,128,true +7,422,120,120,true +8,195,0,105,true +9,191,0,111,true +10,419,146,146,true +11,356,119,119,true +12,34,4,4,true +13,414,133,133,true +14,216,0,117,true +15,16,4,4,true +16,664,119,119,true +17,528,119,119,true +18,295,116,116,true +19,22,2,2,true +# Summary +# avg_duration_us,353 +# total_paths,20 +# failed_paths,50297 diff --git a/src/entities/shared_systems/pathfinding.rs b/src/entities/shared_systems/pathfinding.rs index 696354b..67baec4 100644 --- a/src/entities/shared_systems/pathfinding.rs +++ b/src/entities/shared_systems/pathfinding.rs @@ -200,28 +200,28 @@ pub fn update_wandering_targets( return; }; - query.iter_mut().for_each(|(mut ambulatory, transform)| { - if ambulatory.target.is_none() { - let center = transform.translation; - let center_chunk = IVec2::new( - (center.x / (CHUNK_SIZE as f32 * TILE_SIZE)).floor() as i32, - (center.y / (CHUNK_SIZE as f32 * TILE_SIZE)).floor() as i32, - ); + for (mut ambulatory, _) in query.iter_mut() { + if ambulatory.target.is_none() + || (ambulatory.current_path.is_some() + && ambulatory.path_index >= ambulatory.current_path.as_ref().unwrap().len()) + { + let loaded_chunks: Vec<&IVec2> = chunk_map.loaded_chunks.keys().collect(); + if !loaded_chunks.is_empty() { + let random_index = rng.random_range(0..loaded_chunks.len()); + if let Some(&chunk_pos) = loaded_chunks.get(random_index) { + let chunk_x = chunk_pos.x * CHUNK_SIZE; + let chunk_y = chunk_pos.y * CHUNK_SIZE; - if chunk_map.loaded_chunks.contains_key(¢er_chunk) { - let loaded_chunks: Vec<&IVec2> = chunk_map.loaded_chunks.keys().collect(); - if !loaded_chunks.is_empty() { - let random_index = rng.random_range(0..loaded_chunks.len()); - if let Some(&chunk_pos) = loaded_chunks.get(random_index) { - let chunk_x = chunk_pos.x * CHUNK_SIZE; - let chunk_y = chunk_pos.y * CHUNK_SIZE; + let target_x = chunk_x + rng.random_range(0..CHUNK_SIZE); + let target_y = chunk_y + rng.random_range(0..CHUNK_SIZE); - let target_x = chunk_x + rng.random_range(0..CHUNK_SIZE); - let target_y = chunk_y + rng.random_range(0..CHUNK_SIZE); - - for z in -3..=4 { - let target_pos = IVec3::new(target_x, target_y, z) * ITILE_SIZE; - if tilemap.floor_tiles.contains_key(&target_pos) { + for z in -3..=4 { + let mut target_pos = IVec3::new(target_x, target_y, z) * ITILE_SIZE; + if tilemap.floor_tiles.get(&target_pos).is_some() { + target_pos.z += ITILE_SIZE; + if tilemap.floor_tiles.get(&target_pos).is_some() + && is_standable_tile(&tilemap, target_pos) + { ambulatory.target = Some(Vec3::new( target_pos.x as f32, target_pos.y as f32, @@ -236,7 +236,7 @@ pub fn update_wandering_targets( } } } - }); + } } pub fn movement(mut query: Query<(&mut Ambulatory, &mut Transform)>, tilemap: Res) {