diff --git a/bin/tests/test_physics.cpp b/bin/tests/test_physics.cpp index 3dd8c5744d0..ba305cc7692 100644 --- a/bin/tests/test_physics.cpp +++ b/bin/tests/test_physics.cpp @@ -90,7 +90,7 @@ protected: PhysicsServer * ps = PhysicsServer::get_singleton(); RID mesh_instance = vs->instance_create2(type_mesh_map[p_shape],scenario); - RID body = ps->body_create(p_body,!p_active_default); + RID body = ps->body_create(p_body,!p_active_default); ps->body_set_space(body,space); ps->body_set_param(body,PhysicsServer::BODY_PARAM_BOUNCE,0.5); //todo set space diff --git a/bin/tests/test_physics_2d.cpp b/bin/tests/test_physics_2d.cpp index db7f6ea3748..b2ad1d9ee88 100644 --- a/bin/tests/test_physics_2d.cpp +++ b/bin/tests/test_physics_2d.cpp @@ -270,6 +270,7 @@ protected: RID body = ps->body_create(); ps->body_add_shape(body,body_shape_data[p_shape].shape); ps->body_set_space(body,space); + ps->body_set_continuous_collision_detection_mode(body,Physics2DServer::CCD_MODE_CAST_SHAPE); ps->body_set_state(body,Physics2DServer::BODY_STATE_TRANSFORM,p_xform); // print_line("add body with xform: "+p_xform); diff --git a/core/globals.cpp b/core/globals.cpp index 2eb26a7b198..997e2a2d85c 100644 --- a/core/globals.cpp +++ b/core/globals.cpp @@ -240,6 +240,7 @@ bool Globals::_load_resource_pack(const String& p_pack) { //if data.pck is found, all directory access will be from here DirAccess::make_default(DirAccess::ACCESS_RESOURCES); + using_datapack=true; return true; } @@ -1327,6 +1328,10 @@ void Globals::set_disable_platform_override(bool p_disable) { disable_platform_override=p_disable; } +bool Globals::is_using_datapack() const { + + return using_datapack; +} void Globals::_bind_methods() { @@ -1439,6 +1444,8 @@ Globals::Globals() { custom_prop_info["render/mipmap_policy"]=PropertyInfo(Variant::INT,"render/mipmap_policy",PROPERTY_HINT_ENUM,"Allow,Allow For Po2,Disallow"); custom_prop_info["render/thread_model"]=PropertyInfo(Variant::INT,"render/thread_model",PROPERTY_HINT_ENUM,"Single-Unsafe,Single-Safe,Multi-Threaded"); set("display/emulate_touchscreen",false); + + using_datapack=false; } diff --git a/core/globals.h b/core/globals.h index 375c59a25e2..08d9f08088b 100644 --- a/core/globals.h +++ b/core/globals.h @@ -69,6 +69,7 @@ protected: String resource_path; HashMap custom_prop_info; bool disable_platform_override; + bool using_datapack; bool _set(const StringName& p_name, const Variant& p_value); @@ -127,6 +128,8 @@ public: void register_global_defaults(); + bool is_using_datapack() const; + Globals(); ~Globals(); diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index ec9dce28e20..b90a41df548 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -26,396 +26,396 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "file_access_compressed.h" -#include "print_string.h" -void FileAccessCompressed::configure(const String& p_magic, Compression::Mode p_mode, int p_block_size) { - - magic=p_magic.ascii().get_data(); - if (magic.length()>4) - magic=magic.substr(0,4); - else { - while(magic.length()<4) - magic+=" "; - } - - cmode=p_mode; - block_size=p_block_size; - -} - - -#define WRITE_FIT(m_bytes) \ -{\ -if (write_pos+(m_bytes) > write_max) {\ - write_max=write_pos+(m_bytes);\ -}\ -if (write_max > write_buffer_size) {\ - write_buffer_size = nearest_power_of_2( write_max );\ - buffer.resize(write_buffer_size);\ - write_ptr=buffer.ptr();\ -}\ -} - - -Error FileAccessCompressed::open_after_magic(FileAccess *p_base) { - - - f=p_base; - cmode=(Compression::Mode)f->get_32(); - block_size=f->get_32(); - read_total=f->get_32(); - int bc = (read_total/block_size)+1; - int acc_ofs=f->get_pos()+bc*4; - int max_bs=0; - for(int i=0;iget_32(); - acc_ofs+=rb.csize; - max_bs=MAX(max_bs,rb.csize); - read_blocks.push_back(rb); - - - } - - comp_buffer.resize(max_bs); - buffer.resize(block_size); - read_ptr=buffer.ptr(); - f->get_buffer(comp_buffer.ptr(),read_blocks[0].csize); - at_end=false; - read_eof=false; - read_block_count=bc; - read_block_size=read_blocks.size()==1?read_total:block_size; - - Compression::decompress(buffer.ptr(),read_block_size,comp_buffer.ptr(),read_blocks[0].csize,cmode); - read_block=0; - read_pos=0; - - return OK; - -} - -Error FileAccessCompressed::_open(const String& p_path, int p_mode_flags){ - - ERR_FAIL_COND_V(p_mode_flags==READ_WRITE,ERR_UNAVAILABLE); - - if (f) - close(); - - - Error err; - f = FileAccess::open(p_path,p_mode_flags,&err); - if (err!=OK) { - //not openable - - f=NULL; - return err; - } - - if (p_mode_flags&WRITE) { - - buffer.clear(); - writing=true; - write_pos=0; - write_buffer_size=256; - buffer.resize(256); - write_max=0; - write_ptr=buffer.ptr(); - - - - //don't store anything else unless it's done saving! - } else { - - char rmagic[5]; - f->get_buffer((uint8_t*)rmagic,4); - rmagic[4]=0; - if (magic!=rmagic) { - memdelete(f); - f=NULL; - return ERR_FILE_UNRECOGNIZED; - } - - open_after_magic(f); - - } - - return OK; - -} -void FileAccessCompressed::close(){ - - if (!f) - return; - - - if (writing) { - //save block table and all compressed blocks - - CharString mgc = magic.utf8(); - f->store_buffer((const uint8_t*)mgc.get_data(),mgc.length()); //write header 4 - f->store_32(cmode); //write compression mode 4 - f->store_32(block_size); //write block size 4 - f->store_32(write_max); //max amount of data written 4 - int bc=(write_max/block_size)+1; - - for(int i=0;istore_32(0); //compressed sizes, will update later - } - - - Vector block_sizes; - for(int i=0;i cblock; - cblock.resize(Compression::get_max_compressed_buffer_size(bl,cmode)); - int s = Compression::compress(cblock.ptr(),bp,bl,cmode); - - f->store_buffer(cblock.ptr(),s); - block_sizes.push_back(s); - } - - f->seek(16); //ok write block sizes - for(int i=0;istore_32(block_sizes[i]); - f->seek_end(); - f->store_buffer((const uint8_t*)mgc.get_data(),mgc.length()); //magic at the end too - - buffer.clear(); - - } else { - - - comp_buffer.clear(); - buffer.clear(); - read_blocks.clear(); - } - - memdelete(f); - f=NULL; - -} - -bool FileAccessCompressed::is_open() const{ - - return f!=NULL; -} - -void FileAccessCompressed::seek(size_t p_position){ - - ERR_FAIL_COND(!f); - if (writing) { - - ERR_FAIL_COND(p_position>write_max); - - write_pos=p_position; - - } else { - - ERR_FAIL_COND(p_position>read_total); - if (p_position==read_total) { - at_end=true; - } else { - - int block_idx = p_position/block_size; - if (block_idx!=read_block) { - - read_block=block_idx; - f->seek(read_blocks[read_block].offset); - f->get_buffer(comp_buffer.ptr(),read_blocks[read_block].csize); - Compression::decompress(buffer.ptr(),read_blocks.size()==1?read_total:block_size,comp_buffer.ptr(),read_blocks[read_block].csize,cmode); - read_block_size=read_block==read_block_count-1?read_total%block_size:block_size; - } - - read_pos=p_position%block_size; - } - } -} - - -void FileAccessCompressed::seek_end(int64_t p_position){ - - ERR_FAIL_COND(!f); - if (writing) { - - seek(write_max+p_position); - } else { - - seek(read_total+p_position); - - } - - -} -size_t FileAccessCompressed::get_pos() const{ - - ERR_FAIL_COND_V(!f,0); - if (writing) { - - return write_pos; - } else { - - return read_block*block_size+read_pos; - } - -} -size_t FileAccessCompressed::get_len() const{ - - ERR_FAIL_COND_V(!f,0); - if (writing) { - - return write_max; - } else { - return read_total; - } -} - -bool FileAccessCompressed::eof_reached() const{ - - ERR_FAIL_COND_V(!f,false); - if (writing) { - return false; - } else { - return read_eof; - } -} - -uint8_t FileAccessCompressed::get_8() const{ - - ERR_FAIL_COND_V(writing,0); - ERR_FAIL_COND_V(!f,0); - - if (at_end) { - read_eof=true; - return 0; - } - - uint8_t ret = read_ptr[read_pos]; - - read_pos++; - if (read_pos>=read_block_size) { - read_block++; - - if (read_blockget_buffer(comp_buffer.ptr(),read_blocks[read_block].csize); - Compression::decompress(buffer.ptr(),read_blocks.size()==1?read_total:block_size,comp_buffer.ptr(),read_blocks[read_block].csize,cmode); - read_block_size=read_block==read_block_count-1?read_total%block_size:block_size; - read_pos=0; - - } else { - read_block--; - at_end=true; - ret =0; - } - } - - return ret; - -} -int FileAccessCompressed::get_buffer(uint8_t *p_dst, int p_length) const{ - - ERR_FAIL_COND_V(writing,0); - ERR_FAIL_COND_V(!f,0); - - if (at_end) { - read_eof=true; - return 0; - } - - - for(int i=0;i=read_block_size) { - read_block++; - - if (read_blockget_buffer(comp_buffer.ptr(),read_blocks[read_block].csize); - Compression::decompress(buffer.ptr(),read_blocks.size()==1?read_total:block_size,comp_buffer.ptr(),read_blocks[read_block].csize,cmode); - read_block_size=read_block==read_block_count-1?read_total%block_size:block_size; - read_pos=0; - - } else { - read_block--; - at_end=true; - if (iget_modified_time(p_file); - else - return 0; -} - -FileAccessCompressed::FileAccessCompressed() { - - f=NULL; - magic="GCMP"; - block_size=4096; - cmode=Compression::MODE_FASTLZ; - writing=false; - write_ptr=0; - write_buffer_size=0; - write_max=0; - block_size=0; - read_eof=false; - at_end=false; - read_total=0; - read_ptr=NULL; - read_block=0; - read_block_count=0; - read_block_size=0; - read_pos=0; - -} - -FileAccessCompressed::~FileAccessCompressed(){ - - if (f) - close(); - -} +#include "file_access_compressed.h" +#include "print_string.h" +void FileAccessCompressed::configure(const String& p_magic, Compression::Mode p_mode, int p_block_size) { + + magic=p_magic.ascii().get_data(); + if (magic.length()>4) + magic=magic.substr(0,4); + else { + while(magic.length()<4) + magic+=" "; + } + + cmode=p_mode; + block_size=p_block_size; + +} + + +#define WRITE_FIT(m_bytes) \ +{\ +if (write_pos+(m_bytes) > write_max) {\ + write_max=write_pos+(m_bytes);\ +}\ +if (write_max > write_buffer_size) {\ + write_buffer_size = nearest_power_of_2( write_max );\ + buffer.resize(write_buffer_size);\ + write_ptr=buffer.ptr();\ +}\ +} + + +Error FileAccessCompressed::open_after_magic(FileAccess *p_base) { + + + f=p_base; + cmode=(Compression::Mode)f->get_32(); + block_size=f->get_32(); + read_total=f->get_32(); + int bc = (read_total/block_size)+1; + int acc_ofs=f->get_pos()+bc*4; + int max_bs=0; + for(int i=0;iget_32(); + acc_ofs+=rb.csize; + max_bs=MAX(max_bs,rb.csize); + read_blocks.push_back(rb); + + + } + + comp_buffer.resize(max_bs); + buffer.resize(block_size); + read_ptr=buffer.ptr(); + f->get_buffer(comp_buffer.ptr(),read_blocks[0].csize); + at_end=false; + read_eof=false; + read_block_count=bc; + read_block_size=read_blocks.size()==1?read_total:block_size; + + Compression::decompress(buffer.ptr(),read_block_size,comp_buffer.ptr(),read_blocks[0].csize,cmode); + read_block=0; + read_pos=0; + + return OK; + +} + +Error FileAccessCompressed::_open(const String& p_path, int p_mode_flags){ + + ERR_FAIL_COND_V(p_mode_flags==READ_WRITE,ERR_UNAVAILABLE); + + if (f) + close(); + + + Error err; + f = FileAccess::open(p_path,p_mode_flags,&err); + if (err!=OK) { + //not openable + + f=NULL; + return err; + } + + if (p_mode_flags&WRITE) { + + buffer.clear(); + writing=true; + write_pos=0; + write_buffer_size=256; + buffer.resize(256); + write_max=0; + write_ptr=buffer.ptr(); + + + + //don't store anything else unless it's done saving! + } else { + + char rmagic[5]; + f->get_buffer((uint8_t*)rmagic,4); + rmagic[4]=0; + if (magic!=rmagic) { + memdelete(f); + f=NULL; + return ERR_FILE_UNRECOGNIZED; + } + + open_after_magic(f); + + } + + return OK; + +} +void FileAccessCompressed::close(){ + + if (!f) + return; + + + if (writing) { + //save block table and all compressed blocks + + CharString mgc = magic.utf8(); + f->store_buffer((const uint8_t*)mgc.get_data(),mgc.length()); //write header 4 + f->store_32(cmode); //write compression mode 4 + f->store_32(block_size); //write block size 4 + f->store_32(write_max); //max amount of data written 4 + int bc=(write_max/block_size)+1; + + for(int i=0;istore_32(0); //compressed sizes, will update later + } + + + Vector block_sizes; + for(int i=0;i cblock; + cblock.resize(Compression::get_max_compressed_buffer_size(bl,cmode)); + int s = Compression::compress(cblock.ptr(),bp,bl,cmode); + + f->store_buffer(cblock.ptr(),s); + block_sizes.push_back(s); + } + + f->seek(16); //ok write block sizes + for(int i=0;istore_32(block_sizes[i]); + f->seek_end(); + f->store_buffer((const uint8_t*)mgc.get_data(),mgc.length()); //magic at the end too + + buffer.clear(); + + } else { + + + comp_buffer.clear(); + buffer.clear(); + read_blocks.clear(); + } + + memdelete(f); + f=NULL; + +} + +bool FileAccessCompressed::is_open() const{ + + return f!=NULL; +} + +void FileAccessCompressed::seek(size_t p_position){ + + ERR_FAIL_COND(!f); + if (writing) { + + ERR_FAIL_COND(p_position>write_max); + + write_pos=p_position; + + } else { + + ERR_FAIL_COND(p_position>read_total); + if (p_position==read_total) { + at_end=true; + } else { + + int block_idx = p_position/block_size; + if (block_idx!=read_block) { + + read_block=block_idx; + f->seek(read_blocks[read_block].offset); + f->get_buffer(comp_buffer.ptr(),read_blocks[read_block].csize); + Compression::decompress(buffer.ptr(),read_blocks.size()==1?read_total:block_size,comp_buffer.ptr(),read_blocks[read_block].csize,cmode); + read_block_size=read_block==read_block_count-1?read_total%block_size:block_size; + } + + read_pos=p_position%block_size; + } + } +} + + +void FileAccessCompressed::seek_end(int64_t p_position){ + + ERR_FAIL_COND(!f); + if (writing) { + + seek(write_max+p_position); + } else { + + seek(read_total+p_position); + + } + + +} +size_t FileAccessCompressed::get_pos() const{ + + ERR_FAIL_COND_V(!f,0); + if (writing) { + + return write_pos; + } else { + + return read_block*block_size+read_pos; + } + +} +size_t FileAccessCompressed::get_len() const{ + + ERR_FAIL_COND_V(!f,0); + if (writing) { + + return write_max; + } else { + return read_total; + } +} + +bool FileAccessCompressed::eof_reached() const{ + + ERR_FAIL_COND_V(!f,false); + if (writing) { + return false; + } else { + return read_eof; + } +} + +uint8_t FileAccessCompressed::get_8() const{ + + ERR_FAIL_COND_V(writing,0); + ERR_FAIL_COND_V(!f,0); + + if (at_end) { + read_eof=true; + return 0; + } + + uint8_t ret = read_ptr[read_pos]; + + read_pos++; + if (read_pos>=read_block_size) { + read_block++; + + if (read_blockget_buffer(comp_buffer.ptr(),read_blocks[read_block].csize); + Compression::decompress(buffer.ptr(),read_blocks.size()==1?read_total:block_size,comp_buffer.ptr(),read_blocks[read_block].csize,cmode); + read_block_size=read_block==read_block_count-1?read_total%block_size:block_size; + read_pos=0; + + } else { + read_block--; + at_end=true; + ret =0; + } + } + + return ret; + +} +int FileAccessCompressed::get_buffer(uint8_t *p_dst, int p_length) const{ + + ERR_FAIL_COND_V(writing,0); + ERR_FAIL_COND_V(!f,0); + + if (at_end) { + read_eof=true; + return 0; + } + + + for(int i=0;i=read_block_size) { + read_block++; + + if (read_blockget_buffer(comp_buffer.ptr(),read_blocks[read_block].csize); + Compression::decompress(buffer.ptr(),read_blocks.size()==1?read_total:block_size,comp_buffer.ptr(),read_blocks[read_block].csize,cmode); + read_block_size=read_block==read_block_count-1?read_total%block_size:block_size; + read_pos=0; + + } else { + read_block--; + at_end=true; + if (iget_modified_time(p_file); + else + return 0; +} + +FileAccessCompressed::FileAccessCompressed() { + + f=NULL; + magic="GCMP"; + block_size=16384; + cmode=Compression::MODE_DEFLATE; + writing=false; + write_ptr=0; + write_buffer_size=0; + write_max=0; + block_size=0; + read_eof=false; + at_end=false; + read_total=0; + read_ptr=NULL; + read_block=0; + read_block_count=0; + read_block_size=0; + read_pos=0; + +} + +FileAccessCompressed::~FileAccessCompressed(){ + + if (f) + close(); + +} diff --git a/core/map.h b/core/map.h index 959dc586617..05abdc510ef 100644 --- a/core/map.h +++ b/core/map.h @@ -115,7 +115,7 @@ private: Element* _nil; int size_cache; - _Data() { + _FORCE_INLINE_ _Data() { #ifdef GLOBALNIL_DISABLED _nil = memnew_allocator( Element, A ); _nil->parent=_nil->left=_nil->right=_nil; diff --git a/core/math/math_2d.cpp b/core/math/math_2d.cpp index dbeaea6e757..acaaa327f3a 100644 --- a/core/math/math_2d.cpp +++ b/core/math/math_2d.cpp @@ -255,6 +255,16 @@ Vector2 Vector2::cubic_interpolate(const Vector2& p_b,const Vector2& p_pre_a, co } +Vector2 Vector2::slide(const Vector2& p_vec) const { + + return p_vec - *this * this->dot(p_vec); +} +Vector2 Vector2::reflect(const Vector2& p_vec) const { + + return p_vec - *this * this->dot(p_vec) * 2.0; + +} + bool Rect2::intersects_segment(const Point2& p_from, const Point2& p_to, Point2* r_pos,Point2* r_normal) const { diff --git a/core/math/math_2d.h b/core/math/math_2d.h index 212d848bcbd..1f450364091 100644 --- a/core/math/math_2d.h +++ b/core/math/math_2d.h @@ -105,6 +105,8 @@ struct Vector2 { Vector2 cubic_interpolate(const Vector2& p_b,const Vector2& p_pre_a, const Vector2& p_post_b,float p_t) const; Vector2 cubic_interpolate_soft(const Vector2& p_b,const Vector2& p_pre_a, const Vector2& p_post_b,float p_t) const; + Vector2 slide(const Vector2& p_vec) const; + Vector2 reflect(const Vector2& p_vec) const; Vector2 operator+(const Vector2& p_v) const; void operator+=(const Vector2& p_v); diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 24c5c6bf959..846b924a425 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -298,6 +298,8 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var VCALL_LOCALMEM1R(Vector2,snapped); VCALL_LOCALMEM0R(Vector2,get_aspect); VCALL_LOCALMEM1R(Vector2,dot); + VCALL_LOCALMEM1R(Vector2,slide); + VCALL_LOCALMEM1R(Vector2,reflect); // VCALL_LOCALMEM1R(Vector2,cross); VCALL_LOCALMEM0R(Rect2,get_area); @@ -1192,6 +1194,8 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl ADDFUNC1(VECTOR2,VECTOR2,Vector2,snapped,VECTOR2,"by",varray()); ADDFUNC0(VECTOR2,REAL,Vector2,get_aspect,varray()); ADDFUNC1(VECTOR2,REAL,Vector2,dot,VECTOR2,"with",varray()); + ADDFUNC1(VECTOR2,REAL,Vector2,slide,VECTOR2,"vec",varray()); + ADDFUNC1(VECTOR2,REAL,Vector2,reflect,VECTOR2,"vec",varray()); //ADDFUNC1(VECTOR2,REAL,Vector2,cross,VECTOR2,"with",varray()); ADDFUNC0(RECT2,REAL,Rect2,get_area,varray()); diff --git a/demos/2d/platformer/bullet.gd b/demos/2d/platformer/bullet.gd index 6836116aa4c..9aacc9809dd 100644 --- a/demos/2d/platformer/bullet.gd +++ b/demos/2d/platformer/bullet.gd @@ -15,6 +15,7 @@ func disable(): func _ready(): # Initalization here + get_node("Timer").start() pass diff --git a/demos/2d/platformer/bullet.xml b/demos/2d/platformer/bullet.xml index 9de518c7031..84c903803f0 100644 --- a/demos/2d/platformer/bullet.xml +++ b/demos/2d/platformer/bullet.xml @@ -1,14 +1,13 @@ - - - - - "" + + + + 0 10 - + - + "shutdown" 1.5 False @@ -16,13 +15,13 @@ "value" "particles:config/emitting" 1 - + "cont" False "transitions" 1 "values" - + False "times" @@ -31,13 +30,13 @@ "value" "sprite:visibility/self_opacity" 1 - + "cont" True "transitions" 1, 1 "values" - + 1 0 @@ -47,14 +46,14 @@ "method" "." 1 - + "transitions" 1 "values" - - + + "args" - + "method" "queue_free" @@ -63,33 +62,25 @@ "times" 1.31 - + - "" - + "names" - + "bullet" "RigidBody2D" - "process/process" - "process/fixed_process" - "process/input" - "process/unhandled_input" - "process/mode" "visibility/visible" - "visibility/toplevel" "visibility/opacity" "visibility/self_opacity" "visibility/on_top" - "visibility/blend_mode" - "transform/notify" "transform/pos" "transform/rot" "transform/scale" "shape_count" "shapes/0/shape" "shapes/0/transform" + "shapes/0/trigger" "mode" "mass" "friction" @@ -106,8 +97,10 @@ "__meta__" "particles" "Particles2D" + "visibility/blend_mode" "config/amount" "config/lifetime" + "config/time_scale" "config/preprocess" "config/emit_timeout" "config/emitting" @@ -115,11 +108,14 @@ "config/half_extents" "config/local_space" "config/explosiveness" + "config/flip_h" + "config/flip_v" "config/texture" "params/direction" "params/spread" "params/linear_velocity" "params/spin_velocity" + "params/orbit_velocity" "params/gravity_direction" "params/gravity_strength" "params/radial_accel" @@ -132,6 +128,7 @@ "randomness/spread" "randomness/linear_velocity" "randomness/spin_velocity" + "randomness/orbit_velocity" "randomness/gravity_direction" "randomness/gravity_strength" "randomness/radial_accel" @@ -149,6 +146,7 @@ "phase_2/color" "phase_3/pos" "phase_3/color" + "emission_points" "sprite" "Sprite" "texture" @@ -164,6 +162,7 @@ "region_rect" "CollisionShape2D" "shape" + "trigger" "Timer" "wait_time" "one_shot" @@ -173,8 +172,9 @@ "playback/process_mode" "playback/default_blend_time" "root/root" - "speed" "anims/shutdown" + "playback/active" + "playback/speed" "blend_times" "autoplay" "disable" @@ -187,99 +187,150 @@ "node_count" 6 "variants" - - False - 0 + True 1 0, 0 0 1, 1 1 - + 1, 0, 0, 1, 0, 0 - - + False + 0 + 2 + + "__editor_plugin_states__" - + "Script" - + "current" - 0 + 2 "sources" - + "res://enemy.gd" "res://player.gd" "res://bullet.gd" "2D" - + + "pixel_snap" + False "zoom" 3.424785 "ofs" -74.7573, -35.9676 "3D" - + "zfar" 500 "fov" 45 - "window_mode" - 0 - "window_0" - - "distance" - 10.07268 - "default_light" - True - "x_rot" - 0.337 - "y_rot" - -0.575 - "show_grid" - True - "show_origin" - True - "pos" - 0, 0, 0 - + "viewports" + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "viewport_mode" + 1 + "default_light" + True + "show_grid" + True + "show_origin" + True "znear" 0.1 "__editor_run_settings__" - + "custom_args" "-l $scene" "run_mode" 0 "__editor_plugin_screen__" - "Script" + "2D" 0.559322 24 0.1 - + 10 - 2 1, 1, 1, 1 1, 0, 0, 0 0, 0, 0, 1 - 0, 0, 0, 0 + + 0, 0, 0, 0 ".." - - + + "" "nodes" - -1, -1, 1, 0, -1, 32, 2, 0, 3, 0, 4, 0, 5, 0, 6, 1, 7, 2, 8, 0, 9, 3, 10, 3, 11, 2, 12, 1, 13, 2, 14, 4, 15, 5, 16, 6, 17, 7, 18, 8, 19, 9, 20, 1, 21, 3, 22, 3, 23, 5, 24, 0, 25, 0, 26, 1, 27, 0, 28, 2, 29, 2, 30, 4, 31, 5, 32, 10, 33, 11, 0, 0, 0, 35, 34, -1, 59, 2, 2, 3, 0, 4, 0, 5, 0, 6, 1, 7, 2, 8, 0, 9, 12, 10, 3, 11, 2, 12, 7, 13, 0, 14, 4, 15, 5, 16, 6, 36, 13, 37, 14, 38, 5, 39, 5, 40, 2, 41, 4, 42, 4, 43, 0, 44, 3, 45, 15, 46, 5, 47, 16, 48, 5, 49, 5, 50, 5, 51, 5, 52, 5, 53, 5, 54, 5, 55, 3, 56, 5, 57, 5, 58, 5, 59, 5, 60, 5, 61, 5, 62, 5, 63, 5, 64, 5, 65, 5, 66, 5, 67, 5, 68, 5, 69, 5, 70, 17, 71, 5, 72, 18, 73, 3, 74, 19, 75, 3, 76, 20, 77, 3, 78, 20, 32, 21, 0, 0, 0, 80, 79, -1, 27, 2, 0, 3, 0, 4, 0, 5, 0, 6, 1, 7, 2, 8, 0, 9, 3, 10, 3, 11, 2, 12, 1, 13, 0, 14, 4, 15, 5, 16, 6, 81, 15, 82, 2, 83, 4, 84, 0, 85, 0, 86, 7, 87, 7, 88, 1, 89, 18, 90, 0, 91, 22, 32, 21, 0, 0, 0, 92, 92, -1, 17, 2, 0, 3, 0, 4, 0, 5, 0, 6, 1, 7, 2, 8, 0, 9, 3, 10, 3, 11, 2, 12, 1, 13, 2, 14, 4, 15, 5, 16, 6, 93, 8, 32, 21, 0, 0, 0, 94, 94, -1, 9, 2, 0, 3, 0, 4, 0, 5, 0, 6, 1, 95, 3, 96, 2, 97, 2, 32, 21, 0, 0, 0, 99, 98, -1, 13, 2, 0, 3, 0, 4, 0, 5, 0, 6, 1, 100, 7, 101, 5, 102, 23, 103, 3, 104, 24, 105, 25, 106, 26, 32, 21, 0 + -1, -1, 1, 0, -1, 25, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 8, 13, 9, 14, 1, 15, 1, 16, 3, 17, 8, 18, 10, 19, 9, 20, 8, 21, 0, 22, 0, 23, 2, 24, 3, 25, 11, 26, 12, 0, 0, 0, 28, 27, -1, 57, 2, 0, 3, 13, 4, 1, 5, 0, 29, 5, 6, 2, 7, 3, 8, 4, 30, 14, 31, 15, 32, 1, 33, 3, 34, 3, 35, 0, 36, 2, 37, 2, 38, 8, 39, 1, 40, 8, 41, 8, 42, 16, 43, 3, 44, 17, 45, 3, 46, 3, 47, 3, 48, 3, 49, 3, 50, 3, 51, 3, 52, 3, 53, 1, 54, 3, 55, 3, 56, 3, 57, 3, 58, 3, 59, 3, 60, 3, 61, 3, 62, 3, 63, 3, 64, 3, 65, 3, 66, 3, 67, 3, 68, 3, 69, 10, 70, 3, 71, 18, 72, 1, 73, 19, 74, 1, 75, 20, 76, 1, 77, 20, 78, 21, 0, 0, 0, 80, 79, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 81, 16, 82, 0, 83, 2, 84, 8, 85, 8, 86, 5, 87, 5, 88, 9, 89, 18, 90, 8, 91, 22, 0, 0, 0, 92, 92, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 93, 6, 94, 8, 0, 0, 0, 95, 95, -1, 3, 96, 1, 97, 0, 98, 8, 0, 0, 0, 100, 99, -1, 8, 101, 5, 102, 3, 103, 23, 104, 24, 105, 0, 106, 1, 107, 25, 108, 26, 0 "conns" - 4, 0, 108, 107, 2, 0 + 4, 0, 110, 109, 2, 0 - + \ No newline at end of file diff --git a/demos/2d/platformer/enemy.gd b/demos/2d/platformer/enemy.gd index 5ec7cb28a7c..b4e70477a80 100644 --- a/demos/2d/platformer/enemy.gd +++ b/demos/2d/platformer/enemy.gd @@ -95,3 +95,4 @@ func _ready(): rc_right=get_node("raycast_right") + diff --git a/demos/2d/platformer/moving_platform.xml b/demos/2d/platformer/moving_platform.xml index 8f4e4c77417..4d54d6d11c8 100644 --- a/demos/2d/platformer/moving_platform.xml +++ b/demos/2d/platformer/moving_platform.xml @@ -10,7 +10,7 @@ "names" - + "moving_platform" "Node2D" "visibility/visible" @@ -25,16 +25,23 @@ "motion" "cycle" "platform" - "StaticBody2D" + "RigidBody2D" "shape_count" "shapes/0/shape" "shapes/0/transform" "shapes/0/trigger" - "simulate_motion" - "constant_linear_velocity" - "constant_angular_velocity" + "mode" + "mass" "friction" "bounce" + "custom_integrator" + "continuous_cd" + "contacts_reported" + "contact_monitor" + "active" + "can_sleep" + "velocity/linear" + "velocity/angular" "Sprite" "texture" "centered" @@ -58,7 +65,7 @@ "node_count" 4 "variants" - + True 1 0, 0 @@ -180,14 +187,15 @@ 1, -0, 0, 1, 0, 0 False - + 3 0 + 1, 1, 1, 1 0, 0, 0, 0 -88, -24, 88, -24, 88, 24, -88, 24 "nodes" - -1, -1, 1, 0, -1, 11, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 2, 12, 1, 0, 0, 0, 14, 13, -1, 16, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 15, 7, 16, 8, 17, 9, 18, 10, 19, 0, 20, 2, 21, 3, 22, 1, 23, 3, 0, 1, 0, 24, 24, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 25, 11, 26, 0, 27, 2, 28, 10, 29, 10, 30, 7, 31, 7, 32, 12, 33, 13, 34, 10, 35, 14, 0, 1, 0, 36, 36, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 37, 12, 38, 15, 0 + -1, -1, 1, 0, -1, 11, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 2, 12, 1, 0, 0, 0, 14, 13, -1, 23, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 15, 7, 16, 8, 17, 9, 18, 10, 19, 11, 20, 1, 21, 1, 22, 3, 23, 10, 24, 10, 25, 12, 26, 10, 27, 0, 28, 0, 29, 2, 30, 3, 0, 1, 0, 31, 31, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 32, 13, 33, 0, 34, 2, 35, 10, 36, 10, 37, 7, 38, 7, 39, 12, 40, 14, 41, 10, 42, 15, 0, 1, 0, 43, 43, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 44, 12, 45, 16, 0 "conns" diff --git a/demos/2d/platformer/player.xml b/demos/2d/platformer/player.xml index 94086a8b19f..404032d3522 100644 --- a/demos/2d/platformer/player.xml +++ b/demos/2d/platformer/player.xml @@ -1,15 +1,15 @@ - - - - - - - + + + + + + + 0.5 20 @@ -101,50 +101,6 @@ - "falling_weapon" - 0.5 - True - 0.25 - "value" - "sprite:frame" - 1 - - "cont" - False - "transitions" - 1 - "values" - - 26 - - "times" - 0 - - - - - "falling" - 0.01 - True - 0.25 - "value" - "sprite:frame" - 1 - - "cont" - False - "transitions" - 1 - "values" - - 21 - - "times" - 0 - - - - "run_weapon" 1.25 True @@ -171,9 +127,9 @@ - - "run_gun_fire" - 1.25 + + "falling" + 0.01 True 0.25 "value" @@ -183,18 +139,57 @@ "cont" False "transitions" - 1, 1, 1, 1, 1, 1 + 1 "values" - - 10 - 11 - 12 - 13 - 14 - 5 + + 21 "times" - 0, 0.25, 0.5, 0.75, 1, 1.25 + 0 + + + + + "falling_weapon" + 0.5 + True + 0.25 + "value" + "sprite:frame" + 1 + + "cont" + False + "transitions" + 1 + "values" + + 26 + + "times" + 0 + + + + + "idle_weapon" + 0.5 + True + 0.25 + "value" + "sprite:frame" + 1 + + "cont" + False + "transitions" + 1 + "values" + + 25 + + "times" + 0 @@ -243,8 +238,8 @@ - "idle_weapon" - 0.5 + "run_gun_fire" + 1.25 True 0.25 "value" @@ -254,13 +249,18 @@ "cont" False "transitions" - 1 + 1, 1, 1, 1, 1, 1 "values" - - 25 + + 10 + 11 + 12 + 13 + 14 + 5 "times" - 0 + 0, 0.25, 0.5, 0.75, 1, 1.25 @@ -294,7 +294,7 @@ "names" - + "player" "RigidBody2D" "visibility/visible" @@ -351,6 +351,8 @@ "config/half_extents" "config/local_space" "config/explosiveness" + "config/flip_h" + "config/flip_v" "config/texture" "params/direction" "params/spread" @@ -396,19 +398,20 @@ "anims/idle" "anims/jumping" "anims/run" - "anims/falling_weapon" - "anims/falling" "anims/run_weapon" - "anims/standing_weapon_ready" + "anims/falling" + "anims/falling_weapon" + "anims/idle_weapon" "anims/jumping_weapon" "anims/crouch" - "anims/idle_weapon" + "anims/standing_weapon_ready" "playback/active" "playback/speed" "blend_times" "autoplay" "camera" "Camera2D" + "rotating" "current" "smoothing" "zoom" @@ -651,7 +654,7 @@ "shoot" "nodes" - -1, -1, 1, 0, -1, 28, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 8, 13, 9, 14, 10, 15, 8, 16, 5, 17, 11, 18, 3, 19, 3, 20, 0, 21, 8, 22, 12, 23, 8, 24, 0, 25, 0, 26, 2, 27, 3, 28, 13, 29, 14, 0, 0, 0, 31, 30, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 32, 15, 33, 0, 34, 2, 35, 8, 36, 8, 37, 5, 38, 16, 39, 17, 40, 18, 41, 8, 42, 19, 0, 1, 0, 44, 43, -1, 55, 2, 0, 3, 1, 4, 20, 5, 0, 45, 17, 6, 21, 7, 22, 8, 4, 46, 23, 47, 24, 48, 1, 49, 3, 50, 24, 51, 8, 52, 2, 53, 2, 54, 8, 55, 25, 56, 26, 57, 3, 58, 27, 59, 28, 60, 1, 61, 3, 62, 3, 63, 29, 64, 3, 65, 3, 66, 3, 67, 30, 68, 30, 69, 3, 70, 3, 71, 3, 72, 3, 73, 30, 74, 3, 75, 3, 76, 3, 77, 3, 78, 3, 79, 3, 80, 3, 81, 3, 82, 3, 83, 5, 84, 3, 85, 18, 86, 1, 87, 31, 88, 1, 89, 32, 90, 1, 91, 33, 92, 34, 0, 0, 0, 94, 93, -1, 17, 95, 17, 96, 3, 97, 35, 98, 36, 99, 37, 100, 38, 101, 39, 102, 40, 103, 41, 104, 42, 105, 43, 106, 44, 107, 45, 108, 0, 109, 30, 110, 46, 111, 47, 0, 0, 0, 113, 112, -1, 21, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 33, 0, 114, 0, 115, 3, 116, 4, 117, 48, 118, 48, 119, 49, 120, 49, 121, 0, 122, 0, 123, 50, 124, 50, 125, 50, 126, 50, 0, 0, 0, 128, 127, -1, 7, 2, 0, 3, 1, 4, 1, 5, 0, 6, 51, 7, 3, 8, 4, 0, 0, 0, 129, 129, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 52, 7, 3, 8, 53, 130, 6, 131, 8, 0, 0, 0, 133, 132, -1, 14, 134, 12, 135, 54, 136, 3, 137, 1, 138, 3, 139, 3, 140, 3, 141, 55, 142, 55, 143, 55, 144, 55, 145, 5, 146, 3, 147, 3, 0, 0, 0, 148, 148, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 149, 48, 150, 56, 0, 0, 0, 152, 151, -1, 4, 153, 48, 34, 2, 154, 3, 155, 4, 0, 9, 0, 157, 156, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 57, 7, 3, 8, 58, 158, 59, 159, 60, 160, 60, 161, 0, 162, 61, 163, 17, 0, 9, 0, 157, 164, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 62, 7, 3, 8, 58, 158, 63, 159, 60, 160, 60, 161, 0, 162, 64, 163, 17, 0, 9, 0, 157, 165, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 65, 7, 3, 8, 58, 158, 66, 159, 60, 160, 60, 161, 8, 162, 67, 163, 17, 0, 9, 0, 157, 166, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 68, 7, 3, 8, 58, 158, 69, 159, 60, 160, 60, 161, 8, 162, 70, 163, 17, 0 + -1, -1, 1, 0, -1, 28, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 8, 13, 9, 14, 10, 15, 8, 16, 5, 17, 11, 18, 3, 19, 3, 20, 0, 21, 8, 22, 12, 23, 8, 24, 0, 25, 0, 26, 2, 27, 3, 28, 13, 29, 14, 0, 0, 0, 31, 30, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 32, 15, 33, 0, 34, 2, 35, 8, 36, 8, 37, 5, 38, 16, 39, 17, 40, 18, 41, 8, 42, 19, 0, 1, 0, 44, 43, -1, 57, 2, 0, 3, 1, 4, 20, 5, 0, 45, 17, 6, 21, 7, 22, 8, 4, 46, 23, 47, 24, 48, 1, 49, 3, 50, 24, 51, 8, 52, 2, 53, 2, 54, 8, 55, 25, 56, 8, 57, 8, 58, 26, 59, 3, 60, 27, 61, 28, 62, 1, 63, 3, 64, 3, 65, 29, 66, 3, 67, 3, 68, 3, 69, 30, 70, 30, 71, 3, 72, 3, 73, 3, 74, 3, 75, 30, 76, 3, 77, 3, 78, 3, 79, 3, 80, 3, 81, 3, 82, 3, 83, 3, 84, 3, 85, 5, 86, 3, 87, 18, 88, 1, 89, 31, 90, 1, 91, 32, 92, 1, 93, 33, 94, 34, 0, 0, 0, 96, 95, -1, 17, 97, 17, 98, 3, 99, 35, 100, 36, 101, 37, 102, 38, 103, 39, 104, 40, 105, 41, 106, 42, 107, 43, 108, 44, 109, 45, 110, 0, 111, 30, 112, 46, 113, 47, 0, 0, 0, 115, 114, -1, 22, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 33, 0, 116, 8, 117, 0, 118, 3, 119, 4, 120, 48, 121, 48, 122, 49, 123, 49, 124, 0, 125, 0, 126, 50, 127, 50, 128, 50, 129, 50, 0, 0, 0, 131, 130, -1, 7, 2, 0, 3, 1, 4, 1, 5, 0, 6, 51, 7, 3, 8, 4, 0, 0, 0, 132, 132, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 52, 7, 3, 8, 53, 133, 6, 134, 8, 0, 0, 0, 136, 135, -1, 14, 137, 12, 138, 54, 139, 3, 140, 1, 141, 3, 142, 3, 143, 3, 144, 55, 145, 55, 146, 55, 147, 55, 148, 5, 149, 3, 150, 3, 0, 0, 0, 151, 151, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 152, 48, 153, 56, 0, 0, 0, 155, 154, -1, 4, 156, 48, 34, 2, 157, 3, 158, 4, 0, 9, 0, 160, 159, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 57, 7, 3, 8, 58, 161, 59, 162, 60, 163, 60, 164, 0, 165, 61, 166, 17, 0, 9, 0, 160, 167, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 62, 7, 3, 8, 58, 161, 63, 162, 60, 163, 60, 164, 0, 165, 64, 166, 17, 0, 9, 0, 160, 168, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 65, 7, 3, 8, 58, 161, 66, 162, 60, 163, 60, 164, 8, 165, 67, 166, 17, 0, 9, 0, 160, 169, -1, 13, 2, 0, 3, 1, 4, 1, 5, 0, 6, 68, 7, 3, 8, 58, 161, 69, 162, 60, 163, 60, 164, 8, 165, 70, 166, 17, 0 "conns" diff --git a/demos/2d/platformer/stage.xml b/demos/2d/platformer/stage.xml index b8a54537d8e..4f9cd899e5c 100644 --- a/demos/2d/platformer/stage.xml +++ b/demos/2d/platformer/stage.xml @@ -1,17 +1,17 @@ - - + + - - - + + + "names" - + "stage" "Node" "__meta__" @@ -104,15 +104,41 @@ "enemy 15" "parallax_bg" "ParallaxBackground" + "Label" + "margin/left" + "margin/top" + "margin/right" + "margin/bottom" + "focus_neighbour/left" + "focus_neighbour/top" + "focus_neighbour/right" + "focus_neighbour/bottom" + "focus/ignore_mouse" + "focus/stop_mouse" + "size_flags/horizontal" + "size_flags/stretch_ratio" + "range/min" + "range/max" + "range/step" + "range/page" + "range/value" + "range/exp_edit" + "rounded_values" + "text" + "align" + "valign" + "autowrap" + "uppercase" + "percent_visible" "version" 1 "conn_count" 0 "node_count" - 65 + 66 "variants" - + "__editor_plugin_states__" @@ -133,9 +159,9 @@ "pixel_snap" False "zoom" - 0.598736 + 1.108033 "ofs" - -37.7393, 205.061 + -19.8136, -223.194 "3D" @@ -297,7 +323,7 @@ 450, 0 2402.79, 849.52 - + False 2 @@ -313,9 +339,20 @@ 3546.2, 1356.19 2406.63, 815.115 + 12 + -202 + 358 + -10 + "" + 2 + 14 + 14.769231 + "This is a simple demo on how to make a platformer game with Godot. This version uses physics and the 2D physics engine for motion and collision. The demo also shows the benefits of using the scene system, where coins, enemies and the player are edited separatedly and instanced in the stage. To edit the base tiles for the tileset, open the tileset_edit.xml file and follow instructions. " + 0 + -1 "nodes" - -1, -1, 1, 0, -1, 1, 2, 0, 0, 0, 0, 4, 3, -1, 12, 5, 1, 6, 2, 7, 2, 8, 1, 9, 3, 10, 4, 11, 5, 12, 6, 13, 7, 14, 8, 15, 9, 2, 10, 0, 0, 0, 1, 16, -1, 1, 2, 11, 0, 2, 0, 18, 17, 12, 1, 9, 13, 0, 2, 0, 18, 19, 12, 1, 9, 14, 0, 2, 0, 18, 20, 12, 1, 9, 15, 0, 2, 0, 18, 21, 12, 1, 9, 16, 0, 2, 0, 18, 22, 12, 1, 9, 17, 0, 2, 0, 18, 23, 12, 1, 9, 18, 0, 2, 0, 18, 24, 12, 1, 9, 19, 0, 2, 0, 18, 25, 12, 1, 9, 20, 0, 2, 0, 18, 26, 12, 1, 9, 21, 0, 2, 0, 18, 27, 12, 1, 9, 22, 0, 2, 0, 18, 28, 12, 1, 9, 23, 0, 2, 0, 18, 29, 12, 1, 9, 24, 0, 2, 0, 18, 30, 12, 1, 9, 25, 0, 2, 0, 18, 31, 12, 1, 9, 26, 0, 2, 0, 18, 32, 12, 1, 9, 27, 0, 2, 0, 18, 33, 12, 1, 9, 28, 0, 2, 0, 18, 34, 12, 1, 9, 29, 0, 2, 0, 18, 35, 12, 1, 9, 30, 0, 2, 0, 18, 36, 12, 1, 9, 31, 0, 2, 0, 18, 37, 12, 1, 9, 32, 0, 2, 0, 18, 38, 12, 1, 9, 33, 0, 2, 0, 18, 39, 12, 1, 9, 34, 0, 2, 0, 18, 40, 12, 1, 9, 35, 0, 2, 0, 18, 41, 12, 1, 9, 36, 0, 2, 0, 18, 42, 12, 1, 9, 37, 0, 2, 0, 18, 43, 12, 1, 9, 38, 0, 2, 0, 18, 44, 12, 1, 9, 39, 0, 2, 0, 18, 45, 12, 1, 9, 40, 0, 2, 0, 18, 46, 12, 1, 9, 41, 0, 2, 0, 18, 47, 12, 1, 9, 42, 0, 2, 0, 18, 48, 12, 1, 9, 43, 0, 2, 0, 18, 49, 12, 1, 9, 44, 0, 2, 0, 18, 50, 12, 1, 9, 45, 0, 2, 0, 18, 51, 12, 1, 9, 46, 0, 2, 0, 18, 52, 12, 1, 9, 47, 0, 2, 0, 18, 53, 12, 1, 9, 48, 0, 2, 0, 18, 54, 12, 1, 9, 49, 0, 2, 0, 18, 55, 12, 1, 9, 50, 0, 2, 0, 18, 56, 12, 1, 9, 51, 0, 2, 0, 18, 57, 12, 1, 9, 52, 0, 2, 0, 18, 58, 12, 1, 9, 53, 0, 2, 0, 18, 59, 12, 1, 9, 54, 0, 0, 0, 61, 60, 55, 1, 9, 56, 0, 0, 0, 1, 62, -1, 0, 0, 46, 0, 64, 63, 57, 3, 9, 58, 65, 59, 66, 60, 0, 46, 0, 64, 67, 57, 3, 9, 61, 65, 62, 66, 63, 0, 46, 0, 64, 68, 57, 3, 9, 64, 65, 65, 66, 63, 0, 46, 0, 64, 69, 66, 1, 9, 67, 0, 0, 0, 71, 70, -1, 6, 72, 68, 73, 69, 74, 1, 75, 70, 76, 1, 77, 69, 0, 0, 0, 1, 78, -1, 0, 0, 52, 0, 61, 79, 71, 1, 9, 72, 0, 52, 0, 61, 80, 71, 1, 9, 73, 0, 52, 0, 61, 81, 71, 1, 9, 74, 0, 52, 0, 61, 82, 71, 1, 9, 75, 0, 52, 0, 61, 83, 71, 1, 9, 76, 0, 52, 0, 61, 84, 71, 1, 9, 77, 0, 52, 0, 61, 85, 71, 1, 9, 78, 0, 52, 0, 61, 86, 71, 1, 9, 79, 0, 52, 0, 61, 87, 71, 1, 9, 80, 0, 52, 0, 61, 88, 71, 1, 9, 81, 0, 52, 0, 61, 89, 71, 1, 9, 82, 0, 0, 0, 91, 90, 83, 0, 0 + -1, -1, 1, 0, -1, 1, 2, 0, 0, 0, 0, 4, 3, -1, 12, 5, 1, 6, 2, 7, 2, 8, 1, 9, 3, 10, 4, 11, 5, 12, 6, 13, 7, 14, 8, 15, 9, 2, 10, 0, 0, 0, 1, 16, -1, 1, 2, 11, 0, 2, 0, 18, 17, 12, 1, 9, 13, 0, 2, 0, 18, 19, 12, 1, 9, 14, 0, 2, 0, 18, 20, 12, 1, 9, 15, 0, 2, 0, 18, 21, 12, 1, 9, 16, 0, 2, 0, 18, 22, 12, 1, 9, 17, 0, 2, 0, 18, 23, 12, 1, 9, 18, 0, 2, 0, 18, 24, 12, 1, 9, 19, 0, 2, 0, 18, 25, 12, 1, 9, 20, 0, 2, 0, 18, 26, 12, 1, 9, 21, 0, 2, 0, 18, 27, 12, 1, 9, 22, 0, 2, 0, 18, 28, 12, 1, 9, 23, 0, 2, 0, 18, 29, 12, 1, 9, 24, 0, 2, 0, 18, 30, 12, 1, 9, 25, 0, 2, 0, 18, 31, 12, 1, 9, 26, 0, 2, 0, 18, 32, 12, 1, 9, 27, 0, 2, 0, 18, 33, 12, 1, 9, 28, 0, 2, 0, 18, 34, 12, 1, 9, 29, 0, 2, 0, 18, 35, 12, 1, 9, 30, 0, 2, 0, 18, 36, 12, 1, 9, 31, 0, 2, 0, 18, 37, 12, 1, 9, 32, 0, 2, 0, 18, 38, 12, 1, 9, 33, 0, 2, 0, 18, 39, 12, 1, 9, 34, 0, 2, 0, 18, 40, 12, 1, 9, 35, 0, 2, 0, 18, 41, 12, 1, 9, 36, 0, 2, 0, 18, 42, 12, 1, 9, 37, 0, 2, 0, 18, 43, 12, 1, 9, 38, 0, 2, 0, 18, 44, 12, 1, 9, 39, 0, 2, 0, 18, 45, 12, 1, 9, 40, 0, 2, 0, 18, 46, 12, 1, 9, 41, 0, 2, 0, 18, 47, 12, 1, 9, 42, 0, 2, 0, 18, 48, 12, 1, 9, 43, 0, 2, 0, 18, 49, 12, 1, 9, 44, 0, 2, 0, 18, 50, 12, 1, 9, 45, 0, 2, 0, 18, 51, 12, 1, 9, 46, 0, 2, 0, 18, 52, 12, 1, 9, 47, 0, 2, 0, 18, 53, 12, 1, 9, 48, 0, 2, 0, 18, 54, 12, 1, 9, 49, 0, 2, 0, 18, 55, 12, 1, 9, 50, 0, 2, 0, 18, 56, 12, 1, 9, 51, 0, 2, 0, 18, 57, 12, 1, 9, 52, 0, 2, 0, 18, 58, 12, 1, 9, 53, 0, 2, 0, 18, 59, 12, 1, 9, 54, 0, 0, 0, 61, 60, 55, 1, 9, 56, 0, 0, 0, 1, 62, -1, 0, 0, 46, 0, 64, 63, 57, 3, 9, 58, 65, 59, 66, 60, 0, 46, 0, 64, 67, 57, 3, 9, 61, 65, 62, 66, 63, 0, 46, 0, 64, 68, 57, 3, 9, 64, 65, 65, 66, 63, 0, 46, 0, 64, 69, 66, 1, 9, 67, 0, 0, 0, 71, 70, -1, 6, 72, 68, 73, 69, 74, 1, 75, 70, 76, 1, 77, 69, 0, 0, 0, 1, 78, -1, 0, 0, 52, 0, 61, 79, 71, 1, 9, 72, 0, 52, 0, 61, 80, 71, 1, 9, 73, 0, 52, 0, 61, 81, 71, 1, 9, 74, 0, 52, 0, 61, 82, 71, 1, 9, 75, 0, 52, 0, 61, 83, 71, 1, 9, 76, 0, 52, 0, 61, 84, 71, 1, 9, 77, 0, 52, 0, 61, 85, 71, 1, 9, 78, 0, 52, 0, 61, 86, 71, 1, 9, 79, 0, 52, 0, 61, 87, 71, 1, 9, 80, 0, 52, 0, 61, 88, 71, 1, 9, 81, 0, 52, 0, 61, 89, 71, 1, 9, 82, 0, 0, 0, 91, 90, 83, 0, 0, 0, 0, 92, 92, -1, 29, 5, 1, 6, 2, 7, 2, 8, 1, 93, 84, 94, 85, 95, 86, 96, 87, 97, 88, 98, 88, 99, 88, 100, 88, 101, 1, 102, 1, 103, 89, 104, 2, 105, 4, 106, 90, 107, 2, 108, 91, 109, 4, 110, 69, 111, 69, 112, 92, 113, 93, 114, 93, 115, 1, 116, 69, 117, 94, 0 "conns" diff --git a/demos/2d/platformer/tileset_edit.xml b/demos/2d/platformer/tileset_edit.xml index 4778a8f1e27..6d5b84deaa1 100644 --- a/demos/2d/platformer/tileset_edit.xml +++ b/demos/2d/platformer/tileset_edit.xml @@ -1,88 +1,68 @@ - - - - "" + + + 0 0, 8, 64, 8, 64, 64, 0, 64 - - - - "" - 0 - 0, 64, 0, 8, 56, 8, 56, 64 - + - "" 0 - 0, 64, 0, 0, 56, 0, 56, 64 - + 0, 64, 0, 8, 56, 8, 56, 64 + - "" 0 0, 64, 0, 0, 56, 0, 56, 64 - + - "" - 0 - 0, 64, 0, 0, 56, 0, 64, 8, 64, 64 - - - - "" - 0 - 0, 8, 64, 72, 64, 128, 0, 128 - - - - "" - 0 - 0, 64, 0, 8, 64, 8, 64, 64 - - - - "" - 0 - 0, 64, 0, 8, 64, 8, 64, 64 - - - - "" - 0 - 0, 0, 64, 0, 64, 64, 0, 64 - - - - "" 0 0, 64, 0, 0, 56, 0, 56, 64 - + + + + 0 + 0, 64, 0, 0, 56, 0, 64, 8, 64, 64 + + + + 0 + 0, 8, 64, 72, 64, 128, 0, 128 + + + + 0 + 0, 64, 0, 8, 64, 8, 64, 64 + + + + 0 + 0, 64, 0, 8, 64, 8, 64, 64 + + + + 0 + 0, 0, 64, 0, 64, 64, 0, 64 + + + + 0 + 0, 64, 0, 0, 56, 0, 56, 64 + - "" - + "names" - + "Node" - "process/process" - "process/fixed_process" - "process/input" - "process/unhandled_input" - "process/mode" - "script/script" "__meta__" "floor" "Sprite" "visibility/visible" - "visibility/toplevel" "visibility/opacity" "visibility/self_opacity" "visibility/on_top" - "visibility/blend_mode" - "transform/notify" "transform/pos" "transform/rot" "transform/scale" @@ -102,9 +82,12 @@ "shape_count" "shapes/0/shape" "shapes/0/transform" + "shapes/0/trigger" "simulate_motion" "constant_linear_velocity" "constant_angular_velocity" + "friction" + "bounce" "CollisionPolygon2D" "build_mode" "polygon" @@ -123,15 +106,10 @@ "ceiling2wall" "help" "Label" - "anchor/left" - "anchor/top" - "anchor/right" - "anchor/bottom" "margin/left" "margin/top" "margin/right" "margin/bottom" - "hint/tooltip" "focus_neighbour/left" "focus_neighbour/top" "focus_neighbour/right" @@ -139,7 +117,6 @@ "focus/ignore_mouse" "focus/stop_mouse" "size_flags/horizontal" - "size_flags/vertical" "size_flags/stretch_ratio" "range/min" "range/max" @@ -152,6 +129,8 @@ "align" "valign" "autowrap" + "uppercase" + "percent_visible" "version" 1 @@ -160,50 +139,98 @@ "node_count" 36 "variants" - - False - 0 - + + "__editor_plugin_states__" - + "2D" - + + "pixel_snap" + False "zoom" - 3.09087 + 1.360374 "ofs" - -2.41578, -57.0874 + 272.509, -91.6367 "3D" - + "zfar" 500 "fov" 45 - "window_mode" - 0 - "window_0" - - "distance" - 4 - "default_light" - True - "x_rot" - 0.337 - "y_rot" - -0.575 - "show_grid" - True - "show_origin" - True - "pos" - 0, 0, 0 - + "viewports" + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "distance" + 4 + "x_rot" + 0 + "y_rot" + 0 + "use_orthogonal" + False + "use_environment" + False + "pos" + 0, 0, 0 + + + "viewport_mode" + 1 + "default_light" + True + "show_grid" + True + "show_origin" + True "znear" 0.1 "__editor_run_settings__" - + "custom_args" "-l $scene" "run_mode" @@ -213,44 +240,45 @@ "2D" True - 1 + 0, 0 - 0 + 1, 1 - + + 1 + 1, 1, 1, 1 0, 0, 64, 64 - + 1, -0, 0, 1, 0, 0 - 2 64, 8, 64, 64, 0, 64, 0, 8 64, 0 64, 0, 64, 64 - + 0, 8, 56, 8, 56, 64, 0, 64 64, 64 64, 64, 64, 64 - + 0, 0, 56, 0, 56, 64, 0, 64 64, 128 320, 128, 128, 64 - + 64, 192 64, 128, 64, 64 - + 0, 0, 56, 0, 64, 8, 64, 64, 0, 64 256, 192 128, 128, 64, 128 - + 0, 8, 64, 72, 64, 128, 0, 128 128, 192 192, 192, 64, 64 - + 0, 64, 64, 64, 64, 8, 0, 8 192, 192 256, 192, 64, 64 - + 192, 128 256, 128, 64, 64 192, 64 @@ -261,25 +289,26 @@ 0, 64, 64, 64 0, 128 384, 64, 64, 64 - + 64, 0, 64, 64, 0, 64, 0, 0 0, 192 448, 64, 64, 64 - - 296 - 8 - 596 - 125 - "" - "" - 14 - "This scene serves as a tool for editing the tileset. Nodes (sprites) and their respective collisions are edited here. To create a tileset from this, a "TileSet" resoucre must be created. this resource adds a menu which allows generating of the tileset data from the scene. or optionally merge it if one already exists (by looking at identical tile names). Finally, the saved tileset resource (tileset.xml in this case), can be opened to be used into a TileMap node for editing a tile map. " + + + + + + + 2 + + "This scene serves as a tool for editing the tileset. Nodes (sprites) and their respective collisions are edited here. To create a tileset from this, a "TileSet" resoucre must be created. Use the helper in: Scene -< Convert To -< TileSet This will save a tileset. Saving over it will merge your changes. Finally, the saved tileset resource (tileset.xml in this case), can be opened to be used into a TileMap node for editing a tile map. " + -1 "nodes" - -1, -1, 0, 0, -1, 7, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 0, 0, 0, 9, 8, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 6, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 12, 6, 2, 0, 1, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 13, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 2, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 16, 6, 2, 0, 0, 0, 9, 42, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 17, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 18, 6, 2, 0, 4, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 19, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 5, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 20, 6, 2, 0, 0, 0, 9, 43, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 21, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 22, 6, 2, 0, 7, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 23, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 8, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 24, 6, 2, 0, 0, 0, 9, 44, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 25, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 26, 6, 2, 0, 10, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 27, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 11, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 24, 6, 2, 0, 0, 0, 9, 45, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 28, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 29, 6, 2, 0, 13, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 30, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 14, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 31, 6, 2, 0, 0, 0, 9, 46, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 32, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 33, 6, 2, 0, 16, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 34, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 17, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 35, 6, 2, 0, 0, 0, 9, 47, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 36, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 37, 6, 2, 0, 19, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 38, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 20, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 39, 6, 2, 0, 0, 0, 9, 48, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 40, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 41, 6, 2, 0, 22, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 42, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 23, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 39, 6, 2, 0, 0, 0, 9, 49, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 43, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 44, 6, 2, 0, 0, 0, 9, 50, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 45, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 46, 6, 2, 0, 0, 0, 9, 51, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 47, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 48, 6, 2, 0, 0, 0, 9, 52, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 49, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 50, 6, 2, 0, 0, 0, 9, 53, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 51, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 52, 6, 2, 0, 29, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 53, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 30, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 54, 6, 2, 0, 0, 0, 9, 54, -1, 27, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 17, 55, 18, 7, 19, 8, 20, 9, 21, 0, 22, 6, 23, 0, 24, 0, 25, 10, 26, 10, 27, 1, 28, 11, 29, 4, 30, 56, 6, 2, 0, 32, 0, 32, 31, -1, 22, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 33, 10, 34, 57, 35, 14, 36, 0, 37, 6, 38, 7, 6, 2, 0, 33, 0, 39, 39, -1, 18, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 4, 17, 6, 18, 7, 19, 8, 40, 15, 41, 24, 6, 2, 0, 0, 0, 56, 55, -1, 42, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 10, 4, 11, 0, 12, 5, 13, 5, 14, 4, 15, 1, 16, 0, 57, 1, 58, 1, 59, 1, 60, 1, 61, 58, 62, 59, 63, 60, 64, 61, 65, 62, 66, 63, 67, 63, 68, 63, 69, 63, 70, 4, 71, 4, 72, 15, 73, 1, 74, 5, 75, 7, 76, 64, 77, 5, 78, 64, 79, 7, 80, 0, 81, 0, 82, 65, 83, 1, 84, 1, 85, 0, 6, 2, 0 + -1, -1, 0, 0, -1, 1, 1, 0, 0, 0, 0, 3, 2, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 11, 0, 1, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 12, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 2, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 14, 0, 0, 0, 3, 36, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 15, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 16, 0, 4, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 17, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 5, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 18, 0, 0, 0, 3, 37, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 19, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 20, 0, 7, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 21, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 8, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 22, 0, 0, 0, 3, 38, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 23, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 24, 0, 10, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 25, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 11, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 22, 0, 0, 0, 3, 39, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 26, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 27, 0, 13, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 28, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 14, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 29, 0, 0, 0, 3, 40, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 30, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 31, 0, 16, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 32, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 17, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 33, 0, 0, 0, 3, 41, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 34, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 35, 0, 19, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 36, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 20, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 37, 0, 0, 0, 3, 42, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 38, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 39, 0, 22, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 40, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 23, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 37, 0, 0, 0, 3, 43, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 41, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 42, 0, 0, 0, 3, 44, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 43, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 44, 0, 0, 0, 3, 45, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 45, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 46, 0, 0, 0, 3, 46, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 47, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 48, 0, 0, 0, 3, 47, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 49, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 50, 0, 29, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 51, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 30, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 52, 0, 0, 0, 3, 48, -1, 18, 4, 1, 5, 2, 6, 2, 7, 1, 8, 53, 9, 4, 10, 5, 11, 6, 12, 7, 13, 3, 14, 7, 15, 7, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 54, 0, 32, 0, 23, 22, -1, 16, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 24, 8, 25, 55, 26, 13, 27, 7, 28, 7, 29, 3, 30, 4, 31, 2, 32, 4, 0, 33, 0, 33, 33, -1, 9, 4, 1, 5, 2, 6, 2, 7, 1, 8, 3, 9, 4, 10, 5, 34, 9, 35, 22, 0, 0, 0, 50, 49, -1, 29, 4, 1, 5, 2, 6, 2, 7, 1, 51, 56, 52, 57, 53, 58, 54, 59, 55, 60, 56, 60, 57, 60, 58, 60, 59, 1, 60, 1, 61, 61, 62, 2, 63, 4, 64, 62, 65, 2, 66, 62, 67, 4, 68, 7, 69, 7, 70, 63, 71, 9, 72, 9, 73, 7, 74, 7, 75, 64, 0 "conns" - + \ No newline at end of file diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 13a6aa72eee..46bc8997ff3 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -11027,6 +11027,9 @@ + Return the global, unscaled, screen pointer coordinates. + If the 2D viewport has been scaled, it may not work well + with [Camera] or controls. @@ -15411,6 +15414,7 @@ + explain ownership, and that node does not need to own itself @@ -15419,6 +15423,8 @@ + Pack will ignore any sub-nodes not owned by given + node. See [Node.set_owner]. @@ -17490,7 +17496,7 @@ - + @@ -18420,7 +18426,7 @@ - + @@ -20861,7 +20867,7 @@ - + @@ -21143,7 +21149,7 @@ Static mode (does not move, can't be moved). - + Rigid body, can move and rotate. diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index f0583121c68..d29ecd64bb9 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -7511,7 +7511,7 @@ void RasterizerGLES2::init() { pvr_supported=extensions.has("GL_IMG_texture_compression_pvrtc"); etc_supported=extensions.has("GL_OES_compressed_ETC1_RGB8_texture"); use_depth24 = extensions.has("GL_OES_depth24"); - s3tc_supported = extensions.has("GL_EXT_texture_compression_dxt1") || extensions.has("GL_EXT_texture_compression_s3tc"); + s3tc_supported = extensions.has("GL_EXT_texture_compression_dxt1") || extensions.has("GL_EXT_texture_compression_s3tc") || extensions.has("WEBGL_compressed_texture_s3tc"); use_half_float = extensions.has("GL_OES_vertex_half_float"); diff --git a/main/main.cpp b/main/main.cpp index 21fb61c81ee..305cc88be7d 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -202,7 +202,7 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas for(int i=0;i::Element *I=args.front(); @@ -1037,18 +1037,24 @@ bool Main::start() { if (!absolute) { - int sep=local_game_path.find_last("/"); + if (Globals::get_singleton()->is_using_datapack()) { + + local_game_path="res://"+local_game_path; - if (sep==-1) { - DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - local_game_path=da->get_current_dir()+"/"+local_game_path; - memdelete(da) ; } else { + int sep=local_game_path.find_last("/"); - DirAccess *da = DirAccess::open(local_game_path.substr(0,sep)); - if (da) { - local_game_path=da->get_current_dir()+"/"+local_game_path.substr(sep+1,local_game_path.length());; - memdelete(da); + if (sep==-1) { + DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + local_game_path=da->get_current_dir()+"/"+local_game_path; + memdelete(da) ; + } else { + + DirAccess *da = DirAccess::open(local_game_path.substr(0,sep)); + if (da) { + local_game_path=da->get_current_dir()+"/"+local_game_path.substr(sep+1,local_game_path.length());; + memdelete(da); + } } } diff --git a/platform/android/.old/os_android.cpp b/platform/android/.old/os_android.cpp index ecd87a3af91..9fbfaedd3dd 100644 --- a/platform/android/.old/os_android.cpp +++ b/platform/android/.old/os_android.cpp @@ -223,6 +223,7 @@ void OS_Android::process_touch(int p_what,int p_pointer, const Vector& ev.mouse_button.y=touch[0].pos.y; ev.mouse_button.global_x=touch[0].pos.x; ev.mouse_button.global_y=touch[0].pos.y; + input->set_mouse_pos(Point2(ev.mouse_button.x,ev.mouse_button.y)); main_loop->input_event(ev); @@ -259,6 +260,7 @@ void OS_Android::process_touch(int p_what,int p_pointer, const Vector& ev.mouse_button.global_x=touch[0].pos.x; ev.mouse_button.global_y=touch[0].pos.y; last_mouse=touch[0].pos; + input->set_mouse_pos(Point2(ev.mouse_button.x,ev.mouse_button.y)); main_loop->input_event(ev); } diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index 9677c18c173..3cdca68595a 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -165,7 +165,7 @@ static int frame_count = 0; printf("**************** app delegate init\n"); CGRect rect = [[UIScreen mainScreen] bounds]; - [application setStatusBarHidden:YES animation:NO]; + [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; // disable idle timer application.idleTimerDisabled = YES; diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index 50fa4f8815a..cd2e24216ae 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -178,10 +178,11 @@ static void _fix_files(Vector& html,uint64_t p_data_size) { } CharString cs = strnew.utf8(); - html.resize(cs.size()); - for(int i=9;iget_transform(); - *pre_xform=new_xform; - set_block_transform_notify(true); - set_global_transform(new_xform); - set_block_transform_notify(false); - - setting=false; - - -} - +#if 0 void StaticBody2D::_update_xform() { if (!pre_xform || !pending) @@ -112,58 +92,7 @@ void StaticBody2D::_update_xform() { pending=false; } - -void StaticBody2D::_notification(int p_what) { - - switch(p_what) { - - case NOTIFICATION_ENTER_SCENE: { - - if (pre_xform) - *pre_xform = get_global_transform(); - pending=false; - } break; - case NOTIFICATION_TRANSFORM_CHANGED: { - - if (simulating_motion && !pending && is_inside_scene() && !setting && !get_scene()->is_editor_hint()) { - - - call_deferred(SceneStringNames::get_singleton()->_update_xform); - pending=true; - } - - } break; - } - - -} - -void StaticBody2D::set_simulate_motion(bool p_enable) { - - if (p_enable==simulating_motion) - return; - simulating_motion=p_enable; - - if (p_enable) { - pre_xform = memnew( Matrix32 ); - if (is_inside_scene()) - *pre_xform=get_transform(); -// query = Physics2DServer::get_singleton()->query_create(this,"_state_notify",Variant()); - // Physics2DServer::get_singleton()->query_body_direct_state(query,get_rid()); - Physics2DServer::get_singleton()->body_set_force_integration_callback(get_rid(),this,"_state_notify"); - - } else { - memdelete( pre_xform ); - pre_xform=NULL; - Physics2DServer::get_singleton()->body_set_force_integration_callback(get_rid(),NULL,StringName()); - pending=false; - } -} - -bool StaticBody2D::is_simulating_motion() const { - - return simulating_motion; -} +#endif void StaticBody2D::set_friction(real_t p_friction){ @@ -194,10 +123,6 @@ real_t StaticBody2D::get_bounce() const{ void StaticBody2D::_bind_methods() { - ObjectTypeDB::bind_method(_MD("set_simulate_motion","enabled"),&StaticBody2D::set_simulate_motion); - ObjectTypeDB::bind_method(_MD("is_simulating_motion"),&StaticBody2D::is_simulating_motion); - ObjectTypeDB::bind_method(_MD("_update_xform"),&StaticBody2D::_update_xform); - ObjectTypeDB::bind_method(_MD("_state_notify"),&StaticBody2D::_state_notify); ObjectTypeDB::bind_method(_MD("set_constant_linear_velocity","vel"),&StaticBody2D::set_constant_linear_velocity); ObjectTypeDB::bind_method(_MD("set_constant_angular_velocity","vel"),&StaticBody2D::set_constant_angular_velocity); ObjectTypeDB::bind_method(_MD("get_constant_linear_velocity"),&StaticBody2D::get_constant_linear_velocity); @@ -208,7 +133,6 @@ void StaticBody2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_bounce","bounce"),&StaticBody2D::set_bounce); ObjectTypeDB::bind_method(_MD("get_bounce"),&StaticBody2D::get_bounce); - ADD_PROPERTY(PropertyInfo(Variant::BOOL,"simulate_motion"),_SCS("set_simulate_motion"),_SCS("is_simulating_motion")); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"constant_linear_velocity"),_SCS("set_constant_linear_velocity"),_SCS("get_constant_linear_velocity")); ADD_PROPERTY(PropertyInfo(Variant::REAL,"constant_angular_velocity"),_SCS("set_constant_angular_velocity"),_SCS("get_constant_angular_velocity")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"friction",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_friction"),_SCS("get_friction")); @@ -217,10 +141,6 @@ void StaticBody2D::_bind_methods() { StaticBody2D::StaticBody2D() : PhysicsBody2D(Physics2DServer::BODY_MODE_STATIC) { - simulating_motion=false; - pre_xform=NULL; - setting=false; - pending=false; constant_angular_velocity=0; bounce=0; friction=1; @@ -230,10 +150,6 @@ StaticBody2D::StaticBody2D() : PhysicsBody2D(Physics2DServer::BODY_MODE_STATIC) StaticBody2D::~StaticBody2D() { - if (pre_xform) - memdelete(pre_xform); - //if (query.is_valid()) - // Physics2DServer::get_singleton()->free(query); } @@ -385,7 +301,7 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { toadd[i].id=obj; toadd[i].shape=shape; - bool found=false; +// bool found=false; Map::Element *E=contact_monitor->body_map.find(obj); if (!E) { @@ -437,7 +353,8 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { } set_block_transform_notify(true); // don't want notify (would feedback loop) - set_global_transform(state->get_transform()); + if (mode!=MODE_KINEMATIC) + set_global_transform(state->get_transform()); linear_velocity=state->get_linear_velocity(); angular_velocity=state->get_angular_velocity(); active=!state->is_sleeping(); @@ -448,10 +365,6 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { state=NULL; } -void RigidBody2D::_notification(int p_what) { - - -} void RigidBody2D::set_mode(Mode p_mode) { @@ -467,9 +380,9 @@ void RigidBody2D::set_mode(Mode p_mode) { Physics2DServer::get_singleton()->body_set_mode(get_rid(),Physics2DServer::BODY_MODE_STATIC); } break; - case MODE_STATIC_ACTIVE: { + case MODE_KINEMATIC: { - Physics2DServer::get_singleton()->body_set_mode(get_rid(),Physics2DServer::BODY_MODE_STATIC_ACTIVE); + Physics2DServer::get_singleton()->body_set_mode(get_rid(),Physics2DServer::BODY_MODE_KINEMATIC); } break; case MODE_CHARACTER: { @@ -643,16 +556,17 @@ Vector2 RigidBody2D::get_applied_force() const { return Physics2DServer::get_singleton()->body_get_applied_force(get_rid()); }; -void RigidBody2D::set_use_continuous_collision_detection(bool p_enable) { - ccd=p_enable; - Physics2DServer::get_singleton()->body_set_enable_continuous_collision_detection(get_rid(),p_enable); +void RigidBody2D::set_continuous_collision_detection_mode(CCDMode p_mode) { + + ccd_mode=p_mode; + Physics2DServer::get_singleton()->body_set_continuous_collision_detection_mode(get_rid(),Physics2DServer::CCDMode(p_mode)); + } -bool RigidBody2D::is_using_continuous_collision_detection() const { +RigidBody2D::CCDMode RigidBody2D::get_continuous_collision_detection_mode() const { - - return ccd; + return ccd_mode; } @@ -716,8 +630,8 @@ void RigidBody2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_contact_monitor","enabled"),&RigidBody2D::set_contact_monitor); ObjectTypeDB::bind_method(_MD("is_contact_monitor_enabled"),&RigidBody2D::is_contact_monitor_enabled); - ObjectTypeDB::bind_method(_MD("set_use_continuous_collision_detection","enable"),&RigidBody2D::set_use_continuous_collision_detection); - ObjectTypeDB::bind_method(_MD("is_using_continuous_collision_detection"),&RigidBody2D::is_using_continuous_collision_detection); + ObjectTypeDB::bind_method(_MD("set_continuous_collision_detection_mode","mode"),&RigidBody2D::set_continuous_collision_detection_mode); + ObjectTypeDB::bind_method(_MD("get_continuous_collision_detection_mode"),&RigidBody2D::get_continuous_collision_detection_mode); ObjectTypeDB::bind_method(_MD("set_axis_velocity","axis_velocity"),&RigidBody2D::set_axis_velocity); ObjectTypeDB::bind_method(_MD("apply_impulse","pos","impulse"),&RigidBody2D::apply_impulse); @@ -737,13 +651,13 @@ void RigidBody2D::_bind_methods() { BIND_VMETHOD(MethodInfo("_integrate_forces",PropertyInfo(Variant::OBJECT,"state:Physics2DDirectBodyState"))); - ADD_PROPERTY( PropertyInfo(Variant::INT,"mode",PROPERTY_HINT_ENUM,"Rigid,Static,Character,Static Active"),_SCS("set_mode"),_SCS("get_mode")); + ADD_PROPERTY( PropertyInfo(Variant::INT,"mode",PROPERTY_HINT_ENUM,"Rigid,Static,Character,Kinematic"),_SCS("set_mode"),_SCS("get_mode")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"mass",PROPERTY_HINT_EXP_RANGE,"0.01,65535,0.01"),_SCS("set_mass"),_SCS("get_mass")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"weight",PROPERTY_HINT_EXP_RANGE,"0.01,65535,0.01",PROPERTY_USAGE_EDITOR),_SCS("set_weight"),_SCS("get_weight")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"friction",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_friction"),_SCS("get_friction")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"bounce",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_bounce"),_SCS("get_bounce")); ADD_PROPERTY( PropertyInfo(Variant::BOOL,"custom_integrator"),_SCS("set_use_custom_integrator"),_SCS("is_using_custom_integrator")); - ADD_PROPERTY( PropertyInfo(Variant::BOOL,"continuous_cd"),_SCS("set_use_continuous_collision_detection"),_SCS("is_using_continuous_collision_detection")); + ADD_PROPERTY( PropertyInfo(Variant::INT,"continuous_cd",PROPERTY_HINT_ENUM,"Disabled,Cast Ray,Cast Shape"),_SCS("set_continuous_collision_detection_mode"),_SCS("get_continuous_collision_detection_mode")); ADD_PROPERTY( PropertyInfo(Variant::INT,"contacts_reported"),_SCS("set_max_contacts_reported"),_SCS("get_max_contacts_reported")); ADD_PROPERTY( PropertyInfo(Variant::BOOL,"contact_monitor"),_SCS("set_contact_monitor"),_SCS("is_contact_monitor_enabled")); ADD_PROPERTY( PropertyInfo(Variant::BOOL,"active"),_SCS("set_active"),_SCS("is_active")); @@ -757,9 +671,14 @@ void RigidBody2D::_bind_methods() { ADD_SIGNAL( MethodInfo("body_exit",PropertyInfo(Variant::OBJECT,"body"))); BIND_CONSTANT( MODE_STATIC ); - BIND_CONSTANT( MODE_STATIC_ACTIVE ); + BIND_CONSTANT( MODE_KINEMATIC ); BIND_CONSTANT( MODE_RIGID ); BIND_CONSTANT( MODE_CHARACTER ); + + BIND_CONSTANT( CCD_MODE_DISABLED ); + BIND_CONSTANT( CCD_MODE_CAST_RAY ); + BIND_CONSTANT( CCD_MODE_CAST_SHAPE ); + } RigidBody2D::RigidBody2D() : PhysicsBody2D(Physics2DServer::BODY_MODE_RIGID) { @@ -774,7 +693,7 @@ RigidBody2D::RigidBody2D() : PhysicsBody2D(Physics2DServer::BODY_MODE_RIGID) { angular_velocity=0; active=true; - ccd=false; + ccd_mode=CCD_MODE_DISABLED; custom_integrator=false; contact_monitor=NULL; @@ -790,5 +709,401 @@ RigidBody2D::~RigidBody2D() { +} + +////////////////////////// + + +Variant KinematicBody2D::_get_collider() const { + + ObjectID oid=get_collider(); + if (oid==0) + return Variant(); + Object *obj = ObjectDB::get_instance(oid); + if (!obj) + return Variant(); + + Reference *ref = obj->cast_to(); + if (ref) { + return Ref(ref); + } + + return obj; +} + + +bool KinematicBody2D::_ignores_mode(Physics2DServer::BodyMode p_mode) const { + + switch(p_mode) { + case Physics2DServer::BODY_MODE_STATIC: return !collide_static; + case Physics2DServer::BODY_MODE_KINEMATIC: return !collide_kinematic; + case Physics2DServer::BODY_MODE_RIGID: return !collide_rigid; + case Physics2DServer::BODY_MODE_CHARACTER: return !collide_character; + } + + return true; +} + +bool KinematicBody2D::is_trapped() const { + + ERR_FAIL_COND_V(!is_inside_scene(),false); + + Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(get_world_2d()->get_space()); + ERR_FAIL_COND_V(!dss,false); + + const int max_shapes=32; + Physics2DDirectSpaceState::ShapeResult sr[max_shapes]; + + Set exclude; + exclude.insert(get_rid()); + + + for(int i=0;iintersect_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i),Vector2(),sr,max_shapes,exclude); + + for(int j=0;jbody_get_mode(sr[j].rid); + if (!_ignores_mode(bm)) { + return true; //it's indeed trapped + } + + } + + } + + return false; + +} +void KinematicBody2D::untrap() { + + //this is reaaaaaaaaally wild, will probably only work for simple cases + ERR_FAIL_COND(!is_inside_scene()); + + Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(get_world_2d()->get_space()); + ERR_FAIL_COND(!dss); + + const int max_shapes=32; + Physics2DDirectSpaceState::ShapeResult sr[max_shapes]; + const int max_contacts=8; + Vector2 pairs[max_contacts*2]; + + Set exclude; + exclude.insert(get_rid()); + + Vector2 untrap_vec; + + for(int i=0;iintersect_shape(get_shape(i)->get_rid(), shape_xform,Vector2(),sr,max_shapes,exclude); + + for(int j=0;jbody_get_mode(sr[j].rid); + if (_ignores_mode(bm)) { + exclude.insert(sr[j].rid); + } else { + + int rc; + bool c = Physics2DServer::get_singleton()->body_collide_shape(sr[j].rid,sr[j].shape,get_shape(i)->get_rid(),shape_xform,Vector2(),pairs,max_contacts,rc); + + if (c) { + + for(int k=0;kspace_get_direct_state(get_world_2d()->get_space()); + ERR_FAIL_COND_V(!dss,Vector2()); + const int max_shapes=32; + Physics2DDirectSpaceState::ShapeResult sr[max_shapes]; + + float best_travel = 1e20; + Physics2DDirectSpaceState::MotionCastCollision mcc_final; + Set exclude; + exclude.insert(get_rid()); + + print_line("pos: "+get_global_pos()); + print_line("mlen: "+p_motion); + + if (!collide_static || ! collide_rigid || !collide_character || !collide_kinematic) { + //fill exclude list.. + for(int i=0;iintersect_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i),p_motion,sr,max_shapes,exclude); + + for(int j=0;jbody_get_mode(sr[j].rid); + if (_ignores_mode(bm)) { + exclude.insert(sr[j].rid); + } else { + // print_line("DANGER???"); + } + } + } + } + + for(int i=0;icast_motion(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i), p_motion, mcc,exclude,0); + if (res==false) + continue; + if (mcc.travel<=0) { + //uh it's trapped + colliding=false; + return p_motion; + } + if (mcc.travel < best_travel) { + + mcc_final=mcc; + best_travel=mcc.travel; + } + } + + float motion; + Vector2 motion_ret; + Vector2 push; + if (best_travel>1) { + //not collided + colliding=false; + motion=p_motion.length(); //no stopped + } else { + + colliding=true; + collision=mcc_final.point; + normal=mcc_final.normal; + collider=mcc_final.collider_id; + Vector2 mnormal=p_motion.normalized(); + + float sine = Math::abs(mnormal.dot(normal)); + float retreat=0; + motion = p_motion.length()*mcc_final.travel; + + if (sine==0) { + //something odd going on, do not allow motion? + + retreat=motion; + + } else { + + retreat = margin/sine; + if (retreat>motion) + retreat=motion; + } + + motion_ret=p_motion.normalized() * ( p_motion.length() - motion); + motion-=retreat; + + + } + + Matrix32 gt = get_global_transform(); + gt.elements[2]+=p_motion.normalized()*motion; + set_global_transform(gt); + + return motion_ret; + +} + +Vector2 KinematicBody2D::move_to(const Vector2& p_position) { + + return move(p_position-get_global_pos()); +} + +bool KinematicBody2D::can_move_to(const Vector2& p_position) { + + ERR_FAIL_COND_V(!is_inside_scene(),false); + Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(get_world_2d()->get_space()); + ERR_FAIL_COND_V(!dss,false); + + const int max_shapes=32; + Physics2DDirectSpaceState::ShapeResult sr[max_shapes]; + + Vector2 motion = p_position-get_global_pos(); + + Physics2DDirectSpaceState::MotionCastCollision mcc_final; + Set exclude; + exclude.insert(get_rid()); + + //fill exclude list.. + for(int i=0;iintersect_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i),motion,sr,max_shapes,exclude); + + for(int j=0;jbody_get_mode(sr[j].rid); + if (_ignores_mode(bm)) { + exclude.insert(sr[j].rid); + continue; + } + + return false; //omg collided + + } + } + + return true; +} + +bool KinematicBody2D::is_colliding() const { + + ERR_FAIL_COND_V(!is_inside_scene(),false); + + return colliding; +} +Vector2 KinematicBody2D::get_collision_pos() const { + + ERR_FAIL_COND_V(!colliding,Vector2()); + return collision; + +} +Vector2 KinematicBody2D::get_collision_normal() const { + + ERR_FAIL_COND_V(!colliding,Vector2()); + return normal; + +} +ObjectID KinematicBody2D::get_collider() const { + + ERR_FAIL_COND_V(!colliding,0); + return collider; +} + +void KinematicBody2D::set_collide_with_static_bodies(bool p_enable) { + + collide_static=p_enable; +} +bool KinematicBody2D::can_collide_with_static_bodies() const { + + return collide_static; +} + +void KinematicBody2D::set_collide_with_rigid_bodies(bool p_enable) { + + collide_rigid=p_enable; + +} +bool KinematicBody2D::can_collide_with_rigid_bodies() const { + + + return collide_rigid; +} + +void KinematicBody2D::set_collide_with_kinematic_bodies(bool p_enable) { + + collide_kinematic=p_enable; + +} +bool KinematicBody2D::can_collide_with_kinematic_bodies() const { + + return collide_kinematic; +} + +void KinematicBody2D::set_collide_with_character_bodies(bool p_enable) { + + collide_character=p_enable; +} +bool KinematicBody2D::can_collide_with_character_bodies() const { + + return collide_character; +} + +void KinematicBody2D::set_collision_margin(float p_margin) { + + margin=p_margin; +} + +float KinematicBody2D::get_collision_margin() const{ + + return margin; +} + +void KinematicBody2D::_bind_methods() { + + + ObjectTypeDB::bind_method(_MD("is_trapped"),&KinematicBody2D::is_trapped); + ObjectTypeDB::bind_method(_MD("untrap"),&KinematicBody2D::untrap); + + ObjectTypeDB::bind_method(_MD("move","rel_vec"),&KinematicBody2D::move); + ObjectTypeDB::bind_method(_MD("move_to","position"),&KinematicBody2D::move_to); + + ObjectTypeDB::bind_method(_MD("can_move_to","position"),&KinematicBody2D::can_move_to); + + ObjectTypeDB::bind_method(_MD("is_colliding"),&KinematicBody2D::is_colliding); + + ObjectTypeDB::bind_method(_MD("get_collision_pos"),&KinematicBody2D::get_collision_pos); + ObjectTypeDB::bind_method(_MD("get_collision_normal"),&KinematicBody2D::get_collision_normal); + ObjectTypeDB::bind_method(_MD("get_collider:Object"),&KinematicBody2D::get_collider); + + + ObjectTypeDB::bind_method(_MD("set_collide_with_static_bodies","enable"),&KinematicBody2D::set_collide_with_static_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_static_bodies"),&KinematicBody2D::can_collide_with_static_bodies); + + ObjectTypeDB::bind_method(_MD("set_collide_with_kinematic_bodies","enable"),&KinematicBody2D::set_collide_with_kinematic_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_kinematic_bodies"),&KinematicBody2D::can_collide_with_kinematic_bodies); + + ObjectTypeDB::bind_method(_MD("set_collide_with_rigid_bodies","enable"),&KinematicBody2D::set_collide_with_rigid_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_rigid_bodies"),&KinematicBody2D::can_collide_with_rigid_bodies); + + ObjectTypeDB::bind_method(_MD("set_collide_with_character_bodies","enable"),&KinematicBody2D::set_collide_with_character_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_character_bodies"),&KinematicBody2D::can_collide_with_character_bodies); + + ObjectTypeDB::bind_method(_MD("set_collision_margin","pixels"),&KinematicBody2D::set_collision_margin); + ObjectTypeDB::bind_method(_MD("get_collision_margin","pixels"),&KinematicBody2D::get_collision_margin); + + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/static"),_SCS("set_collide_with_static_bodies"),_SCS("can_collide_with_static_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/kinematic"),_SCS("set_collide_with_kinematic_bodies"),_SCS("can_collide_with_kinematic_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/rigid"),_SCS("set_collide_with_rigid_bodies"),_SCS("can_collide_with_rigid_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/character"),_SCS("set_collide_with_character_bodies"),_SCS("can_collide_with_character_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::REAL,"collision/margin",PROPERTY_HINT_RANGE,"0.01,256,0.01"),_SCS("set_collision_margin"),_SCS("get_collision_margin")); + + +} + +KinematicBody2D::KinematicBody2D() : PhysicsBody2D(Physics2DServer::BODY_MODE_KINEMATIC){ + + collide_static=true; + collide_rigid=true; + collide_kinematic=true; + collide_character=true; + + colliding=false; + collider=0; + + margin=1; +} +KinematicBody2D::~KinematicBody2D() { + + } diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index 9eff59d8a75..6596c0ce04a 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -52,15 +52,8 @@ class StaticBody2D : public PhysicsBody2D { OBJ_TYPE(StaticBody2D,PhysicsBody2D); - Matrix32 *pre_xform; - //RID query; - bool setting; - bool pending; - bool simulating_motion; Vector2 constant_linear_velocity; real_t constant_angular_velocity; - void _update_xform(); - void _state_notify(Object *p_object); real_t bounce; real_t friction; @@ -68,7 +61,6 @@ class StaticBody2D : public PhysicsBody2D { protected: - void _notification(int p_what); static void _bind_methods(); public: @@ -79,8 +71,6 @@ public: void set_bounce(real_t p_bounce); real_t get_bounce() const; - void set_simulate_motion(bool p_enable); - bool is_simulating_motion() const; void set_constant_linear_velocity(const Vector2& p_vel); void set_constant_angular_velocity(real_t p_vel); @@ -102,8 +92,15 @@ public: MODE_RIGID, MODE_STATIC, MODE_CHARACTER, - MODE_STATIC_ACTIVE, + MODE_KINEMATIC, }; + + enum CCDMode { + CCD_MODE_DISABLED, + CCD_MODE_CAST_RAY, + CCD_MODE_CAST_SHAPE, + }; + private: bool can_sleep; @@ -117,13 +114,14 @@ private: Vector2 linear_velocity; real_t angular_velocity; bool active; - bool ccd; int max_contacts_reported; bool custom_integrator; + CCDMode ccd_mode; + struct ShapePair { @@ -173,7 +171,6 @@ private: protected: - void _notification(int p_what); static void _bind_methods(); public: @@ -215,8 +212,8 @@ public: void set_max_contacts_reported(int p_amount); int get_max_contacts_reported() const; - void set_use_continuous_collision_detection(bool p_enable); - bool is_using_continuous_collision_detection() const; + void set_continuous_collision_detection_mode(CCDMode p_mode); + CCDMode get_continuous_collision_detection_mode() const; void apply_impulse(const Vector2& p_pos, const Vector2& p_impulse); @@ -229,4 +226,65 @@ public: }; VARIANT_ENUM_CAST(RigidBody2D::Mode); +VARIANT_ENUM_CAST(RigidBody2D::CCDMode); + + + +class KinematicBody2D : public PhysicsBody2D { + + OBJ_TYPE(KinematicBody2D,PhysicsBody2D); + + float margin; + bool collide_static; + bool collide_rigid; + bool collide_kinematic; + bool collide_character; + + bool colliding; + Vector2 collision; + Vector2 normal; + ObjectID collider; + + + Variant _get_collider() const; + + _FORCE_INLINE_ bool _ignores_mode(Physics2DServer::BodyMode) const; +protected: + + static void _bind_methods(); +public: + + bool is_trapped() const; + void untrap(); + + Vector2 move(const Vector2& p_motion); + Vector2 move_to(const Vector2& p_position); + + bool can_move_to(const Vector2& p_position); + bool is_colliding() const; + Vector2 get_collision_pos() const; + Vector2 get_collision_normal() const; + ObjectID get_collider() const; + + void set_collide_with_static_bodies(bool p_enable); + bool can_collide_with_static_bodies() const; + + void set_collide_with_rigid_bodies(bool p_enable); + bool can_collide_with_rigid_bodies() const; + + void set_collide_with_kinematic_bodies(bool p_enable); + bool can_collide_with_kinematic_bodies() const; + + void set_collide_with_character_bodies(bool p_enable); + bool can_collide_with_character_bodies() const; + + void set_collision_margin(float p_margin); + float get_collision_margin() const; + + KinematicBody2D(); + ~KinematicBody2D(); + +}; + + #endif // PHYSICS_BODY_2D_H diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp index 0265ec4df2f..ad9a76ee351 100644 --- a/scene/2d/sprite.cpp +++ b/scene/2d/sprite.cpp @@ -105,7 +105,7 @@ void Sprite::set_texture(const Ref& p_texture) { } texture=p_texture; if (texture.is_valid()) { - texture->set_flags(texture->get_flags()&(~Texture::FLAG_REPEAT)); //remove repeat from texture, it looks bad in sprites + texture->set_flags(texture->get_flags()); //remove repeat from texture, it looks bad in sprites texture->connect(CoreStringNames::get_singleton()->changed,this,SceneStringNames::get_singleton()->update); } update(); diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 26efa99a886..b9e44d50530 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -181,7 +181,7 @@ void TileMap::_update_dirty_quadrants() { if (!tile_set->has_tile(c.id)) continue; Ref tex = tile_set->tile_get_texture(c.id); - Vector2 tile_ofs = tile_set->tile_get_offset(c.id); + Vector2 tile_ofs = tile_set->tile_get_texture_offset(c.id); Vector2 offset = Point2( E->key().x, E->key().y )*cell_size - q.pos; @@ -215,6 +215,7 @@ void TileMap::_update_dirty_quadrants() { rect.size.y=-rect.size.y; + rect.pos+=tile_ofs; if (r==Rect2()) { tex->draw_rect(q.canvas_item,rect); @@ -231,8 +232,9 @@ void TileMap::_update_dirty_quadrants() { Ref shape = shapes[i]; if (shape.is_valid()) { + Vector2 shape_ofs = tile_set->tile_get_shape_offset(c.id); Matrix32 xform; - xform.set_origin(offset.floor()); + xform.set_origin(offset.floor()+shape_ofs); if (c.flip_h) { xform.elements[0]=-xform.elements[0]; xform.elements[2].x+=s.x; @@ -242,6 +244,7 @@ void TileMap::_update_dirty_quadrants() { xform.elements[2].y+=s.y; } + ps->body_add_shape(q.static_body,shape->get_rid(),xform); } } diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index e42a96cc4ef..0733a9196e7 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -434,9 +434,9 @@ void RigidBody::set_mode(Mode p_mode) { PhysicsServer::get_singleton()->body_set_mode(get_rid(),PhysicsServer::BODY_MODE_CHARACTER); } break; - case MODE_STATIC_ACTIVE: { + case MODE_KINEMATIC: { - PhysicsServer::get_singleton()->body_set_mode(get_rid(),PhysicsServer::BODY_MODE_STATIC_ACTIVE); + PhysicsServer::get_singleton()->body_set_mode(get_rid(),PhysicsServer::BODY_MODE_KINEMATIC); } break; } @@ -684,7 +684,7 @@ void RigidBody::_bind_methods() { BIND_VMETHOD(MethodInfo("_integrate_forces",PropertyInfo(Variant::OBJECT,"state:PhysicsDirectBodyState"))); - ADD_PROPERTY( PropertyInfo(Variant::INT,"mode",PROPERTY_HINT_ENUM,"Rigid,Static,Character,Static Active"),_SCS("set_mode"),_SCS("get_mode")); + ADD_PROPERTY( PropertyInfo(Variant::INT,"mode",PROPERTY_HINT_ENUM,"Rigid,Static,Character,Kinematic"),_SCS("set_mode"),_SCS("get_mode")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"mass",PROPERTY_HINT_EXP_RANGE,"0.01,65535,0.01"),_SCS("set_mass"),_SCS("get_mass")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"weight",PROPERTY_HINT_EXP_RANGE,"0.01,65535,0.01",PROPERTY_USAGE_EDITOR),_SCS("set_weight"),_SCS("get_weight")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"friction",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_friction"),_SCS("get_friction")); @@ -704,7 +704,7 @@ void RigidBody::_bind_methods() { ADD_SIGNAL( MethodInfo("body_exit",PropertyInfo(Variant::OBJECT,"body"))); BIND_CONSTANT( MODE_STATIC ); - BIND_CONSTANT( MODE_STATIC_ACTIVE ); + BIND_CONSTANT( MODE_KINEMATIC ); BIND_CONSTANT( MODE_RIGID ); BIND_CONSTANT( MODE_CHARACTER ); } diff --git a/scene/3d/physics_body.h b/scene/3d/physics_body.h index 0cb24075bda..a5faa9857be 100644 --- a/scene/3d/physics_body.h +++ b/scene/3d/physics_body.h @@ -92,7 +92,7 @@ public: MODE_RIGID, MODE_STATIC, MODE_CHARACTER, - MODE_STATIC_ACTIVE, + MODE_KINEMATIC, }; private: diff --git a/scene/io/resource_format_image.cpp b/scene/io/resource_format_image.cpp index d71f544628f..98453bcabb3 100644 --- a/scene/io/resource_format_image.cpp +++ b/scene/io/resource_format_image.cpp @@ -135,7 +135,7 @@ RES ResourceFormatLoaderImage::load(const String &p_path,const String& p_origina flags|=Texture::FLAG_FILTER; if (bool(GLOBAL_DEF("texture_import/gen_mipmaps",true))) flags|=Texture::FLAG_MIPMAPS; - if (bool(GLOBAL_DEF("texture_import/repeat",true))) + if (bool(GLOBAL_DEF("texture_import/repeat",false))) flags|=Texture::FLAG_REPEAT; diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 04c2ec65623..ae67023d5b5 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -452,6 +452,7 @@ void register_scene_types() { ObjectTypeDB::register_virtual_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); + //ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); diff --git a/scene/resources/shape_2d.cpp b/scene/resources/shape_2d.cpp index d8764549545..ca891920da2 100644 --- a/scene/resources/shape_2d.cpp +++ b/scene/resources/shape_2d.cpp @@ -47,20 +47,82 @@ real_t Shape2D::get_custom_solver_bias() const{ } +bool Shape2D::collide_with_motion(const Matrix32& p_local_xform, const Vector2& p_local_motion, const Ref& p_shape, const Matrix32& p_shape_xform, const Vector2 &p_shape_motion) { + + ERR_FAIL_COND_V(p_shape.is_null(),false); + int r; + return Physics2DServer::get_singleton()->shape_collide(get_rid(),p_local_xform,p_local_motion,p_shape->get_rid(),p_shape_xform,p_shape_motion,NULL,0,r); +} + +bool Shape2D::collide(const Matrix32& p_local_xform, const Ref& p_shape, const Matrix32& p_shape_xform){ + ERR_FAIL_COND_V(p_shape.is_null(),false); + int r; + return Physics2DServer::get_singleton()->shape_collide(get_rid(),p_local_xform,Vector2(),p_shape->get_rid(),p_shape_xform,Vector2(),NULL,0,r); + + +} + +Variant Shape2D::collide_with_motion_and_get_contacts(const Matrix32& p_local_xform, const Vector2& p_local_motion, const Ref& p_shape, const Matrix32& p_shape_xform, const Vector2 &p_shape_motion){ + + ERR_FAIL_COND_V(p_shape.is_null(),Variant()); + const int max_contacts = 16; + Vector2 result[max_contacts*2]; + int contacts=0; + + if (!Physics2DServer::get_singleton()->shape_collide(get_rid(),p_local_xform,p_local_motion,p_shape->get_rid(),p_shape_xform,p_shape_motion,result,max_contacts,contacts)) + return Variant(); + + Array results; + results.resize(contacts*2); + for(int i=0;i& p_shape, const Matrix32& p_shape_xform){ + + ERR_FAIL_COND_V(p_shape.is_null(),Variant()); + const int max_contacts = 16; + Vector2 result[max_contacts*2]; + int contacts=0; + + if (!Physics2DServer::get_singleton()->shape_collide(get_rid(),p_local_xform,Vector2(),p_shape->get_rid(),p_shape_xform,Vector2(),result,max_contacts,contacts)) + return Variant(); + + Array results; + results.resize(contacts*2); + for(int i=0;ifree(shape); diff --git a/scene/resources/shape_2d.h b/scene/resources/shape_2d.h index b01820c22cc..5f254a15725 100644 --- a/scene/resources/shape_2d.h +++ b/scene/resources/shape_2d.h @@ -47,6 +47,12 @@ public: void set_custom_solver_bias(real_t p_bias); real_t get_custom_solver_bias() const; + bool collide_with_motion(const Matrix32& p_local_xform, const Vector2& p_local_motion, const Ref& p_shape, const Matrix32& p_shape_xform, const Vector2 &p_p_shape_motion); + bool collide(const Matrix32& p_local_xform, const Ref& p_shape, const Matrix32& p_shape_xform); + + Variant collide_with_motion_and_get_contacts(const Matrix32& p_local_xform, const Vector2& p_local_motion, const Ref& p_shape, const Matrix32& p_shape_xform, const Vector2 &p_p_shape_motion); + Variant collide_and_get_contacts(const Matrix32& p_local_xform, const Ref& p_shape, const Matrix32& p_shape_xform); + virtual RID get_rid() const; Shape2D(); ~Shape2D(); diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 95714ab501d..208ba5bb661 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -44,8 +44,10 @@ bool TileSet::_set(const StringName& p_name, const Variant& p_value) { tile_set_name(id,p_value); else if (what=="texture") tile_set_texture(id,p_value); - else if (what=="offset") - tile_set_offset(id,p_value); + else if (what=="tex_offset") + tile_set_texture_offset(id,p_value); + else if (what=="shape_offset") + tile_set_shape_offset(id,p_value); else if (what=="region") tile_set_region(id,p_value); else if (what=="shape") @@ -75,8 +77,10 @@ bool TileSet::_get(const StringName& p_name,Variant &r_ret) const{ r_ret=tile_get_name(id); else if (what=="texture") r_ret=tile_get_texture(id); - else if (what=="offset") - r_ret=tile_get_offset(id); + else if (what=="tex_offset") + r_ret=tile_get_texture_offset(id); + else if (what=="shape_offset") + r_ret=tile_get_shape_offset(id); else if (what=="region") r_ret=tile_get_region(id); else if (what=="shape") @@ -98,7 +102,8 @@ void TileSet::_get_property_list( List *p_list) const{ String pre = itos(id)+"/"; p_list->push_back(PropertyInfo(Variant::STRING,pre+"name")); p_list->push_back(PropertyInfo(Variant::OBJECT,pre+"texture",PROPERTY_HINT_RESOURCE_TYPE,"Texture")); - p_list->push_back(PropertyInfo(Variant::VECTOR2,pre+"offset")); + p_list->push_back(PropertyInfo(Variant::VECTOR2,pre+"tex_offset")); + p_list->push_back(PropertyInfo(Variant::VECTOR2,pre+"shape_offset")); p_list->push_back(PropertyInfo(Variant::RECT2,pre+"region")); p_list->push_back(PropertyInfo(Variant::OBJECT,pre+"shape",PROPERTY_HINT_RESOURCE_TYPE,"Shape2D",PROPERTY_USAGE_EDITOR)); p_list->push_back(PropertyInfo(Variant::ARRAY,pre+"shapes",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR)); @@ -129,20 +134,34 @@ Ref TileSet::tile_get_texture(int p_id) const { } -void TileSet::tile_set_offset(int p_id,const Vector2 &p_offset) { +void TileSet::tile_set_texture_offset(int p_id,const Vector2 &p_offset) { ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].offset=p_offset; emit_changed(); } -Vector2 TileSet::tile_get_offset(int p_id) const { +Vector2 TileSet::tile_get_texture_offset(int p_id) const { ERR_FAIL_COND_V(!tile_map.has(p_id),Vector2()); return tile_map[p_id].offset; } +void TileSet::tile_set_shape_offset(int p_id,const Vector2 &p_offset) { + + ERR_FAIL_COND(!tile_map.has(p_id)); + tile_map[p_id].shape_offset=p_offset; + emit_changed(); +} + +Vector2 TileSet::tile_get_shape_offset(int p_id) const { + + ERR_FAIL_COND_V(!tile_map.has(p_id),Vector2()); + return tile_map[p_id].shape_offset; + +} + void TileSet::tile_set_region(int p_id,const Rect2 &p_region) { ERR_FAIL_COND(!tile_map.has(p_id)); @@ -300,8 +319,10 @@ void TileSet::_bind_methods() { ObjectTypeDB::bind_method(_MD("tile_get_name","id"),&TileSet::tile_get_name); ObjectTypeDB::bind_method(_MD("tile_set_texture","id","texture:Texture"),&TileSet::tile_set_texture); ObjectTypeDB::bind_method(_MD("tile_get_texture:Texture","id"),&TileSet::tile_get_texture); - ObjectTypeDB::bind_method(_MD("tile_set_offset","id","offset"),&TileSet::tile_set_offset); - ObjectTypeDB::bind_method(_MD("tile_get_offset","id"),&TileSet::tile_get_offset); + ObjectTypeDB::bind_method(_MD("tile_set_texture_offset","id","texture_offset"),&TileSet::tile_set_texture_offset); + ObjectTypeDB::bind_method(_MD("tile_get_texture_offset","id"),&TileSet::tile_get_texture_offset); + ObjectTypeDB::bind_method(_MD("tile_set_shape_offset","id","shape_offset"),&TileSet::tile_set_shape_offset); + ObjectTypeDB::bind_method(_MD("tile_get_shape_offset","id"),&TileSet::tile_get_shape_offset); ObjectTypeDB::bind_method(_MD("tile_set_region","id","region"),&TileSet::tile_set_region); ObjectTypeDB::bind_method(_MD("tile_get_region","id"),&TileSet::tile_get_region); ObjectTypeDB::bind_method(_MD("tile_set_shape","id","shape:Shape2D"),&TileSet::tile_set_shape); diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h index 5773c56ed2d..ddbb1b59a64 100644 --- a/scene/resources/tile_set.h +++ b/scene/resources/tile_set.h @@ -42,6 +42,7 @@ class TileSet : public Resource { String name; Ref texture; Vector2 offset; + Vector2 shape_offset; Rect2i region; Vector > shapes; }; @@ -71,8 +72,11 @@ public: void tile_set_texture(int p_id, const Ref &p_texture); Ref tile_get_texture(int p_id) const; - void tile_set_offset(int p_id,const Vector2 &p_offset); - Vector2 tile_get_offset(int p_id) const; + void tile_set_texture_offset(int p_id,const Vector2 &p_offset); + Vector2 tile_get_texture_offset(int p_id) const; + + void tile_set_shape_offset(int p_id,const Vector2 &p_offset); + Vector2 tile_get_shape_offset(int p_id) const; void tile_set_region(int p_id,const Rect2 &p_region); Rect2 tile_get_region(int p_id) const; diff --git a/servers/physics/body_pair_sw.cpp b/servers/physics/body_pair_sw.cpp index 06ae34098ce..094f56a4212 100644 --- a/servers/physics/body_pair_sw.cpp +++ b/servers/physics/body_pair_sw.cpp @@ -198,7 +198,7 @@ bool BodyPairSW::setup(float p_step) { //cannot collide - if (A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_STATIC_ACTIVE && B->get_mode()<=PhysicsServer::BODY_MODE_STATIC_ACTIVE)) { + if (A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC)) { return false; } diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp index b926a937732..f0f72b471c7 100644 --- a/servers/physics/body_sw.cpp +++ b/servers/physics/body_sw.cpp @@ -26,606 +26,606 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "body_sw.h" -#include "space_sw.h" -#include "area_sw.h" - -void BodySW::_update_inertia() { - - if (get_space() && !inertia_update_list.in_list()) - get_space()->body_add_to_inertia_update_list(&inertia_update_list); - -} - - -void BodySW::_update_inertia_tensor() { - - Matrix3 tb = get_transform().basis; - tb.scale(_inv_inertia); - _inv_inertia_tensor = tb * get_transform().basis.transposed(); - -} - -void BodySW::update_inertias() { - - //update shapes and motions - - switch(mode) { - - case PhysicsServer::BODY_MODE_RIGID: { - - //update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet) - float total_area=0; - - for (int i=0;imass / total_area; - - _inertia += shape->get_moment_of_inertia(mass) + mass * get_shape_transform(i).get_origin(); - - } - - if (_inertia!=Vector3()) - _inv_inertia=_inertia.inverse(); - else - _inv_inertia=Vector3(); - - if (mass) - _inv_mass=1.0/mass; - else - _inv_mass=0; - - } break; - - case PhysicsServer::BODY_MODE_STATIC_ACTIVE: - case PhysicsServer::BODY_MODE_STATIC: { - - _inv_inertia=Vector3(); - _inv_mass=0; - } break; - case PhysicsServer::BODY_MODE_CHARACTER: { - - _inv_inertia=Vector3(); - _inv_mass=1.0/mass; - - } break; - } - _update_inertia_tensor(); - - //_update_shapes(); - -} - - - -void BodySW::set_active(bool p_active) { - - if (active==p_active) - return; - - active=p_active; - if (!p_active) { - if (get_space()) - get_space()->body_remove_from_active_list(&active_list); - } else { - if (mode==PhysicsServer::BODY_MODE_STATIC) - return; //static bodies can't become active - if (get_space()) - get_space()->body_add_to_active_list(&active_list); - - //still_time=0; - } -/* - if (!space) - return; - - for(int i=0;i0) { - get_space()->get_broadphase()->set_active(s.bpid,active); - } - } -*/ -} - - - -void BodySW::set_param(PhysicsServer::BodyParameter p_param, float p_value) { - - switch(p_param) { - case PhysicsServer::BODY_PARAM_BOUNCE: { - - bounce=p_value; - } break; - case PhysicsServer::BODY_PARAM_FRICTION: { - - friction=p_value; - } break; - case PhysicsServer::BODY_PARAM_MASS: { - ERR_FAIL_COND(p_value<=0); - mass=p_value; - _update_inertia(); - - } break; - default:{} - } -} - -float BodySW::get_param(PhysicsServer::BodyParameter p_param) const { - - switch(p_param) { - case PhysicsServer::BODY_PARAM_BOUNCE: { - - return bounce; - } break; - case PhysicsServer::BODY_PARAM_FRICTION: { - - return friction; - } break; - case PhysicsServer::BODY_PARAM_MASS: { - return mass; - } break; - default:{} - } - - return 0; -} - -void BodySW::set_mode(PhysicsServer::BodyMode p_mode) { - - mode=p_mode; - - switch(p_mode) { - //CLEAR UP EVERYTHING IN CASE IT NOT WORKS! - case PhysicsServer::BODY_MODE_STATIC: - case PhysicsServer::BODY_MODE_STATIC_ACTIVE: { - - _set_inv_transform(get_transform().affine_inverse()); - _inv_mass=0; - _set_static(p_mode==PhysicsServer::BODY_MODE_STATIC); - set_active(p_mode==PhysicsServer::BODY_MODE_STATIC_ACTIVE); - linear_velocity=Vector3(); - angular_velocity=Vector3(); - } break; - case PhysicsServer::BODY_MODE_RIGID: { - - _inv_mass=mass>0?(1.0/mass):0; - _set_static(false); - simulated_motion=false; //jic - - } break; - case PhysicsServer::BODY_MODE_CHARACTER: { - - _inv_mass=mass>0?(1.0/mass):0; - _set_static(false); - simulated_motion=false; //jic - } break; - } - - _update_inertia(); - //if (get_space()) -// _update_queries(); - -} -PhysicsServer::BodyMode BodySW::get_mode() const { - - return mode; -} - -void BodySW::_shapes_changed() { - - _update_inertia(); -} - -void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant& p_variant) { - - switch(p_state) { - case PhysicsServer::BODY_STATE_TRANSFORM: { - - - if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_STATIC_ACTIVE) { - _set_transform(p_variant); - _set_inv_transform(get_transform().affine_inverse()); - wakeup_neighbours(); - } else { - Transform t = p_variant; - t.orthonormalize(); - _set_transform(t); - _set_inv_transform(get_transform().inverse()); - - } - - } break; - case PhysicsServer::BODY_STATE_LINEAR_VELOCITY: { - - //if (mode==PhysicsServer::BODY_MODE_STATIC) - // break; - linear_velocity=p_variant; - } break; - case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: { - //if (mode!=PhysicsServer::BODY_MODE_RIGID) - // break; - angular_velocity=p_variant; - - } break; - case PhysicsServer::BODY_STATE_SLEEPING: { - //? - if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_STATIC_ACTIVE) - break; - bool do_sleep=p_variant; - if (do_sleep) { - linear_velocity=Vector3(); - //biased_linear_velocity=Vector3(); - angular_velocity=Vector3(); - //biased_angular_velocity=Vector3(); - set_active(false); - } else { - if (mode!=PhysicsServer::BODY_MODE_STATIC) - set_active(true); - } - } break; - case PhysicsServer::BODY_STATE_CAN_SLEEP: { - can_sleep=p_variant; - if (mode==PhysicsServer::BODY_MODE_RIGID && !active && !can_sleep) - set_active(true); - - } break; - } - -} -Variant BodySW::get_state(PhysicsServer::BodyState p_state) const { - - switch(p_state) { - case PhysicsServer::BODY_STATE_TRANSFORM: { - return get_transform(); - } break; - case PhysicsServer::BODY_STATE_LINEAR_VELOCITY: { - return linear_velocity; - } break; - case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: { - return angular_velocity; - } break; - case PhysicsServer::BODY_STATE_SLEEPING: { - return !is_active(); - } break; - case PhysicsServer::BODY_STATE_CAN_SLEEP: { - return can_sleep; - } break; - } - - return Variant(); -} - - -void BodySW::set_space(SpaceSW *p_space){ - - if (get_space()) { - - if (inertia_update_list.in_list()) - get_space()->body_remove_from_inertia_update_list(&inertia_update_list); - if (active_list.in_list()) - get_space()->body_remove_from_active_list(&active_list); - if (direct_state_query_list.in_list()) - get_space()->body_remove_from_state_query_list(&direct_state_query_list); - - } - - _set_space(p_space); - - if (get_space()) { - - _update_inertia(); - if (active) - get_space()->body_add_to_active_list(&active_list); -// _update_queries(); - //if (is_active()) { - // active=false; - // set_active(true); - //} - - } - -} - -void BodySW::_compute_area_gravity(const AreaSW *p_area) { - - if (p_area->is_gravity_point()) { - - gravity = (p_area->get_gravity_vector() - get_transform().get_origin()).normalized() * p_area->get_gravity(); - - } else { - gravity = p_area->get_gravity_vector() * p_area->get_gravity(); - } -} - -void BodySW::integrate_forces(real_t p_step) { - - - if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_STATIC_ACTIVE) - return; - - AreaSW *current_area = get_space()->get_default_area(); - ERR_FAIL_COND(!current_area); - - int prio = current_area->get_priority(); - int ac = areas.size(); - if (ac) { - const AreaCMP *aa = &areas[0]; - for(int i=0;iget_priority() > prio) { - current_area=aa[i].area; - prio=current_area->get_priority(); - } - } - } - - _compute_area_gravity(current_area); - density=current_area->get_density(); - - if (!omit_force_integration) { - //overriden by direct state query - - Vector3 force=gravity*mass; - force+=applied_force; - Vector3 torque=applied_torque; - - real_t damp = 1.0 - p_step * density; - - if (damp<0) // reached zero in the given time - damp=0; - - real_t angular_damp = 1.0 - p_step * density * get_space()->get_body_angular_velocity_damp_ratio(); - - if (angular_damp<0) // reached zero in the given time - angular_damp=0; - - linear_velocity*=damp; - angular_velocity*=angular_damp; - - linear_velocity+=_inv_mass * force * p_step; - angular_velocity+=_inv_inertia_tensor.xform(torque)*p_step; - } - - applied_force=Vector3(); - applied_torque=Vector3(); - - //motion=linear_velocity*p_step; - - biased_angular_velocity=Vector3(); - biased_linear_velocity=Vector3(); - - if (continuous_cd) //shapes temporarily extend for raycast - _update_shapes_with_motion(linear_velocity*p_step); - - current_area=NULL; // clear the area, so it is set in the next frame - contact_count=0; - -} - -void BodySW::integrate_velocities(real_t p_step) { - - if (mode==PhysicsServer::BODY_MODE_STATIC) - return; - - if (mode==PhysicsServer::BODY_MODE_STATIC_ACTIVE) { - if (fi_callback) - get_space()->body_add_to_state_query_list(&direct_state_query_list); - return; - } - - Vector3 total_angular_velocity = angular_velocity+biased_angular_velocity; - - - - float ang_vel = total_angular_velocity.length(); - Transform transform = get_transform(); - - - if (ang_vel!=0.0) { - Vector3 ang_vel_axis = total_angular_velocity / ang_vel; - Matrix3 rot( ang_vel_axis, -ang_vel*p_step ); - transform.basis = rot * transform.basis; - transform.orthonormalize(); - } - - Vector3 total_linear_velocity=linear_velocity+biased_linear_velocity; - - - transform.origin+=total_linear_velocity * p_step; - - _set_transform(transform); - _set_inv_transform(get_transform().inverse()); - - _update_inertia_tensor(); - - if (fi_callback) { - - get_space()->body_add_to_state_query_list(&direct_state_query_list); - } - -} - - -void BodySW::simulate_motion(const Transform& p_xform,real_t p_step) { - - Transform inv_xform = p_xform.affine_inverse(); - if (!get_space()) { - _set_transform(p_xform); - _set_inv_transform(inv_xform); - - return; - } - - //compute a FAKE linear velocity - this is easy - - linear_velocity=(p_xform.origin - get_transform().origin)/p_step; - - //compute a FAKE angular velocity, not so easy - Matrix3 rot=get_transform().basis.orthonormalized().transposed() * p_xform.basis.orthonormalized(); - Vector3 axis; - float angle; - - rot.get_axis_and_angle(axis,angle); - axis.normalize(); - angular_velocity=axis.normalized() * (angle/p_step); - linear_velocity = (p_xform.origin - get_transform().origin)/p_step; - - if (!direct_state_query_list.in_list())// - callalways, so lv and av are cleared && (state_query || direct_state_query)) - get_space()->body_add_to_state_query_list(&direct_state_query_list); - simulated_motion=true; - _set_transform(p_xform); - - -} - -void BodySW::wakeup_neighbours() { - - for(Map::Element *E=constraint_map.front();E;E=E->next()) { - - const ConstraintSW *c=E->key(); - BodySW **n = c->get_body_ptr(); - int bc=c->get_body_count(); - - for(int i=0;iget()) - continue; - BodySW *b = n[i]; - if (b->mode!=PhysicsServer::BODY_MODE_RIGID) - continue; - - if (!b->is_active()) - b->set_active(true); - } - } -} - -void BodySW::call_queries() { - - - if (fi_callback) { - - PhysicsDirectBodyStateSW *dbs = PhysicsDirectBodyStateSW::singleton; - dbs->body=this; - - Variant v=dbs; - - Object *obj = ObjectDB::get_instance(fi_callback->id); - if (!obj) { - - set_force_integration_callback(0,StringName()); - } else { - const Variant *vp[2]={&v,&fi_callback->udata}; - - Variant::CallError ce; - int argc=(fi_callback->udata.get_type()==Variant::NIL)?1:2; - obj->call(fi_callback->method,vp,argc,ce); - } - - - } - - if (simulated_motion) { - - // linear_velocity=Vector3(); - // angular_velocity=0; - simulated_motion=false; - } -} - - -bool BodySW::sleep_test(real_t p_step) { - - if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_STATIC_ACTIVE) - return true; // - else if (mode==PhysicsServer::BODY_MODE_CHARACTER) - return !active; // characters don't sleep unless asked to sleep - else if (!can_sleep) - return false; - - - - - if (Math::abs(angular_velocity.length())get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold()*get_space()->get_body_linear_velocity_sleep_treshold()) { - - still_time+=p_step; - - return still_time > get_space()->get_body_time_to_sleep(); - } else { - - still_time=0; //maybe this should be set to 0 on set_active? - return false; - } -} - - -void BodySW::set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata) { - - if (fi_callback) { - - memdelete(fi_callback); - fi_callback=NULL; - } - - - if (p_id!=0) { - - fi_callback=memnew(ForceIntegrationCallback); - fi_callback->id=p_id; - fi_callback->method=p_method; - fi_callback->udata=p_udata; - } - -} - -BodySW::BodySW() : CollisionObjectSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) { - - - mode=PhysicsServer::BODY_MODE_RIGID; - active=true; - - mass=1; -// _inv_inertia=Transform(); - _inv_mass=1; - bounce=0; - friction=1; - omit_force_integration=false; -// applied_torque=0; - island_step=0; - island_next=NULL; - island_list_next=NULL; - _set_static(false); - density=0; - contact_count=0; - simulated_motion=false; - still_time=0; - continuous_cd=false; - can_sleep=false; - fi_callback=NULL; - -} - -BodySW::~BodySW() { - - if (fi_callback) - memdelete(fi_callback); -} - -PhysicsDirectBodyStateSW *PhysicsDirectBodyStateSW::singleton=NULL; - -PhysicsDirectSpaceState* PhysicsDirectBodyStateSW::get_space_state() { - - return body->get_space()->get_direct_state(); -} +#include "body_sw.h" +#include "space_sw.h" +#include "area_sw.h" + +void BodySW::_update_inertia() { + + if (get_space() && !inertia_update_list.in_list()) + get_space()->body_add_to_inertia_update_list(&inertia_update_list); + +} + + +void BodySW::_update_inertia_tensor() { + + Matrix3 tb = get_transform().basis; + tb.scale(_inv_inertia); + _inv_inertia_tensor = tb * get_transform().basis.transposed(); + +} + +void BodySW::update_inertias() { + + //update shapes and motions + + switch(mode) { + + case PhysicsServer::BODY_MODE_RIGID: { + + //update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet) + float total_area=0; + + for (int i=0;imass / total_area; + + _inertia += shape->get_moment_of_inertia(mass) + mass * get_shape_transform(i).get_origin(); + + } + + if (_inertia!=Vector3()) + _inv_inertia=_inertia.inverse(); + else + _inv_inertia=Vector3(); + + if (mass) + _inv_mass=1.0/mass; + else + _inv_mass=0; + + } break; + + case PhysicsServer::BODY_MODE_KINEMATIC: + case PhysicsServer::BODY_MODE_STATIC: { + + _inv_inertia=Vector3(); + _inv_mass=0; + } break; + case PhysicsServer::BODY_MODE_CHARACTER: { + + _inv_inertia=Vector3(); + _inv_mass=1.0/mass; + + } break; + } + _update_inertia_tensor(); + + //_update_shapes(); + +} + + + +void BodySW::set_active(bool p_active) { + + if (active==p_active) + return; + + active=p_active; + if (!p_active) { + if (get_space()) + get_space()->body_remove_from_active_list(&active_list); + } else { + if (mode==PhysicsServer::BODY_MODE_STATIC) + return; //static bodies can't become active + if (get_space()) + get_space()->body_add_to_active_list(&active_list); + + //still_time=0; + } +/* + if (!space) + return; + + for(int i=0;i0) { + get_space()->get_broadphase()->set_active(s.bpid,active); + } + } +*/ +} + + + +void BodySW::set_param(PhysicsServer::BodyParameter p_param, float p_value) { + + switch(p_param) { + case PhysicsServer::BODY_PARAM_BOUNCE: { + + bounce=p_value; + } break; + case PhysicsServer::BODY_PARAM_FRICTION: { + + friction=p_value; + } break; + case PhysicsServer::BODY_PARAM_MASS: { + ERR_FAIL_COND(p_value<=0); + mass=p_value; + _update_inertia(); + + } break; + default:{} + } +} + +float BodySW::get_param(PhysicsServer::BodyParameter p_param) const { + + switch(p_param) { + case PhysicsServer::BODY_PARAM_BOUNCE: { + + return bounce; + } break; + case PhysicsServer::BODY_PARAM_FRICTION: { + + return friction; + } break; + case PhysicsServer::BODY_PARAM_MASS: { + return mass; + } break; + default:{} + } + + return 0; +} + +void BodySW::set_mode(PhysicsServer::BodyMode p_mode) { + + mode=p_mode; + + switch(p_mode) { + //CLEAR UP EVERYTHING IN CASE IT NOT WORKS! + case PhysicsServer::BODY_MODE_STATIC: + case PhysicsServer::BODY_MODE_KINEMATIC: { + + _set_inv_transform(get_transform().affine_inverse()); + _inv_mass=0; + _set_static(p_mode==PhysicsServer::BODY_MODE_STATIC); + set_active(p_mode==PhysicsServer::BODY_MODE_KINEMATIC); + linear_velocity=Vector3(); + angular_velocity=Vector3(); + } break; + case PhysicsServer::BODY_MODE_RIGID: { + + _inv_mass=mass>0?(1.0/mass):0; + _set_static(false); + simulated_motion=false; //jic + + } break; + case PhysicsServer::BODY_MODE_CHARACTER: { + + _inv_mass=mass>0?(1.0/mass):0; + _set_static(false); + simulated_motion=false; //jic + } break; + } + + _update_inertia(); + //if (get_space()) +// _update_queries(); + +} +PhysicsServer::BodyMode BodySW::get_mode() const { + + return mode; +} + +void BodySW::_shapes_changed() { + + _update_inertia(); +} + +void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant& p_variant) { + + switch(p_state) { + case PhysicsServer::BODY_STATE_TRANSFORM: { + + + if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC) { + _set_transform(p_variant); + _set_inv_transform(get_transform().affine_inverse()); + wakeup_neighbours(); + } else { + Transform t = p_variant; + t.orthonormalize(); + _set_transform(t); + _set_inv_transform(get_transform().inverse()); + + } + + } break; + case PhysicsServer::BODY_STATE_LINEAR_VELOCITY: { + + //if (mode==PhysicsServer::BODY_MODE_STATIC) + // break; + linear_velocity=p_variant; + } break; + case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: { + //if (mode!=PhysicsServer::BODY_MODE_RIGID) + // break; + angular_velocity=p_variant; + + } break; + case PhysicsServer::BODY_STATE_SLEEPING: { + //? + if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC) + break; + bool do_sleep=p_variant; + if (do_sleep) { + linear_velocity=Vector3(); + //biased_linear_velocity=Vector3(); + angular_velocity=Vector3(); + //biased_angular_velocity=Vector3(); + set_active(false); + } else { + if (mode!=PhysicsServer::BODY_MODE_STATIC) + set_active(true); + } + } break; + case PhysicsServer::BODY_STATE_CAN_SLEEP: { + can_sleep=p_variant; + if (mode==PhysicsServer::BODY_MODE_RIGID && !active && !can_sleep) + set_active(true); + + } break; + } + +} +Variant BodySW::get_state(PhysicsServer::BodyState p_state) const { + + switch(p_state) { + case PhysicsServer::BODY_STATE_TRANSFORM: { + return get_transform(); + } break; + case PhysicsServer::BODY_STATE_LINEAR_VELOCITY: { + return linear_velocity; + } break; + case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: { + return angular_velocity; + } break; + case PhysicsServer::BODY_STATE_SLEEPING: { + return !is_active(); + } break; + case PhysicsServer::BODY_STATE_CAN_SLEEP: { + return can_sleep; + } break; + } + + return Variant(); +} + + +void BodySW::set_space(SpaceSW *p_space){ + + if (get_space()) { + + if (inertia_update_list.in_list()) + get_space()->body_remove_from_inertia_update_list(&inertia_update_list); + if (active_list.in_list()) + get_space()->body_remove_from_active_list(&active_list); + if (direct_state_query_list.in_list()) + get_space()->body_remove_from_state_query_list(&direct_state_query_list); + + } + + _set_space(p_space); + + if (get_space()) { + + _update_inertia(); + if (active) + get_space()->body_add_to_active_list(&active_list); +// _update_queries(); + //if (is_active()) { + // active=false; + // set_active(true); + //} + + } + +} + +void BodySW::_compute_area_gravity(const AreaSW *p_area) { + + if (p_area->is_gravity_point()) { + + gravity = (p_area->get_gravity_vector() - get_transform().get_origin()).normalized() * p_area->get_gravity(); + + } else { + gravity = p_area->get_gravity_vector() * p_area->get_gravity(); + } +} + +void BodySW::integrate_forces(real_t p_step) { + + + if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC) + return; + + AreaSW *current_area = get_space()->get_default_area(); + ERR_FAIL_COND(!current_area); + + int prio = current_area->get_priority(); + int ac = areas.size(); + if (ac) { + const AreaCMP *aa = &areas[0]; + for(int i=0;iget_priority() > prio) { + current_area=aa[i].area; + prio=current_area->get_priority(); + } + } + } + + _compute_area_gravity(current_area); + density=current_area->get_density(); + + if (!omit_force_integration) { + //overriden by direct state query + + Vector3 force=gravity*mass; + force+=applied_force; + Vector3 torque=applied_torque; + + real_t damp = 1.0 - p_step * density; + + if (damp<0) // reached zero in the given time + damp=0; + + real_t angular_damp = 1.0 - p_step * density * get_space()->get_body_angular_velocity_damp_ratio(); + + if (angular_damp<0) // reached zero in the given time + angular_damp=0; + + linear_velocity*=damp; + angular_velocity*=angular_damp; + + linear_velocity+=_inv_mass * force * p_step; + angular_velocity+=_inv_inertia_tensor.xform(torque)*p_step; + } + + applied_force=Vector3(); + applied_torque=Vector3(); + + //motion=linear_velocity*p_step; + + biased_angular_velocity=Vector3(); + biased_linear_velocity=Vector3(); + + if (continuous_cd) //shapes temporarily extend for raycast + _update_shapes_with_motion(linear_velocity*p_step); + + current_area=NULL; // clear the area, so it is set in the next frame + contact_count=0; + +} + +void BodySW::integrate_velocities(real_t p_step) { + + if (mode==PhysicsServer::BODY_MODE_STATIC) + return; + + if (mode==PhysicsServer::BODY_MODE_KINEMATIC) { + if (fi_callback) + get_space()->body_add_to_state_query_list(&direct_state_query_list); + return; + } + + Vector3 total_angular_velocity = angular_velocity+biased_angular_velocity; + + + + float ang_vel = total_angular_velocity.length(); + Transform transform = get_transform(); + + + if (ang_vel!=0.0) { + Vector3 ang_vel_axis = total_angular_velocity / ang_vel; + Matrix3 rot( ang_vel_axis, -ang_vel*p_step ); + transform.basis = rot * transform.basis; + transform.orthonormalize(); + } + + Vector3 total_linear_velocity=linear_velocity+biased_linear_velocity; + + + transform.origin+=total_linear_velocity * p_step; + + _set_transform(transform); + _set_inv_transform(get_transform().inverse()); + + _update_inertia_tensor(); + + if (fi_callback) { + + get_space()->body_add_to_state_query_list(&direct_state_query_list); + } + +} + + +void BodySW::simulate_motion(const Transform& p_xform,real_t p_step) { + + Transform inv_xform = p_xform.affine_inverse(); + if (!get_space()) { + _set_transform(p_xform); + _set_inv_transform(inv_xform); + + return; + } + + //compute a FAKE linear velocity - this is easy + + linear_velocity=(p_xform.origin - get_transform().origin)/p_step; + + //compute a FAKE angular velocity, not so easy + Matrix3 rot=get_transform().basis.orthonormalized().transposed() * p_xform.basis.orthonormalized(); + Vector3 axis; + float angle; + + rot.get_axis_and_angle(axis,angle); + axis.normalize(); + angular_velocity=axis.normalized() * (angle/p_step); + linear_velocity = (p_xform.origin - get_transform().origin)/p_step; + + if (!direct_state_query_list.in_list())// - callalways, so lv and av are cleared && (state_query || direct_state_query)) + get_space()->body_add_to_state_query_list(&direct_state_query_list); + simulated_motion=true; + _set_transform(p_xform); + + +} + +void BodySW::wakeup_neighbours() { + + for(Map::Element *E=constraint_map.front();E;E=E->next()) { + + const ConstraintSW *c=E->key(); + BodySW **n = c->get_body_ptr(); + int bc=c->get_body_count(); + + for(int i=0;iget()) + continue; + BodySW *b = n[i]; + if (b->mode!=PhysicsServer::BODY_MODE_RIGID) + continue; + + if (!b->is_active()) + b->set_active(true); + } + } +} + +void BodySW::call_queries() { + + + if (fi_callback) { + + PhysicsDirectBodyStateSW *dbs = PhysicsDirectBodyStateSW::singleton; + dbs->body=this; + + Variant v=dbs; + + Object *obj = ObjectDB::get_instance(fi_callback->id); + if (!obj) { + + set_force_integration_callback(0,StringName()); + } else { + const Variant *vp[2]={&v,&fi_callback->udata}; + + Variant::CallError ce; + int argc=(fi_callback->udata.get_type()==Variant::NIL)?1:2; + obj->call(fi_callback->method,vp,argc,ce); + } + + + } + + if (simulated_motion) { + + // linear_velocity=Vector3(); + // angular_velocity=0; + simulated_motion=false; + } +} + + +bool BodySW::sleep_test(real_t p_step) { + + if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC) + return true; // + else if (mode==PhysicsServer::BODY_MODE_CHARACTER) + return !active; // characters don't sleep unless asked to sleep + else if (!can_sleep) + return false; + + + + + if (Math::abs(angular_velocity.length())get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold()*get_space()->get_body_linear_velocity_sleep_treshold()) { + + still_time+=p_step; + + return still_time > get_space()->get_body_time_to_sleep(); + } else { + + still_time=0; //maybe this should be set to 0 on set_active? + return false; + } +} + + +void BodySW::set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata) { + + if (fi_callback) { + + memdelete(fi_callback); + fi_callback=NULL; + } + + + if (p_id!=0) { + + fi_callback=memnew(ForceIntegrationCallback); + fi_callback->id=p_id; + fi_callback->method=p_method; + fi_callback->udata=p_udata; + } + +} + +BodySW::BodySW() : CollisionObjectSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) { + + + mode=PhysicsServer::BODY_MODE_RIGID; + active=true; + + mass=1; +// _inv_inertia=Transform(); + _inv_mass=1; + bounce=0; + friction=1; + omit_force_integration=false; +// applied_torque=0; + island_step=0; + island_next=NULL; + island_list_next=NULL; + _set_static(false); + density=0; + contact_count=0; + simulated_motion=false; + still_time=0; + continuous_cd=false; + can_sleep=false; + fi_callback=NULL; + +} + +BodySW::~BodySW() { + + if (fi_callback) + memdelete(fi_callback); +} + +PhysicsDirectBodyStateSW *PhysicsDirectBodyStateSW::singleton=NULL; + +PhysicsDirectSpaceState* PhysicsDirectBodyStateSW::get_space_state() { + + return body->get_space()->get_direct_state(); +} diff --git a/servers/physics_2d/area_2d_sw.cpp b/servers/physics_2d/area_2d_sw.cpp index 6c391a7aa01..c8400041908 100644 --- a/servers/physics_2d/area_2d_sw.cpp +++ b/servers/physics_2d/area_2d_sw.cpp @@ -84,7 +84,7 @@ void Area2DSW::set_monitor_callback(ObjectID p_id, const StringName& p_method) { void Area2DSW::set_space_override_mode(Physics2DServer::AreaSpaceOverrideMode p_mode) { bool do_override=p_mode!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED; - if (do_override==space_override_mode!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED) + if (do_override==(space_override_mode!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)) return; _unregister_shapes(); space_override_mode=p_mode; diff --git a/servers/physics_2d/area_pair_2d_sw.cpp b/servers/physics_2d/area_pair_2d_sw.cpp index da9a02922cf..35286bdb67f 100644 --- a/servers/physics_2d/area_pair_2d_sw.cpp +++ b/servers/physics_2d/area_pair_2d_sw.cpp @@ -32,7 +32,7 @@ bool AreaPair2DSW::setup(float p_step) { - bool result = CollisionSolver2DSW::solve_static(body->get_shape(body_shape),body->get_transform() * body->get_shape_transform(body_shape),body->get_shape_inv_transform(body_shape) * body->get_inv_transform(),area->get_shape(area_shape),area->get_transform() * area->get_shape_transform(area_shape),area->get_shape_inv_transform(area_shape) * area->get_inv_transform(),NULL,this); + bool result = CollisionSolver2DSW::solve(body->get_shape(body_shape),body->get_transform() * body->get_shape_transform(body_shape),Vector2(),area->get_shape(area_shape),area->get_transform() * area->get_shape_transform(area_shape),Vector2(),NULL,this); if (result!=colliding) { diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp index f0e96ae5a62..f10cdadf4e3 100644 --- a/servers/physics_2d/body_2d_sw.cpp +++ b/servers/physics_2d/body_2d_sw.cpp @@ -26,584 +26,589 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "body_2d_sw.h" -#include "space_2d_sw.h" -#include "area_2d_sw.h" - -void Body2DSW::_update_inertia() { - - if (get_space() && !inertia_update_list.in_list()) - get_space()->body_add_to_inertia_update_list(&inertia_update_list); - -} - - - -void Body2DSW::update_inertias() { - - //update shapes and motions - - switch(mode) { - - case Physics2DServer::BODY_MODE_RIGID: { - - //update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet) - float total_area=0; - - for (int i=0;imass / total_area; - - _inertia += shape->get_moment_of_inertia(mass) + mass * get_shape_transform(i).get_origin().length_squared(); - - } - - if (_inertia!=0) - _inv_inertia=1.0/_inertia; - else - _inv_inertia=0.0; //wathever - - if (mass) - _inv_mass=1.0/mass; - else - _inv_mass=0; - - } break; - case Physics2DServer::BODY_MODE_STATIC_ACTIVE: - case Physics2DServer::BODY_MODE_STATIC: { - - _inv_inertia=0; - _inv_mass=0; - } break; - case Physics2DServer::BODY_MODE_CHARACTER: { - - _inv_inertia=0; - _inv_mass=1.0/mass; - - } break; - } - //_update_inertia_tensor(); - - //_update_shapes(); - -} - - - -void Body2DSW::set_active(bool p_active) { - - if (active==p_active) - return; - - active=p_active; - if (!p_active) { - if (get_space()) - get_space()->body_remove_from_active_list(&active_list); - } else { - if (mode==Physics2DServer::BODY_MODE_STATIC) - return; //static bodies can't become active - if (get_space()) - get_space()->body_add_to_active_list(&active_list); - - //still_time=0; - } -/* - if (!space) - return; - - for(int i=0;i0) { - get_space()->get_broadphase()->set_active(s.bpid,active); - } - } -*/ -} - - - -void Body2DSW::set_param(Physics2DServer::BodyParameter p_param, float p_value) { - - switch(p_param) { - case Physics2DServer::BODY_PARAM_BOUNCE: { - - bounce=p_value; - } break; - case Physics2DServer::BODY_PARAM_FRICTION: { - - friction=p_value; - } break; - case Physics2DServer::BODY_PARAM_MASS: { - ERR_FAIL_COND(p_value<=0); - mass=p_value; - _update_inertia(); - - } break; - default:{} - } -} - -float Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const { - - switch(p_param) { - case Physics2DServer::BODY_PARAM_BOUNCE: { - - return bounce; - } break; - case Physics2DServer::BODY_PARAM_FRICTION: { - - return friction; - } break; - case Physics2DServer::BODY_PARAM_MASS: { - return mass; - } break; - default:{} - } - - return 0; -} - -void Body2DSW::set_mode(Physics2DServer::BodyMode p_mode) { - - mode=p_mode; - - switch(p_mode) { - //CLEAR UP EVERYTHING IN CASE IT NOT WORKS! - case Physics2DServer::BODY_MODE_STATIC: - case Physics2DServer::BODY_MODE_STATIC_ACTIVE: { - - _set_inv_transform(get_transform().affine_inverse()); - _inv_mass=0; - _set_static(p_mode==Physics2DServer::BODY_MODE_STATIC); - set_active(p_mode==Physics2DServer::BODY_MODE_STATIC_ACTIVE); - linear_velocity=Vector2(); - angular_velocity=0; - } break; - case Physics2DServer::BODY_MODE_RIGID: { - - _inv_mass=mass>0?(1.0/mass):0; - _set_static(false); - simulated_motion=false; //jic - - } break; - case Physics2DServer::BODY_MODE_CHARACTER: { - - _inv_mass=mass>0?(1.0/mass):0; - _set_static(false); - simulated_motion=false; //jic - } break; - } - - _update_inertia(); - //if (get_space()) -// _update_queries(); - -} -Physics2DServer::BodyMode Body2DSW::get_mode() const { - - return mode; -} - -void Body2DSW::_shapes_changed() { - - _update_inertia(); - wakeup_neighbours(); -} - -void Body2DSW::set_state(Physics2DServer::BodyState p_state, const Variant& p_variant) { - - switch(p_state) { - case Physics2DServer::BODY_STATE_TRANSFORM: { - - - if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_STATIC_ACTIVE) { - _set_transform(p_variant); - _set_inv_transform(get_transform().affine_inverse()); - wakeup_neighbours(); - } else { - Matrix32 t = p_variant; - t.orthonormalize(); - _set_transform(t); - _set_inv_transform(get_transform().inverse()); - - } - - } break; - case Physics2DServer::BODY_STATE_LINEAR_VELOCITY: { - - //if (mode==Physics2DServer::BODY_MODE_STATIC) - // break; - linear_velocity=p_variant; - - } break; - case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: { - //if (mode!=Physics2DServer::BODY_MODE_RIGID) - // break; - angular_velocity=p_variant; - - } break; - case Physics2DServer::BODY_STATE_SLEEPING: { - //? - if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_STATIC_ACTIVE) - break; - bool do_sleep=p_variant; - if (do_sleep) { - linear_velocity=Vector2(); - //biased_linear_velocity=Vector3(); - angular_velocity=0; - //biased_angular_velocity=Vector3(); - set_active(false); - } else { - if (mode!=Physics2DServer::BODY_MODE_STATIC) - set_active(true); - } - } break; - case Physics2DServer::BODY_STATE_CAN_SLEEP: { - can_sleep=p_variant; - if (mode==Physics2DServer::BODY_MODE_RIGID && !active && !can_sleep) - set_active(true); - - } break; - } - -} -Variant Body2DSW::get_state(Physics2DServer::BodyState p_state) const { - - switch(p_state) { - case Physics2DServer::BODY_STATE_TRANSFORM: { - return get_transform(); - } break; - case Physics2DServer::BODY_STATE_LINEAR_VELOCITY: { - return linear_velocity; - } break; - case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: { - return angular_velocity; - } break; - case Physics2DServer::BODY_STATE_SLEEPING: { - return !is_active(); - } break; - case Physics2DServer::BODY_STATE_CAN_SLEEP: { - return can_sleep; - } break; - } - - return Variant(); -} - - -void Body2DSW::set_space(Space2DSW *p_space){ - - if (get_space()) { - - wakeup_neighbours(); - - if (inertia_update_list.in_list()) - get_space()->body_remove_from_inertia_update_list(&inertia_update_list); - if (active_list.in_list()) - get_space()->body_remove_from_active_list(&active_list); - if (direct_state_query_list.in_list()) - get_space()->body_remove_from_state_query_list(&direct_state_query_list); - - } - - _set_space(p_space); - - if (get_space()) { - - _update_inertia(); - if (active) - get_space()->body_add_to_active_list(&active_list); -// _update_queries(); - //if (is_active()) { - // active=false; - // set_active(true); - //} - - } - -} - -void Body2DSW::_compute_area_gravity(const Area2DSW *p_area) { - - if (p_area->is_gravity_point()) { - - gravity = (p_area->get_transform().get_origin()+p_area->get_gravity_vector() - get_transform().get_origin()).normalized() * p_area->get_gravity(); - - } else { - gravity = p_area->get_gravity_vector() * p_area->get_gravity(); - } -} - -void Body2DSW::integrate_forces(real_t p_step) { - - if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_STATIC_ACTIVE) - return; - - Area2DSW *current_area = get_space()->get_default_area(); - ERR_FAIL_COND(!current_area); - - int prio = current_area->get_priority(); - int ac = areas.size(); - if (ac) { - const AreaCMP *aa = &areas[0]; - for(int i=0;iget_priority() > prio) { - current_area=aa[i].area; - prio=current_area->get_priority(); - } - } - } - - _compute_area_gravity(current_area); - density=current_area->get_density(); - - if (!omit_force_integration) { - //overriden by direct state query - - Vector2 force=gravity*mass; - force+=applied_force; - real_t torque=applied_torque; - - real_t damp = 1.0 - p_step * density; - - if (damp<0) // reached zero in the given time - damp=0; - - real_t angular_damp = 1.0 - p_step * density * get_space()->get_body_angular_velocity_damp_ratio(); - - if (angular_damp<0) // reached zero in the given time - angular_damp=0; - - linear_velocity*=damp; - angular_velocity*=angular_damp; - - linear_velocity+=_inv_mass * force * p_step; - angular_velocity+=_inv_inertia * torque * p_step; - } - - - //motion=linear_velocity*p_step; - - biased_angular_velocity=0; - biased_linear_velocity=Vector2(); - - if (continuous_cd) //shapes temporarily extend for raycast - _update_shapes_with_motion(linear_velocity*p_step); - - current_area=NULL; // clear the area, so it is set in the next frame - contact_count=0; - -} - -void Body2DSW::integrate_velocities(real_t p_step) { - - if (mode==Physics2DServer::BODY_MODE_STATIC) - return; - if (mode==Physics2DServer::BODY_MODE_STATIC_ACTIVE) { - if (fi_callback) - get_space()->body_add_to_state_query_list(&direct_state_query_list); - return; - } - - real_t total_angular_velocity = angular_velocity+biased_angular_velocity; - Vector2 total_linear_velocity=linear_velocity+biased_linear_velocity; - - real_t angle = get_transform().get_rotation() - total_angular_velocity * p_step; - Vector2 pos = get_transform().get_origin() + total_linear_velocity * p_step; - - - _set_transform(Matrix32(angle,pos)); - _set_inv_transform(get_transform().inverse()); - - - if (fi_callback) { - - get_space()->body_add_to_state_query_list(&direct_state_query_list); - } - - //_update_inertia_tensor(); -} - - -void Body2DSW::simulate_motion(const Matrix32& p_xform,real_t p_step) { - - Matrix32 inv_xform = p_xform.affine_inverse(); - if (!get_space()) { - _set_transform(p_xform); - _set_inv_transform(inv_xform); - - return; - } - - - - linear_velocity = (p_xform.elements[2] - get_transform().elements[2])/p_step; - - real_t rot = inv_xform.basis_xform(get_transform().elements[1]).atan2(); - angular_velocity = rot / p_step; - - if (!direct_state_query_list.in_list())// - callalways, so lv and av are cleared && (state_query || direct_state_query)) - get_space()->body_add_to_state_query_list(&direct_state_query_list); - simulated_motion=true; - _set_transform(p_xform); - - -} - -void Body2DSW::wakeup_neighbours() { - - - - for(Map::Element *E=constraint_map.front();E;E=E->next()) { - - const Constraint2DSW *c=E->key(); - Body2DSW **n = c->get_body_ptr(); - int bc=c->get_body_count(); - - for(int i=0;iget()) - continue; - Body2DSW *b = n[i]; - if (b->mode!=Physics2DServer::BODY_MODE_RIGID) - continue; - - if (!b->is_active()) - b->set_active(true); - } - } -} - -void Body2DSW::call_queries() { - - - if (fi_callback) { - - Physics2DDirectBodyStateSW *dbs = Physics2DDirectBodyStateSW::singleton; - dbs->body=this; - - Variant v=dbs; - const Variant *vp[2]={&v,&fi_callback->callback_udata}; - - Object *obj = ObjectDB::get_instance(fi_callback->id); - if (!obj) { - - set_force_integration_callback(NULL,StringName()); - } else { - Variant::CallError ce; - if (fi_callback->callback_udata.get_type()) { - - obj->call(fi_callback->method,vp,2,ce); - - } else { - obj->call(fi_callback->method,vp,1,ce); - } - } - - - } - - if (simulated_motion) { - - // linear_velocity=Vector2(); - // angular_velocity=0; - simulated_motion=false; - } -} - - -bool Body2DSW::sleep_test(real_t p_step) { - - if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_STATIC_ACTIVE) - return true; // - else if (mode==Physics2DServer::BODY_MODE_CHARACTER) - return !active; // characters don't sleep unless asked to sleep - else if (!can_sleep) - return false; - - - - - if (Math::abs(angular_velocity)get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold()*get_space()->get_body_linear_velocity_sleep_treshold()) { - - still_time+=p_step; - - return still_time > get_space()->get_body_time_to_sleep(); - } else { - - still_time=0; //maybe this should be set to 0 on set_active? - return false; - } -} - - -void Body2DSW::set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata) { - - if (fi_callback) { - - memdelete(fi_callback); - fi_callback=NULL; - } - - - if (p_id!=0) { - - fi_callback=memnew(ForceIntegrationCallback); - fi_callback->id=p_id; - fi_callback->method=p_method; - fi_callback->callback_udata=p_udata; - } - -} - -Body2DSW::Body2DSW() : CollisionObject2DSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) { - - - mode=Physics2DServer::BODY_MODE_RIGID; - active=true; - angular_velocity=0; - biased_angular_velocity=0; - mass=1; - _inv_inertia=0; - _inv_mass=1; - bounce=0; - friction=1; - omit_force_integration=false; - applied_torque=0; - island_step=0; - island_next=NULL; - island_list_next=NULL; - _set_static(false); - density=0; - contact_count=0; - simulated_motion=false; - still_time=0; - continuous_cd=false; - can_sleep=false; - fi_callback=NULL; - -} - -Body2DSW::~Body2DSW() { - - if (fi_callback) - memdelete(fi_callback); -} - -Physics2DDirectBodyStateSW *Physics2DDirectBodyStateSW::singleton=NULL; - -Physics2DDirectSpaceState* Physics2DDirectBodyStateSW::get_space_state() { - - return body->get_space()->get_direct_state(); -} +#include "body_2d_sw.h" +#include "space_2d_sw.h" +#include "area_2d_sw.h" + +void Body2DSW::_update_inertia() { + + if (get_space() && !inertia_update_list.in_list()) + get_space()->body_add_to_inertia_update_list(&inertia_update_list); + +} + + + +void Body2DSW::update_inertias() { + + //update shapes and motions + + switch(mode) { + + case Physics2DServer::BODY_MODE_RIGID: { + + //update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet) + float total_area=0; + + for (int i=0;imass / total_area; + + _inertia += shape->get_moment_of_inertia(mass) + mass * get_shape_transform(i).get_origin().length_squared(); + + } + + if (_inertia!=0) + _inv_inertia=1.0/_inertia; + else + _inv_inertia=0.0; //wathever + + if (mass) + _inv_mass=1.0/mass; + else + _inv_mass=0; + + } break; + case Physics2DServer::BODY_MODE_KINEMATIC: + case Physics2DServer::BODY_MODE_STATIC: { + + _inv_inertia=0; + _inv_mass=0; + } break; + case Physics2DServer::BODY_MODE_CHARACTER: { + + _inv_inertia=0; + _inv_mass=1.0/mass; + + } break; + } + //_update_inertia_tensor(); + + //_update_shapes(); + +} + + + +void Body2DSW::set_active(bool p_active) { + + if (active==p_active) + return; + + active=p_active; + if (!p_active) { + if (get_space()) + get_space()->body_remove_from_active_list(&active_list); + } else { + if (mode==Physics2DServer::BODY_MODE_STATIC) + return; //static bodies can't become active + if (get_space()) + get_space()->body_add_to_active_list(&active_list); + + //still_time=0; + } +/* + if (!space) + return; + + for(int i=0;i0) { + get_space()->get_broadphase()->set_active(s.bpid,active); + } + } +*/ +} + + + +void Body2DSW::set_param(Physics2DServer::BodyParameter p_param, float p_value) { + + switch(p_param) { + case Physics2DServer::BODY_PARAM_BOUNCE: { + + bounce=p_value; + } break; + case Physics2DServer::BODY_PARAM_FRICTION: { + + friction=p_value; + } break; + case Physics2DServer::BODY_PARAM_MASS: { + ERR_FAIL_COND(p_value<=0); + mass=p_value; + _update_inertia(); + + } break; + default:{} + } +} + +float Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const { + + switch(p_param) { + case Physics2DServer::BODY_PARAM_BOUNCE: { + + return bounce; + } break; + case Physics2DServer::BODY_PARAM_FRICTION: { + + return friction; + } break; + case Physics2DServer::BODY_PARAM_MASS: { + return mass; + } break; + default:{} + } + + return 0; +} + +void Body2DSW::set_mode(Physics2DServer::BodyMode p_mode) { + + mode=p_mode; + + switch(p_mode) { + //CLEAR UP EVERYTHING IN CASE IT NOT WORKS! + case Physics2DServer::BODY_MODE_STATIC: + case Physics2DServer::BODY_MODE_KINEMATIC: { + + _set_inv_transform(get_transform().affine_inverse()); + _inv_mass=0; + _set_static(p_mode==Physics2DServer::BODY_MODE_STATIC); + //set_active(p_mode==Physics2DServer::BODY_MODE_KINEMATIC); + linear_velocity=Vector2(); + angular_velocity=0; + } break; + case Physics2DServer::BODY_MODE_RIGID: { + + _inv_mass=mass>0?(1.0/mass):0; + _set_static(false); + + } break; + case Physics2DServer::BODY_MODE_CHARACTER: { + + _inv_mass=mass>0?(1.0/mass):0; + _set_static(false); + } break; + } + + _update_inertia(); + //if (get_space()) +// _update_queries(); + +} +Physics2DServer::BodyMode Body2DSW::get_mode() const { + + return mode; +} + +void Body2DSW::_shapes_changed() { + + _update_inertia(); + wakeup_neighbours(); +} + +void Body2DSW::set_state(Physics2DServer::BodyState p_state, const Variant& p_variant) { + + switch(p_state) { + case Physics2DServer::BODY_STATE_TRANSFORM: { + + + if (mode==Physics2DServer::BODY_MODE_KINEMATIC) { + new_transform=p_variant; + //wakeup_neighbours(); + set_active(true); + } else if (mode==Physics2DServer::BODY_MODE_STATIC) { + _set_transform(p_variant); + _set_inv_transform(get_transform().affine_inverse()); + wakeup_neighbours(); + } else { + Matrix32 t = p_variant; + t.orthonormalize(); + new_transform=get_transform(); //used as old to compute motion + _set_transform(t); + _set_inv_transform(get_transform().inverse()); + + } + + } break; + case Physics2DServer::BODY_STATE_LINEAR_VELOCITY: { + + //if (mode==Physics2DServer::BODY_MODE_STATIC) + // break; + linear_velocity=p_variant; + + } break; + case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: { + //if (mode!=Physics2DServer::BODY_MODE_RIGID) + // break; + angular_velocity=p_variant; + + } break; + case Physics2DServer::BODY_STATE_SLEEPING: { + //? + if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_KINEMATIC) + break; + bool do_sleep=p_variant; + if (do_sleep) { + linear_velocity=Vector2(); + //biased_linear_velocity=Vector3(); + angular_velocity=0; + //biased_angular_velocity=Vector3(); + set_active(false); + } else { + if (mode!=Physics2DServer::BODY_MODE_STATIC) + set_active(true); + } + } break; + case Physics2DServer::BODY_STATE_CAN_SLEEP: { + can_sleep=p_variant; + if (mode==Physics2DServer::BODY_MODE_RIGID && !active && !can_sleep) + set_active(true); + + } break; + } + +} +Variant Body2DSW::get_state(Physics2DServer::BodyState p_state) const { + + switch(p_state) { + case Physics2DServer::BODY_STATE_TRANSFORM: { + return get_transform(); + } break; + case Physics2DServer::BODY_STATE_LINEAR_VELOCITY: { + return linear_velocity; + } break; + case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: { + return angular_velocity; + } break; + case Physics2DServer::BODY_STATE_SLEEPING: { + return !is_active(); + } break; + case Physics2DServer::BODY_STATE_CAN_SLEEP: { + return can_sleep; + } break; + } + + return Variant(); +} + + +void Body2DSW::set_space(Space2DSW *p_space){ + + if (get_space()) { + + wakeup_neighbours(); + + if (inertia_update_list.in_list()) + get_space()->body_remove_from_inertia_update_list(&inertia_update_list); + if (active_list.in_list()) + get_space()->body_remove_from_active_list(&active_list); + if (direct_state_query_list.in_list()) + get_space()->body_remove_from_state_query_list(&direct_state_query_list); + + } + + _set_space(p_space); + + if (get_space()) { + + _update_inertia(); + if (active) + get_space()->body_add_to_active_list(&active_list); +// _update_queries(); + //if (is_active()) { + // active=false; + // set_active(true); + //} + + } + +} + +void Body2DSW::_compute_area_gravity(const Area2DSW *p_area) { + + if (p_area->is_gravity_point()) { + + gravity = (p_area->get_transform().get_origin()+p_area->get_gravity_vector() - get_transform().get_origin()).normalized() * p_area->get_gravity(); + + } else { + gravity = p_area->get_gravity_vector() * p_area->get_gravity(); + } +} + +void Body2DSW::integrate_forces(real_t p_step) { + + if (mode==Physics2DServer::BODY_MODE_STATIC) + return; + + Area2DSW *current_area = get_space()->get_default_area(); + ERR_FAIL_COND(!current_area); + + int prio = current_area->get_priority(); + int ac = areas.size(); + if (ac) { + const AreaCMP *aa = &areas[0]; + for(int i=0;iget_priority() > prio) { + current_area=aa[i].area; + prio=current_area->get_priority(); + } + } + } + + _compute_area_gravity(current_area); + density=current_area->get_density(); + + Vector2 motion; + bool do_motion=false; + + if (mode==Physics2DServer::BODY_MODE_KINEMATIC) { + + //compute motion, angular and etc. velocities from prev transform + linear_velocity = (new_transform.elements[2] - get_transform().elements[2])/p_step; + + real_t rot = new_transform.affine_inverse().basis_xform(get_transform().elements[1]).atan2(); + angular_velocity = rot / p_step; + + motion = new_transform.elements[2] - get_transform().elements[2]; + do_motion=true; + + for(int i=0;iget_body_angular_velocity_damp_ratio(); + + if (angular_damp<0) // reached zero in the given time + angular_damp=0; + + linear_velocity*=damp; + angular_velocity*=angular_damp; + + linear_velocity+=_inv_mass * force * p_step; + angular_velocity+=_inv_inertia * torque * p_step; + } + + if (continuous_cd_mode!=Physics2DServer::CCD_MODE_DISABLED) { + + motion = new_transform.get_origin() - get_transform().get_origin(); + //linear_velocity*p_step; + do_motion=true; + } + } + + + //motion=linear_velocity*p_step; + + biased_angular_velocity=0; + biased_linear_velocity=Vector2(); + + if (do_motion) {//shapes temporarily extend for raycast + _update_shapes_with_motion(motion); + } + + current_area=NULL; // clear the area, so it is set in the next frame + contact_count=0; + +} + +void Body2DSW::integrate_velocities(real_t p_step) { + + if (mode==Physics2DServer::BODY_MODE_STATIC) + return; + + if (fi_callback) + get_space()->body_add_to_state_query_list(&direct_state_query_list); + + if (mode==Physics2DServer::BODY_MODE_KINEMATIC) { + + _set_transform(new_transform,false); + _set_inv_transform(new_transform.affine_inverse()); ; + if (linear_velocity==Vector2() && angular_velocity==0) + set_active(false); //stopped moving, deactivate + return; + } + + real_t total_angular_velocity = angular_velocity+biased_angular_velocity; + Vector2 total_linear_velocity=linear_velocity+biased_linear_velocity; + + real_t angle = get_transform().get_rotation() - total_angular_velocity * p_step; + Vector2 pos = get_transform().get_origin() + total_linear_velocity * p_step; + + _set_transform(Matrix32(angle,pos),continuous_cd_mode==Physics2DServer::CCD_MODE_DISABLED); + _set_inv_transform(get_transform().inverse()); + + if (continuous_cd_mode!=Physics2DServer::CCD_MODE_DISABLED) + new_transform=get_transform(); + + //_update_inertia_tensor(); +} + + + +void Body2DSW::wakeup_neighbours() { + + + + for(Map::Element *E=constraint_map.front();E;E=E->next()) { + + const Constraint2DSW *c=E->key(); + Body2DSW **n = c->get_body_ptr(); + int bc=c->get_body_count(); + + for(int i=0;iget()) + continue; + Body2DSW *b = n[i]; + if (b->mode!=Physics2DServer::BODY_MODE_RIGID) + continue; + + if (!b->is_active()) + b->set_active(true); + } + } +} + +void Body2DSW::call_queries() { + + + if (fi_callback) { + + Physics2DDirectBodyStateSW *dbs = Physics2DDirectBodyStateSW::singleton; + dbs->body=this; + + Variant v=dbs; + const Variant *vp[2]={&v,&fi_callback->callback_udata}; + + Object *obj = ObjectDB::get_instance(fi_callback->id); + if (!obj) { + + set_force_integration_callback(0,StringName()); + } else { + Variant::CallError ce; + if (fi_callback->callback_udata.get_type()) { + + obj->call(fi_callback->method,vp,2,ce); + + } else { + obj->call(fi_callback->method,vp,1,ce); + } + } + + + } + +} + + +bool Body2DSW::sleep_test(real_t p_step) { + + if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_KINEMATIC) + return true; // + else if (mode==Physics2DServer::BODY_MODE_CHARACTER) + return !active; // characters and kinematic bodies don't sleep unless asked to sleep + else if (!can_sleep) + return false; + + + + + if (Math::abs(angular_velocity)get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold()*get_space()->get_body_linear_velocity_sleep_treshold()) { + + still_time+=p_step; + + return still_time > get_space()->get_body_time_to_sleep(); + } else { + + still_time=0; //maybe this should be set to 0 on set_active? + return false; + } +} + + +void Body2DSW::set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata) { + + if (fi_callback) { + + memdelete(fi_callback); + fi_callback=NULL; + } + + + if (p_id!=0) { + + fi_callback=memnew(ForceIntegrationCallback); + fi_callback->id=p_id; + fi_callback->method=p_method; + fi_callback->callback_udata=p_udata; + } + +} + +Body2DSW::Body2DSW() : CollisionObject2DSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) { + + + mode=Physics2DServer::BODY_MODE_RIGID; + active=true; + angular_velocity=0; + biased_angular_velocity=0; + mass=1; + _inv_inertia=0; + _inv_mass=1; + bounce=0; + friction=1; + omit_force_integration=false; + applied_torque=0; + island_step=0; + island_next=NULL; + island_list_next=NULL; + _set_static(false); + density=0; + contact_count=0; + + still_time=0; + continuous_cd_mode=Physics2DServer::CCD_MODE_DISABLED; + can_sleep=false; + fi_callback=NULL; + +} + +Body2DSW::~Body2DSW() { + + if (fi_callback) + memdelete(fi_callback); +} + +Physics2DDirectBodyStateSW *Physics2DDirectBodyStateSW::singleton=NULL; + +Physics2DDirectSpaceState* Physics2DDirectBodyStateSW::get_space_state() { + + return body->get_space()->get_direct_state(); +} diff --git a/servers/physics_2d/body_2d_sw.h b/servers/physics_2d/body_2d_sw.h index 55b84ce7a73..14cae3dbb02 100644 --- a/servers/physics_2d/body_2d_sw.h +++ b/servers/physics_2d/body_2d_sw.h @@ -26,309 +26,321 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef BODY_2D_SW_H -#define BODY_2D_SW_H - -#include "collision_object_2d_sw.h" -#include "vset.h" -#include "area_2d_sw.h" - -class Constraint2DSW; - - -class Body2DSW : public CollisionObject2DSW { - - - Physics2DServer::BodyMode mode; - - Vector2 biased_linear_velocity; - real_t biased_angular_velocity; - - Vector2 linear_velocity; - real_t angular_velocity; - - real_t mass; - real_t bounce; - real_t friction; - - real_t _inv_mass; - real_t _inv_inertia; - - Vector2 gravity; - real_t density; - - real_t still_time; - - Vector2 applied_force; - real_t applied_torque; - - SelfList active_list; - SelfList inertia_update_list; - SelfList direct_state_query_list; - - VSet exceptions; - bool omit_force_integration; - bool active; - bool simulated_motion; - bool continuous_cd; - bool can_sleep; - void _update_inertia(); - virtual void _shapes_changed(); - - - Map constraint_map; - - struct AreaCMP { - - Area2DSW *area; - _FORCE_INLINE_ bool operator<(const AreaCMP& p_cmp) const { return area->get_self() < p_cmp.area->get_self() ; } - _FORCE_INLINE_ AreaCMP() {} - _FORCE_INLINE_ AreaCMP(Area2DSW *p_area) { area=p_area;} - }; - - - VSet areas; - - struct Contact { - - - Vector2 local_pos; - Vector2 local_normal; - float depth; - int local_shape; - Vector2 collider_pos; - int collider_shape; - ObjectID collider_instance_id; - RID collider; - Vector2 collider_velocity_at_pos; - }; - - Vector contacts; //no contacts by default - int contact_count; - - struct ForceIntegrationCallback { - - ObjectID id; - StringName method; - Variant callback_udata; - }; - - ForceIntegrationCallback *fi_callback; - - - uint64_t island_step; - Body2DSW *island_next; - Body2DSW *island_list_next; - - _FORCE_INLINE_ void _compute_area_gravity(const Area2DSW *p_area); - -friend class Physics2DDirectBodyStateSW; // i give up, too many functions to expose - -public: - - - void set_force_integration_callback(ObjectID p_id, const StringName& p_method, const Variant &p_udata=Variant()); - - - _FORCE_INLINE_ void add_area(Area2DSW *p_area) { areas.insert(AreaCMP(p_area)); } - _FORCE_INLINE_ void remove_area(Area2DSW *p_area) { areas.erase(AreaCMP(p_area)); } - - _FORCE_INLINE_ void set_max_contacts_reported(int p_size) { contacts.resize(p_size); contact_count=0; } - _FORCE_INLINE_ int get_max_contacts_reported() const { return contacts.size(); } - - _FORCE_INLINE_ bool can_report_contacts() const { return !contacts.empty(); } - _FORCE_INLINE_ void add_contact(const Vector2& p_local_pos,const Vector2& p_local_normal, float p_depth, int p_local_shape, const Vector2& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector2& p_collider_velocity_at_pos); - - - _FORCE_INLINE_ void add_exception(const RID& p_exception) { exceptions.insert(p_exception);} - _FORCE_INLINE_ void remove_exception(const RID& p_exception) { exceptions.erase(p_exception);} - _FORCE_INLINE_ bool has_exception(const RID& p_exception) const { return exceptions.has(p_exception);} - _FORCE_INLINE_ const VSet& get_exceptions() const { return exceptions;} - - _FORCE_INLINE_ uint64_t get_island_step() const { return island_step; } - _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step=p_step; } - - _FORCE_INLINE_ Body2DSW* get_island_next() const { return island_next; } - _FORCE_INLINE_ void set_island_next(Body2DSW* p_next) { island_next=p_next; } - - _FORCE_INLINE_ Body2DSW* get_island_list_next() const { return island_list_next; } - _FORCE_INLINE_ void set_island_list_next(Body2DSW* p_next) { island_list_next=p_next; } - - _FORCE_INLINE_ void add_constraint(Constraint2DSW* p_constraint, int p_pos) { constraint_map[p_constraint]=p_pos; } - _FORCE_INLINE_ void remove_constraint(Constraint2DSW* p_constraint) { constraint_map.erase(p_constraint); } - const Map& get_constraint_map() const { return constraint_map; } - - _FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration=p_omit_force_integration; } - _FORCE_INLINE_ bool get_omit_force_integration() const { return omit_force_integration; } - - _FORCE_INLINE_ void set_linear_velocity(const Vector2& p_velocity) {linear_velocity=p_velocity; } - _FORCE_INLINE_ Vector2 get_linear_velocity() const { return linear_velocity; } - - _FORCE_INLINE_ void set_angular_velocity(real_t p_velocity) { angular_velocity=p_velocity; } - _FORCE_INLINE_ real_t get_angular_velocity() const { return angular_velocity; } - - _FORCE_INLINE_ void set_biased_linear_velocity(const Vector2& p_velocity) {biased_linear_velocity=p_velocity; } - _FORCE_INLINE_ Vector2 get_biased_linear_velocity() const { return biased_linear_velocity; } - - _FORCE_INLINE_ void set_biased_angular_velocity(real_t p_velocity) { biased_angular_velocity=p_velocity; } - _FORCE_INLINE_ real_t get_biased_angular_velocity() const { return biased_angular_velocity; } - - _FORCE_INLINE_ void apply_impulse(const Vector2& p_pos, const Vector2& p_j) { - - linear_velocity += p_j * _inv_mass; - angular_velocity += _inv_inertia * p_pos.cross(p_j); - } - - _FORCE_INLINE_ void apply_bias_impulse(const Vector2& p_pos, const Vector2& p_j) { - - biased_linear_velocity += p_j * _inv_mass; - biased_angular_velocity += _inv_inertia * p_pos.cross(p_j); - } - - void set_active(bool p_active); - _FORCE_INLINE_ bool is_active() const { return active; } - - void set_param(Physics2DServer::BodyParameter p_param, float); - float get_param(Physics2DServer::BodyParameter p_param) const; - - void set_mode(Physics2DServer::BodyMode p_mode); - Physics2DServer::BodyMode get_mode() const; - - void set_state(Physics2DServer::BodyState p_state, const Variant& p_variant); - Variant get_state(Physics2DServer::BodyState p_state) const; - - void set_applied_force(const Vector2& p_force) { applied_force=p_force; } - Vector2 get_applied_force() const { return applied_force; } - - void set_applied_torque(real_t p_torque) { applied_torque=p_torque; } - real_t get_applied_torque() const { return applied_torque; } - - _FORCE_INLINE_ void set_continuous_collision_detection(bool p_enable) { continuous_cd=p_enable; } - _FORCE_INLINE_ bool is_continuous_collision_detection_enabled() const { return continuous_cd; } - - void set_space(Space2DSW *p_space); - - void update_inertias(); - - _FORCE_INLINE_ real_t get_inv_mass() const { return _inv_mass; } - _FORCE_INLINE_ real_t get_inv_inertia() const { return _inv_inertia; } - _FORCE_INLINE_ real_t get_friction() const { return friction; } - _FORCE_INLINE_ Vector2 get_gravity() const { return gravity; } - _FORCE_INLINE_ real_t get_density() const { return density; } - - void integrate_forces(real_t p_step); - void integrate_velocities(real_t p_step); - - void simulate_motion(const Matrix32& p_xform,real_t p_step); - void call_queries(); - void wakeup_neighbours(); - - bool sleep_test(real_t p_step); - - Body2DSW(); - ~Body2DSW(); - -}; - - -//add contact inline - -void Body2DSW::add_contact(const Vector2& p_local_pos,const Vector2& p_local_normal, float p_depth, int p_local_shape, const Vector2& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector2& p_collider_velocity_at_pos) { - - int c_max=contacts.size(); - - if (c_max==0) - return; - - Contact *c = &contacts[0]; - - - int idx=-1; - - if (contact_count=0 && least_depthget_gravity(); } // get gravity vector working on this body space/area - virtual float get_total_density() const { return body->get_density(); } // get density of this body space/area - - virtual float get_inverse_mass() const { return body->get_inv_mass(); } // get the mass - virtual real_t get_inverse_inertia() const { return body->get_inv_inertia(); } // get density of this body space - - virtual void set_linear_velocity(const Vector2& p_velocity) { body->set_linear_velocity(p_velocity); } - virtual Vector2 get_linear_velocity() const { return body->get_linear_velocity(); } - - virtual void set_angular_velocity(real_t p_velocity) { body->set_angular_velocity(p_velocity); } - virtual real_t get_angular_velocity() const { return body->get_angular_velocity(); } - - virtual void set_transform(const Matrix32& p_transform) { body->set_state(Physics2DServer::BODY_STATE_TRANSFORM,p_transform); } - virtual Matrix32 get_transform() const { return body->get_transform(); } - - virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); } - virtual bool is_sleeping() const { return !body->is_active(); } - - virtual int get_contact_count() const { return body->contact_count; } - - virtual Vector2 get_contact_local_pos(int p_contact_idx) const { - ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); - return body->contacts[p_contact_idx].local_pos; - } - virtual Vector2 get_contact_local_normal(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].local_normal; } - virtual int get_contact_local_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,-1); return body->contacts[p_contact_idx].local_shape; } - - virtual RID get_contact_collider(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,RID()); return body->contacts[p_contact_idx].collider; } - virtual Vector2 get_contact_collider_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].collider_pos; } - virtual ObjectID get_contact_collider_id(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_instance_id; } - virtual int get_contact_collider_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_shape; } - virtual Vector2 get_contact_collider_velocity_at_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].collider_velocity_at_pos; } - - virtual Physics2DDirectSpaceState* get_space_state(); - - - virtual real_t get_step() const { return step; } - Physics2DDirectBodyStateSW() { singleton=this; body=NULL; } -}; - - -#endif // BODY_2D_SW_H +#ifndef BODY_2D_SW_H +#define BODY_2D_SW_H + +#include "collision_object_2d_sw.h" +#include "vset.h" +#include "area_2d_sw.h" + +class Constraint2DSW; + + +class Body2DSW : public CollisionObject2DSW { + + + Physics2DServer::BodyMode mode; + + Vector2 biased_linear_velocity; + real_t biased_angular_velocity; + + Vector2 linear_velocity; + real_t angular_velocity; + + real_t mass; + real_t bounce; + real_t friction; + + real_t _inv_mass; + real_t _inv_inertia; + + Vector2 gravity; + real_t density; + + real_t still_time; + + Vector2 applied_force; + real_t applied_torque; + + SelfList active_list; + SelfList inertia_update_list; + SelfList direct_state_query_list; + + VSet exceptions; + Physics2DServer::CCDMode continuous_cd_mode; + bool omit_force_integration; + bool active; + bool can_sleep; + void _update_inertia(); + virtual void _shapes_changed(); + Matrix32 new_transform; + + + Map constraint_map; + + struct AreaCMP { + + Area2DSW *area; + _FORCE_INLINE_ bool operator<(const AreaCMP& p_cmp) const { return area->get_self() < p_cmp.area->get_self() ; } + _FORCE_INLINE_ AreaCMP() {} + _FORCE_INLINE_ AreaCMP(Area2DSW *p_area) { area=p_area;} + }; + + + VSet areas; + + struct Contact { + + + Vector2 local_pos; + Vector2 local_normal; + float depth; + int local_shape; + Vector2 collider_pos; + int collider_shape; + ObjectID collider_instance_id; + RID collider; + Vector2 collider_velocity_at_pos; + }; + + Vector contacts; //no contacts by default + int contact_count; + + struct ForceIntegrationCallback { + + ObjectID id; + StringName method; + Variant callback_udata; + }; + + ForceIntegrationCallback *fi_callback; + + + uint64_t island_step; + Body2DSW *island_next; + Body2DSW *island_list_next; + + _FORCE_INLINE_ void _compute_area_gravity(const Area2DSW *p_area); + +friend class Physics2DDirectBodyStateSW; // i give up, too many functions to expose + +public: + + + void set_force_integration_callback(ObjectID p_id, const StringName& p_method, const Variant &p_udata=Variant()); + + + _FORCE_INLINE_ void add_area(Area2DSW *p_area) { areas.insert(AreaCMP(p_area)); } + _FORCE_INLINE_ void remove_area(Area2DSW *p_area) { areas.erase(AreaCMP(p_area)); } + + _FORCE_INLINE_ void set_max_contacts_reported(int p_size) { contacts.resize(p_size); contact_count=0; } + _FORCE_INLINE_ int get_max_contacts_reported() const { return contacts.size(); } + + _FORCE_INLINE_ bool can_report_contacts() const { return !contacts.empty(); } + _FORCE_INLINE_ void add_contact(const Vector2& p_local_pos,const Vector2& p_local_normal, float p_depth, int p_local_shape, const Vector2& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector2& p_collider_velocity_at_pos); + + + _FORCE_INLINE_ void add_exception(const RID& p_exception) { exceptions.insert(p_exception);} + _FORCE_INLINE_ void remove_exception(const RID& p_exception) { exceptions.erase(p_exception);} + _FORCE_INLINE_ bool has_exception(const RID& p_exception) const { return exceptions.has(p_exception);} + _FORCE_INLINE_ const VSet& get_exceptions() const { return exceptions;} + + _FORCE_INLINE_ uint64_t get_island_step() const { return island_step; } + _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step=p_step; } + + _FORCE_INLINE_ Body2DSW* get_island_next() const { return island_next; } + _FORCE_INLINE_ void set_island_next(Body2DSW* p_next) { island_next=p_next; } + + _FORCE_INLINE_ Body2DSW* get_island_list_next() const { return island_list_next; } + _FORCE_INLINE_ void set_island_list_next(Body2DSW* p_next) { island_list_next=p_next; } + + _FORCE_INLINE_ void add_constraint(Constraint2DSW* p_constraint, int p_pos) { constraint_map[p_constraint]=p_pos; } + _FORCE_INLINE_ void remove_constraint(Constraint2DSW* p_constraint) { constraint_map.erase(p_constraint); } + const Map& get_constraint_map() const { return constraint_map; } + + _FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration=p_omit_force_integration; } + _FORCE_INLINE_ bool get_omit_force_integration() const { return omit_force_integration; } + + _FORCE_INLINE_ void set_linear_velocity(const Vector2& p_velocity) {linear_velocity=p_velocity; } + _FORCE_INLINE_ Vector2 get_linear_velocity() const { return linear_velocity; } + + _FORCE_INLINE_ void set_angular_velocity(real_t p_velocity) { angular_velocity=p_velocity; } + _FORCE_INLINE_ real_t get_angular_velocity() const { return angular_velocity; } + + _FORCE_INLINE_ void set_biased_linear_velocity(const Vector2& p_velocity) {biased_linear_velocity=p_velocity; } + _FORCE_INLINE_ Vector2 get_biased_linear_velocity() const { return biased_linear_velocity; } + + _FORCE_INLINE_ void set_biased_angular_velocity(real_t p_velocity) { biased_angular_velocity=p_velocity; } + _FORCE_INLINE_ real_t get_biased_angular_velocity() const { return biased_angular_velocity; } + + + _FORCE_INLINE_ void apply_impulse(const Vector2& p_pos, const Vector2& p_j) { + + linear_velocity += p_j * _inv_mass; + angular_velocity += _inv_inertia * p_pos.cross(p_j); + } + + _FORCE_INLINE_ void apply_bias_impulse(const Vector2& p_pos, const Vector2& p_j) { + + biased_linear_velocity += p_j * _inv_mass; + biased_angular_velocity += _inv_inertia * p_pos.cross(p_j); + } + + void set_active(bool p_active); + _FORCE_INLINE_ bool is_active() const { return active; } + + void set_param(Physics2DServer::BodyParameter p_param, float); + float get_param(Physics2DServer::BodyParameter p_param) const; + + void set_mode(Physics2DServer::BodyMode p_mode); + Physics2DServer::BodyMode get_mode() const; + + void set_state(Physics2DServer::BodyState p_state, const Variant& p_variant); + Variant get_state(Physics2DServer::BodyState p_state) const; + + void set_applied_force(const Vector2& p_force) { applied_force=p_force; } + Vector2 get_applied_force() const { return applied_force; } + + void set_applied_torque(real_t p_torque) { applied_torque=p_torque; } + real_t get_applied_torque() const { return applied_torque; } + + + _FORCE_INLINE_ void set_continuous_collision_detection_mode(Physics2DServer::CCDMode p_mode) { continuous_cd_mode=p_mode; } + _FORCE_INLINE_ Physics2DServer::CCDMode get_continuous_collision_detection_mode() const { return continuous_cd_mode; } + + void set_space(Space2DSW *p_space); + + void update_inertias(); + + _FORCE_INLINE_ real_t get_inv_mass() const { return _inv_mass; } + _FORCE_INLINE_ real_t get_inv_inertia() const { return _inv_inertia; } + _FORCE_INLINE_ real_t get_friction() const { return friction; } + _FORCE_INLINE_ Vector2 get_gravity() const { return gravity; } + _FORCE_INLINE_ real_t get_density() const { return density; } + _FORCE_INLINE_ real_t get_bounce() const { return bounce; } + + void integrate_forces(real_t p_step); + void integrate_velocities(real_t p_step); + + _FORCE_INLINE_ Vector2 get_motion() const { + + if (mode>Physics2DServer::BODY_MODE_KINEMATIC) { + return new_transform.get_origin() - get_transform().get_origin(); + } else if (mode==Physics2DServer::BODY_MODE_KINEMATIC) { + return get_transform().get_origin() -new_transform.get_origin(); //kinematic simulates forward + } + return Vector2(); + } + + void call_queries(); + void wakeup_neighbours(); + + bool sleep_test(real_t p_step); + + Body2DSW(); + ~Body2DSW(); + +}; + + +//add contact inline + +void Body2DSW::add_contact(const Vector2& p_local_pos,const Vector2& p_local_normal, float p_depth, int p_local_shape, const Vector2& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector2& p_collider_velocity_at_pos) { + + int c_max=contacts.size(); + + if (c_max==0) + return; + + Contact *c = &contacts[0]; + + + int idx=-1; + + if (contact_count=0 && least_depthget_gravity(); } // get gravity vector working on this body space/area + virtual float get_total_density() const { return body->get_density(); } // get density of this body space/area + + virtual float get_inverse_mass() const { return body->get_inv_mass(); } // get the mass + virtual real_t get_inverse_inertia() const { return body->get_inv_inertia(); } // get density of this body space + + virtual void set_linear_velocity(const Vector2& p_velocity) { body->set_linear_velocity(p_velocity); } + virtual Vector2 get_linear_velocity() const { return body->get_linear_velocity(); } + + virtual void set_angular_velocity(real_t p_velocity) { body->set_angular_velocity(p_velocity); } + virtual real_t get_angular_velocity() const { return body->get_angular_velocity(); } + + virtual void set_transform(const Matrix32& p_transform) { body->set_state(Physics2DServer::BODY_STATE_TRANSFORM,p_transform); } + virtual Matrix32 get_transform() const { return body->get_transform(); } + + virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); } + virtual bool is_sleeping() const { return !body->is_active(); } + + virtual int get_contact_count() const { return body->contact_count; } + + virtual Vector2 get_contact_local_pos(int p_contact_idx) const { + ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); + return body->contacts[p_contact_idx].local_pos; + } + virtual Vector2 get_contact_local_normal(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].local_normal; } + virtual int get_contact_local_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,-1); return body->contacts[p_contact_idx].local_shape; } + + virtual RID get_contact_collider(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,RID()); return body->contacts[p_contact_idx].collider; } + virtual Vector2 get_contact_collider_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].collider_pos; } + virtual ObjectID get_contact_collider_id(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_instance_id; } + virtual int get_contact_collider_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_shape; } + virtual Vector2 get_contact_collider_velocity_at_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].collider_velocity_at_pos; } + + virtual Physics2DDirectSpaceState* get_space_state(); + + + virtual real_t get_step() const { return step; } + Physics2DDirectBodyStateSW() { singleton=this; body=NULL; } +}; + + +#endif // BODY_2D_SW_H diff --git a/servers/physics_2d/body_pair_2d_sw.cpp b/servers/physics_2d/body_pair_2d_sw.cpp index 6d8215840ad..931125a1c02 100644 --- a/servers/physics_2d/body_pair_2d_sw.cpp +++ b/servers/physics_2d/body_pair_2d_sw.cpp @@ -46,7 +46,6 @@ void BodyPair2DSW::_contact_added_callback(const Vector2& p_point_A,const Vector // check if we already have the contact - Vector2 local_A = A->get_inv_transform().basis_xform(p_point_A); Vector2 local_B = B->get_inv_transform().basis_xform(p_point_B-offset_B); @@ -61,6 +60,7 @@ void BodyPair2DSW::_contact_added_callback(const Vector2& p_point_A,const Vector contact.acc_tangent_impulse=0; contact.local_A=local_A; contact.local_B=local_B; + contact.reused=true; contact.normal=(p_point_A-p_point_B).normalized(); // attempt to determine if the contact will be reused @@ -77,7 +77,7 @@ void BodyPair2DSW::_contact_added_callback(const Vector2& p_point_A,const Vector contact.acc_normal_impulse=c.acc_normal_impulse; contact.acc_tangent_impulse=c.acc_tangent_impulse; contact.acc_bias_impulse=c.acc_bias_impulse; - new_index=i; + new_index=i; break; } } @@ -139,12 +139,26 @@ void BodyPair2DSW::_validate_contacts() { Contact& c = contacts[i]; - Vector2 global_A = A->get_transform().basis_xform(c.local_A); - Vector2 global_B = B->get_transform().basis_xform(c.local_B)+offset_B; - Vector2 axis = global_A - global_B; - float depth = axis.dot( c.normal ); + bool erase=false; + if (c.reused==false) { + //was left behind in previous frame + erase=true; + } else { + c.reused=false; - if (depth < -max_separation || (global_B + c.normal * depth - global_A).length_squared() > max_separation2) { + Vector2 global_A = A->get_transform().basis_xform(c.local_A); + Vector2 global_B = B->get_transform().basis_xform(c.local_B)+offset_B; + Vector2 axis = global_A - global_B; + float depth = axis.dot( c.normal ); + + + + if (depth < -max_separation || (global_B + c.normal * depth - global_A).length_squared() > max_separation2) { + erase=true; + } + } + + if (erase) { // contact no longer needed, remove @@ -161,7 +175,9 @@ void BodyPair2DSW::_validate_contacts() { } -bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,const Matrix32& p_xform_inv_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,const Matrix32& p_xform_inv_B,bool p_swap_result) { +bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,bool p_swap_result) { + + Vector2 motion = p_A->get_linear_velocity()*p_step; real_t mlen = motion.length(); @@ -172,18 +188,24 @@ bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Mat real_t min,max; p_A->get_shape(p_shape_A)->project_rangev(mnormal,p_xform_A,min,max); - if (mlen < (max-min)*0.3) //did it move enough in this direction to even attempt raycast? let's say it should move more than 1/3 the size of the object in that axis + bool fast_object = mlen > (max-min)*0.3; //going too fast in that direction + + if (fast_object) { //did it move enough in this direction to even attempt raycast? let's say it should move more than 1/3 the size of the object in that axis return false; + } //cast a segment from support in motion normal, in the same direction of motion by motion length + //support is the worst case collision point, so real collision happened before int a; Vector2 s[2]; p_A->get_shape(p_shape_A)->get_supports(p_xform_A.basis_xform(mnormal).normalized(),s,a); Vector2 from = p_xform_A.xform(s[0]); Vector2 to = from + motion; - Vector2 local_from = p_xform_inv_B.xform(from); - Vector2 local_to = p_xform_inv_B.xform(to); + Matrix32 from_inv = p_xform_B.affine_inverse(); + + Vector2 local_from = from_inv.xform(from-mnormal*mlen*0.1); //start from a little inside the bounding box + Vector2 local_to = from_inv.xform(to); Vector2 rpos,rnorm; if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from,local_to,rpos,rnorm)) @@ -191,8 +213,11 @@ bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Mat //ray hit something + + Vector2 hitpos = p_xform_B.xform(rpos); + Vector2 contact_A = to; - Vector2 contact_B = p_xform_B.xform(rpos); + Vector2 contact_B = hitpos; //create a contact @@ -208,41 +233,50 @@ bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Mat bool BodyPair2DSW::setup(float p_step) { + //cannot collide + if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode()<=Physics2DServer::BODY_MODE_KINEMATIC)) { + collided=false; + return false; + } + //use local A coordinates to avoid numerical issues on collision detection offset_B = B->get_transform().get_origin() - A->get_transform().get_origin(); _validate_contacts(); - //cannot collide - if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=Physics2DServer::BODY_MODE_STATIC_ACTIVE && B->get_mode()<=Physics2DServer::BODY_MODE_STATIC_ACTIVE)) { - collided=false; - - return false; - } Vector2 offset_A = A->get_transform().get_origin(); Matrix32 xform_Au = A->get_transform().untranslated(); Matrix32 xform_A = xform_Au * A->get_shape_transform(shape_A); - Matrix32 xform_inv_A = xform_A.affine_inverse(); Matrix32 xform_Bu = B->get_transform(); xform_Bu.elements[2]-=A->get_transform().get_origin(); Matrix32 xform_B = xform_Bu * B->get_shape_transform(shape_B); - Matrix32 xform_inv_B = xform_B.affine_inverse(); Shape2DSW *shape_A_ptr=A->get_shape(shape_A); Shape2DSW *shape_B_ptr=B->get_shape(shape_B); - collided = CollisionSolver2DSW::solve_static(shape_A_ptr,xform_A,xform_inv_A,shape_B_ptr,xform_B,xform_inv_B,_add_contact,this,&sep_axis); + Vector2 motion_A,motion_B; + + if (A->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_SHAPE) { + motion_A=A->get_motion(); + } + if (B->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_SHAPE) { + motion_B=B->get_motion(); + } + //faster to set than to check.. + + collided = CollisionSolver2DSW::solve(shape_A_ptr,xform_A,motion_A,shape_B_ptr,xform_B,motion_B,_add_contact,this,&sep_axis); if (!collided) { //test ccd (currently just a raycast) - if (A->is_continuous_collision_detection_enabled() && A->get_type()>Physics2DServer::BODY_MODE_STATIC_ACTIVE) { - if (_test_ccd(p_step,A,shape_A,xform_A,xform_inv_A,B,shape_B,xform_B,xform_inv_B)) + + if (A->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_RAY && A->get_mode()>Physics2DServer::BODY_MODE_KINEMATIC) { + if (_test_ccd(p_step,A,shape_A,xform_A,B,shape_B,xform_B)) collided=true; } - if (B->is_continuous_collision_detection_enabled() && B->get_type()>Physics2DServer::BODY_MODE_STATIC_ACTIVE) { - if (_test_ccd(p_step,B,shape_B,xform_B,xform_inv_B,A,shape_A,xform_A,xform_inv_A,true)) + if (B->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_RAY && B->get_mode()>Physics2DServer::BODY_MODE_KINEMATIC) { + if (_test_ccd(p_step,B,shape_B,xform_B,A,shape_A,xform_A,true)) collided=true; } @@ -251,8 +285,6 @@ bool BodyPair2DSW::setup(float p_step) { } - - real_t max_penetration = space->get_contact_max_allowed_penetration(); float bias = 0.3f; @@ -280,7 +312,7 @@ bool BodyPair2DSW::setup(float p_step) { real_t depth = c.normal.dot(global_A - global_B); - if (depth<=0) { + if (depth<=0 || !c.reused) { c.active=false; continue; } @@ -311,7 +343,6 @@ bool BodyPair2DSW::setup(float p_step) { } } - // Precompute normal mass, tangent mass, and bias. real_t rnA = c.rA.dot(c.normal); real_t rnB = c.rB.dot(c.normal); @@ -373,6 +404,7 @@ void BodyPair2DSW::solve(float p_step) { Vector2 crbB( -B->get_biased_angular_velocity() * c.rB.y, B->get_biased_angular_velocity() * c.rB.x ); Vector2 dbv = B->get_biased_linear_velocity() + crbB - A->get_biased_linear_velocity() - crbA; + real_t vn = dv.dot(c.normal); real_t vbn = dbv.dot(c.normal); Vector2 tangent = c.normal.tangent(); @@ -388,7 +420,7 @@ void BodyPair2DSW::solve(float p_step) { A->apply_bias_impulse(c.rA,-jb); B->apply_bias_impulse(c.rB, jb); - real_t bounce=0; + real_t bounce=MAX(A->get_bounce(),B->get_bounce()); real_t jn = -(bounce + vn)*c.mass_normal; real_t jnOld = c.acc_normal_impulse; c.acc_normal_impulse = MAX(jnOld + jn, 0.0f); @@ -403,7 +435,6 @@ void BodyPair2DSW::solve(float p_step) { Vector2 j =c.normal * (c.acc_normal_impulse - jnOld) + tangent * ( c.acc_tangent_impulse - jtOld ); - A->apply_impulse(c.rA,-j); B->apply_impulse(c.rB, j); diff --git a/servers/physics_2d/body_pair_2d_sw.h b/servers/physics_2d/body_pair_2d_sw.h index 26278f87cde..ebe26776ed8 100644 --- a/servers/physics_2d/body_pair_2d_sw.h +++ b/servers/physics_2d/body_pair_2d_sw.h @@ -65,6 +65,7 @@ class BodyPair2DSW : public Constraint2DSW { real_t depth; bool active; Vector2 rA,rB; + bool reused; }; Vector2 offset_B; //use local A coordinates to avoid numerical issues on collision detection @@ -76,7 +77,7 @@ class BodyPair2DSW : public Constraint2DSW { int cc; - bool _test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,const Matrix32& p_xform_inv_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,const Matrix32& p_xform_inv_B,bool p_swap_result=false); + bool _test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,bool p_swap_result=false); void _validate_contacts(); static void _add_contact(const Vector2& p_point_A,const Vector2& p_point_B,void *p_self); _FORCE_INLINE_ void _contact_added_callback(const Vector2& p_point_A,const Vector2& p_point_B); diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.cpp b/servers/physics_2d/broad_phase_2d_hash_grid.cpp index 10da376dfda..129c9ecb9c6 100644 --- a/servers/physics_2d/broad_phase_2d_hash_grid.cpp +++ b/servers/physics_2d/broad_phase_2d_hash_grid.cpp @@ -378,7 +378,8 @@ int BroadPhase2DHashGrid::get_subindex(ID p_id) const { return E->get().subindex; } -void BroadPhase2DHashGrid::_cull(const Point2i p_cell,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices,int &index) { +template +void BroadPhase2DHashGrid::_cull(const Point2i p_cell,const Rect2& p_aabb,const Point2& p_from, const Point2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices,int &index) { PosKey pk; @@ -411,10 +412,18 @@ void BroadPhase2DHashGrid::_cull(const Point2i p_cell,CollisionObject2DSW** p_re continue; E->key()->pass=pass; + + if (use_aabb && !p_aabb.intersects(E->key()->aabb)) + continue; + + if (use_segment && !E->key()->aabb.intersects_segment(p_from,p_to)) + continue; + p_results[index]=E->key()->owner; p_result_indices[index]=E->key()->subindex; index++; + } for(Map::Element *E=pb->static_object_set.front();E;E=E->next()) { @@ -425,6 +434,12 @@ void BroadPhase2DHashGrid::_cull(const Point2i p_cell,CollisionObject2DSW** p_re if (E->key()->pass==pass) continue; + if (use_aabb && !p_aabb.intersects(E->key()->aabb)) + continue; + + if (use_segment && !E->key()->aabb.intersects_segment(p_from,p_to)) + continue; + E->key()->pass=pass; p_results[index]=E->key()->owner; p_result_indices[index]=E->key()->subindex; @@ -468,7 +483,7 @@ int BroadPhase2DHashGrid::cull_segment(const Vector2& p_from, const Vector2& p_t max.y= (Math::floor(pos.y + 1)*cell_size - p_from.y) / dir.y; int cullcount=0; - _cull(pos,p_results,p_max_results,p_result_indices,cullcount); + _cull(pos,Rect2(),p_from,p_to,p_results,p_max_results,p_result_indices,cullcount); bool reached_x=false; bool reached_y=false; @@ -502,7 +517,7 @@ int BroadPhase2DHashGrid::cull_segment(const Vector2& p_from, const Vector2& p_t reached_y=true; } - _cull(pos,p_results,p_max_results,p_result_indices,cullcount); + _cull(pos,Rect2(),p_from,p_to,p_results,p_max_results,p_result_indices,cullcount); if (reached_x && reached_y) break; @@ -515,8 +530,22 @@ int BroadPhase2DHashGrid::cull_segment(const Vector2& p_from, const Vector2& p_t int BroadPhase2DHashGrid::cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices) { + pass++; - return 0; + Point2i from = (p_aabb.pos/cell_size).floor(); + Point2i to = ((p_aabb.pos+p_aabb.size)/cell_size).floor(); + int cullcount=0; + + for(int i=from.x;i<=to.x;i++) { + + for(int j=from.y;j<=to.y;j++) { + + _cull(Point2i(i,j),p_aabb,Point2(),Point2(),p_results,p_max_results,p_result_indices,cullcount); + } + + } + + return cullcount; } void BroadPhase2DHashGrid::set_pair_callback(PairCallback p_pair_callback,void *p_userdata) { diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.h b/servers/physics_2d/broad_phase_2d_hash_grid.h index 713d960487f..d530b35d5de 100644 --- a/servers/physics_2d/broad_phase_2d_hash_grid.h +++ b/servers/physics_2d/broad_phase_2d_hash_grid.h @@ -94,7 +94,8 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW { void _enter_grid(Element* p_elem, const Rect2& p_rect,bool p_static); void _exit_grid(Element* p_elem, const Rect2& p_rect,bool p_static); - _FORCE_INLINE_ void _cull(const Point2i p_cell,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices,int &index); + template + _FORCE_INLINE_ void _cull(const Point2i p_cell,const Rect2& p_aabb,const Point2& p_from, const Point2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices,int &index); struct PosKey { diff --git a/servers/physics_2d/collision_object_2d_sw.cpp b/servers/physics_2d/collision_object_2d_sw.cpp index 6e5a703aa29..3a5c8c3ade0 100644 --- a/servers/physics_2d/collision_object_2d_sw.cpp +++ b/servers/physics_2d/collision_object_2d_sw.cpp @@ -130,6 +130,7 @@ void CollisionObject2DSW::_update_shapes() { if (!space) return; + for(int i=0;i shapes; @@ -73,7 +75,7 @@ protected: void _update_shapes_with_motion(const Vector2& p_motion); void _unregister_shapes(); - _FORCE_INLINE_ void _set_transform(const Matrix32& p_transform) { transform=p_transform; _update_shapes(); } + _FORCE_INLINE_ void _set_transform(const Matrix32& p_transform, bool p_update_shapes=true) { transform=p_transform; if (p_update_shapes) {_update_shapes();} } _FORCE_INLINE_ void _set_inv_transform(const Matrix32& p_transform) { inv_transform=p_transform; } void _set_static(bool p_static); @@ -101,6 +103,12 @@ public: _FORCE_INLINE_ const Matrix32& get_shape_inv_transform(int p_index) const { return shapes[p_index].xform_inv; } _FORCE_INLINE_ const Rect2& get_shape_aabb(int p_index) const { return shapes[p_index].aabb_cache; } + _FORCE_INLINE_ void set_shape_kinematic_advance(int p_index,const Vector2& p_advance) { shapes[p_index].kinematic_advance=p_advance; } + _FORCE_INLINE_ Vector2 get_shape_kinematic_advance(int p_index) const { return shapes[p_index].kinematic_advance; } + + _FORCE_INLINE_ void set_shape_kinematic_retreat(int p_index,float p_retreat) { shapes[p_index].kinematic_retreat=p_retreat; } + _FORCE_INLINE_ float get_shape_kinematic_retreat(int p_index) const { return shapes[p_index].kinematic_retreat; } + _FORCE_INLINE_ Matrix32 get_transform() const { return transform; } _FORCE_INLINE_ Matrix32 get_inv_transform() const { return inv_transform; } _FORCE_INLINE_ Space2DSW* get_space() const { return space; } @@ -109,6 +117,7 @@ public: _FORCE_INLINE_ bool is_shape_set_as_trigger(int p_idx) const { return shapes[p_idx].trigger; } + void remove_shape(Shape2DSW *p_shape); void remove_shape(int p_index); diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp index 4b87ff02a27..fdbbebefcfa 100644 --- a/servers/physics_2d/collision_solver_2d_sat.cpp +++ b/servers/physics_2d/collision_solver_2d_sat.cpp @@ -321,19 +321,19 @@ static void _generate_contacts_from_supports(const Vector2 * p_points_A,int p_po -template +template class SeparatorAxisTest2D { const ShapeA *shape_A; const ShapeB *shape_B; const Matrix32 *transform_A; const Matrix32 *transform_B; - const Matrix32 *transform_inv_A; - const Matrix32 *transform_inv_B; real_t best_depth; Vector2 best_axis; int best_axis_count; int best_axis_index; + Vector2 motion_A; + Vector2 motion_B; _CollectorCallback2D *callback; public: @@ -351,6 +351,29 @@ public: return true; } + _FORCE_INLINE_ bool test_cast() { + + if (castA) { + + Vector2 na = motion_A.normalized(); + if (!test_axis(na)) + return false; + if (!test_axis(na.tangent())) + return false; + } + + if (castB) { + + Vector2 nb = motion_B.normalized(); + if (!test_axis(nb)) + return false; + if (!test_axis(nb.tangent())) + return false; + } + + return true; + } + _FORCE_INLINE_ bool test_axis(const Vector2& p_axis) { Vector2 axis=p_axis; @@ -364,8 +387,15 @@ public: real_t min_A,max_A,min_B,max_B; - shape_A->project_range(axis,*transform_A,min_A,max_A); - shape_B->project_range(axis,*transform_B,min_B,max_B); + if (castA) + shape_A->project_range_cast(motion_A,axis,*transform_A,min_A,max_A); + else + shape_A->project_range(axis,*transform_A,min_A,max_A); + + if (castB) + shape_B->project_range_cast(motion_B,axis,*transform_B,min_B,max_B); + else + shape_B->project_range(axis,*transform_B,min_B,max_B); min_B -= ( max_A - min_A ) * 0.5; max_B += ( max_A - min_A ) * 0.5; @@ -427,21 +457,28 @@ public: return; //only collide, no callback static const int max_supports=2; - Vector2 supports_A[max_supports]; int support_count_A; - shape_A->get_supports(transform_A->basis_xform_inv(-best_axis).normalized(),supports_A,support_count_A); - for(int i=0;ixform(supports_A[i]); + if (castA) { + shape_A->get_supports_transformed_cast(motion_A,-best_axis,*transform_A,supports_A,support_count_A); + } else { + shape_A->get_supports(transform_A->basis_xform_inv(-best_axis).normalized(),supports_A,support_count_A); + for(int i=0;ixform(supports_A[i]); + } } Vector2 supports_B[max_supports]; int support_count_B; - shape_B->get_supports(transform_B->basis_xform_inv(best_axis).normalized(),supports_B,support_count_B); - for(int i=0;ixform(supports_B[i]); + if (castB) { + shape_B->get_supports_transformed_cast(motion_B,best_axis,*transform_B,supports_B,support_count_B); + } else { + shape_B->get_supports(transform_B->basis_xform_inv(best_axis).normalized(),supports_B,support_count_B); + for(int i=0;ixform(supports_B[i]); + } } /* @@ -480,14 +517,15 @@ public: } - _FORCE_INLINE_ SeparatorAxisTest2D(const ShapeA *p_shape_A,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a, const ShapeB *p_shape_B,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { + _FORCE_INLINE_ SeparatorAxisTest2D(const ShapeA *p_shape_A,const Matrix32& p_transform_a, const ShapeB *p_shape_B,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_A=Vector2(), const Vector2& p_motion_B=Vector2()) { best_depth=1e15; shape_A=p_shape_A; shape_B=p_shape_B; transform_A=&p_transform_a; transform_B=&p_transform_b; - transform_inv_A=&p_transform_inv_a; - transform_inv_B=&p_transform_inv_b; + motion_A=p_motion_A; + motion_B=p_motion_B; + callback=p_collector; #ifdef DEBUG_ENABLED best_axis_count=0; @@ -503,68 +541,92 @@ public: /****** SAT TESTS *******/ -typedef void (*CollisionFunc)(const Shape2DSW*,const Matrix32&,const Matrix32&,const Shape2DSW*,const Matrix32&,const Matrix32&,_CollectorCallback2D *p_collector); +#define TEST_POINT(m_a,m_b) \ + ( (!separator.test_axis(((m_a)-(m_b)).normalized())) ||\ + (castA && !separator.test_axis(((m_a)+p_motion_a-(m_b)).normalized())) ||\ + (castB && !separator.test_axis(((m_a)-((m_b)+p_motion_b)).normalized())) ||\ + (castA && castB && !separator.test_axis(((m_a)+p_motion_a-((m_b)+p_motion_b)).normalized())) ) -static void _collision_segment_segment(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { + +typedef void (*CollisionFunc)(const Shape2DSW*,const Matrix32&,const Shape2DSW*,const Matrix32&,_CollectorCallback2D *p_collector,const Vector2&,const Vector2&); + + +template +static void _collision_segment_segment(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const SegmentShape2DSW *segment_A = static_cast(p_a); const SegmentShape2DSW *segment_B = static_cast(p_b); - SeparatorAxisTest2D separator(segment_A,p_transform_a,p_transform_inv_a,segment_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(segment_A,p_transform_a,segment_B,p_transform_b,p_collector,p_motion_a,p_motion_b); + + if (!separator.test_previous_axis()) + return; + //this collision is kind of pointless + if (!separator.test_previous_axis()) return; - if (!separator.test_axis(p_transform_inv_a.basis_xform_inv(segment_A->get_normal()).normalized())) + if (!separator.test_cast()) return; - if (!separator.test_axis(p_transform_inv_a.basis_xform_inv(segment_B->get_normal()).normalized())) + + if (!separator.test_axis(segment_A->get_xformed_normal(p_transform_a))) + return; + if (!separator.test_axis(segment_B->get_xformed_normal(p_transform_b))) return; separator.generate_contacts(); } -static void _collision_segment_circle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_segment_circle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const SegmentShape2DSW *segment_A = static_cast(p_a); const CircleShape2DSW *circle_B = static_cast(p_b); - SeparatorAxisTest2D separator(segment_A,p_transform_a,p_transform_inv_a,circle_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(segment_A,p_transform_a,circle_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + + //segment normal if (!separator.test_axis( (p_transform_a.xform(segment_A->get_b())-p_transform_a.xform(segment_A->get_a())).normalized().tangent() )) return; -// if (!separator.test_axis(p_transform_inv_a.basis_xform_inv(segment_A->get_normal()).normalized())) -// return; - if (!separator.test_axis((p_transform_a.xform(segment_A->get_a())-p_transform_b.get_origin()).normalized())) + //endpoint a vs circle + if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),p_transform_b.get_origin())) return; - if (!separator.test_axis((p_transform_a.xform(segment_A->get_b())-p_transform_b.get_origin()).normalized())) + //endpoint b vs circle + if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),p_transform_b.get_origin())) return; separator.generate_contacts(); - - } -static void _collision_segment_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_segment_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const SegmentShape2DSW *segment_A = static_cast(p_a); const RectangleShape2DSW *rectangle_B = static_cast(p_b); - SeparatorAxisTest2D separator(segment_A,p_transform_a,p_transform_inv_a,rectangle_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(segment_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; - if (!separator.test_axis(p_transform_inv_a.basis_xform_inv(segment_A->get_normal()).normalized())) + if (!separator.test_cast()) + return; + + if (!separator.test_axis(segment_A->get_xformed_normal(p_transform_a))) return; if (!separator.test_axis(p_transform_b.elements[0].normalized())) @@ -577,50 +639,58 @@ static void _collision_segment_rectangle(const Shape2DSW* p_a,const Matrix32& p_ } -static void _collision_segment_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_segment_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const SegmentShape2DSW *segment_A = static_cast(p_a); const CapsuleShape2DSW *capsule_B = static_cast(p_b); - SeparatorAxisTest2D separator(segment_A,p_transform_a,p_transform_inv_a,capsule_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(segment_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; - if (!separator.test_axis(p_transform_inv_a.basis_xform_inv(segment_A->get_normal()).normalized())) + if (!separator.test_cast()) + return; + + if (!separator.test_axis(segment_A->get_xformed_normal(p_transform_a))) return; if (!separator.test_axis(p_transform_b.elements[0].normalized())) return; - if (!separator.test_axis((p_transform_a.xform(segment_A->get_a())-(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5)).normalized())) + if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5))) return; - if (!separator.test_axis((p_transform_a.xform(segment_A->get_a())-(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5)).normalized())) + if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5))) return; - if (!separator.test_axis((p_transform_a.xform(segment_A->get_b())-(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5)).normalized())) + if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5))) return; - if (!separator.test_axis((p_transform_a.xform(segment_A->get_b())-(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5)).normalized())) + if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5))) return; separator.generate_contacts(); } -static void _collision_segment_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_segment_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const SegmentShape2DSW *segment_A = static_cast(p_a); const ConvexPolygonShape2DSW *convex_B = static_cast(p_b); - SeparatorAxisTest2D separator(segment_A,p_transform_a,p_transform_inv_a,convex_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(segment_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; - if (!separator.test_axis(p_transform_inv_a.basis_xform_inv(segment_A->get_normal()).normalized())) + if (!separator.test_cast()) + return; + + if (!separator.test_axis(segment_A->get_xformed_normal(p_transform_a))) return; for(int i=0;iget_point_count();i++) { - if (!separator.test_axis( p_transform_inv_b.basis_xform_inv(convex_B->get_segment_normal(i)).normalized() )) + if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i))) return; } @@ -631,35 +701,44 @@ static void _collision_segment_convex_polygon(const Shape2DSW* p_a,const Matrix3 ///////// -static void _collision_circle_circle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_circle_circle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const CircleShape2DSW *circle_A = static_cast(p_a); const CircleShape2DSW *circle_B = static_cast(p_b); - SeparatorAxisTest2D separator(circle_A,p_transform_a,p_transform_inv_a,circle_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(circle_A,p_transform_a,circle_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; - if (!separator.test_axis((p_transform_a.get_origin()-p_transform_b.get_origin()).normalized())) + if (!separator.test_cast()) return; + if (TEST_POINT(p_transform_a.get_origin(),p_transform_b.get_origin())) + return; + + separator.generate_contacts(); } -static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const CircleShape2DSW *circle_A = static_cast(p_a); const RectangleShape2DSW *rectangle_B = static_cast(p_b); - SeparatorAxisTest2D separator(circle_A,p_transform_a,p_transform_inv_a,rectangle_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(circle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + const Vector2 &sphere=p_transform_a.elements[2]; const Vector2 *axis=&p_transform_b.elements[0]; const Vector2& half_extents = rectangle_B->get_half_extents(); @@ -670,65 +749,120 @@ static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_t if (!separator.test_axis(axis[1].normalized())) return; - Vector2 local_v = p_transform_inv_b.xform(p_transform_a.get_origin()); + { + Vector2 local_v = p_transform_b.affine_inverse().xform(p_transform_a.get_origin()); - Vector2 he( - (local_v.x<0) ? -half_extents.x : half_extents.x, - (local_v.y<0) ? -half_extents.y : half_extents.y - ); + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); - if (!separator.test_axis((p_transform_b.xform(he)-sphere).normalized())) - return; + if (!separator.test_axis((p_transform_b.xform(he)-sphere).normalized())) + return; + } + + if (castA) { + + Vector2 sphereofs = sphere + p_motion_a; + Vector2 local_v = p_transform_b.affine_inverse().xform(sphereofs); + + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + + if (!separator.test_axis((p_transform_b.xform(he)-sphereofs).normalized())) + return; + } + + if (castB) { + + Vector2 sphereofs = sphere - p_motion_b; + Vector2 local_v = p_transform_b.affine_inverse().xform(sphereofs); + + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + + if (!separator.test_axis((p_transform_b.xform(he)-sphereofs).normalized())) + return; + } + + if (castA && castB) { + + Vector2 sphereofs = sphere - p_motion_b + p_motion_a; + Vector2 local_v = p_transform_b.affine_inverse().xform(sphereofs); + + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + + if (!separator.test_axis((p_transform_b.xform(he)-sphereofs).normalized())) + return; + } separator.generate_contacts(); } -static void _collision_circle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_circle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const CircleShape2DSW *circle_A = static_cast(p_a); const CapsuleShape2DSW *capsule_B = static_cast(p_b); - SeparatorAxisTest2D separator(circle_A,p_transform_a,p_transform_inv_a,capsule_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(circle_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + //capsule axis if (!separator.test_axis(p_transform_b.elements[0].normalized())) return; //capsule endpoints - if (!separator.test_axis((p_transform_a.get_origin()-(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5)).normalized())) + if (TEST_POINT(p_transform_a.get_origin(),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5))) return; - if (!separator.test_axis((p_transform_a.get_origin()-(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5)).normalized())) + if (TEST_POINT(p_transform_a.get_origin(),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5))) return; - separator.generate_contacts(); } -static void _collision_circle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_circle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const CircleShape2DSW *circle_A = static_cast(p_a); const ConvexPolygonShape2DSW *convex_B = static_cast(p_b); - SeparatorAxisTest2D separator(circle_A,p_transform_a,p_transform_inv_a,convex_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(circle_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + + //poly faces and poly points vs circle for(int i=0;iget_point_count();i++) { - if (!separator.test_axis( (p_transform_b.xform(convex_B->get_point(i))-p_transform_a.get_origin()).normalized() )) + if (TEST_POINT( p_transform_a.get_origin(),p_transform_b.xform(convex_B->get_point(i)) )) return; - if (!separator.test_axis( p_transform_inv_b.basis_xform_inv(convex_B->get_segment_normal(i)).normalized() )) + if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i))) return; } @@ -738,17 +872,21 @@ static void _collision_circle_convex_polygon(const Shape2DSW* p_a,const Matrix32 ///////// -static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const RectangleShape2DSW *rectangle_A = static_cast(p_a); const RectangleShape2DSW *rectangle_B = static_cast(p_b); - SeparatorAxisTest2D separator(rectangle_A,p_transform_a,p_transform_inv_a,rectangle_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(rectangle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + //box faces A if (!separator.test_axis(p_transform_a.elements[0].normalized())) return; @@ -766,17 +904,21 @@ static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32& separator.generate_contacts(); } -static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const RectangleShape2DSW *rectangle_A = static_cast(p_a); const CapsuleShape2DSW *capsule_B = static_cast(p_b); - SeparatorAxisTest2D separator(rectangle_A,p_transform_a,p_transform_inv_a,capsule_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(rectangle_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + //box faces if (!separator.test_axis(p_transform_a.elements[0].normalized())) return; @@ -791,21 +933,77 @@ static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_ //box endpoints to capsule circles + Matrix32 boxinv = p_transform_a.affine_inverse(); + for(int i=0;i<2;i++) { - Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5); + { + Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5); - const Vector2& half_extents = rectangle_A->get_half_extents(); - Vector2 local_v = p_transform_inv_a.xform(capsule_endpoint); + const Vector2& half_extents = rectangle_A->get_half_extents(); + Vector2 local_v = boxinv.xform(capsule_endpoint); - Vector2 he( - (local_v.x<0) ? -half_extents.x : half_extents.x, - (local_v.y<0) ? -half_extents.y : half_extents.y - ); + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized())) + return; + } - if (!separator.test_axis(p_transform_a.xform(he).normalized())) - return; + if (castA) { + Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5); + capsule_endpoint-=p_motion_a; + + + const Vector2& half_extents = rectangle_A->get_half_extents(); + Vector2 local_v = boxinv.xform(capsule_endpoint); + + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized())) + return; + } + + if (castB) { + Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5); + capsule_endpoint+=p_motion_b; + + + const Vector2& half_extents = rectangle_A->get_half_extents(); + Vector2 local_v = boxinv.xform(capsule_endpoint); + + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized())) + return; + } + + if (castA && castB) { + Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5); + capsule_endpoint-=p_motion_a; + capsule_endpoint+=p_motion_b; + + + const Vector2& half_extents = rectangle_A->get_half_extents(); + Vector2 local_v = boxinv.xform(capsule_endpoint); + + Vector2 he( + (local_v.x<0) ? -half_extents.x : half_extents.x, + (local_v.y<0) ? -half_extents.y : half_extents.y + ); + + if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized())) + return; + } } @@ -813,16 +1011,20 @@ static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_ separator.generate_contacts(); } -static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const RectangleShape2DSW *rectangle_A = static_cast(p_a); const ConvexPolygonShape2DSW *convex_B = static_cast(p_b); - SeparatorAxisTest2D separator(rectangle_A,p_transform_a,p_transform_inv_a,convex_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(rectangle_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + //box faces if (!separator.test_axis(p_transform_a.elements[0].normalized())) return; @@ -833,7 +1035,7 @@ static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matri //convex faces for(int i=0;iget_point_count();i++) { - if (!separator.test_axis( p_transform_inv_b.basis_xform_inv(convex_B->get_segment_normal(i)).normalized() )) + if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i))) return; } @@ -844,17 +1046,21 @@ static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matri ///////// -static void _collision_capsule_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_capsule_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const CapsuleShape2DSW *capsule_A = static_cast(p_a); const CapsuleShape2DSW *capsule_B = static_cast(p_b); - SeparatorAxisTest2D separator(capsule_A,p_transform_a,p_transform_inv_a,capsule_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(capsule_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + //capsule axis if (!separator.test_axis(p_transform_b.elements[0].normalized())) @@ -873,7 +1079,7 @@ static void _collision_capsule_capsule(const Shape2DSW* p_a,const Matrix32& p_tr Vector2 capsule_endpoint_B = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(j==0?0.5:-0.5); - if (!separator.test_axis( (capsule_endpoint_A-capsule_endpoint_B).normalized() )) + if (TEST_POINT(capsule_endpoint_A,capsule_endpoint_B) ) return; } @@ -883,17 +1089,21 @@ static void _collision_capsule_capsule(const Shape2DSW* p_a,const Matrix32& p_tr } -static void _collision_capsule_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_capsule_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const CapsuleShape2DSW *capsule_A = static_cast(p_a); const ConvexPolygonShape2DSW *convex_B = static_cast(p_b); - SeparatorAxisTest2D separator(capsule_A,p_transform_a,p_transform_inv_a,convex_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(capsule_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + //capsule axis if (!separator.test_axis(p_transform_a.elements[0].normalized())) @@ -909,12 +1119,12 @@ static void _collision_capsule_convex_polygon(const Shape2DSW* p_a,const Matrix3 Vector2 capsule_endpoint_A = p_transform_a.get_origin()+p_transform_a.elements[1]*capsule_A->get_height()*(j==0?0.5:-0.5); - if (!separator.test_axis( (cpoint - capsule_endpoint_A).normalized() )) + if (TEST_POINT(capsule_endpoint_A,cpoint )) return; } - if (!separator.test_axis( p_transform_inv_b.basis_xform_inv(convex_B->get_segment_normal(i)).normalized() )) + if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i))) return; } @@ -925,26 +1135,31 @@ static void _collision_capsule_convex_polygon(const Shape2DSW* p_a,const Matrix3 ///////// -static void _collision_convex_polygon_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Matrix32& p_transform_inv_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,const Matrix32& p_transform_inv_b,_CollectorCallback2D *p_collector) { +template +static void _collision_convex_polygon_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) { const ConvexPolygonShape2DSW *convex_A = static_cast(p_a); const ConvexPolygonShape2DSW *convex_B = static_cast(p_b); - SeparatorAxisTest2D separator(convex_A,p_transform_a,p_transform_inv_a,convex_B,p_transform_b,p_transform_inv_b,p_collector); + SeparatorAxisTest2D separator(convex_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b); if (!separator.test_previous_axis()) return; + if (!separator.test_cast()) + return; + + for(int i=0;iget_point_count();i++) { - if (!separator.test_axis( p_transform_inv_a.basis_xform_inv(convex_A->get_segment_normal(i)).normalized() )) + if (!separator.test_axis( convex_A->get_xformed_segment_normal(p_transform_a,i))) return; } for(int i=0;iget_point_count();i++) { - if (!separator.test_axis( p_transform_inv_b.basis_xform_inv(convex_B->get_segment_normal(i)).normalized() )) + if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i))) return; } @@ -955,7 +1170,7 @@ static void _collision_convex_polygon_convex_polygon(const Shape2DSW* p_a,const //////// -bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_transform_A, const Matrix32& p_transform_inv_A, const Shape2DSW *p_shape_B, const Matrix32& p_transform_B, const Matrix32& p_transform_inv_B, CollisionSolver2DSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap,Vector2 *sep_axis) { +bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_transform_A, const Vector2& p_motion_A, const Shape2DSW *p_shape_B, const Matrix32& p_transform_B,const Vector2& p_motion_B, CollisionSolver2DSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap,Vector2 *sep_axis) { Physics2DServer::ShapeType type_A=p_shape_A->get_type(); @@ -971,31 +1186,118 @@ bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_ static const CollisionFunc collision_table[5][5]={ - {_collision_segment_segment, - _collision_segment_circle, - _collision_segment_rectangle, - _collision_segment_capsule, - _collision_segment_convex_polygon}, + {_collision_segment_segment, + _collision_segment_circle, + _collision_segment_rectangle, + _collision_segment_capsule, + _collision_segment_convex_polygon}, {0, - _collision_circle_circle, - _collision_circle_rectangle, - _collision_circle_capsule, - _collision_circle_convex_polygon}, + _collision_circle_circle, + _collision_circle_rectangle, + _collision_circle_capsule, + _collision_circle_convex_polygon}, {0, 0, - _collision_rectangle_rectangle, - _collision_rectangle_capsule, - _collision_rectangle_convex_polygon}, + _collision_rectangle_rectangle, + _collision_rectangle_capsule, + _collision_rectangle_convex_polygon}, {0, 0, 0, - _collision_capsule_capsule, - _collision_capsule_convex_polygon}, + _collision_capsule_capsule, + _collision_capsule_convex_polygon}, {0, 0, 0, 0, - _collision_convex_polygon_convex_polygon} + _collision_convex_polygon_convex_polygon} + + }; + + static const CollisionFunc collision_table_castA[5][5]={ + {_collision_segment_segment, + _collision_segment_circle, + _collision_segment_rectangle, + _collision_segment_capsule, + _collision_segment_convex_polygon}, + {0, + _collision_circle_circle, + _collision_circle_rectangle, + _collision_circle_capsule, + _collision_circle_convex_polygon}, + {0, + 0, + _collision_rectangle_rectangle, + _collision_rectangle_capsule, + _collision_rectangle_convex_polygon}, + {0, + 0, + 0, + _collision_capsule_capsule, + _collision_capsule_convex_polygon}, + {0, + 0, + 0, + 0, + _collision_convex_polygon_convex_polygon} + + }; + + static const CollisionFunc collision_table_castB[5][5]={ + {_collision_segment_segment, + _collision_segment_circle, + _collision_segment_rectangle, + _collision_segment_capsule, + _collision_segment_convex_polygon}, + {0, + _collision_circle_circle, + _collision_circle_rectangle, + _collision_circle_capsule, + _collision_circle_convex_polygon}, + {0, + 0, + _collision_rectangle_rectangle, + _collision_rectangle_capsule, + _collision_rectangle_convex_polygon}, + {0, + 0, + 0, + _collision_capsule_capsule, + _collision_capsule_convex_polygon}, + {0, + 0, + 0, + 0, + _collision_convex_polygon_convex_polygon} + + }; + + static const CollisionFunc collision_table_castA_castB[5][5]={ + {_collision_segment_segment, + _collision_segment_circle, + _collision_segment_rectangle, + _collision_segment_capsule, + _collision_segment_convex_polygon}, + {0, + _collision_circle_circle, + _collision_circle_rectangle, + _collision_circle_capsule, + _collision_circle_convex_polygon}, + {0, + 0, + _collision_rectangle_rectangle, + _collision_rectangle_capsule, + _collision_rectangle_convex_polygon}, + {0, + 0, + 0, + _collision_capsule_capsule, + _collision_capsule_convex_polygon}, + {0, + 0, + 0, + 0, + _collision_convex_polygon_convex_polygon} }; @@ -1010,23 +1312,34 @@ bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_ const Shape2DSW *B=p_shape_B; const Matrix32 *transform_A=&p_transform_A; const Matrix32 *transform_B=&p_transform_B; - const Matrix32 *transform_inv_A=&p_transform_inv_A; - const Matrix32 *transform_inv_B=&p_transform_inv_B; + const Vector2 *motion_A=&p_motion_A; + const Vector2 *motion_B=&p_motion_B; if (type_A > type_B) { SWAP(A,B); SWAP(transform_A,transform_B); - SWAP(transform_inv_A,transform_inv_B); SWAP(type_A,type_B); + SWAP(motion_A,motion_B); callback.swap = !callback.swap; } - CollisionFunc collision_func = collision_table[type_A-2][type_B-2]; + CollisionFunc collision_func; + if (*motion_A==Vector2() && *motion_B==Vector2()) { + collision_func = collision_table[type_A-2][type_B-2]; + } else if (*motion_A!=Vector2() && *motion_B==Vector2()) { + collision_func = collision_table_castA[type_A-2][type_B-2]; + } else if (*motion_A==Vector2() && *motion_B!=Vector2()) { + collision_func = collision_table_castB[type_A-2][type_B-2]; + } else { + collision_func = collision_table_castA_castB[type_A-2][type_B-2]; + } + + + ERR_FAIL_COND_V(!collision_func,false); - - collision_func(A,*transform_A,*transform_inv_A,B,*transform_B,*transform_inv_B,&callback); + collision_func(A,*transform_A,B,*transform_B,&callback,*motion_A,*motion_B); return callback.collided; diff --git a/servers/physics_2d/collision_solver_2d_sat.h b/servers/physics_2d/collision_solver_2d_sat.h index dc6767d6517..95468a18b8a 100644 --- a/servers/physics_2d/collision_solver_2d_sat.h +++ b/servers/physics_2d/collision_solver_2d_sat.h @@ -32,6 +32,6 @@ #include "collision_solver_2d_sw.h" -bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_transform_A, const Matrix32& p_transform_inv_A, const Shape2DSW *p_shape_B, const Matrix32& p_transform_B, const Matrix32& p_transform_inv_B, CollisionSolver2DSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false,Vector2 *sep_axis=NULL); +bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_transform_A, const Vector2& p_motion_A,const Shape2DSW *p_shape_B, const Matrix32& p_transform_B,const Vector2& p_motion_B, CollisionSolver2DSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false,Vector2 *sep_axis=NULL); #endif // COLLISION_SOLVER_2D_SAT_H diff --git a/servers/physics_2d/collision_solver_2d_sw.cpp b/servers/physics_2d/collision_solver_2d_sw.cpp index cee5582c6fa..5d43510aeab 100644 --- a/servers/physics_2d/collision_solver_2d_sw.cpp +++ b/servers/physics_2d/collision_solver_2d_sw.cpp @@ -34,7 +34,7 @@ //#define collision_solver gjk_epa_calculate_penetration -bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) { +bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) { const LineShape2DSW *line = static_cast(p_shape_A); @@ -49,7 +49,7 @@ bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A,const Mat Vector2 supports[2]; int support_count; - p_shape_B->get_supports(p_transform_inv_B.basis_xform(-n).normalized(),supports,support_count); + p_shape_B->get_supports(p_transform_A.affine_inverse().basis_xform(-n).normalized(),supports,support_count); bool found=false; @@ -77,7 +77,7 @@ bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A,const Mat return found; } -bool CollisionSolver2DSW::solve_raycast(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis) { +bool CollisionSolver2DSW::solve_raycast(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis) { @@ -89,8 +89,9 @@ bool CollisionSolver2DSW::solve_raycast(const Shape2DSW *p_shape_A,const Matrix3 Vector2 to = from+p_transform_A[1]*ray->get_length(); Vector2 support_A=to; - from = p_transform_inv_B.xform(from); - to = p_transform_inv_B.xform(to); + Matrix32 invb = p_transform_B.affine_inverse(); + from = invb.xform(from); + to = invb.xform(to); Vector2 p,n; if (!p_shape_B->intersect_segment(from,to,p,n)) { @@ -145,10 +146,10 @@ bool CollisionSolver2DSW::solve_ray(const Shape2DSW *p_shape_A,const Matrix32& p struct _ConcaveCollisionInfo2D { const Matrix32 *transform_A; - const Matrix32 *transform_inv_A; const Shape2DSW *shape_A; const Matrix32 *transform_B; - const Matrix32 *transform_inv_B; + Vector2 motion_A; + Vector2 motion_B; CollisionSolver2DSW::CallbackResult result_callback; void *userdata; bool swap_result; @@ -168,7 +169,7 @@ void CollisionSolver2DSW::concave_callback(void *p_userdata, Shape2DSW *p_convex if (!cinfo.result_callback && cinfo.collided) return; //already collided and no contacts requested, don't test anymore - bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, *cinfo.transform_inv_A, p_convex,*cinfo.transform_B,*cinfo.transform_inv_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result,cinfo.sep_axis ); + bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, cinfo.motion_A, p_convex,*cinfo.transform_B, cinfo.motion_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result,cinfo.sep_axis ); if (!collided) return; @@ -178,17 +179,16 @@ void CollisionSolver2DSW::concave_callback(void *p_userdata, Shape2DSW *p_convex } -bool CollisionSolver2DSW::solve_concave(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis) { +bool CollisionSolver2DSW::solve_concave(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis) { const ConcaveShape2DSW *concave_B=static_cast(p_shape_B); _ConcaveCollisionInfo2D cinfo; cinfo.transform_A=&p_transform_A; - cinfo.transform_inv_A=&p_transform_inv_A; cinfo.shape_A=p_shape_A; cinfo.transform_B=&p_transform_B; - cinfo.transform_inv_B=&p_transform_inv_B; + cinfo.motion_A=p_motion_A; cinfo.result_callback=p_result_callback; cinfo.userdata=p_userdata; cinfo.swap_result=p_swap_result; @@ -227,7 +227,8 @@ bool CollisionSolver2DSW::solve_concave(const Shape2DSW *p_shape_A,const Matrix3 } -bool CollisionSolver2DSW::solve_static(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,Vector2 *sep_axis) { +bool CollisionSolver2DSW::solve(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,Vector2 *sep_axis) { + @@ -253,9 +254,9 @@ bool CollisionSolver2DSW::solve_static(const Shape2DSW *p_shape_A,const Matrix32 } if (swap) { - return solve_static_line(p_shape_B,p_transform_B,p_transform_inv_B,p_shape_A,p_transform_A,p_transform_inv_A,p_result_callback,p_userdata,true); + return solve_static_line(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true); } else { - return solve_static_line(p_shape_A,p_transform_A,p_transform_inv_A,p_shape_B,p_transform_B,p_transform_inv_B,p_result_callback,p_userdata,false); + return solve_static_line(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false); } /*} else if (type_A==Physics2DServer::SHAPE_RAY) { @@ -278,9 +279,9 @@ bool CollisionSolver2DSW::solve_static(const Shape2DSW *p_shape_A,const Matrix32 if (swap) { - return solve_raycast(p_shape_B,p_transform_B,p_transform_inv_B,p_shape_A,p_transform_A,p_transform_inv_A,p_result_callback,p_userdata,true,sep_axis); + return solve_raycast(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true,sep_axis); } else { - return solve_raycast(p_shape_A,p_transform_A,p_transform_inv_A,p_shape_B,p_transform_B,p_transform_inv_B,p_result_callback,p_userdata,false,sep_axis); + return solve_raycast(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false,sep_axis); } @@ -291,16 +292,16 @@ bool CollisionSolver2DSW::solve_static(const Shape2DSW *p_shape_A,const Matrix32 return false; if (!swap) - return solve_concave(p_shape_A,p_transform_A,p_transform_inv_A,p_shape_B,p_transform_B,p_transform_inv_B,p_result_callback,p_userdata,false,sep_axis); + return solve_concave(p_shape_A,p_transform_A,p_motion_A,p_shape_B,p_transform_B,p_motion_B,p_result_callback,p_userdata,false,sep_axis); else - return solve_concave(p_shape_B,p_transform_B,p_transform_inv_B,p_shape_A,p_transform_A,p_transform_inv_A,p_result_callback,p_userdata,true,sep_axis); + return solve_concave(p_shape_B,p_transform_B,p_motion_B,p_shape_A,p_transform_A,p_motion_A,p_result_callback,p_userdata,true,sep_axis); } else { - return collision_solver(p_shape_A, p_transform_A, p_transform_inv_A, p_shape_B, p_transform_B, p_transform_inv_B, p_result_callback,p_userdata,false,sep_axis); + return collision_solver(p_shape_A, p_transform_A,p_motion_A, p_shape_B, p_transform_B, p_motion_B,p_result_callback,p_userdata,false,sep_axis); } diff --git a/servers/physics_2d/collision_solver_2d_sw.h b/servers/physics_2d/collision_solver_2d_sw.h index fc5500bfb90..11b5701f46b 100644 --- a/servers/physics_2d/collision_solver_2d_sw.h +++ b/servers/physics_2d/collision_solver_2d_sw.h @@ -35,16 +35,16 @@ class CollisionSolver2DSW { public: typedef void (*CallbackResult)(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata); private: - static bool solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result); + static bool solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result); static void concave_callback(void *p_userdata, Shape2DSW *p_convex); - static bool solve_concave(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis=NULL); - static bool solve_raycast(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_transform_inv_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_transform_inv_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis=NULL); + static bool solve_concave(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis=NULL); + static bool solve_raycast(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis=NULL); public: - static bool solve_static(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Matrix32& p_inverse_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Matrix32& p_inverse_B,CallbackResult p_result_callback,void *p_userdata,Vector2 *sep_axis=NULL); + static bool solve(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,Vector2 *sep_axis=NULL); }; diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp index 70e3d843b4f..0fbd461f46f 100644 --- a/servers/physics_2d/physics_2d_server_sw.cpp +++ b/servers/physics_2d/physics_2d_server_sw.cpp @@ -29,6 +29,7 @@ #include "physics_2d_server_sw.h" #include "broad_phase_2d_basic.h" #include "broad_phase_2d_hash_grid.h" +#include "collision_solver_2d_sw.h" RID Physics2DServerSW::shape_create(ShapeType p_shape) { @@ -81,6 +82,9 @@ RID Physics2DServerSW::shape_create(ShapeType p_shape) { return id; }; + + + void Physics2DServerSW::shape_set_data(RID p_shape, const Variant& p_data) { Shape2DSW *shape = shape_owner.get(p_shape); @@ -126,6 +130,63 @@ real_t Physics2DServerSW::shape_get_custom_solver_bias(RID p_shape) const { } +void Physics2DServerSW::_shape_col_cbk(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) { + + CollCbkData *cbk=(CollCbkData *)p_userdata; + + if (cbk->amount == cbk->max) { + //find least deep + float min_depth=1e20; + int min_depth_idx=0; + for(int i=0;iamount;i++) { + + float d = cbk->ptr[i*2+0].distance_squared_to(cbk->ptr[i*2+1]); + if (dptr[min_depth_idx*2+0]=p_point_A; + cbk->ptr[min_depth_idx*2+1]=p_point_B; + + + } else { + + cbk->ptr[cbk->amount*2+0]=p_point_A; + cbk->ptr[cbk->amount*2+1]=p_point_B; + } +} + +bool Physics2DServerSW::shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count) { + + + Shape2DSW *shape_A = shape_owner.get(p_shape_A); + ERR_FAIL_COND_V(!shape_A,false); + Shape2DSW *shape_B = shape_owner.get(p_shape_B); + ERR_FAIL_COND_V(!shape_B,false); + + if (p_result_max==0) { + + return CollisionSolver2DSW::solve(shape_A,p_xform_A,p_motion_A,shape_B,p_xform_B,p_motion_B,NULL,NULL); + } + + CollCbkData cbk; + cbk.max=p_result_max; + cbk.amount=0; + cbk.ptr=r_results; + + bool res= CollisionSolver2DSW::solve(shape_A,p_xform_A,p_motion_A,shape_B,p_xform_B,p_motion_B,_shape_col_cbk,&cbk); + r_result_count=cbk.amount; + return res; + +} + + RID Physics2DServerSW::space_create() { Space2DSW *space = memnew( Space2DSW ); @@ -442,7 +503,7 @@ void Physics2DServerSW::body_set_mode(RID p_body, BodyMode p_mode) { body->set_mode(p_mode); }; -Physics2DServer::BodyMode Physics2DServerSW::body_get_mode(RID p_body, BodyMode p_mode) const { +Physics2DServer::BodyMode Physics2DServerSW::body_get_mode(RID p_body) const { Body2DSW *body = body_owner.get(p_body); ERR_FAIL_COND_V(!body,BODY_MODE_STATIC); @@ -550,23 +611,25 @@ bool Physics2DServerSW::body_is_shape_set_as_trigger(RID p_body, int p_shape_idx } -void Physics2DServerSW::body_set_enable_continuous_collision_detection(RID p_body,bool p_enable) { +void Physics2DServerSW::body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode) { Body2DSW *body = body_owner.get(p_body); ERR_FAIL_COND(!body); - - body->set_continuous_collision_detection(p_enable); + body->set_continuous_collision_detection_mode(p_mode); } -bool Physics2DServerSW::body_is_continuous_collision_detection_enabled(RID p_body) const { +Physics2DServerSW::CCDMode Physics2DServerSW::body_get_continuous_collision_detection_mode(RID p_body) const{ - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND_V(!body,false); + const Body2DSW *body = body_owner.get(p_body); + ERR_FAIL_COND_V(!body,CCD_MODE_DISABLED); + + return body->get_continuous_collision_detection_mode(); - return body->is_continuous_collision_detection_enabled(); } + + void Physics2DServerSW::body_attach_object_instance_ID(RID p_body,uint32_t p_ID) { Body2DSW *body = body_owner.get(p_body); @@ -617,13 +680,6 @@ float Physics2DServerSW::body_get_param(RID p_body, BodyParameter p_param) const }; -void Physics2DServerSW::body_static_simulate_motion(RID p_body,const Matrix32& p_new_transform) { - - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND(!body); - body->simulate_motion(p_new_transform,last_step); - -}; void Physics2DServerSW::body_set_state(RID p_body, BodyState p_state, const Variant& p_variant) { @@ -775,6 +831,16 @@ void Physics2DServerSW::body_set_force_integration_callback(RID p_body,Object *p } +bool Physics2DServerSW::body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count) { + + Body2DSW *body = body_owner.get(p_body); + ERR_FAIL_COND_V(!body,false); + ERR_FAIL_INDEX_V(p_body_shape,body->get_shape_count(),false); + + return shape_collide(body->get_shape(p_body_shape)->get_self(),body->get_transform() * body->get_shape_transform(p_body_shape),Vector2(),p_shape,p_shape_xform,p_motion,r_results,p_result_max,r_result_count); + +} + /* JOINT API */ diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h index f6665da73f5..ef00eae7e47 100644 --- a/servers/physics_2d/physics_2d_server_sw.h +++ b/servers/physics_2d/physics_2d_server_sw.h @@ -58,6 +58,16 @@ friend class Physics2DDirectSpaceStateSW; mutable RID_Owner body_owner; mutable RID_Owner joint_owner; + struct CollCbkData { + + int max; + int amount; + Vector2 *ptr; + }; + + static void _shape_col_cbk(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata); + + // void _clear_query(Query2DSW *p_query); public: @@ -69,6 +79,8 @@ public: virtual Variant shape_get_data(RID p_shape) const; virtual real_t shape_get_custom_solver_bias(RID p_shape) const; + virtual bool shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count); + /* SPACE API */ virtual RID space_create(); @@ -124,7 +136,7 @@ public: virtual RID body_get_space(RID p_body) const; virtual void body_set_mode(RID p_body, BodyMode p_mode); - virtual BodyMode body_get_mode(RID p_body, BodyMode p_mode) const; + virtual BodyMode body_get_mode(RID p_body) const; virtual void body_add_shape(RID p_body, RID p_shape, const Matrix32& p_transform=Matrix32()); virtual void body_set_shape(RID p_body, int p_shape_idx,RID p_shape); @@ -143,8 +155,8 @@ public: virtual void body_attach_object_instance_ID(RID p_body,uint32_t p_ID); virtual uint32_t body_get_object_instance_ID(RID p_body) const; - virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable); - virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const; + virtual void body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode); + virtual CCDMode body_get_continuous_collision_detection_mode(RID p_body) const; virtual void body_set_user_flags(RID p_body, uint32_t p_flags); virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const; @@ -152,8 +164,6 @@ public: virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value); virtual float body_get_param(RID p_body, BodyParameter p_param) const; - //advanced simulation - virtual void body_static_simulate_motion(RID p_body,const Matrix32& p_new_transform); virtual void body_set_state(RID p_body, BodyState p_state, const Variant& p_variant); virtual Variant body_get_state(RID p_body, BodyState p_state) const; @@ -181,6 +191,7 @@ public: virtual int body_get_max_contacts_reported(RID p_body) const; virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant()); + virtual bool body_collide_shape(RID p_body, int p_body_shape,RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count); /* JOINT API */ diff --git a/servers/physics_2d/shape_2d_sw.cpp b/servers/physics_2d/shape_2d_sw.cpp index 5ad05a18acc..012c4ed4042 100644 --- a/servers/physics_2d/shape_2d_sw.cpp +++ b/servers/physics_2d/shape_2d_sw.cpp @@ -26,1060 +26,1059 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "shape_2d_sw.h" -#include "geometry.h" -#include "sort.h" - -#define _SEGMENT_IS_VALID_SUPPORT_TRESHOLD 0.99998 - - -void Shape2DSW::configure(const Rect2& p_aabb) { - aabb=p_aabb; - configured=true; - for (Map::Element *E=owners.front();E;E=E->next()) { - ShapeOwner2DSW* co=(ShapeOwner2DSW*)E->key(); - co->_shape_changed(); - } -} - - -Vector2 Shape2DSW::get_support(const Vector2& p_normal) const { - - Vector2 res[2]; - int amnt; - get_supports(p_normal,res,amnt); - return res[0]; -} - -void Shape2DSW::add_owner(ShapeOwner2DSW *p_owner) { - - Map::Element *E=owners.find(p_owner); - if (E) { - E->get()++; - } else { - owners[p_owner]=1; - } -} - -void Shape2DSW::remove_owner(ShapeOwner2DSW *p_owner){ - - Map::Element *E=owners.find(p_owner); - ERR_FAIL_COND(!E); - E->get()--; - if (E->get()==0) { - owners.erase(E); - } - -} - -bool Shape2DSW::is_owner(ShapeOwner2DSW *p_owner) const{ - - return owners.has(p_owner); - -} - -const Map& Shape2DSW::get_owners() const{ - return owners; -} - - -Shape2DSW::Shape2DSW() { - - custom_bias=0; - configured=false; -} - - -Shape2DSW::~Shape2DSW() { - - ERR_FAIL_COND(owners.size()); -} - - -/*********************************************************/ -/*********************************************************/ -/*********************************************************/ - - - -void LineShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { - - r_amount=0; -} - -bool LineShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - Vector2 segment= p_begin - p_end; - real_t den=normal.dot( segment ); - - //printf("den is %i\n",den); - if (Math::abs(den)<=CMP_EPSILON) { - - return false; - } - - real_t dist=(normal.dot( p_begin ) - d) / den; - //printf("dist is %i\n",dist); - - if (dist<-CMP_EPSILON || dist > (1.0 +CMP_EPSILON)) { - - return false; - } - - r_point = p_begin + segment * -dist; - r_normal=normal; - - return true; -} - -real_t LineShape2DSW::get_moment_of_inertia(float p_mass) const { - - return 0; -} - -void LineShape2DSW::set_data(const Variant& p_data) { - - ERR_FAIL_COND(p_data.get_type()!=Variant::ARRAY); - Array arr = p_data; - ERR_FAIL_COND(arr.size()!=2); - normal=arr[0]; - d=arr[1]; - configure(Rect2(Vector2(-1e4,-1e4),Vector2(1e4*2,1e4*2))); - -} - -Variant LineShape2DSW::get_data() const { - - Array arr; - arr.resize(2); - arr[0]=normal; - arr[1]=d; - return arr; -} - -/*********************************************************/ -/*********************************************************/ -/*********************************************************/ - - - -void RayShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { - - - r_amount=1; - - if (p_normal.y>0) - *r_supports=Vector2(0,length); - else - *r_supports=Vector2(); - -} - -bool RayShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - return false; //rays can't be intersected - -} - -real_t RayShape2DSW::get_moment_of_inertia(float p_mass) const { - - return 0; //rays are mass-less -} - -void RayShape2DSW::set_data(const Variant& p_data) { - - length=p_data; - configure(Rect2(0,0,0.001,length)); -} - -Variant RayShape2DSW::get_data() const { - - return length; -} - - -/*********************************************************/ -/*********************************************************/ -/*********************************************************/ - - - -void SegmentShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { - - if (Math::abs(p_normal.dot(n))>_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) { - r_supports[0]=a; - r_supports[1]=b; - r_amount=2; - return; - - } - - float dp=p_normal.dot(b-a); - if (dp>0) - *r_supports=b; - else - *r_supports=a; - r_amount=1; - -} - -bool SegmentShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,a,b,&r_point)) - return false; - - Vector2 d = p_end-p_begin; - if (n.dot(p_begin) > n.dot(a)) { - r_normal=n; - } else { - r_normal=-n; - } - - return true; -} - -real_t SegmentShape2DSW::get_moment_of_inertia(float p_mass) const { - - real_t l = b.distance_to(a); - Vector2 ofs = (a+b)*0.5; - - return p_mass*(l*l/12.0f + ofs.length_squared()); -} - -void SegmentShape2DSW::set_data(const Variant& p_data) { - - ERR_FAIL_COND(p_data.get_type()!=Variant::RECT2); - - Rect2 r = p_data; - a=r.pos; - b=r.size; - n=(b-a).tangent(); - - Rect2 aabb; - aabb.pos=a; - aabb.expand_to(b); - if (aabb.size.x==0) - aabb.size.x=0.001; - if (aabb.size.y==0) - aabb.size.y=0.001; - configure(aabb); -} - -Variant SegmentShape2DSW::get_data() const { - - Rect2 r; - r.pos=a; - r.size=b; - return r; -} - -/*********************************************************/ -/*********************************************************/ -/*********************************************************/ - - - -void CircleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { - - r_amount=1; - *r_supports=p_normal*radius; - -} - -bool CircleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - - Vector2 line_vec = p_end - p_begin; - - real_t a, b, c; - - a = line_vec.dot(line_vec); - b = 2 * p_begin.dot(line_vec); - c = p_begin.dot(p_begin) - radius * radius; - - real_t sqrtterm = b*b - 4*a*c; - - if(sqrtterm < 0) - return false; - sqrtterm = Math::sqrt(sqrtterm); - real_t res = ( -b - sqrtterm ) / (2 * a); - - if (res <0 || res >1+CMP_EPSILON) { - return false; - } - - r_point=p_begin+line_vec*res; - r_normal=r_point.normalized(); - return true; -} - -real_t CircleShape2DSW::get_moment_of_inertia(float p_mass) const { - - return radius*radius; -} - -void CircleShape2DSW::set_data(const Variant& p_data) { - - ERR_FAIL_COND(!p_data.is_num()); - radius=p_data; - configure(Rect2(-radius,-radius,radius*2,radius*2)); -} - -Variant CircleShape2DSW::get_data() const { - - return radius; -} - - -/*********************************************************/ -/*********************************************************/ -/*********************************************************/ - - - -void RectangleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { - - for(int i=0;i<2;i++) { - - Vector2 ag; - ag[i]=1.0; - float dp = ag.dot(p_normal); - if (Math::abs(dp)<_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) - continue; - - float sgn = dp>0 ? 1.0 : -1.0; - - r_amount=2; - - r_supports[0][i]=half_extents[i]*sgn; - r_supports[0][i^1]=half_extents[i^1]; - - r_supports[1][i]=half_extents[i]*sgn; - r_supports[1][i^1]=-half_extents[i^1]; - - return; - - - } - - /* USE POINT */ - - r_amount=1; - r_supports[0]=Vector2( - (p_normal.x<0) ? -half_extents.x : half_extents.x, - (p_normal.y<0) ? -half_extents.y : half_extents.y - ); - -} - -bool RectangleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - - return get_aabb().intersects_segment(p_begin,p_end,&r_point,&r_normal); -} - -real_t RectangleShape2DSW::get_moment_of_inertia(float p_mass) const { - - Vector2 he2=half_extents*2; - return p_mass*he2.dot(he2)/12.0f; -} - -void RectangleShape2DSW::set_data(const Variant& p_data) { - - ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2); - - half_extents=p_data; - configure(Rect2(-half_extents,half_extents*2.0)); -} - -Variant RectangleShape2DSW::get_data() const { - - return half_extents; -} - - - -/*********************************************************/ -/*********************************************************/ -/*********************************************************/ - - - -void CapsuleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { - - Vector2 n=p_normal; - - float d = n.y; - - if (Math::abs( d )<(1.0-_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) ) { - - // make it flat - n.y=0.0; - n.normalize(); - n*=radius; - - r_amount=2; - r_supports[0]=n; - r_supports[0].y+=height*0.5; - r_supports[1]=n; - r_supports[1].y-=height*0.5; - - } else { - - float h = (d > 0) ? height : -height; - - n*=radius; - n.y += h*0.5; - r_amount=1; - *r_supports=n; - - } -} - -bool CapsuleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - - float d = 1e10; - Vector2 n = (p_end-p_begin).normalized(); - bool collided=false; - - //try spheres - for(int i=0;i<2;i++) { - - Vector2 begin = p_begin; - Vector2 end = p_end; - float ofs = (i==0)?-height*0.5:height*0.5; - begin.y+=ofs; - end.y+=ofs; - - Vector2 line_vec = end - begin; - - real_t a, b, c; - - a = line_vec.dot(line_vec); - b = 2 * begin.dot(line_vec); - c = begin.dot(begin) - radius * radius; - - real_t sqrtterm = b*b - 4*a*c; - - if(sqrtterm < 0) - continue; - - sqrtterm = Math::sqrt(sqrtterm); - real_t res = ( -b - sqrtterm ) / (2 * a); - - if (res <0 || res >1+CMP_EPSILON) { - continue; - } - - Vector2 point = begin+line_vec*res; - Vector2 pointf(point.x,point.y-ofs); - real_t pd = n.dot(pointf); - if (pdd) { - support_idx=i; - d=ld; - } - - //test segment - if (points[i].normal.dot(p_normal)>_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) { - - r_amount=2; - r_supports[0]=points[i].pos; - r_supports[1]=points[(i+1)%point_count].pos; - return; - } - } - - ERR_FAIL_COND(support_idx==-1); - - r_amount=1; - r_supports[0]=points[support_idx].pos; - -} - -bool ConvexPolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { - - Vector2 n = (p_end-p_begin).normalized(); - real_t d=1e10; - bool inters=false; - - for(int i=0;i=0) - // continue; - - - Vector2 res; - - if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,points[i].pos,points[(i+1)%point_count].pos,&res)) - continue; - - float nd = n.dot(res); - if (nd0) - r_normal=-r_normal; - } - - //return get_aabb().intersects_segment(p_begin,p_end,&r_point,&r_normal); - return inters; //todo -} - -real_t ConvexPolygonShape2DSW::get_moment_of_inertia(float p_mass) const { - - Rect2 aabb; - aabb.pos=points[0].pos; - for(int i=0;i arr=p_data; - ERR_FAIL_COND(arr.size()==0); - point_count=arr.size(); - points = memnew_arr(Point,point_count); - DVector::Read r = arr.read(); - - for(int i=0;i dvr = p_data; - point_count=dvr.size()/4; - ERR_FAIL_COND(point_count==0); - - points = memnew_arr(Point,point_count); - DVector::Read r = dvr.read(); - - for(int i=0;i dvr; - - dvr.resize(point_count); - - for(int i=0;id) { - d=ld; - idx=i; - } - } - - - r_amount=1; - ERR_FAIL_COND(idx==-1); - *r_supports=points[idx]; - -} - -bool ConcavePolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const{ - - uint32_t* stack = (uint32_t*)alloca(sizeof(int)*bvh_depth); - - enum { - TEST_AABB_BIT=0, - VISIT_LEFT_BIT=1, - VISIT_RIGHT_BIT=2, - VISIT_DONE_BIT=3, - VISITED_BIT_SHIFT=29, - NODE_IDX_MASK=(1<>VISITED_BIT_SHIFT) { - case TEST_AABB_BIT: { - - - bool valid = b.aabb.intersects_segment(p_begin,p_end); - if (!valid) { - - stack[level]=(VISIT_DONE_BIT<0) - r_normal=-r_normal; - } - - return inters; - -} - - - -int ConcavePolygonShape2DSW::_generate_bvh(BVH *p_bvh,int p_len,int p_depth) { - - if (p_len==1) { - - bvh_depth=MAX(p_depth,bvh_depth); - bvh.push_back(*p_bvh); - return bvh.size()-1; - } - - //else sort best - - Rect2 global_aabb=p_bvh[0].aabb; - for(int i=1;i global_aabb.size.y) { - - SortArray sort; - sort.sort(p_bvh,p_len); - - } else { - - SortArray sort; - sort.sort(p_bvh,p_len); - - } - - int median = p_len/2; - - - BVH node; - node.aabb=global_aabb; - int node_idx = bvh.size(); - bvh.push_back(node); - - int l = _generate_bvh(p_bvh,median,p_depth+1); - int r = _generate_bvh(&p_bvh[median],p_len-median,p_depth+1); - bvh[node_idx].left=l; - bvh[node_idx].right=r; - - return node_idx; - -} - -void ConcavePolygonShape2DSW::set_data(const Variant& p_data) { - - ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2_ARRAY && p_data.get_type()!=Variant::REAL_ARRAY); - - segments.clear();; - points.clear();; - bvh.clear();; - bvh_depth=1; - - Rect2 aabb; - - if (p_data.get_type()==Variant::VECTOR2_ARRAY) { - - DVector p2arr = p_data; - int len = p2arr.size(); - DVector::Read arr = p2arr.read(); - - - Map pointmap; - for(int i=0;ikey(); - for(Map::Element *E=pointmap.front();E;E=E->next()) { - - aabb.expand_to(E->key()); - points[E->get()]=E->key(); - } - - Vector main_vbh; - main_vbh.resize(segments.size()); - for(int i=0;i rsegments; - int len = segments.size(); - rsegments.resize(len*2); - DVector::Write w = rsegments.write(); - for(int i=0;i::Write(); - - return rsegments; -} - -void ConcavePolygonShape2DSW::cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const { - - uint32_t* stack = (uint32_t*)alloca(sizeof(int)*bvh_depth); - - enum { - TEST_AABB_BIT=0, - VISIT_LEFT_BIT=1, - VISIT_RIGHT_BIT=2, - VISIT_DONE_BIT=3, - VISITED_BIT_SHIFT=29, - NODE_IDX_MASK=(1<>VISITED_BIT_SHIFT) { - case TEST_AABB_BIT: { - - - bool valid = p_local_aabb.intersects(b.aabb); - if (!valid) { - - stack[level]=(VISIT_DONE_BIT<::Element *E=owners.front();E;E=E->next()) { + ShapeOwner2DSW* co=(ShapeOwner2DSW*)E->key(); + co->_shape_changed(); + } +} + + +Vector2 Shape2DSW::get_support(const Vector2& p_normal) const { + + Vector2 res[2]; + int amnt; + get_supports(p_normal,res,amnt); + return res[0]; +} + +void Shape2DSW::add_owner(ShapeOwner2DSW *p_owner) { + + Map::Element *E=owners.find(p_owner); + if (E) { + E->get()++; + } else { + owners[p_owner]=1; + } +} + +void Shape2DSW::remove_owner(ShapeOwner2DSW *p_owner){ + + Map::Element *E=owners.find(p_owner); + ERR_FAIL_COND(!E); + E->get()--; + if (E->get()==0) { + owners.erase(E); + } + +} + +bool Shape2DSW::is_owner(ShapeOwner2DSW *p_owner) const{ + + return owners.has(p_owner); + +} + +const Map& Shape2DSW::get_owners() const{ + return owners; +} + + +Shape2DSW::Shape2DSW() { + + custom_bias=0; + configured=false; +} + + +Shape2DSW::~Shape2DSW() { + + ERR_FAIL_COND(owners.size()); +} + + +/*********************************************************/ +/*********************************************************/ +/*********************************************************/ + + + +void LineShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { + + r_amount=0; +} + +bool LineShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + Vector2 segment= p_begin - p_end; + real_t den=normal.dot( segment ); + + //printf("den is %i\n",den); + if (Math::abs(den)<=CMP_EPSILON) { + + return false; + } + + real_t dist=(normal.dot( p_begin ) - d) / den; + //printf("dist is %i\n",dist); + + if (dist<-CMP_EPSILON || dist > (1.0 +CMP_EPSILON)) { + + return false; + } + + r_point = p_begin + segment * -dist; + r_normal=normal; + + return true; +} + +real_t LineShape2DSW::get_moment_of_inertia(float p_mass) const { + + return 0; +} + +void LineShape2DSW::set_data(const Variant& p_data) { + + ERR_FAIL_COND(p_data.get_type()!=Variant::ARRAY); + Array arr = p_data; + ERR_FAIL_COND(arr.size()!=2); + normal=arr[0]; + d=arr[1]; + configure(Rect2(Vector2(-1e4,-1e4),Vector2(1e4*2,1e4*2))); + +} + +Variant LineShape2DSW::get_data() const { + + Array arr; + arr.resize(2); + arr[0]=normal; + arr[1]=d; + return arr; +} + +/*********************************************************/ +/*********************************************************/ +/*********************************************************/ + + + +void RayShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { + + + r_amount=1; + + if (p_normal.y>0) + *r_supports=Vector2(0,length); + else + *r_supports=Vector2(); + +} + +bool RayShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + return false; //rays can't be intersected + +} + +real_t RayShape2DSW::get_moment_of_inertia(float p_mass) const { + + return 0; //rays are mass-less +} + +void RayShape2DSW::set_data(const Variant& p_data) { + + length=p_data; + configure(Rect2(0,0,0.001,length)); +} + +Variant RayShape2DSW::get_data() const { + + return length; +} + + +/*********************************************************/ +/*********************************************************/ +/*********************************************************/ + + + +void SegmentShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { + + if (Math::abs(p_normal.dot(n))>_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) { + r_supports[0]=a; + r_supports[1]=b; + r_amount=2; + return; + + } + + float dp=p_normal.dot(b-a); + if (dp>0) + *r_supports=b; + else + *r_supports=a; + r_amount=1; + +} + +bool SegmentShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,a,b,&r_point)) + return false; + + Vector2 d = p_end-p_begin; + if (n.dot(p_begin) > n.dot(a)) { + r_normal=n; + } else { + r_normal=-n; + } + + return true; +} + +real_t SegmentShape2DSW::get_moment_of_inertia(float p_mass) const { + + real_t l = b.distance_to(a); + Vector2 ofs = (a+b)*0.5; + + return p_mass*(l*l/12.0f + ofs.length_squared()); +} + +void SegmentShape2DSW::set_data(const Variant& p_data) { + + ERR_FAIL_COND(p_data.get_type()!=Variant::RECT2); + + Rect2 r = p_data; + a=r.pos; + b=r.size; + n=(b-a).tangent(); + + Rect2 aabb; + aabb.pos=a; + aabb.expand_to(b); + if (aabb.size.x==0) + aabb.size.x=0.001; + if (aabb.size.y==0) + aabb.size.y=0.001; + configure(aabb); +} + +Variant SegmentShape2DSW::get_data() const { + + Rect2 r; + r.pos=a; + r.size=b; + return r; +} + +/*********************************************************/ +/*********************************************************/ +/*********************************************************/ + + + +void CircleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { + + r_amount=1; + *r_supports=p_normal*radius; + +} + +bool CircleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + + Vector2 line_vec = p_end - p_begin; + + real_t a, b, c; + + a = line_vec.dot(line_vec); + b = 2 * p_begin.dot(line_vec); + c = p_begin.dot(p_begin) - radius * radius; + + real_t sqrtterm = b*b - 4*a*c; + + if(sqrtterm < 0) + return false; + sqrtterm = Math::sqrt(sqrtterm); + real_t res = ( -b - sqrtterm ) / (2 * a); + + if (res <0 || res >1+CMP_EPSILON) { + return false; + } + + r_point=p_begin+line_vec*res; + r_normal=r_point.normalized(); + return true; +} + +real_t CircleShape2DSW::get_moment_of_inertia(float p_mass) const { + + return radius*radius; +} + +void CircleShape2DSW::set_data(const Variant& p_data) { + + ERR_FAIL_COND(!p_data.is_num()); + radius=p_data; + configure(Rect2(-radius,-radius,radius*2,radius*2)); +} + +Variant CircleShape2DSW::get_data() const { + + return radius; +} + + +/*********************************************************/ +/*********************************************************/ +/*********************************************************/ + + + +void RectangleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { + + for(int i=0;i<2;i++) { + + Vector2 ag; + ag[i]=1.0; + float dp = ag.dot(p_normal); + if (Math::abs(dp)<_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) + continue; + + float sgn = dp>0 ? 1.0 : -1.0; + + r_amount=2; + + r_supports[0][i]=half_extents[i]*sgn; + r_supports[0][i^1]=half_extents[i^1]; + + r_supports[1][i]=half_extents[i]*sgn; + r_supports[1][i^1]=-half_extents[i^1]; + + return; + + + } + + /* USE POINT */ + + r_amount=1; + r_supports[0]=Vector2( + (p_normal.x<0) ? -half_extents.x : half_extents.x, + (p_normal.y<0) ? -half_extents.y : half_extents.y + ); + +} + +bool RectangleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + + return get_aabb().intersects_segment(p_begin,p_end,&r_point,&r_normal); +} + +real_t RectangleShape2DSW::get_moment_of_inertia(float p_mass) const { + + Vector2 he2=half_extents*2; + return p_mass*he2.dot(he2)/12.0f; +} + +void RectangleShape2DSW::set_data(const Variant& p_data) { + + ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2); + + half_extents=p_data; + configure(Rect2(-half_extents,half_extents*2.0)); +} + +Variant RectangleShape2DSW::get_data() const { + + return half_extents; +} + + + +/*********************************************************/ +/*********************************************************/ +/*********************************************************/ + + + +void CapsuleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const { + + Vector2 n=p_normal; + + float d = n.y; + + if (Math::abs( d )<(1.0-_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) ) { + + // make it flat + n.y=0.0; + n.normalize(); + n*=radius; + + r_amount=2; + r_supports[0]=n; + r_supports[0].y+=height*0.5; + r_supports[1]=n; + r_supports[1].y-=height*0.5; + + } else { + + float h = (d > 0) ? height : -height; + + n*=radius; + n.y += h*0.5; + r_amount=1; + *r_supports=n; + + } +} + +bool CapsuleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + + float d = 1e10; + Vector2 n = (p_end-p_begin).normalized(); + bool collided=false; + + //try spheres + for(int i=0;i<2;i++) { + + Vector2 begin = p_begin; + Vector2 end = p_end; + float ofs = (i==0)?-height*0.5:height*0.5; + begin.y+=ofs; + end.y+=ofs; + + Vector2 line_vec = end - begin; + + real_t a, b, c; + + a = line_vec.dot(line_vec); + b = 2 * begin.dot(line_vec); + c = begin.dot(begin) - radius * radius; + + real_t sqrtterm = b*b - 4*a*c; + + if(sqrtterm < 0) + continue; + + sqrtterm = Math::sqrt(sqrtterm); + real_t res = ( -b - sqrtterm ) / (2 * a); + + if (res <0 || res >1+CMP_EPSILON) { + continue; + } + + Vector2 point = begin+line_vec*res; + Vector2 pointf(point.x,point.y-ofs); + real_t pd = n.dot(pointf); + if (pdd) { + support_idx=i; + d=ld; + } + + //test segment + if (points[i].normal.dot(p_normal)>_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) { + + r_amount=2; + r_supports[0]=points[i].pos; + r_supports[1]=points[(i+1)%point_count].pos; + return; + } + } + + ERR_FAIL_COND(support_idx==-1); + + r_amount=1; + r_supports[0]=points[support_idx].pos; + +} + +bool ConvexPolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const { + + Vector2 n = (p_end-p_begin).normalized(); + real_t d=1e10; + bool inters=false; + + for(int i=0;i=0) + // continue; + + + Vector2 res; + + if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,points[i].pos,points[(i+1)%point_count].pos,&res)) + continue; + + float nd = n.dot(res); + if (nd0) + r_normal=-r_normal; + } + + //return get_aabb().intersects_segment(p_begin,p_end,&r_point,&r_normal); + return inters; //todo +} + +real_t ConvexPolygonShape2DSW::get_moment_of_inertia(float p_mass) const { + + Rect2 aabb; + aabb.pos=points[0].pos; + for(int i=0;i arr=p_data; + ERR_FAIL_COND(arr.size()==0); + point_count=arr.size(); + points = memnew_arr(Point,point_count); + DVector::Read r = arr.read(); + + for(int i=0;i dvr = p_data; + point_count=dvr.size()/4; + ERR_FAIL_COND(point_count==0); + + points = memnew_arr(Point,point_count); + DVector::Read r = dvr.read(); + + for(int i=0;i dvr; + + dvr.resize(point_count); + + for(int i=0;id) { + d=ld; + idx=i; + } + } + + + r_amount=1; + ERR_FAIL_COND(idx==-1); + *r_supports=points[idx]; + +} + +bool ConcavePolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const{ + + uint32_t* stack = (uint32_t*)alloca(sizeof(int)*bvh_depth); + + enum { + TEST_AABB_BIT=0, + VISIT_LEFT_BIT=1, + VISIT_RIGHT_BIT=2, + VISIT_DONE_BIT=3, + VISITED_BIT_SHIFT=29, + NODE_IDX_MASK=(1<>VISITED_BIT_SHIFT) { + case TEST_AABB_BIT: { + + + bool valid = b.aabb.intersects_segment(p_begin,p_end); + if (!valid) { + + stack[level]=(VISIT_DONE_BIT<0) + r_normal=-r_normal; + } + + return inters; + +} + + + +int ConcavePolygonShape2DSW::_generate_bvh(BVH *p_bvh,int p_len,int p_depth) { + + if (p_len==1) { + + bvh_depth=MAX(p_depth,bvh_depth); + bvh.push_back(*p_bvh); + return bvh.size()-1; + } + + //else sort best + + Rect2 global_aabb=p_bvh[0].aabb; + for(int i=1;i global_aabb.size.y) { + + SortArray sort; + sort.sort(p_bvh,p_len); + + } else { + + SortArray sort; + sort.sort(p_bvh,p_len); + + } + + int median = p_len/2; + + + BVH node; + node.aabb=global_aabb; + int node_idx = bvh.size(); + bvh.push_back(node); + + int l = _generate_bvh(p_bvh,median,p_depth+1); + int r = _generate_bvh(&p_bvh[median],p_len-median,p_depth+1); + bvh[node_idx].left=l; + bvh[node_idx].right=r; + + return node_idx; + +} + +void ConcavePolygonShape2DSW::set_data(const Variant& p_data) { + + ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2_ARRAY && p_data.get_type()!=Variant::REAL_ARRAY); + + segments.clear();; + points.clear();; + bvh.clear();; + bvh_depth=1; + + Rect2 aabb; + + if (p_data.get_type()==Variant::VECTOR2_ARRAY) { + + DVector p2arr = p_data; + int len = p2arr.size(); + DVector::Read arr = p2arr.read(); + + + Map pointmap; + for(int i=0;ikey(); + for(Map::Element *E=pointmap.front();E;E=E->next()) { + + aabb.expand_to(E->key()); + points[E->get()]=E->key(); + } + + Vector main_vbh; + main_vbh.resize(segments.size()); + for(int i=0;i rsegments; + int len = segments.size(); + rsegments.resize(len*2); + DVector::Write w = rsegments.write(); + for(int i=0;i::Write(); + + return rsegments; +} + +void ConcavePolygonShape2DSW::cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const { + + uint32_t* stack = (uint32_t*)alloca(sizeof(int)*bvh_depth); + + enum { + TEST_AABB_BIT=0, + VISIT_LEFT_BIT=1, + VISIT_RIGHT_BIT=2, + VISIT_DONE_BIT=3, + VISITED_BIT_SHIFT=29, + NODE_IDX_MASK=(1<>VISITED_BIT_SHIFT) { + case TEST_AABB_BIT: { + + + bool valid = p_local_aabb.intersects(b.aabb); + if (!valid) { + + stack[level]=(VISIT_DONE_BIT< owners; -protected: - - void configure(const Rect2& p_aabb); -public: - - _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; } - _FORCE_INLINE_ RID get_self() const {return self; } - - virtual Physics2DServer::ShapeType get_type() const=0; - - _FORCE_INLINE_ Rect2 get_aabb() const { return aabb; } - _FORCE_INLINE_ bool is_configured() const { return configured; } - - virtual bool is_concave() const { return false; } - - virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const=0; - virtual Vector2 get_support(const Vector2& p_normal) const; - virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const=0; - - virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const=0; - virtual real_t get_moment_of_inertia(float p_mass) const=0; - - virtual void set_data(const Variant& p_data)=0; - virtual Variant get_data() const=0; - - _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias=p_bias; } - _FORCE_INLINE_ real_t get_custom_bias() const { return custom_bias; } - - void add_owner(ShapeOwner2DSW *p_owner); - void remove_owner(ShapeOwner2DSW *p_owner); - bool is_owner(ShapeOwner2DSW *p_owner) const; - const Map& get_owners() const; - - Shape2DSW(); - virtual ~Shape2DSW(); -}; - - -class LineShape2DSW : public Shape2DSW { - - - Vector2 normal; - real_t d; - -public: - - _FORCE_INLINE_ Vector2 get_normal() const { return normal; } - _FORCE_INLINE_ real_t get_d() const { return d; } - - virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_LINE; } - - virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); } - virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const; - - virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const; - virtual real_t get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { - //real large - r_min=-1e10; - r_max=1e10; - } - -}; - - -class RayShape2DSW : public Shape2DSW { - - - real_t length; - -public: - - - _FORCE_INLINE_ real_t get_length() const { return length; } - - virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_RAY; } - - virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); } - virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const; - - virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const; - virtual real_t get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { - //real large - r_max = p_normal.dot(p_transform.get_origin()); - r_min = p_normal.dot(p_transform.xform(Vector2(0,length))); - if (r_max 0) ? height : -height; - - n *= radius; - n.y += h * 0.5; - - r_max = p_normal.dot(p_transform.xform(n)); - r_min = p_normal.dot(p_transform.xform(-n)); - - if (r_maxr_max) - r_max=d; - if (d segments; - Vector points; - - struct BVH { - - Rect2 aabb; - int left,right; - }; - - - Vector bvh; - int bvh_depth; - - - struct BVH_CompareX { - - _FORCE_INLINE_ bool operator ()(const BVH& a, const BVH& b) const { - - return (a.aabb.pos.x+a.aabb.size.x*0.5) < (b.aabb.pos.x+b.aabb.size.x*0.5); - } - }; - - struct BVH_CompareY { - - _FORCE_INLINE_ bool operator ()(const BVH& a, const BVH& b) const { - - return (a.aabb.pos.y+a.aabb.size.y*0.5) < (b.aabb.pos.y+b.aabb.size.y*0.5); - } - }; - - int _generate_bvh(BVH *p_bvh,int p_len,int p_depth); - -public: - - virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_CONCAVE_POLYGON; } - - virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/ } - virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const; - - virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const; - - virtual real_t get_moment_of_inertia(float p_mass) const { return 0; } - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - virtual void cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const; - -}; - - -#endif // SHAPE_2D_2DSW_H +#ifndef SHAPE_2D_2DSW_H +#define SHAPE_2D_2DSW_H + +#include "servers/physics_2d_server.h" +#define _SEGMENT_IS_VALID_SUPPORT_TRESHOLD 0.99998 + +/* + +SHAPE_LINE, ///< plane:"plane" +SHAPE_SEGMENT, ///< float:"length" +SHAPE_CIRCLE, ///< float:"radius" +SHAPE_RECTANGLE, ///< vec3:"extents" +SHAPE_CONVEX_POLYGON, ///< array of planes:"planes" +SHAPE_CONCAVE_POLYGON, ///< Vector2 array:"triangles" , or Dictionary with "indices" (int array) and "triangles" (Vector2 array) +SHAPE_CUSTOM, ///< Server-Implementation based custom shape, calling shape_create() with this value will result in an error + +*/ + +class Shape2DSW; + +class ShapeOwner2DSW { +public: + + virtual void _shape_changed()=0; + virtual void remove_shape(Shape2DSW *p_shape)=0; + + virtual ~ShapeOwner2DSW() {} +}; + +class Shape2DSW { + + RID self; + Rect2 aabb; + bool configured; + real_t custom_bias; + + Map owners; +protected: + + void configure(const Rect2& p_aabb); +public: + + _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; } + _FORCE_INLINE_ RID get_self() const {return self; } + + virtual Physics2DServer::ShapeType get_type() const=0; + + _FORCE_INLINE_ Rect2 get_aabb() const { return aabb; } + _FORCE_INLINE_ bool is_configured() const { return configured; } + + virtual bool is_concave() const { return false; } + + virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const=0; + virtual void project_range_castv(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const=0; + virtual Vector2 get_support(const Vector2& p_normal) const; + virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const=0; + + virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const=0; + virtual real_t get_moment_of_inertia(float p_mass) const=0; + + virtual void set_data(const Variant& p_data)=0; + virtual Variant get_data() const=0; + + _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias=p_bias; } + _FORCE_INLINE_ real_t get_custom_bias() const { return custom_bias; } + + void add_owner(ShapeOwner2DSW *p_owner); + void remove_owner(ShapeOwner2DSW *p_owner); + bool is_owner(ShapeOwner2DSW *p_owner) const; + const Map& get_owners() const; + + + _FORCE_INLINE_ void get_supports_transformed_cast(const Vector2& p_cast,const Vector2& p_normal,const Matrix32& p_xform,Vector2 *r_supports,int & r_amount) const { + + get_supports(p_xform.basis_xform_inv(p_normal).normalized(),r_supports,r_amount); + for(int i=0;i0) { + //normal points towards cast, add cast + r_supports[0]+=p_cast; + } + + } else { + + if (Math::abs( p_normal.dot(p_cast.normalized()) )<(1.0-_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) ) { + //optimize line and make it larger because they are parallel + if ((r_supports[1]-r_supports[0]).dot(p_cast)>0) { + //larger towards 1 + r_supports[1]+=p_cast; + } else { + //larger towards 0 + r_supports[0]+=p_cast; + } + } else if (p_cast.dot(p_normal)>0) { + //normal points towards cast, add cast + r_supports[0]+=p_cast; + r_supports[1]+=p_cast; + } + + } + } + + Shape2DSW(); + virtual ~Shape2DSW(); +}; + +//let the optimizer do the magic +#define DEFAULT_PROJECT_RANGE_CAST \ +virtual void project_range_castv(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {\ + project_range_cast(p_cast,p_normal,p_transform,r_min,r_max);\ +}\ +_FORCE_INLINE_ void project_range_cast(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {\ +\ + real_t mina,maxa;\ + real_t minb,maxb;\ + Matrix32 ofsb=p_transform;\ + ofsb.elements[2]+=p_cast;\ + project_range(p_normal,p_transform,mina,maxa);\ + project_range(p_normal,ofsb,minb,maxb); \ + r_min=MIN(mina,minb);\ + r_max=MAX(maxa,maxb);\ +} + +class LineShape2DSW : public Shape2DSW { + + + Vector2 normal; + real_t d; + +public: + + _FORCE_INLINE_ Vector2 get_normal() const { return normal; } + _FORCE_INLINE_ real_t get_d() const { return d; } + + virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_LINE; } + + virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); } + virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const; + + virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const; + virtual real_t get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { + //real large + r_min=-1e10; + r_max=1e10; + } + + virtual void project_range_castv(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { + project_range_cast(p_cast,p_normal,p_transform,r_min,r_max); + } + + _FORCE_INLINE_ void project_range_cast(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { + //real large + r_min=-1e10; + r_max=1e10; + } + + + +}; + + +class RayShape2DSW : public Shape2DSW { + + + real_t length; + +public: + + + _FORCE_INLINE_ real_t get_length() const { return length; } + + virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_RAY; } + + virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); } + virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const; + + virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const; + virtual real_t get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { + //real large + r_max = p_normal.dot(p_transform.get_origin()); + r_min = p_normal.dot(p_transform.xform(Vector2(0,length))); + if (r_max 0) ? height : -height; + + n *= radius; + n.y += h * 0.5; + + r_max = p_normal.dot(p_transform.xform(n)); + r_min = p_normal.dot(p_transform.xform(-n)); + + if (r_maxr_max) + r_max=d; + if (d segments; + Vector points; + + struct BVH { + + Rect2 aabb; + int left,right; + }; + + + Vector bvh; + int bvh_depth; + + + struct BVH_CompareX { + + _FORCE_INLINE_ bool operator ()(const BVH& a, const BVH& b) const { + + return (a.aabb.pos.x+a.aabb.size.x*0.5) < (b.aabb.pos.x+b.aabb.size.x*0.5); + } + }; + + struct BVH_CompareY { + + _FORCE_INLINE_ bool operator ()(const BVH& a, const BVH& b) const { + + return (a.aabb.pos.y+a.aabb.size.y*0.5) < (b.aabb.pos.y+b.aabb.size.y*0.5); + } + }; + + int _generate_bvh(BVH *p_bvh,int p_len,int p_depth); + +public: + + virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_CONCAVE_POLYGON; } + + virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/ } + virtual void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/ } + virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const; + + virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const; + + virtual real_t get_moment_of_inertia(float p_mass) const { return 0; } + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + virtual void cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const; + + + DEFAULT_PROJECT_RANGE_CAST + +}; + + +#endif // SHAPE_2D_2DSW_H diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp index 4fe53aeb4d0..2c714f50650 100644 --- a/servers/physics_2d/space_2d_sw.cpp +++ b/servers/physics_2d/space_2d_sw.cpp @@ -26,407 +26,597 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "space_2d_sw.h" -#include "collision_solver_2d_sw.h" -#include "physics_2d_server_sw.h" - - -bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set& p_exclude,uint32_t p_user_mask) { - - - ERR_FAIL_COND_V(space->locked,false); - - Vector2 begin,end; - Vector2 normal; - begin=p_from; - end=p_to; - normal=(end-begin).normalized(); - - - int amount = space->broadphase->cull_segment(begin,end,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); - - //todo, create another array tha references results, compute AABBs and check closest point to ray origin, sort, and stop evaluating results when beyond first collision - - bool collided=false; - Vector2 res_point,res_normal; - int res_shape; - const CollisionObject2DSW *res_obj; - real_t min_d=1e10; - - - for(int i=0;iintersection_query_results[i]->get_type()==CollisionObject2DSW::TYPE_AREA) - continue; //ignore area - - if (p_exclude.has( space->intersection_query_results[i]->get_self())) - continue; - - const CollisionObject2DSW *col_obj=space->intersection_query_results[i]; - - int shape_idx=space->intersection_query_subindex_results[i]; - Matrix32 inv_xform = col_obj->get_shape_inv_transform(shape_idx) * col_obj->get_inv_transform(); - - Vector2 local_from = inv_xform.xform(begin); - Vector2 local_to = inv_xform.xform(end); - - /*local_from = col_obj->get_inv_transform().xform(begin); - local_from = col_obj->get_shape_inv_transform(shape_idx).xform(local_from); - - local_to = col_obj->get_inv_transform().xform(end); - local_to = col_obj->get_shape_inv_transform(shape_idx).xform(local_to);*/ - - const Shape2DSW *shape = col_obj->get_shape(shape_idx); - - Vector2 shape_point,shape_normal; - - - if (shape->intersect_segment(local_from,local_to,shape_point,shape_normal)) { - - - //print_line("inters sgment!"); - Matrix32 xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx); - shape_point=xform.xform(shape_point); - - real_t ld = normal.dot(shape_point); - - - if (ldget_instance_id(); - if (r_result.collider_id!=0) - r_result.collider=ObjectDB::get_instance(r_result.collider_id); - r_result.normal=res_normal; - r_result.position=res_point; - r_result.rid=res_obj->get_self(); - r_result.shape=res_shape; - - return true; - -} - - -int Physics2DDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Matrix32& p_xform,ShapeResult *r_results,int p_result_max,const Set& p_exclude,uint32_t p_user_mask) { - - if (p_result_max<=0) - return 0; - - Shape2DSW *shape = static_cast(Physics2DServer::get_singleton())->shape_owner.get(p_shape); - ERR_FAIL_COND_V(!shape,0); - - Rect2 aabb = p_xform.xform(shape->get_aabb()); - - int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); - - bool collided=false; - int cc=0; - - for(int i=0;i=p_result_max) - break; - - if (space->intersection_query_results[i]->get_type()==CollisionObject2DSW::TYPE_AREA) - continue; //ignore area - - if (p_exclude.has( space->intersection_query_results[i]->get_self())) - continue; - - - const CollisionObject2DSW *col_obj=space->intersection_query_results[i]; - int shape_idx=space->intersection_query_subindex_results[i]; - - if (!CollisionSolver2DSW::solve_static(shape,p_xform,p_xform.affine_inverse(),col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), col_obj->get_inv_transform() * col_obj->get_shape_inv_transform(shape_idx),NULL,NULL,NULL)) - continue; - - r_results[cc].collider_id=col_obj->get_instance_id(); - if (r_results[cc].collider_id!=0) - r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id); - r_results[cc].rid=col_obj->get_self(); - r_results[cc].shape=shape_idx; - - cc++; - - } - - return cc; - -} - -Physics2DDirectSpaceStateSW::Physics2DDirectSpaceStateSW() { - - - space=NULL; -} - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - -void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_self) { - - CollisionObject2DSW::Type type_A=A->get_type(); - CollisionObject2DSW::Type type_B=B->get_type(); - if (type_A>type_B) { - - SWAP(A,B); - SWAP(p_subindex_A,p_subindex_B); - SWAP(type_A,type_B); - } - - Space2DSW *self = (Space2DSW*)p_self; - - if (type_A==CollisionObject2DSW::TYPE_AREA) { - - - ERR_FAIL_COND_V(type_B!=CollisionObject2DSW::TYPE_BODY,NULL); - Area2DSW *area=static_cast(A); - Body2DSW *body=static_cast(B); - - AreaPair2DSW *area_pair = memnew(AreaPair2DSW(body,p_subindex_B,area,p_subindex_A) ); - - return area_pair; - } else { - - - BodyPair2DSW *b = memnew( BodyPair2DSW((Body2DSW*)A,p_subindex_A,(Body2DSW*)B,p_subindex_B) ); - return b; - - } - - return NULL; -} - -void Space2DSW::_broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self) { - - - - Space2DSW *self = (Space2DSW*)p_self; - Constraint2DSW *c = (Constraint2DSW*)p_data; - memdelete(c); -} - - -const SelfList::List& Space2DSW::get_active_body_list() const { - - return active_list; -} -void Space2DSW::body_add_to_active_list(SelfList* p_body) { - - active_list.add(p_body); -} -void Space2DSW::body_remove_from_active_list(SelfList* p_body) { - - active_list.remove(p_body); - -} - -void Space2DSW::body_add_to_inertia_update_list(SelfList* p_body) { - - - inertia_update_list.add(p_body); -} - -void Space2DSW::body_remove_from_inertia_update_list(SelfList* p_body) { - - inertia_update_list.remove(p_body); -} - -BroadPhase2DSW *Space2DSW::get_broadphase() { - - return broadphase; -} - -void Space2DSW::add_object(CollisionObject2DSW *p_object) { - - ERR_FAIL_COND( objects.has(p_object) ); - objects.insert(p_object); -} - -void Space2DSW::remove_object(CollisionObject2DSW *p_object) { - - ERR_FAIL_COND( !objects.has(p_object) ); - objects.erase(p_object); -} - -const Set &Space2DSW::get_objects() const { - - return objects; -} - -void Space2DSW::body_add_to_state_query_list(SelfList* p_body) { - - state_query_list.add(p_body); -} -void Space2DSW::body_remove_from_state_query_list(SelfList* p_body) { - - state_query_list.remove(p_body); -} - -void Space2DSW::area_add_to_monitor_query_list(SelfList* p_area) { - - monitor_query_list.add(p_area); -} -void Space2DSW::area_remove_from_monitor_query_list(SelfList* p_area) { - - monitor_query_list.remove(p_area); -} - -void Space2DSW::area_add_to_moved_list(SelfList* p_area) { - - area_moved_list.add(p_area); -} - -void Space2DSW::area_remove_from_moved_list(SelfList* p_area) { - - area_moved_list.remove(p_area); -} - -const SelfList::List& Space2DSW::get_moved_area_list() const { - - return area_moved_list; -} - - -void Space2DSW::call_queries() { - - while(state_query_list.first()) { - - Body2DSW * b = state_query_list.first()->self(); - b->call_queries(); - state_query_list.remove(state_query_list.first()); - } - - while(monitor_query_list.first()) { - - Area2DSW * a = monitor_query_list.first()->self(); - a->call_queries(); - monitor_query_list.remove(monitor_query_list.first()); - } - -} - -void Space2DSW::setup() { - - - while(inertia_update_list.first()) { - inertia_update_list.first()->self()->update_inertias(); - inertia_update_list.remove(inertia_update_list.first()); - } - - -} - -void Space2DSW::update() { - - broadphase->update(); - -} - - -void Space2DSW::set_param(Physics2DServer::SpaceParameter p_param, real_t p_value) { - - switch(p_param) { - - case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: contact_recycle_radius=p_value; break; - case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: contact_max_separation=p_value; break; - case Physics2DServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: contact_max_allowed_penetration=p_value; break; - case Physics2DServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: body_linear_velocity_sleep_treshold=p_value; break; - case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: body_angular_velocity_sleep_treshold=p_value; break; - case Physics2DServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: body_time_to_sleep=p_value; break; - case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO: body_angular_velocity_damp_ratio=p_value; break; - case Physics2DServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: constraint_bias=p_value; break; - } -} - -real_t Space2DSW::get_param(Physics2DServer::SpaceParameter p_param) const { - - switch(p_param) { - - case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: return contact_recycle_radius; - case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: return contact_max_separation; - case Physics2DServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: return contact_max_allowed_penetration; - case Physics2DServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: return body_linear_velocity_sleep_treshold; - case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: return body_angular_velocity_sleep_treshold; - case Physics2DServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: return body_time_to_sleep; - case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO: return body_angular_velocity_damp_ratio; - case Physics2DServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: return constraint_bias; - } - return 0; -} - -void Space2DSW::lock() { - - locked=true; -} - -void Space2DSW::unlock() { - - locked=false; -} - -bool Space2DSW::is_locked() const { - - return locked; -} - -Physics2DDirectSpaceStateSW *Space2DSW::get_direct_state() { - - return direct_access; -} - -Space2DSW::Space2DSW() { - - - locked=false; - contact_recycle_radius=0.01; - contact_max_separation=0.05; - contact_max_allowed_penetration= 0.01; - - constraint_bias = 0.01; - body_linear_velocity_sleep_treshold=0.01; - body_angular_velocity_sleep_treshold=(8.0 / 180.0 * Math_PI); - body_time_to_sleep=0.5; - body_angular_velocity_damp_ratio=15; - - - broadphase = BroadPhase2DSW::create_func(); - broadphase->set_pair_callback(_broadphase_pair,this); - broadphase->set_unpair_callback(_broadphase_unpair,this); - area=NULL; - - direct_access = memnew( Physics2DDirectSpaceStateSW ); - direct_access->space=this; -} - -Space2DSW::~Space2DSW() { - - memdelete(broadphase); - memdelete( direct_access ); -} - - - +#include "space_2d_sw.h" +#include "collision_solver_2d_sw.h" +#include "physics_2d_server_sw.h" + + +bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set& p_exclude,uint32_t p_user_mask) { + + + ERR_FAIL_COND_V(space->locked,false); + + Vector2 begin,end; + Vector2 normal; + begin=p_from; + end=p_to; + normal=(end-begin).normalized(); + + int amount = space->broadphase->cull_segment(begin,end,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); + + //todo, create another array tha references results, compute AABBs and check closest point to ray origin, sort, and stop evaluating results when beyond first collision + + bool collided=false; + Vector2 res_point,res_normal; + int res_shape; + const CollisionObject2DSW *res_obj; + real_t min_d=1e10; + + + for(int i=0;iintersection_query_results[i]->get_type()==CollisionObject2DSW::TYPE_AREA) + continue; //ignore area + + if (p_exclude.has( space->intersection_query_results[i]->get_self())) + continue; + + const CollisionObject2DSW *col_obj=space->intersection_query_results[i]; + + int shape_idx=space->intersection_query_subindex_results[i]; + Matrix32 inv_xform = col_obj->get_shape_inv_transform(shape_idx) * col_obj->get_inv_transform(); + + Vector2 local_from = inv_xform.xform(begin); + Vector2 local_to = inv_xform.xform(end); + + /*local_from = col_obj->get_inv_transform().xform(begin); + local_from = col_obj->get_shape_inv_transform(shape_idx).xform(local_from); + + local_to = col_obj->get_inv_transform().xform(end); + local_to = col_obj->get_shape_inv_transform(shape_idx).xform(local_to);*/ + + const Shape2DSW *shape = col_obj->get_shape(shape_idx); + + Vector2 shape_point,shape_normal; + + + if (shape->intersect_segment(local_from,local_to,shape_point,shape_normal)) { + + + //print_line("inters sgment!"); + Matrix32 xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx); + shape_point=xform.xform(shape_point); + + real_t ld = normal.dot(shape_point); + + + if (ldget_instance_id(); + if (r_result.collider_id!=0) + r_result.collider=ObjectDB::get_instance(r_result.collider_id); + r_result.normal=res_normal; + r_result.position=res_point; + r_result.rid=res_obj->get_self(); + r_result.shape=res_shape; + + return true; + +} + + +int Physics2DDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,ShapeResult *r_results,int p_result_max,const Set& p_exclude,uint32_t p_user_mask) { + + if (p_result_max<=0) + return 0; + + Shape2DSW *shape = static_cast(Physics2DServer::get_singleton())->shape_owner.get(p_shape); + ERR_FAIL_COND_V(!shape,0); + + Rect2 aabb = p_xform.xform(shape->get_aabb()); + + int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); + + bool collided=false; + int cc=0; + + for(int i=0;i=p_result_max) + break; + + if (space->intersection_query_results[i]->get_type()==CollisionObject2DSW::TYPE_AREA) + continue; //ignore area + + if (p_exclude.has( space->intersection_query_results[i]->get_self())) + continue; + + + const CollisionObject2DSW *col_obj=space->intersection_query_results[i]; + int shape_idx=space->intersection_query_subindex_results[i]; + + if (!CollisionSolver2DSW::solve(shape,p_xform,p_motion,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2(),NULL,NULL,NULL)) + continue; + + r_results[cc].collider_id=col_obj->get_instance_id(); + if (r_results[cc].collider_id!=0) + r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id); + r_results[cc].rid=col_obj->get_self(); + r_results[cc].shape=shape_idx; + + cc++; + + } + + return cc; + +} + + +struct MotionCallbackRayCastData { + + Vector2 best_contact; + Vector2 best_normal; + float best_len; + Matrix32 b_xform_inv; + Matrix32 b_xform; + Vector2 motion; + Shape2DSW * shape_B; + +}; + +static void _motion_cbk_result(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) { + + + MotionCallbackRayCastData *rd=(MotionCallbackRayCastData*)p_userdata; + + Vector2 contact_normal = (p_point_B-p_point_A).normalized(); + + Vector2 from=p_point_A-(rd->motion*1.01); + Vector2 p,n; + + if (contact_normal.dot(rd->motion.normalized())motion; //avoid precission issues + + + bool res = rd->shape_B->intersect_segment(rd->b_xform_inv.xform(from),rd->b_xform_inv.xform(to),p,n); + + + if (!res) { + print_line("lolwut failed"); + return; + } + + p = rd->b_xform.xform(p); + + n = rd->b_xform_inv.basis_xform_inv(n).normalized(); + } + + float len = p.distance_to(from); + + if (lenbest_len) { + rd->best_contact=p; + rd->best_normal=n; + rd->best_len=len; + } +} + +bool Physics2DDirectSpaceStateSW::cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion, MotionCastCollision &r_result, const Set& p_exclude,uint32_t p_user_mask) { + + Shape2DSW *shape = static_cast(Physics2DServer::get_singleton())->shape_owner.get(p_shape); + ERR_FAIL_COND_V(!shape,0); + + Rect2 aabb = p_xform.xform(shape->get_aabb()); + aabb=aabb.merge(Rect2(aabb.pos+p_motion,aabb.size)); //motion + + int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); + + bool collided=false; + r_result.travel=1; + + MotionCallbackRayCastData best_normal; + best_normal.best_len=1e20; + for(int i=0;iintersection_query_results[i]->get_type()==CollisionObject2DSW::TYPE_AREA) + continue; //ignore area + + if (p_exclude.has( space->intersection_query_results[i]->get_self())) + continue; //ignore excluded + + + const CollisionObject2DSW *col_obj=space->intersection_query_results[i]; + int shape_idx=space->intersection_query_subindex_results[i]; + + + Matrix32 col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx); + //test initial overlap, does it collide if going all the way? + if (!CollisionSolver2DSW::solve(shape,p_xform,p_motion,col_obj->get_shape(shape_idx),col_obj_xform,Vector2() ,NULL,NULL,NULL)) { + + continue; + } + + + //test initial overlap + if (CollisionSolver2DSW::solve(shape,p_xform,Vector2(),col_obj->get_shape(shape_idx),col_obj_xform,Vector2() ,NULL,NULL,NULL)) { + + r_result.collider_id=col_obj->get_instance_id(); + r_result.collider=r_result.collider_id!=0 ? ObjectDB::get_instance(col_obj->get_instance_id()) : NULL; + r_result.shape=shape_idx; + r_result.rid=col_obj->get_self(); + r_result.travel=0; + r_result.point=Vector2(); + r_result.normal=Vector2(); + return true; + } + +#if 0 + Vector2 mnormal=p_motion.normalized(); + Matrix32 col_shape_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx); + ShapeSW *col_shape = col_obj->get_shape(shape_idx); + + real_t min,max; + col_shape->project_rangev(mnormal,col_shape_xform,min,max); + real_t width = max-min; + + int a; + Vector2 s[2]; + col_shape->get_supports(col_shape_xform.basis_xform(mnormal).normalized(),s,a); + Vector2 from = col_shape_xform.xform(s[0]); + Vector2 to = from + p_motion; + + Matrix32 from_inv = col_shape_xform.affine_inverse(); + + Vector2 local_from = from_inv.xform(from-mnormal*width*0.1); //start from a little inside the bounding box + Vector2 local_to = from_inv.xform(to); + + Vector2 rpos,rnorm; + if (!col_shape->intersect_segment(local_from,local_to,rpos,rnorm)) + return false; + + //ray hit something + + + Vector2 hitpos = p_xform_B.xform(rpos); +#endif + + //just do kinematic solving + float low=0; + float hi=1; + Vector2 mnormal=p_motion.normalized(); + + for(int i=0;i<8;i++) { //steps should be customizable.. + + Matrix32 xfa = p_xform; + float ofs = (low+hi)*0.5; + + Vector2 sep=mnormal; //important optimization for this to work fast enough + bool collided = CollisionSolver2DSW::solve(shape,p_xform,p_motion*ofs,col_obj->get_shape(shape_idx),col_obj_xform,Vector2(),NULL,NULL,&sep); + + if (collided) { + + hi=ofs; + } else { + + low=ofs; + } + } + + + best_normal.shape_B=col_obj->get_shape(shape_idx); + best_normal.motion=p_motion*hi; + best_normal.b_xform=col_obj_xform; + best_normal.b_xform_inv=col_obj_xform.affine_inverse(); + + bool sc = CollisionSolver2DSW::solve(shape,p_xform,p_motion*hi,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2() ,_motion_cbk_result,&best_normal); + print_line("CLD: "+itos(sc)); + + + if (collided && low>=r_result.travel) + continue; + + collided=true; + r_result.travel=low; + + r_result.collider_id=col_obj->get_instance_id(); + r_result.collider=r_result.collider_id!=0 ? ObjectDB::get_instance(col_obj->get_instance_id()) : NULL; + r_result.shape=shape_idx; + r_result.rid=col_obj->get_self(); + + } + + if (collided) { + ERR_FAIL_COND_V(best_normal.best_normal==Vector2(),false); + r_result.normal=best_normal.best_normal; + r_result.point=best_normal.best_contact; + } + + return collided; + + +} + + +Physics2DDirectSpaceStateSW::Physics2DDirectSpaceStateSW() { + + + space=NULL; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + + + + + + +void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_self) { + + CollisionObject2DSW::Type type_A=A->get_type(); + CollisionObject2DSW::Type type_B=B->get_type(); + if (type_A>type_B) { + + SWAP(A,B); + SWAP(p_subindex_A,p_subindex_B); + SWAP(type_A,type_B); + } + + Space2DSW *self = (Space2DSW*)p_self; + + if (type_A==CollisionObject2DSW::TYPE_AREA) { + + + ERR_FAIL_COND_V(type_B!=CollisionObject2DSW::TYPE_BODY,NULL); + Area2DSW *area=static_cast(A); + Body2DSW *body=static_cast(B); + + AreaPair2DSW *area_pair = memnew(AreaPair2DSW(body,p_subindex_B,area,p_subindex_A) ); + + return area_pair; + } else { + + + BodyPair2DSW *b = memnew( BodyPair2DSW((Body2DSW*)A,p_subindex_A,(Body2DSW*)B,p_subindex_B) ); + return b; + + } + + return NULL; +} + +void Space2DSW::_broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self) { + + + + Space2DSW *self = (Space2DSW*)p_self; + Constraint2DSW *c = (Constraint2DSW*)p_data; + memdelete(c); +} + + +const SelfList::List& Space2DSW::get_active_body_list() const { + + return active_list; +} +void Space2DSW::body_add_to_active_list(SelfList* p_body) { + + active_list.add(p_body); +} +void Space2DSW::body_remove_from_active_list(SelfList* p_body) { + + active_list.remove(p_body); + +} + +void Space2DSW::body_add_to_inertia_update_list(SelfList* p_body) { + + + inertia_update_list.add(p_body); +} + +void Space2DSW::body_remove_from_inertia_update_list(SelfList* p_body) { + + inertia_update_list.remove(p_body); +} + +BroadPhase2DSW *Space2DSW::get_broadphase() { + + return broadphase; +} + +void Space2DSW::add_object(CollisionObject2DSW *p_object) { + + ERR_FAIL_COND( objects.has(p_object) ); + objects.insert(p_object); +} + +void Space2DSW::remove_object(CollisionObject2DSW *p_object) { + + ERR_FAIL_COND( !objects.has(p_object) ); + objects.erase(p_object); +} + +const Set &Space2DSW::get_objects() const { + + return objects; +} + +void Space2DSW::body_add_to_state_query_list(SelfList* p_body) { + + state_query_list.add(p_body); +} +void Space2DSW::body_remove_from_state_query_list(SelfList* p_body) { + + state_query_list.remove(p_body); +} + +void Space2DSW::area_add_to_monitor_query_list(SelfList* p_area) { + + monitor_query_list.add(p_area); +} +void Space2DSW::area_remove_from_monitor_query_list(SelfList* p_area) { + + monitor_query_list.remove(p_area); +} + +void Space2DSW::area_add_to_moved_list(SelfList* p_area) { + + area_moved_list.add(p_area); +} + +void Space2DSW::area_remove_from_moved_list(SelfList* p_area) { + + area_moved_list.remove(p_area); +} + +const SelfList::List& Space2DSW::get_moved_area_list() const { + + return area_moved_list; +} + + +void Space2DSW::call_queries() { + + while(state_query_list.first()) { + + Body2DSW * b = state_query_list.first()->self(); + b->call_queries(); + state_query_list.remove(state_query_list.first()); + } + + while(monitor_query_list.first()) { + + Area2DSW * a = monitor_query_list.first()->self(); + a->call_queries(); + monitor_query_list.remove(monitor_query_list.first()); + } + +} + +void Space2DSW::setup() { + + + while(inertia_update_list.first()) { + inertia_update_list.first()->self()->update_inertias(); + inertia_update_list.remove(inertia_update_list.first()); + } + + +} + +void Space2DSW::update() { + + broadphase->update(); + +} + + +void Space2DSW::set_param(Physics2DServer::SpaceParameter p_param, real_t p_value) { + + switch(p_param) { + + case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: contact_recycle_radius=p_value; break; + case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: contact_max_separation=p_value; break; + case Physics2DServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: contact_max_allowed_penetration=p_value; break; + case Physics2DServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: body_linear_velocity_sleep_treshold=p_value; break; + case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: body_angular_velocity_sleep_treshold=p_value; break; + case Physics2DServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: body_time_to_sleep=p_value; break; + case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO: body_angular_velocity_damp_ratio=p_value; break; + case Physics2DServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: constraint_bias=p_value; break; + } +} + +real_t Space2DSW::get_param(Physics2DServer::SpaceParameter p_param) const { + + switch(p_param) { + + case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: return contact_recycle_radius; + case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: return contact_max_separation; + case Physics2DServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: return contact_max_allowed_penetration; + case Physics2DServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: return body_linear_velocity_sleep_treshold; + case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: return body_angular_velocity_sleep_treshold; + case Physics2DServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: return body_time_to_sleep; + case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO: return body_angular_velocity_damp_ratio; + case Physics2DServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: return constraint_bias; + } + return 0; +} + +void Space2DSW::lock() { + + locked=true; +} + +void Space2DSW::unlock() { + + locked=false; +} + +bool Space2DSW::is_locked() const { + + return locked; +} + +Physics2DDirectSpaceStateSW *Space2DSW::get_direct_state() { + + return direct_access; +} + +Space2DSW::Space2DSW() { + + + locked=false; + contact_recycle_radius=0.01; + contact_max_separation=0.05; + contact_max_allowed_penetration= 0.01; + + constraint_bias = 0.01; + body_linear_velocity_sleep_treshold=0.01; + body_angular_velocity_sleep_treshold=(8.0 / 180.0 * Math_PI); + body_time_to_sleep=0.5; + body_angular_velocity_damp_ratio=15; + + + broadphase = BroadPhase2DSW::create_func(); + broadphase->set_pair_callback(_broadphase_pair,this); + broadphase->set_unpair_callback(_broadphase_unpair,this); + area=NULL; + + direct_access = memnew( Physics2DDirectSpaceStateSW ); + direct_access->space=this; +} + +Space2DSW::~Space2DSW() { + + memdelete(broadphase); + memdelete( direct_access ); +} + + + diff --git a/servers/physics_2d/space_2d_sw.h b/servers/physics_2d/space_2d_sw.h index f65ec14427e..978e88479de 100644 --- a/servers/physics_2d/space_2d_sw.h +++ b/servers/physics_2d/space_2d_sw.h @@ -26,135 +26,136 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef SPACE_2D_SW_H -#define SPACE_2D_SW_H - -#include "typedefs.h" -#include "hash_map.h" -#include "body_2d_sw.h" -#include "area_2d_sw.h" -#include "body_pair_2d_sw.h" -#include "area_pair_2d_sw.h" -#include "broad_phase_2d_sw.h" -#include "collision_object_2d_sw.h" - - -class Physics2DDirectSpaceStateSW : public Physics2DDirectSpaceState { - - OBJ_TYPE( Physics2DDirectSpaceStateSW, Physics2DDirectSpaceState ); -public: - - Space2DSW *space; - - bool intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set& p_exclude=Set(),uint32_t p_user_mask=0); - int intersect_shape(const RID& p_shape, const Matrix32& p_xform,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_user_mask=0); - - Physics2DDirectSpaceStateSW(); -}; - - - -class Space2DSW { - - - Physics2DDirectSpaceStateSW *direct_access; - RID self; - - BroadPhase2DSW *broadphase; - SelfList::List active_list; - SelfList::List inertia_update_list; - SelfList::List state_query_list; - SelfList::List monitor_query_list; - SelfList::List area_moved_list; - - static void* _broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_self); - static void _broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self); - - Set objects; - - Area2DSW *area; - - real_t contact_recycle_radius; - real_t contact_max_separation; - real_t contact_max_allowed_penetration; - real_t constraint_bias; - - enum { - - INTERSECTION_QUERY_MAX=2048 - }; - - CollisionObject2DSW *intersection_query_results[INTERSECTION_QUERY_MAX]; - int intersection_query_subindex_results[INTERSECTION_QUERY_MAX]; - - float body_linear_velocity_sleep_treshold; - float body_angular_velocity_sleep_treshold; - float body_time_to_sleep; - float body_angular_velocity_damp_ratio; - - bool locked; - -friend class Physics2DDirectSpaceStateSW; - -public: - - _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; } - _FORCE_INLINE_ RID get_self() const { return self; } - - void set_default_area(Area2DSW *p_area) { area=p_area; } - Area2DSW *get_default_area() const { return area; } - - const SelfList::List& get_active_body_list() const; - void body_add_to_active_list(SelfList* p_body); - void body_remove_from_active_list(SelfList* p_body); - void body_add_to_inertia_update_list(SelfList* p_body); - void body_remove_from_inertia_update_list(SelfList* p_body); - void area_add_to_moved_list(SelfList* p_area); - void area_remove_from_moved_list(SelfList* p_area); - const SelfList::List& get_moved_area_list() const; - - - - - void body_add_to_state_query_list(SelfList* p_body); - void body_remove_from_state_query_list(SelfList* p_body); - - void area_add_to_monitor_query_list(SelfList* p_area); - void area_remove_from_monitor_query_list(SelfList* p_area); - - BroadPhase2DSW *get_broadphase(); - - void add_object(CollisionObject2DSW *p_object); - void remove_object(CollisionObject2DSW *p_object); - const Set &get_objects() const; - - _FORCE_INLINE_ real_t get_contact_recycle_radius() const { return contact_recycle_radius; } - _FORCE_INLINE_ real_t get_contact_max_separation() const { return contact_max_separation; } - _FORCE_INLINE_ real_t get_contact_max_allowed_penetration() const { return contact_max_allowed_penetration; } - _FORCE_INLINE_ real_t get_constraint_bias() const { return constraint_bias; } - _FORCE_INLINE_ real_t get_body_linear_velocity_sleep_treshold() const { return body_linear_velocity_sleep_treshold; } - _FORCE_INLINE_ real_t get_body_angular_velocity_sleep_treshold() const { return body_angular_velocity_sleep_treshold; } - _FORCE_INLINE_ real_t get_body_time_to_sleep() const { return body_time_to_sleep; } - _FORCE_INLINE_ real_t get_body_angular_velocity_damp_ratio() const { return body_angular_velocity_damp_ratio; } - - - void update(); - void setup(); - void call_queries(); - - - bool is_locked() const; - void lock(); - void unlock(); - - void set_param(Physics2DServer::SpaceParameter p_param, real_t p_value); - real_t get_param(Physics2DServer::SpaceParameter p_param) const; - - Physics2DDirectSpaceStateSW *get_direct_state(); - - Space2DSW(); - ~Space2DSW(); -}; - - -#endif // SPACE_2D_SW_H +#ifndef SPACE_2D_SW_H +#define SPACE_2D_SW_H + +#include "typedefs.h" +#include "hash_map.h" +#include "body_2d_sw.h" +#include "area_2d_sw.h" +#include "body_pair_2d_sw.h" +#include "area_pair_2d_sw.h" +#include "broad_phase_2d_sw.h" +#include "collision_object_2d_sw.h" + + +class Physics2DDirectSpaceStateSW : public Physics2DDirectSpaceState { + + OBJ_TYPE( Physics2DDirectSpaceStateSW, Physics2DDirectSpaceState ); +public: + + Space2DSW *space; + + bool intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set& p_exclude=Set(),uint32_t p_user_mask=0); + int intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_user_mask=0); + bool cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion, MotionCastCollision &r_result, const Set& p_exclude=Set(),uint32_t p_user_mask=0); + + Physics2DDirectSpaceStateSW(); +}; + + + +class Space2DSW { + + + Physics2DDirectSpaceStateSW *direct_access; + RID self; + + BroadPhase2DSW *broadphase; + SelfList::List active_list; + SelfList::List inertia_update_list; + SelfList::List state_query_list; + SelfList::List monitor_query_list; + SelfList::List area_moved_list; + + static void* _broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_self); + static void _broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self); + + Set objects; + + Area2DSW *area; + + real_t contact_recycle_radius; + real_t contact_max_separation; + real_t contact_max_allowed_penetration; + real_t constraint_bias; + + enum { + + INTERSECTION_QUERY_MAX=2048 + }; + + CollisionObject2DSW *intersection_query_results[INTERSECTION_QUERY_MAX]; + int intersection_query_subindex_results[INTERSECTION_QUERY_MAX]; + + float body_linear_velocity_sleep_treshold; + float body_angular_velocity_sleep_treshold; + float body_time_to_sleep; + float body_angular_velocity_damp_ratio; + + bool locked; + +friend class Physics2DDirectSpaceStateSW; + +public: + + _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; } + _FORCE_INLINE_ RID get_self() const { return self; } + + void set_default_area(Area2DSW *p_area) { area=p_area; } + Area2DSW *get_default_area() const { return area; } + + const SelfList::List& get_active_body_list() const; + void body_add_to_active_list(SelfList* p_body); + void body_remove_from_active_list(SelfList* p_body); + void body_add_to_inertia_update_list(SelfList* p_body); + void body_remove_from_inertia_update_list(SelfList* p_body); + void area_add_to_moved_list(SelfList* p_area); + void area_remove_from_moved_list(SelfList* p_area); + const SelfList::List& get_moved_area_list() const; + + + + + void body_add_to_state_query_list(SelfList* p_body); + void body_remove_from_state_query_list(SelfList* p_body); + + void area_add_to_monitor_query_list(SelfList* p_area); + void area_remove_from_monitor_query_list(SelfList* p_area); + + BroadPhase2DSW *get_broadphase(); + + void add_object(CollisionObject2DSW *p_object); + void remove_object(CollisionObject2DSW *p_object); + const Set &get_objects() const; + + _FORCE_INLINE_ real_t get_contact_recycle_radius() const { return contact_recycle_radius; } + _FORCE_INLINE_ real_t get_contact_max_separation() const { return contact_max_separation; } + _FORCE_INLINE_ real_t get_contact_max_allowed_penetration() const { return contact_max_allowed_penetration; } + _FORCE_INLINE_ real_t get_constraint_bias() const { return constraint_bias; } + _FORCE_INLINE_ real_t get_body_linear_velocity_sleep_treshold() const { return body_linear_velocity_sleep_treshold; } + _FORCE_INLINE_ real_t get_body_angular_velocity_sleep_treshold() const { return body_angular_velocity_sleep_treshold; } + _FORCE_INLINE_ real_t get_body_time_to_sleep() const { return body_time_to_sleep; } + _FORCE_INLINE_ real_t get_body_angular_velocity_damp_ratio() const { return body_angular_velocity_damp_ratio; } + + + void update(); + void setup(); + void call_queries(); + + + bool is_locked() const; + void lock(); + void unlock(); + + void set_param(Physics2DServer::SpaceParameter p_param, real_t p_value); + real_t get_param(Physics2DServer::SpaceParameter p_param) const; + + Physics2DDirectSpaceStateSW *get_direct_state(); + + Space2DSW(); + ~Space2DSW(); +}; + + +#endif // SPACE_2D_SW_H diff --git a/servers/physics_2d/step_2d_sw.cpp b/servers/physics_2d/step_2d_sw.cpp index 9f41fc94ebf..29f4a58287f 100644 --- a/servers/physics_2d/step_2d_sw.cpp +++ b/servers/physics_2d/step_2d_sw.cpp @@ -49,7 +49,7 @@ void Step2DSW::_populate_island(Body2DSW* p_body,Body2DSW** p_island,Constraint2 if (i==E->get()) continue; Body2DSW *b = c->get_body_ptr()[i]; - if (b->get_island_step()==_step || b->get_mode()==Physics2DServer::BODY_MODE_STATIC) + if (b->get_island_step()==_step || b->get_mode()==Physics2DServer::BODY_MODE_STATIC || b->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC) continue; //no go _populate_island(c->get_body_ptr()[i],p_island,p_constraint_island); } @@ -87,8 +87,10 @@ void Step2DSW::_check_suspend(Body2DSW *p_island,float p_delta) { Body2DSW *b = p_island; while(b) { - if (b->get_mode()==Physics2DServer::BODY_MODE_STATIC) + if (b->get_mode()==Physics2DServer::BODY_MODE_STATIC || b->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC) { + b=b->get_island_next(); continue; //ignore for static + } if (!b->sleep_test(p_delta)) can_sleep=false; @@ -101,8 +103,10 @@ void Step2DSW::_check_suspend(Body2DSW *p_island,float p_delta) { b = p_island; while(b) { - if (b->get_mode()==Physics2DServer::BODY_MODE_STATIC) + if (b->get_mode()==Physics2DServer::BODY_MODE_STATIC || b->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC) { + b=b->get_island_next(); continue; //ignore for static + } bool active = b->is_active(); @@ -210,8 +214,9 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) { b = body_list->first(); while(b) { + const SelfList*n=b->next(); b->self()->integrate_velocities(p_delta); - b=b->next(); + b=n; // in case it shuts itself down } /* SLEEP / WAKE UP ISLANDS */ diff --git a/servers/physics_2d_server.cpp b/servers/physics_2d_server.cpp index cae9565c466..bf07b8ea8c4 100644 --- a/servers/physics_2d_server.cpp +++ b/servers/physics_2d_server.cpp @@ -122,7 +122,7 @@ Variant Physics2DDirectSpaceState::_intersect_ray(const Vector2& p_from, const V if (!res) return Variant(); - Dictionary d; + Dictionary d(true); d["position"]=inters.position; d["normal"]=inters.normal; d["collider_id"]=inters.collider_id; @@ -145,7 +145,7 @@ Variant Physics2DDirectSpaceState::_intersect_shape(const RID& p_shape, const Ma ShapeResult *res=(ShapeResult*)alloca(p_result_max*sizeof(ShapeResult)); - int rc = intersect_shape(p_shape,p_xform,res,p_result_max,exclude,p_user_mask); + int rc = intersect_shape(p_shape,p_xform,Vector2(),res,p_result_max,exclude,p_user_mask); if (rc==0) return Variant(); @@ -160,6 +160,34 @@ Variant Physics2DDirectSpaceState::_intersect_shape(const RID& p_shape, const Ma } +Variant Physics2DDirectSpaceState::_cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,const Vector& p_exclude,uint32_t p_user_mask) { + + + Set exclude; + for(int i=0;i& p_exclude=Vector(),uint32_t p_user_mask=0); Variant _intersect_shape(const RID& p_shape, const Matrix32& p_xform,int p_result_max=64,const Vector& p_exclude=Vector(),uint32_t p_user_mask=0); + Variant _cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,const Vector& p_exclude=Vector(),uint32_t p_user_mask=0); protected: @@ -118,7 +119,26 @@ public: }; - virtual int intersect_shape(const RID& p_shape, const Matrix32& p_xform,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_user_mask=0)=0; + virtual int intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_user_mask=0)=0; + + + + struct MotionCastCollision { + + float travel; //0 to 1, if 0 then it's blocked + Vector2 point; + Vector2 normal; + RID rid; + ObjectID collider_id; + Object *collider; + int shape; + + }; + + virtual bool cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion, MotionCastCollision &r_result, const Set& p_exclude=Set(),uint32_t p_user_mask=0)=0; + + + Physics2DDirectSpaceState(); }; @@ -179,6 +199,8 @@ public: virtual Variant shape_get_data(RID p_shape) const=0; virtual real_t shape_get_custom_solver_bias(RID p_shape) const=0; + //these work well, but should be used from the main thread only + virtual bool shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count)=0; /* SPACE API */ @@ -265,10 +287,10 @@ public: enum BodyMode { BODY_MODE_STATIC, - BODY_MODE_STATIC_ACTIVE, + BODY_MODE_KINEMATIC, BODY_MODE_RIGID, - //BODY_MODE_SOFT BODY_MODE_CHARACTER + //BODY_MODE_SOFT ?? }; virtual RID body_create(BodyMode p_mode=BODY_MODE_RIGID,bool p_init_sleeping=false)=0; @@ -277,7 +299,7 @@ public: virtual RID body_get_space(RID p_body) const=0; virtual void body_set_mode(RID p_body, BodyMode p_mode)=0; - virtual BodyMode body_get_mode(RID p_body, BodyMode p_mode) const=0; + virtual BodyMode body_get_mode(RID p_body) const=0; virtual void body_add_shape(RID p_body, RID p_shape, const Matrix32& p_transform=Matrix32())=0; virtual void body_set_shape(RID p_body, int p_shape_idx,RID p_shape)=0; @@ -296,8 +318,14 @@ public: virtual void body_attach_object_instance_ID(RID p_body,uint32_t p_ID)=0; virtual uint32_t body_get_object_instance_ID(RID p_body) const=0; - virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable)=0; - virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const=0; + enum CCDMode { + CCD_MODE_DISABLED, + CCD_MODE_CAST_RAY, + CCD_MODE_CAST_SHAPE, + }; + + virtual void body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode)=0; + virtual CCDMode body_get_continuous_collision_detection_mode(RID p_body) const=0; virtual void body_set_user_flags(RID p_body, uint32_t p_flags)=0; virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const=0; @@ -313,8 +341,6 @@ public: virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value)=0; virtual float body_get_param(RID p_body, BodyParameter p_param) const=0; - //advanced simulation - virtual void body_static_simulate_motion(RID p_body,const Matrix32& p_new_transform)=0; //state enum BodyState { @@ -355,6 +381,8 @@ public: virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant())=0; + virtual bool body_collide_shape(RID p_body, int p_body_shape,RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count)=0; + /* JOINT API */ enum JointType { @@ -417,6 +445,7 @@ VARIANT_ENUM_CAST( Physics2DServer::AreaSpaceOverrideMode ); VARIANT_ENUM_CAST( Physics2DServer::BodyMode ); VARIANT_ENUM_CAST( Physics2DServer::BodyParameter ); VARIANT_ENUM_CAST( Physics2DServer::BodyState ); +VARIANT_ENUM_CAST( Physics2DServer::CCDMode ); VARIANT_ENUM_CAST( Physics2DServer::JointParam ); VARIANT_ENUM_CAST( Physics2DServer::JointType ); VARIANT_ENUM_CAST( Physics2DServer::DampedStringParam ); diff --git a/servers/physics_server.cpp b/servers/physics_server.cpp index 69a2adae779..f1b4627b6c6 100644 --- a/servers/physics_server.cpp +++ b/servers/physics_server.cpp @@ -374,7 +374,7 @@ void PhysicsServer::_bind_methods() { BIND_CONSTANT( AREA_SPACE_OVERRIDE_REPLACE ); BIND_CONSTANT( BODY_MODE_STATIC ); - BIND_CONSTANT( BODY_MODE_STATIC_ACTIVE ); + BIND_CONSTANT( BODY_MODE_KINEMATIC ); BIND_CONSTANT( BODY_MODE_RIGID ); BIND_CONSTANT( BODY_MODE_CHARACTER ); diff --git a/servers/physics_server.h b/servers/physics_server.h index 1fe477adc3a..4276a4dab80 100644 --- a/servers/physics_server.h +++ b/servers/physics_server.h @@ -268,7 +268,7 @@ public: enum BodyMode { BODY_MODE_STATIC, - BODY_MODE_STATIC_ACTIVE, + BODY_MODE_KINEMATIC, BODY_MODE_RIGID, //BODY_MODE_SOFT BODY_MODE_CHARACTER diff --git a/tools/editor/doc_data_compressed.h b/tools/editor/doc_data_compressed.h index 92569fca9b1..ddeffe51be6 100644 --- a/tools/editor/doc_data_compressed.h +++ b/tools/editor/doc_data_compressed.h @@ -1,8 +1,8 @@ /* THIS FILE IS GENERATED DO NOT EDIT */ #ifndef _DOC_DATA_RAW_H #define _DOC_DATA_RAW_H -static const int _doc_data_compressed_size=101628; -static const int _doc_data_uncompressed_size=850903; +static const int _doc_data_compressed_size=101778; +static const int _doc_data_uncompressed_size=851183; static const unsigned char _doc_data_compressed[]={ 120, 156, @@ -28386,1267 +28386,1267 @@ static const unsigned char _doc_data_compressed[]={ 255, 159, 189, -247, +183, 111, 110, 220, 70, -214, +246, 133, 255, 222, -247, -83, -112, 231, -86, -157, -181, -247, -40, -78, -198, -147, -100, -119, -147, -186, -85, -87, -150, -100, -143, -54, -182, -228, -149, -228, -153, +83, +240, 204, -78, -77, -177, -40, -17, +173, +58, +199, +222, +163, +56, +25, +79, 146, -184, -67, -145, -10, +125, 73, -249, +221, +170, +43, +75, +178, 71, -62, -253, -139, -238, -6, -72, -144, -146, -44, -128, -20, +27, +91, +242, +74, +242, +36, +179, +83, +46, +22, 37, -79, -118, -206, -61, -55, -103, -108, -19, -64, -163, -209, -104, +66, +18, +119, +40, +82, +33, +41, +191, +228, +211, +63, +232, +110, +128, +4, +41, +201, +2, +72, +81, +242, +100, +231, +220, +115, +115, +198, +54, +1, 52, 26, -221, +141, +70, +163, +209, +253, +235, +67, +114, +18, +7, +28, +135, 79, -31, -146, -147, -56, -224, +89, +39, +252, +231, +11, +254, +115, +73, +94, +202, +254, 56, -124, -204, -58, -225, 63, -95, -240, +135, +226, 159, -75, -242, -82, -246, -199, -249, -57, -20, -255, -212, -97, -104, -218, -108, -239, -28, +58, +12, +77, +155, +237, 157, -242, -81, -14, -201, -80, -24, -79, -118, -112, +163, +83, +62, +202, +33, 25, -234, -158, -9, -235, -140, -132, +10, +227, +201, +14, +46, +67, +221, +51, +97, +157, +145, +208, +143, +117, +2, +255, +213, +96, +31, 126, -172, -19, -248, -175, -6, -251, -240, +188, +119, +214, +17, +42, 227, -189, -179, -142, +1, +121, +119, +0, +132, 80, +154, +23, +101, +60, +31, +118, +106, +52, +166, +177, +181, +176, +46, 25, -15, -200, -187, -3, -32, -132, -210, -188, -40, -227, +105, +26, 249, -176, -83, +137, +40, +123, 163, -49, -141, -173, -133, -117, -201, -72, -211, +33, +32, +105, +27, 200, -79, -68, +174, +244, +99, +11, +207, +134, +179, +110, +239, +67, +243, +186, +219, +182, +91, +253, +222, +112, +212, +236, +141, +246, +34, +57, +112, +180, +129, +70, +213, +62, 217, -27, -13, +242, +202, +91, +235, +105, +189, +250, 1, -73, -219, -64, +242, +188, +44, 118, +144, +249, +254, +254, +251, +183, +85, +152, +252, +68, +255, +173, +7, +255, +40, +85, +186, +186, +104, +67, +121, 165, -31, -91, -120, -54, -156, -117, -123, -239, -154, -215, -221, -182, -221, -234, -247, -134, +252, +159, +192, +35, +210, 163, -102, +122, +252, +81, +245, +236, +127, +2, 111, -180, -23, -201, -129, -163, -13, -52, -170, 246, -201, -150, -87, -222, -90, -79, -235, -213, +3, +113, +252, +199, +229, +142, +84, +181, +245, +196, +169, +127, +225, +236, +17, 15, -144, -167, -101, +77, +19, +137, +234, 177, -131, -204, -247, -247, -63, -191, -173, -194, +119, +47, +158, +233, +21, +47, +12, +253, +196, +91, +106, +92, +242, 228, -103, -250, -111, -61, +135, +230, +32, +95, +20, +198, +46, +58, +144, +32, +5, +232, +51, +112, +150, +75, +40, +120, +151, +129, +186, +19, +214, +0, +58, +42, +168, +180, +98, 248, -71, -169, -210, -213, -69, +80, +200, +98, +42, +117, +215, +147, +180, +155, +192, +203, +153, +33, +203, +37, 27, -202, -43, -229, -255, -6, -30, +226, +251, +50, +177, +18, +191, +57, +249, +174, +241, +221, +169, +113, +94, +197, 145, -30, -213, -227, -143, -170, -103, -255, -27, -120, -179, -31, -136, -227, -63, -46, -119, -164, -170, -173, -39, -78, -253, -11, -103, -143, -120, -104, -154, +24, +7, +210, +33, +38, +96, +83, +247, +70, +85, +182, +75, +191, +244, 72, -84, -143, -189, -123, -241, -76, -175, -120, -97, -232, -39, -222, -82, -227, -146, -39, -63, -52, +16, +51, +49, +37, +194, +190, +45, +38, +110, +65, +210, +61, +191, +75, 7, -249, -162, -48, -118, -209, -129, -4, -41, -64, -159, -129, -179, -92, -66, -193, -187, +171, +133, +213, +186, +27, 12, -212, -157, -176, -6, -208, -81, -65, -165, -21, -195, 251, -66, -22, -83, -169, -187, -158, -164, -221, -4, -94, -206, -12, -89, +3, +251, +207, +233, +131, +144, +132, +193, 46, -217, -16, -223, -151, -137, -149, -248, -205, -201, -119, -141, -239, -78, -141, +95, +47, +123, 243, -42, -142, +180, +247, +234, 196, -56, -144, -14, -49, -1, -155, -186, -55, -170, -178, -93, -250, -165, -71, -130, -152, -137, -41, -17, -246, -109, -49, -113, -11, -146, -238, -249, -93, -58, -88, -45, -172, +81, 214, +247, +21, +76, +120, +143, +19, +53, +9, +128, 221, -96, -216, -31, -216, -127, -77, -31, -132, -36, -12, -118, -249, +211, +6, +201, +49, +206, +73, +20, +8, +180, +52, +100, +193, +147, +69, +35, +74, +111, +5, 122, -217, -155, -167, -189, -87, -39, -142, -178, -190, -47, -96, -194, 123, -156, +9, +152, +55, +155, +143, +195, +213, +1, +146, +249, +148, +161, 168, -73, -0, -236, -158, -54, -72, -142, -113, -78, -162, -64, -160, -165, -33, 11, -158, -44, -26, -81, -122, -43, -208, -219, -75, -192, +200, +187, 188, -217, -124, -28, -174, -14, -144, -204, -167, -12, +5, +156, 69, -93, -64, -222, -229, 45, -224, -44, -106, -241, -231, -50, -4, -156, -109, -136, -20, +254, +92, +134, +128, +179, +13, +145, +194, +162, +27, +170, +130, 22, +62, +200, +183, +28, +122, +196, +166, +215, +55, +72, +209, +197, +55, +105, +124, +100, +134, +47, +70, +205, +11, +120, 221, -80, -21, +33, 180, +37, +15, 240, -94, -190, -229, -208, -35, -54, -189, -190, -65, -138, -46, +40, 190, -73, -227, -35, -51, -124, +253, +119, +248, +188, +116, +220, +236, +87, +226, +173, +26, 49, -106, -94, -192, -235, -14, -161, -45, -121, -128, -71, -241, -237, -127, +198, 194, +7, +2, +118, +161, +36, +187, 167, -165, -227, +36, +123, +63, +10, +40, +4, +46, +109, +117, 102, -191, -18, -111, -213, +189, +167, 136, -49, -22, -222, -19, -176, -11, -37, -217, -61, -38, -217, -251, -81, -64, -33, -112, -105, -171, -51, -235, -45, -69, -228, -53, -196, +188, +134, +248, +88, +146, 199, +91, +99, +169, +123, +64, +57, 146, -60, -222, -26, -75, -221, -3, -202, -145, +111, +178, 124, -147, -229, -83, -112, -149, -186, -186, 10, +174, 82, -71, -9, +87, +87, +65, +234, +40, +97, +209, +22, +214, +79, +79, +202, 139, -182, -176, -126, -122, -82, -94, -100, -250, -129, -114, -233, -196, -212, -191, +76, +63, +80, 46, -30, -109, -62, -21, -189, -69, +157, +152, +250, +215, +197, 163, -192, +205, +167, +162, +183, +104, +20, +88, +195, +175, +205, +139, +122, +116, +21, +168, 26, -126, -109, -94, -212, -163, -171, -64, +9, +209, +20, +6, +249, +199, +144, +19, +140, +229, +76, +194, 213, -72, +100, +14, +252, +20, +95, +197, +16, +217, +169, +182, +51, +246, +227, +122, +49, +77, +18, +202, +132, 136, -166, -48, -200, -63, -134, -156, -96, -44, -103, +105, +214, 18, -174, -38, -115, +25, 224, -167, -248, -42, -134, -200, -78, -181, -157, -177, -31, -215, -139, -105, -146, -80, -38, -68, -76, -179, -150, -200, -0, -111, -170, -42, -66, +77, +85, +69, +8, +203, +47, +135, +205, +207, +187, +174, +121, +162, 88, -126, -57, -108, -126, -222, +32, +244, +198, +238, 117, -205, -19, -197, +212, 2, -161, -55, -118, -175, -163, -22, -8, -200, -86, -253, -137, -105, -192, -44, -173, -237, -146, -207, -30, -223, -107, -26, -72, -156, -132, -75, +1, +217, +170, +63, +49, +13, +152, +165, +181, 93, +242, 217, -132, -111, -235, -46, -55, -3, -99, -44, -107, -19, -36, -211, -56, -144, -137, -239, +227, +123, 77, -62, -239, -8, -171, -48, -53, -75, -1, -185, -37, -93, -223, -221, -149, -143, -196, -93, -75, 3, +137, +147, +112, 169, -211, -132, -48, -61, -8, -76, -58, -119, -24, -4, -99, -111, -3, -192, -84, -241, -47, -11, -40, -97, -124, -127, -206, -16, -29, -117, -39, -242, +43, +155, +240, +109, +221, +229, +102, +96, +140, 101, -97, -88, -92, -122, -253, -97, -49, -218, -157, -246, -53, -52, -201, -129, -40, -81, -61, +109, +130, +100, 26, -195, +7, +50, 241, -5, -150, -135, -238, -216, -41, -98, -26, +189, +201, +231, +29, +97, 21, -33, -122, -22, -233, -99, +166, +102, +41, +32, +183, +164, 235, -148, -149, -88, +187, +187, 242, -66, -53, +145, +184, +107, +105, +32, +117, +154, +16, +166, +7, +129, +73, +231, +14, +131, +96, +236, +109, +0, +152, +42, +254, +101, +1, +37, +140, +239, +207, +25, +162, 163, -221, -115, -87, -35, -253, -195, -233, +238, +68, +190, +44, +12, +139, +75, +175, +63, +44, +70, +187, +211, +190, +134, 38, -154, +57, +16, +37, +170, +71, +99, +56, +190, +192, +242, +208, +29, +59, +69, 76, -201, -201, -222, -127, -77, -137, -65, +163, 34, -176, -101, +68, +47, +34, +125, +108, +157, +178, +18, +75, +94, +168, +102, +180, +123, +238, +106, +164, +127, +56, +221, +68, +147, +41, +57, 217, -177, -133, -208, -61, -122, -137, +251, +175, +41, +49, +72, +4, +182, +44, +59, +182, +16, +186, +39, +47, +209, +29, +115, +93, 238, -152, -235, -114, -7, -96, -113, -166, -227, -170, -216, -96, -26, -3, -23, 0, -188, -240, -246, -138, -177, -82, -46, -198, -110, -6, -162, -138, -164, -23, -96, -13, +44, +206, +116, +92, +21, +27, +76, +99, +224, +2, +128, 23, -4, +222, +94, +49, 86, -160, -111, -194, +202, 197, -2, -226, -203, -5, -220, -28, -98, -253, -72, -203, -72, +216, +205, 64, -203, -149, -219, -46, -6, -12, -163, -221, +84, +145, +244, +2, +172, +225, 130, -209, -205, -198, -123, -69, +192, +10, +244, +77, +184, +88, +64, +124, +185, +128, +155, +67, +172, 31, -165, -86, -205, -27, -79, -113, 105, -69, -140, -241, -175, +25, +9, +104, +185, +114, +219, 197, 128, -142, -92, -54, -154, -245, 97, -203, -159, -33, -63, -13, -201, +180, +91, +48, +186, +217, +120, +175, +232, +163, +212, +170, +121, +227, +41, +46, +173, +136, +49, +254, +181, +24, +208, 145, -67, -61, -51, +203, +70, +179, +62, 110, +249, +51, +228, 167, +33, +57, +114, +168, +23, +198, +237, +244, +218, +233, +168, +111, +183, +140, +250, +77, +62, 215, -78, -71, +109, 125, -189, -101, -212, +220, 111, -242, +114, +233, +111, +218, +99, +99, +70, +124, +58, +250, 185, -110, +28, +29, +2, +1, +62, +82, +61, +29, +129, +189, +121, +66, +184, +155, +167, +219, +0, +90, +113, +59, +125, +135, +34, +205, +87, 235, -227, +91, 126, -147, -75, -127, -211, -30, -27, +56, +54, +0, +165, 51, -226, -211, -209, +38, +248, 207, -229, -232, +111, +9, +250, +115, +13, +154, +119, +141, +172, +44, +188, +180, +184, 16, -8, -240, -129, -234, +74, +40, 233, -8, -236, -205, -19, -194, -221, -60, -221, -6, -208, -138, +255, +240, 219, -233, -59, -20, -105, -190, -90, -223, -242, -195, -177, -1, -40, -157, +231, +228, +183, +149, +23, +137, +240, +64, +221, +110, 49, -193, -127, -126, -75, -208, -159, -107, -208, +82, +181, +200, +106, +53, +68, +53, +215, +43, +21, 188, -107, -100, -101, -225, -165, -197, -133, -80, -66, -73, -255, -194, -111, -159, -147, -223, -86, +230, +166, +28, +158, +173, +164, +30, +116, +70, +105, 94, -36, -194, -3, -117, -187, -197, -72, -213, -34, -171, -213, -16, -213, -92, -175, -84, -240, -154, -155, -114, -120, -182, -146, -122, -208, +95, +23, 25, -165, -121, +186, 125, -93, -100, -232, -246, -49, -178, +140, +172, +123, +140, +243, +27, +63, +231, 238, -49, -206, -111, -252, -148, -187, -95, -124, -219, -206, -46, 23, -177, -188, -94, -103, -74, -68, -141, -230, -84, -0, -130, -158, -39, +223, +182, +179, +203, +69, +44, +175, +215, +153, +18, +81, +163, +57, +21, +128, +160, +151, +137, +204, +65, 50, -7, -201, -60, -232, -12, -187, -255, +15, +58, +195, 238, -100, -226, -247, +191, +58, +153, +248, 125, -145, -217, -202, -73, -97, -157, -200, -44, -128, -147, -83, -145, -167, -21, -167, -120, -47, +95, +100, +182, +114, +82, +88, +39, +50, +11, +224, +228, +84, +228, +105, +197, +41, +222, +11, +252, +250, +212, +112, 240, -235, -83, +155, +254, +221, +176, 195, +165, +127, +212, +25, +100, +4, +136, +85, +185, 193, -111, -250, +141, +159, +34, +89, +194, +127, +153, +171, +4, +125, +231, +114, +34, +202, +141, +251, +107, 119, -195, -14, -151, -254, +148, +13, +123, +190, +113, +216, +39, +168, +247, +186, +167, 81, +73, +56, +10, +179, +125, +151, 103, -144, -17, -32, -86, -229, -6, 55, -126, -138, -100, -9, -255, +89, +33, +186, +66, +189, +169, +251, +220, +164, +190, +207, +247, +142, +192, +164, 101, -174, -18, -244, -157, -203, -137, -40, -55, -238, -175, -221, -81, -54, +250, +30, +189, +239, +220, +116, 236, -249, -198, -97, +214, +251, +102, +239, +74, +149, +149, 31, -161, -222, -235, -158, -70, -37, -225, -40, -204, -246, +168, +123, +124, +103, 77, -158, -221, -100, -133, -232, +207, +80, +107, +192, +184, +225, +248, +136, +39, +74, 10, -245, -166, -238, -115, -147, -250, -62, +88, +106, +188, +64, +237, +230, +53, 223, -59, -2, -147, -150, -233, -123, -244, -182, -115, -211, -177, -91, -111, -155, -189, -43, -85, -86, -126, -160, -238, -241, -157, -53, -61, -67, 173, -1, -227, -134, -227, -3, -158, -40, -41, -96, -169, -241, -2, -181, -155, -215, -124, -183, -246, -135, -153, -22, -248, -254, -71, -185, -66, -106, -52, +253, +97, +166, +5, +190, +255, +81, +174, +144, +26, +205, 255, -131, -19, -139, -156, -128, -221, -67, -8, -143, -94, -115, -48, 232, +196, +34, +39, +96, +247, +16, +194, +163, +215, +28, +12, +250, 191, -47, -40, -23, -173, -134, -221, +20, +148, 139, -78, -243, -166, -160, -61, -180, -26, +86, +195, +238, +69, +167, +121, +83, +208, +30, +90, +13, +111, +251, +221, 222, -246, +168, +219, 187, -189, -81, -183, -119, -101, -115, -6, -182, -11, -170, -65, -171, -131, -214, +178, +57, +3, +219, +5, +213, 160, -63, -28, -166, -13, -223, -232, -55, -124, -223, +213, +65, +107, +208, +31, +14, +211, +134, +239, +244, +27, +254, +210, 84, 197, 65, @@ -29655,7 +29655,7 @@ static const unsigned char _doc_data_compressed[]={ 197, 221, 240, -67, +99, 6, 208, 174, @@ -29678,7 +29678,7 @@ static const unsigned char _doc_data_compressed[]={ 211, 182, 127, -211, +209, 111, 123, 217, @@ -29690,22 +29690,22 @@ static const unsigned char _doc_data_compressed[]={ 5, 81, 254, -239, +175, 250, 141, -223, -129, +63, +128, 250, 75, 27, 254, -67, +77, 191, 225, -219, +251, 92, 195, -215, +183, 6, 98, 116, @@ -29725,34 +29725,34 @@ static const unsigned char _doc_data_compressed[]={ 32, 221, 244, -223, -41, +63, +40, 13, 13, 4, 233, -221, +195, 240, 246, 90, 17, 165, -215, +183, 6, 178, 244, -182, +190, 208, 212, 64, 156, 222, -118, +119, 174, 51, 145, 120, -173, +171, 35, 79, 192, @@ -29780,9 +29780,9 @@ static const unsigned char _doc_data_compressed[]={ 234, 21, 33, -184, -103, -143, +120, +96, +79, 123, 171, 177, @@ -29796,8 +29796,8 @@ static const unsigned char _doc_data_compressed[]={ 214, 47, 53, -112, -159, +240, +144, 21, 125, 172, @@ -29850,7 +29850,7 @@ static const unsigned char _doc_data_compressed[]={ 106, 38, 99, -207, +47, 245, 84, 78, @@ -30074,13 +30074,13 @@ static const unsigned char _doc_data_compressed[]={ 63, 140, 227, -39, +103, 73, 138, 141, 148, 36, -79, +207, 187, 249, 147, @@ -30224,18 +30224,18 @@ static const unsigned char _doc_data_compressed[]={ 239, 174, 71, -207, +47, 185, 201, 180, 108, 194, 232, -190, +161, 112, 19, 124, -9, +13, 54, 161, 184, @@ -30278,7 +30278,7 @@ static const unsigned char _doc_data_compressed[]={ 171, 231, 62, -150, +149, 55, 163, 14, @@ -30358,14 +30358,14 @@ static const unsigned char _doc_data_compressed[]={ 213, 216, 245, -238, -115, +30, +114, 254, 141, 236, 192, 124, -173, +171, 137, 53, 88, @@ -30416,7 +30416,7 @@ static const unsigned char _doc_data_compressed[]={ 131, 139, 210, -155, +187, 175, 23, 165, @@ -30424,15 +30424,15 @@ static const unsigned char _doc_data_compressed[]={ 95, 148, 222, -84, +85, 188, 40, 189, -89, +91, 187, 208, 188, -225, +227, 23, 26, 11, @@ -30443,7 +30443,7 @@ static const unsigned char _doc_data_compressed[]={ 169, 122, 223, -111, +239, 54, 166, 171, @@ -30451,8 +30451,8 @@ static const unsigned char _doc_data_compressed[]={ 79, 149, 111, -94, -255, +222, +254, 177, 46, 95, @@ -30462,8 +30462,8 @@ static const unsigned char _doc_data_compressed[]={ 56, 151, 175, -55, -47, +119, +175, 201, 160, 204, @@ -30494,7 +30494,7 @@ static const unsigned char _doc_data_compressed[]={ 83, 27, 228, -133, +149, 110, 148, 35, @@ -30506,7 +30506,7 @@ static const unsigned char _doc_data_compressed[]={ 99, 75, 236, -69, +85, 45, 203, 31, @@ -30538,7 +30538,7 @@ static const unsigned char _doc_data_compressed[]={ 109, 156, 209, -189, +131, 14, 158, 189, @@ -30617,7 +30617,7 @@ static const unsigned char _doc_data_compressed[]={ 41, 243, 255, -4, +0, 134, 230, 159, @@ -30661,7 +30661,7 @@ static const unsigned char _doc_data_compressed[]={ 34, 154, 252, -7, +27, 131, 67, 17, @@ -30670,7 +30670,7 @@ static const unsigned char _doc_data_compressed[]={ 212, 28, 121, -128, +132, 167, 222, 36, @@ -30706,7 +30706,7 @@ static const unsigned char _doc_data_compressed[]={ 104, 225, 60, -98, +97, 82, 47, 245, @@ -30741,7 +30741,7 @@ static const unsigned char _doc_data_compressed[]={ 68, 162, 122, -102, +97, 30, 24, 126, @@ -30754,7 +30754,7 @@ static const unsigned char _doc_data_compressed[]={ 204, 77, 244, -36, +44, 36, 46, 145, @@ -30783,7 +30783,7 @@ static const unsigned char _doc_data_compressed[]={ 214, 182, 148, -47, +175, 150, 5, 20, @@ -30850,7 +30850,7 @@ static const unsigned char _doc_data_compressed[]={ 99, 142, 158, -212, +213, 67, 251, 98, @@ -31019,7 +31019,7 @@ static const unsigned char _doc_data_compressed[]={ 158, 231, 245, -252, +242, 82, 64, 113, @@ -31060,7 +31060,7 @@ static const unsigned char _doc_data_compressed[]={ 195, 70, 125, -14, +9, 124, 100, 27, @@ -31089,7 +31089,7 @@ static const unsigned char _doc_data_compressed[]={ 196, 204, 254, -79, +119, 28, 6, 70, @@ -31126,7 +31126,7 @@ static const unsigned char _doc_data_compressed[]={ 207, 146, 240, -25, +5, 102, 110, 7, @@ -31184,231 +31184,231 @@ static const unsigned char _doc_data_compressed[]={ 7, 235, 244, -17, +9, 127, -247, -201, -10, -66, -172, -187, -8, -181, -151, -23, -80, -50, -198, -199, -79, -229, -244, -1, -60, -37, -192, -106, -44, -41, -178, -161, -117, -66, -120, +119, +111, +5, 33, -51, -58, -131, -127, -183, -248, -37, -44, -181, +214, +93, +132, +218, +203, +11, +40, +25, +227, +227, +167, +114, 250, -160, -183, -211, -51, -171, -139, -131, -97, -9, +0, +158, +18, +96, +53, +150, +20, +217, +208, 58, -236, -47, -38, -116, -67, -126, +33, +188, +144, +25, +157, +193, +191, +91, +252, +18, +150, +90, +125, +208, +219, +233, +153, +213, 197, -14, -17, -165, -8, -171, -44, -38, -79, -226, -246, -204, -79, -95, -63, +193, +176, 4, -102, -185, -214, -148, -31, -143, -14, -63, -136, -41, -3, +29, +246, +23, 19, -229, -106, -194, -2, -70, -168, -137, -46, -243, -57, +186, +33, +191, +98, +135, +136, +82, +132, +85, +22, +147, 103, +113, +123, +230, +167, +175, +31, 2, -162, -16, -81, -30, -67, -250, +179, +92, +107, +202, +143, +71, +135, +31, +196, +148, 129, -174, -6, -15, +137, +114, +53, 97, -228, -187, -75, -103, -34, -122, -243, -178, -202, -209, -107, +1, +35, +212, +68, +151, +249, 156, -224, -87, +51, +1, +81, +136, +40, +143, +33, 253, -32, -134, -92, -62, -235, -36, -140, -188, -153, -23, -156, -166, -248, +64, +87, +131, +199, +48, +242, +221, +165, +51, +17, +189, +121, +89, +229, +232, +53, +78, +240, +171, 126, -8, -226, -2, -160, -49, +16, +67, +46, +159, +117, +18, +70, +222, +204, +11, +78, +83, +124, +63, +4, +113, +1, 208, -112, -236, -196, -84, 24, -20, -167, -226, -134, -150, +104, +56, +118, +98, +42, +12, +138, +83, +113, +67, 203, -18, -6, -25, -128, -76, -240, -41, -195, -123, -52, -189, -218, -199, -115, -199, -165, -50, -160, -47, -37, -59, -70, -37, -232, -168, +101, 9, -92, -68, -8, +131, +12, +64, +38, +248, +148, +225, +61, +154, +94, +237, +227, +185, +227, +82, +25, +208, 215, -167, -206, -66, -35, -48, -129, -62, -43, -235, -233, -207, -157, -203, -181, -57, +146, +29, 163, -243, +18, +116, +212, +4, +46, +34, +132, +235, 83, -170, -233, -193, -85, -143, -19, -123, +103, +161, +17, +152, +64, +159, +149, +245, +244, +231, +206, +229, +218, +156, 209, -143, -235, -153, -27, -111, -155, -237, -254, -123, +249, +41, +213, +244, +224, +170, +199, +137, +189, +232, +199, +245, +204, +141, +247, +205, +118, +255, +23, 187, 63, 24, 189, -237, +239, 95, 245, 123, @@ -31469,70168 +31469,70318 @@ static const unsigned char _doc_data_compressed[]={ 33, 74, 236, +95, +58, +230, +217, +58, +107, +93, +253, +171, +127, +121, +57, +236, +140, +236, +97, +171, +121, +221, +121, +105, +114, +218, +103, +87, +8, 247, -29, -243, -108, +56, +53, +42, +74, +220, +119, +142, +21, +22, +21, +46, +217, +158, +76, +167, +165, +147, +121, +227, +106, +50, 157, -181, -174, -254, -221, -191, -188, -28, +192, 118, -70, +180, +185, 246, -176, -213, -188, -238, -60, -55, -57, -237, -179, -43, -132, -123, -156, -26, -21, -37, -238, -59, +183, 199, -10, -139, -10, -151, 108, -79, -166, -211, -210, -201, -188, -113, -53, -153, -78, -96, -59, -218, -92, -251, -219, -99, -54, -243, -182, -144, -93, -7, +230, +109, +33, +187, +14, +156, +80, +174, +76, +0, +120, +184, 78, -40, -87, +171, +168, +120, +163, +165, +58, +184, +182, +23, +195, +124, +143, +136, +145, +154, +178, +156, +5, +238, +214, +27, +182, +169, +179, 38, -0, -60, +226, +54, +140, +12, +195, +59, 92, -167, -85, +206, +56, +14, +107, +186, +134, +199, +122, +176, +39, 84, -188, -209, -82, -29, -92, -219, -139, -97, -190, -71, -196, -72, -77, -89, +48, +90, +252, +125, +236, 206, +36, +196, +174, +106, +221, +158, 2, +170, +31, +5, 119, -235, -13, -219, -212, -89, -19, -113, -27, -70, -134, +43, 225, -29, -46, -103, -28, -135, -53, -93, -195, -99, -61, -216, -19, -42, -24, -45, -254, -62, -118, -103, -18, -98, -87, 181, -110, -79, -1, -213, -143, -130, -187, -149, +108, +151, +5, +188, +59, +239, +141, +87, 240, -90, -182, -203, -2, -222, -157, -247, -198, -43, -248, -111, -205, -172, -146, -4, -219, -252, -76, -88, -69, -241, -86, -193, -124, -129, -164, -79, -61, -31, -161, -72, -227, -100, -95, -110, +223, 154, -3, -16, -141, -246, -32, -92, -83, -108, -0, -217, -60, -148, -214, -153, -132, -203, -45, -110, -65, -211, -117, -133, -155, -89, -181, -178, -66, -97, -205, -28, -230, -187, -222, 89, -236, -73, +37, +9, +182, +249, +153, +176, 138, -191, -132, -217, -66, -112, -215, -158, -102, -203, -55, -212, -190, -201, -173, 226, -100, -233, -184, -94, -2, -197, -225, -215, -129, -212, -184, -137, -231, -65, -92, -207, -129, -76, -213, -189, -76, -98, +173, +130, +249, +10, +73, +159, +122, +62, +66, +145, +198, 201, -169, -207, -205, -162, -48, -189, -227, -152, -221, -248, -228, +190, +220, +52, +7, +32, +26, 237, +65, 184, -222, -74, -227, -117, -83, -126, -87, -243, -117, -89, -14, -243, -2, -80, -39, -52, -215, -55, -140, -186, -11, +166, +216, 0, -211, -189, -245, -87, -120, -29, -120, -65, -215, -170, -201, -42, -78, -194, -5, -63, -38, -129, -190, -60, -79, -239, -189, +178, +121, 40, -89, -193, -46, -218, -192, -213, -129, -243, -96, -158, +173, +51, +9, +151, +91, +220, +130, +166, +235, +10, +55, +179, +106, +101, 133, +194, +154, +57, +204, 119, -128, -139, -23, -222, -128, -156, -98, -65, -234, -231, -102, -82, -139, -153, -135, -149, -203, 189, +179, 216, -227, -187, -247, -37, -144, -227, -45, -204, -86, -183, +147, +20, +127, +9, +179, +133, +224, 174, -27, -245, -214, -99, -80, 61, -71, -101, -254, -21, -109, -153, -27, +205, 150, -56, -109, -168, -95, -178, 111, -73, -33, -158, -112, -211, -214, -241, +168, +125, +147, +91, +197, +201, +210, +113, +189, +4, +138, 195, -217, -179, -172, +175, +3, 169, -124, -250, -31, -86, -213, -172, -43, +113, +19, +207, +131, +184, +158, +3, 153, -30, +170, +123, +153, +196, +146, +83, +159, +155, +69, +97, +122, +199, +49, +187, +241, +201, +219, +113, +189, +149, +198, +235, +166, +252, +174, +230, +235, +178, +28, +230, +21, +160, +78, +104, +174, +111, +24, +117, +23, +0, +166, +123, +235, +175, +240, 58, -109, -143, -163, -95, +240, +138, +174, +85, +147, +85, 156, -229, -210, -127, -18, -133, -27, -226, -103, -217, -92, -197, -124, -165, -103, -245, -122, -58, -103, -156, -171, -229, -228, -35, -164, -82, -57, -66, -66, -106, -42, -156, -51, -13, -163, -7, -39, -114, -109, -181, -100, 132, -246, -70, -55, -190, -1, -137, -254, -169, -117, -23, -134, -236, -40, -69, -42, -246, -63, +11, +126, +76, +2, +125, +121, +158, +62, +120, +81, +178, +130, +93, +180, +129, 171, -152, -44, -185, 3, +231, +209, +60, +11, +239, +0, +23, +47, +188, +1, +57, +197, +130, +212, +47, 205, -110, -194, -255, -27, -165, -165, -146, -90, -244, -147, -153, -38, -59, -20, -131, -48, -244, +164, +22, +51, +15, +43, 151, -219, -54, -159, -55, -5, -35, +123, +177, +199, +119, 239, -62, -96, +107, +32, +199, +91, +152, +173, +110, +93, +55, 234, -138, -70, -126, -1, -135, -29, -197, -180, 173, -229, -143, +199, +160, +122, +142, +202, +252, +43, +218, +50, +55, +44, +113, +218, +80, +191, +100, +223, +146, +66, 60, -71, +225, +166, +173, +227, 135, -18, -186, -180, -95, -90, -184, +179, +23, +89, +83, +249, +244, +63, +172, +170, +89, +87, +50, +61, +116, 218, -115, -253, -29, -122, -175, -154, -200, 30, -68, -199, -204, -157, -216, -94, +71, +191, 56, -94, -96, -243, -239, -25, -11, -170, -79, -167, -170, -67, +203, +165, +255, +44, +10, +55, +196, +47, +178, +185, +138, +249, 74, -216, -86, -229, -212, +207, +234, +245, +116, +206, +56, +87, +203, +201, +71, +72, +165, 114, +132, +132, +212, +84, +56, +103, +26, +70, +143, +78, +228, 218, -120, -157, -198, -189, -230, -190, +106, +201, +8, +237, +141, +110, +124, +3, +18, +253, +83, +235, +46, +12, +217, +81, +138, +84, 236, -22, -194, -103, -226, -68, -177, -233, -54, -233, -220, -171, -22, +127, +86, +49, 89, -5, -110, -104, -71, -204, -13, +114, +7, +154, +221, +132, +255, 55, -59, -9, -242, -34, +74, +75, +37, 181, -199, +232, +39, +51, +77, +118, +40, +6, +97, +232, +47, +183, +109, +62, +111, +10, +70, +222, +125, +192, 212, -114, -113, -243, -152, -200, -170, -98, -58, -229, -199, -48, -156, -175, +21, +141, 252, -115, -238, -36, -95, -193, -172, -166, -221, -162, -76, +10, 14, -198, -209, -40, -9, -253, +59, +138, +105, +91, +203, +31, +121, +137, +14, +37, +116, +105, +191, 180, -86, -73, -219, -108, +112, +181, +231, +250, +59, +244, 94, -99, -12, -158, -51, -239, -32, -205, +53, 145, -167, +61, +136, +142, 153, -165, -93, -208, -79, -90, -93, -164, -169, -240, -222, -36, -11, -72, -26, +59, 177, -71, -46, -38, -251, -79, -193, -17, -153, -138, -181, -48, -183, -158, -151, -239, -86, -191, -55, -106, -118, +189, +112, +188, +192, +230, +223, +51, +22, +84, +159, +78, +85, +135, +148, +176, +173, +202, +169, +229, +180, +241, +58, +141, 123, -157, -129, -61, -234, -247, -175, +205, +125, +217, +45, +132, 47, -154, -3, -163, -39, -227, -172, -245, -240, -182, -57, -234, -54, -175, -237, -78, -187, -59, -130, -42, -15, -157, -222, -157, -89, -157, -146, -109, -61, -1, -168, -162, -89, -193, -146, +196, +137, +98, +211, 109, -61, -21, +210, +185, +87, +45, +178, +10, +220, 208, -35, -181, -74, -79, -164, -125, -181, -154, -189, -119, -205, -225, -198, -233, -105, -21, -162, -216, -210, -81, +142, +152, +27, 110, 118, -27, -208, -34, -181, -47, -85, -67, -136, -51, -186, -13, -227, -164, -43, -174, -210, -47, -200, -133, -179, +18, 228, -100, -217, -26, -87, -252, -237, -167, -13, -76, -110, -223, -74, -177, -210, 69, -22, -66, -136, -91, -82, -89, -103, -172, -78, -127, -117, -60, -95, -232, -194, -11, -114, -113, +106, +143, +169, +229, +226, +230, +49, 145, -219, -131, -178, -228, -135, -57, -192, -155, -90, -78, -240, +85, +197, 116, -168, 202, -0, -98, -7, -91, -224, -128, -203, -102, -24, -44, -240, -174, -244, -114, -160, -119, -40, -99, -121, -242, -121, -22, -133, -171, -64, -163, -196, -196, -120, -118, -136, -208, -59, -149, -162, -99, -70, -222, -101, -116, +143, +97, +56, +95, +249, +231, +220, +73, +190, +130, +89, +77, +187, +69, +153, 28, -35, +140, +163, +81, +18, 250, -78, -59, -42, -190, -52, -119, -119, -6, -224, -29, -48, +121, +173, +146, 182, -110, -3, -251, -89, -0, -143, -65, -246, -244, -113, -55, -223, 217, -116, -170, -92, -10, -205, -25, -79, -67, -185, -181, -222, -144, 188, -152, -79, -197, -78, -71, -170, -22, -55, -84, -149, -19, -85, +198, +24, 60, -85, -143, -54, -226, +103, +222, +65, 154, -252, -49, -118, -4, -159, -205, -44, -155, -205, +35, +79, +51, 75, -216, -9, -250, -182, +187, +160, +159, +180, +186, +72, +83, +225, +189, +73, +22, +144, +52, +98, +79, +92, +76, 246, -197, -149, -253, -75, -167, -115, +159, +130, +35, +50, +21, 107, -100, 97, -243, -54, +110, +61, +47, +223, +173, +126, +111, +212, +236, +246, +58, +3, +123, +212, +239, +95, +95, +52, +7, +70, +79, +198, +89, +235, +225, +109, +115, +212, +109, +94, +219, +157, +118, +119, +4, +85, +30, +58, +189, +59, +179, +58, +37, +219, +122, 2, -113, +80, +69, +179, +130, +37, 219, -110, -245, -175, +122, +42, +160, +71, +106, +149, +158, +72, 251, -3, -35, -163, +106, +53, +123, +31, 154, -55, -206, -55, -210, +195, +141, +211, +211, +42, +68, 177, -159, -121, +165, 163, -81, -231, -215, -209, -221, +220, +236, +54, 160, -99, -100, -42, -195, -88, -119, -23, -157, -155, -230, -173, +69, +106, +95, +170, +134, +16, +103, +116, +27, +198, +73, +87, +92, +165, +95, 145, -97, -156, -141, -102, -15, +11, +103, +201, +201, +178, +53, 174, -46, -158, -181, -133, -159, -25, -50, -223, -86, -167, -74, +248, +219, +79, 27, -111, -123, -211, -252, -213, -168, -216, -31, -111, -66, -1, -173, -121, -158, -106, -174, -34, -53, -45, -114, -86, -115, -21, -197, -184, -5, +152, +220, +190, +149, +98, +165, +139, +44, +132, +16, +183, +164, +178, +206, +88, +157, 254, -106, -174, -38, -53, -238, -240, -203, -199, -213, +234, +120, +190, +208, +133, +23, +228, +226, +34, +183, 7, -211, -37, -77, -67, -138, -205, -32, -237, -127, +101, +201, +15, +115, +128, +55, 181, -175, -174, -13, -43, -92, -242, -54, -237, -254, -165, -125, -113, -125, -103, -38, -227, -188, -221, -219, +156, +224, +233, +80, +149, +1, +196, +14, 182, -153, -132, -243, -38, +192, +1, 151, -253, -43, -35, -86, -240, -38, -23, -173, -161, -25, -92, -62, -103, -66, +205, +48, +88, +224, +93, +233, +245, +64, +239, +80, +198, +242, +228, 243, -230, -166, -105, -202, -57, -149, -217, -58, -146, -204, -155, -208, +44, +10, +87, +129, +70, +137, +137, +241, +236, +16, +161, +119, 42, -1, +69, +199, +140, +188, 203, -145, -127, -252, -231, -225, -176, -51, -52, -101, -127, -174, -151, -126, -223, -172, -206, 232, -134, -246, +56, +70, +244, +157, +118, +84, +124, +105, +238, +238, +12, +192, +59, +96, +108, +221, +6, 246, -104, -208, -25, +179, +0, +30, +131, +236, +233, +211, +110, 190, -237, -95, -155, -213, -27, -77, -59, -146, -210, -80, -156, -141, -230, +179, +233, +84, +185, +20, +154, +51, +158, +134, 114, -21, -58, -201, -23, -214, -214, -92, -191, -66, -31, -3, -40, -62, 107, -186, -156, -212, -7, -23, -81, +189, +33, +121, +49, +159, +138, +157, +142, +84, +45, +110, 168, -210, -216, -31, +42, +39, +170, +120, 170, -155, -223, -104, -117, -161, -7, -8, 158, -87, -60, -52, -58, -74, -43, -215, -30, +108, +196, +53, +249, +99, +236, +8, +62, +155, +89, +54, +155, 215, -102, +176, +19, +244, 109, -85, -116, -106, -149, -174, -119, -147, -15, -228, -215, -41, -91, -154, -235, -227, -6, -234, -151, -223, -241, -255, -230, -210, -20, -180, -138, -152, -230, +237, +139, +43, 251, -105, -254, -186, -169, -31, -35, -145, -85, -23, -199, -110, +231, +78, +231, +214, +200, +194, +230, +109, +4, +226, 182, -255, -121, +221, +234, +95, +247, +7, +70, +70, +53, +111, +156, +111, +164, +99, +63, +243, +70, +163, +206, +175, +163, +187, +65, +199, +200, +84, +134, +177, +238, +46, +58, 55, -28, -217, +205, +91, +35, 195, -219, -142, -82, -103, -88, +56, +27, +205, +30, +92, +93, +188, +104, +11, +191, +48, +100, +190, +173, +78, +149, +54, +222, +246, +166, +249, 171, -192, -105, -218, -31, -87, -46, -5, -121, -211, -170, -115, -154, -107, -223, -28, -141, -58, -189, -59, -172, +81, +177, +63, +222, +132, +2, +90, +243, +60, +213, +92, 69, -108, -86, -126, -116, -157, +106, +90, +228, +172, +230, +42, 138, -162, -225, -96, -36, -252, -208, -75, -167, -215, -46, -246, -97, -36, +113, +11, 252, -72, -73, +213, +92, +77, +106, +220, +225, +151, +143, +171, +143, 166, -111, +75, +154, +134, +20, +155, +65, +218, +255, +106, 95, +93, 27, -201, -45, -87, +86, +184, +228, +109, +218, +253, +75, +251, +226, +250, +206, +76, +198, +121, 187, -246, -5, -214, -139, -233, -169, -5, -106, -94, -27, -73, -45, -116, -2, +247, +109, +51, +9, +231, +77, +46, +251, +87, +70, +172, +224, +77, 46, +90, +67, +51, 184, -65, +124, +206, +132, +230, +205, +77, +211, +148, 115, -168, +42, +179, +117, 36, -178, -24, -9, -45, -116, -49, -108, -242, +153, +55, +161, +85, +2, +150, +35, +255, +248, +207, 195, -59, -191, -38, -231, -102, +97, +103, +104, 202, -53, -119, -32, -156, -27, -73, -169, -122, -46, -156, -151, -75, -156, -193, -151, -222, -91, +254, +92, +47, +253, +190, +89, +157, +209, +13, +237, +237, +209, +160, +51, +124, 223, -121, -130, +191, +54, +171, 55, -138, -151, -17, -126, -65, -239, -80, -17, -211, +154, +118, +36, +165, +161, +56, +27, +205, +229, +42, +116, +146, +47, +172, +173, 185, -155, -200, -239, -82, -95, +126, +133, +62, +6, +80, +124, +214, +116, 57, -252, -180, -239, -11, -198, -76, -33, -72, -239, -206, -151, -39, -100, -79, -254, -140, -37, -95, +169, +15, +46, +162, +80, 165, -125, -100, -137, -196, -73, -184, -220, -71, +177, 63, -252, -54, -12, -36, -25, -32, -131, +84, +55, +191, +209, +234, +66, +15, +16, +60, +175, +120, +104, +116, +148, +86, +174, +61, +174, +205, +218, +170, +232, 212, -240, -180, -74, +42, +93, +239, +38, +31, +200, +175, +83, +182, +52, +215, +199, +13, +212, +47, +191, +227, +255, +205, +165, +41, +104, +21, +49, +205, 247, +211, +252, +117, +83, +63, +70, +34, +171, +46, +142, +221, +108, +255, +227, +110, +56, +178, +135, +183, +29, +165, +206, +176, +86, +129, +211, +180, +63, +174, +92, +10, +242, +166, +85, +231, +52, +215, +190, +57, +26, +117, +122, +119, 88, +139, +216, +172, +252, +232, +58, +21, +69, +195, +193, 72, -102, -213, -185, -200, -210, -119, -245, -122, -8, -228, -40, -71, -101, -137, -31, -42, -107, -188, -221, +248, +161, +151, +78, +175, +93, +236, +195, +72, +248, +145, +146, +76, +223, +190, +53, +146, +91, +174, +118, +237, +11, +172, +23, 211, -112, -0, -159, -9, +83, +11, +212, 188, -195, -19, 53, -71, -101, -200, -125, +146, +90, 232, -175, -22, -26, -46, +4, +92, 112, -249, -93, +131, +230, +80, +73, +100, +49, +18, +90, +232, +98, +216, +228, +135, +119, +126, +77, +206, 205, -241, -192, +148, +107, +238, +64, +56, +55, +146, +82, +245, +92, +56, +47, +151, +56, +131, +47, +189, +183, +190, +243, +12, +111, +20, +175, +35, +252, +130, +222, +161, +34, +166, +115, +55, +145, +223, +165, +190, 114, -152, -163, -33, -39, -226, +248, +105, +223, +23, +140, +153, +66, +144, +222, +157, +47, +79, +200, +158, +252, +25, +75, 190, -241, -146, -201, -220, +74, +251, +200, +18, +137, +147, +112, +185, +143, +126, +248, +109, +24, +72, +50, +64, +6, +169, +225, +105, +149, +238, +177, +144, +204, +170, +115, +145, +165, +239, +234, +245, +16, +200, +81, 142, +202, +18, +63, +84, +214, +120, +187, +167, +225, +0, +62, +19, +120, +135, 39, +106, 142, -175, -193, -152, +202, +144, +135, +208, +95, +45, +52, +92, +224, +242, +187, +154, +227, +129, +229, +48, +71, +67, +78, +196, +125, +227, +37, +147, +185, +29, +79, +28, +95, +131, +49, +185, +143, +107, +230, +78, +110, +172, +163, +178, +40, +97, +139, +101, +168, +203, +162, 220, 199, 53, -115, -39, +179, +40, 55, 214, 81, 89, -148, -176, -197, -50, +68, +162, +108, +187, +99, +13, +96, +171, +241, +129, +54, +22, +82, +115, +84, +128, +84, +178, +23, +54, +196, +150, +189, +104, +52, 212, -101, -81, -238, -227, -154, +19, 89, -148, -27, +6, +234, +247, +216, +133, +25, +8, +120, +250, +160, +25, +16, +107, +178, +202, +62, 235, +21, +33, +72, +188, +154, +79, +0, +216, +54, +206, +138, +155, +97, +170, +69, +119, +244, +83, +58, +163, +232, 168, -44, -34, -81, -182, -221, +39, +53, +196, +93, +7, +204, +215, +62, 177, -6, -176, -213, -248, -64, -27, -11, -169, -57, -42, -64, -42, -217, -11, -27, +43, +193, 98, -203, -158, -53, -26, -234, -137, -44, -3, -245, -123, -236, -194, -12, -4, -60, -125, -208, -12, -136, -53, +23, +7, +171, +89, +59, +229, +135, +67, +202, +107, +130, +206, +112, +148, +98, +67, +117, +61, +242, +30, +29, +254, 89, 101, -159, -245, -138, +41, +191, +211, +38, +118, 16, -36, -94, -205, -39, -0, -108, -27, -103, +38, +204, +166, +237, +251, +165, +240, +181, +82, +72, +2, +92, +222, 197, -205, -48, -213, -162, -59, -250, -41, -157, -81, -116, -212, -147, -26, -226, -174, -3, -230, +93, +243, +152, +33, +9, +123, +154, +67, 107, -159, -216, -149, +238, +141, +189, +92, +54, +161, +58, +191, +47, 96, -177, -139, -131, -213, +46, +151, +152, +108, +250, +138, +194, 172, -157, -242, -195, -33, -229, -53, -65, -103, -56, -74, -177, -161, -186, -30, -121, -143, 14, -255, -172, +15, +64, 178, -148, -223, -105, -19, -59, -8, -19, -102, -211, -246, -253, -82, -248, -90, -41, -36, -1, -46, -239, -226, -174, -121, -204, -144, -132, 61, -205, -161, -53, -247, -198, -94, -46, -155, -80, +93, +202, +119, +102, +113, 157, -223, -23, -48, -151, -75, -76, -54, -125, -65, -97, -86, +26, +105, +226, 135, -7, -32, -217, -158, -46, -229, +10, +28, +99, +181, 59, -179, -184, -78, -141, -52, +60, 241, -67, -5, -142, -177, -218, -29, +237, +136, +199, +32, +251, +108, +84, +192, +170, 158, 248, -118, -196, -99, -144, -125, -54, -42, -96, -85, -79, -252, -6, -183, -151, -152, -78, -72, -209, -214, -122, -82, -251, +13, +110, 47, -82, -104, -104, -70, -214, -99, -199, -250, -250, -194, -177, -127, -2, -88, -56, -181, -185, -66, -156, -204, -143, -234, -99, -2, -54, -252, -253, -184, -171, -240, -250, +49, +157, +144, +162, +173, +245, +164, +246, +95, +164, +208, +208, +140, +172, 199, -227, 142, +245, +245, +133, +99, 255, -230, -252, -184, -227, -255, -248, -253, -113, -199, -159, -250, -161, -83, -185, -214, -86, -69, -26, -220, -112, -181, -150, -82, -115, -112, -34, +4, 176, -219, -35, -151, -99, -89, -77, -167, -76, -27, -201, -170, -84, -34, -60, -42, -189, -154, -239, -19, -94, 112, -124, -103, -9, -191, -8, -39, -8, -71, -118, -100, -58, +106, +115, +133, +56, +153, +31, +213, +199, +4, +108, 248, -201, 235, -57, -129, +113, +87, +225, +237, +143, +199, 29, -63, -56, -75, -51, -36, -160, -202, -33, -155, -235, -227, -238, -112, -77, -212, -234, -153, -64, -94, -68, -81, -168, -45, +255, 221, -245, -104, -187, +249, +113, +199, +255, +241, 251, -98, -178, -118, +227, 142, -128, -170, -119, -216, -248, -190, -132, -240, -215, -145, -15, -27, -39, -252, -118, -2, -39, -187, -17, -170, -121, +63, +245, +67, +167, +114, +173, +173, +138, +52, +184, +225, +106, 45, +165, 230, +224, +68, +96, +183, +71, +46, +199, +178, +154, +78, +153, +54, +146, +85, +169, +68, +120, +84, +122, +53, +223, 39, -82, -2, -135, -252, -11, -33, -5, +188, +224, +248, 206, -251, -23, -66, -10, -28, -253, -47, -132, -20, -97, -5, -24, -81, -83, -143, -79, -21, -201, -145, -6, -193, -75, -161, -135, -108, -131, -151, -66, -141, -52, -19, -118, -230, -136, +18, +126, +17, +78, +16, +142, +236, +200, +116, +240, +147, +215, +115, +2, +59, +126, +116, +150, +102, +72, +64, +149, +67, +54, +215, +199, +221, +225, +154, +168, +213, +51, +129, +188, 136, +162, +80, +91, +186, +235, +209, +118, +15, +197, +100, +237, +28, +1, +85, 239, +176, +241, +67, +9, +225, +175, +35, +31, 54, -155, -11, -123, -38, -138, -20, -223, -46, -146, -232, -171, +78, +248, +237, +4, +78, +118, +35, +84, +243, 90, -113, -120, -136, +204, +79, +164, +4, +14, +249, +87, +66, +10, 156, -152, -58, +247, +175, +132, +20, +56, +250, +95, +9, +41, +194, +10, +48, +162, +166, +30, +159, +42, +146, +35, +13, +130, 215, -137, -60, -81, -106, -180, -212, -74, -210, -189, -163, -177, -102, -245, -135, +66, +15, 217, -171, -208, -132, -53, -165, -62, -212, -129, -182, -164, -31, -140, -63, -232, -52, -219, -70, +6, +175, +133, +26, +105, +38, +236, +204, +17, 17, +223, +109, +54, +23, +246, +76, +20, +41, +190, +93, +36, +209, +87, +181, +226, +240, +16, +57, +49, +117, 174, -239, +19, +121, +162, +212, +104, +169, +149, +164, 7, -221, -145, -89, -38, -42, -12, -97, -231, -155, -109, -136, +71, +99, +205, +234, +15, +179, +87, +161, +9, +107, +74, +125, +168, 3, -212, +109, +73, +63, +24, +127, +208, +105, +182, +141, +34, +92, +127, +25, 116, -53, +71, +102, +153, +168, +48, +132, +157, +111, 182, -5, +33, 14, 80, -46, -217, -112, -234, -69, -11, -132, -138, -151, -127, +211, 213, -198, -236, -135, -207, -177, -86, -92, -204, -124, -128, -128, -15, -248, -79, -30, -20, -136, -227, -191, -114, -5, -190, -50, -212, -150, -17, -117, -37, -240, -111, -79, -113, -194, +216, 22, -186, -0, +56, +64, +185, +100, +195, +169, +23, +45, +16, +42, +94, 254, -25, -205, -4, -220, -143, -213, -52, -0, +85, +27, +179, +31, +62, +199, +90, 113, -30, -127, -133, -128, -244, -73, -104, -77, -230, -97, -24, -139, -238, -45, -39, -112, -119, -140, -13, -200, -252, -241, -106, -9, -153, -164, 49, -252, +243, +1, +2, 62, -97, -145, -181, -112, -226, -207, -177, +224, +63, 121, -145, -27, -155, -154, +80, +32, +142, +255, +202, +21, +248, +202, +80, +91, +70, +212, +149, +192, +191, +61, 199, +9, 91, -157, -136, -84, -236, -6, -106, -218, -0, -17, -142, -235, +232, 2, -190, +248, +103, +52, +19, +112, 63, -181, -201, -170, -109, -192, -100, -76, -43, -67, -64, -250, -61, -117, -180, -123, -163, -203, -239, -204, -119, -73, +86, 211, -117, -57, -215, -41, -19, -93, -208, -125, -102, -93, -18, -203, -160, -116, -128, -3, -53, -14, -126, -178, -94, -1, -251, -172, -159, -45, -165, -249, -171, -134, -197, -30, -157, -197, +0, +196, +121, +252, +21, +2, 210, -103, -214, -73, -235, -127, -255, -247, -244, 39, +161, +53, +153, +135, +97, +44, +186, +183, +156, +192, +221, 49, -207, -111, -94, -249, -201, -207, -25, -241, -39, -175, -254, -122, -182, -228, -98, +54, +32, 243, -179, -117, -219, -187, -178, -186, -11, -7, -240, -147, -78, -127, -46, -99, -17, +199, 171, -72, -183, -251, -190, -137, -93, -137, -50, -89, -98, -16, -40, -179, +37, +100, +146, +198, 240, -25, -164, -93, -10, -218, -147, -172, -178, -0, -98, -86, -114, +251, +132, 69, -213, -73, -16, -6, -101, -221, -179, -160, -93, -75, -18, -201, -54, -204, -192, -58, -193, -42, -71, -80, -117, -39, -8, -3, -102, -92, -189, -68, -157, -17, -233, -233, -131, -205, -8, -134, -179, -78, -178, -229, -1, -173, -0, -51, -59, -173, -97, -154, -241, -22, -156, -229, -237, -65, -45, -181, -67, +214, +194, +137, 63, 199, -107, -178, -164, -161, -35, +230, +69, +110, +108, 106, -183, -150, -214, -196, -97, -119, -248, -101, -237, -80, -138, -152, -237, 30, -214, -86, -127, -68, -214, -215, -83, -197, -13, -58, -202, -106, -187, -220, -244, -219, -29, -251, -175, -22, -11, -86, -139, -50, -251, -171, -134, -82, -37, -87, +111, 117, -211, -124, -63, -14, -31, -55, -123, +34, +82, +177, +27, 168, -222, -93, -132, -143, -173, -20, -1, -71, -131, -86, -211, -16, -154, -201, +105, +3, 68, -171, -130, -165, -252, +56, 174, -94, -239, -165, -28, -229, -88, -94, -42, -47, -224, -6, -165, -231, -34, -8, -83, -9, -183, -84, -206, -76, -142, -189, -89, -224, +11, 248, -100, -39, -209, -191, -21, -197, -18, -219, -82, -49, -191, -210, -216, -241, -241, -171, -237, -78, -43, -99, 254, -19, -45, -235, -100, +212, +38, +171, +182, 1, -216, -187, +147, +49, +173, +12, +1, +233, +247, +212, +209, +238, +141, 46, -81, -251, -211, +191, +51, +223, +37, +77, 215, -219, -168, -193, -155, -146, -9, -143, -202, -208, -131, -177, -17, -88, -225, -10, -78, -72, -44, -10, -11, -155, +229, +92, +167, +76, +116, +65, +247, 153, -91, -209, +117, +73, +44, +131, 210, -128, -7, -19, -27, -119, +1, +14, +212, +56, +248, +187, +245, +6, +216, +103, 253, -9, -121, -69, -172, -137, -239, -77, +100, +41, +205, +223, +52, +44, +246, +228, +44, +150, 62, -115, -75, -21, -75, -77, -129, -241, -29, -51, -42, -200, -213, +179, +78, +90, 255, -197, -26, -175, -146, -36, -12, -182, -158, -150, -233, -84, -229, -63, -119, -223, -166, -80, -173, -244, -111, -59, -61, 251, -178, -171, -164, -133, -137, -55, -97, -130, -168, -161, -178, -183, -65, -8, -5, +191, 167, -253, -240, -1, -204, 127, -162, -221, -90, -5, -120, -213, -76, -47, -33, -103, -59, -175, -86, -249, -241, -134, -70, 23, -185, -172, -109, -187, -107, -150, -56, -138, -45, -135, -205, -119, -157, +243, 252, -44, -223, -172, -207, +230, +141, +159, +252, +148, +17, +127, 242, -193, -225, +230, +207, +103, +75, +46, +54, +63, +89, +183, +189, +43, +171, +187, +112, +0, +63, +233, +244, +167, +50, +22, +177, +138, +116, +187, +239, 155, -31, -215, -73, -44, +216, +149, +40, +147, +37, +6, +129, +50, 11, -221, +159, +65, +218, 165, -119, -79, +160, +61, +203, +42, +11, +32, +102, +37, +87, +84, +157, +4, +97, +80, +214, +61, +11, +218, +181, +36, +145, +108, +195, +12, 172, -217, -106, -117, -134, -67, -123, -208, +19, +172, +114, +4, +85, +119, +130, +48, +96, +198, +213, +75, +212, 25, -246, -239, -6, -45, -195, -36, -78, -209, -248, -110, -216, -25, -180, -155, -163, -166, -17, -87, -68, -91, -100, -231, -135, -225, -168, -115, -243, -28, -103, -180, -238, -172, -143, -204, -189, -225, -10, -42, -66, -160, -243, -236, -218, -154, -253, -78, -243, -178, -58, -244, -240, -46, -34, -219, -81, -45, -54, +145, +158, +62, +216, +140, 96, +56, 235, -35, -90, -139, -17, -31, -46, -193, -125, -144, -232, -223, -77, -21, -218, -232, -122, -26, -211, -32, -176, -53, -193, -206, -92, -200, -63, -126, -148, -241, -85, -159, -26, -197, -42, -173, -146, -4, -103, -1, -209, -182, +36, +91, +30, 208, 10, -137, -129, -11, -162, -44, -33, -7, -251, -141, -170, -177, -21, -251, -21, -183, -88, -44, -59, -73, -253, -124, +48, 179, +211, +26, +166, +25, +111, +193, +89, +222, +30, +212, +82, +59, 244, -150, -12, -60, -95, -252, -46, +115, +188, +38, +75, +26, +58, +162, 118, -239, +107, +105, 77, -196, +28, +118, +135, +95, +214, +14, +165, +136, +217, +238, +97, +109, +245, +71, +100, 125, -184, -121, -219, +61, +85, +220, +160, +163, +172, +182, +203, 77, -123, -227, -27, -49, -228, 191, -228, -253, -36, +221, +177, +255, +108, +177, +96, +181, 40, -88, -99, -150, -192, -196, -29, -184, -141, -5, -84, -206, -142, -239, -169, -143, -195, -185, -227, -178, -72, -78, -239, -19, -222, -242, -23, -97, -156, -200, -57, +179, +191, +106, +40, +85, 114, -173, -193, -89, -31, -51, +85, +55, +205, +15, +227, +240, +105, 179, -75, -115, -138, -33, -193, +135, +234, +195, +69, +248, +212, +74, +17, +112, +52, +104, +53, +13, +161, +153, +76, 180, -46, -174, -71, -193, -145, -0, -147, -205, -201, -68, -162, -145, -253, -147, -138, -228, -186, -108, +42, +88, 202, -249, -235, +239, +234, +245, +94, 202, -235, -59, +81, +142, 229, -213, -9, -99, -8, -107, -240, -201, -101, +165, +242, +2, +110, +80, +122, +46, 130, -144, -11, -69, -180, -22, -206, -147, -69, -8, -193, -13, -139, -47, -129, -151, -188, -114, -150, -97, -252, -115, -204, -87, -128, -179, -21, -221, -24, -12, -11, -119, -179, -210, -134, +48, 149, -194, -218, -67, -129, -90, -12, -200, -68, -249, -2, -25, -70, -201, -26, -4, -225, -87, -183, -36, -166, -227, -148, -64, -14, -36, -121, -20, -61, 112, -134, -209, -63, -98, -193, -26, -149, -217, 75, -206, -52, -254, -29, -243, -113, -211, -3, -235, -23, -206, -114, -73, -62, -50, -224, -18, -85, -143, -116, -217, -18, -94, -108, -161, +229, +204, +228, +216, +155, +5, +142, +79, 118, -54, +18, +253, +91, +81, +44, +177, 45, -8, -111, +21, +243, +27, +141, +29, +31, +191, +217, +238, +180, 50, -9, -195, -200, -37, -35, -255, -36, -102, -204, -250, -40, -56, -37, -120, -132, -127, -198, -171, -198, -167, -82, +230, +63, +209, +178, 78, +22, 128, -116, -250, -122, -150, -110, -129, +189, +235, +18, +181, +63, +125, +189, +141, +26, +188, +41, +153, +240, +168, +12, 61, -154, -126, +24, +27, +129, +21, +174, 224, -74, -210, -251, -197, -178, -119, -173, -139, -218, -101, +132, +196, +162, +176, +176, +153, 185, -210, -61, -88, -240, -217, -66, -122, -61, -126, -222, -16, -219, -206, -172, -14, -236, -125, -249, -87, -164, -208, -58, -73, -239, -155, -170, -202, -56, -197, -146, -207, -97, -192, -240, -64, -35, -221, -18, -91, -115, -48, -5, -179, -254, -227, +21, +45, 13, -203, -67, +120, +48, +177, +113, +215, +159, +144, +87, +196, +154, +248, +222, +228, +51, +183, +84, +177, +212, +20, 24, +223, +49, +163, +130, +92, +253, +159, +173, +241, +42, +73, 194, -37, -197, -87, -229, -111, -165, +96, 235, +105, +153, +78, +85, +254, +115, +247, +109, +10, +213, +74, +255, +182, +211, +179, +47, +187, +74, 90, -61, -2, -252, -69, -178, -22, -68, -23, -141, -22, +152, +120, +19, +38, +136, +26, +42, +123, 27, -34, -125, -53, -92, -84, -248, -213, -94, -140, -129, +132, +80, +112, 218, -226, -78, -212, -249, -212, +15, +31, +193, +252, +39, +218, +173, +85, +128, +87, +205, 244, -226, -165, -197, -134, -138, -126, -146, -213, -189, -157, -150, -7, -214, -200, -126, -202, -62, -21, -10, -60, -253, -133, -174, +18, 114, -64, -235, -121, -201, -38, -96, -213, +182, +243, +106, +149, +31, +111, +104, +116, +145, +203, +218, +182, +187, 102, -133, 137, -229, -3, -15, -96, -127, -126, -147, -253, +163, +216, +114, +216, +252, +208, +201, +207, +242, +221, 250, -238, -157, -34, -228, -105, -217, -101, -78, -243, -35, -137, -53, -203, -244, -237, -79, -214, -168, -243, -107, -171, -223, +44, 31, -180, -237, -187, -119, -246, -104, +29, +190, +249, +113, +157, +196, +178, 208, -236, -13, -47, -251, -131, -155, -18, -43, -155, +93, +122, +247, +196, +154, +173, +86, 103, -137, -230, +56, +180, +7, +157, +97, +255, +110, +208, +50, +76, +226, +20, +141, +239, +134, +157, 65, -86, -228, -195, -115, +187, +57, +106, +26, +113, +69, +180, +69, +118, +126, +28, 142, +58, +55, +47, +113, +70, +235, +206, +250, +196, +220, 27, -218, -202, -100, -238, -191, -92, -86, +174, 160, -5, +34, +4, +58, +207, +174, +173, +217, +239, +52, +47, +171, +67, 15, -96, -252, +239, +34, +178, +29, +213, +98, +3, 182, -30, -64, -168, -138, -14, -90, -95, -246, -175, -66, -208, -81, -51, -91, -93, -198, -111, -117, -190, -61, -246, -185, -9, -240, -130, -202, -90, -111, -32, -235, -96, 62, -71, -253, -199, -116, -1, -148, -212, -189, -188, -188, -27, +161, +181, +24, +241, +225, +18, +220, +7, +137, +254, +221, +84, +161, +141, 174, -121, -127, -218, -222, -116, -10, -119, -78, -172, -93, -14, -214, -213, -9, -21, -31, -143, -249, -253, -159, +167, +49, +13, +2, 91, -103, -240, +19, +236, +204, +133, +252, +227, +39, +25, +95, +117, +223, +40, +86, +105, +149, +36, +56, +11, 136, -5, -2, -31, +182, +133, +86, +72, +12, +92, +16, +101, +9, +57, +216, +111, +84, +141, +173, +216, 175, -162, -169, -51, -161, -55, -156, -231, -93, -21, +184, +197, 98, -180, -206, -168, 217, -189, -46, -248, -56, -254, -212, -70, -126, -89, -215, -128, -113, -130, -55, -95, -87, -140, -238, -139, -209, -117, -187, -135, -82, -206, +73, +234, +231, +155, +165, +183, +100, +224, +249, +226, 119, -42, +177, +7, +111, +34, +238, +195, +205, +219, +110, 218, -146, -192, -163, -29, -242, -253, -189, -242, -157, -104, -109, -58, -17, -155, -202, -55, -185, -180, -248, -187, -225, -148, -58, -55, -221, -225, -80, -69, -151, -145, -158, -165, -133, -23, -199, +27, +223, +136, +33, +255, +37, +239, +39, +65, +193, +26, +179, +4, +38, +238, +192, +109, +44, +160, +114, +118, 124, +79, 125, -214, -198, -148, +26, +206, +29, +151, +69, +114, +122, +247, +120, +203, +95, +132, +113, +34, +231, +200, +181, +6, +103, +125, +204, +204, +46, +205, +41, +134, +4, +211, +186, +184, 30, +5, +71, +2, +76, +54, +39, +19, +137, +70, +246, +79, +42, +146, +235, +178, +41, +231, +175, +43, +175, +239, +148, +87, +39, +140, +33, +172, 193, -181, -17, -13, 39, +151, 9, -240, -71, -5, -112, -172, -108, -162, -157, -199, -37, +66, +46, +20, +209, +90, +56, +207, +22, +33, +4, 55, 44, -120, -203, -19, -216, -166, -82, -81, -197, +190, +4, +94, 242, -207, -110, -152, -232, -14, -151, -3, -133, -35, -8, -161, -63, -93, -129, -43, -240, -228, -29, -149, -60, -72, -39, -148, -201, -6, -78, -84, -155, -131, -61, -174, -22, -149, -234, +198, +89, +134, +241, +79, +49, +95, +1, +206, +86, +116, +99, +48, +44, +220, +205, +74, +27, +86, +10, +107, +15, +5, +106, +49, +32, +19, +229, +11, +100, +24, +37, +107, +16, +132, +95, 221, -4, +146, 152, +142, +83, +2, +57, +144, +228, +81, 244, -167, -30, -188, -119, -251, -214, -141, -179, -180, -78, -188, -40, -98, -51, -32, -220, -75, -158, 192, -22, -210, -238, -26, -106, -90, -119, -8, -139, -199, -8, -129, +25, +70, +255, +136, +5, 107, -29, -189, -135, -160, -139, -254, -116, -227, -60, -122, -139, -213, -162, -232, -63, -194, -27, -203, -206, -94, +84, +102, +47, +57, 211, -3, -97, -120, -251, -182, -99, -8, -213, -168, -28, -38, -197, -189, -58, -96, -142, -187, -193, -28, -141, -51, -9, -227, +248, +119, +204, 199, -150, -3, -110, -253, -221, -108, -219, -120, -102, -21, -247, -171, -254, +77, +15, +172, +95, +56, +203, +37, +249, +200, 128, +75, +84, +61, +210, +101, +75, 120, -117, -203, -142, -79, -254, -167, +177, 133, -53, -126, -162, -3, -147, -255, -194, -136, -158, -243, -226, -174, -214, -33, -227, -92, -119, -226, -151, -215, -205, -43, -112, -194, 218, -205, -235, -219, -183, -77, +217, +180, +32, +188, +201, +36, +12, 35, -15, -110, -218, -20, -241, -182, -236, -230, -96, -208, +151, +140, 252, -96, -228, -198, -77, -59, -184, -237, -119, -123, -35, -123, -216, -253, -119, -213, -106, +147, +152, +49, 235, -151, +147, +224, +148, +224, +17, 254, -42, -202, -151, +25, +175, +26, +247, +165, +156, +0, +233, +244, +245, +44, +221, +2, +123, +52, +253, +192, +149, +164, +247, +139, +101, +239, 90, 23, -8, -236, -71, -74, -115, +181, +203, +114, +165, +123, +176, +224, +179, +133, 244, +122, +252, +188, +33, +182, +157, +89, +29, +216, +251, +242, +175, +72, +161, +117, +146, +222, +55, +85, +149, +113, +138, +37, +159, 195, -153, -172, -179, -180, -235, 128, -134, -255, -86, -202, -99, -196, -13, -153, -62, -106, -213, -88, -231, -4, -38, -5, -169, -204, -238, -31, -111, -106, +225, +129, +70, +186, +37, +182, +230, 96, -184, -212, -50, -181, -189, -152, -50, -58, +10, +102, +253, +199, 27, -32, +150, +135, +48, 132, -231, -42, -81, -108, 75, -141, -191, -19, -191, -57, -30, -112, -90, -24, -141, -61, -13, -134, 138, -207, -234, -199, -249, -23, -3, -29, -20, -229, -127, -27, -91, -108, -13, -24, -242, -199, -90, 175, -55, -25, -41, +202, +223, +74, +215, +181, +122, +4, +248, +139, +100, +45, +136, +46, 26, +45, +54, +68, +250, +106, 184, -31, -79, -181, -147, -178, +168, 240, -130, -151, -194, -153, -89, +171, +189, +24, +3, +181, +197, +157, +168, +243, +169, +233, +197, +75, +139, +13, +21, +253, +36, +171, +7, +59, +45, +15, +172, 145, +253, +148, +125, +42, +20, +120, +250, +11, +93, +229, +128, +214, +243, +146, +77, +192, +170, +205, +10, +19, +203, +7, +30, +192, +254, +252, +38, +251, +245, +221, +7, +69, +200, +211, +178, +203, 156, +230, +39, +18, +107, +150, +233, +219, +191, +91, 163, -222, -252, -22, 206, -227, -139, -98, -140, -74, -206, -81, -25, -51, -103, -96, -123, +175, +173, +126, +127, +208, +182, 239, -230, -137, -252, -174, -102, -198, -200, -97, -142, -202, -19, -47, -152, -248, -96, -26, -66, -156, +62, +216, +163, +65, +179, +55, +188, 236, +15, 110, -180, -26, -245, -227, +74, +172, +108, +158, +37, 154, -185, -147, -27, -235, +7, +89, +145, +15, +47, +57, +110, 104, -44, -138, -66, -40, -12, -167, -123, -48, -169, -248, -42, -117, -157, -75, -232, -219, +43, +147, +185, +255, +122, +89, +129, +22, +60, +128, 241, -224, -132, -159, +219, +122, +0, +161, +42, +58, 104, -184, -116, -178, -47, -107, -94, -174, -108, -160, -163, -235, -62, 125, -238, -228, +217, 191, -62, -128, -30, -124, -41, -92, -226, -103, -149, -1, -151, -114, -95, -31, -224, -24, -125, -33, -92, -226, -250, -231, -101, -100, -17, -3, -190, -25, -17, -115, -84, +10, +65, +71, +205, 108, -51, -128, -88, +117, +25, +191, +213, +249, +246, +216, +231, +38, +192, +43, +42, +107, +189, +129, +172, 131, -206, -94, -12, -79, -50, -130, -94, -4, -95, -236, -36, -244, 249, +28, +245, +31, +211, 5, -74, -79, -47, -179, -89, -196, -88, -92, -251, -118, -218, -68, -219, -81, -55, -85, -74, 80, -188, -100, -58, -176, -199, -226, -179, -67, -177, -73, -12, -119, -84, -22, -197, -139, -48, -76, +82, +247, +242, +242, +110, +184, 230, -90, -121, -156, -7, -218, -104, -10, -69, -71, -221, +253, 105, -104, -141, -241, -47, -77, +123, +211, +41, +220, +57, +177, +118, +57, 88, -68, +87, +39, +84, +124, +60, +230, +247, +127, +110, +157, +193, +35, +22, +8, +124, +188, +138, +166, +206, +132, 222, -232, -218, -37, -104, -19, -105, -199, -5, -255, -5, -207, -178, -255, -82, -217, -181, -133, -186, -163, -114, -108, -21, -51, -64, -155, -253, -236, 112, -242, +94, +118, +85, +136, +209, +58, +163, +102, +247, +186, +224, +227, 248, -100, -153, -134, -193, -191, -138, -53, -54, +83, +27, +249, +101, +93, +3, +198, +9, +222, +124, +93, +49, +186, +47, +70, +215, +237, +30, +74, +57, 223, -86, -151, -37, -13, -150, -191, -48, -188, -81, -16, +169, +104, +75, +2, +143, +118, 200, -196, -111, -78, -190, -107, -88, -240, -191, -167, -245, -196, -87, -44, -237, -123, -28, -71, -35, -75, -91, -124, -151, -167, -183, -14, -241, -80, -136, -50, -113, -190, -189, -169, +247, +247, +202, +119, +162, +181, +233, +68, +108, 42, -21, -213, +223, +228, +210, +226, +239, +134, +83, +234, 220, -170, +116, +135, +67, 21, -107, -107, -118, -3, -17, -247, +93, +70, +122, +150, +22, +94, 28, -6, -124, -202, -191, -195, -51, -40, -239, -146, -158, -137, -216, -99, -98, -185, -145, 243, -0, -111, -165, -34, -212, -90, -59, -56, -28, -58, -201, -130, -188, -3, -107, +245, +89, +27, +83, +122, +4, +215, +70, +52, +156, +36, +192, +31, 21, -120, -19, -136, -255, +192, +177, +178, +137, +118, +158, +150, +220, +176, +224, +45, +79, +96, 155, +74, +69, +21, +203, +63, +187, +97, +162, +59, +92, +14, +20, +142, +32, 132, -139, -37, -31, -13, +254, +116, +5, +174, +192, 147, -43, -230, -78, -228, -76, -68, -212, -121, -195, -114, -98, -235, -129, -249, -62, -252, -95, -204, -21, -30, -123, -62, -188, -46, +15, +84, +242, +32, +157, +80, 38, -33, +27, +56, +81, +109, +14, +246, +184, +90, +84, +170, +119, +19, +96, 210, -0, -57, -24, -24, -179, -126, -239, -68, -30, -156, -63, -252, -39, -55, -153, -67, -179, -9, -23, -128, -6, -230, -222, -50, -65, -249, -103, -62, -37, -120, -165, -182, -46, -195, -200, -154, +159, +122, 240, -157, -75, -89, -17, -156, -28, -241, -22, -53, -26, -93, -138, -116, -233, -19, -254, -5, -87, -4, -248, +222, +237, +91, +55, 206, +210, +58, +241, +162, +136, 205, +128, +112, +47, +121, +6, 91, -83, -82, -111, -124, -218, -176, -32, -78, -17, -67, +72, +187, 107, -41, +168, +105, +221, 33, -65, -204, -31, -95, -195, -177, -163, -51, -107, -212, +44, +30, +35, +4, +174, +117, +244, +30, +130, +46, +250, +211, +141, +243, +228, +45, +86, +139, +162, +255, +8, 111, -247, -69, -12, -238, -131, -247, -217, -91, -242, -47, -29, -252, -251, 44, +59, +123, +77, +15, +132, +225, +237, +251, +142, +33, +84, +163, 114, -150, +152, +20, +247, +234, +128, +57, +238, +6, 115, -120, -138, +52, +206, 36, -218, -190, -133, -194, -221, -16, -147, -254, -173, -160, -241, +140, +31, 91, -114, -194, -124, -203, -146, -137, -113, -244, +14, 184, -174, +245, +119, +179, +109, +227, +153, +85, +220, +175, +250, +3, +226, +213, +45, 59, -105, -89, -194, -199, -150, -6, -41, -242, -99, -197, -39, -126, -208, -112, +62, +249, +159, +22, 214, +248, +153, +14, +76, +254, +11, +35, +122, +206, +139, +187, +90, +135, +140, +115, +221, +137, +95, +94, +55, +175, +192, 9, -205, +107, +55, +175, +111, +223, +55, +141, +60, +184, +105, +83, 196, -90, +219, +178, +155, +131, +65, +243, +163, +145, +27, +55, +237, +224, +182, +223, +237, +141, +236, +97, +247, +95, +85, +171, +173, +95, 250, 171, -88, -114, +40, +95, +106, +93, +32, +176, +31, +41, +205, +209, +15, +103, +178, +206, +210, +174, +3, +26, +254, +91, +41, +143, +17, +55, +100, 250, +168, +85, +99, +157, +19, +152, 20, -2, -154, -151, -222, -35, -243, -227, +164, 50, -65, -133, -245, -56, -162, -212, -120, -192, -186, -103, +187, +127, +188, +169, 129, -150, -37, -118, +225, 82, -239, -114, -208, -134, -36, -210, -79, -130, -213, +203, +212, +246, 98, -204, -133, -21, +202, +232, +108, +128, +16, +158, +171, +68, +177, +45, +53, +254, +78, +252, +230, +120, +192, +105, +97, +52, +246, +52, +24, +42, +62, +171, +31, +231, +95, +12, +116, +80, +148, +255, +109, +108, +177, +53, +96, +200, +159, +106, +189, 222, -185, -145, +100, +164, 104, -190, -79, +224, +126, +60, +215, +78, +202, 194, -123, -146, -84, -41, +11, +94, +11, +103, 102, -165, -66, -148, -229, -68, -106, -91, +69, +114, 142, -131, -204, -66, -44, -106, -221, -211, -144, -186, -102, -125, -30, -99, -230, -139, -112, -209, -210, +122, 243, -0, -112, -0, -161, -192, -236, -165, -163, -147, +91, +56, 79, -13, +175, 138, -212, -118, +49, 42, -65, -122, +57, 71, -246, -216, -184, -253, -185, -108, -47, -168, -53, -142, +101, +204, +156, +129, +237, +189, +155, +39, +242, +187, +154, +25, +35, +135, +57, +42, +79, +188, +96, 226, -34, -116, -5, +131, +105, +8, +113, +178, +187, 209, -218, -130, -185, -202, -128, -218, +106, +212, 143, -112, -126, -124, -130, +107, +230, +78, +110, +172, 163, -192, +177, +40, +10, +161, +48, +156, +238, 193, -216, -35, -194, -4, -62, -179, +164, +226, +171, +212, +117, +46, +161, +111, +199, +131, +19, 126, -81, +162, +225, +210, +201, 190, -165, -64, -92, -25, -41, -136, +172, +121, 185, -56, -144, -44, -198, -127, -231, -32, -33, -16, -194, -99, -57, -238, -61, -220, -63, -33, -241, -199, -133, -152, -144, -5, -102, -98, -140, -159, -112, -148, -0, -14, -184, +178, +129, +142, +174, +251, 244, -20, -42, -35, -111, -249, -117, -170, -39, -48, -218, -209, -193, -207, -222, -186, -182, -252, -15, -175, -203, -167, -5, -228, -214, -230, -69, -175, +185, +147, +255, +250, +0, +122, +240, +181, +112, +137, +159, +85, 6, -236, -26, -237, -108, -150, -42, -233, -40, -36, -180, -50, +92, 202, -37, -39, -175, -101, -104, -134, -9, -235, -237, -112, -100, -203, -222, -82, +125, +125, +128, +99, +244, +149, 112, +137, +235, +159, +215, +145, +69, +12, +248, +102, +68, 204, -119, -121, -164, -148, -88, -30, -240, -127, -111, -121, -101, -40, -182, -127, -147, -74, -162, -239, +81, +177, 205, -130, -226, -67, -69, -241, -222, +0, +98, +13, +58, +123, +53, +60, +201, +8, +122, +21, +124, +177, +147, +208, +231, +23, +40, +61, +189, +204, +102, +17, +99, 113, -206, -239, -29, +237, 219, -238, -28, +105, +19, +109, +71, +221, +84, +41, +65, +241, +146, +233, +192, +30, +139, +207, +14, 197, -158, -191, -79, -123, 38, -177, -202, -157, -176, +49, +220, +81, 89, -199, -223, -188, -54, +20, +47, 194, -122, -73, -141, -82, -177, -180, -160, -240, -27, -66, -148, -213, +48, +153, +107, +229, +113, +30, +104, +163, +41, +20, +29, 117, -16, -137, -137, -210, -174, -197, -232, +167, +161, +53, +198, +191, +52, +97, +17, +121, +163, +107, +151, 160, -134, -149, -177, -89, +77, +164, +29, +23, 252, -93, -10, -10, -210, +23, +60, +203, +254, +107, +101, +215, +22, +234, +142, +202, +177, +85, 204, +0, +109, +246, +179, +195, +201, +227, +147, +101, +26, +6, 255, -78, -92, -20, -127, -140, +42, +214, 216, -12, -2, -18, -189, 124, -2, -195, -73, -106, -145, -252, -153, -219, -161, -146, -111, -162, -201, -73, -184, -36, 91, -253, -212, +93, +150, +52, +88, +254, 194, -63, +240, +78, +65, 32, +19, +191, +57, +249, +174, +97, +193, +255, +158, +214, +19, +95, +177, +180, +31, +112, +28, +141, +44, +109, +241, +93, +158, +222, +58, +196, 67, -192, -232, +33, +202, +196, +249, +246, +174, +170, +84, +84, +115, +171, +86, +172, +173, +217, +13, 68, +220, +115, 24, -144, -148, -120, -176, -130, -51, -190, -108, -104, +240, +41, +255, +14, +207, +160, +188, 75, -127, -42, -133, -104, -2, -167, -133, -73, +122, +38, +98, +79, +137, +229, +70, +206, +35, +188, +149, +138, +80, +107, +237, +224, +112, +232, +36, +11, +242, +14, 172, -241, +85, +224, +77, +32, +254, +111, +18, +46, +150, +124, +52, +76, +174, +152, +59, +145, 51, +17, +81, +231, +13, +203, +137, +173, +71, +230, +251, +240, +127, 49, -10, -207, -10, -124, +87, +120, +236, +249, +240, +186, +152, +132, +72, +3, +228, +96, +96, +204, +250, +131, +19, 121, -89, -15, -16, -142, -52, +112, +254, +240, +159, +220, +100, +14, +205, +38, +92, +0, +26, +152, +123, +203, +4, +229, +159, +249, +148, +224, +149, +218, +186, +12, +35, 107, -109, -140, -175, -173, -28, +194, +119, +46, +101, +69, +112, +114, +196, +91, +212, +104, +116, +41, +210, +165, +79, 248, -50, +23, 92, -83, 17, -141, -134, -37, -25, -9, -73, -169, -14, -34, -225, -72, +224, +59, +55, +111, 77, -201, -135, -11, -45, -103, +73, +189, +241, +105, +195, 130, -181, -99, -0, -81, -101, -93, -179, -193, -106, -44, -163, -240, -222, -115, -153, -91, -134, -255, +56, +69, +12, +173, +165, +132, 4, -163, -86, -251, -10, -148, -71, -107, -219, -200, -60, -234, -174, +49, +127, +124, +13, +199, +142, +206, +172, 81, -100, +191, +221, 23, -102, -146, +49, +184, +143, +222, +103, +111, 201, -83, -65, -97, -157, -41, -99, -16, -141, -74, -19, -133, -138, -76, -56, -39, -113, -76, -7, -129, -123, -104, -153, -204, -210, -137, -19, -220, -59, -177, -237, -37, -44, -205, -16, -25, +191, 116, -219, -166, -161, -102, -25, -100, -252, +240, +239, 179, -175, -188, -91, -245, +200, +89, +206, +225, +41, +146, +104, +251, +22, +10, +119, +67, +76, +250, 183, -254, 130, -110, -85, -225, -139, -208, -93, -249, -8, -151, -65, -157, -180, -66, -31, -188, -37, -233, +198, +111, +201, +9, +243, +45, +75, +38, +198, +209, +227, +186, 238, -194, -159, -79, -94, -55, -240, -255, -153, -106, -113, -120, -108, -178, +164, +101, +9, 31, -54, -111, 91, -93, -29, -222, -6, -79, +26, +164, +200, +143, +21, +159, +248, 65, -58, +195, +89, +39, +52, +19, +107, +233, +175, +98, +201, +233, 83, -18, -40, -139, -216, -111, -1, -251, -173, -85, -12, +8, +104, +94, +122, +79, +204, +143, +203, +4, +21, +214, +227, +136, 82, -151, -221, -71, -32, -181, -116, -230, -221, -179, -192, -34, -6, -243, -255, +227, +1, +235, +158, +5, +90, +150, +216, +73, +189, +203, +65, +27, +146, +72, +63, +9, +86, +139, +49, +23, +86, 120, -208, -91, -131, -156, -13, -202, -140, -39, -48, -183, -6, -10, -172, -178, -251, -129, -232, -165, -236, -18, -61, -18, -103, +231, +70, 162, -39, -52, -133, -166, -128, -192, -150, -100, -151, -129, -6, -34, -55, -208, -237, -116, -121, -102, -141, -132, -111, -35, -141, -143, -229, -191, -109, -88, -31, -189, -79, -116, -79, -250, -248, -173, -247, -201, -90, -172, -226, -132, -95, -43, -4, -118, -154, -56, -148, +249, 62, -88, -206, -163, -103, -124, -97, -133, -177, -132, -193, -81, -83, -173, -151, -151, -33, -233, -165, -14, -143, -55, -187, -15, -143, -109, +9, +31, +72, 82, -184, -85, -164, -247, -177, -95, -54, -138, -120, -118, +165, 152, -136, -201, -30, -64, -212, -211, +149, +10, +81, +150, 19, -110, -106, -9, -30, -1, +169, +109, +57, +14, +50, +11, +177, +168, +117, +79, +67, +234, 154, -194, -210, -137, -99, -126, -142, -29, +245, 121, -35, -96, -26, -61, -142, -74, -137, -98, -226, -74, -145, -59, -115, -73, -128, +140, 153, -219, -176, -22, -116, -6, -37, -115, -254, -219, -233, -42, -192, -160, -93, -104, -55, -93, -249, -148, -237, -34, -125, -158, -168, -71, -98, -165, -155, -241, -147, -193, -13, -165, -138, -95, -247, -170, -221, -67, -44, -138, -22, -252, -238, -69, -21, -200, -9, -216, -67, -117, -180, -36, -99, -110, -12, -177, -87, -149, -17, -242, -55, -255, +47, +194, 69, -92, -96, -33, -111, -252, -146, -178, -8, -198, -43, +75, 207, -119, -237, -113, -248, -8, -101, -141, 3, -150, +192, 1, -139, -229, +132, +2, +179, +151, +142, 78, -17, -243, -202, -9, -92, -187, -240, -95, -199, -117, -63, -250, -16, -249, -147, -39, -31, -198, -143, +62, +53, +40, +82, +219, +169, +4, +233, +29, +217, +99, +227, 246, -60, -135, -200, -113, +231, +178, 189, -149, -70, -172, -197, +160, 214, -99, -80, -55, -32, -116, -187, +56, +138, +139, +208, +21, +68, +107, +11, +230, +42, +3, +106, +63, 193, -199, -111, -24, -187, -49, -220, -182, -223, -215, -185, -98, -221, +249, +113, +15, +71, +129, +131, +177, +71, +132, +9, 124, -14, -238, -63, -190, -80, +102, +253, 172, -132, -179, -140, -87, -62, -251, -186, +124, +75, +129, +184, +50, +82, 16, -249, -133, -224, -135, -178, -121, -235, -239, -143, -177, +115, +113, +32, +89, 140, -49, -155, +255, +206, 65, -63, -182, +66, +32, +132, +199, +114, +220, 7, +184, +127, +66, +226, 143, -138, +11, 49, -0, -170, -217, -19, -47, -154, -40, -248, -155, -213, +33, +11, 204, -75, -217, -63, -152, -9, -165, -76, 196, -215, -197, -158, -146, -176, -162, -169, -137, -211, -179, -203, -154, -172, -111, -10, -253, -232, -202, -234, -126, -215, -72, -254, -234, -92, -35, -52, -10, -88, +24, +63, +227, +40, +1, +28, +112, +233, +41, +84, +70, +222, +242, +235, +84, +79, +96, +180, +163, +131, 159, 189, +117, +109, +249, +31, +222, +150, +79, +11, +200, +173, +205, +171, +94, +13, +216, 53, +218, +217, +44, +85, +210, +81, +72, +104, +101, 148, -99, -126, -18, -150, -236, -225, -60, -71, -197, -184, -26, +75, +78, +94, 203, -57, -21, -122, -61, -84, +208, 12, -43, -192, -42, -123, -177, -72, -210, -143, -237, -49, -75, -30, -24, -11, -36, -211, -99, +19, +214, +219, +225, +200, +150, +189, +165, +224, +152, +239, +242, +72, +41, +177, +60, +224, +255, +222, +242, +202, +80, +108, +255, +46, 149, -235, +68, +223, 155, +5, +197, +135, +138, +226, +189, +227, 156, -54, -230, -10, -111, -249, -186, -218, -242, -252, -86, -174, -125, -186, -56, -203, -243, -106, -11, -243, -155, -94, -251, -122, -151, -229, -185, -53, -121, -83, -125, -77, +223, +59, 182, -24, -51, -219, -239, -196, -231, -165, -218, +221, +57, +138, +61, +127, 159, -111, -91, -83, -205, 246, -91, -215, +76, +98, +149, +59, +97, +179, +142, +191, +121, +107, +132, +245, +146, +26, +165, +98, +105, +65, +225, +55, +132, +40, +171, +235, +32, +18, +19, +165, +93, +139, +209, +65, +13, +43, +99, +179, +248, +187, +20, +20, 164, -158, -8, -156, -220, -154, -112, -221, -44, -87, -227, -217, -197, -48, -91, +153, +255, +157, +184, +40, +254, +24, +177, +25, +4, +36, +122, +249, +4, +134, +147, +212, +34, +249, +47, +110, 135, -208, -203, -2, -205, -202, +74, +190, +137, +38, +39, +225, +146, +108, +245, +83, +11, +255, +128, +12, +1, +163, +19, +97, +64, +82, +226, +193, +10, +206, +248, +178, +161, 45, +253, +169, +20, +162, +9, +156, +22, +38, +177, +198, +47, +196, +40, +188, +40, +240, +229, +101, +61, +64, +56, +210, +172, +181, +49, +190, +182, +114, +224, +203, +112, +77, 69, -92, +52, +26, +150, +100, +36, +36, +165, +58, +136, +132, +35, +53, +37, +31, +46, +180, +156, +9, +214, 142, +1, +68, 149, -153, -53, -80, -59, +117, +205, +6, +171, +177, +140, +194, +7, +207, +101, +110, +25, +254, +19, +140, +90, +237, 43, -185, -112, -170, -234, -157, -223, -98, -157, -96, -166, +80, +30, +173, +109, +35, +243, +168, +187, +70, +145, +93, +152, +73, +38, +79, 5, -130, -189, -118, -174, -154, +133, +117, +166, +140, +65, +52, +42, +77, +20, +42, 50, -71, -129, -138, -45, -199, -29, -167, -154, +225, 156, -142, +196, +49, +29, +4, +238, +161, +101, +50, 75, -53, -207, -124, -144, -117, -47, -205, +39, +78, +240, +224, +196, +182, +151, +176, +52, +67, +100, +208, +109, +155, 134, -211, -247, +154, +101, 144, -203, -83, -52, -119, +241, +47, 190, -174, -206, -78, -219, -104, -9, +242, +110, +213, +223, +250, +11, +186, +85, +133, 47, +66, +119, +229, +35, +92, +6, +117, +210, +10, +125, +240, +150, +164, +187, +11, 127, -123, 62, -13, -142, -191, -144, -241, -154, -197, -106, -186, -150, -241, -113, -108, -85, 121, -91, +219, +192, 255, -195, -173, -72, -217, -91, -102, -186, -32, -71, -90, -143, -48, -184, 103, -219, -208, -236, -191, -220, -213, -144, -46, -136, -13, -78, -135, -189, -113, -147, -20, -63, -250, -220, -185, +170, 197, -227, -63, -205, -194, -45, -149, -199, -187, -65, -82, -194, -226, -148, -61, -110, -191, -77, -148, -159, +225, +177, 201, -62, -220, -152, -221, -64, -38, +126, 220, -101, -238, -204, -119, -94, 188, -114, -252, +109, +117, +117, +120, +27, +60, +5, +233, +76, +73, +160, +44, +98, +191, +5, 236, -47, -154, -110, -205, -11, -39, -102, -86, -128, -37, -26, -32, -252, +183, 86, -12, -128, -143, -13, -174, -117, -143, -125, -242, -65, -168, -211, -88, -55, -132, -217, -172, -83, -107, -56, -119, -0, -28, -50, -230, -159, -65, -144, -243, -34, -12, +49, +72, +93, +118, +31, +129, +212, 210, -183, -5, -7, -3, 153, -125, -239, +247, +192, +2, +139, +24, +204, +255, +227, +65, +111, +13, +114, +54, +40, 51, -131, -118, 158, -8, -108, -134, -231, -21, -81, -89, +192, +220, +26, +40, +176, +202, +238, +7, +162, +151, +178, +75, +244, 72, +156, +137, +158, +208, +20, +154, 2, -90, -155, -131, -73, -203, +2, +91, +146, +93, +6, +26, +136, +220, +64, +183, +211, +229, +153, +53, +18, +190, +141, +52, +62, 150, +255, +182, +97, +125, +242, +238, +233, +158, +244, +233, +91, +239, +222, +90, +172, +226, +132, +95, +43, +4, 118, -120, -207, -162, -200, -211, -2, -92, -75, -161, -195, -73, -50, +154, +56, +148, +62, +90, +206, +147, +103, +124, +97, +133, +177, 132, -11, -89, -75, -38, -100, -72, -106, +193, +81, +83, +173, +151, +215, +33, +233, +165, +14, +143, +119, +187, +15, +143, +109, +82, +184, +85, +164, +247, +177, +95, +54, 138, -192, -45, -135, -77, -67, -80, +120, +118, +152, +136, +201, 30, -230, -161, -207, -82, +64, +212, +211, +19, 110, -149, -170, -232, -177, -62, -37, -189, -215, -202, -252, -68, -52, -227, -57, -235, -154, +106, 9, -130, -123, -254, -113, +30, +1, +154, +194, +210, +137, +99, +126, +142, +29, +121, +35, 96, +26, 61, -191, -116, -64, -79, -124, -250, 142, -0, -209, -152, -223, -244, -103, -158, -70, -58, -169, -138, -75, -88, -95, -2, -251, -26, -89, -199, -133, -111, -204, -200, -97, -129, -134, -51, -240, -208, -60, -66, -162, -14, -199, -33, -189, -2, -47, -153, 74, -183, -9, -51, -91, -22, -48, -209, -24, -170, -68, -145, -16, -196, -38, -123, -215, -29, -118, -47, -214, +137, +98, +226, 74, -132, -104, +145, +59, +115, +73, 128, -154, -181, -154, -195, -17, -130, -240, -41, -24, -130, -58, -104, -119, -216, -120, -208, -105, -117, -186, -239, -58, -162, -253, +153, +219, 176, -128, -117, +22, +116, +6, +37, +115, +254, +219, +233, +42, +192, +160, +93, +104, +55, +93, +249, +148, +237, +34, +125, +158, 168, -209, +71, +98, +165, +155, +241, +179, 193, -69, +13, +165, +138, +95, 247, -250, -250, -162, -223, -28, -152, -213, -140, -204, -55, -181, -47, -187, -191, -218, -31, -140, -42, -142, -96, -7, -237, -206, -237, -91, -123, +170, +221, +67, +44, +138, +22, +252, +238, +85, +21, +200, +9, 216, -106, -42, -92, -251, +99, +117, +180, +36, +99, +110, +12, +177, +87, +149, +17, +242, +55, +255, 65, -183, -173, +92, 96, -183, -221, +33, +111, +252, +154, +178, +8, +198, +43, +207, +119, 237, -217, -205, -235, -107, -123, -208, -239, -223, -12, -11, +113, +248, +4, +101, +141, +3, +150, +1, +139, +229, +78, +17, +243, +202, +9, +92, +187, 240, -136, -26, -189, -168, -232, -133, -27, -48, -15, +95, +199, 117, -76, -39, 63, -28, -115, -25, -169, -240, -0, -220, -146, -41, -89, -51, -236, -42, -205, -166, -138, -45, -42, +250, +16, +249, +147, +103, +31, 198, -132, -137, -89, -24, -133, -193, -248, -121, -248, -132, -97, -175, -186, -6, -83, -169, -190, -173, -187, -152, -242, -62, -2, -130, -151, -252, -72, -19, -250, -4, -53, -59, -26, -86, -188, -154, -204, -33, -238, -92, -206, -252, -140, -43, -132, -19, -217, -239, -233, -171, -70, +143, 246, +60, 135, -88, -249, -67, -3, -153, -124, -250, -10, -138, -246, -164, -31, -204, -157, -88, -105, -105, -81, -168, -33, -167, -10, -49, -16, -207, +200, +113, +189, +149, +70, 172, -119, -41, -177, -88, -65, -22, -171, -53, -176, -128, -171, -100, -118, -54, -153, -206, -48, -184, -29, -43, -135, -248, -161, -227, -226, -95, -121, -7, -52, -207, -56, -31, -80, -66, -88, -224, -22, -204, -80, -141, -41, -225, -250, -8, -65, -241, -133, 197, +214, +99, +80, 55, -115, -208, -76, -12, -166, -222, -108, -21, -97, -246, -157, -8, -181, -49, -51, -1, -249, -164, -106, -59, -150, -225, -191, -85, -194, -63, -163, -21, -131, -88, -33, -167, -48, -77, -92, -27, -138, -129, -101, +32, +116, +187, +193, +199, +111, +24, +187, 49, -51, -143, -244, -36, -64, -48, -87, -167, +220, +182, +223, +215, +185, +98, +221, 124, -138, -238, -12, -116, -34, -209, -140, -145, -254, -145, -70, -17, -56, -188, -129, -1, -39, -94, -48, -229, -255, -23, -238, 14, -84, -226, -40, -118, 238, -179, -176, -38, -106, -65, -21, -27, -203, -216, -208, -130, -65, -245, -36, -164, -84, -21, -140, -99, -50, -7, -225, -187, -57, 63, -168, -80, -214, -1, -68, -168, -44, -88, -66, -119, -10, -89, -177, -56, -229, -8, -18, -11, +190, 80, -183, -16, -119, -38, -78, -0, -113, -112, -27, -120, -34, -185, -8, 172, -129, -152, -56, -222, 132, -255, -175, -162, +179, +140, +87, +62, +251, +186, +16, +249, 133, +224, +135, +178, +121, +235, +239, +143, +177, +140, +49, +155, +65, +63, +182, +7, +143, +138, +49, +0, +170, +217, +19, +47, +154, 40, -153, +248, +155, 213, -56, -112, -212, -139, -115, +204, +75, +217, +63, +152, +9, +165, 76, -123, -97, -10, -135, -179, -42, +196, +183, +197, +158, 146, -216, -241, -199, -231, -85, -62, -18, -125, +176, +162, +169, +137, +211, +179, +203, +154, +172, 239, -147, -165, -80, -246, -236, +10, +253, +232, +202, +234, 126, -154, +215, +72, +254, +234, +92, +35, +52, +10, +88, 159, -204, -9, -68, -85, -70, +189, +53, +148, +99, +126, +18, +150, +236, +225, +60, +71, +197, +184, +26, +203, +57, +21, +122, +61, +84, 12, -252, -15, -220, -86, -166, -88, -199, -39, -107, -204, -15, -31, -168, -19, -4, -193, -140, -198, -59, -198, -15, -39, -152, -24, -190, -167, -10, -182, -219, -253, -85, -37, -171, -250, -181, +43, 192, -1, +42, +123, +177, +72, +210, +143, +237, +49, +75, +30, 25, -81, -201, -170, -100, -142, -231, -186, -37, -105, -150, -117, -112, -249, -73, -243, +11, +36, 211, -183, -223, -226, -15, +99, +149, +235, +155, +156, +54, 230, -234, -20, -15, +10, +111, 249, -47, -130, -1, +182, +218, +242, +252, +86, +174, +125, +186, +56, +203, +243, +106, +11, +243, 155, -167, +94, +251, +122, +151, +229, +165, +53, +121, +87, 125, -74, -60, -225, -98, -13, -55, -22, -44, -112, -214, -31, -226, -23, -198, -202, -147, +77, +182, +24, +51, +219, 239, -162, +196, +231, +165, +218, +159, +111, +91, +83, 205, -30, -202, -253, +246, +91, 215, -230, -68, -4, -24, -15, -222, -197, -18, -125, +164, +158, +8, +156, +220, +154, +112, +221, 44, -62, -99, -149, +87, 227, -40, -185, -149, -53, -21, -216, 197, -148, -29, -211, -137, -108, -119, -101, -29, -116, -42, -149, -220, -188, -145, -231, -182, -210, -82, -182, +197, +48, +91, +135, +208, +203, +2, +205, 202, -141, +45, 69, -249, -229, -241, -64, -127, -39, -161, -191, -90, -4, -26, -149, -112, -211, -15, -235, -243, -79, -205, -84, -122, +92, 142, -95, -151, -66, -115, -109, -111, -156, -101, -46, -28, -27, +149, +153, +53, 80, -61, -12, -234, -81, -214, -176, -166, +59, +43, +185, 112, -145, -211, -73, -254, -165, -207, -136, -145, -55, -44, -158, -95, -123, -227, -168, -14, -204, -238, -89, -70, -147, -222, 170, -110, -32, -102, -143, -206, -189, -177, -243, -89, -131, -59, -7, -0, -247, -226, -214, -228, -24, -47, -204, -54, -13, +234, +157, +223, +98, +157, +96, 166, -237, -211, -171, -9, -224, -107, -194, -124, -255, -37, -85, -243, -81, -232, -57, -170, -55, -56, +5, +130, +189, +118, +174, +154, +50, +71, +129, +138, +45, +199, +29, +167, +154, 156, -128, -18, -40, -193, -153, -186, -148, -100, 142, -160, -99, -21, -13, -79, -37, -134, -146, -220, -180, -161, -174, -205, -159, -118, -158, -140, -155, -166, +75, +53, 207, -215, -191, -151, -143, -54, -87, -115, -247, -204, -163, +124, +144, +117, +47, 205, -67, +134, +211, +247, +144, +203, +83, +52, +119, +190, 174, -212, -131, -36, -7, -214, -92, -42, -1, -187, -204, +206, +78, +219, +104, +9, +47, +127, +123, +62, +13, +142, +191, +144, +241, +154, +197, +106, +186, 150, -33, -202, -235, 241, +113, +108, +85, 121, -188, -212, -101, -220, -23, -223, +91, +255, +195, +173, +72, +217, +91, +102, +186, +32, +71, +90, +143, +48, +120, +96, +219, +208, 236, +191, +220, +213, +144, +46, +136, +13, +78, +135, +189, +113, +147, +20, +63, +250, 220, +185, +197, +227, +63, +207, 194, -125, -229, -161, +45, +149, +199, +187, +65, +82, +194, +226, +148, +61, 110, -164, -165, -128, -91, -75, -95, -126, -140, -208, -186, +191, 77, -94, -222, -141, -53, -20, -132, -232, -232, -96, -241, -31, -224, -192, +148, 159, -229, -8, -58, -242, -89, -143, -100, -104, -212, -146, -56, -44, -95, -158, +201, +62, +220, +152, +221, +64, +38, +220, +101, +238, +204, +15, 94, -6, -95, -126, -127, -105, -124, -249, -253, -216, -124, -49, +188, +114, +252, +236, +47, +154, +110, +205, +11, +39, +102, +86, 128, -227, -118, +37, +26, +32, +252, +86, +12, +128, +143, +13, +174, +245, +128, +125, +242, +65, +168, +211, +88, +55, +132, +217, +172, +83, +107, +56, 119, +0, +28, +50, +230, +159, +65, +144, +243, +34, +12, +210, +183, +5, +7, +3, +153, +125, +239, 51, -101, -171, -130, 131, -113, -16, -3, -45, -215, -71, 118, +158, +8, 108, -130, -99, +134, +231, +21, +81, +89, +72, +2, +90, +155, +131, +73, +203, +150, +118, +248, +192, +162, +200, 211, -52, -71, -198, -15, +2, +92, +75, +161, 195, -200, -232, -16, -222, +73, +50, +132, +11, +89, +75, +38, +100, +72, 106, -19, -108, -207, -33, -219, -255, -113, -62, -137, -32, +138, +192, +45, +135, +77, +67, +80, 30, -206, -225, -54, -173, -145, -171, -105, -235, -218, -120, +231, +161, +207, +82, 110, -249, -99, -135, -168, -16, -49, -128, -205, -139, -139, +149, +170, +232, +177, +62, +37, 189, -79, -22, -6, -176, -65, -220, -199, -225, -42, -112, -181, -175, -255, -42, -45, +215, +202, +252, +68, +52, +227, +57, +235, 154, -206, -33, -182, -27, -31, -174, -234, -60, +9, +130, +123, +254, +113, 96, +61, 191, +116, 64, -230, -110, -228, +79, +124, +250, +142, +0, +209, +152, +223, +244, +103, +158, +70, +58, +169, +138, +75, +88, +95, +2, +251, +26, +89, +199, 133, -145, -13, -96, -153, -224, +111, +204, +200, +97, +129, +134, +51, +240, +208, +60, +66, +162, 14, -216, -125, -30, -106, -80, -182, -247, -215, -149, -50, -83, -35, -143, -125, +199, +33, 189, -243, -41, -251, -42, -80, -70, -228, -104, -172, -218, -220, -217, -7, -17, -57, +2, 47, -94, -151, -184, -218, -92, -197, -7, -218, -66, -52, -15, -168, -71, -1, -178, -109, -80, -50, -163, -154, -232, -29, -164, -216, -70, -42, -124, +153, +74, +183, +9, +51, 91, -39, -89, -19, +22, 48, -205, -177, -86, -111, -66, -136, -47, -245, -46, -157, +209, 24, -132, -154, -19, -198, -204, -161, -22, -78, -12, -173, -183, -106, -57, -210, -94, +170, +68, +145, +16, 196, -178, -177, -200, -137, -11, -198, -198, -209, +38, +251, +208, +29, +118, +47, +214, +74, +132, 104, -65, -8, -242, -0, -224, -107, -108, -210, -109, -218, -126, -209, -253, -59, -185, -192, -87, -108, -207, -82, -188, -145, -18, -64, -39, -70, -248, -108, -165, -222, +128, +154, +181, +154, +195, +17, +130, +240, 41, -214, +24, 130, -236, -186, -189, +58, +104, 119, -205, -235, -110, -219, -110, +216, +120, +208, +105, 117, -174, -175, -237, -238, -168, -147, -149, -201, +186, +31, +58, +162, 253, -102, -67, +176, +128, +117, +168, +209, +193, +69, +247, +250, +250, +162, +223, +28, 152, -161, -214, -51, -71, -200, -45, -242, -127, -66, -202, -232, -121, -91, -125, -236, -72, -127, -165, -249, +213, +140, +204, +55, +181, +47, +187, +191, +218, +31, +141, +42, +142, +96, +7, +237, +206, +237, +123, +123, 216, +106, +42, +92, +251, 65, -29, -89, -56, -96, -228, -240, -182, -24, +183, +173, 96, -112, -222, -182, -150, -243, -167, -216, -155, -104, -167, -36, -236, -236, -103, -83, -28, -131, -8, -78, -115, -172, -113, -232, -62, -89, -175, -98, -31, -67, -234, -147, -121, -20, -174, -102, -115, -64, -230, -163, -164, -30, +183, +221, +237, +217, +205, +235, 107, -233, -59, -19, -138, 123, +208, +239, +223, +12, +11, +240, +136, +26, +189, +168, +232, +133, +27, +48, +15, +117, +76, +39, +63, +28, 115, -2, -68, -68, -55, -78, -70, +25, +169, 240, +0, +220, +146, +41, 89, -48, -131, -55, +51, 236, -93, -59, -73, -126, -103, -122, -208, -200, -208, 42, -106, -47, -107, -104, -207, -144, -41, -101, -162, -164, -36, -29, -181, -129, -69, -239, -131, -80, -170, -151, -231, -37, -152, -17, -49, -157, -198, -58, -21, -34, -228, -119, -101, -25, -44, +205, +166, +138, +45, +42, 198, -179, -168, -159, -60, -253, -86, +132, +137, +89, 24, -144, -36, -53, -203, -176, -188, -56, -147, -253, -178, -62, -69, -76, -247, -130, -234, -212, -87, +133, +193, +248, 121, -32, -125, -123, -17, +248, +140, +97, +175, +186, +6, +83, +169, +190, +173, +187, +152, +242, 62, -110, -124, +2, +130, +151, 252, -206, -255, -94, -83, -125, -188, +68, +19, +186, +135, +154, +29, 13, -35, -239, +43, +94, +77, +230, +16, 119, -104, -229, -115, -218, -31, -101, -89, -5, -177, -65, -53, -212, +46, +103, +126, 198, -214, -246, -214, -144, -49, -235, -163, -74, -211, -167, -231, -55, -125, -53, -158, +21, +194, +137, +236, +247, +244, +77, +35, +251, +67, 172, -146, -36, -12, -40, +252, +161, +129, +76, +62, +125, 3, -77, -101, -137, -250, -235, -18, -28, -193, +69, +123, +210, +15, 230, -105, -85, -113, -99, -134, -168, -205, -5, -63, -50, -130, -234, -100, -199, -112, -18, +78, +172, +180, +180, +40, +212, +144, +83, 133, -190, -127, -225, -68, -5, -84, -51, -249, -75, -115, -86, -196, -216, -216, +24, +136, +103, +214, +135, +148, +88, +172, +32, +139, +213, 26, +88, +192, +85, +50, 59, -101, -36, -67, -105, +155, 76, -108, -72, -73, -249, -36, +103, +24, +220, 142, 149, -48, -224, -187, +67, +252, +208, +113, +241, +175, +188, +3, +154, +103, +156, +15, 40, +33, +44, +112, +11, +102, +168, +198, 148, -229, -220, +112, 125, -54, -77, -172, -147, -133, -23, -96, +132, +160, +248, +194, +226, +155, +57, +104, +38, +6, +83, +111, +182, +138, +48, +251, +78, +132, +218, +152, +153, +128, 124, -81, -68, -5, -22, -22, -206, -227, -105, -157, -44, -99, -80, -112, -27, -43, -180, -40, -44, +82, +181, +29, 203, -126, -89, -130, -101, +240, +223, +42, +225, +159, +209, +138, +65, +172, +144, +83, +152, +38, +174, +13, +197, +192, 178, +152, +153, +71, +122, +18, +32, +152, +171, +83, +62, +69, +119, +6, +58, +145, +104, +198, +72, +255, +72, +163, +8, +28, +222, +192, +128, +19, +47, +152, +242, +255, +11, +119, +7, +42, 113, -25, -142, -165, -109, -5, -195, -228, -207, -156, -97, +20, +59, +15, +89, +88, +19, +181, +160, +138, +141, +101, +108, +104, +193, +160, +122, +18, +82, +170, +10, +198, +49, +153, +131, +240, 221, -68, 156, -194, -24, -117, +31, +84, 40, -190, -100, +235, +0, 34, -56, -60, -134, -232, -112, -174, -6, +84, +22, +44, +161, +59, +133, +172, +88, +156, +114, +4, +137, +5, +168, +91, +136, +59, +19, 39, 128, -171, -8, -225, -138, -120, -18, -159, -112, -81, -132, -42, -39, -80, -160, -39, -182, -230, -233, 56, -127, -174, -149, -163, -96, +184, 13, -228, -217, -41, -126, -83, -130, -151, -216, -178, -12, -35, -169, -161, -224, -34, -254, -240, -130, -100, -110, -233, -123, -201, -70, -93, -94, -252, -75, -9, -142, -65, -15, -149, -244, -121, -177, -7, -193, -195, -28, -101, -146, -151, -5, -62, -74, -14, +60, +145, +92, +4, 214, -200, -187, +64, +76, +28, +111, +194, +255, +87, 209, -232, -182, -229, -195, -187, -226, -139, 66, -176, -228, -116, -7, -152, -51, -179, -15, -247, -242, -60, -140, -19, -29, -143, -221, -51, -57, -6, -81, -82, -231, -181, -146, -162, -221, -112, -198, -158, -78, -185, -101, -245, -219, -116, -90, +148, 204, -89, -220, +106, +28, +56, +234, +197, +57, +166, +189, 50, -182, -127, -183, -66, -196, -126, -91, -177, -120, -79, -75, -65, -61, -151, -119, -163, -172, -34, -191, -204, -74, +133, +195, +89, +21, +73, +236, +248, +227, +243, 42, -8, -14, -14, -215, -92, -113, +31, +137, 190, -143, -103, -18, -238, -183, -62, -183, -128, -129, -90, -160, -36, +247, +201, +82, +40, 123, -113, -249, -159, -223, -86, -97, -242, -51, -253, -183, -6, -97, -9, -0, -207, -211, -125, -194, -90, -26, -251, -89, -150, -13, -179, -169, -143, -108, -128, -117, -223, +118, 63, -217, -3, -231, -161, -30, -8, -8, +205, +79, +230, 4, -188, -218, -135, -127, -5, -194, -165, -35, -22, -47, -185, -74, -214, -118, 162, -214, -240, -100, -234, -101, -84, -216, -147, -249, 42, -248, -124, -212, -224, -62, -44, -145, -153, -146, -19, -234, 35, +6, +254, +7, +110, +43, +83, +172, +227, +179, +53, +230, +135, +15, +212, 9, -236, +130, +96, +70, +227, +29, +227, +135, +19, +76, +12, 223, -161, -150, -35, -37, -85, -20, +83, +5, 219, -159, +237, +254, +170, +146, +85, +253, 90, -182, -226, -125, -236, -153, -6, -155, -203, -141, -235, -17, -74, -133, -226, -233, +224, +128, +140, +168, +100, +85, +50, +199, +115, +221, +146, +52, 203, -81, -212, -206, -254, -94, -35, -65, +58, 184, +252, +164, +249, +251, +183, +223, +226, +15, +230, +234, +20, +15, +249, +47, +130, +1, +155, +167, 125, -205, +74, 60, -50, -251, -95, -38, -200, -210, -44, -144, -132, +225, 98, -188, -153, -49, -69, -181, -176, -71, -182, +13, +55, +22, +44, 112, -195, -42, -89, -29, -50, -28, -188, -64, -195, -146, -95, -253, -106, -75, -245, -208, -119, -233, -222, -116, -70, -111, -251, -109, -251, -170, -51, -50, -74, -117, +214, +31, +226, 23, +198, +202, +147, +239, +162, 205, -222, -118, -154, -102, -153, +30, +202, +253, +215, 230, -162, -221, -109, -127, -56, -50, -74, -48, -151, -237, -238, -70, -70, -73, -245, -162, -89, -187, -115, -221, -25, -117, -140, -178, -233, -69, -203, -254, -237, -168, -219, -239, -13, -141, +68, +4, +24, +15, +222, +197, 18, -218, +125, +44, +62, +99, +149, +227, +40, +185, +149, +53, +21, +216, +197, +148, +29, +211, +137, +108, +119, +101, +29, +116, +42, +149, +220, +188, +145, +231, +182, +210, +82, +182, +202, +141, 69, +249, +229, +241, +64, +127, +39, +161, +191, +90, +4, +26, +149, +112, 211, -209, -160, -217, +15, +235, +243, +79, +205, +84, +122, +142, +95, +151, +66, +115, +109, +111, +156, +101, +46, +28, +27, +80, +61, +12, 234, -24, -229, +81, +214, 176, -139, -134, -173, -126, -175, -215, -105, -141, +166, +112, +145, +211, +73, +254, +165, +207, +136, +145, +55, +44, 158, -203, -100, -223, -214, -84, -77, -128, -255, -187, -70, -179, -225, +95, +123, +227, 168, -57, -186, -27, -218, -237, +14, +204, 238, -80, -12, -218, -105, -27, -137, -129, -104, -63, -232, -12, -251, -215, -239, -186, -189, -43, -35, 89, -16, -141, -91, -205, +70, +147, 222, -72, -244, -208, -49, -146, -9, -217, -158, -40, -87, -71, -215, -17, -13, -117, -244, -34, -199, -117, -4, -36, -63, -186, -194, -55, -29, -17, -73, -249, -246, -175, -187, -206, -48, -71, -186, -142, -156, -136, -214, -23, -253, -246, -7, -35, -33, -41, -48, -172, -223, -179, -59, -131, -65, -127, -96, -36, -49, -124, -161, +170, 110, -249, -134, -232, -64, -47, -156, -240, -187, -108, -201, -94, -127, -167, -35, -49, -105, -251, -225, -251, -238, -168, -245, -150, -79, -221, -190, -29, -244, -71, -253, -86, -255, -122, -168, -116, -165, -35, -63, -105, -87, -188, -131, -86, -103, -56, -204, -201, -223, -119, -58, -18, -148, -246, -208, -255, -37, -147, -60, -179, -105, -180, -6, -157, -166, -186, -250, -231, +32, 102, -164, -55, -91, -173, +143, 206, -109, -190, 189, -17, -225, -61, -190, -136, -205, +177, +243, +89, +131, 59, -190, -247, 7, -93, -190, -184, 0, -29, -210, +247, +226, +214, +228, +24, +47, +204, +54, +13, +166, 237, -93, -246, -7, -55, -77, -88, -94, -165, -83, -157, -29, -161, -116, -138, +211, 171, -219, -233, -41, -58, -250, -59, -157, -61, -145, -246, -192, +9, +224, +107, +194, +124, 255, -209, -25, -109, +53, +85, +243, +81, 232, -68, -103, -111, -100, -203, -218, -28, -140, +57, +170, +55, +56, +156, +128, +18, +40, +193, +153, 186, -205, -235, +148, +100, +142, +160, +99, +21, 13, -221, -232, -108, +79, +37, +134, 146, +220, 180, +161, +174, +205, +159, +118, +158, +141, 155, -155, -187, -235, -81, +166, +207, 215, -38, -217, +191, +151, +143, +54, 87, -250, -208, -217, -48, -105, -31, -221, -27, -251, -110, -168, +115, +247, +204, +163, +205, +67, 174, -210, -185, -57, -9, -183, -215, +212, +131, +36, +7, +214, 92, -90, -222, -246, +42, +1, 187, -92, -84, -51, -69, +204, +150, +33, +202, +235, +241, +121, +188, +214, 101, -38, -108, -55, -253, -119, -29, +220, +23, +223, +236, +220, +194, +125, +229, +161, +110, +164, +165, +128, +91, +75, +95, 126, +140, +208, +186, +77, +94, +222, +141, +53, +20, +132, +232, +232, +96, +241, +31, +224, +192, +159, +229, 8, -118, -248, -250, -246, +58, +242, +89, +143, +100, +104, +212, +146, 56, -71, -174, -63, -40, -29, -25, -137, -221, +44, +95, +158, +95, +7, +95, +126, +127, +109, +124, +249, +253, +216, +124, +49, +128, +227, +118, +119, +51, 101, -255, -174, +171, +130, +131, +113, +16, +3, +45, 215, -86, -26, -27, -201, -220, -176, +71, +118, +108, +130, +99, +211, +52, +71, +198, +15, 195, -55, -204, +200, 232, -109, -103, -160, -116, -96, -40, -95, -35, -62, -149, -118, -247, -178, +16, +222, +106, +19, +108, +207, +33, 219, -81, +255, +113, +62, 137, -48, -146, -176, -59, +32, +30, +206, +225, +54, +173, +145, +171, +105, +235, 218, -247, -191, -170, -44, -48, -146, -174, -81, -231, -230, -182, -63, -104, -14, -62, -112, -97, -109, -119, -7, -170, -250, -127, +120, +110, +249, 99, -38, -28, -23, +135, +168, +16, +49, +128, 205, -182, -212, -228, -217, -9, -98, -182, +139, +139, +189, +79, +22, +6, 176, -119, -61, -177, -137, -255, -173, +65, +220, +199, +225, +42, 112, -228, -123, -67, +181, +175, +255, +42, 45, -216, -252, -112, -211, -193, -163, -244, -95, -119, -124, -62, -106, -63, -70, -203, -203, -213, -199, -69, -183, -221, -238, -244, -148, -14, -140, -151, -55, -47, +154, +206, +33, +182, +27, +31, +174, +234, +60, 96, -223, -155, -173, -173, -48, -102, -160, -159, +191, +64, 230, -245, -117, -255, -125, 110, -46, -70, -139, -140, -93, -160, -138, -109, -170, +228, +133, +145, +13, 96, -78, -223, -155, -105, -16, -148, -51, -84, -179, -156, -191, -221, -22, -234, -214, -77, -108, -54, -146, -26, -33, -49, -246, -168, -123, -211, -233, -223, -169, -146, -99, -122, -12, -95, -94, -119, -85, -219, -229, -187, -127, -152, -180, -191, -234, +153, +224, +14, +216, +125, +30, +106, +80, +182, 247, -20, -190, -188, -54, -146, +215, +149, +50, +83, +35, +143, +125, +189, +243, +41, +251, +42, +80, +70, +228, +104, +172, 218, -235, -78, -239, -106, -244, -118, -3, -39, -94, -27, -30, -223, -29, -62, -139, -118, -23, -217, -122, +220, 217, -236, +7, +17, +57, +47, 94, -231, -186, -50, -146, -93, -201, -84, -88, -167, -209, +151, +184, +218, +92, +197, 7, -123, -212, -239, -219, -215, -205, -193, -149, -58, -67, -35, -81, -150, -253, -221, -13, -186, -212, -89, -95, -177, -49, -190, -127, -109, -166, -177, -122, -195, -187, -91, -174, -114, -248, -105, -207, -37, -188, -221, -109, 218, -163, +66, +52, 15, -183, -42, -101, -70, -146, -45, -40, -227, -125, -13, +168, +71, +1, +178, +109, +80, +50, +163, 154, -189, -43, -146, -244, -33, -151, -204, -225, -101, -55, +232, +29, +164, +216, +70, +42, +124, +91, +39, +89, +19, +48, +205, +177, +86, +111, +66, +136, 47, -234, -175, -141, -68, -189, -243, -235, -45, -215, +245, +46, +157, +24, 132, -205, -205, -75, -97, -36, -223, -119, -61, -97, -150, -1, +154, +19, +198, +204, +161, +22, +78, +12, +173, +183, +106, 57, -98, -65, +210, +94, +197, 178, -190, -206, -141, -150, -245, -186, -223, -250, -69, -165, -228, -220, +177, +200, +137, +11, +198, +198, +209, 104, -17, -105, -30, +65, +8, +242, 0, -79, -214, -233, -113, -181, -214, +224, +107, +108, +210, +109, +218, +126, +209, +253, +59, +185, +192, +87, +108, +207, 82, -201, -48, -91, -193, -219, -171, -65, -179, -221, -217, -32, -240, -102, -230, +188, +145, +18, 64, -151, -219, -51, -131, -30, -183, +39, +70, +248, 108, -134, -157, -193, -187, -206, -160, -96, -133, -255, -96, -118, -116, -192, -194, -119, -111, -184, -113, -1, -202, -95, +165, +222, +41, +214, +130, +236, +186, 189, -134, +15, +205, +235, +110, +219, +110, +117, +174, +175, +237, +238, +168, +147, +149, +201, +253, +102, +67, 152, -157, -30, -112, -136, -93, -113, -75, -246, -125, -243, -131, -210, -133, 161, -93, -48, -120, -199, -173, -27, +214, +51, +71, +200, +45, +242, +127, +64, +202, +232, +121, +91, +125, +236, +72, +127, +165, +249, +216, +65, +29, +89, 56, -204, +96, +228, +240, +182, +24, +96, +112, 222, -113, +182, 150, +243, 231, -196, -240, -7, -179, -35, -68, -80, -178, -166, -28, -127, -48, -59, -72, -224, -121, -204, -230, +216, +155, +104, +167, +36, +236, +236, +103, +83, 28, -30, -130, -56, -227, -14, -145, -59, -80, -233, -209, -104, -219, -117, -249, -38, -190, -188, -236, -182, -186, -112, -210, -14, -71, -220, -128, -184, -82, -39, -105, -180, -67, -128, -160, -206, -175, -35, -16, -74, -133, -158, -77, -42, -88, -227, -37, -176, -123, +131, +8, +78, +115, +172, +113, +232, +62, 91, -1, -179, +111, +98, +31, +67, +234, +147, +121, +20, 174, -123, +102, +115, +64, +230, +163, +164, +30, 107, -221, -70, -97, -18, -78, -66, -223, +233, +59, +19, 138, -87, -75, -120, +123, +115, +2, +68, +68, +55, +78, +70, +240, +89, 48, -75, -161, -117, -181, -67, -231, -120, -39, -19, -137, -79, -135, -24, -189, -107, -61, -165, -192, -175, -221, -219, -251, -239, -161, -66, +131, +55, +236, +93, +59, +73, +126, +103, +122, +208, +200, +208, +42, +106, 47, -142, -120, -102, -141, -90, -183, -223, -242, -214, -242, -123, -136, -175, -11, -210, -50, -232, -137, -133, -211, -100, -177, -117, -18, -195, -203, -43, -255, -216, -166, -39, +107, +104, 207, -79, -13, -250, -105, -200, +144, +41, +101, 162, -123, -22, -125, +164, +36, +29, +181, +129, +69, +239, +131, +80, +170, +151, +231, +37, +152, +17, +49, +157, +198, 58, -61, -227, +21, +34, +228, +119, +101, +25, +44, +198, +179, +168, +159, +60, 253, -202, -186, -191, -240, +86, +24, +144, +36, +53, +203, +176, 188, -31, -39, -192, -26, -11, -50, -8, +56, +147, 253, -21, -16, +178, +62, +69, +76, +247, +130, +234, +212, +87, +121, 32, -71, -104, -88, -227, -48, -153, -91, -99, -63, -156, +125, +127, +17, +62, +109, 124, -150, -37, -114, -147, -57, -120, -38, -177, +252, +206, +255, 94, -176, -254, -59, -39, -118, +83, 125, -207, -108, -57, -214, -115, -254, -230, -90, -222, -60, -215, +188, +15, 35, -227, -144, -160, -180, -14, -165, -36, -172, -145, -78, +239, +119, +104, +229, +115, +218, +159, +100, +89, +5, +177, +65, +53, +212, +198, +214, 246, -204, +214, +144, +49, +235, +147, +74, +211, +253, +203, +155, +190, +26, +79, +86, +73, 18, -223, -184, -25, -135, +6, 148, -210, -141, -88, -130, -62, -224, -140, -52, -13, -61, -43, +129, +166, 178, -194, -254, -109, -197, -86, -44, -159, -194, -125, -144, -103, -224, -34, -75, -90, -124, -93, -19, -224, -8, -18, 68, -133, -59, +253, +117, 9, -46, -16, -8, -166, +142, +96, +243, +180, +170, 184, -205, -60, -179, -168, -214, -37, -125, -222, -109, -231, -11, -91, -242, -134, -194, -85, -53, -176, -101, -52, -44, -255, -134, -203, -22, -139, -162, -112, -119, -197, -202, -205, -254, -121, -228, -28, -38, -9, -199, -251, -240, -74, -87, -201, +49, +67, 212, -122, -38, -214, -146, -104, -131, -104, -191, -84, -114, -144, -73, -110, -158, -159, -13, -193, -78, -47, -121, -229, -44, -195, -248, -231, -56, -101, -37, -200, -158, -16, -51, -209, -151, -0, -15, -115, +230, 130, -39, +31, 25, -68, -152, -114, -87, +65, +117, +178, +99, 56, -171, -254, -106, -177, -128, -147, -71, -232, -91, -149, -217, -235, -184, -46, -255, -89, -155, -191, -37, -118, -110, -121, -22, -59, -130, -133, -16, -33, -12, +137, 66, -42, -104, -69, -153, -227, -108, +223, +191, +112, +162, +2, +170, +153, +252, +165, +57, +43, 98, +108, +108, +141, +157, +50, +146, +161, +52, +38, +54, +164, +164, +220, 139, -101, -242, -36, +99, +37, +12, +248, +46, 10, -166, -34, -234, -163, -16, +101, 57, -107, -238, -44, -151, -12, -120, -42, -23, -129, -116, -157, +119, +159, +77, +19, 235, -185, -1, -45, -64, -34, -62, -177, -158, -88, -34, -148, -168, -224, -210, -22, -241, -251, 100, -12, 225, -69, -81, -254, -106, -87, -187, -195, -32, -74, -112, -170, -3, -195, -164, -91, -185, -219, -110, -240, -9, -47, -66, -220, -196, -94, -146, -149, -182, -21, -59, -125, -106, 5, -140, +24, +95, +20, +81, 129, -74, -167, -224, -156, -120, -30, -174, -124, -23, -196, -13, -131, +133, +133, +243, +116, +90, +39, +203, +24, +20, +220, 198, +10, +45, +10, +203, +178, +95, +150, +96, +153, +108, +92, +134, +99, +105, +91, +193, +48, +249, +51, +103, +88, +55, +17, +167, +48, +70, +29, +138, +47, +153, +8, +14, +143, +33, +58, 156, -41, -148, -155, -77, -213, +171, +193, +9, +224, +42, 66, -12, -144, -242, -75, -159, -37, +184, +34, +158, +196, +39, +92, +20, +161, +202, +9, 20, -79, -54, -141, -24, 232, -10, -60, -26, -40, -5, +137, +173, +121, +58, 206, -90, -240, -19, -20, -190, -142, -176, -208, -110, -40, -152, -90, -62, -200, -117, -147, -97, -144, -19, -253, -158, -122, -53, -211, -180, -9, -115, -29, -188, -111, -118, -71, -166, -78, -249, -98, -31, -109, -149, -8, -77, -115, -48, -215, -65, -222, -184, +127, 213, -180, -2, -169, -135, -155, -230, -175, -54, +202, +81, +176, +6, +242, +236, +20, 191, -229, -12, -186, -170, -199, -204, -136, -134, -76, -69, -87, -205, -84, -232, -222, -218, -119, -129, -247, -168, -26, +41, +193, +75, +108, 89, -96, -114, -29, -40, -190, -170, -74, -140, -88, -119, -225, -204, -114, +134, 145, -96, -23, -43, -207, -79, -190, -233, -6, -214, -136, -239, -190, -120, -187, -81, -8, -237, -44, -8, -247, -128, -93, -170, -93, -211, -1, -58, -7, -251, -77, -0, -225, -121, -249, -94, -172, -150, -52, +212, +80, +112, 17, -179, -63, -52, -172, -135, -185, -55, -153, -203, -195, -96, -66, -104, -123, -180, -15, -29, -11, -194, +127, +120, +69, +50, +183, +244, +189, 100, -86, -17, 163, -98, -217, -49, +46, +47, +254, +165, +4, +199, +160, +135, +74, +250, +188, +216, +131, 224, -26, -59, -190, -98, -82, +97, +142, +50, +201, +203, +2, +31, +37, +7, +107, +228, +221, +104, +116, +219, 242, -111, -176, -86, -138, -51, -73, -168, -202, -182, -183, -35, -220, -174, -152, +225, +93, +241, +85, +33, +88, +114, +186, +3, +204, +153, +217, 135, -227, 123, -160, -3, -149, -96, -181, -237, -0, -60, -81, -90, +121, 30, +198, 137, -120, -186, -81, -103, -109, -13, -126, -226, -205, -197, -64, -226, -109, -155, -255, -219, -180, -240, -159, -203, -50, -35, -72, -150, +142, +199, 238, -171, -51, -85, -124, +133, 28, -173, -226, -185, -157, -68, -78, -16, +131, +40, +169, +243, +90, +73, +209, +110, +56, +99, 79, -117, -240, -128, -43, +167, +220, 178, -8, -135, -43, -209, -65, -86, -84, +250, +109, +58, +45, +230, +44, +110, +25, +219, +191, +91, +33, +98, +191, +173, +88, +188, +167, +165, +160, +158, +203, +187, +81, +86, +145, +95, 102, +37, +21, +4, +7, +135, +107, +174, +56, +223, +199, +11, +9, +247, +91, +159, +91, +192, +64, +45, +80, +146, 189, -74, -104, -237, -236, -81, +184, +252, +247, +111, +171, 48, -73, -242, -53, -101, -84, -250, -245, -138, -175, +249, +137, 254, -119, -113, -15, -14, -92, +91, +131, 176, -112, -246, -199, -192, -41, -32, -156, +4, +128, 231, -98, -61, -235, -164, -31, +233, +62, +99, 45, -178, -205, -164, -215, -20, -106, -181, -61, -246, -174, -198, -64, -25, -201, +141, +253, +44, +203, +134, +217, 212, +71, +54, +192, +186, +239, +159, +236, +129, +243, +88, +15, +4, +4, +2, +94, +237, 195, -133, -113, -201, -66, -93, -135, -27, -113, -233, -61, -178, -45, -209, -56, -230, -41, -181, -199, -65, -97, -90, +191, +2, +225, +210, +17, +139, +151, +92, +37, +107, +59, +81, +107, 120, +50, +245, +50, +42, +236, +201, +124, +21, +124, +62, +106, +112, +31, +150, +200, +76, +201, +9, +245, +145, +4, +246, +239, +80, 203, -133, -179, -180, -125, -126, +145, +146, +42, +138, +237, +79, +45, +91, +241, +62, +246, +76, +131, +205, +229, +198, +245, +8, +165, 66, -250, -135, -218, -1, -116, +241, +244, +229, +40, +106, +103, 127, -216, -22, -232, -109, +175, +145, +32, +220, 190, -127, -213, -4, -96, -58, -30, -235, -166, +102, 30, -147, -129, -183, -79, -33, -119, -70, -239, -81, +153, +253, +47, +19, +100, +105, +22, +72, +66, +49, 222, -30, -60, -87, -73, -227, +204, +152, +162, +90, +216, +35, +91, +184, +97, +149, 172, -89, -192, -161, +14, +25, +14, +94, 160, -194, -126, -124, -48, -27, -0, -148, -235, -92, -32, +97, +201, +175, 126, -56, -0, -214, -242, -190, -164, -235, -56, -251, -18, -173, -211, -101, +181, +165, +122, 232, -63, -131, -216, +187, +116, +111, +58, +163, 247, +253, +182, +125, +213, +25, +25, +165, 186, -58, -231, -244, -111, -153, -173, -254, -205, -45, -191, -31, -13, -237, 139, -150, +102, +239, +59, +77, +179, +76, +115, 209, -229, -50, -109, +238, +182, +63, +28, +25, +37, +152, +203, +118, 119, -251, -110, -48, -106, -157, -27, -93, -42, -243, -109, -191, -55, -186, -79, -166, -109, -59, +35, 163, -150, +164, +122, 209, -53, -146, -194, -96, -236, -171, -65, -243, -67, -190, -40, -141, +172, +221, +185, +238, +140, +58, +70, +217, +244, +162, +101, +255, +118, +212, +237, +247, +134, +70, +9, +237, +162, +233, +104, +208, +108, +117, +140, +114, +216, +69, +195, 86, -41, -31, -106, -12, +191, +215, +235, +180, +70, 47, -53, -189, -161, -250, -114, -165, -85, -78, -167, -48, +101, 178, +111, +107, +170, +38, +192, +255, +85, +163, +217, +112, +212, +28, 221, -188, -190, -125, -219, -52, -43, -168, -67, -93, -12, -174, -46, -202, -204, -153, -55, -203, +13, +237, +118, +119, +40, +6, +237, +180, +141, +196, +64, +180, +31, +116, 134, -211, -170, -29, +253, +235, +15, +221, +222, +149, +145, +44, +136, +198, +173, +102, +111, 36, -167, -219, -238, -252, -106, +122, +232, 24, -202, -150, -111, -90, -152, -170, -86, -229, -30, -234, -224, -195, -221, -59, -27, -158, -5, -77, +201, +132, +108, +79, +148, +171, +163, +235, +136, +134, +58, +122, +145, +227, +58, 2, -218, -212, -166, -223, +146, +31, +93, +225, +155, +142, +136, +164, +124, +251, +231, +93, 103, -98, -165, -243, -128, -46, -154, -94, -180, -94, -167, -205, -116, -222, -205, -211, -102, -202, -6, -48, -144, -167, +152, +35, +93, +71, +78, +68, +235, 139, +126, +251, +163, +145, +144, +20, +24, 214, -155, -172, +239, +217, 157, -129, -40, -93, -40, -155, -70, -235, -69, -60, -109, -247, +193, +160, +63, +48, +146, +24, +190, +80, +183, +124, 67, -214, -206, -64, -128, -138, -123, -220, -64, -134, -168, -105, -65, -14, -180, -222, +116, +160, +23, +78, +248, +93, 182, -213, -14, -148, -233, -26, -200, -16, -53, -45, -142, -109, -32, -73, -170, -142, -121, -109, -32, -70, -173, -187, -225, +100, +111, +191, +211, +145, +152, +180, +253, +240, +151, +238, 168, -159, -161, -97, -188, -222, -32, -74, -186, +245, 158, -154, -91, -126, -198, -94, -138, -2, +79, +221, +190, +29, +244, +71, +253, +86, +255, +122, +168, +116, +165, +35, +63, +105, +87, 188, -106, -74, -31, -193, -96, -30, -43, -163, -111, -202, -41, -18, -229, -25, -182, -215, -161, -61, +131, +86, +103, +56, +204, +201, 223, -71, -29, -90, -77, -151, -200, -214, +119, 58, +18, +148, +246, +208, +255, +57, +147, +60, +179, +105, 180, +6, +157, 166, -46, -21, -40, -10, -181, -80, -160, -149, -11, -176, -128, -83, -199, -143, -183, -220, -163, -171, -38, -32, -24, -128, -44, -23, -166, -182, -191, -92, -162, -56, -244, +186, +250, +231, +102, +164, +55, +91, +173, +206, +109, +190, 189, -45, -6, -150, -49, -126, -215, -6, -247, -193, +17, +225, +61, 190, -249, -54, -193, -199, -60, -27, -164, -198, -70, +136, +205, +59, +190, +247, 7, -162, +93, +190, +184, +0, +29, +210, 237, -248, -203, -185, -22, -180, -80, -6, -10, -251, -140, -107, -100, -47, -38, -151, -238, -78, -31, -145, -103, +93, +246, +7, +55, +77, +88, +94, +165, 83, -221, -230, +157, +29, +161, +116, +138, +171, +219, 233, -175, -142, -148, -183, -139, -236, -221, -205, -77, -113, -125, 41, -107, -77, -231, -11, -113, -155, -155, -212, -235, -110, -30, -173, -246, -105, -246, -39, -148, -67, -221, -130, -182, -249, -183, +58, 250, -69, -86, -227, -101, +59, +157, +61, +145, +246, +192, +255, +209, +25, +109, +232, +68, +103, +111, +100, +203, +218, +28, 140, -62, -43, -239, -9, -60, +186, +205, +235, +13, +221, 232, -4, -85, -31, -209, -177, +108, 146, -169, -114, -87, -92, -147, -235, +180, +155, +155, +187, 235, -190, -153, -17, -23, -189, -116, -149, -23, -121, -47, -46, -67, -189, -117, +81, +215, +38, 217, -122, -165, -174, -200, -16, -168, -247, +87, +250, +208, +217, +48, +105, +31, +221, +27, +251, +110, 168, -37, -248, -106, -181, -219, -186, -0, -224, -82, -98, -142, -89, +174, +210, +185, +57, +9, +183, +215, +92, +90, 222, -192, +247, +187, +92, +84, +51, +69, +101, +38, +108, +55, +253, 15, -227, -248, -73, -146, -98, -35, -37, -137, -6, -98, +29, +126, +8, 118, +248, 250, -97, -141, -0, -146, -179, -237, -228, -29, -173, -86, -198, -212, -123, -164, -131, -222, -102, -238, -140, -197, -251, -72, -231, -142, -133, -5, -102, -80, -214, -93, -45, -192, -177, -55, -3, +246, +56, 71, -223, -113, -35, -162, -13, -237, -65, -243, -189, -145, -43, -67, -182, -75, +174, +63, +42, 29, -41, +25, +137, +221, +101, +255, +174, 215, -253, -225, -208, -204, -161, -177, -177, -139, -107, -254, -143, -231, -124, +86, 26, -58, -102, -80, +27, +201, +220, 176, -92, -37, -21, -226, -22, +195, +55, +204, +232, +125, +103, +160, +116, +96, +40, +95, +35, +62, +149, +118, 247, -108, -254, -112, -123, -248, -51, -123, 178, -159, -125, -148, -50, -182, -138, -227, +219, +81, 137, -19, -76, -106, -214, -107, -156, -240, -69, -184, -130, -124, -106, -4, -214, +48, +146, +176, +59, 218, -243, -12, -168, -211, -154, -233, -255, -79, -248, -84, -15, -245, -46, -187, 247, -38, -187, -185, 191, -253, -85, -245, -16, -179, -119, +170, +44, 48, -154, +146, +174, +81, +231, +230, +182, +63, +104, +14, +62, +114, 97, -207, -51, +109, 119, -138, -24, -51, -117, -21, -223, -131, -181, -35, -0, -251, -189, -32, +7, +170, +250, +127, +103, +38, +28, +23, +205, +182, +212, +228, +217, 9, -87, -93, +98, +182, +176, +119, +61, 177, -34, -150, -126, -29, -83, -134, -202, -214, -62, -139, -0, -190, -85, 137, -139, -216, -112, -103, -127, -83, -195, -235, -17, -237, -117, -188, -110, -31, -211, -125, -144, -145, -18, -47, -153, -62, -12, -73, -61, -196, -196, -41, -49, -100, -68, -190, -4, -83, -83, +255, 165, -231, -248, -85, -7, -215, -49, -3, -250, -119, -152, -83, -218, -238, +112, +228, +123, +67, +45, 216, -239, -186, -195, -238, -133, -225, -19, -137, -210, 252, -109, +120, +211, +193, +163, +244, +159, +119, +124, 62, -95, -80, -11, -8, -34, -107, -221, 106, -222, -142, -238, -212, -116, -154, -10, -198, -68, -155, +63, +70, +203, +203, +213, +199, +69, +183, +221, 238, -185, -185, -48, -61, -50, -50, -190, -132, -72, -61, -160, -180, -115, -143, -104, -110, -198, -225, -122, 244, -153, -23, -240, -153, -243, -94, -44, -6, -221, -96, -120, -157, -81, -228, -222, -198, +148, 14, -172, 140, +151, +55, +47, +96, +223, +155, +173, +173, 48, -8, -148, +102, +160, +159, +230, +245, 117, -172, -177, -252, -148, -5, -51, -47, -200, -194, -251, -100, -232, -119, -50, -119, -0, -104, -241, -47, -177, -181, -132, -212, -13, -215, -114, -34, -168, +255, +151, +220, +92, +140, +22, +25, +187, +64, +21, +219, +84, +193, +156, 190, -129, -33, -124, -24, -124, -27, -135, -214, -98, -53, -153, -91, +55, +211, +32, +40, 103, -86, -155, +168, +102, +57, +127, +187, 45, -89, -224, -66, -4, -111, -24, -80, -19, -234, -8, -226, -120, -23, +212, +173, +155, +216, 108, -49, -230, -27, -38, -5, -223, -115, -101, -136, -96, -154, -27, -210, -128, -158, -32, -113, -3, +36, +53, +66, +98, +236, +81, +247, +166, +211, 191, -119, -195, -9, -110, -94, +83, +37, +199, +244, +24, +190, +188, +238, 170, -212, -252, -192, -124, -255, -207, -130, -118, -154, -13, -197, -155, -59, -62, 182, -129, -179, -22, -38, -228, -136, -64, -194, -19, -168, -70, -141, -129, -190, +203, +119, +127, +51, 105, -28, -241, -50, -10, -193, -28, -133, -50, -225, -137, -172, -236, -108, -100, -77, -58, +127, +213, +239, +41, +124, 121, -68, -184, -99, -29, -231, -34, -192, -220, -155, -82, -221, -110, -117, -125, -23, +107, +36, +181, +215, +157, +222, +213, +232, +253, +6, 78, -50, -153, -51, -88, -83, +188, +53, +60, +190, +59, +124, +22, +237, +46, +178, +245, +178, +217, +189, 206, +117, +101, +36, +187, +146, +169, +176, +78, +163, 143, -111, -92, -54, -69, -54, -211, -80, -13, +246, +168, +223, +183, +175, +155, +131, 43, -8, -225, -3, -136, -147, -6, -118, -136, -48, -80, -83, -219, +117, 134, -77, -230, -97, -181, -40, +70, +162, +44, +251, +187, +27, +116, 169, -103, -232, -247, -48, -93, -5, -134, -16, -191, -56, -89, -197, -43, -0, -253, -196, -156, -4, -110, -205, -139, -149, -55, -142, -104, -135, -130, -236, -101, -172, -49, -51, -218, -197, -16, +179, +190, +98, +99, +124, +255, 214, -137, -160, -182, -97, -225, -153, -209, -176, -184, -73, -37, -129, -115, -249, -95, +76, +99, +245, +134, +119, +183, +92, +229, +240, +211, +158, +75, 120, -151, -140, +187, +219, +180, +71, +31, 111, -43, -252, -90, -123, -66, -57, -77, +85, +202, +140, 36, -182, -146, -152, -39, -252, 91, -62, -159, -240, -217, -20, -207, -65, -104, -9, -159, -172, -127, -189, -217, -52, -219, -254, -61, -196, -93, -111, -253, -86, -254, -115, -247, -73, -181, -33, -18, -254, -79, -29, -204, -135, 80, -248, -121, -182, -243, -204, -249, -165, -83, -188, -246, -254, +198, +251, +26, +52, +123, +87, +36, 233, -23, -41, -33, -187, -91, -203, -19, -43, -143, -172, -65, -221, -220, -192, -170, -241, -181, 67, -197, -99, +46, +153, +195, +203, +110, +94, 212, 223, -197, -221, -104, -164, -244, -247, -70, -237, -79, -8, -128, -102, -127, -255, -236, -127, -24, -142, -186, -173, -95, -138, -36, -210, -219, -237, -159, -254, -25, -198, +26, 137, -55, -249, -108, +122, +231, +215, +91, +174, +9, +155, +155, +151, +194, 72, +190, +239, +122, +194, +44, +3, +114, +196, +130, 100, -218, -105, -129, -206, -31, -100, -167, -79, -212, -171, -25, -169, -195, -214, -160, -211, -233, -217, -163, -254, -93, +125, +157, +27, +45, 235, +117, +191, +245, +179, +74, +201, +185, +209, +34, +210, +60, +0, +158, +172, +211, +227, +106, 173, -25, -242, -13, -53, -108, -15, -154, +165, +146, +97, +182, +130, +183, 87, -70, +131, +102, +187, +179, +65, +224, +205, +204, 129, +46, +183, +103, +6, +61, +110, +217, +12, +59, +131, +15, +157, +65, +193, +10, +255, +193, +236, +232, +128, +133, +239, +222, +112, +227, 2, +148, +191, +122, +13, +49, +59, +61, +224, +16, +187, +226, +150, +236, +47, 205, -86, -142, -37, -27, -94, +143, +74, +23, +134, 118, -141, -142, -231, -166, -80, -197, -198, -135, -244, -254, -29, -22, -47, -228, -136, -57, -244, -145, -112, -4, -77, -254, -223, -171, -107, -77, -181, -106, -105, -61, -90, -90, -97, -86, -209, -140, -85, -20, +193, +224, +3, +183, +110, 224, +48, +251, +192, +89, +158, +19, +195, 31, -91, -205, -113, -237, -126, -33, -188, -95, -95, -53, -221, -87, -77, -247, -101, -104, -186, -194, -183, -194, -167, -140, -235, -175, -223, -42, -101, -99, +204, +142, +16, +65, +201, +154, +114, +252, +193, +236, +32, 129, -113, +231, +49, +155, +115, +120, +8, +226, +140, 59, -90, -96, -232, -70, -193, -235, -249, -85, -9, -127, -85, -194, -21, -149, -240, -77, -248, -213, -220, -252, -170, -132, -191, -96, -37, -188, -233, -69, -102, -251, +68, +238, +64, +165, +71, +163, +109, 215, -184, -113, -190, +229, +155, +248, +242, +178, +219, 234, +194, +73, +59, +28, +113, +3, +226, +74, +157, +164, 209, -175, -122, -116, -175, +14, +1, +130, +58, +191, +142, +64, +40, +21, 122, -244, -23, -246, -244, -85, -131, -126, -213, -160, -95, -168, -6, -141, -231, -222, -52, -49, -48, -71, -29, -223, -228, -107, -120, +54, +169, 96, -137, -66, -223, -160, +141, +151, +192, +238, +109, 5, -231, -158, -99, -106, -29, +204, +186, +238, +173, +117, 27, -217, -211, +133, +73, +56, +9, +125, +43, +94, +45, +225, +193, +44, +133, +214, +213, +14, +157, +227, +157, +76, 36, -113, -218, -159, -111, -139, -178, -217, -222, +62, +29, 98, -21, -120, -59, -26, -124, -61, -102, -190, -30, -51, -198, -199, -12, -122, -238, +244, +174, +245, +148, +2, 191, -122, -77, +118, +111, +31, 190, -30, -55, -95, -143, -155, -227, -29, -55, -194, -233, -179, -112, +135, +10, +189, +56, 226, -207, -250, -115, -54, -112, -15, -173, -165, -131, -63, -115, -242, -109, +153, +53, +106, +221, +126, +203, +91, +203, +239, +33, +190, +46, +72, +203, +160, +39, +22, 78, -138, -218, -222, -96, -230, -135, -99, -199, -183, -13, -168, -17, -45, +147, +197, +214, +73, 12, -136, -18, -45, -140, -105, -59, -148, -51, -205, -13, -87, +47, +175, +252, 99, -159, -77, -124, -111, -242, -249, -185, -86, -95, +155, +158, +60, +239, +27, +244, +211, +144, +69, 15, -232, -175, -7, -116, -185, -3, -250, -171, -71, -237, -235, -1, +44, +186, +63, +61, +227, 253, -245, -128, -254, -122, -64, -255, -209, -14, -232, -136, -249, +202, +186, +191, +240, +188, +31, +39, +192, +26, +11, +50, 8, -187, +253, +21, +16, +32, +71, 104, -66, -93, -218, -198, -128, -190, +88, +227, +48, +153, +91, +99, +63, +156, +124, +150, +37, +114, +147, +57, +120, +38, +177, +94, +176, +254, +59, +39, +118, +253, +192, +108, +57, +214, +75, +254, +230, +90, +222, +60, +215, +35, +227, +144, +160, 180, -141, -49, -133, -24, -42, -158, +14, +165, +36, +172, 145, -183, -201, -189, -187, -177, -197, -122, +78, +246, +204, +18, +223, +184, +25, +135, +148, 210, -219, -142, -22, -59, -200, -250, -106, -59, -124, -181, -29, +141, +88, +130, +62, +224, 140, +52, +13, +61, +43, +178, +194, +254, 109, -135, -33, -198, -97, -182, -35, +197, +86, +44, +159, +194, +125, +144, 103, -246, -213, -116, -248, -106, -58, +224, +34, +75, +90, 124, -41, +93, +19, +224, +8, +18, +68, +133, +59, +9, +46, +16, +8, 166, -195, -87, -85, -247, +184, +205, +60, +179, +168, +214, +37, +125, +222, +109, +231, +11, +91, +242, +134, +194, 85, -213, -149, -84, -117, -163, -112, 53, -153, -127, -213, -117, -95, -117, -221, -87, -93, -247, -85, -215, -253, -17, -117, -221, -141, -179, -172, -128, -63, -48, -228, -122, -195, -103, -144, -248, -128, -25, -111, -11, -39, -112, -102, -144, -76, +176, 101, -86, -56, -105, -71, -47, -150, -36, -212, -154, -67, -113, -30, +52, +44, +255, +134, 203, -247, -226, -68, -86, -75, -145, -201, -107, -152, -84, -231, -5, -74, +22, +139, 162, -94, -1, -84, -127, -17, -186, -144, -125, -186, -163, -188, -81, -181, -228, +112, +119, 197, -132, -224, -223, +202, +205, +254, +121, +228, +28, +38, +9, +199, +251, +240, 74, -84, -26, -8, -120, -3, -190, +87, +201, +212, +122, +33, +214, +146, +104, +131, +104, 191, -177, -189, -165, -93, -111, -74, -109, -117, -38, -26, -115, -190, -120, -244, -123, -206, -184, -22, -159, -123, -24, -248, -79, -50, -129, -80, -249, -83, -127, -73, -168, -111, 84, -187, -134, -235, -12, +114, +144, +73, +110, +158, +159, +13, +193, 78, 47, -231, -34, -103, -124, -3, -88, -6, -197, -68, -156, -25, +121, +227, +44, +195, +248, +167, +56, +101, +37, +200, 158, -29, -34, -17, -145, -255, -221, -40, -251, -111, -198, -204, +16, +51, +209, +151, 0, -172, -159, -41, +15, +115, +130, +103, +25, +68, +152, +114, +87, +56, +171, +254, +108, +177, +128, 147, -178, -27, -183, -182, -168, -194, -175, -24, -84, +71, +232, +91, +149, +217, +235, +184, 46, -161, -174, -64, -44, -80, -84, -144, -77, -134, -103, -202, -18, -224, 255, -199, -14, -184, -225, -119, -226, -25, -17, -111, -141, -105, -109, +89, +155, +191, +37, +118, +110, +121, +22, +59, +130, +133, +16, +33, +12, 66, -21, -21, +42, +104, +69, +153, +227, +108, +98, +139, +101, +242, +44, +10, +166, +34, +234, +163, +16, +57, +107, +238, +44, 151, -203, -53, -110, -102, -168, -231, -80, -154, -90, -194, -11, -214, -169, -60, -99, -206, -210, +12, +120, +42, +23, +129, +116, +157, +235, +185, 1, -246, -93, +45, +64, +34, +62, +177, 158, -182, -88, -145, -135, -74, -132, -109, -133, -61, -40, +89, +34, +148, +168, +224, +210, +22, +241, 187, -0, -195, -125, -9, -75, -142, -249, -101, +55, +134, +240, +162, +40, +127, +181, +171, +221, +97, +16, +37, +56, +213, +129, +97, 210, -218, -149, -90, -83, -72, -128, -5, -61, -154, -82, -145, -233, -161, -93, +173, 220, -86, -177, -39, -115, -200, -149, -90, -5, -197, -48, -75, -216, -177, -102, -44, -224, -103, -199, -68, -147, -99, -21, -21, -172, -0, -146, -102, +109, +55, +248, +132, +23, +33, 110, -203, -129, -146, -88, -234, +98, +47, 201, -37, -127, -115, -28, -228, -28, -64, -95, -72, -56, -219, -0, 74, -95, -5, -9, -221, -202, -251, -220, -199, -180, -4, -189, -208, -69, -240, -211, -189, -27, +219, +138, +157, +62, +181, +2, +198, +64, +165, +83, +112, +78, +60, +15, +87, +190, +11, 226, -179, -34, -113, -122, -88, -12, -69, -122, -246, -8, -84, +134, 65, -212, -232, -114, -73, -50, +99, +206, +20, +202, +205, +166, +106, +33, +6, 72, -24, +249, +165, +207, +18, +138, 39, -251, -102, -15, -34, -97, -145, -199, +155, +70, +12, 116, -39, -2, -150, -234, -88, -173, +5, +30, 13, -125, -204, +148, +2, +103, +45, +248, +9, +10, +95, +71, +88, +104, +55, +20, +76, +45, +31, +228, +186, +201, +48, +200, +137, +126, +79, +189, +154, +105, +218, +132, +185, +14, +126, +105, +118, +71, +166, +78, +249, +98, +31, +109, +149, 8, 77, -164, -6, +115, +48, +215, +65, +222, +184, +213, 180, -49, -96, -72, -14, -181, -221, -166, -10, -96, -26, +2, +169, +135, +155, +230, +175, +54, +191, +229, 12, +186, +170, +199, +204, +136, +134, +76, +69, +87, +205, +84, +232, +222, 218, -32, -214, -234, -181, -107, -159, 119, -203, -45, -20, -234, -113, -109, -239, +129, +247, +164, +26, +89, +96, +114, +29, +40, +190, +170, +74, +140, +88, 119, -65, -67, -93, -246, +225, +204, +114, +145, +96, +23, +43, 207, -144, -147, -127, -222, -86, -21, -24, -108, -55, -248, -141, -166, -2, +79, +190, +233, +6, +214, +136, +239, +190, +120, 187, +81, +8, +237, +44, +8, +247, 128, -74, -112, +93, +170, +93, +211, 1, -111, -131, -6, -156, -227, +58, +7, 251, -214, -127, -160, -79, -11, -135, -142, -184, -177, -151, -96, -21, -209, -243, -182, -181, -156, -63, +77, +0, +225, 121, -177, -55, -209, -54, +249, +94, +172, +150, +52, +17, +179, +63, +52, +172, 199, -75, -244, -108, -225, -124, +185, +55, +153, +203, +195, +96, +66, +104, +123, +180, +15, +29, +11, +194, +100, +86, +17, +163, 98, -43, -113, -62, +217, +49, +224, +26, +59, +190, +98, +82, +242, +111, +176, +86, +138, 51, -235, +73, +168, +202, +182, +183, +35, 220, -26, -115, -99, -27, -12, -120, -48, -107, -150, -75, -110, -127, -58, -214, -100, -21, -39, -252, -188, -200, -250, -48, -50, -38, -65, -34, -129, -34, -91, +174, +152, +135, +227, +123, +160, 3, -87, -50, -80, -130, -26, +149, +96, +181, +237, +0, +60, +81, +90, +30, +137, +120, +186, +81, +103, +109, +13, +126, +226, 205, -84, -42, -24, -2, -8, -123, -193, -91, +197, +64, +226, +109, +155, +255, +219, +180, +240, +159, +203, +50, +35, 72, -59, -172, -153, -113, -2, -126, +150, +238, +171, +51, +85, +124, +28, +173, +226, +185, +157, 68, 78, -156, -89, -55, -124, -54, -112, -171, +16, +79, +117, +240, 128, -91, +43, +178, 8, -31, -200, -186, -157, -63, -1, -31, -46, -66, -247, -233, -188, -93, -166, -72, -163, -156, -220, -254, -53, -179, -98, -83, -236, -156, -87, -9, -61, -129, -132, -143, -15, +135, +43, +209, +65, +86, +84, +102, 189, -42, -23, -7, -92, -149, -241, -1, -87, -101, -227, -188, 74, -172, -202, -216, -115, -226, -221, -107, -66, -95, -213, -124, -152, -209, -32, -135, -59, -203, -170, 104, -229, -107, +237, +236, +81, +48, +73, +242, +53, +101, +84, +250, +245, +138, +175, +254, 103, -12, -181, -131, -20, -212, -121, -39, -200, -151, +113, +15, 14, -124, -86, -37, -183, -40, -106, -128, -188, -24, -174, -23, -47, -125, +92, +176, +112, +246, +199, +192, +41, +32, +156, 231, -9, -107, -62, -35, -134, -140, -139, -149, -252, -116, -149, -48, -146, -66, -96, -67, -19, -141, -110, -27, -86, -136, +98, +61, +235, +164, +31, 45, -17, -249, -197, -89, -37, -225, -67, -196, -53, -175, -168, -11, -42, -132, -235, -163, -160, -239, -147, -5, -101, -134, -206, -172, -110, -146, -206, -148, -140, -249, -8, -102, -11, -95, -67, -69, +178, +205, +164, +215, +20, +106, +181, +61, +246, +174, +198, +64, +25, +201, +212, +195, +133, +113, +201, +66, +93, +135, +27, +113, +233, +61, +177, +45, +209, +56, +230, +41, +181, +199, +65, +97, 90, -0, -2, -226, -255, -228, -52, +120, +203, 133, -252, +179, +180, +125, +126, +66, +250, +135, +218, +1, +116, +127, +216, +22, +232, +109, +190, +127, +213, 4, +96, +58, +30, +235, +166, +30, +147, +129, +183, +79, +33, +119, +70, +239, +81, +222, +30, +61, +87, +73, +227, +172, +89, 192, -238, -196, -88, -22, -84, -39, -244, -38, +161, +160, +194, +126, +124, 48, +27, +0, 148, -177, +235, +92, +32, +126, +56, +0, +214, +242, +190, +164, +235, +56, +251, 18, +173, +211, +101, +232, +191, +128, +216, +247, +182, +58, 231, -82, +244, +111, +153, +173, +254, +205, +45, +191, +31, +13, +237, +139, +150, +209, +229, +50, +109, +119, +251, +97, 48, -11, -118, -75, -166, -248, -172, -196, -69, -14, -239, -78, -208, -122, -1, -151, 106, -128, -30, -195, +157, +27, +93, 42, -138, -89, -125, -221, -230, -117, -247, -170, -151, -175, -170, -75, +243, +109, +191, 55, -239, -184, -140, -134, -16, -132, -238, -21, -220, -76, -189, -5, -230, -103, -114, -162, +186, +79, +166, +109, +59, +163, +150, +209, 53, -15, +146, +194, +96, +236, +171, +65, +243, 99, -168, +190, +40, +141, +86, +41, 31, -88, -152, -123, -205, -149, -185, +106, +12, 47, -183, +53, +189, +161, +250, +114, +165, +85, +78, +167, +48, +178, +221, +188, +190, +125, +223, 52, +43, +168, +67, +93, +12, +174, +46, +202, +204, +153, +55, +203, 134, -108, -189, -175, -131, -175, +211, +170, +29, +36, +167, +219, +238, +252, +106, +24, +202, +150, +111, +90, +152, +170, +86, +229, +30, +234, +224, +227, +221, +7, +27, +158, +5, +77, +2, +218, +212, 166, -119, -20, +223, +103, +98, +165, +243, +128, 46, -234, -26, -6, -47, -126, -101, -254, -142, -34, -101, -213, -199, -125, -142, 154, -193, -2, -240, -123, -244, -87, -74, -119, +94, +180, +222, +166, +205, +116, +222, +205, +211, +102, +202, +6, +48, +144, +167, +139, +214, +187, +172, +157, +129, +40, 93, -192, -30, -124, -47, 40, -39, -153, -68, -88, +155, +70, +235, +69, +60, +109, +247, +67, +214, +206, +64, +128, +138, +123, +220, +64, +134, +168, +105, +65, +14, +180, +222, +182, 213, -50, -207, -207, +14, +148, +233, +26, 200, -102, +16, +53, 45, -148, -163, 142, -16, -234, +109, +32, +73, +170, +142, +121, 107, -55, -243, -201, -232, -55, -191, -104, -0, -243, -63, -122, -159, -228, -64, -31, -191, -245, -62, -225, -6, -59, -179, -222, -207, -89, 32, -234, -29, +70, +173, 187, -141, -84, -145, -90, -15, +225, +168, +159, +161, +97, +188, +221, +32, +74, +186, +158, +154, +91, +126, +198, +94, +138, +2, +188, +106, +74, +31, +193, +96, 30, +43, +163, +111, +202, +41, +18, +229, +25, +182, 215, -129, -83, -80, -165, -48, -81, 161, -79, -165, -94, -198, -98, -0, -13, -107, -204, -149, -42, -20, -152, -183, -0, -85, -141, -5, -19, -110, -0, -63, -204, -17, +61, +223, +71, +29, +90, +77, +151, +200, +214, +58, +180, +166, +46, +21, +40, +10, +181, +80, +160, +149, 11, -14, +176, +128, +83, +199, +143, +183, +220, +163, +171, +38, 32, -150, -30, -39, -140, -17, -72, -155, -115, -239, -120, -62, -170, -215, -121, 24, -121, +128, +44, +23, +166, +182, 191, -3, -195, -124, -43, -94, -58, -19, -57, -60, -87, -241, -98, -252, -140, -205, -11, -47, -240, -22, -171, -5, -141, -197, -245, -243, -36, 92, -64, -17, -102, -254, -119, -250, -141, -80, -10, -126, -200, -53, -56, -55, -130, -162, -240, -129, -234, -197, 162, -243, -86, -180, -165, -170, -3, -188, -67, +56, +244, +189, +45, +6, +150, +49, 126, -69, -227, -115, -12, -87, -51, -180, -59, -96, -90, -96, -228, -243, +215, +6, +247, +193, +190, +249, 54, +193, +199, +60, +27, +164, 198, +70, +7, +162, +237, +248, 203, -53, -119, -98, -101, 185, -246, -123, -245, -82, -68, -141, -159, -218, -9, -147, -115, -220, +22, 180, -112, -249, -170, -222, -170, -16, -153, -151, -242, -134, -214, -43, -126, -216, -69, -19, -126, -15, -170, -79, +80, 6, -205, -46, -187, 10, -65, -135, -187, -224, -110, -208, -42, -176, -169, -211, -242, +251, +130, +107, +100, +47, +38, +151, +238, +78, +31, +145, +103, +83, +221, +230, +233, +175, +142, 148, -117, -157, -122, -66, -80, -249, -122, -195, -99, -79, -96, +183, +139, 236, -1, +221, +205, 77, -9, -157, -132, -171, -160, -70, -58, -157, -5, -244, -15, -116, -150, -215, -210, -33, -223, -253, +113, +125, +41, +107, +77, +231, +11, +113, +155, +155, +212, +235, +110, +30, +173, 246, -100, -238, -64, -253, -102, -22, -213, -66, +105, +246, +39, +148, +67, +221, +130, +182, +249, +151, +250, +69, +86, +227, +101, +140, +62, +43, +239, +9, +60, +232, +4, +85, +31, +209, 177, +146, 169, -37, -192, -175, -244, +114, +87, 92, -162, -51, -162, -52, -110, -18, -106, -117, +147, +235, +235, +190, 153, -58, -108, -2, -160, -11, -54, -0, -239, -75, -210, -167, -81, -237, -162, -216, -160, -230, -155, -206, -218, -120, +17, +23, +189, +116, +149, +23, +121, 47, +46, +67, +189, +117, +217, +122, +165, +174, +200, +16, +168, +247, +168, +37, +248, +106, +181, +219, +186, +0, 224, -210, +82, +98, +142, +89, +222, +192, +15, +227, +248, +89, +146, +98, +35, +37, +137, +6, +98, +118, +250, +97, +141, +0, +146, 179, -254, -114, -140, +237, +228, +29, +173, +86, +198, +212, +123, +162, +131, +222, 102, -227, -117, +238, +140, +197, +251, +72, 231, -114, -84, -196, -19, -108, -130, -201, +142, 133, -167, -128, -60, -224, -124, -54, -77, -172, -19, -81, -57, -229, -116, +5, +102, +80, +214, +93, +45, +192, +177, 55, -170, -29, -245, -221, -234, -244, -70, -157, -65, -33, -82, -64, +3, +71, +223, +113, +35, +162, +13, 237, -29, -152, -196, -34, -124, -138, -213, -234, -112, -208, -189, -122, -59, -42, -4, -16, +65, +243, +23, +35, +87, +134, 108, +151, +58, +82, +174, +251, +195, +161, +153, +67, +99, +99, +23, +215, +252, +31, +47, +249, +52, +116, +204, 160, -54, -66, -165, -97, -76, -238, -101, -247, -250, -186, -136, -62, -216, -121, -92, -194, +96, +185, +74, +42, +196, +45, +238, +217, +252, 225, -201, -123, -135, -71, -228, -132, +246, +240, +103, +246, +108, +191, +248, +40, +101, +108, +21, +199, +19, +39, +152, +212, +172, +215, +56, 225, -233, -28, -203, -195, -50, -61, -117, -119, -15, -241, -142, -198, -24, -245, -111, -55, -115, -27, -187, -154, -135, -112, -213, -82, -12, 139, -36, -92, -106, -119, -253, -28, -183, -55, -247, -78, -236, -215, +112, +5, +249, +212, +8, +172, +181, +231, +25, +80, +167, +53, +211, +255, +239, +240, +185, 30, +234, +93, +246, 224, -162, -63, -82, -43, -187, -157, +77, +118, +115, +127, +251, +171, +234, +33, +102, 239, -30, -96, -28, -38, -73, -184, -208, -30, 96, -211, -2, -108, -236, -126, -252, -196, -205, -36, -192, +52, +195, +158, +103, +238, +20, +49, +102, +234, +42, +190, +7, +107, +71, +0, +246, +123, +65, +18, +174, 186, -5, -35, -11, -87, -92, -88, +98, +69, 44, +253, +58, 166, -129, -15, -215, -96, +12, +149, +173, +125, +22, 1, -189, -188, -226, -83, -142, -235, -218, -75, -143, -77, -52, -84, -91, -56, -213, +124, 171, -52, -182, -189, -104, -156, -156, -42, -117, -34, -103, -94, -135, -222, -214, -123, -146, +18, +23, +177, +225, +206, +254, 174, -165, -182, -72, -129, -154, +134, +215, +35, +218, +235, +120, +221, +222, +187, +251, +64, 137, -207, +247, +164, +186, 156, -12, -171, -190, -170, -182, -135, -149, -58, -246, -121, -157, -17, -18, -78, -167, +13, +107, +21, +112, +29, +230, +67, +244, +43, +255, +148, +177, +192, +90, +134, 248, +168, +97, +77, 194, -94, -25, -130, -126, -175, -65, -3, +48, +114, +189, +128, +235, +106, +170, +225, +218, 165, -166, -146, -202, -166, -222, -92, -10, +16, +206, +243, +182, +245, +224, +177, +71, +140, +229, +158, +59, +177, +53, +134, +54, 178, -123, -148, -185, -84, -114, -58, -146, -49, -157, +11, +47, +193, +130, 169, +80, +69, +245, +49, +140, +62, +91, +143, +204, +247, 161, -119, +45, +198, +238, +124, +106, +57, +16, +234, +121, +15, +161, +140, +16, +75, 30, -32, -56, -119, -177, -153, +133, +190, +113, +117, +216, +140, 65, -193, -203, -219, -40, -188, -247, -92, -132, -178, -30, -195, -11, -14, -141, -1, -174, -228, -20, -45, -220, -226, -247, -83, -55, -38, +241, +146, +233, 131, -21, -14, -75, -112, -54, -107, -63, -11, -33, -157, -224, -145, -68, -211, -119, -12, -207, -56, -147, -164, -56, -148, -210, -47, -66, -147, -243, +163, +212, 227, -50, -158, -135, -43, -223, +97, +137, +83, +98, +200, +180, +125, 13, -254, -130, +6, +176, +74, +207, +241, +107, +33, 174, -121, -140, -211, -114, -61, -40, -56, -238, -63, -89, -39, -93, -244, -26, -208, -159, -60, -49, -97, -247, +35, +25, 244, -204, -234, -243, -49, -34, -92, -160, -34, +239, +48, +211, 181, -146, -79, -228, +221, 177, -244, -146, -51, -139, -232, -18, -142, +63, +116, 135, -88, -220, -204, -23, +221, 11, -116, +195, 135, +27, +165, +249, +251, +124, +22, +163, +22, +60, 69, -30, -92, -206, -232, -37, -106, -201, -205, -217, -5, -84, -171, -16, -209, -98, -41, -185, -252, -56, -49, -246, -99, -166, -157, -233, -120, -204, -136, -138, -242, -129, -45, -155, +214, +186, +213, +188, +29, +221, +169, +73, +62, +21, +76, +156, +54, +221, +190, +115, +193, +131, +100, +250, +124, +9, 241, +131, +64, +105, +231, +1, +49, +230, +140, +131, +8, +233, +51, +47, +224, +51, +231, +189, +88, +12, +186, +193, 160, -246, +63, +163, +120, +194, +141, +29, +88, +25, +97, +16, 190, +235, +88, +99, 249, -178, 41, -85, -51, +11, +102, +94, +144, +5, +29, +202, +128, +244, +100, +238, +0, +252, +227, +255, +196, +214, +18, +18, +74, 92, -143, -122, -75, -152, -132, -126, -168, -177, -40, -226, -179, -189, -172, +203, +137, +160, +38, +8, +6, +22, +98, 72, +112, +28, +90, +139, +213, +100, +110, +157, +89, +109, +182, +100, +129, 11, -251, -170, -99, -73, +113, +197, +97, +64, +77, +168, +35, +80, +111, +11, +182, +24, +243, +13, +147, +66, +2, +186, +50, +112, +49, +205, +88, +105, +64, +79, +144, +78, +130, +223, +187, +225, 4, -149, -122, -203, +55, +47, +213, +143, +6, +125, +247, +95, +130, +118, +154, +13, +69, +193, +59, +62, +182, +1, +11, +0, +38, +228, +136, +240, +198, +19, +168, 145, -35, -227, -197, -172, -135, -40, -33, -96, -199, -115, +141, +225, 199, +105, +116, +243, +50, +10, +193, +72, +134, +226, 229, +137, +172, +55, +109, +100, +227, +58, +121, +156, +186, +99, +25, +25, +226, +164, +241, +166, +84, +77, +92, +93, +223, +133, +147, +76, 230, -218, -139, +12, +214, +148, +243, +227, +27, +151, +77, +145, +205, +52, +84, +131, +159, +29, 240, -167, -128, -215, +1, +28, +64, +192, +14, +17, +156, 106, -141, -174, -163, -185, -85, -20, -46, -233, -72, -174, -242, -105, -189, -182, -219, -44, -79, -87, +106, +113, +177, +201, +60, +172, +22, +187, +245, +2, +253, +30, +38, +209, +192, +16, +226, +23, +39, +171, +120, +5, +80, +164, +152, +41, +193, +239, +24, +98, 229, -195, -184, -34, -139, -194, -37, -188, -114, -232, -112, -40, -251, -178, -94, -107, -37, +141, +227, +236, +161, +76, +124, +25, 27, -231, -5, -214, -182, -185, +209, +140, +118, +49, +132, +117, +34, +168, 109, -14, -154, -55, -246, -160, -217, -238, -222, -61, -91, -164, +88, +120, +102, +52, +44, 110, -75, -195, -78, -175, -51, -184, -250, -96, -20, -124, -79, +232, +73, +56, +95, +254, +23, +105, 13, -155, -163, -81, -167, -119, +192, 215, -52, -14, -191, -167, -214, -195, -219, -254, -200, -110, -246, -174, -148, -74, +218, +19, +202, +105, +34, +177, +149, +196, 60, -58, -153, +225, +223, +242, +81, +135, +207, +166, +120, +14, +66, +75, +248, +100, +253, +235, +205, 6, -106, -227, -106, 227, -191, -109, -182, -251, +246, 239, -237, -118, -115, -240, -75, -167, -215, -237, -93, -25, -101, -1, -228, -186, -248, +33, +26, +124, +235, 183, -221, -191, -188, -28, -118, -70, -70, -233, -0, -173, -254, -117, +242, +159, +187, +79, +170, +13, +241, +249, 127, +234, 96, -55, -111, -46, -186, +150, +134, +194, +207, +179, +157, +103, +206, +207, +157, +226, +101, 252, -86, -111, -148, -155, -65, -45, -219, +79, +63, +75, +9, +217, 221, -203, -203, -187, -161, -25, -239, -168, -229, -240, -182, -211, -186, -187, -110, -14, +90, 158, -19, -21, -45, -91, -54, -96, -29, -215, -203, -153, -179, -45, -153, -75, -95, +88, +121, +188, +15, +234, 230, -21, -125, -41, +6, +86, 141, -218, -24, -115, -4, -208, -209, -106, -197, -248, -92, -101, -65, -189, -26, -105, -187, -105, -217, 175, -68, -91, -214, -167, -179, -173, -215, -48, -106, -100, -54, -34, -250, +29, +42, 30, -248, -230, -246, -221, -216, -200, -76, -124, +163, 254, -182, -217, -130, -191, -210, -123, -134, -36, -236, -147, -12, -16, -48, -212, -141, -62, -156, -99, -142, -239, -111, -29, -107, -136, -159, -40, +46, 238, -20, -154, +70, +35, +165, +191, +119, 106, -153, -135, -145, -195, -60, -138, -34, -203, -69, +127, +66, +0, +52, +251, +251, +71, +255, +227, +112, +212, +109, +253, +92, 36, -118, -198, -158, -134, -133, -44, -149, -222, -31, -246, -232, -197, -9, -213, -77, -98, -233, -91, -23, -113, -131, -247, -247, +145, +94, +148, +255, +244, +143, +48, +78, +188, +201, +103, +67, 34, -159, -76, -55, -207, -171, -204, -58, -76, -86, -81, -28, -70, -132, -62, -176, 211, -98, -8, +78, +11, +116, +254, +32, +59, +125, +166, +94, 205, -171, -1, -202, -149, -160, -113, +72, +29, +182, +6, +157, +78, +207, +30, +245, +239, +90, +239, +205, +240, +120, +168, +97, +123, +208, +188, +50, +10, +95, +104, +182, +114, 44, +217, +240, 222, -133, -135, -17, -6, -252, -134, -229, -185, 108, -125, -97, -156, -85, -156, -5, -155, -136, -152, -17, -111, -106, -5, -140, -185, -228, -232, -53, +116, +60, +55, +133, +42, 54, -125, -149, -9, -214, -245, -126, -163, -53, -185, -50, -171, -179, -112, -30, -109, -159, -5, -51, -157, -64, -112, -120, -102, -41, -191, 62, -124, -36, -124, -219, -205, -158, -162, -178, -103, -155, -162, -118, -129, +164, 247, +239, +70, 121, -208, -110, -244, -50, +37, +71, 204, -215, -136, -2, +161, +143, 132, +35, +104, +242, +255, +92, +93, +107, +170, +85, +75, +235, +209, 210, -125, -36, -165, -19, -158, -25, -97, -37, -233, -205, -58, -38, -69, -236, -123, +10, +179, +138, +102, +172, +162, +0, +255, +216, +106, +142, +107, +247, 11, -184, -108, -15, -169, -18, -152, -245, -157, -21, -177, -69, -120, -47, -222, -160, +225, +147, +251, +170, 233, -143, -37, -86, -89, -101, -84, -93, -171, +190, +106, +186, +47, +67, +211, +21, +190, +21, +158, +110, 92, -134, -69, -103, +127, +253, 86, -119, -202, -231, -232, -197, -22, -13, +41, +27, +11, +140, +219, +209, 2, -143, -241, -65, -72, -243, -36, -134, -25, -191, -246, -57, -152, -230, -99, -59, -82, -180, -235, -211, -162, -34, -161, -8, -151, -147, +3, +74, +10, +190, +216, 175, -28, -13, -215, -16, -187, -82, -106, -79, -101, -210, -24, -165, -80, -110, -167, -130, -176, -203, -178, -113, -186, +74, +248, +171, +18, +174, +168, +132, +111, +194, +175, +230, +230, 87, -187, -117, -28, -52, -109, -105, -255, -232, -125, -146, -163, -225, -211, -63, -196, +37, +252, 5, -172, -226, -52, -48, -32, +43, +225, +77, +239, +68, 219, -179, -197, -64, -138, -188, -140, +191, +198, +141, 243, 85, -230, -203, -17, -198, -63, -39, -106, -102, -32, -238, -138, -128, -61, -108, -250, -198, -113, -75, -48, -7, -242, -159, -83, -222, -212, +143, +126, +213, +163, +123, +213, +163, +63, +179, +231, +175, +26, +244, +171, +6, +253, +66, +53, +104, +60, +247, +166, +137, +129, +57, +234, +248, +38, +95, +139, +23, +96, +131, 22, -27, -161, -203, +156, +123, +142, +169, +117, +108, +100, +79, 147, +196, +105, +127, +190, +45, +246, +103, +123, +139, +85, +224, +237, +104, +240, 245, -16, -9, +152, +249, +122, +204, +24, +31, +51, +232, +185, +255, +234, +53, +249, +122, +220, +124, +61, +110, +142, +119, +220, +8, +167, +207, +194, +137, +63, +235, +207, 217, -172, -92, +192, +61, +180, +150, +164, +254, +194, +201, +183, +57, +85, +107, +123, +3, +138, +5, +179, +13, +168, +17, +45, +12, 136, -68, -204, -38, -145, -78, -10, -199, -62, -22, -157, -198, -210, -89, +18, +45, +140, +105, +59, +148, +51, +205, +13, +87, +99, +159, +77, +124, +111, 242, -52, -116, -135, -221, -179, -232, -41, -219, -233, -176, -149, -69, +249, +165, +86, +95, +15, 232, -36, -172, +175, +7, 116, -108, -189, +185, +3, 250, -235, 171, -18, +71, +237, 235, -41, -39, +1, +253, +245, +128, +254, +122, +64, +255, +209, +14, +232, +136, +249, +8, +6, +105, +66, 93, -231, -106, -106, -76, -118, -125, -45, -169, -81, -153, -149, -244, +218, +198, +128, +190, +180, +141, 49, -223, -247, -72, -89, -19, +133, +24, +42, +158, +145, +183, +201, +189, +187, 177, -55, -11, -28, -159, +197, +122, +42, +222, +142, +22, +59, +200, +250, +106, +59, +124, +181, +29, 140, +109, +135, +33, +198, +97, +182, +35, 103, -250, -183, -162, -251, -108, -241, -78, -252, -170, -38, -61, -57, -130, -122, -132, -98, +246, +213, +116, +248, +106, +58, +124, +41, +166, +195, +87, +85, +247, +85, +213, +149, 84, -254, -47, -198, 117, -59, -132, -211, -202, -160, -45, -184, -1, -68, -162, -64, -97, -108, +163, +112, +53, +153, +127, +213, +117, +95, +117, +221, +87, +93, +247, +85, +215, 253, -210, -249, -96, -227, -83, -171, -21, -174, -217, +17, +117, +221, +141, +179, +172, +128, +138, +48, +228, +122, +195, +103, +144, +248, +128, +25, 111, +11, +39, +112, +102, +144, +76, +101, 86, -161, -167, +206, +105, +71, +47, +150, +36, +20, +83, +124, +29, +203, +247, +226, +68, +214, 112, -154, -240, -46, -240, -2, -225, -96, -121, -70, -199, +145, +201, +107, +152, +84, 231, -19, -9, -32, -134, -137, -243, -118, -234, -65, -224, -46, -216, -27, -11, -198, -229, -51, -240, -226, 5, -156, +74, +162, +94, +1, +234, +127, +17, 186, -174, -231, -248, -225, -108, -235, +144, +125, +186, +163, +232, +82, +181, +228, +197, +132, +64, +233, +74, +212, +63, +8, +120, +3, +190, +191, 177, -66, 189, -111, -97, -20, +165, +93, +5, +75, +109, +117, +38, +26, +115, +190, +120, +244, +123, +206, +184, +22, +159, +123, +24, +248, +207, +50, +129, +80, +249, +83, +127, +73, +88, 116, -51, -171, -143, +84, 81, -239, -37, -71, -72, -51, -226, -96, -113, -131, -234, -57, -174, -241, -111, +135, +235, +12, +78, +47, 231, -4, -228, -63, -203, -189, -149, -4, -108, -56, -119, -150, -44, -159, -58, -147, -254, -74, -243, -138, -121, -141, -247, -61, -104, -132, -55, -188, -243, -54, -95, -23, -126, -52, -198, -176, -40, -33, -38, -153, -25, -188, -138, -236, -238, -10, 34, -173, -31, -194, -232, -115, -204, -13, -136, -207, -252, -48, -193, -212, +103, +124, +3, +88, +6, +37, +78, +156, 25, -223, +158, +29, +34, 17, -215, -22, -140, -45, -12, -66, -12, -194, -11, -31, -48, -84, -121, -28, -186, -79, -96, -72, -207, -66, -249, -166, -30, -176, -25, -226, -141, -89, +145, +255, +221, +40, +251, +111, +198, +204, 96, -161, -158, -89, -61, -254, -121, -4, -65, -128, -16, +181, +95, +40, +222, +178, 27, +77, +183, +168, +194, +175, +24, +212, +83, +161, +174, +64, 44, -238, -169, -145, -55, -243, -92, -145, -122, -211, -16, -149, -102, -169, +80, +84, +144, +77, +134, +103, +202, 18, -104, -176, -225, +138, +18, +140, +29, +112, +195, +239, +68, +89, +34, +222, +26, +211, +218, +132, +218, +46, +46, +151, 107, +220, +204, 80, -45, -222, -68, -102, -234, -48, -15, -31, -92, -198, -12, -12, -121, +101, +162, 52, -254, -248, -55, -16, -242, -48, -153, -179, -9, -167, -219, -153, -193, -219, -10, -148, -180, 181, -168, -200, -33, -215, -173, +132, +98, +172, 83, -120, -46, -40, -145, -197, -195, -165, -223, -215, -201, -23, -161, -239, -74, -188, -8, -167, -161, -181, -176, -52, -212, -79, -185, -228, 15, -162, -96, -239, -69, -189, -213, -24, -218, -242, -36, -2, -51, -53, -18, -242, -74, -100, -43, -230, -248, 199, -15, -77, -124, -149, -203, -138, -2, -135, -32, -104, +156, 165, -238, -215, -123, -207, -105, -44, -114, -178, -52, +3, +236, +187, +60, +109, 177, -85, -222, -111, -111, -248, -214, -184, -14, -195, -42, -48, -26, -208, -133, -229, +34, +15, +149, +8, +219, +10, +198, +80, +118, +1, +134, +251, +18, +150, +28, 243, -62, -214, -158, -87, -23, +203, +164, +181, +43, +136, +8, +72, +128, +5, +61, +154, +82, +145, 233, -95, -178, -135, -86, +161, 93, -213, -100, -216, -171, -213, -228, -122, -40, -68, -61, -144, -253, -29, -255, -4, -174, -178, -136, +220, +86, +17, +49, 115, -151, -79, -238, -30, -212, -135, -124, -121, -189, -91, -114, +120, +154, +90, 101, -0, -9, -126, -222, -132, -14, -52, 206, +48, +75, +216, +177, +102, +44, +224, +103, +199, +68, +147, +99, +21, +21, +172, +128, +183, +102, +46, +161, +55, 168, -8, -174, +39, 151, -214, -71, -201, -148, -79, +252, +205, +113, +240, +124, +0, +125, +33, +225, +108, +3, +128, +127, +21, +186, +116, +43, +239, +115, +31, +211, +18, +244, +66, +23, +33, +89, +247, +110, 136, +207, +138, +196, +233, +97, +49, +20, +233, 217, -65, -41, +35, +80, +5, +81, +163, +203, 37, -194, -239, -230, -194, -143, -253, -33, -55, -209, -252, -88, -224, -9, -40, -93, -160, +201, +32, +97, +156, +236, +155, +61, +136, +207, +69, +30, +211, +157, +184, +92, +170, +99, +181, 54, -228, -230, -122, -34, -78, -213, +76, +52, +35, +52, +145, +26, +48, +208, +128, +33, 57, -222, +44, +121, 155, -98, -12, -197, -134, -99, -19, -211, -78, -32, -17, -2, -16, -19, -62, -14, -39, -44, -96, -217, +234, +146, +105, +48, +104, +131, 88, -252, -251, -9, -38, -167, -187, -167, -13, -107, -21, -248, -80, +171, +215, +174, +125, +222, 45, -216, -161, +183, +80, +168, +199, +181, +189, +223, +5, +13, +117, 217, +63, +0, +215, +230, +188, +173, +42, +48, +216, +110, 240, -79, -129, -51, -248, +27, 77, -188, -130, +5, +118, 1, +245, +233, +2, +222, +6, +13, +56, +199, +247, +173, +127, +67, +159, +22, +14, +29, +113, +99, +47, 193, -74, -36, -136, -144, -5, -224, -102, -68, -168, -38, -169, +218, +166, +231, +109, +107, 57, -106, -79, -33, +127, +246, +98, +111, +162, +109, +142, +151, +232, +217, +194, +249, +196, +86, +226, +124, +102, +214, +185, +53, +230, +198, +54, +24, +240, +96, +214, +44, +151, +220, +254, +116, +172, +201, +42, +78, +248, +121, 145, -234, +245, +97, 100, -204, -202, -95, -3, -20, -137, -205, -168, -154, -185, -73, -0, -165, -82, -5, -93, -107, -191, -238, -231, -193, +76, +130, +68, +2, +69, +182, +6, +218, +101, 160, -215, -31, +4, +53, +154, +169, +84, +48, +4, +16, +246, +130, +183, +144, +118, +88, +51, +227, +4, +252, +136, +156, +56, +179, +110, +248, +108, +224, +86, +1, +183, +16, +62, +144, 117, -47, +59, +127, +6, +62, +92, +132, +238, +243, +121, 187, -45, -244, +12, +140, +144, 156, -219, -239, -111, +220, +254, +53, +179, +98, +83, 236, +156, +87, +9, +61, +129, +132, +143, +15, +189, +42, +23, +7, +92, +149, +241, +1, +87, +101, +227, +188, +74, +172, +202, +216, +115, +226, +221, +107, +66, +95, +213, +124, +152, +209, +32, +135, +59, 203, -126, -235, -110, +170, 104, -119, -205, +229, +107, +103, +12, +21, +141, +20, +44, +124, +39, +200, +23, +52, +124, +81, +37, +183, +40, +106, 128, -112, -54, -119, -210, -191, -51, -115, -131, +188, +24, +174, 23, -123, -249, -215, -93, -119, -100, -15, -58, -255, -186, -235, -12, -71, -70, +47, +125, +231, +25, +43, +81, +35, +134, +140, +139, +245, +5, +117, +149, 48, -57, +146, +66, +96, +67, +19, +141, +110, +27, +86, +136, +45, +17, +249, 197, -142, -238, -122, -68, -80, -177, -175, -114, -248, -57, -55, -124, 89, -188, -160, 37, -106, -179, +225, +99, +196, +53, +175, +168, +86, +42, +132, +235, +147, +160, +239, +222, +130, +226, 71, -69, -159, -183, -248, -165, -54, -146, -206, -98, -233, -131, +103, +86, +55, +73, +103, +74, +198, +124, +4, 179, +133, +175, +161, +78, +46, +0, +1, +241, +127, +114, +154, +66, +126, 2, -250, -76, +96, +119, +98, +44, 11, -190, -71, -250, -16, -58, -155, -155, -91, -77, -215, -69, -204, -28, -8, -229, -20, -127, -165, -124, -40, -110, -189, -241, -251, -176, -252, -178, -70, -92, -28, -206, +106, 38, -110, -31, -249, -126, -156, -75, -172, -99, +122, +19, 24, -145, -98, -16, -222, -178, -231, -96, -59, -140, 202, -8, -32, -0, -219, -6, -29, -248, -227, -247, -155, -129, -59, -182, +88, +137, +115, +41, +152, +5, 187, -121, -159, -143, -247, -8, -82, -67, -155, -255, -184, -247, -215, -71, -162, -24, +37, +83, +124, +86, +226, +34, +135, +119, +39, 104, -79, -7, -219, -153, -235, -73, -77, -248, -1, -176, +189, +128, +75, +53, +64, +143, +97, +109, +199, +172, +234, 111, -212, -183, -106, -178, +243, +186, +123, +213, +203, +215, +250, +165, +155, +119, +41, +248, +55, +65, +232, +94, 193, -47, -70, -158, -147, -207, -185, -100, -113, -184, -138, -12, -36, -163, -153, -139, -69, +205, +212, +91, +96, +126, +38, +39, +90, +243, +48, +134, 250, +129, +133, +121, +208, +92, +153, +135, +114, +75, +99, +200, +214, +135, +58, +248, +106, +122, +71, +225, +162, +174, +97, +240, +226, +87, +230, +239, 40, -219, +82, +86, +125, +220, +231, +168, +25, +44, +128, +228, +71, 127, -66, -59, -23, -67, -40, -64, -210, -65, 165, -195, -99, -63, -252, -123, -198, -66, -78, -179, -0, -52, -210, -58, +116, +215, +5, +236, +209, +247, +130, +114, +146, 73, -137, -76, -202, -199, -44, -14, -147, +132, +85, +45, +62, +253, +130, +108, +214, +66, +57, +234, +8, +161, 190, -20, -61, -63, -22, -158, -175, -11, -209, -211, -90, -28, -19, -37, -203, -251, +118, +51, +159, +140, +126, +243, 139, +6, 48, -166, -108, -156, -143, -249, -40, -176, -79, -233, -233, -75, -81, -80, -19, -39, -138, -32, +255, +147, +119, +47, +7, +250, +244, 173, -94, -82, -198, -123, -183, -166, +119, +143, +27, 236, -193, -154, +204, 250, +101, 206, -108, -45, -220, -9, -14, -111, -78, +2, +81, +133, +217, +109, +164, +138, +212, +122, +244, +184, 14, -191, -74, -243, -99, -56, -121, -96, -44, -192, -33, -36, -45, -34, -206, -10, -9, -136, -196, -21, -117, -182, +156, 130, -175, -57, -133, -230, -22, -62, -144, -160, -129, -61, -131, -95, -149, -141, -191, -169, -146, -248, +42, 133, -7, -58, -205, -252, -19, -242, -75, -154, -1, -73, -56, -155, -65, -176, -24, -220, -220, -34, -126, 137, -135, -244, -147, -49, -155, -59, -247, -30, -255, -17, -189, -2, -17, -220, -159, -240, -233, -204, -26, +10, +125, +42, +245, 50, 150, -75, -189, -188, -188, -110, -94, -217, -127, -37, -196, -4, -68, 40, -43, -99, -32, -19, -83, -170, -249, -98, -170, -113, -124, -139, -133, -253, -66, -121, -6, -226, -54, -247, -116, -212, -31, -125, -117, 104, +88, +99, +174, +84, +161, +236, +189, +5, +168, +106, +44, +152, +112, +3, +248, 113, -51, -92, -126, -34, -178, -166, -229, -215, -226, +142, +88, +112, +0, +177, +244, +52, +97, +140, 64, -197, -24, -29, +218, +156, +7, +199, +243, +81, +189, 206, -164, -192, -181, -23, -8, -245, -176, -107, -69, -22, +195, +200, +251, +29, +24, +230, +91, +241, +210, +153, +200, 225, -122, -237, -49, -173, -253, -139, -131, -80, -214, +185, +138, +23, +227, +103, +108, +94, +120, +129, +183, +88, +45, +104, +44, +174, 159, -196, -73, -144, -154, -172, -128, -249, -7, -15, -195, +39, 225, -212, -186, -184, -238, -244, -218, -246, -77, +2, +74, +67, +243, 191, -221, -177, +211, 111, -186, -191, -102, -25, -34, -13, -245, -47, -205, -118, -59, -247, -243, +132, +82, 240, -238, -226, -204, -250, +67, +174, +193, +185, +17, +20, 133, -177, -37, -248, -230, +143, +84, +197, 22, -30, -62, -47, -59, -9, -161, -233, -21, -58, -228, -215, -19, -174, +157, +183, +162, 45, -197, -59, -153, -74, -14, -120, -115, -249, +213, +66, +224, +29, +242, +43, +26, +159, +99, +184, +154, +161, 221, +1, +211, 2, -93, +35, +159, +183, +49, +94, +174, 185, -64, -206, -210, -249, -109, -197, -26, -148, -140, +19, +43, +203, +181, +223, +171, +151, +34, +106, +252, +212, 78, -254, -150, -108, -42, -120, -239, -161, -189, -194, -255, -157, -204, -185, -134, +152, +156, +227, +166, +133, +203, +215, +26, +87, +133, +200, +188, +192, +56, +180, 94, -206, -29, -250, +241, +195, +46, +154, +240, +123, +80, +125, +50, +104, +118, +217, +85, +8, +58, +220, +5, +119, +131, +86, +129, +77, +157, +22, +205, +172, +235, +212, +19, +130, +202, +215, +27, +30, +123, 2, -95, +99, +15, +104, +74, +232, +36, +92, +5, +53, +210, 233, -200, -177, -13, +44, +160, +127, +160, +179, +188, +150, +14, +249, +238, +183, +39, +115, +7, +170, +74, +179, +168, +22, +138, +77, +45, +1, +126, +165, +231, +18, +157, +17, +165, +113, +147, +80, +107, +222, 212, -68, -78, -204, -251, -255, +97, +19, +0, +93, +176, +1, +120, +95, +146, +62, +141, +26, +28, +197, 6, -142, -33, -87, +53, +223, +116, +214, +198, +123, +5, +151, +158, +245, +151, +99, +52, +27, +175, +59, +151, +163, +34, 158, +96, 19, -67, -22, -221, +76, +46, +60, +5, +228, +1, +231, 179, +105, +98, +157, 136, -223, -110, -192, -12, -4, -254, -225, -14, -43, -149, -146, -166, +122, 46, -98, -29, -111, -114, -95, -215, -175, -190, -245, -195, 167, -0, -110, -120, -48, -92, -63, -13, +187, +81, +237, +168, +239, +86, +167, 55, -155, -248, +234, +12, +138, +56, +131, +74, +239, +192, +36, +22, +225, +83, 172, -222, -64, -185, -28, -69, -199, -76, -109, -196, -164, -80, -76, -221, -218, -205, -25, -241, -89, -37, -231, -25, -229, -102, +86, +135, 131, -148, -75, -43, -208, -114, -35, -231, +238, +213, +251, +81, 33, -32, -9, +128, +96, +3, +181, +17, +42, +13, +99, +114, +47, +187, +215, +215, +69, +244, 193, -227, -239, -125, -119, -208, -185, -28, -52, -111, -58, -217, +206, 211, -21, -255, -252, -186, +18, +14, +79, +222, +59, +60, +34, +39, +12, +79, +231, +88, +30, +150, +233, +169, +187, +123, +136, +15, +52, +198, +168, +127, +187, +153, 219, -235, +216, +213, +60, +132, +171, +150, +98, 88, -203, -8, -158, -155, +36, +225, +82, +187, +235, +151, +184, +189, 185, -209, +119, +98, +191, +246, +0, 23, -163, -195, -151, +253, 145, -128, -10, -79, -177, -197, -237, -57, +90, +111, +238, +124, 247, -1, -236, -53, -254, -185, -42, -67, +0, +227, +48, +73, +194, +133, +246, +0, +155, 22, -160, -85, -50, -8, -243, -7, -55, -71, +96, +99, +247, +227, +103, +110, +38, +1, +214, +45, 24, -37, -228, -167, -63, -65, +89, +184, +226, +194, +98, +49, +13, +124, +184, +6, +11, +232, +245, +149, +196, +114, +92, 215, -115, -27, -35, -239, -127, -53, -126, -38, -154, -21, -152, -87, -175, -27, -239, -203, -101, -155, -190, -187, -5, -103, -241, -174, -59, -236, 94, -40, -177, -142, -34, -55, -240, -74, -206, -154, -19, -32, -146, -73, -229, -171, -20, -255, -13, -152, -95, -248, -222, -34, -52, -138, -65, -198, -35, -14, +122, +108, +162, +161, 218, -238, -223, -241, -49, +194, +169, +94, +253, +179, 237, -97, -183, -221, -105, -23, +165, +236, +228, +84, +169, +19, +57, 243, -6, -47, -66, -96, +58, +244, +182, +222, +147, +116, +45, +21, +79, +10, +212, +76, 124, -20, -2, -254, -171, -51, +230, +100, +8, +250, +85, +181, +61, +172, +212, +177, +207, +235, +140, +144, +112, +58, +197, +23, +246, +202, +16, +244, +123, +13, +26, +40, +53, +149, +84, +54, +245, +230, +82, +144, +221, +163, +204, +165, +146, +211, 145, -87, +140, +233, +76, +13, +125, +240, +0, +193, +185, +139, +205, +12, +202, +112, +222, +70, +225, +131, +231, +34, +148, +245, +24, +94, +112, +104, +12, +112, +37, +167, +104, +225, +22, +191, +159, +186, +49, 25, -96, -141, -252, -57, -129, +172, +112, +88, +130, +179, +89, 251, -38, +89, +8, +233, +4, +143, +36, 154, -124, -192, -68, -82, +190, +99, 120, -217, -163, -217, -58, -121, +198, +153, +36, +197, +161, +148, +126, +17, 154, -68, -117, -123, -239, -58, +156, +31, +151, +241, +60, +92, +249, +110, +240, +63, +232, +154, +199, +56, +45, +215, 131, -145, -125, -217, -108, +50, +232, +254, +179, 117, -138, +210, +69, +175, +1, +253, +201, +19, +19, +118, +79, +207, +172, +62, +31, +35, +194, +5, +42, +82, +43, +249, +68, +30, +75, +47, +57, +179, +136, +46, 225, -170, -127, -186, +120, +136, +197, +205, 124, -142, -158, -48, -114, -233, -117, -55, -126, -32, -132, -154, -170, -148, +177, +64, +119, +88, +228, +193, +229, +140, +94, +162, +150, 220, +156, +93, +64, +13, +13, +17, +45, +150, +146, +203, +143, +19, +99, +63, +102, +218, +153, +142, +199, +140, +168, +40, +31, +216, +178, +25, +15, +106, +239, +155, +47, +155, +82, +53, +195, 245, -32, -130, -83, -97, -141, -72, +168, +183, +132, 73, -28, +232, +135, +26, +139, +34, +62, +219, +203, 138, -251, -220, -137, -204, -25, -57, -21, -111, -202, 180, +176, +175, +58, +150, +68, +80, +169, +183, +28, +57, +50, +94, +205, +122, +136, +18, +2, +118, +60, +119, +92, +110, +174, +189, +10, +127, 10, +120, +173, +214, +232, +58, +154, +91, +69, +225, +146, +142, +228, +42, +159, +214, +107, +187, +205, +242, +116, 85, -135, -237, -247, -212, -36, -81, -157, -136, -213, -252, 62, +140, +43, +178, 40, -184, -233, -254, -52, -18, +92, +194, +43, +135, +14, +135, +178, +47, 235, -148, +181, +86, +178, +113, +94, +97, 109, -33, -160, -22, -119, -145, -19, -83, -190, -58, -4, -104, -85, +155, +219, +230, 160, -248, -162, -123, -125, -125, -209, -111, -14, -218, -246, -168, -127, +121, +99, +15, +154, +237, +238, +221, +139, 165, -70, +243, +182, +52, 236, -254, -88, -144, -226, -135, -48, -242, -249, -241, -27, +244, +58, +131, +171, +143, +70, +193, +247, +212, +176, 57, -65, -12, -160, -69, -232, -165, -13, -23, -203, -85, -66, +26, +117, +122, +119, +77, +227, +240, +123, +106, +61, +188, +237, +143, +236, +102, 239, +74, +169, +196, 163, -99, -126, -114, -142, -67, -190, -45, -183, -209, -211, -80, -31, -84, -65, -43, -240, -67, -146, -95, 147, -195, -104, -61, -249, -115, -51, -165, -55, -205, -95, -11, +105, +160, +54, +174, +54, +254, +251, +102, +187, +255, +139, +221, 110, -67, +14, 126, +238, +244, +186, +189, +43, 163, -47, -6, -5, -225, +44, +128, +92, +23, +255, +178, +251, +151, +151, +195, +206, +200, +40, +29, +160, +213, +191, +238, +15, +236, +230, 205, -121, -103, -127, -111, +69, +151, +223, +234, +141, +114, +51, +168, +101, 187, -189, -145, -221, -238, -180, -154, -215, -70, -225, -185, -216, -172, -127, -219, -252, -215, -93, -199, -190, +123, +121, +121, +55, +52, +227, 29, -240, -255, -223, +181, 28, -14, -141, +222, +118, +90, +119, +215, +205, +193, +75, 162, -116, -177, -131, -94, -95, -68, -23, -27, -5, -116, +162, +101, 203, -166, -237, -206, -237, -232, -45, -64, -141, -191, -55, -10, -235, -198, -230, -42, -7, -117, -100, -19, -183, -16, +6, +172, +227, +122, +57, +115, +182, +37, +115, +233, +203, +188, +162, +47, +165, +81, +27, +99, +142, +0, +58, 90, -88, -215, -246, -117, -243, -230, -130, -239, -109, +173, +24, +159, +171, +44, +168, +87, 35, -126, 109, +55, +45, +251, +149, 104, -111, -191, -31, -52, -111, +203, +250, +116, +182, +245, +26, +70, 141, -120, -166, -118, -114, -57, -232, -12, -123, -157, -107, -35, -198, -169, -237, -71, -125, -67, -40, -122, -181, -113, -235, -110, -56, -234, +204, +70, +68, 223, -216, +3, +223, +220, +190, +27, +27, +153, +137, +47, 223, -149, -102, -161, -232, -224, -181, -25, -40, -253, -122, -7, -231, -102, -224, -244, -235, -29, -188, -49, -114, -191, -231, -237, -236, -226, -41, -119, -39, -94, -127, -34, 54, 91, -249, -78, -180, -102, -48, -115, -27, -3, -189, -4, -39, -228, -103, +240, +87, +122, +207, +144, +132, +221, +203, +0, +1, 67, -205, -239, -2, -184, -13, -186, -217, +221, 232, -252, -153, -114, 195, -210, -61, -53, 57, -2, -243, -87, +230, +248, +254, +214, +177, 134, +248, +137, 226, -249, -7, -52, +78, +161, +169, +150, +121, +24, 57, -174, -139, -230, -195, -58, -41, -107, -138, -104, -233, -0, -16, -26, -87, +204, +163, +40, 178, -108, -58, -133, -151, -126, -110, -59, -240, -219, -11, -215, -105, -83, -143, -44, -12, -74, -92, -116, -217, -196, -241, -53, -148, -85, -254, -250, -82, -60, -6, -129, -182, -120, -37, -124, -157, -122, -244, -197, 92, -3, -91, -241, -34, -252, -156, -81, -24, -42, +68, +98, +103, +236, 105, -149, -51, -241, -154, 88, -226, -229, -131, -155, -1, -143, -111, -74, -32, +200, +82, +233, +253, +97, +79, +94, +156, +80, 221, -191, -121, -124, -3, -215, -43, -222, -218, -114, -29, -126, +36, +150, +190, +117, +17, +55, +120, +127, +175, +242, 201, -225, -31, -235, -58, +116, +243, +188, +202, +172, +195, +100, +21, +197, 97, -149, -166, -233, -4, -223, -180, -173, -40, -164, -187, -18, -57, +68, +232, +3, +59, +45, +134, +208, +188, +70, +161, +92, +9, +26, +199, +226, 93, -57, -163, -217, -153, -213, -146, -201, -160, +120, +24, +97, +192, 111, -172, -123, -124, -151, -23, -241, -251, +88, +158, +203, 214, -99, -227, -9, -191, -251, -157, +23, +198, +89, +197, +89, 176, +137, +136, +25, 241, -249, -170, -16, -216, -221, -100, -130, -117, -67, -48, -92, -71, -194, -232, -243, -190, -169, -49, -62, -141, -10, -199, -236, -3, -64, +166, +86, +192, +152, +75, +142, +94, +99, +211, +87, +153, +96, +93, 239, +55, +90, +147, +43, +179, +58, +11, +231, 201, -200, -30, -110, -37, -206, -195, -25, -128, -238, -129, -79, -216, -139, -133, -39, +246, +89, +48, +211, +9, +4, +135, +103, +150, +242, 235, -227, -72, -30, -117, -102, -15, -134, -46, -120, -107, -249, -85, -85, -245, -231, -87, -181, -167, -149, -62, -101, -24, -25, -241, -176, -204, -13, -128, -173, -124, -37, -225, -117, -67, -248, 195, -27, -3, -234, -176, -51, -75, -216, -146, -233, -123, -125, -121, -226, -178, -197, -144, -229, -121, -15, -115, -175, -244, -2, -126, +71, +194, +183, +221, +236, +41, +42, 123, -80, -128, -162, -114, +182, +41, +106, +23, +120, +159, +7, +237, +70, +47, 195, -201, +124, 141, -98, -182, -104, -206, -116, -10, -215, -32, -209, -115, -181, -117, -67, -182, -80, -132, -9, -84, -123, -216, -39, +40, +64, +40, +221, +71, +82, +58, +225, 153, -133, -174, -1, -22, +17, +86, 146, -194, -158, -84, -122, -173, -19, +222, +172, +99, +82, +196, 190, -91, -166, -43, -31, -94, -29, -225, -237, -94, -44, -181, 183, -160, -74, -7, -226, -255, -58, -247, -161, -7, -120, -43, -43, -161, -208, -162, -40, -140, -140, -47, -169, -168, -9, -74, -76, -113, -251, -163, -252, -163, -87, -128, -217, -72, -219, -107, -58, -142, -151, -115, -207, -220, -133, -160, -176, -88, -76, -105, -51, -107, -27, 128, -136, +203, +246, +144, +42, +129, +89, +223, +89, +17, +91, +132, +15, 226, +13, +154, +254, 88, -51, -126, -22, -112, +98, +149, 85, -246, -232, -137, -39, -28, -216, -81, -198, -126, -35, -208, -155, -123, -228, -28, -246, +70, +213, +181, +202, +101, +88, +116, +102, +117, 167, -197, -186, -103, -38, +124, +142, +94, +108, +209, +32, +240, +24, +31, +132, +52, 79, -68, -61, -59, -119, -174, -163, -73, -229, -27, -206, -55, -113, -195, -100, -139, -134, -48, -206, -106, -7, -167, -68, -169, -169, -226, -49, -193, -111, -50, -128, -136, -16, 98, -90, -154, -187, -154, -36, -228, -228, -128, -153, -62, -210, -162, -86, -218, -254, -48, -209, -167, -151, +152, +241, +107, +159, +131, +105, 62, -209, -167, -61, -77, -244, -247, -151, +182, +35, +69, +187, 62, -209, -223, -247, -49, -209, -116, -140, -125, -234, -242, -172, -215, -205, -251, -205, -148, +45, +42, +18, +138, +112, +57, +249, 202, -71, -48, -127, -140, -77, -133, -237, -49, -21, -85, -116, -137, -35, +209, +112, +13, +177, +43, +165, +246, +84, +38, 141, -192, -212, -5, -1, -15, -225, +81, +10, +229, +118, +42, +8, +187, +44, +27, +167, +123, +181, +91, +199, +65, +211, +150, +246, 79, -234, +222, +189, +28, +13, +159, +254, 33, -165, -196, -123, -153, -39, +46, +96, +21, +167, +129, +1, +217, +158, +45, +6, +82, +228, +101, +156, +175, 50, -225, -92, -185, -209, +95, +142, +48, +254, +41, +81, +51, +3, 113, -255, -5, -204, 87, -89, -231, -125, -76, -61, -189, -8, +4, 236, +113, +211, +55, +142, +91, +130, +57, +144, +255, +156, 242, 166, -63, -218, -213, -15, -211, +182, +216, +8, +93, +158, +172, +135, +72, +200, +102, +229, +66, +36, +98, +54, +137, +116, +82, +56, +246, +177, +232, +52, +150, +206, +146, 167, -242, -125, -156, -203, -62, -126, -215, -239, -99, -45, +161, +59, +236, +129, +69, +207, +217, +78, +135, +173, +44, +66, +39, +97, +165, 99, +235, +205, +159, +223, +148, +88, +79, +57, +233, +58, 87, -132, -6, -74, -198, -161, -33, -243, -134, -118, -180, -188, -40, -212, -197, +83, +99, +178, +235, +107, +73, +141, +202, +172, +164, +143, +249, 190, -35, +71, +202, +154, +136, +189, 89, -34, -199, +224, +248, +100, +60, +211, +191, +21, +221, +103, +139, +119, +226, +55, +53, +233, +201, +17, +212, +35, +20, +163, +242, +127, +49, +174, +219, +33, 156, -178, +86, +6, +109, +193, +13, +32, +18, +5, +10, +99, +235, +231, +206, +71, +27, +159, 90, -156, -232, -95, -252, +173, +112, +205, 126, -123, -56, -138, -245, -106, -60, +179, +10, +61, +133, +211, +132, +119, +129, +23, +8, +7, +203, +51, +58, 62, -110, -90, -143, -237, -69, -27, 159, -204, -62, -255, -125, -199, -231, -91, -203, -60, -234, -223, -222, -207, -75, +8, +20, +47, +6, +55, +245, +212, +131, +192, 93, -223, -207, -173, -27, -193, -89, -202, -118, -72, -117, +176, +55, +22, 140, -118, -88, -242, -206, -62, -116, -239, 203, -116, -77, -178, +103, +224, +197, +11, +56, 117, -46, -96, -90, -113, -249, -198, -23, -78, -8, -45, -127, -78, -231, -215, -49, -170, -116, -119, -84, -243, -16, -24, -221, -111, -211, +93, +207, +241, +195, +217, +214, +99, +133, +122, +223, +194, +40, +232, +102, +86, +31, +163, +126, +145, +28, +33, +205, +136, +131, +197, +13, 170, -91, -54, -25, -70, -166, -124, -222, -254, -248, -252, -106, -75, -107, -77, +231, +184, +198, +191, 157, -54, -169, -21, 19, -235, -24, -114, -101, -114, -91, -223, +144, +255, +44, 247, -216, -58, -215, -103, -179, -245, -45, -117, +86, +18, +176, +225, +220, +89, +178, +124, +234, +76, +250, +43, +205, +43, 230, -236, +53, +222, 247, -214, -106, -70, +160, +17, +222, 240, -134, -107, -235, -254, -81, -40, -81, +206, 219, -249, -123, -102, -181, +124, +93, +248, +209, +24, +195, +162, 132, -127, -172, -151, -244, -103, -172, -250, -82, -84, -167, +152, +100, 102, -110, -29, -65, -210, -59, -204, -242, -151, -71, -112, -118, -46, -151, -177, -166, -77, -149, -231, -38, -107, -90, -179, -143, +240, +42, +178, +187, +43, +136, +180, +134, +10, 212, -154, -150, +49, +55, +32, +62, +243, +195, +4, +83, +103, +124, 71, -224, -158, -165, -206, +92, +91, +48, +182, +16, +138, +84, +243, +43, +92, +248, +136, +161, +202, +227, 208, -0, -75, -117, -139, -134, +125, +6, +67, +122, +22, +202, +55, 245, -165, +128, +205, +16, +111, +204, +2, +11, +245, +204, +234, 241, -109, -248, -220, -183, -149, -236, -46, -22, -172, -46, -86, -73, +207, +35, +8, 2, +132, +216, +96, +113, +79, +141, +188, +153, +231, +138, +212, +155, +134, +168, +52, +75, +149, +64, +131, +13, +95, +131, +106, +241, +38, +50, +83, 135, -119, -22, -238, -46, -127, +121, +248, +224, +50, +102, +96, +200, 163, -155, -39, -178, -100, -19, -8, -77, -27, -99, -51, -138, -109, -25, -67, -120, -109, -108, -173, -150, -240, -248, -112, -27, -46, -87, -75, -24, -74, -0, -59, -76, -124, -111, -242, -89, -228, -119, -232, -36, -146, -148, -237, -223, -26, 241, -79, -255, -18, -67, -194, -116, -146, -60, -89, -11, -124, -9, -3, -20, -152, -196, -114, -67, -204, -72, -141, -249, +199, 191, -249, -7, -255, 129, -42, -93, -142, -53, -103, -254, -146, -243, +144, +135, +201, 156, -24, -132, -61, -141, +77, +56, +221, +206, +12, +222, +86, +160, +164, +173, +69, +69, +14, +185, +110, +157, +194, +115, +65, +137, +44, +30, +46, +253, +190, +78, +190, +8, +125, 87, -62, -122, +226, +69, +56, +13, +173, +133, +165, +161, +126, +202, +37, 127, +16, +5, +117, +214, +61, 175, -238, -186, -102, -134, -32, +64, 34, -213, -1, -89, -155, -119, -122, -190, -108, -164, -110, +48, +83, +35, +33, +175, +68, +182, +98, +142, +127, +252, +208, +196, +87, +185, +172, +40, +112, +8, +130, +86, +234, +126, +189, +247, +156, +198, 34, -190, -50, -207, -52, -73, +39, +75, +19, +91, +229, +253, +246, 134, -176, +111, +141, +235, +48, +172, +2, +163, +1, +93, +88, +62, +239, +99, +237, +121, +117, +145, +254, +37, 123, -248, +104, +213, 85, -130, -184, -99, -118, -147, -216, -154, -235, -238, -140, -195, -21, -38, -162, -196, -243, -240, -225, -149, -246, -118, -217, -75, +77, +134, +189, +90, +77, +174, +135, 66, -245, -13, +212, +3, +217, +223, +241, +79, +224, +42, 139, +56, +119, +249, +228, +30, +64, +125, +200, +151, +215, +187, +37, +87, +6, +144, +224, 231, -213, +77, +232, +64, +227, +140, +138, +224, +122, +105, +125, 146, -47, -212, 76, -8, -148, -150, -20, +185, +71, +204, +14, +74, +41, +17, +126, +55, +23, +126, +236, +15, +185, 137, -21, -202, -68, -177, +230, 199, -111, -232, -65, -141, -162, -29, -141, +2, +79, +64, +233, +2, +181, +33, +55, +215, 19, -47, +113, +170, +206, +241, +222, +20, +99, +40, +54, +28, +155, +152, +118, +2, +137, +16, +128, +152, +240, +105, 56, -121, -148, -116, +97, 1, -75, -9, -46, -169, -50, -163, -53, -44, -215, -163, -204, -67, -72, -4, -244, -62, -197, +203, +198, +226, +223, +79, +48, +57, +221, +61, +109, +88, 171, -104, +192, +135, +106, +193, +14, +205, +134, +127, 10, -128, -238, -16, -216, -121, -102, -117, -28, -46, -169, +156, +193, +111, 226, -87, -89, -119, -14, -198, -168, -248, -44, -97, -254, -147, 21, -51, -200, -166, -72, -100, -85, -94, -74, -62, -76, -163, -68, -241, -57, -48, -9, -49, -186, -6, -243, -34, -219, 12, -22, -196, -122, -240, -98, -136, -22, -181, -22, -48, -9, -244, -1, -46, +8, 86, -126, -226, +34, 65, -158, -150, -164, +132, +44, 0, -230, -198, 55, -204, -20, -99, -168, -224, -29, -68, -34, -146, +35, +66, +53, +73, +205, +81, +123, +10, 137, -15, +84, +39, +99, +86, +254, 26, -105, -74, -182, -200, -37, -151, -249, -141, -48, -147, -55, -109, -9, -129, -102, -197, -225, -52, -121, 160, -228, -13, -64, -190, -85, +72, +108, +70, +213, +204, +77, +2, +40, +149, 42, -126, -167, -67, -166, -153, -39, -102, -119, -44, -23, -66, -129, -163, -229, -92, -187, -100, -43, -252, -119, -223, -41, -70, -155, -144, -131, -20, -162, -94, -2, -10, -119, -142, -30, -226, -65, -85, -32, -177, -237, 232, -213, -244, -190, -89, -95, -208, -46, -226, -172, +90, +251, +117, +63, +15, +6, +189, +254, +168, +123, +217, +109, +161, +231, +220, +254, 229, -166, -148, -193, -140, -85, -12, -193, -205, -241, -169, 198, -76, -129, -42, -203, -87, -67, +190, 236, -187, -9, -80, -20, -223, -114, -98, -251, -235, -160, -193, -138, -96, +183, +238, +134, +118, 215, -242, -201, -45, -168, -211, -82, -67, -240, -153, -58, -224, -91, -205, -64, -98, -94, -233, -126, +12, +8, +103, +115, +39, +253, +59, +51, +55, +120, +177, +151, +127, 222, -40, -73, -208, -111, -114, -73, -54, -150, -136, -235, -17, -221, -157, -156, -26, -58, -1, -1, -205, -73, -106, +117, +71, 246, -19, -9, -151, -131, -17, -233, -244, -75, -82, -28, -159, -40, -120, -159, -138, -106, -225, -247, -182, -231, -62, -138, -228, +160, +243, +207, +187, +206, +112, +100, 4, -47, -62, -251, -56, -142, -62, -189, -250, -63, -175, -191, -251, -249, -213, -255, -249, +147, +83, +236, +232, +174, 71, -250, -255, -135, -82, -131, -163, -214, +4, 21, -74, -153, -242, -220, -211, -160, -88, -194, -196, -115, -44, -101, -149, -212, -148, +251, +42, +135, +159, 115, -254, +195, +151, +197, +11, +90, +162, +54, +123, +84, +244, +121, +139, +95, +106, +35, 233, -237, +44, +150, +62, +56, +43, 160, +207, +180, +224, 123, -211, -29, -117, -223, -117, -236, -219, -126, -183, -55, -26, -54, -148, -223, -64, -48, -243, -218, -47, -236, -225, -104, -208, -189, +164, +15, +161, +179, +185, +185, +213, +116, 93, -251, -237, -117, -191, -159, -251, -37, -255, -8, -81, -84, +196, +204, +129, +80, +78, +241, +87, +202, 135, -155, -126, -185, -222, -71, -250, -151, +226, +214, +27, +191, +15, 203, -102, +47, +107, +196, +197, +225, +108, +226, +246, +145, 239, -204, +199, +185, +196, 58, -105, -194, -241, -23, -132, -9, -107, -144, -97, -38, -176, -253, +134, +17, +41, +6, +225, +45, +123, +14, +182, +195, +168, +140, +0, 2, -215, +176, +109, +208, +129, +63, +126, +191, +25, +184, +99, +187, 155, -128, -33, -231, -37, -4, -140, -150, -1, +247, +229, +120, +143, +32, +53, +180, +249, +143, +123, +127, +125, +36, 138, -240, -121, -227, -161, -3, -7, -21, -154, -119, -75, -44, -7, -220, -16, -113, -166, -248, -20, -33, -194, -134, -79, -55, -179, -115, -52, -103, -162, -162, -37, -149, +129, +246, +116, +176, +157, +185, +158, +212, +132, +31, +0, +251, +70, 125, -146, 171, 38, -227, -87, -176, -152, -26, -48, -142, -164, -12, -104, -192, -69, -3, -204, -148, -137, -204, -216, -159, +27, +252, +98, +228, +57, +249, +156, +75, +22, 135, -190, -139, -168, -243, -175, -168, 171, -87, +200, +64, +50, +154, +185, +88, +164, +79, 178, -126, -230, -98, -236, -5, -20, -36, -196, -59, -111, +253, +61, +218, +185, +24, +66, +1, +146, 14, -6, -205, -15, -246, -101, -127, -112, -211, -28, -217, -127, -229, -43, -17, -127, -182, -82, -59, -201, -234, -15, -112, -62, -92, -72, -230, -152, -62, -173, -126, -12, -33, -202, -157, -95, -249, +42, +29, +30, +251, +225, +223, +51, +22, +114, +154, +5, +160, 145, +214, +73, 74, -101, +100, +82, +62, 102, -69, -52, -16, -32, -4, +113, +152, +244, +165, +232, +229, +177, +240, +124, +93, +136, +158, +214, +226, +152, +40, +89, +222, +95, +132, 49, +101, +227, +124, +202, +71, +129, +221, +167, +167, +47, +69, +65, +77, +156, 40, -63, -75, +130, +180, +122, +73, +25, +239, +221, +154, +178, +71, +107, +234, 59, -9, -240, -236, -94, -169, -116, -231, -43, -69, -81, -237, -76, -196, +179, +181, +112, +39, +56, +188, +57, +57, +252, +42, +205, +143, +225, +228, +145, 177, -167, -191, -160, -69, -113, +0, +135, +144, +180, +136, +56, +43, +36, +32, 18, -224, -115, -161, -12, -92, -255, -243, -233, -25, -4, -195, +87, +212, +217, +10, +190, 230, +20, +154, +91, +248, +64, +130, 6, -239, 246, -218, -124, -108, -47, -109, -40, -184, -5, +12, +126, +85, +54, +254, +166, +74, +226, +23, +30, +232, +52, +243, +123, 228, +151, +52, +3, +146, +112, +54, +131, +96, +49, +184, +185, +69, +252, +18, +15, +233, +39, 99, -161, -56, -120, -190, +54, +119, +30, +60, +254, +35, +122, +5, +34, +184, +63, 225, -166, -134, -19, +211, +153, +53, +100, +44, +151, +122, +121, +121, +221, +188, +178, +255, +76, 136, -68, +9, +136, +80, +86, +198, +64, +38, +166, +84, +243, +197, +84, +227, +248, 22, -39, -160, -253, -37, -70, -16, -34, -158, -50, -140, -224, -206, -232, -40, -177, -21, -194, -229, -228, -150, -128, +11, 251, -80, -10, -185, +149, +242, +12, +196, +109, +238, +233, +168, +63, +250, +234, +208, +226, +102, +184, +252, +68, +100, +77, +203, +175, +197, +129, +138, 49, -183, -183, -14, -81, -124, -43, -53, -166, -210, -4, -158, -143, -96, -55, -126, -66, -121, -48, -79, -161, -17, -228, -19, -190, -161, -70, -225, -18, -161, +58, +156, +73, +129, +107, 47, -74, -164, -86, -194, -0, +16, +234, +97, +215, 138, +44, +194, +245, +218, +99, +90, +251, +23, +7, +161, 172, -3, -220, -173, -132, -162, -148, -189, -114, -113, -158, -123, -83, -180, -241, -102, -168, -100, -162, -108, -186, -144, -30, -149, -106, -171, -216, +63, +137, +147, +32, +53, +89, +1, +243, 15, +30, +134, +195, +169, +117, +113, +221, +233, +181, +237, +155, +126, +187, +99, +223, +116, +127, +205, +50, +68, +26, +234, +95, +154, +237, +118, +238, +231, 225, -162, +221, +197, +153, 245, -96, -12, -204, -34, -231, -139, -213, -76, 51, -57, -168, -180, -108, -117, -48, -43, +99, 75, -17, -65, -188, -72, -216, -6, -233, +240, +205, +45, +60, +124, 94, +118, 18, -79, -213, +66, +211, +43, 116, -5, -16, -2, -47, -182, -73, -196, -126, +200, +175, +39, +92, 91, -177, -24, -228, -61, -61, -8, -84, -236, -52, -229, -176, -45, -1, -158, -182, -198, -58, -218, -78, -95, -12, -3, -133, -74, -151, -252, -83, -245, -197, +138, +119, +50, +149, +28, +240, +230, +242, +187, +5, +186, +114, 129, -217, -39, -21, -246, -203, -229, -154, -162, -111, -37, -191, -14, -197, 156, -244, -96, -176, -129, -252, -151, -204, -164, -148, -210, -244, -190, -126, +165, +243, +219, +138, +53, 40, -62, -17, -236, -174, -68, -147, -216, -155, -210, +25, +157, +252, +45, +217, +84, +240, 222, -106, -53, -103, -99, -165, -238, -100, -250, -89, -139, -101, -235, -56, -4, -24, -57, -76, -161, -124, -98, -74, -103, -150, -176, -49, -211, -179, -187, -96, -88, -162, -39, -74, -210, -81, -69, +67, +123, +133, +255, +59, +153, +115, +13, +189, +156, +59, +244, +5, 190, -178, -185, -232, -73, -86, -113, -174, -7, -17, -175, +210, +145, +99, +27, +168, +137, +156, +152, +247, +255, +13, 28, -187, -188, +67, +174, +60, +39, +134, +44, +122, 96, -59, -183, -208, -54, -221, -63, -163, -226, -244, -94, -95, +17, 191, -112, +221, +128, +25, +8, +252, +195, 29, -192, -135, -162, +86, +42, +37, +77, +93, +196, +58, +222, +228, +190, 174, -127, -205, -238, -138, -210, -43, -111, -226, -177, -64, -172, -80, -91, -122, -252, -74, -121, -43, -76, -176, -178, -200, -28, -183, -209, -66, +95, +125, +235, +135, 79, -19, -53, -190, -17, +1, +220, +240, +96, +184, +126, +26, +110, +54, +241, 89, -36, -109, +189, +129, +114, +57, +138, +142, +153, +218, +136, +73, +161, +152, 186, 181, -210, -175, -149, -180, -181, -188, -173, -45, -112, -151, -195, -244, -20, -134, 155, -164, -188, -76, -32, -101, -207, +51, +226, +179, +74, +206, +51, +202, +205, +6, +41, +151, +86, +160, 229, -138, -208, -221, -224, -125, -7, -106, +70, +206, 99, -14, -237, -97, -247, +64, +18, +130, +199, 223, -157, -66, -118, -209, -159, -154, -169, -129, +47, +221, +65, +231, +114, +208, +188, +233, +100, +79, +87, 252, -128, -245, -116, -227, -111, -199, -33, -70, -149, -211, -104, -224, -124, -23, -6, -211, -137, -184, -201, -124, +243, +235, +110, 175, -83, -52, -19, -199, -165, -155, -80, -49, -163, +99, +45, +35, +120, +110, +230, +70, +95, +140, +14, +95, +70, +2, +42, +60, +197, +22, +183, 231, -157, -106, -127, -157, -164, -137, -20, -31, -69, +220, +71, +176, +215, +248, +231, +170, 12, -203, -167, -147, -211, -212, -100, -211, -30, -169, -7, -183, -159, -235, -98, -158, -78, -15, -159, -200, +89, +128, +86, +201, +32, +204, +31, +220, +28, +97, +148, +144, 159, -29, -137, +254, +4, +93, +207, +109, +140, +188, +255, +213, +248, +153, +104, +86, +96, 94, -209, -245, -7, -26, -241, -27, -176, -90, -117, -67, +189, +110, 188, -99, -141, -0, -236, -148, -127, +47, +151, +109, +250, +238, +22, +156, +197, +135, +238, +176, +123, +161, +196, +58, 138, -99, -52, -178, -236, -144, -89, -20, -174, -150, -104, +220, +192, +43, 57, -125, -111, -77, -253, +107, +78, +128, +72, +38, +149, +175, +82, +252, +55, +96, +126, +225, +123, +139, 208, -1, -152, -207, -169, -23, -241, -203, -211, -27, -241, -115, -118, -7, -164, -200, -59, -234, 40, -43, -203, -237, -59, -49, -221, -86, -248, -229, -148, -166, -67, -117, -209, -48, -151, -37, -182, -190, -121, -13, -247, -230, -215, -186, -228, -99, +6, 25, 143, -98, -206, -234, -182, -5, -193, -82, -81, -192, -36, -74, -165, -210, -231, -17, -23, -249, -187, -119, -69, -65, +56, +104, 187, -123, -247, -236, -66, -220, -189, -67, -15, -0, -50, +127, +199, +199, +180, +135, +221, +118, +167, +93, +204, +27, +188, +8, +129, +241, +81, +8, +248, +175, +206, +68, +94, 101, +128, +53, +242, +231, +4, +238, +155, +104, +242, +1, 19, -255, -206, +73, +225, +101, +143, +102, +235, +228, +105, +18, +213, +237, +125, +232, +12, +70, +246, +101, +179, +213, +41, +134, +171, +254, +233, +242, 37, -191, +122, +194, +200, +165, +215, +221, +248, +145, +16, +106, +170, +82, +114, +215, +131, +8, 78, +133, +53, +34, +37, +113, +40, +238, +115, +39, +50, +103, +228, +84, +188, +41, +211, +42, +84, +29, +182, +223, +83, +147, +68, +117, +34, 86, -141, +243, +251, +160, +224, +166, 251, +211, +72, +172, 83, -67, +182, +133, +128, 90, -206, -141, -82, +220, +69, +78, +76, +249, +234, +16, +160, +85, +129, 226, -168, -229, +139, +238, +245, +245, 69, 191, -167, -36, -25, -139, -108, -213, -166, -36, -76, -221, -36, -248, +57, 104, -229, -168, -164, -139, +219, +163, +254, +149, +26, +177, +251, +99, +65, +138, +31, +195, +200, 231, -2, -70, -32, -13, -112, -14, -109, -16, +199, +111, +228, 4, -179, -205, -91, -76, +49, +128, +22, +161, +151, +54, +92, +44, +87, +9, +189, +143, +142, +249, +201, +57, +14, +249, +182, +220, +70, +79, +67, +125, +80, +5, +173, +192, +15, +73, +126, 77, +14, +163, +245, +228, +207, 205, -83, -34, -246, -110, -189, 148, -160, -50, -43, -160, -225, -101, -116, -64, -4, -208, -140, -31, -11, -141, +222, 52, -241, -73, -234, -144, -72, -160, +127, +45, 184, -193, -33, -43, -119, -54, -36, -221, -139, -155, -132, -128, -241, -24, -179, -167, -80, -200, -124, -238, -134, -6, -37, -63, -117, -41, -204, -121, -96, -214, -170, -221, -98, -119, -194, -64, -71, -99, -201, -11, -38, -254, -202, -101, -217, 13, -241, -100, -193, -183, -29, +249, +141, +190, +24, 20, -107, -122, -210, -22, -48, -49, -100, -65, -1, +132, +55, +231, 157, +253, +189, 239, -26, -82, -232, -29, -179, -65, -138, -202, +246, +70, +118, +187, +211, +106, +94, +27, +133, 231, -251, -93, -163, -8, -109, 98, +179, +254, +109, +243, +159, +119, +29, +251, +118, +192, +255, +127, +115, 56, -76, -94, -73, -252, -125, -215, -32, +52, +138, +210, +197, 14, -233, -7, -33, +122, +125, +17, +93, +108, +20, +208, +45, +155, +182, +59, +183, +163, +247, +0, +53, +254, +139, +81, +88, +55, +54, +87, +57, +168, +35, +155, +184, +133, +208, +194, +186, +182, +175, +155, +55, +23, +124, 111, -134, -51, -202, -171, -138, -215, -63, -238, -26, -140, -171, -137, -82, +27, +241, +107, 67, -100, -26, -224, -141, -78, -82, -111, -174, -135, -130, -38, -216, -201, -117, -85, +123, +251, +151, +65, +243, +214, +136, +103, +106, +39, +151, +131, +206, +176, +215, +185, +54, +98, +156, +218, +126, +212, 55, -24, -18, -91, -220, -236, -175, -207, -119, -178, -95, -221, -255, +132, +162, +87, +27, +183, +238, 134, 163, -229, -55, -244, -249, -15, -130, -251, -221, -13, +254, +141, +253, +93, +105, +22, +138, 14, +222, +154, +129, +210, +175, +119, +112, +110, +6, +78, +191, +222, 193, -85, -172, -147, -241, -95, -116, -84, -23, -143, -254, -1, -33, -223, -136, +59, +35, 247, -209, -88, -56, -128, -173, -19, -152, -130, -216, -244, -144, -165, -234, -147, -215, -10, -255, -170, -177, -17, -11, +123, +222, 206, -240, +46, +158, +114, +119, 226, -190, -47, -14, -74, -222, -230, -19, -130, -167, -78, -30, -194, -108, -251, -59, -4, -44, -162, -224, -195, -154, -14, -78, -78, -243, -162, -26, -216, +245, +39, +98, +179, +149, +239, 68, -1, -86, -87, -210, -40, -224, -189, -193, -133, -95, -60, -191, -55, -118, -143, -184, -188, -132, +107, +6, +51, +183, +49, +208, 75, -146, -13, -215, +112, +66, +126, +54, +212, +252, +46, 128, -144, -4, -107, -226, -67, -100, -191, -209, -220, -210, -151, -130, -162, -238, +219, +160, +155, +141, +206, +159, 41, -142, -157, -1, -127, -72, -6, -207, +55, +44, +221, +83, +147, 35, -198, -84, -22, +48, +127, +101, +40, +158, +127, +64, +147, +227, +186, +104, +62, +172, +147, +178, +166, +136, +150, +14, +0, +161, +113, +37, 203, +166, +83, +120, +233, +231, +182, +3, +191, +189, +112, +157, +54, +245, +200, +194, +160, +196, +69, +151, +77, +28, +95, +67, +89, +229, +175, 47, -202, -178, +197, +99, +16, +104, +139, +87, +194, +215, +169, +71, +95, +204, +53, +176, +21, +47, +194, +207, +25, +133, +161, +146, +86, 57, -255, +19, +175, +137, +37, +94, 62, -81, +184, +25, +240, +244, +174, 4, -180, -216, -70, -15, -205, -95, -99, -131, -108, -126, -238, -40, -218, -1, -91, -135, -153, -58, -65, -185, -92, -105, -22, -207, -219, -78, +210, +253, +187, +167, +119, +112, +189, 226, -140, -240, -65, -235, -5, -33, -160, -238, -173, -26, -54, 173, -181, -13, -161, -246, -107, -15, +45, +215, +225, 151, +28, +254, +177, +174, +19, +86, +105, +154, +78, +240, +93, +219, +138, +66, +186, +43, +145, +211, 149, -60, -82, -11, +51, +154, +157, +89, +45, +153, 12, -78, -217, -20, -196, -163, +250, +206, +122, +192, +119, 121, -143, -78, -169, -169, +17, +191, +111, +61, +53, +158, 241, -226, -25, -46, -22, -30, -69, -239, -28, -99, -234, -21, +187, +223, +9, +27, 159, -189, -247, -226, -118, -173, -72, -3, -29, -15, -47, -33, -134, -131, -185, -179, -23, -81, -209, -189, -182, -231, -51, -195, -88, -13, -90, -153, -221, -14, -175, -74, -190, -46, -57, -72, -137, -140, -172, -82, -130, -102, -86, -208, -193, -44, -109, 175, -102, -39, -87, -182, +10, +129, +221, +77, 38, -218, -101, -52, -170, -185, -33, +88, 55, -212, -224, -168, -115, -105, -74, -149, -220, -120, -169, -43, -36, -110, -104, -53, -47, -81, -58, -10, +4, +195, 117, +36, +140, +62, +239, +155, +26, +227, +211, +168, 112, -11, -85, -101, -234, -92, -161, -116, +204, +62, +2, +244, +158, +140, +236, +225, +86, +226, 60, +156, +1, +232, +30, +248, +132, 189, -37, -202, -209, -243, -194, -22, -104, -117, -95, -243, -218, -172, -10, -89, -188, -251, -207, -199, -152, -229, -103, -83, -185, -82, -205, -139, 88, -21, +120, +178, +62, 141, -252, -135, -138, -203, -114, -126, -208, -117, -57, -255, -99, -44, -12, -186, +228, +81, +103, +246, +96, +232, 130, -106, -94, -26, -49, -6, -53, -71, -39, -117, -157, -75, -35, -70, -211, +183, +150, +95, +85, +85, +127, +126, +85, +123, +90, +233, +83, +134, +145, +17, +15, +203, +220, +0, +216, +202, +87, +18, +94, +55, +132, +63, +188, +51, +160, +14, +59, +179, +132, +45, +153, +190, +215, +151, +39, +46, 91, -156, -28, -53, +12, +89, +158, +247, +48, +247, +74, 47, -108, -105, -192, -81, -164, -81, +224, +183, 7, -184, -210, -210, -136, -49, -168, -121, +5, +40, +42, 55, -72, -158, -137, -239, +156, 220, -207, -234, -136, -1, -245, -86, +40, +102, +139, +230, +76, 167, -72, -208, -11, +112, +13, +18, +61, +87, 91, -32, +55, +100, +11, +69, +152, +64, +181, +135, +125, +146, +89, +232, +26, +96, +33, +41, +236, +73, +165, +215, +58, +225, +187, +101, +186, +242, 225, +213, +17, +222, +238, +197, +82, +123, +11, +170, +116, +32, +254, +175, +243, +16, +122, +128, +183, +178, +18, +10, +45, +138, +194, +200, +248, +146, +138, +154, +160, 196, -171, +20, +183, +63, +202, +63, 121, -137, -210, -81, -168, -131, +5, +152, +141, +180, +189, +166, +227, +120, +57, +247, +204, +93, +8, +10, +139, +197, +148, +54, +179, +182, +1, +136, +40, +142, +53, +227, +103, 1, -115, -252, -218, 87, -41, +101, +79, +158, +120, +194, +129, 29, -83, -111, -157, -214, -104, -122, +101, +236, +55, +2, +189, +185, +71, +206, 97, -11, -197, 127, -239, -212, -188, -74, -52, +90, +172, +123, +97, +242, 68, -125, -89, -132, -179, -226, -108, -182, -174, -204, -177, -248, -173, -80, -8, -55, -238, -47, -122, -147, -43, +212, +139, 115, -193, -160, -204, -47, -125, -46, -232, -2, -49, -187, -40, -155, -186, +231, +58, +154, +84, +190, +225, +124, +19, +55, +76, 182, -246, -232, -45, -168, -149, -11, -95, +104, +8, +227, +172, +118, +112, +74, +148, +154, +42, +30, +19, 252, -122, -198, -114, 38, -127, -16, -173, +3, +136, +8, +33, 166, -204, -229, -69, -234, -52, -116, -219, -253, -215, -239, -29, -228, -2, -44, -213, -139, -228, -1, -17, -86, -239, -158, -67, +165, +185, +171, +73, +66, +78, 14, -252, -65, -246, -156, -50, -151, -151, -187, -231, -254, -16, -110, -67, -253, -224, -229, +152, +233, +19, +45, 106, -161, +165, +237, +15, +19, +125, +126, +237, +19, +125, +222, +211, +68, +127, +127, +237, +19, +253, +125, +31, +19, +77, 199, -166, -137, -145, -134, -177, -193, -250, -201, -246, -181, -213, -20, -100, -241, -92, -150, -205, +216, +167, +46, +207, +122, +221, +188, +223, +76, +169, +124, +2, +243, +199, +216, +84, +216, +30, 83, -31, -92, -101, -61, -130, -236, -111, -154, -239, -174, -61, -168, -239, -131, -185, +81, 69, -158, -104, -26, -99, -78, -55, -38, -113, -97, +151, +56, 210, -54, -214, -161, -117, +8, +76, +93, +16, +240, +16, +254, +172, +30, +82, +74, +188, +151, +121, 34, -47, -252, -100, -146, -216, +19, +206, +149, +27, +29, +15, +95, +192, +124, +149, +117, +222, +199, +212, +211, +139, +192, 46, -9, -161, -44, -181, -143, +111, +250, +147, +93, +253, 48, -140, -72, -106, -79, -156, -207, -248, -162, +125, 46, -242, -152, -34, -166, -64, +223, +199, +185, +236, +227, +119, +253, +62, +214, +50, +118, +69, +104, 160, -59, -80, -208, -211, -75, 100, -97, -240, -201, -42, -138, -64, -72, +28, +26, 50, -18, -0, -234, -15, -159, -100, -169, -92, -70, -74, -52, -134, -114, -201, -178, -186, -162, -34, -48, -241, -13, -177, -173, -21, -232, -112, -168, -60, -206, -18, -200, -47, -79, -139, +239, +104, 71, -164, -17, -213, -64, -130, -136, -235, +203, +139, +66, +93, +236, +59, 146, -223, -166, -3, -64, -246, -58, -60, -149, -11, -178, -33, -251, -28, -106, 37, -45, -125, -7, -227, -194, -112, -96, -44, 114, -142, -21, -129, -35, -6, -233, -130, -233, -8, -8, +204, +41, +171, +197, +137, +254, +201, +239, +183, +135, +163, +88, +175, +198, +227, +211, +166, +245, +216, +94, +180, +241, +217, +236, +243, 223, +119, +124, +190, +181, +204, +163, +254, 237, -220, -67, -213, -167, -116, -194, +253, 188, +212, +245, +253, +220, +186, 17, -214, -158, -79, -57, -145, -21, -19, -150, -131, -66, -249, +156, 165, -8, -151, -7, -50, -16, -194, -85, +108, +135, +84, +199, +104, +135, +37, +239, 236, -64, -13, -23, -72, -60, -240, -22, -192, 67, -17, -20, -1, -88, -156, -143, -144, -155, -240, -212, -192, -100, -63, -15, -30, -249, -101, -126, -230, -199, -27, -72, -146, -79, -137, -86, -127, -145, -213, -95, +247, +190, +76, +215, +36, +91, +231, +2, +166, +21, +151, +111, +124, +225, 132, -1, -153, -179, +208, +242, +151, +116, +126, +29, 163, -78, -234, -166, -125, -141, -47, -185, -59, -247, +74, +119, +71, +53, +15, +129, +209, +253, +54, +173, +186, +101, +147, +97, +100, +202, +231, +237, +143, +207, +111, +182, 180, -242, -222, -139, -152, -12, +214, +212, +105, +147, 90, -123, -89, -22, -27, -42, -202, -137, -172, -171, -37, -153, -84, +49, +177, +142, +33, +87, 38, -141, +183, +245, +125, 143, -40, -210, -76, -8, -80, -40, -214, -76, +173, +115, +125, +54, +91, 223, -75, -229, +82, +103, +206, +126, +111, +173, +102, +4, +111, +184, 182, -6, -210, -29, +238, +31, +133, +18, +181, +157, +191, 103, -60, +86, +75, +248, +199, +122, +73, +127, +193, +170, +47, +69, +117, +106, +230, 214, -37, -189, -217, -188, -184, -48, +17, 36, -29, -154, -164, -232, -168, -156, -250, -134, -133, -213, +189, +195, +44, +127, +125, +4, +103, +231, +114, +25, +107, +218, +84, +121, +110, 178, -39, -142, -207, -69, -43, -140, -92, -200, +166, 53, -101, -198, +251, +72, +173, +105, 121, -135, -34, -138, -34, -137, -64, -110, -231, -224, -156, -244, -61, -192, -97, -221, +4, +238, +89, +234, +12, +13, +176, +84, +183, +104, +88, +95, 26, -161, -65, -229, -177, -5, -138, -10, -54, -70, +223, +134, +47, +125, +91, +201, +238, +98, +193, +234, +98, 149, +36, +112, +120, +103, +225, +238, +242, +55, +186, +121, +34, +75, +54, +129, +208, +180, +49, +54, +163, +216, +150, 49, +132, +215, +198, +214, +106, +9, +143, +15, +183, +225, +114, +181, +132, +161, 4, -124, -184, -201, -69, -232, -62, -125, -178, -38, -115, -207, -119, -165, -102, -145, -185, -16, -68, -180, -178, -241, -160, -28, -139, -24, -236, -204, -234, +176, +195, +196, +247, 38, -175, -156, -101, -24, -255, -28, -99, +159, +69, +126, +135, +78, +34, +73, 217, -108, -202, -233, -165, -240, -117, -222, -63, -168, -148, +254, +173, +17, +255, +244, +127, +98, +72, +152, +78, 146, -243, -226, -43, -112, -79, -62, -215, -29, -211, -170, -243, +103, +107, +129, +47, +97, +128, +2, +147, 88, -184, -246, -198, -145, -3, -217, -1, -21, -0, -79, +110, +136, +25, +169, +49, +255, +55, +255, +224, +223, +80, +165, +203, +177, +230, +204, +95, +114, +158, +19, +131, +176, +167, +241, +202, +71, +239, +239, +213, +93, +215, +204, +16, 68, -31, +164, +58, 32, -0, -116, -8, -232, -170, -252, -245, -134, -89, -157, -2, -42, -127, -137, -145, -211, -249, -253, +107, +243, +78, +207, +151, +141, +212, +77, +196, +87, +230, +153, +38, +201, +16, +118, +15, +191, +74, 16, -55, -44, -6, -97, -190, -8, -31, -2, -19, -65, -61, -217, -109, -159, -89, 119, -4, -171, -14, -43, +204, +110, +18, +91, 115, -21, -121, -238, -141, -179, -180, -176, +221, +157, +113, +184, +194, +68, +148, +120, +30, +62, +190, +209, +222, +46, +123, +73, +168, +190, +97, +241, +188, +90, +242, +133, +154, +9, +129, +210, +146, 34, +177, +66, +153, +40, +246, +244, +13, +61, +168, +81, +180, +163, +113, +226, 5, -63, +39, +143, 146, +46, 96, +41, +193, +37, +85, +102, +180, +134, +229, +122, +148, +121, +8, +137, +128, +222, +125, +188, +138, +166, +0, +232, +14, +129, 157, -71, -140, -95, -71, -177, -242, -189, -65, -68, -16, -45, +103, +86, +199, +225, +146, +42, +126, 149, -151, -176, -133, -142, -233, -106, +117, +231, +96, +140, +138, +207, +18, +230, +63, +91, +49, +131, 108, -17, +138, +68, +86, 229, -242, -242, -97, +165, +228, +195, +52, +74, 20, -153, -101, -232, -19, +159, +3, +147, +16, +163, 107, -26, -105, -101, -118, -60, -183, -140, -179, -143, +48, +47, +178, +205, +96, 65, -221, -66, -183, -154, -121, -58, -26, -51, -216, -123, +172, +71, +47, 134, -142, -212, -216, -184, -148, -50, -237, -146, +104, +81, +107, +1, 147, -92, -122, -170, -122, -199, -75, -149, -169, -86, -59, -154, -80, -215, -236, -99, -162, -241, -220, -89, -214, -188, -168, +64, +31, +224, 98, -8, -177, -170, -248, -67, -29, -38, -181, -34, -162, -245, -65, -196, -152, -239, -78, 229, -132, -171, -42, -157, -179, -188, -116, -86, -51, +39, +30, +228, +105, +73, +10, +96, +110, +124, +195, +76, +49, +134, +10, +222, +65, +36, 34, -106, -154, -99, -85, -193, -156, -21, -4, -83, -115, -41, -85, -169, -170, -107, -150, -38, +153, +248, 160, -159, -8, -66, -80, -159, -202, -23, -32, -7, -101, +145, +166, +100, +139, +92, +114, 153, -252, -124, -140, -106, -11, -254, -170, -30, -32, -165, -215, -16, -78, 223, -125, -184, -122, -159, -145, -55, +8, +51, 121, -192, -195, -120, -165, -234, -242, -66, -190, -152, -189, -10, -192, -30, -35, -162, -97, -57, -246, -26, -30, -120, -197, -16, -54, -132, -198, -224, -231, -175, -200, -74, +215, 150, -167, -117, -249, -234, -151, -58, -230, -153, -188, -113, -85, -50, -206, -110, -163, 16, -128, +104, +86, +28, +78, +147, +71, +74, 222, -184, -93, -236, -205, -230, -144, +0, +228, +91, +165, 226, -56, -13, -23, -120, -53, -197, -221, -46, -238, -20, +119, +58, 100, -196, +154, +121, +98, +118, +199, +114, +33, +20, +56, +90, +206, +181, +75, +182, +194, +127, +247, +157, +98, +180, +9, +57, +72, +33, 234, -93, -211, -37, -85, +53, +160, 112, -127, -164, -158, -249, +231, +232, +33, +30, +84, +5, +18, +219, +142, +94, +77, +239, +155, 245, -213, -242, -217, -61, -243, -215, -250, -180, -186, -211, -2, -50, -73, -122, -17, -150, -110, -131, -128, -49, -192, -203, -153, -133, -178, -230, -209, -124, -21, -184, -252, +5, +237, +34, +206, 90, -29, -211, -117, -94, -94, -95, -79, +110, +74, +25, +204, +88, +197, +16, +220, 28, -44, -43, +159, +106, 204, -5, -6, +20, +168, +178, +124, +53, +196, +190, +155, +0, +69, +241, +45, +39, +182, +191, +14, 26, -136, -27, -175, 172, -4, -186, -126, -165, -61, -205, -238, -251, -84, -128, -204, -242, -249, -174, -92, -35, -36, -187, -203, -6, -33, -204, -4, -48, -136, -28, -44, -11, -70, -156, -138, -136, -85, -227, -39, -121, -85, 8, -67, +118, +45, +159, +220, 130, -113, -108, -221, -222, -129, -109, -9, -243, +58, +45, +53, +4, +95, +168, +3, +190, +213, +12, +36, +230, +149, +238, 231, -191, -225, -59, -154, -239, -52, -11, -96, -124, +157, +146, +4, +253, 46, -5, -68, -18, -95, +151, +100, +99, +137, +184, 30, -40, +209, +221, +201, +169, +161, +19, +16, +208, 156, +164, 102, -101, -236, -34, -48, -37, -68, -229, -195, -43, -4, -55, -85, -5, -2, +63, +145, +112, +57, +24, +145, +78, +191, 36, -122, -15, -16, -42, -47, -119, -93, -207, +197, +113, +79, +193, +251, +84, +84, +11, +191, +183, +61, +247, +73, +36, +39, 120, -132, -166, -174, -239, -37, -9, -159, -107, -243, -182, -107, +241, +217, +167, 113, -253, -17, -205, -225, +116, +255, 230, +255, +188, +253, +238, +167, +55, +255, +231, +111, +233, +255, +31, +74, 13, -35, +142, 90, -136, -77, -4, -205, -161, -8, -104, -131, -74, -70, -50, -165, -53, -36, -209, -2, -225, -83, -168, +87, 40, -247, -64, -9, -108, -104, -65, -99, -197, -230, -70, -110, -166, -2, -132, -137, -243, -127, -53, -161, -196, -54, +101, 202, -108, -32, -47, -70, -234, -214, -16, -64, -67, -152, -34, -155, -250, -65, -78, -120, -119, +115, 79, -56, -90, -188, -228, -172, +131, +98, +9, +19, +207, +177, +148, +85, +82, +83, +206, +249, +167, +183, +131, +238, +77, 119, -124, -255, -137, -244, -165, -40, -13, -22, +212, +253, +208, +177, +111, +251, +221, +222, +104, +216, +80, +126, +3, +193, +204, +107, +191, 176, -70, -122, -151, -125, -152, 135, -190, -68, -240, -35, +163, +65, +247, +118, +237, +183, +215, +253, +126, +238, +151, 252, 35, -107, -232, -161, -227, -39, -243, -39, -113, -82, -230, -224, -253, -0, -135, +68, +81, +29, +110, +250, +229, +122, +31, +233, +95, +46, +155, +189, +51, +235, +164, 9, -39, -138, -255, -219, +199, +95, +16, +38, +172, +65, +134, +153, +192, +246, 11, -163, -70, -118, -223, -76, -175, -97, -40, +92, +111, +2, +134, +156, +151, +16, +48, +90, 6, -30, +40, +194, 231, -207, -83, -134, -213, +141, +135, +14, +28, +84, +104, +222, +45, +177, +28, +112, 67, -178, +196, 153, -22, -121, -224, -223, -70, -88, -15, -119, -198, -2, -22, -33, -216, -15, -50, -53, -67, -192, -162, -95, -227, -69, -217, -172, -70, -217, -177, -60, -26, -180, -5, -168, -126, -169, +226, +83, +132, +8, +27, +62, +221, +204, +206, +209, +156, +137, 138, +150, +84, +246, +73, +174, +154, +140, +95, +193, +98, 106, -152, -114, -240, -5, -186, +192, 56, -138, -115, -72, -171, -175, -86, -167, +146, +50, +160, +1, +23, +13, +48, +83, +38, +50, +99, +127, 30, -173, -98, -209, -88, -70, -138, -239, -172, -33, -17, -205, -190, -51, -62, +250, +46, +162, +206, 191, -229, -122, +161, +174, +222, +200, +250, +153, +139, +177, +23, +80, +144, +16, +239, +188, +57, +24, +52, +63, +218, +151, +253, +193, +77, +115, 100, -170, -4, -134, -13, -82, -180, -37, -190, -247, -103, +255, +153, +175, +68, +252, +217, +74, +237, +36, +171, +63, +192, +249, +112, 33, -41, -139, -116, -129, -248, -189, -118, -238, -4, +153, +99, +250, +180, +250, +49, +132, +40, +119, +126, +229, +71, +42, +149, +153, +21, +209, +64, +128, +16, +196, +160, +252, +44, +237, +36, +192, 179, +123, +163, +210, +157, +175, 20, -121, -33, -88, -33, -186, -46, -110, -35, -46, -119, -49, +69, +181, +51, +17, +199, +158, +254, 130, -80, -97, -175, -236, -209, -67, -159, -66, -182, +22, +197, +73, +128, +207, +133, +50, +112, +253, +191, +78, +207, +32, +24, +54, +55, +120, +183, 215, -178, -42, -177, -232, -104, -196, -244, +230, +99, +123, +105, 67, -40, -20, -88, -234, -100, -47, -48, -168, -126, -36, -42, +193, +45, +32, +31, +11, +197, +193, +243, 13, -222, -84, -89, -232, +55, +53, +156, +64, +36, +178, +56, +1, +237, +47, +49, +130, +16, +241, 148, -57, -123, -90, -236, +97, +4, +119, +70, +71, +137, 173, -23, -33, -254, +16, +46, +39, +183, +4, +220, 135, -215, -178, +82, +200, +141, +185, +189, 117, -90, -204, -208, -76, -96, -178, -133, -36, -35, -34, -6, -92, -225, -169, -55, +136, +226, +91, 169, -228, -216, -219, -196, -9, -189, -85, -93, -155, +49, +149, +38, +240, +124, +2, +187, +241, +30, +229, +193, +60, 133, -150, -237, -93, -106, -203, +70, +144, +79, +248, +134, +26, +133, +75, +132, +190, 40, -146, 145, -49, -129, -64, -237, -170, -242, -160, -176, -237, -181, -2, -50, -247, -39, +90, 9, -6, -1, -153, -82, -10, -104, 3, -239, -103, -242, -179, -13, -147, -175, -43, -118, -179, -212, -194, -95, -213, -48, -233, -56, -117, -103, -155, -172, -179, -234, -212, -214, -91, 40, -197, -170, -128, -198, -104, -203, +178, +14, +112, +183, 18, -38, -33, -153, -22, -13, +138, +82, +246, +202, 197, -182, -67, -69, -14, -127, -204, -140, -210, -23, -232, -165, -47, -206, -200, -152, +121, +238, +77, +209, +198, +155, +161, +146, +137, +178, +233, 66, -197, -70, -218, 122, -3, -189, -18, -95, -137, -91, -82, -97, -204, -134, +84, +170, +173, +98, +63, +132, +139, +214, +163, +49, 48, -164, -241, -162, -128, -86, -28, -28, -106, -235, -103, -93, -124, +139, +156, +47, 86, -176, -7, -249, -63, -40, 51, -143, -143, -131, -181, -237, -147, -48, -146, -232, -227, -220, -174, -120, -231, -197, -156, -107, -67, -22, -113, -107, -245, -83, -67, -212, -76, -95, -5, -19, -249, -249, -187, -206, -224, -131, -53, -188, -238, -191, -199, -241, -208, -74, -236, -245, -71, -233, -147, -29, -190, -244, -29, -230, -50, -87, -251, -59, -108, -238, +205, +228, +160, +210, +178, +213, +193, +172, +44, +69, +4, 241, -206, -248, -86, -167, -243, -2, -155, -61, -13, -238, -243, -25, -214, -58, -121, -2, -223, -126, 34, -222, -98, -139, -127, -151, -243, -59, -53, -55, -206, -129, -94, -77, -11, -61, -251, -212, -60, -209, -52, -51, -212, -51, -6, -229, -95, -102, -75, -89, -228, -25, +97, +27, +164, +123, 73, +60, +85, +211, +21, +64, +8, +188, +216, +38, +17, 251, -14, -55, -200, -25, -230, -10, -205, -194, -82, -83, +109, +197, +98, +144, +247, +244, +32, 80, -154, +177, +211, +148, +195, +182, +4, +120, +218, +26, +235, +104, +59, +125, +49, +12, 20, -39, -65, -205, -91, -100, -136, -29, -171, -155, -67, -254, -230, -64, -41, -225, +42, +93, +242, +79, 213, +23, +7, 102, -128, -209, -100, -47, -40, -163, -221, -15, -39, 159, -247, -145, -208, -206, -149, -147, -157, -235, -171, -230, -92, -219, -85, -80, -154, -242, -42, -11, +84, 216, -243, -252, -18, -37, -224, -246, -188, -102, -72, -132, -73, -45, -64, -4, -6, -215, -82, -81, -6, -43, -96, -76, -69, -29, +175, +151, +107, +138, 190, -120, -99, -34, -106, -41, -170, -101, -76, -69, -77, -0, -133, -198, -116, -212, 149, -204, -103, -76, -200, -128, -19, +252, +58, +20, +115, +210, +131, +193, +6, 242, -2, -200, -168, -43, 95, -219, -152, -144, -231, -171, +51, +147, +82, +74, +211, 251, -29, -146, -146, -122, -210, -163, -141, -201, -208, -47, -103, -90, -39, -21, 250, -151, -196, -3, -8, -199, -241, -9, -49, -244, -115, -213, -73, -74, -61, -153, -175, -198, -100, -116, -23, -206, -236, -5, -236, -22, -184, -149, -221, -58, -137, -230, -3, -66, -173, -138, -189, -219, -62, -62, -17, -53, 161, -1, -153, -75, -71, +248, +68, 176, -92, -37, -157, -123, -246, +187, 18, -12, -161, -182, -135, -190, -15, -8, -237, -59, -58, -45, -245, -164, -220, -154, -203, -170, -243, -240, -66, -40, -169, +77, +98, +111, +74, +123, +171, +213, +156, +141, +149, +186, +147, +233, +103, 45, +150, +173, +227, +16, +96, +228, +48, +133, +242, +137, +41, +157, 89, -188, -132, +194, +198, +76, +207, +238, +130, 97, -86, -87, -70, -116, +137, +158, +40, 73, -163, +71, +21, 249, -133, -16, -35, -44, -231, -23, -69, -205, -155, -23, -66, -13, -158, +202, +230, +162, +39, +89, 197, +185, +30, +68, +188, +114, +236, +242, +130, +237, +220, +66, +219, +116, +255, +140, +138, +211, 123, -162, -165, -210, -101, -29, -107, -146, -101, -206, -22, -113, -12, -232, -122, -90, -46, -224, -217, -149, -250, -195, -247, -56, -241, +125, +253, +194, +117, 0, -251, -10, -220, -149, +31, +138, +186, +254, +53, +187, +43, +74, +175, 188, -95, -129, +137, +199, +2, +177, +66, +109, +233, +241, +43, +229, +173, +48, +193, +202, 34, -172, -29, -203, +115, 220, -195, -0, -18, -145, -7, -18, -67, -216, -80, -76, -193, -230, -17, -195, -26, -75, -24, -108, -65, -97, -38, -13, -240, -155, -130, -179, +70, 11, -159, -121, -17, -38, +61, +77, +212, +248, +70, +100, +145, +180, +233, +214, +74, +191, +86, +210, +214, +242, +182, +182, +192, +93, +14, +211, +83, +24, +110, 146, -81, -217, -163, -96, -134, +242, +50, +129, +148, +189, +148, +43, +66, +119, 131, -158, -89, -205, -224, -137, -126, +95, +58, +80, 27, -78, -69, +115, 104, -10, -134, -148, -248, -62, -196, -82, -72, -26, -207, -254, -63, -75, -252, 15, -254, -156, -141, -238, -220, -139, -242, -139, -30, -84, -66, -18, -232, -218, -153, -63, -213, -165, -36, -29, -162, -40, -198, -166, -249, -84, +187, +255, +234, 20, -12, +178, +139, +254, +212, +76, +13, +228, +71, +172, +167, +27, +127, +59, +14, +49, 170, -128, -176, -15, -140, -25, -154, -250, -236, -81, -250, -240, -211, -18, -77, -124, -106, -9, +156, +70, +3, 231, -246, -42, -34, -223, -47, -60, -72, -91, -80, -36, -206, -151, -1, -132, -203, -40, +187, +48, +152, +78, 196, -242, -140, -103, -86, -74, -37, -122, -130, -217, -141, -227, -5, -215, -97, -184, -252, -148, -85, -150, -68, -190, -59, -19, -81, -180, 77, +230, +123, 157, -118, -67, -84, -150, +162, +153, +56, +46, +221, 132, +138, +25, +61, 31, -210, -8, -26, -250, -210, -58, -137, -216, -132, +84, +251, +235, +36, +77, +164, +248, +36, +98, +88, +238, +79, +78, +83, +147, +77, +123, +164, +30, +220, +126, +174, +139, 121, -193, +58, 61, -176, -177, +124, +34, +127, +113, +36, +122, +69, 215, 31, -117, +104, +196, +111, +192, +106, +213, +13, +241, +142, +53, +2, +176, +83, +254, +41, +142, +209, +200, +178, +67, +102, +81, +184, +90, +162, +229, +244, +189, +53, +245, +67, +7, +96, +62, +167, +94, +196, 47, -187, -173, -230, -168, -219, +79, 239, +196, +207, 217, -157, -222, -168, -51, -176, -135, -173, -78, -175, -115, -74, -144, -242, -142, -43, -106, -114, -145, -39, -155, -143, +29, 144, -241, -174, -73, -157, -3, +34, 239, -100, -133, -72, -136, -56, -17, -79, -244, -41, -255, -17, -108, -58, -93, -208, -19, -192, -22, -5, -254, -161, +168, 163, -28, -43, -125, -1, -138, -43, -210, -30, -133, -97, -114, -74, +172, +44, +183, +239, +196, +116, +91, 225, -37, -178, -212, -135, -23, -17, -36, -53, +151, +83, +154, 14, -31, -132, -136, -196, -42, -251, +213, +69, +195, +92, +150, +216, +250, +230, +45, +220, +155, +223, +234, +146, +143, +101, +60, 138, -179, -79, -99, -8, -50, -197, -72, -83, -160, -6, -67, -1, -50, -58, -83, -1, -107, -88, -33, -10, -29, +57, +171, +219, +22, 4, -216, -52, -176, -128, -149, -156, -29, -193, -93, -139, -181, -92, -160, -191, -222, 75, -44, -230, -196, -79, -148, -93, -228, -96, -36, -84, -113, -102, -24, -117, 69, -175, -116, -156, -15, -39, -176, -248, -236, -209, -129, +1, +147, +40, +149, 74, 159, -224, -132, -127, -197, +71, +92, +228, +239, +62, +20, +5, +237, +238, +195, +139, +11, +113, +247, +1, +61, +0, +200, +148, +77, +252, +59, 151, -108, -225, -65, -218, +252, +58, +89, +53, +30, +78, +13, +105, +57, 55, -246, -126, -186, -129, -32, -41, -241, -124, -140, -87, -124, -217, -39, +74, +137, +163, +150, +23, +253, +158, +146, +100, 44, -230, -95, -199, -80, -58, -29, -75, -143, -97, -88, -144, -220, -205, -62, -36, -78, -241, -101, -195, -50, -79, -32, -208, -16, -180, -36, -203, -161, -136, -108, -140, -5, -244, -36, -58, 178, -78, -220, -16, -214, -35, -153, -243, -63, -158, -2, +85, +155, 146, -54, -226, -194, -139, -191, -66, -131, -180, -138, -157, -45, -126, -249, -233, -212, -154, -59, -203, -37, -112, -150, -47, -218, -20, 48, -229, -17, -126, -55, -22, -193, -98, -240, +117, +147, 224, -4, -80, -244, -75, -8, -92, +163, +149, +163, +146, +46, +158, +11, +24, +129, +52, +192, +57, +180, +65, +16, +204, +54, +111, +49, +53, +53, +79, +137, +216, +187, +245, +82, 130, -40, -5, -81, -205, -38, +202, +172, +128, +134, +151, +209, +1, +17, +64, +51, +126, +44, +52, +210, +196, +39, +169, +67, +34, +129, +226, +6, +135, +172, +220, +217, +144, +116, +47, +110, +18, 2, 198, -71, -10, -213, -234, -40, -224, -131, +99, +204, +158, +67, +33, +243, +185, +27, +26, +148, +252, +212, +165, +48, 231, -109, -124, -46, -230, -188, -241, -189, -19, -121, -14, -60, -242, +129, 89, +171, +118, +139, +221, +9, +3, +29, +141, +37, +47, +152, +248, +43, 151, -30, -132, +101, 55, -109, -36, -103, -10, -127, -218, -68, -148, -133, -127, -81, -130, -36, -40, -49, -11, -178, -86, -98, -46, -226, -156, -190, -147, -241, +196, 147, -44, -244, -103, -253, -248, -221, -169, -164, -153, -162, -198, -128, -59, -190, -23, -124, -230, -107, -27, -51, -127, -42, +5, 223, +118, +80, +172, +233, +89, 91, -150, -243, -167, -216, -155, +192, 196, -155, -214, -199, -241, -227, -140, -161, -30, -88, -169, -16, -214, +144, 5, -202, -141, -146, -201, -248, -226, -81, -92, -85, -74, -59, -126, -244, -41, -123, -66, -147, -208, -200, -66, 5, +116, +190, +107, +72, 161, -196, -82, -100, -24, -117, -151, -214, -25, -227, -163, +119, 204, -56, -35, -229, -34, -167, -239, -120, -242, -89, -103, -5, -239, -116, -254, -19, 6, +41, +42, +159, +239, +119, +141, +34, +180, +137, +225, +48, +121, +37, +241, +215, +93, +131, +56, 164, -65, -24, -219, -103, -232, -248, -100, -21, -248, -64, -90, -250, -226, -16, -123, -40, -126, -82, -135, -156, -130, -26, -200, -136, -91, -5, -115, -206, -16, 31, -130, -62, -11, -100, -102, -74, -18, -183, -61, -197, -193, -1, -125, -15, -92, -2, -224, -125, -86, -52, 132, -151, +188, +25, +206, 40, -46, -84, -176, -101, -153, -207, -143, -129, -19, -65, -86, -3, -42, -45, -67, -49, -128, -32, -137, -66, -95, -68, -5, +175, 42, -34, -63, -10, -173, -207, -140, -45, -225, -157, -114, -146, -214, -60, -66, +222, +254, +184, +107, +48, +174, +38, +74, 13, -202, -85, -37, -115, -34, -208, -139, -79, -214, +145, +105, +128, +119, +58, 73, -76, -21, -163, -249, -52, -31, -20, 189, -139, -193, -136, -164, -168, -81, -255, -210, -191, -79, -113, -147, -133, -15, -1, -139, -94, -21, -54, -19, -169, -61, -177, -157, -97, -220, -56, -27, -248, -97, +185, 30, -42, -250, -252, -129, -179, -63, -75, -99, -132, -48, -73, -95, -198, -24, -18, -9, -15, -17, -85, -197, -133, -234, -184, -97, -20, -211, -153, -16, -134, -62, -62, -184, -133, -171, -217, -60, -155, -227, -165, +10, +154, +96, 39, -52, -11, -105, -78, -210, -142, -240, -156, -202, -117, -155, -219, +215, +85, +221, +96, 72, -203, -12, -78, -241, -204, -194, -106, -214, -202, -65, -71, -26, -133, -247, 108, -244, -74, -103, -51, -44, -85, -18, -211, +113, +179, +191, +61, +223, 201, -171, -62, -115, -221, -123, +126, +117, +255, +27, +142, +150, +223, +208, +231, +63, +8, +238, +119, +55, +56, +4, +87, +177, +78, +198, +127, +209, 81, -178, -130, -84, -219, -205, -166, -69, -75, -89, -108, -236, -131, -185, -217, -146, -152, -190, -182, -217, -92, -225, -38, -21, -137, -24, -51, -224, -50, -133, -144, -187, -153, -102, -45, +93, +60, +250, +7, +132, +124, +35, +222, 71, -79, +99, +225, +0, +182, 78, -129, -60, -75, -210, -86, -187, -13, -53, +96, +10, +98, +211, +67, 150, -185, -115, -92, -76, -9, -182, -226, -116, -77, -193, -197, +170, 79, +94, +43, +252, +171, +198, +70, +44, +56, +195, +139, +251, +190, +56, 40, -115, 121, -181, -99, -92, -165, -138, -246, -110, -185, -89, -161, -242, -42, -123, -235, -86, -151, -11, -14, -122, -82, +155, +79, +8, +158, +58, +121, +12, +179, +237, +239, 16, -82, +176, +136, +130, +15, +107, +58, +56, 57, -159, -160, -174, -196, -0, -1, -22, +205, +139, +106, +96, +19, +5, +88, +93, +73, +163, 128, -138, -207, -199, +247, +6, +23, +126, +241, +252, +222, +216, +61, +226, +242, +18, +46, +73, +54, +92, +3, +66, +18, +172, 137, -198, -88, -123, -12, -121, +15, +145, +253, +70, +115, +75, +95, +10, +138, +186, +167, +56, +118, +6, +252, 33, -149, +25, +60, 143, -136, -104, -229, +24, +83, +89, +44, 191, -229, -10, -60, -121, -50, -103, -196, -145, -23, -56, -91, -218, -76, -131, -8, -37, -74, -26, -30, -15, -198, -70, -102, -165, +40, +203, +230, +252, +251, +68, +17, 208, -41, -136, -7, 98, -42, -224, -203, -136, -221, -123, -225, -42, -166, -143, +27, +61, +52, +127, 141, +13, +178, +249, +185, +163, +104, +7, +108, +29, +102, +234, +4, +229, +114, +165, 89, -192, -9, -119, -159, -74, +60, 111, -58, -108, -109, -157, +59, +137, +51, +194, +7, +173, +87, +132, +128, +186, +183, +106, +216, +180, +214, +54, +132, +218, +175, +61, +92, +86, +242, 72, -5, -64, -250, -24, -131, -37, +45, +48, +56, +101, +83, +16, +143, +230, +61, +58, 165, -90, -74, -117, -67, -24, -154, -175, -79, -225, -184, -121, -113, -34, +166, +198, 139, 103, -239, -134, -3, -46, -134, -160, -146, -57, -106, -125, +184, +88, +120, +20, +189, +115, +140, +169, +87, +124, +246, +222, +139, +219, +181, +34, +13, +116, 60, -227, -244, +188, +134, +24, +14, +230, +206, +94, +69, +69, +247, +218, +158, +207, +12, +99, +53, +104, +101, +118, +59, +188, +42, +249, +186, +228, +32, 37, -123, -237, -128, -173, -44, -227, +50, +178, +74, +9, +154, 89, -143, -159, -217, -83, -21, -62, -66, -243, +65, +7, +179, +180, 189, -242, -146, -119, -88, -138, -159, -101, -194, -214, -244, -146, -48, -247, -153, -72, -73, -1, -60, -220, -108, -134, -223, -201, -224, -248, -85, -224, -113, -115, -27, +154, +157, +92, +217, +154, +104, 151, -159, -95, -118, -150, -14, -132, -233, -208, -69, -139, -19, -41, -131, -115, -28, -159, -182, -85, -26, -144, -140, -221, -226, 209, -63, -113, -0, -166, -64, +168, +230, 134, -242, +220, +80, +131, 163, -125, -64, -113, -46, 206, -42, -9, -33, -68, -107, -130, -182, -15, -239, -150, -55, +165, 41, 85, -48, -119, -63, +114, +227, +181, +174, +144, +184, +161, +213, +188, +68, +233, +40, +212, +193, +45, +84, +149, 169, -128, +115, +133, +210, +241, +244, +150, +40, +71, 207, -196, -187, -108, -229, -17, -87, -126, +43, 91, -56, +160, +213, +67, +205, +107, +179, +42, 100, -58, -15, -168, -225, -136, -10, -72, +241, +238, +63, +31, 99, -197, -195, -172, -156, -59, -122, +150, +159, +77, +229, +74, 53, -180, -214, -187, -233, -186, +175, +98, +85, +52, 242, -74, -154, -205, -33, -181, +31, +42, +46, +203, 249, -41, +65, +215, +229, +252, +143, +177, +48, +232, +10, +170, +121, +105, +196, +24, +212, +28, +157, +212, 117, -34, -38, +46, +141, +24, +77, +111, +113, +114, +212, 188, -137, -84, -17, -58, -49, -93, -199, -30, -28, -88, -242, -49, -93, -4, -34, -241, +178, +165, 1, -9, -8, -53, -148, -44, -0, -2, -33, -122, -61, -103, -223, -65, -142, 71, -126, -173, -249, -153, -192, -18, -213, -236, -38, -158, -165, +145, +70, +29, +224, +74, +75, +35, 198, -163, -248, -59, -222, -172, -240, -223, -4, -51, -65, -105, +160, +230, +221, 32, -164, -176, -189, -88, -102, -162, -208, -118, -75, +121, +33, +190, +115, 63, -3, -3, -51, -9, -151, -148, -252, -3, +171, +35, 6, -177, -225, -66, -136, +212, +91, +157, +34, +65, +175, +108, +129, 132, -190, +19, +175, +230, +37, +74, +71, +161, +14, +6, +204, +241, +107, +95, +165, +116, +76, +189, +117, 90, -215, -34, -173, -92, -188, -190, -28, -48, -49, -136, -53, -148, -44, -130, -125, -134, -219, -8, -25, +163, +233, +149, 45, -2, -225, -197, -223, -248, -98, -225, -61, -164, -228, 20, -121, -215, -54, -117, -85, -239, -108, -13, -119, -51, -210, -114, -184, -148, -131, -252, +255, +189, +83, +243, +42, +209, +16, +245, 101, -164, -140, -250, -145, -61, -104, +17, +206, +138, +179, +217, +186, +50, 199, 226, +183, +66, +33, +220, +184, +191, +232, +77, +174, +204, +5, +131, +50, +191, +244, +185, +160, +11, +196, +236, +162, +108, 234, -38, -63, -150, -161, -67, -151, -8, -117, -249, -106, -67, -112, -74, -43, -143, -230, -152, -12, -219, -213, -75, -81, +218, +218, +163, +183, +160, +86, +46, +124, +241, +235, +25, +203, +153, +252, +65, +180, +154, 50, -168, -210, -89, -174, -158, +151, +87, +169, +211, +208, 109, -65, -10, -62, -157, -74, +247, 31, -21, -253, -25, -92, -104, -25, -214, -14, -134, -28, -38, -16, +191, +119, +144, +11, +176, +84, +175, +146, +7, 68, -140, -74, -2, +88, +189, +123, 14, -28, -197, -143, -234, -148, -210, -1, +57, +240, +7, +217, 115, -39, -182, -73, -214, -245, -152, -169, -134, -84, -105, -49, -115, -9, -207, -177, -117, -63, -207, -226, -209, -104, -48, -11, -99, -145, -40, -63, -139, -75, -150, +202, +92, +94, +239, +158, +251, +67, +184, +13, +245, +131, +151, +171, +133, +30, +155, +38, +70, +26, +198, +6, +235, +39, +219, +215, +86, +83, 144, +197, 115, -17, -61, +89, +54, +79, +125, +112, +149, +245, +8, +178, +191, +105, +190, +187, +246, +160, +190, +15, +230, 22, +121, 162, -35, 105, -112, -220, -115, -98, +140, +57, +221, +152, +196, +133, +73, +219, +88, +135, +214, +137, +188, +240, +222, +36, +177, 93, -235, -4, -28, -139, +18, +66, +89, +106, +159, 96, -137, -178, -40, -10, -69, -242, -83, +24, +145, +212, +158, 56, -153, -172, -162, -83, -21, -66, -137, -121, -232, -150, -86, -15, -105, -169, -85, -161, -111, -110, -167, -112, -195, -194, +159, +241, +69, +93, +228, +49, +69, +76, +129, +64, 119, -208, -3, -12, -163, -88, -39, -153, -255, -82, -68, -28, -75, -139, -196, -9, -50, +160, +160, 167, -251, -41, -102, -255, -129, -93, -51, -142, -67, -127, -149, -136, -198, -153, 151, -5, -115, -16, -59, -228, -247, -4, -113, -116, -240, -3, -60, -235, -126, -178, +200, +194, +224, +147, +85, +20, +129, +144, +100, 36, -227, -79, -94, -13, +0, +212, 31, -194, -200, -125, -117, -106, -53, +62, +201, +82, +185, +140, 148, -223, -157, -157, -125, -59, -124, -224, -13, -191, -109, -250, -190, -55, -131, +104, +12, +229, 146, -122, -133, -15, -190, -189, +101, +117, +69, +69, +96, +226, +27, +98, +91, +43, +208, +225, +80, 121, -186, -2, -139, -230, -148, -114, -68, -123, -97, -194, -251, 156, -2, -199, -80, -194, -85, -138, -132, -51, -153, +37, +144, +95, +158, +22, 143, -242, -57, -206, -78, -83, -121, -140, -122, -8, -211, -164, +72, +35, +170, +129, +4, +17, +215, +37, +191, +77, +7, +128, +236, +117, 120, -157, -208, -225, -156, -219, -106, -30, -92, -76, -225, -43, -242, +42, +23, 100, -152, -151, -143, +67, +246, +57, +212, +74, +90, +250, +14, 198, -242, -218, -120, -122, -107, -151, -52, -160, -175, -205, -244, -181, -48, -16, -68, -132, -185, -48, -197, -210, -152, -113, -252, -173, -92, -50, -182, +133, +225, +192, 88, -38, -79, -22, -61, -239, -200, -244, -86, 228, -136, -239, -76, -62, -131, -63, -181, -156, -129, -38, -117, +28, +43, 2, -30, -155, -81, -154, -87, -253, 71, -80, +12, +210, +5, +211, +17, 16, +190, +219, +121, +128, +170, +79, +233, +132, +121, +35, +172, +61, +159, +114, +34, +43, +38, +44, +7, 133, -41, -25, -157, -89, -199, -157, -65, -65, -124, +242, +75, +17, +46, +15, +100, +32, +132, 171, +216, +129, +26, 46, -199, -22, -1, -124, -96, -153, -146, -201, -111, +144, +120, +224, 45, -39, -183, -177, -196, -211, -220, -3, -62, -244, -96, -250, -154, -98, +128, 135, -138, -20, -137, -65, -24, -38, +34, 40, -174, -167, -230, -83, -117, -196, -78, -179, -195, -105, -109, -130, -87, -214, -160, -197, -49, -63, -122, +2, +176, +56, 159, -146, -104, -197, -62, +32, +55, +225, +185, +129, +201, 126, -235, -125, -146, -59, +30, +60, +242, +203, +252, +204, 79, -116, -152, -141, -135, -233, -231, -88, -167, -215, -162, -146, -206, -244, -111, -210, -217, -133, -141, +55, +144, +36, +159, +18, +173, +254, +34, +171, +191, +8, +3, +50, +103, +71, +157, +212, 77, -42, -28, -213, -242, -131, +251, +26, +95, +114, +119, +238, +105, +229, +189, 23, -195, -227, -152, -28, -102, -234, -240, -163, -1, -198, 49, -221, -198, -156, -141, -51, -68, -81, -138, -108, -128, -188, -251, -34, -248, -40, -58, -195, -211, -47, -230, -106, -140, +25, +180, +246, +178, +44, +54, +84, +148, 19, -47, -159, -86, -211, -215, -4, -241, -152, -32, -96, -252, -106, -101, -33, +89, +87, +75, +50, 169, -252, -68, -59, -197, +76, +26, +31, +81, 164, -184, -251, -117, -77, -244, -220, -209, -187, -65, -50, -132, -85, -168, -156, -128, -94, -250, -145, -122, -155, -60, -220, -49, -152, -204, -237, -36, -220, -7, -91, -234, -17, -43, -122, -95, -86, -173, -161, -173, -198, -16, -50, -139, -114, -47, -153, -43, -56, -25, -20, -55, -243, 153, -117, -17, -2, -170, -26, -222, -242, -165, -245, -38, -5, -19, +16, +160, +80, 172, -49, -100, -38, -158, -203, -104, -201, -225, -187, -105, -238, -141, -112, -234, -120, -126, -25, -79, -73, -18, -218, -248, +153, 190, -188, -251, +151, 202, -42, -62, -219, -237, -31, -211, +109, +13, +164, +59, +206, +120, +172, +75, +122, +179, +121, +113, +97, +72, +58, +52, +73, +209, +81, +57, +245, +13, +11, +171, +101, +79, +28, +159, +139, +86, +24, +185, +144, +107, 202, -224, +140, +243, +14, 69, -53, -32, -223, -90, -255, -239, -43, +20, +69, +18, +129, 220, +206, +193, +57, +233, +123, +128, +195, +186, +53, 66, +131, +202, +99, +11, +20, +21, +108, +140, +42, +99, +8, +248, +112, +147, +139, +208, +125, +190, +183, 38, -238, -151, -212, -214, -164, -231, +115, +207, +119, +165, +102, +145, +185, +16, +68, +180, +178, 241, -51, -235, -138, -74, -78, -131, +160, +28, 139, -132, -144, -8, -17, -200, -4, -77, -89, -176, -114, -195, -104, -230, -4, +24, +236, +204, +234, +38, +111, +156, +101, +24, +255, +20, +99, +217, +108, +202, +233, +165, +240, +117, 222, -239, -140, -62, -87, +63, +168, +148, +146, +243, 226, -28, -176, -122, -169, -242, -246, -254, -147, -245, +43, +240, +64, +62, +215, +29, +211, 170, -35, -95, -222, -33, -228, +243, +88, +184, +246, 198, -231, -58, +145, +3, +217, +1, 21, -188, -182, -241, -171, -134, -197, -45, -199, -51, -171, -41, -109, -39, -97, -56, -175, -197, -45, -200, -104, -128, -220, -59, -189, -19, -199, -222, -44, -192, -40, -18, -162, 0, -138, -103, -67, -176, -137, -7, -62, -126, -112, +79, +68, +31, +32, +0, +116, 8, -169, -185, -172, -105, -100, -129, -151, -88, +232, +170, 252, -222, -230, +245, +134, +89, +157, +2, +42, +127, +137, +145, +211, 249, -86, -138, -241, -113, -136, +253, +16, +55, +44, +6, +97, +190, +8, +31, +2, +19, +65, 61, -40, -220, -26, -88, -70, +217, +109, +159, +89, +119, +4, +171, +14, +43, 115, -223, -210, +21, +121, +238, +141, +179, +180, +176, +34, +5, +63, +146, +96, +157, +71, +140, +95, +71, 177, -213, -131, -131, -43, -138, -219, -72, -174, -105, -25, -19, -70, -210, -91, -211, -97, -84, -122, -154, -6, -243, -48, -241, -154, -209, -229, -94, -79, +242, +189, +65, +68, +16, +45, +149, 151, -109, +176, +133, +142, +233, +106, +108, +17, +229, +242, +242, +97, +20, +153, +101, +232, +19, +107, +26, +105, +101, +118, +60, +183, +140, +179, +143, +65, 221, -151, -92, -7, -44, -195, +66, +183, +154, +121, +58, +26, +51, 216, +123, +134, +142, +212, 216, -39, -113, -163, +184, +148, +50, +237, +146, +147, +92, 122, -222, -178, -253, -232, +170, 122, -83, -76, -190, +199, 75, -32, -244, -195, +149, +169, +86, +59, +154, +80, +215, +236, +99, +162, +241, +220, +89, +214, +188, +168, +98, +8, +177, +170, +248, 67, -13, -197, -111, -160, -46, -131, -235, -230, +29, +38, +181, 34, -12, -102, -49, -121, -203, -233, -138, -40, -61, -12, -50, -92, -1, +162, +245, +65, +196, +152, +239, +78, +229, +132, +171, +42, +157, +179, 188, +116, +86, +51, +34, +106, 154, -124, -83, -194, -94, -113, -224, -31, -124, -199, -161, -212, -231, -60, -148, -20, -169, +99, +85, +193, +156, +21, 4, -93, -54, -120, -7, -41, -190, -135, -248, -157, -116, -69, -101, -110, 83, -1, -174, -67, -239, -242, -198, -123, -193, -225, -135, -253, -214, -132, -184, -27, -130, -20, -3, -104, -17, -69, -223, 115, -107, +41, 85, -30, -179, -142, -44, -93, -79, -164, -200, +169, +170, +107, +150, +38, +160, +159, +8, +66, +80, +159, +202, +23, 32, -45, -167, -120, -246, +7, +101, +153, +252, +114, +140, +106, +11, +254, 170, -174, -24, -136, 30, -224, -92, -187, -186, -235, -198, -214, -73, -26, -20, -113, +32, +165, +215, +16, +78, +223, +125, +184, +122, +95, +144, +55, +121, +192, +195, +120, +165, +234, +242, +66, +190, +152, +189, 10, -49, -71, -244, -4, 192, -187, -240, +30, +35, 162, -108, -182, -0, -231, -1, -44, -224, -237, -208, -37, -12, -1, +97, +57, +246, +26, +30, +120, +197, +16, 54, -177, -8, -175, -73, -191, -243, -36, -14, -4, -43, -245, 132, -34, -2, -37, -118, -201, -163, -248, -204, -244, -88, -77, -159, -80, -128, -137, -216, -199, -153, -26, -31, +198, +224, +231, +175, +200, +74, 150, -194, -17, -101, -126, -5, -68, -54, -130, -15, +167, +117, 249, -101, -1, +234, +151, +58, +230, +153, +188, +113, +85, +50, +206, +110, +163, +16, +128, +222, +184, +93, +236, +205, +230, 144, -176, -224, -62, -15, -6, -49, -185, -60, -228, -219, -202, -44, 226, +56, +13, +23, +120, +53, +197, +221, +46, +238, +20, +100, +196, +234, +93, +211, +37, +85, +112, +127, +164, +158, +249, +245, +213, +242, +217, +3, +243, +215, +250, +180, 186, -95, -254, +211, +2, +50, +73, +122, +17, +150, +110, +131, 128, +49, +192, +203, +153, +133, 178, -4, -26, +230, 209, +124, 21, -1, -128, -146, -31, -167, -50, +184, +252, +90, +29, +211, +117, +94, +94, +95, +79, 28, -199, -185, -39, -247, -56, -14, -112, -66, -25, -243, -24, -59, -55, -228, +44, +43, +204, +5, +6, +26, +136, +27, +175, +172, 4, +186, +126, +165, +61, +205, +238, +251, +84, 128, -252, +204, +242, +249, +174, +92, +35, +36, +187, +203, +6, +33, +204, +4, +48, +136, +28, +44, +11, +70, +156, 138, -88, -69, -17, -25, -152, -0, -5, -113, -26, -163, -67, -225, -127, -248, -184, -151, -130, -91, +136, +85, +227, 103, -24, -211, -132, -104, -106, -77, -66, -56, -100, -30, -169, -219, -17, -31, -60, -22, -47, -188, -74, -176, -10, -190, +121, +85, 8, -173, -198, -6, -233, -191, -27, +67, +130, +113, 108, -40, -177, +221, +222, +129, +109, +9, +243, +231, +191, +225, +59, +154, +239, +52, +11, +96, +124, +46, +5, +68, 18, -213, -28, -86, -197, -117, -186, -90, -91, -167, -252, -201, -19, -203, -123, +95, +30, +40, +156, +102, +101, +236, +34, 48, -254, -173, -244, -193, -3, -183, -232, -248, -179, -183, -220, -186, -237, -242, -135, -134, -120, -65, -91, -143, -138, -81, -66, -65, +37, +68, +229, +195, +43, +4, 55, -109, -61, -235, -132, -155, -185, -248, -206, -22, -115, -17, -104, +85, +5, 2, -38, -208, -61, -136, -193, -106, -156, -142, -38, -94, -37, -151, +36, +122, +15, 16, -173, 42, -32, -173, -100, -144, -9, -246, -144, -150, +47, +119, +93, +207, +120, +132, +166, 174, -15, -68, -171, +239, +37, +9, +159, +107, +243, +182, +107, 113, -185, -135, -55, -220, -71, +253, +17, +205, +225, +230, +13, +35, +90, +136, +77, +4, +205, +161, +8, +104, +131, +74, +70, +50, +165, 53, -96, -232, -101, -55, -109, -116, -14, -123, -57, -31, -16, -223, -57, -241, -106, +36, +209, +2, +225, +83, +168, +40, +247, +72, +9, +108, +104, 65, -79, -61, -136, -103, -46, -61, -58, -198, -235, -182, -228, -7, -97, -98, -195, -94, -218, -186, -100, -183, -240, +99, +197, +230, +70, +110, +166, +2, +132, 137, -48, -91, -34, -180, -91, -66, -43, -78, -220, -112, -149, -32, -128, -176, -43, -65, -158, -193, -20, -115, -217, -120, +243, +127, 53, +161, +196, +54, +202, +108, +32, +47, +70, +234, +214, +16, +64, 67, -173, -190, -92, -69, -252, -20, -41, -135, -74, -53, -245, -124, -166, -247, -242, +152, +34, 155, -125, -105, -126, -176, -111, -10, -99, -181, -100, -135, -66, -11, -200, -31, -173, +250, +65, +78, 120, -30, -174, -240, -176, -68, -43, -15, +119, 207, -174, -34, -86, -154, -8, -201, -219, -26, 56, -150, -226, -208, -167, -175, +90, +188, +228, +172, 119, -89, -56, -154, -176, -158, -96, -184, -6, -33, -66, +124, +255, +153, +244, +165, 40, -94, -147, -92, -212, -111, -74, -17, -54, -33, -63, -139, -71, -175, -239, -126, -232, -184, -229, -132, -56, -99, -99, -77, -47, -200, -25, -99, -105, -91, -138, -131, -93, -204, -140, -185, -235, -107, -145, -113, +13, +22, +176, +70, +122, 151, -206, -218, -131, -240, -110, -93, -39, -202, -38, -230, -26, -17, -66, -63, +125, 156, -25, -160, -191, -112, -161, -1, -252, -30, +135, +190, 68, -98, -217, -45, -210, -16, -153, -104, -108, -209, -245, -96, -136, -167, -245, -107, -44, -198, -130, -167, -202, -149, -116, +240, +35, +252, +35, 107, -196, -192, +232, +161, +227, +39, +243, +39, +113, +82, +230, +224, +253, +0, 135, -194, -239, -191, -124, -207, -2, -190, -8, +9, +39, +138, 255, -59, +219, +11, +163, 70, -43, +118, +223, +76, +175, +97, 40, -84, -158, -156, -226, -229, -200, -151, -177, -233, -165, -16, -151, -11, -193, -120, -59, -227, -125, -48, -196, -198, -60, +6, +30, +231, +207, +115, +134, +213, 67, -191, -131, -237, -98, -184, -97, -187, -94, -76, -255, -166, -27, -9, +178, +153, +22, +121, +224, +223, +70, +88, +15, +119, 198, -225, -97, -120, -21, -194, -235, +2, +22, +33, +216, +15, +50, +53, +67, +192, +162, +95, +227, +69, +217, +172, +70, +217, +177, +60, +26, +180, +5, 168, -97, -91, -239, -243, -145, -154, -20, -132, -40, -62, -80, -99, -54, -179, -200, -235, -92, -188, -252, -237, -160, -223, -234, -12, -135, -120, +126, +169, +138, +106, +152, +114, +240, 21, -20, -227, -200, -128, +186, +56, +138, +115, +72, +171, +175, +86, +167, +30, +173, +98, +209, 88, -235, -199, +70, +138, 239, -166, -203, -24, -204, -91, -54, -249, -108, -125, -236, -15, -17, -210, -132, -20, -6, -202, -62, -176, -54, -97, +172, +33, 17, -55, -119, -8, -162, +205, +190, 51, -23, -69, -156, -143, -128, -206, -194, +62, +191, +229, +122, +100, +170, +4, +134, +13, +82, +180, +37, +190, +247, +103, +33, +41, +139, +116, +129, +248, 189, -11, -209, +118, +238, +4, +179, +20, +121, +33, +88, +33, +186, +46, +110, +35, +46, +119, +49, +130, +80, +97, +175, +236, +201, +67, +159, +66, +182, +215, +178, +42, +177, +232, +104, 196, +244, +67, +40, +20, +88, 234, -233, -215, -69, +100, +47, +48, +168, +126, +36, +42, +13, +222, +84, +89, +232, +148, +57, +123, +90, +236, +173, +23, +33, +254, 135, -34, 183, -78, -22, -96, -55, -134, -98, -224, -121, -248, -64, -184, -155, -24, +178, 117, +90, +204, +208, +76, +96, +178, +133, +36, +35, +34, 6, -18, -206, -124, -103, +92, +225, +169, +55, +169, +228, +216, +219, +196, 9, -218, -58, -22, -209, -197, -197, -16, -52, +189, 85, -22, -212, -87, -200, -28, -73, -54, -116, -87, -202, -91, +93, +155, +133, 150, -239, -6, -35, -226, -176, -51, +237, 93, -149, -163, -70, -234, -105, -122, -207, -112, -234, -235, -211, -6, -12, -92, -85, -56, +106, +203, +40, +146, +145, +49, +129, +64, +237, +170, +242, +160, +176, +237, +181, +2, 50, -59, -94, -224, -115, -166, -190, -27, -190, -7, -210, -96, -78, -54, -161, -96, -78, -161, -229, -211, -248, 247, -92, -20, -58, -44, -132, +39, +9, +6, +1, +153, +82, +10, +104, +3, +239, +103, +242, +179, +13, +147, +175, +43, +118, +179, +212, +194, +95, +213, +48, +233, 56, -26, -120, +117, +103, +155, +172, +179, +234, +212, +214, 91, -88, -252, +40, +197, +170, +128, +198, +104, +203, 18, -87, -225, -28, -167, -64, -205, -214, -227, -209, -7, -239, -42, -8, +38, +33, +153, +22, +13, +197, +182, +67, +69, +14, +127, +204, +140, 210, -90, -184, -42, -159, -4, -237, +87, +232, +165, +47, +206, +200, +152, +66, 197, -141, -234, -48, -23, -161, -95, 70, -45, -28, -79, -33, -212, -160, -0, -248, -150, -163, -112, -32, -194, -229, -164, -141, -180, -190, -173, +218, +122, +3, +189, +18, 95, -212, -134, -174, -188, -149, -143, -183, 137, -79, -188, -64, -108, -181, -248, -180, -184, -163, -101, -182, +91, +82, +97, +204, 134, -100, -177, -186, -173, -209, -30, -16, -187, -59, -243, -114, -96, -118, -15, -244, -95, -98, +48, +164, +241, +162, +128, +86, +28, +28, +106, +235, +103, +93, +124, +86, +176, +7, +249, +63, +40, +51, +143, +143, +131, +181, +237, 147, -214, -190, -61, +48, +146, +232, +227, +220, +174, +248, +224, 197, -131, -219, -230, -125, -233, -173, -63, -112, -172, -239, -213, -125, -236, -82, -25, -120, -90, -239, +156, +107, +67, +22, +113, +107, +245, +190, +33, +106, +166, +175, +130, +137, +252, +252, +67, +103, +240, +209, +26, 94, -21, -225, -164, -202, -92, -225, -46, -145, 247, -177, -128, -229, -141, -137, -97, -24, -150, -140, -21, -75, +127, +193, +241, +208, +74, +236, +245, +71, +233, +147, +29, +190, +244, +29, +230, +50, +87, +251, +59, +108, 238, -186, -104, +241, +206, +248, +86, +167, +243, +2, +155, +61, +13, +238, +243, +25, +214, +58, +121, +6, +223, +126, +34, 222, -69, -220, -182, -254, +98, +139, +127, +151, +243, +59, +53, +55, +206, +129, +94, +77, +11, +61, +251, +212, +60, +209, +52, 51, -236, +212, +51, +6, +229, +95, +102, +75, +89, +228, +25, +73, +251, +14, +55, +200, +25, +230, +10, +205, +194, +82, +83, +80, 154, -121, -24, -126, -142, -173, +20, +39, +65, +205, +91, +100, +136, +29, +171, +155, +67, +254, +230, +64, +41, +225, 213, -50, -23, +102, +128, +209, 100, -153, -110, -96, -176, -130, -112, -152, -28, +175, +40, 163, -68, -188, -174, -49, -143, -114, -34, -176, -41, -60, -119, -239, -122, -90, -125, -122, -85, -165, -98, -125, -78, -235, -33, +221, +15, +39, +159, 247, +145, +208, +206, 149, -68, -96, -45, +147, +157, +235, +171, +230, +92, +219, +85, +80, 154, -187, +242, +42, +11, +216, +243, +252, +18, +37, +224, +246, +188, 102, -97, 72, -199, -59, -172, -88, -228, -130, -152, -165, -38, -245, -159, -178, +132, +73, +45, +64, +4, +6, +215, +82, +81, +6, +43, +96, +76, +69, +29, +190, 120, -102, -54, -133, +99, 34, -97, -169, -157, -7, -9, -81, -89, -226, +106, +41, +170, +101, +76, +69, +77, +0, +133, +198, +116, +212, +149, +204, +103, +76, +200, +128, 19, -215, +242, +10, +200, +168, +43, +95, 219, -121, -185, -42, -70, -132, -87, -148, -176, +152, +144, +151, +171, +251, +29, +146, +146, +122, +210, +163, +141, +201, +208, +47, 103, -67, -234, -15, -37, -107, -197, -149, -217, -42, -117, -149, +90, 39, -143, -157, -129, +21, +250, +151, +196, +3, +8, 199, -212, -94, -160, -135, -124, -39, -12, -161, -226, -71, -175, -171, -76, -164, +241, +9, +49, +244, +115, +213, +73, 74, -207, -94, -221, 61, -38, -181, -44, -156, -96, -115, -246, -75, -125, -34, -0, -119, -114, -49, +153, +175, +198, 100, -57, -231, -82, -156, -68, +116, +23, 206, -19, +236, +21, +236, +22, +184, +149, +221, 58, -23, -227, +137, +230, +3, +66, 173, +138, +189, +219, 62, -38, -211, -165, -16, -239, -19, -240, -108, -100, -22, -121, -181, -255, -37, +62, +17, +53, +161, 1, -122, -140, -34, -111, -114, -57, -221, -38, -238, -64, -121, -220, -231, +153, +75, +71, +176, +92, +37, +157, +7, +246, +26, +12, +161, +182, +135, +190, +15, +8, +237, +59, 58, -56, -179, -250, -1, -166, -14, -64, +45, +245, +164, +220, +154, +203, +170, +243, +248, +74, +40, +169, +45, +89, +188, +132, +97, +86, +87, +70, +116, +73, +163, +249, +149, +16, +35, +44, +231, +87, +69, +205, +187, +87, +66, +13, +158, +197, 123, -178, -36, -159, -139, -127, +162, +165, +210, +101, +29, 107, -208, -51, -52, -125, -14, -176, -234, -190, -241, -187, -138, -187, +146, +101, +206, +22, +113, +12, +232, +122, 90, -250, +46, 224, -39, -168, -28, -84, -185, -213, -87, -148, -142, -144, -75, -24, -21, -238, -118, -7, -31, -91, -49, -168, -62, -192, -247, -2, -78, -84, -2, -143, -198, -147, -112, -233, -49, +217, +149, +250, +195, 247, -204, -26, -230, +56, +241, +0, +251, +6, +220, +149, 188, -192, -234, -227, -108, -218, -175, -177, -147, -44, -98, -88, -128, -210, -30, -63, -237, -43, -66, -124, -235, -155, -30, -164, -173, -218, -128, -14, -80, -253, -193, -125, -64, -84, -167, -247, -156, -204, +95, 129, -134, -135, -215, -204, -3, -167, -121, -24, -176, 34, -207, -50, -207, -121, -50, -143, -32, -215, -85, -121, -40, -147, -23, -23, -63, -140, -141, -227, +172, +29, +203, +220, +195, +0, +18, +145, 7, -127, -91, -177, -21, -60, -78, -63, -227, -108, -214, -134, -190, -16, -15, -141, -248, -9, -253, -59, -181, -62, -178, -204, +18, +67, 216, -45, -118, -198, -194, +80, +76, +193, +230, +17, +195, +26, 75, -114, -169, -23, -56, -49, +24, 108, -23, -239, -78, -62, -165, -193, -214, -199, -21, -201, -59, -70, -99, -122, -241, -174, -156, +65, +97, +38, +13, +240, +155, +130, +179, +11, 159, -109, +121, +17, +38, +146, +81, +217, 163, -41, +96, +134, +131, +158, +89, +205, +224, 153, -183, -70, -147, -124, +126, +27, +78, +69, +104, +10, +134, +148, +248, +62, 196, -220, -16, -237, -57, -202, -127, -174, -161, -141, -100, +82, +72, +26, +207, +254, 63, -73, -108, -145, -45, -120, +75, +252, +15, +254, +156, +141, +238, +60, +136, +242, +139, +30, +84, +66, 18, -175, -224, -97, -111, -197, +232, +218, +153, 63, -120, -253, +213, +165, +36, 29, -81, -218, -83, -252, -140, -210, +162, +40, +198, +166, +249, +84, +20, 12, -123, -102, -45, +170, +128, +176, +15, +140, +25, +154, +250, +236, +73, +250, +240, +211, +18, +77, +124, +106, +9, +231, +246, +42, +34, +223, +47, +60, +72, +91, 80, +36, +206, +151, +1, +132, +203, +40, +196, +242, +140, +103, +86, +74, +37, +122, +130, 217, -89, -35, -204, +141, +227, +5, +215, +97, +184, +188, +207, +42, +75, +34, +223, 157, -230, -251, -125, -70, -165, -14, -39, -120, -213, -19, -143, -182, -89, -64, +137, +40, +218, +166, +78, +187, 33, -132, -110, -36, +42, +75, 194, -197, -92, -200, -176, +15, +105, +4, +13, +125, +105, +157, +68, +108, +194, +188, +224, +1, +216, +216, +235, +143, +186, +151, +221, +86, +115, +212, +237, +247, +236, 78, -245, -0, -62, -73, -166, -227, -210, -144, -10, -69, -142, -76, -205, -135, -123, -231, -19, -67, +111, +212, 25, -207, -160, -85, -118, -207, -252, -215, -238, -168, -56, -241, -215, -6, -19, -79, -215, +216, +195, +86, 167, -48, -111, -40, -214, -163, -55, -111, -229, -153, -236, -96, -179, -190, -233, -191, -235, -180, -237, -110, -207, -190, -109, -14, -248, -218, -103, -83, +215, +57, +37, +72, +121, +199, +21, +53, +185, +200, +147, +205, +71, +200, +120, +215, +164, +206, +129, +119, +178, +66, +36, +68, +156, +136, 39, -188, -70, -131, -158, -6, +250, +148, +255, +8, +54, 157, -102, -251, -67, -214, -254, -141, +46, +232, +9, +96, +139, +2, +255, +208, +81, +142, +149, +190, +0, +197, +21, 105, -251, -203, -238, -175, -156, +143, +194, +48, +57, +165, +240, 18, -225, -158, -201, -250, -249, -209, -180, -159, -181, -30, -254, -246, -220, -34, -42, -105, -191, -74, +89, +234, +195, +139, +8, +146, +26, +135, +15, 66, -151, -112, -72, -76, +68, +98, +149, 125, -7, -47, -239, -240, -208, -249, -252, -37, -221, -132, -62, -100, -116, +197, +217, 167, -157, -17, -248, -247, -157, -82, -150, -185, -187, +49, 4, -218, -142, -147, -133, -156, -170, -145, -255, -170, -52, -161, -226, -119, -67, -22, -7, -127, -73, -172, -5, -195, -200, -74, -244, -122, -103, -251, -84, -200, -83, -38, -176, -134, -83, -185, -235, -173, -79, -230, -31, -6, -147, -89, -5, -36, -242, -224, -31, -18, -194, -47, -95, -122, -189, -36, -11, -239, -147, -181, -211, +153, +98, 164, -94, -48, -231, -248, -221, +41, 80, -37, -241, -123, -83, -145, -130, -121, -230, -187, -248, -65, -163, -11, +131, +161, +0, +25, +157, +169, +128, +53, +172, +16, +133, +14, +2, 108, -195, -55, +26, 88, -187, -195, -247, -215, -219, +192, +74, 206, -160, -155, -237, +142, +224, 174, -239, -204, -154, -15, -71, -253, -219, -108, -108, -179, -182, 197, -237, -176, -97, +90, +46, +208, 95, -107, +239, +37, +22, +115, 226, -79, -157, -183, -85, -4, +103, +202, +46, +114, +48, +18, 170, -150, +56, +51, +140, +186, +162, +87, +58, +206, +135, 19, -220, -59, -113, -23, -43, -7, -154, -160, -80, -209, -3, -15, +88, +124, +246, +228, +64, +165, +79, +112, +194, 191, +225, +75, +182, +240, +32, 237, -159, -183, -173, +27, +123, +63, +221, +64, +144, +148, +120, +62, +198, +27, +190, +236, +19, +22, +243, +175, +99, +40, +157, +142, +165, +199, +48, +44, +72, +238, +102, +31, +18, +167, 248, -41, -166, -194, -114, +178, +97, +153, +39, +16, +104, +8, 90, -168, -83, -219, -154, -91, -68, -92, -246, -96, -232, -164, -81, +146, +229, 80, -13, -43, -10, -19, -161, +68, +54, +198, +2, +122, +18, +29, +89, 39, -33, -96, -97, -226, -192, -75, -227, -195, -220, -155, -204, -83, -212, -119, -192, -223, +110, +8, +235, 145, -65, -83, -248, -232, -22, -120, -80, -245, -62, -3, -9, -233, -38, -2, -88, -134, -239, -152, -0, -195, -79, -125, -25, -219, -36, -66, +204, +249, +31, 79, -248, -110, -92, +1, +73, +27, +113, +225, +197, +95, +161, +65, +90, 197, +206, +22, +191, +188, +63, +181, +230, +206, +114, 9, -151, -86, -78, -69, -86, -244, +156, 229, -228, -163, +139, +54, +5, +76, +121, 132, -190, -253, -116, -170, -66, -48, -73, -208, -39, -34, -59, +223, 141, -87, -145, -81, -42, -24, -14, -205, -69, -157, -9, -172, -46, -36, -71, -18, -39, -41, -149, 69, -236, +176, +24, +60, +56, +1, +20, +253, +18, +2, +151, +32, +74, +65, +84, +179, +137, +128, +241, +145, +66, +181, +58, 10, -12, -203, -172, -172, -77, -183, -242, -80, -195, -117, -175, -4, +248, +224, +121, +27, +159, +139, +57, +111, +252, +224, +68, +158, +3, +143, +124, +214, 165, -25, -33, -42, -203, -104, -162, +7, +225, +77, +27, +201, +153, +194, +159, +54, +17, +101, +225, +95, 148, +32, +9, +74, +204, +130, +172, 149, -194, -254, +152, +139, +56, +167, +239, +100, +252, +44, +11, +253, +89, 63, +126, 119, -75, -229, -176, -1, -189, -124, -233, -118, -211, -139, -31, -153, -34, -66, -72, -98, -83, -225, +42, +105, +166, 168, -78, -44, -138, -214, -110, -114, -197, -103, -21, -24, -140, -61, -84, -36, -120, -38, -165, -65, +49, +224, +142, 239, -22, -88, -160, -83, -55, -233, -169, -40, -9, -237, -210, -180, -226, -34, -215, -246, -78, -177, -38, 5, +159, +249, +218, +198, +204, +159, +202, +247, +150, 229, -9, -21, -203, -91, -39, -91, -243, -235, -95, -158, -212, -153, -31, -142, -29, -191, -126, -49, -160, -113, +252, +57, 246, -37, -13, -176, -213, -12, -234, -160, -61, +38, +241, +166, +245, +113, +252, +56, +99, +168, +7, +86, +42, +132, +117, +129, +114, +163, +100, +50, +190, +120, +20, +87, +149, 210, +142, +31, +221, 103, -53, -3, -145, -199, -25, -59, -95, -28, -109, -16, -203, -100, +79, +104, +18, +26, +89, +168, +32, +148, +88, +138, +12, 163, -246, -247, 238, -117, -244, -169, -163, -212, -145, -218, -27, +210, +58, +99, +124, +148, +25, +103, 164, -126, -85, +92, 228, -75, -76, +244, +29, +79, +62, +235, +172, +224, +157, +206, +127, +198, +128, 52, -49, -175, -85, -65, -159, -121, -36, -191, 8, -36, -184, -240, -126, -151, -72, -64, -152, -17, -27, -65, -140, -105, -108, -80, -17, -214, -164, -75, -126, -212, -35, -38, +99, +251, +12, +29, +159, +172, 2, -254, -158, -170, -252, -100, -13, -224, -180, -247, -192, 31, -143, -127, -77, -115, -193, -179, -230, -133, -108, -3, -5, -90, -178, -11, -86, -178, -168, -181, -18, -43, -14, -53, -48, -82, -210, -63, 72, -252, -26, +75, +95, +28, +98, 15, -17, -216, -44, -1, -198, -232, -138, -124, -150, -123, -182, -245, -211, -212, -233, -40, +197, +79, +234, +144, 83, -42, -211, -40, -78, -177, -95, -245, -141, -142, -12, -221, -100, -111, -101, -205, -43, -100, -241, -35, -163, -169, -116, -47, -134, -9, -150, +80, +3, +25, +113, +171, +96, +206, +25, +226, +67, 208, -153, -240, -175, -66, -189, -205, +103, +129, +204, +76, +73, +226, +182, +167, +56, +56, +160, +239, +145, +75, +0, +188, +207, 138, -72, -14, +134, +240, +18, +197, +133, 10, -81, -216, -111, -201, -71, -125, -68, -42, -50, -101, +182, +44, 243, -115, -100, -137, -46, -33, -133, -38, -156, -120, -88, -67, -246, -132, -82, -147, -61, -8, -171, -15, -88, -169, -28, -179, -120, -53, -126, -41, -242, -128, -187, -139, +249, +49, +112, +34, 200, -169, +106, +64, +165, +101, 40, -20, -162, -151, -253, -202, -133, +6, +16, 36, -173, -148, -80, +81, +232, +139, +168, 64, -178, -173, -72, -63, -220, -76, -79, -213, -135, -165, -84, -163, -201, -36, -199, -19, -122, -204, -165, +69, 228, -188, -50, -239, -165, -40, -91, +71, +161, 245, -18, -139, -67, -152, -146, -150, -157, -62, -199, -168, -137, +153, +177, +37, +188, 83, -229, -220, -236, -15, -43, -224, -69, -247, -151, -18, -146, +78, +210, +154, +71, +168, +65, +185, +170, 100, -136, -119, -236, -52, -241, -81, -27, -34, -250, -153, -30, -172, -254, -208, +78, +4, 122, -31, -57, -75, -242, -150, +241, +217, +58, +137, +169, 98, -128, -143, -8, -153, -146, -223, -56, -136, -191, -12, -1, -84, -252, -247, -171, -128, -30, -148, -82, -76, -190, -57, -180, -40, -246, -223, -16, -181, -207, -227, +52, 159, -210, -115, -242, -155, -155, -16, -18, -119, -174, -34, -103, -60, 230, -31, -22, -127, -223, -90, -69, +163, +162, +119, 49, -68, -121, -139, -255, -201, -254, -220, -242, -189, -229, -56, -116, +24, +145, +20, +53, +234, +95, +250, +247, +41, +110, +178, +240, +49, +96, +209, +155, +194, +102, 34, -55, -251, -213, -59, -172, -125, -126, -195, -133, -33, -251, -93, +181, +39, +182, +51, +140, 27, -136, -122, -101, -141, -188, -133, -242, -75, -248, -105, -83, -159, -157, -224, -222, -139, -194, -0, -37, -231, -157, -0, -212, -141, -149, +103, +3, 63, +206, +67, +69, +159, 63, -178, -201, -74, -154, -199, -23, -30, -148, +114, +246, +103, +105, +140, 16, -84, -255, -220, -226, -108, -128, -19, -254, -218, -11, -152, +38, 233, -1, -188, -128, -201, -214, -111, -230, -227, -48, -96, -229, -151, -177, -232, -39, -146, -227, -26, -201, -119, -217, -167, -229, +203, +24, +67, +34, +225, +49, +162, +170, +184, 80, -227, -210, -14, -164, -47, -190, -63, -44, -5, -155, -148, -209, -177, -239, -192, -251, -171, -28, -149, -169, -23, -148, -196, -222, -152, -88, -224, -47, -212, +29, +55, +140, +98, +58, +19, +194, +208, +199, +7, +183, 112, -13, 53, -227, -49, -98, -110, -158, -106, -93, -0, -182, -62, -131, -66, -74, -28, -228, 155, -0, -166, -212, -174, -64, -162, -98, -39, -231, -169, -95, -135, -113, -66, -244, -130, -145, -138, -125, +103, +115, 188, -201, -156, -45, -42, +244, +132, +102, +33, +205, +73, +218, 17, -112, -8, -103, -111, -177, -223, +158, +83, +185, +110, +115, +27, 105, -34, -40, -202, -232, -111, -168, -40, -11, -58, -96, -81, -242, -186, -157, -45, -129, -77, -28, -174, -188, -25, -159, -241, -49, -85, +153, +193, +41, 158, -182, -178, -177, -101, -232, -66, -54, -125, -11, -38, -80, -226, -140, -87, +89, 88, -160, -138, +205, +90, +57, +232, 72, -77, -89, -195, -123, -228, -130, -98, -81, +163, +240, +158, +141, +94, +233, 108, -224, -6, -86, -223, -149, -211, -169, -198, -22, -69, -232, -191, -40, +134, +165, +74, +98, +58, +121, +213, +103, 174, -60, -240, -97, -194, 7, -122, -19, -23, -51, -40, -149, -104, +47, +74, +86, 144, -178, -145, -216, -1, -239, -62, -149, -97, -233, -14, +106, +187, +217, 180, -77, -228, -27, -85, -54, -7, -148, -142, -82, -199, -161, -0, -132, -227, -115, -181, -151, -16, -16, -129, -97, +104, +41, +139, +141, +125, +48, +55, +91, +18, 211, -187, -53, -247, -150, -102, -134, -247, -35, -233, -103, -206, -48, -6, -41, -205, -32, -235, -61, -7, -222, -191, -6, +215, +54, 155, -77, -207, -20, -37, -129, -178, -103, -219, -103, -95, -63, -150, -226, -1, -231, -9, -112, -92, -73, -200, -13, -86, -33, -238, 43, -207, -158, -123, -250, -161, -112, -186, -87, +220, +164, 34, -67, -185, -243, -195, -7, -249, -170, -29, -70, -246, -42, -118, -102, -186, -65, -156, -101, -227, -134, -135, -4, -254, -143, -186, -132, -255, -95, -129, -213, -140, -251, -137, -235, -147, -201, +17, +99, +6, +92, +166, +16, 114, -101, -33, -21, -116, -234, -90, -221, -128, -30, -181, -23, +55, +211, +172, +229, 232, -199, -146, -105, -173, -24, -8, -133, -113, -116, -144, -201, -145, -1, 201, -1, -110, -107, -36, -19, -62, -211, -226, -42, -192, -84, -174, -112, -35, -28, -40, -246, -177, -192, -129, -183, +41, 144, -1, +23, +73, +218, +106, +183, +161, +198, +50, 119, -44, -74, -48, -94, -56, -121, -128, -110, +142, +139, 41, -75, -40, -123, -186, +193, +86, +156, +174, +41, +184, +248, +25, +101, +46, +175, +118, +140, +171, +84, +209, +222, +45, +55, 43, -254, -15, -70, -50, -63, -56, +84, +94, +101, +111, +221, +234, +114, +193, +65, 79, -141, -52, -99, -116, +10, +66, +42, +231, +19, +212, 149, -122, -238, 24, 32, -36, -48, -235, -174, -75, -196, +192, +2, +80, +241, +249, +56, +209, +24, +107, +143, +33, +47, +164, +242, +17, +17, +173, +252, +183, +92, 129, -113, +39, +207, +230, 140, -145, -6, -252, -102, -147, -240, -145, -249, -212, -202, -65, -109, -108, -95, -163, -90, -99, -74, -215, -151, -67, +56, +242, +2, +103, +75, +155, +105, +16, +161, +68, 73, -106, -168, -144, -137, -194, -231, -80, +195, +227, +193, +216, +200, +172, +20, +58, +5, +241, +64, +76, +5, +124, +25, +177, 7, -86, -170, -33, +47, +92, +197, +244, +177, 49, -12, +11, +56, +225, +238, +115, +233, +77, +135, +173, +173, +19, +169, +0, +72, +31, +99, +176, +164, +84, +75, +169, +110, +8, +67, +243, +245, +41, +28, +55, 175, -95, -48, -23, -35, -104, -168, -114, -174, -53, -130, -98, -76, -44, +78, +100, +241, +236, +221, +112, +192, 197, -154, 16, -194, -146, -145, -97, -202, -81, -106, -185, -197, -219, -179, -133, +84, +50, +71, +173, +143, 103, -90, -216, -119, -101, -49, -135, -240, -15, -113, +156, 190, -151, -103, -202, +100, +175, +29, +176, +149, +101, +60, +235, +241, +51, +123, +174, +194, +71, 104, -109, -189, -6, -140, -161, -52, -54, -166, -234, -24, -167, -36, -16, +190, +87, +94, +242, +14, 75, -144, -231, -99, -184, -81, -63, -97, +241, +179, +76, +216, +154, +94, 18, -49, -56, -195, +230, +62, +19, 41, -122, -18, -166, -169, -150, -23, -178, -228, -88, -2, -253, -199, -75, -100, -172, -45, -120, -242, -165, -214, -239, -182, -201, -204, -161, -152, -93, -211, -117, -130, +41, +128, +135, +155, +205, +240, +59, +25, +28, +191, 10, +60, +110, +110, +227, +242, +243, +203, +206, +210, +129, 48, -123, -90, -36, -207, -252, +29, +186, 104, -255, -5, -66, -202, -28, +113, +34, 101, -42, -198, -198, -201, -156, -249, -190, -29, -46, -89, -176, -159, -73, -172, -34, -175, -102, -92, -31, -220, -221, -153, -239, -165, -250, -206, -126, -230, -8, -84, -70, -41, +112, +142, +227, +211, +182, +74, 3, -201, -68, -207, +146, +177, +91, +60, +250, +39, +14, +192, 20, +200, 80, -191, -33, -115, -21, -165, -181, -151, -74, -216, -23, +126, +180, +15, +40, +206, +197, +89, 37, -166, -109, -124, -157, -216, -207, -164, -229, 33, -35, -38, -207, -138, -179, -23, -9, -150, -47, -30, -92, -191, -164, -135, -6, +132, +104, +77, +208, +246, +225, 221, -73, -11, -215, -231, -71, -128, -205, -249, +242, +38, +165, +10, +230, +238, +39, 21, -63, -247, -60, -162, -141, -190, +240, +133, +120, +151, 173, -222, -224, -201, -123, -8, -253, -99, -104, +60, +226, +202, +111, +11, +135, +76, +231, +1, +53, +28, +81, +1, +105, +172, 120, -86, -207, +152, +149, +115, +71, +175, 134, -206, -157, -50, -244, -2, -112, -8, -183, -69, +214, +122, +55, +93, +87, +94, +73, +179, +57, +164, +54, +63, +165, +78, +196, +132, +55, +145, +42, 66, -109, -212, +39, +166, +235, +216, +163, +3, +75, +62, +166, +139, +64, +36, +62, +32, +1, +161, +134, +146, +5, +64, +32, +68, 175, -124, +231, +236, +59, +200, +241, +200, +175, +53, +63, +19, +88, +162, +154, 221, -90, -93, -167, -34, -32, -123, -192, -40, -86, -72, -128, -184, +196, +179, +212, +120, 20, -132, -153, -86, -213, -43, -117, -191, -112, +127, +199, +155, +21, +254, +155, +96, +38, +40, 13, -242, -31, -214, -43, +132, +20, +182, +23, 203, -234, -242, -92, -156, -236, -46, -70, +76, +20, +218, +110, +233, +103, +96, +96, +38, +225, 146, -153, -19, -105, 146, -154, -91, -153, -200, -50, -137, -180, -64, -228, -42, -240, -30, -141, -40, -221, -191, -245, -134, +127, +192, +32, +54, +92, +8, +145, +208, +87, +235, +90, +164, +149, +139, 215, -229, -137, -14, -56, -135, -26, -216, -80, -79, -105, -107, 151, -249, -206, -19, -55, -201, -217, -228, -25, -126, -108, -63, -11, +3, +38, +6, 177, -157, -225, -137, -222, 134, +146, +69, +176, +207, +112, +27, 33, -133, +163, +69, +32, +188, +248, +27, +95, +44, +188, +135, +148, +156, +34, +239, +218, +166, +174, +234, +157, +173, +225, +110, +70, +90, +14, +151, +114, +144, +191, +140, +148, +81, +63, +178, +7, +237, +88, +92, 221, +228, +199, +50, +116, +232, +18, +161, +46, +95, +109, 8, +78, +105, +229, +209, +28, +147, +97, +187, +122, +41, +74, +6, +85, +58, +203, +213, +179, +45, +72, +193, +253, +169, +244, +81, +209, +159, +193, +133, 150, -75, -1, -103, -52, -153, -67, +97, +237, +96, +200, +97, +2, +65, +196, +168, +36, +224, +192, +81, +252, +168, +78, +41, +29, +48, +119, +98, +155, +100, 93, -19, +143, +153, +106, 72, -25, -33, -147, -7, -198, +149, +22, +51, +151, +240, +28, +91, +247, +243, +44, +30, +141, +6, +179, 48, -86, -163, -52, -173, -69, -201, -105, -45, -202, -76, -203, -120, +22, +137, +242, 179, -76, -62, +184, +100, +9, +57, +23, +209, +99, +33, +58, +146, +6, 199, -187, +3, +39, +214, +181, +78, +192, +177, +8, +150, 40, -220, -155, -155, -0, -175, 139, -66, -143, -114, -245, -180, -224, -70, -149, -39, -50, -219, -149, -196, -118, -97, -210, -199, -137, -19, -149, -72, -90, -154, -225, -109, -220, +162, +80, 36, -152, -172, -212, -225, -37, -14, -44, -139, -134, +63, +133, +147, +201, 42, -117, -14, -240, -155, -160, -95, -211, -41, -107, -122, -132, -98, -8, -174, -141, -143, -249, -71, -37, -6, -50, -61, -193, -21, -113, -128, -52, -79, -185, -128, -34, -132, -88, -128, -18, -150, -242, -189, -162, -175, -3, -233, -54, -51, -238, -159, -17, -47, -126, -203, -117, -124, -213, -193, -70, -168, -43, -56, -70, -9, -239, -7, +58, +85, 33, -151, -217, -247, -44, -26, +148, +152, 135, -113, -221, -14, -15, -101, -15, -35, -98, -7, -221, -38, -69, -188, -247, -55, -247, -214, -137, -32, -67, -224, -169, -149, -178, -68, -232, +110, 105, -118, -188, -74, -146, -48, -176, -177, -134, -108, -125, +245, +144, +150, +90, +21, 250, -11, -187, -151, -231, -3, +230, +118, +10, +55, +44, +124, +7, 61, -214, -210, 192, -177, +48, +138, 117, -130, -104, -26, +146, +249, +47, +69, +196, +177, +180, +72, +156, +32, +115, +186, +159, +98, +246, +31, +216, +53, +227, +56, 244, -19, +87, +137, 104, -52, -250, -209, -51, -159, -147, -187, -90, -44, -237, -5, -91, -132, -209, -19, -96, -28, -195, -117, -91, -15, +156, +121, +89, +48, 7, -174, -230, -75, -32, -210, -149, +177, +67, +126, +79, +16, +71, +7, +63, +192, +179, +238, +239, +150, +100, +252, +201, +155, +225, +99, +24, +185, +111, +78, +173, 134, +242, +187, 179, -189, -40, -210, -40, -207, -58, -163, -141, -91, -213, -171, -88, -231, -149, -118, -30, -70, -73, -206, -41, +179, +111, +135, +143, +188, +225, +183, +77, +223, +247, +102, +80, 82, -42, -205, -212, -152, +175, +240, +193, +183, +55, +207, +87, +96, +209, +156, 82, -174, +142, 104, -50, -106, -119, -147, -153, -132, -27, +47, +76, 120, -152, +159, +83, +224, +24, +74, +184, +74, +145, +112, +38, +243, 81, -250, -63, -191, -173, -194, -228, -103, -250, +62, +199, +217, +105, +42, +143, +81, +15, +97, +154, +20, +175, +19, +58, +156, +115, +91, +205, +131, +139, +41, +124, +69, +158, +12, +243, +242, +209, +88, +94, +27, +79, 111, -45, -150, -1, -72, -189, -55, -145, -50, -137, -206, +237, +146, +6, +244, +181, +153, +190, +22, +6, +130, +136, +48, +23, +166, +88, +26, +51, +142, +191, +149, +75, +198, +22, 203, -35, -167, -155, -231, -8, -90, -50, +228, +217, +162, 231, -115, -45, -84, -229, -238, -80, -143, +29, +153, +222, 138, -10, -166, +28, 241, -45, -26, -159, -194, +157, +201, +103, +240, +167, +150, +51, +208, +164, 78, -79, -84, +192, +99, +51, +74, +243, +170, +255, 8, -250, -128, -112, -32, -203, -93, -172, -158, -248, -191, +10, +162, +48, +37, +163, +51, 235, -229, -246, +184, 51, -135, -139, -24, -189, -166, -169, -57, -137, -99, -187, -158, +40, +136, +111, +213, +229, +216, +34, +128, +143, +44, +83, +50, +249, +173, +229, +228, 54, -182, -107, -109, -70, -14, -85, -170, -179, -187, -237, -163, +150, +120, +154, +123, +196, +135, +30, +76, +95, 83, +236, +80, +145, 34, -12, -6, -243, -39, -58, -221, -12, -141, -82, -129, -113, -107, -153, -112, -237, -230, -7, -123, -120, -215, -227, -255, -199, -40, -249, -14, -154, -221, -244, -115, -205, -116, -242, -238, -160, -217, -232, -174, -51, -84, -219, -233, -36, -210, -66, -187, -247, -157, -118, -47, -223, -82, -39, -133, -22, -71, -124, -123, -55, -200, -53, +49, +8, +195, +4, +197, +245, 212, -73, -112, -132, -134, -151, -131, -174, -218, -76, +124, +170, +142, +216, +105, +118, +56, +173, +77, +240, +202, +26, +180, +56, +230, 39, -169, -17, -249, -217, -28, -221, -13, -212, -134, -58, -57, -186, -156, -155, -163, +239, +62, +137, +86, +236, +211, 183, -246, +222, +189, +220, +121, +162, +195, +108, +60, +76, 63, -155, +199, +58, 189, -187, -230, -192, +22, +149, +116, +166, +127, +147, +206, +46, 108, -45, +108, +82, +225, 168, -229, -101, -231, -98, -144, -107, -170, -179, -30, -212, -244, -166, -57, -104, +150, +31, 189, -53, -90, -15, -106, -215, -188, -29, -116, -175, -141, -86, -67, +24, +30, +199, +228, +48, +83, +135, +31, +13, +48, 142, -103, -182, -20, -130, -53, -119, -74, +233, +54, 230, -185, -206, -82, -200, -102, -215, -101, -22, -162, -121, -119, -117, -55, -204, -18, +108, +156, +33, +138, 82, -255, -166, +100, +3, +228, 221, -112, -216, -185, -29, -117, -110, -46, -58, -131, +23, +193, +71, +209, +25, +158, +126, +49, +87, +99, +156, +120, +249, 180, -237, -223, -181, -219, -246, -91, -163, +154, 190, +38, +136, +199, +4, +1, +227, +87, +43, +11, +73, +229, +39, 218, -242, -31, -218, -45, -123, -253, -119, -249, -65, -95, -235, -75, -78, -187, -211, -42, -180, +41, +38, +197, 221, -32, -58, -58, -17, -181, -102, -49, -180, -152, -174, -74, -237, -49, +175, +107, +162, +231, +142, +222, +13, +146, +33, +172, +66, +229, +4, +244, +210, 143, -19, -211, -249, -3, +212, +219, +228, +225, +142, +193, +100, 110, -103, -43, -25, -36, -218, +39, 225, -180, -122, -157, +62, +216, +82, +143, +88, +209, +251, +178, +106, +13, +109, +53, +134, +144, 89, -29, -120, -99, -166, -186, -189, -16, -145, -237, -228, -63, -32, -111, -4, -133, -221, -138, -208, -96, -7, -11, -0, -204, +148, +123, +201, +92, 193, +201, +160, +184, +153, 207, -42, -2, -13, -1, -192, +172, +139, 16, -198, -201, -158, -189, -105, -222, -144, +80, +213, +240, +150, +47, +173, +55, +41, +152, +96, +141, +33, +51, +241, +92, +70, 75, -142, -157, -46, -156, -0, +14, 223, -128, -241, -156, -109, -192, -93, -73, -244, -133, -48, -95, -208, -73, -24, -144, -15, -68, -56, -109, -17, -201, -0, -195, -124, -161, -238, -7, -226, -114, -109, -45, -6, -106, -157, -76, -36, -224, -187, -204, -181, -7, +77, +115, +111, +132, +83, +199, +243, +203, +120, +74, +146, 208, -145, -79, -89, +198, +247, 229, -21, -165, -206, -60, -176, -7, -177, -34, -177, -19, +221, +87, +86, +241, +217, +110, +255, +152, +86, +6, +47, +170, +1, +249, +214, 250, -75, -235, 127, -255, -87, -73, +223, +224, +22, +50, +113, +191, +164, 182, -29, -134, -11, -24, -35, -242, -238, -249, -154, -197, -80, -226, -67, -218, -7, -52, -139, -5, -130, -212, -139, -200, -97, -235, -227, -64, -166, -196, -124, -178, -78, -40, -73, -248, -51, -131, -250, 38, -74, -174, -12, -190, -86, -99, -44, -1, -141, -10, -144, -244, -49, -243, -167, -133, +61, +143, +159, +89, +87, +84, +114, 26, -177, -24, -132, -16, +92, +36, 132, -8, -146, -207, -162, -172, -189, -75, -245, -255, -100, -205, -55, -26, 68, -246, -132, -174, -59, -137, -125, -33, -139, -113, -5, -146, -71, -235, -11, -194, -30, -151, -252, -22, -160, -164, -239, -200, -14, -33, -238, -65, +136, 64, -123, -139, -210, -6, -32, -52, -113, -18, +38, +104, +202, +130, +149, +27, 70, -176, -114, -64, -0, -4, -44, +51, +39, 240, -245, -162, -42, -40, -20, -188, -143, -116, -99, -213, -108, -72, -142, -70, -228, -168, -25, -63, -227, -23, -152, -202, -116, -155, -165, -8, -65, -231, -52, -178, -192, -74, -21, -235, -100, -171, +126, +103, +244, 185, -40, -24, -187, -245, -9, -135, -202, +18, +231, 128, -199, -114, -159, -210, -31, -63, +213, +75, +149, +183, +247, +191, +91, +111, +58, +242, +229, +29, 66, 110, -218, -167, -51, -235, -109, -248, -0, -72, -12, -13, -177, -170, -32, -74, -190, -19, -204, -86, -156, -94, -138, -180, -225, -235, -74, -114, -19, -123, -11, -136, -203, -1, -64, -3, -132, -211, -16, -76, -32, -168, -227, -34, -135, -176, -12, -184, -4, -140, +124, +174, 83, -97, -51, -160, -200, -131, -36, -70, -253, -61, -160, 193, -245, +107, +27, +191, +105, +88, +220, 114, -223, -97, -253, -95, -28, -21, -170, -136, +60, +179, +154, +210, +118, +18, +134, +243, +90, +220, +130, +140, +6, +200, +189, +211, 59, -24, -150, -30, -100, -152, -205, -66, -198, -157, 113, -200, -25, -41, -190, -194, -154, -221, -49, -214, -255, -77, +236, +205, +2, +140, +34, +33, +10, 160, -132, -12, -101, -143, -35, -246, -142, -100, +120, +54, +4, +155, +120, +224, +227, +7, +135, +144, +154, +203, +154, 70, -18, -114, 22, -240, -93, -99, -148, -79, -5, -108, -43, -87, -73, -60, -75, -17, -42, -255, -50, -153, -38, -5, -53, -100, -25, -46, -128, -160, -146, -190, -146, +120, +137, +197, +239, +109, +158, +111, +165, +24, +31, +135, +216, +131, +194, +173, +129, +101, 52, -99, -8, -16, -39, -80, +247, +45, +29, +91, +61, +56, +184, 162, -240, -209, -206, 184, -120, -250, +141, +228, 154, -16, -61, -59, +150, +49, 97, +36, 189, -16, -64, -157, -68, -39, -24, -170, -145, -85, -14, -113, -229, -155, -10, +53, +29, +70, +165, +167, +105, +48, +15, +19, +175, +25, +93, 238, -42, 245, -39, -42, -21, -133, -106, -128, -239, -176, -159, -144, -238, -159, -136, -159, -13, -36, -228, -39, +116, +217, +214, +125, +201, +117, 192, -220, -199, -135, +50, +140, +141, +125, +18, +55, 170, -209, -135, -219, -142, -253, -87, -139, -5, -171, -5, -134, -29, -96, -138, -104, -76, -26, -32, -139, -59, -248, -201, -130, -208, -175, -172, -213, -237, -160, -127, +231, +45, 219, -25, -140, -62, -216, -111, -187, -189, -17, -111, +143, 174, -180, -108, -224, -167, -0, -203, -198, -71, -75, -7, +55, 197, -139, -214, -134, -246, -119, -195, -230, -85, -39, -223, -129, -241, -114, 228, -1, +187, +4, +66, +63, +60, +212, +80, +252, +6, +234, +50, +184, +110, +46, +194, +96, +22, +147, +183, +156, +174, +136, +210, +195, +32, +195, +21, +192, +171, +201, +55, +37, +236, +21, +7, +254, +193, +119, +28, +74, +125, +206, +67, +73, +145, +74, 208, -203, +101, +131, +119, +144, +226, +123, 136, -94, -121, -80, +223, +73, +87, +84, +230, +54, +21, +224, +58, 244, -12, -61, -132, -95, -121, -96, -117, -214, -176, +46, 111, -60, -151, -130, -49, -8, -93, -196, -120, -114, -241, +188, +23, +28, +126, +216, +111, +77, +136, +187, 33, -182, -211, -214, -40, -25, -52, -70, -100, -15, -247, -78, -164, -31, +72, 49, -151, -109, -197, -51, -107, -131, -219, -50, -149, -105, -112, -92, -78, -185, -160, -150, -122, -126, -0, -186, -106, -125, -124, -160, +128, +22, +81, +244, +61, +183, +86, +229, +49, +235, +200, +210, +245, +68, +138, 12, -218, -105, -78, -139, -194, -89, -75, 210, -93, -194, -63, -108, -66, -177, -113, -164, -3, -117, -110, -174, -61, -91, -8, +114, +138, +103, +175, +234, +138, +129, +232, 1, -189, -62, -95, -70, -19, -70, -80, -172, -36, +206, +181, +171, +187, +110, +108, 157, -53, +164, +65, +17, +167, +16, +115, +68, +79, +0, +188, +11, +47, +202, +102, +11, +112, +30, 192, -36, +2, +222, +14, +93, +194, +16, +96, +19, +139, +240, +154, +244, +59, 79, -252, -149, -40, -150, -147, -90, -104, -101, +226, 64, -56, -53, -160, -62, -142, -43, -197, -169, -152, -114, -173, -16, -42, +176, 82, +79, +40, +34, 80, -66, -88, -203, +98, +151, 60, +138, +207, 76, -86, -57, -18, -175, -114, -155, -48, -51, -73, -75, -79, -224, -185, -35, -175, -68, -204, -187, -70, +143, +213, +244, +9, +5, +152, +136, +125, 156, -186, -146, +169, +241, +97, +41, +28, +81, +230, +87, +64, +100, +35, +248, +144, +95, +22, +0, +9, +11, +238, 243, -237, 96, -106, -186, -206, -209, -247, -95, +16, +147, +203, +67, +190, +173, +204, +34, +174, +251, +229, +15, +40, +75, +160, +17, +93, +17, +0, +40, +249, +113, +42, +195, +113, +156, +7, 114, -234, -213, +143, +227, +0, +39, +148, +49, +143, +177, +115, +67, +78, +0, +200, +175, +136, +85, +20, +145, +129, +9, 80, -245, -163, -230, -250, -140, -189, -53, -131, +16, +167, +49, +58, 20, -124, -189, -33, -204, -170, -228, +254, +135, +143, 123, -160, -44, -210, -98, +41, +184, +117, +134, +49, +77, +136, +166, +214, +36, +132, +67, +230, +137, +186, +29, +241, +193, +99, +241, +194, +171, +4, +171, 224, +139, +208, 106, -52, -247, -225, -202, -65, -32, -20, -17, -107, -65, -133, -194, -110, -167, -226, -99, -22, -121, -59, -115, -159, -153, -43, -66, -155, -62, -213, -193, -230, -161, -239, -36, -214, -43, +108, +144, 254, -100, -112, -40, -139, -11, -105, -65, -157, -201, +187, +193, +134, +18, 43, -13, +81, +205, +97, +85, 92, -215, -18, -38, -202, -11, -136, -69, -202, -229, -187, -150, -195, -155, -33, -146, +167, +171, +181, 117, -225, -107, -213, -41, -105, -174, -145, -32, -85, -76, -14, -234, -218, -75, -179, +202, +159, +60, +177, +188, +7, +227, 223, -75, -82, -120, -57, -92, -175, -50, -168, -0, -176, -62, -252, -23, +74, +31, +60, +112, +139, 142, -6, -54, -171, -163, -87, -43, -170, -22, -123, -11, -72, -132, -55, -128, -181, -179, -202, -186, -97, -240, +63, 123, -215, -33, -108, -190, -200, -227, -235, -240, -59, -64, -217, -222, -200, -22, -162, -22, -233, -71, -239, -147, -19, -144, -107, -166, -108, -213, -98, -226, -147, -249, -73, -167, 203, -185, 173, +219, +46, +127, +104, +136, 23, -191, +180, +245, +168, +24, +37, +20, 116, -246, -21, -15, -58, -136, -74, -221, -49, -137, -106, -70, -90, -197, +211, +214, +179, +78, +184, 153, -166, -113, -168, -202, -122, -11, -11, -58, -203, -62, -23, -183, -17, -70, -147, -42, -187, -142, -70, -231, -124, -249, -208, -79, -121, -218, -203, -249, -196, -178, -254, -68, -185, -5, -132, -226, -197, -80, +139, +239, +108, 49, -205, +23, +129, 38, +96, +2, +61, +128, +24, +172, +198, +233, 104, -89, -157, -100, -98, +226, +85, +114, +9, +209, +170, +2, +210, +74, +6, +153, +96, +15, +105, +233, 250, +64, +180, +26, +151, +123, +120, +195, +125, +84, +3, +134, +94, +118, +211, +70, +231, +176, +151, +243, +1, +241, +157, +19, +175, +22, +244, +212, +131, +120, +230, +210, +163, +99, +188, 110, +75, +126, +16, +38, +54, +236, +165, +173, +75, +118, +11, 159, -201, -4, +8, +179, +37, +66, +187, +37, +180, +226, 196, -135, -236, -152, +13, +87, +9, +2, +8, +187, +18, +228, +25, +76, +49, +151, +141, +87, +51, +212, +234, +203, +85, 196, -159, 79, -78, -245, +145, +114, +168, +84, +83, +207, +103, +122, +47, +191, +217, +151, +230, +7, +251, +166, +48, 86, -154, +75, +118, +40, +180, +128, +252, +209, +138, +231, +225, 10, -25, -195, -28, -68, -189, -83, -112, -56, -6, -89, -249, -95, -216, +15, +75, +180, +242, +240, +236, +42, +98, +165, +137, +144, +188, +173, +129, +99, +41, +14, +125, +250, +122, +151, +133, 163, -222, -2, -170, -83, -54, -229, -184, -232, -1, -146, +9, +235, +9, 134, -11, -57, -204, +107, +16, +34, +132, +226, +53, +201, +69, +253, +166, +20, +97, +19, 242, -77, -158, +179, +120, +244, +250, +238, +135, +142, +91, +78, +136, 51, -159, -48, -150, -66, -0, -19, +54, +214, +244, 130, -81, -47, -68, -20, -108, -33, -113, +156, +49, +150, +182, 165, 56, -193, -77, -245, -241, -255, -93, -161, -177, -50, -156, -112, -179, -236, -147, -176, -161, -140, -181, -41, -91, -0, 216, -211, -65, -215, -230, -59, -85, -163, -102, -139, -210, -187, +197, +204, +152, 187, 190, -54, -76, -245, -80, -45, -161, -178, -157, -189, -81, -58, -59, -175, -218, -217, -247, -74, -103, -111, -170, -118, -246, -131, -210, -217, -247, -166, -157, -173, -229, -182, -240, +22, +25, +119, +233, +172, +61, +8, +239, +214, 117, -70, -167, +162, +108, +98, +174, +17, +33, +244, +195, +153, +1, +250, +11, +23, +26, +192, +239, +65, 36, -172, -96, -81, -84, -179, -208, -68, -41, 150, -166, -98, -4, -46, -108, -141, -194, +221, +34, 13, -216, -228, -171, -252, -124, -1, -242, -83, -236, -236, -71, -165, -179, -31, +145, +137, +198, +22, +93, +15, +134, +120, +94, +191, +198, +98, +44, +120, 170, -118, -246, -55, -165, -179, -31, -171, -118, -246, -119, -165, -179, -191, -85, -237, -236, -31, -74, -103, -127, -175, -218, -217, -107, -53, -146, +92, +73, +183, +70, +12, +124, +40, 252, -31, -85, -119, -112, +254, 203, -193, -84, -172, -244, -85, -43, -119, +247, 44, -131, -131, -61, -230, -29, -86, -201, -52, -131, -61, -108, -187, -240, -236, -20, -49, -141, -220, -241, -175, -155, -249, +224, 139, -217, -204, -107, -162, -68, -69, -174, -17, -223, -56, -9, -241, -181, -106, -179, -88, -65, -233, -37, -42, -91, -71, -79, -178, -137, -243, -153, -159, -22, -88, -102, -2, -125, -233, -62, -43, -149, -9, -2, -29, -222, -31, -74, -194, -108, -135, -172, +240, 191, -13, -14, -176, -189, -5, -14, -138, -107, -10, -82, -91, -211, -69, -69, -221, -43, -53, -102, -62, -146, -129, -112, -48, -159, -162, -40, -56, -241, -156, -69, -108, -44, -92, -97, -16, -96, -208, -197, -1, -172, -217, -132, -255, -133, -165, -254, -159, -124, -194, -154, -166, -218, -42, -47, -228, -169, -178, -26, -243, -95, -148, -187, -235, -108, -85, -89, -80, -198, -32, -237, -178, -28, -12, -18, -45, -67, -106, -115, -194, -35, -56, -222, -146, -97, -165, -176, -168, -0, -49, -207, -58, -89, -176, -197, -152, -95, -174, -164, -6, -226, -23, -169, -11, -152, -80, -238, -18, -69, -80, -12, -153, -169, -138, -241, -245, -73, -228, -88, -233, -93, -79, -38, -40, +99, +180, 130, -110, -57, -179, -46, -129, -126, -43, +66, +229, +201, +41, 94, -178, -9, -56, -57, -211, +142, +124, +25, +155, 94, -228, -233, -6, -33, -32, +10, +113, +185, 16, -114, -18, -207, -67, -120, -152, -69, -74, -225, -233, -190, -97, -129, -99, -24, -253, -208, -173, -126, -175, -215, -105, -141, -236, -191, -110, +140, +183, +51, +222, 7, -115, -104, -202, -169, -193, -229, -14, -227, -70, -255, -127, -246, -190, -180, -185, -141, -28, -75, -240, -115, -207, -175, -192, -122, -35, -182, -228, -29, -90, -85, -182, -171, -123, -122, -186, -35, -118, -131, -150, -104, -155, +67, +108, +204, 51, -186, +244, +59, +216, +46, 134, -148, -221, -213, +27, +182, 235, -80, -48, -146, -76, -144, -204, -118, -50, -147, -157, -153, -148, -196, -250, -245, -251, -14, -32, -15, -30, -34, -144, -7, -73, -121, -52, -209, -83, -22, -73, +197, +244, +111, +186, +145, +96, 28, -15, -15, -192, -195, -187, -31, +30, +134, 87, -185, -198, -209, -112, -14, -10, -236, -201, -86, -205, -249, -36, -116, -173, -81, -44, -182, -243, -64, -241, -171, -81, -4, -208, -160, -14, -193, -199, -208, -171, -101, -54, -194, -169, -232, +33, +188, 142, +26, +182, +245, +75, +62, +82, +147, +130, +16, 197, -50, -92, -136, 7, -244, -79, -194, -145, -238, -67, -207, -37, -135, -155, +106, +204, +102, 22, -165, -135, -208, -254, -8, -94, -60, -72, -59, -221, -165, -85, -68, -173, -125, -241, -189, -248, -135, -189, -59, -107, -81, -112, -233, -90, -179, -3, -170, -74, +121, +157, 139, -243, -160, -37, -140, -137, -233, -22, -52, 151, -138, -233, -153, -99, -125, -77, -105, -150, -93, -61, -21, -176, -205, -174, -106, -42, -246, -80, -237, -11, -21, -216, -37, -176, -127, -46, -183, -55, -168, -49, -166, -76, -13, -234, -117, -107, -176, -28, -49, -92, -216, -56, -75, -80, -211, -210, -75, -144, -51, -47, -142, -137, -187, -138, -57, -103, -132, -61, -119, -14, -7, -76, -103, -155, -200, -150, -209, -104, -60, -211, -42, -236, -105, -178, -139, -242, -105, -92, -88, -119, -31, -83, -10, -26, -202, -123, -238, -27, -90, -204, -42, -101, -11, -74, -29, -29, -0, -112, -101, -155, -64, -138, -173, -1, -144, -202, -146, -30, -83, -197, -97, -124, -63, -248, -49, -137, -78, -94, -11, -120, -140, -206, -249, -225, -195, -85, -227, -72, -246, -188, -110, -144, -46, -85, -234, -197, -27, -156, -192, -60, 191, -103, -190, -222, -53, -223, -142, 29, -75, -182, -47, -242, -152, -51, -58, -15, -84, -249, -115, -118, -249, -201, -114, -241, -86, -96, -65, -127, -187, -24, -92, -118, -250, -104, -143, -109, -48, -239, -134, -218, -132, -50, -20, -204, -149, -243, -72, -82, -81, -193, -22, -63, -227, -19, -120, -149, -31, -236, -245, -101, -73, -13, -113, -33, -77, -172, -239, -54, -61, -32, -248, -16, -210, -48, -170, -230, -100, -26, -18, -163, -190, -22, -185, -251, -91, -168, -34, -159, -150, -202, -25, -46, -53, -211, -8, -183, -168, -191, -82, -10, -107, -3, -21, -216, -109, -225, -50, -171, -9, -200, -189, -245, -225, -124, -101, -124, -38, -171, -214, -193, -187, -185, -238, -223, -118, -175, -186, -183, -221, -246, -69, -247, -255, -117, -86, -226, -21, -72, -125, -3, -232, -137, -188, -201, -52, -201, -202, -134, -169, -187, -73, -169, -196, -188, -36, -53, -5, -94, -161, -39, -246, -189, -227, -249, -170, -96, -182, -178, -165, -218, -22, -177, -234, -117, -206, -59, -23, -157, -219, -206, -74, -0, -132, -134, -69, -21, -57, -46, -194, -193, -110, -169, -5, -87, -235, -221, -211, -106, -102, -249, -188, -243, -177, -211, -235, -229, -171, -94, -189, -218, -44, -12, -80, -104, -149, -226, -197, -57, -83, -91, -150, -25, -109, -229, -221, -97, -65, -128, 244, -20, -172, -162, -22, -84, -89, -146, -124, -251, -2, -122, -109, -87, -85, -17, -102, -176, -222, -116, -122, -253, -110, -46, -158, -65, -101, -76, -189, -193, -90, -10, -49, -185, -19, -231, -4, -3, -134, -193, -41, -212, -240, -203, -112, -150, -89, -113, -17, -113, -24, -191, -104, -14, -198, -245, -85, -167, -255, -249, -250, -118, -37, -250, -227, -15, -215, -44, -157, -68, -5, -241, -68, -100, -44, -58, -121, -47, -199, -210, -191, -71, -111, -156, -113, -2, -242, -147, -198, -215, -218, -212, -38, -113, -10, -179, -192, -187, -192, -147, -153, -79, -0, -174, -190, -48, -205, -255, -13, -67, -156, -123, -145, -84, -222, -9, -130, -122, -103, -142, -242, -14, -136, -252, -240, -197, -112, -225, -15, -5, -177, -120, -35, -114, -107, -54, -13, -102, -104, -7, -98, -117, -2, -26, -143, -78, -108, -234, -39, -247, -141, -38, -189, -83, -117, -191, -177, -126, -5, -154, -183, -98, -110, -74, -196, -11, -53, -89, -174, -30, -36, -102, -245, -86, -54, -80, -146, -128, -232, -71, -149, -11, -178, -82, -168, -18, -145, -206, -190, -36, -196, -136, -78, -115, -13, -145, -244, -41, -195, -30, -160, -120, -236, -77, -22, -120, -70, -129, -238, -17, -237, -201, -242, -250, -201, -104, -130, -46, -208, -142, -235, -45, -216, -53, -61, -63, -64, -174, -168, -109, -182, -4, -128, -236, -250, -252, -250, -47, -130, -210, -142, -112, -201, -62, -17, -2, -2, -8, -214, -167, -61, -192, -43, -101, -128, -167, -241, -62, -80, -92, -119, -254, -40, -232, -111, -76, -227, -88, -56, -48, -124, -196, -229, -210, -85, -165, -202, -40, -196, -180, -181, -120, -89, -124, -64, -63, -17, -54, -150, -203, -85, -254, -69, -120, -88, -81, -180, -55, -207, -22, -159, -129, -154, -59, -5, -42, -38, -189, -56, -165, -147, -159, -84, -171, -158, -188, -4, -46, -80, -113, -106, -58, -14, -248, -189, -106, -79, -52, -114, -20, -206, -84, -160, -197, -43, -149, -36, -229, -21, -183, -33, -105, -158, -238, -228, -220, -119, -150, -172, -148, -160, -212, -113, -10, -4, -249, -184, -99, -167, -54, -152, -202, -61, -42, -142, -183, -139, -55, -132, -103, -65, -86, -19, -3, -139, -169, -224, -50, -229, -206, -155, -183, -22, -70, -241, -128, -240, -160, -42, -53, -227, -114, -133, -134, -12, -81, -115, -146, -121, -238, -189, -6, -250, -76, -202, -140, -32, -20, -52, -53, -86, -154, -39, -69, -78, -139, -63, -231, -177, -76, -184, -37, -120, -225, -29, -148, -15, -106, -159, -40, -166, -98, -62, -151, -1, -217, -207, -19, -117, -177, -172, -5, -16, -194, -241, -8, -107, -137, -27, -33, -26, -23, -5, -119, -90, -227, -234, -86, -125, -180, -195, -117, -233, -221, -122, -183, -121, -183, -74, -110, -144, -35, -178, -229, -32, -10, -90, -207, -100, -203, -84, -122, -227, -217, -0, -193, -53, -72, -105, -108, -80, -224, -101, -187, -118, -132, -166, -176, -103, -155, -117, -6, -100, -194, -40, -83, -107, -38, -17, -106, -10, -65, -96, -149, -94, -185, -89, -186, -170, -202, -43, -55, -61, -233, -219, -86, -143, -96, -54, -176, -122, -32, -176, -36, -90, -52, -140, -129, -108, -26, -91, -161, -187, -204, -162, -208, -71, -182, -209, -229, -148, -160, -25, -122, -31, -187, -231, -13, -236, -162, -246, -39, -107, -120, -217, -217, -52, -150, -94, -155, -246, -41, -199, -53, -69, -106, -76, -142, -175, -88, -171, -74, -19, -163, -148, -66, -87, -219, -201, -73, -145, -26, -153, -173, -122, -133, -142, -236, -99, -217, -154, -10, -213, -189, -236, -202, -94, -237, -77, -45, -152, -175, -107, -221, -203, -205, -46, -146, -189, -251, -112, -153, -5, -89, -166, -53, -47, -62, -12, -13, -217, -91, -26, -94, -71, -138, -235, -38, -242, -153, -111, -76, -68, -200, -140, -153, -114, -241, -200, -75, -80, -101, -248, -232, -88, -162, -232, -154, -132, -209, -86, -197, -47, -187, -206, -166, -237, -180, -137, -182, -32, -129, -161, -106, -80, -253, -30, -139, -169, -244, -231, -216, -106, -2, -210, -247, -124, -237, -119, -142, -205, -70, -31, -148, -88, -192, -207, -248, -64, -209, -65, -87, -130, -88, -13, -188, -230, -200, -151, -206, -246, -229, -156, -225, -175, -66, -39, -27, -40, -224, -242, -91, -30, -153, -214, -174, -250, -44, -109, -218, -217, -4, -44, -94, -117, -159, -84, -111, -234, -57, -31, -46, -115, -88, -155, -161, -63, -143, -151, -20, -50, -128, -122, -92, -95, -221, -250, -36, -107, -145, -185, -185, -115, -156, -135, -144, -23, -81, -1, -204, -250, -163, -148, -202, -2, -98, -64, -105, -43, -76, -21, -201, -89, -120, -47, -13, -229, -221, -186, -9, -158, -153, -194, -158, -104, -96, -122, -124, -118, -128, -136, -219, -102, -9, -33, -169, -150, -181, -226, -57, -38, -157, -96, -146, -87, -228, -22, -206, -21, -70, -64, -43, -211, -1, -222, -21, -252, -29, -125, -255, -79, -87, -159, -217, -84, -67, -148, -10, -198, -164, -230, -212, -96, -159, -80, -209, -83, -232, -20, -139, -7, -170, -43, -130, -142, -255, -45, -28, -132, -204, -70, -67, -41, -254, -129, -73, -1, -138, -210, -243, -86, -239, -253, -221, -166, -9, -3, -229, -222, -205, -103, -39, -158, -222, -230, -173, -174, -153, -130, -175, -240, -181, -113, -197, -71, -93, -153, -56, -103, -196, -177, -81, -223, -173, -119, -22, -95, -98, -25, -83, -98, -145, -55, -148, -51, -23, -75, -30, -179, -110, -46, -223, -44, -77, -90, -194, -62, -175, -68, -132, -169, -82, -74, -60, -99, -253, -110, -193, -121, -204, -166, -246, -97, -128, -133, -124, -76, -210, -60, -230, -42, -119, -230, -81, -87, -239, -133, -177, -221, -95, -7, -253, -10, -206, -129, -146, -156, -113, -244, -136, -140, -242, -91, -220, -83, -57, -24, -141, -247, -215, -104, -31, -205, -177, -59, -7, -240, -234, -169, -1, -81, -46, -44, -207, -230, -61, -182, -40, -183, -87, -195, -227, -80, -243, -166, -247, -228, -184, -184, -239, -42, -145, -208, -161, -54, -254, -217, -97, -179, -143, -37, -212, -127, -204, -171, -147, -47, -212, -131, -9, -165, -234, -151, -205, -84, -224, -181, -233, -134, -231, -129, -176, -246, -131, -222, -75, -22, -91, -116, -224, -177, -93, -85, -29, -213, -214, -42, -159, -227, -228, -70, -174, -190, -0, -182, -148, -160, -61, -140, -225, -221, -101, -7, -61, -148, -23, -134, -197, -156, -114, -115, -154, -230, -13, -126, -75, -69, -238, -146, -112, -20, -250, -198, -9, -234, -50, -32, -73, -122, -11, -176, -54, -120, -194, -133, -244, -204, -39, -19, -39, -218, -194, -252, -229, -252, -230, -53, -112, -105, -121, -179, -95, -32, -218, -55, -93, -78, -100, -6, -194, -32, -218, -99, -113, -92, -78, -254, +91, +157, +225, +16, +175, +130, +98, +28, +25, +16, +107, +253, +248, +221, +116, +25, 131, +121, +203, +38, 159, -120, -200, -88, -12, -195, -132, -134, -136, -156, +173, +79, +253, +33, +66, +154, +144, +194, +64, +217, 7, +214, +38, +44, +226, +230, +14, 65, -49, -188, +116, +230, +162, +136, +243, +17, 208, -67, -87, -146, -137, -149, -107, -194, -140, -196, -78, -144, -149, -164, -19, -47, -217, -63, +89, +184, +119, +33, +154, +88, +61, +253, +186, +232, +80, +228, +214, +201, +2, +236, +198, +80, 12, -222, -125, +60, +15, +31, +9, +119, +19, +163, +206, 64, -168, -234, -1, -12, -8, -39, -248, -32, +194, +153, +239, +44, +65, +91, +199, +34, +186, 184, -216, -230, +24, 130, -158, -20, -83, -135, 166, -162, -82, -117, +202, +130, +250, +10, +153, 35, -180, -75, -83, -115, -152, -12, -235, -163, -113, -25, -249, -225, -18, -83, -185, -193, -156, -89, -219, -135, -48, -2, -126, +201, 134, +238, +74, +121, +203, +242, +221, +96, +68, +28, +118, +166, +171, +114, +212, +72, +61, +77, +239, +25, +78, 125, -49, -2, -153, -160, -243, -13, -52, -192, +125, +218, +128, +129, +171, +10, +71, +102, +199, +11, +124, +206, +212, +119, +195, +247, +64, +26, +204, +201, +38, +20, +204, +41, 180, -116, -148, -155, -193, -174, +124, +26, +255, 158, -51, +139, +66, +135, 133, -137, -52, -33, -91, -204, -23, -106, -240, +16, +71, +3, +111, +11, +139, +95, +226, +42, +156, +227, +20, +168, +217, 122, -94, -245, -40, -45, +60, +250, +224, +93, +5, +65, +90, +11, +87, +229, +147, +160, +189, +184, +81, +29, +230, 34, -140, +244, +203, +168, +133, +227, +41, +132, +26, +20, +0, +223, +114, +20, +14, +68, 184, -175, -93, +156, +180, +145, +214, +183, +245, +171, +218, +208, +149, +183, +242, +241, +54, +241, +137, +23, +136, +173, +22, +159, +22, +119, +180, +204, +214, +144, +44, +86, +183, +53, +218, +3, +98, +119, +103, +94, +14, +204, +238, +129, 254, -40, -125, -135, -250, -9, +75, +108, +210, +218, +183, +167, +120, 112, -164, -179, -252, -77, -202, -223, +219, +188, 47, -195, -171, -132, -229, -203, -49, -11, -29, -108, -46, +189, +245, +7, +142, +245, +189, 186, -110, -59, +143, +93, +42, +3, +79, +235, +221, +171, 34, -119, -252, -213, -225, -225, -121, -240, -27, -187, +156, +84, +153, 43, -148, -245, -203, -155, +220, +37, +242, +62, +22, +176, 188, -31, -212, -132, -120, -252, -241, -252, -80, -153, -178, -56, -127, -236, -213, -180, 49, -117, -87, -199, -92, -149, +49, +12, +195, +146, +177, +98, +201, +93, +23, +205, +187, +136, +219, +214, +255, 5, -192, -78, -249, -198, -130, -175, -29, -29, -96, -178, -38, +187, 102, -115, -194, +30, +134, +159, +99, +107, +181, +204, 5, 89, -69, -149, -160, -164, -118, -236, +166, +27, +24, +172, +32, +28, +38, +199, +40, +17, +175, +107, +204, +163, +156, +8, +108, +10, +207, +221, +187, +158, +86, +159, +94, +85, +169, +88, +159, +211, +122, +200, +125, +37, +17, +88, +139, +230, +174, +89, +24, +210, +241, +14, +43, +22, +185, +32, +102, +169, +73, +253, +231, +44, +158, +153, +77, +161, +72, +88, +106, +231, +65, +66, +84, 150, -239, -8, -174, -178, -144, -94, -13, -158, -22, -5, -159, -108, -12, -157, 248, -78, -133, -89, -195, +196, +245, +118, +94, +174, +138, +17, +225, +21, +37, +236, 197, -241, +144, +250, +67, +201, +90, +113, +101, +182, +74, 93, -157, +229, +201, 99, -144, -156, -245, -31, -0, -239, -82, +103, +224, +49, +181, +23, +232, +33, +223, +9, +67, +168, +248, +209, 235, -143, -120, -101, -110, -174, -191, -242, -233, -240, -151, -86, +42, +19, +169, +210, +179, +87, 119, -131, -50, -125, -208, -24, -131, -57, -109, -229, +143, +73, +45, +11, +39, +216, +156, +253, +82, +159, +8, +192, +157, +92, +12, +89, 206, -4, -64, -212, -42, -213, -231, +185, +20, +39, +145, +243, +140, +206, +197, +120, 171, +143, 201, -237, -140, -43, -57, -160, -149, -3, -17, +116, +41, +196, 251, -90, -169, +4, +60, +27, +153, 69, -53, -123, -162, +94, +237, +127, +73, +128, +30, +163, +200, +155, +92, +78, +183, +137, +59, +80, +30, +247, +185, +14, +206, +172, +126, +128, +169, 3, -180, +208, +158, +44, +201, +151, +226, +223, +26, 244, -102, -199, -248, -140, -29, -52, -140, -207, -240, -77, -142, -178, -134, -115, -7, -19, -173, 12, -97, -235, -81, -91, +77, +159, +3, +172, +186, +111, +252, +174, +226, +174, +150, +62, +248, +9, +42, 7, -116, +85, +110, +245, 21, -207, -204, -55, -53, +165, +35, 228, -93, -154, +18, +70, +133, +187, +221, +193, +199, +86, +12, +170, +15, +240, +189, +128, +19, 149, -210, -252, -40, +192, +163, +241, +36, +92, +122, +204, +61, +179, +134, +57, +47, +176, +250, +56, +155, +246, +107, +236, +36, +139, +24, +22, +160, +180, +199, +207, +251, +138, +16, +223, +250, +166, +7, +105, +171, +54, +160, 3, +84, +127, 112, -236, +31, +16, +213, +233, +61, +39, +115, +160, +225, +225, +53, +243, +192, +105, +30, +6, +172, 200, -145, -13, -66, -110, -28, +179, +204, +115, +158, +204, +35, +200, +117, +85, +30, 202, +228, +197, +197, +15, +99, +227, +248, 193, -98, -243, -172, -72, +223, +86, +108, +5, +143, +211, +47, +56, +155, +181, +161, +47, +196, +67, +35, +126, +66, +255, +78, +173, +143, +44, +51, +118, +139, +157, +177, +240, +146, +92, +234, +5, +78, +12, +219, +197, +187, +147, +79, +105, +176, +245, +113, +69, +242, +142, +209, +152, +94, +188, +43, +231, +103, +219, +104, +74, +230, +173, +209, +36, +159, +48, +55, +68, +123, +142, +242, +159, +107, +104, +35, +217, +79, +18, +91, +100, +11, +158, +196, +27, +120, +216, +91, 241, -127, -138, -169, -96, -85, -232, -171, -28, +15, 222, -228, -110, -52, -119, -72, -166, +126, 71, -130, +148, +246, +20, 63, -210, -156, -49, -129, -24, -98, -18, -69, -206, +163, +52, +195, +94, +88, +11, +84, +118, +214, +8, +115, +167, +249, 126, -74, -14, -55, -122, -178, -127, +159, +81, +169, +195, +9, +94, +245, +196, +163, +109, +22, +80, +8, +161, +27, +137, +112, +49, +23, +50, +172, +83, +61, +128, +79, +146, +233, +184, +52, +164, +66, +145, +35, +83, +243, +225, +222, 249, +204, +80, +198, +51, +104, +149, +221, +51, +255, +181, +59, +42, +78, +252, +173, +193, +196, +211, +245, +41, +204, +27, +138, +245, +232, +205, +91, +121, +38, +59, +216, +172, +111, +250, +31, +58, +109, +187, +219, +179, +111, +155, 3, -186, -13, -197, -167, +190, +246, +217, +212, +9, 175, +209, +160, +167, +65, +167, +217, 254, -231, -219, -95, -254, -250, -234, +152, +181, 127, +103, +218, 254, +178, 251, -95, +43, +167, +68, +184, +103, +178, +126, +126, +52, +237, +103, +173, +135, 191, -1, -27, -152, -200, -232, -238, -155, -55, -155, -220, -121, -232, +188, +180, 136, -19, -255, -60, -71, -40, -7, -242, -209, -193, -3, -126, -58, -167, -204, +74, +218, +175, +146, +208, +37, 28, -240, -235, -183, -159, -85, -219, -198, +18, +83, +223, +193, +203, +59, 60, -115, -8, -61, -27, -229, -186, -220, -151, -166, -219, -72, -168, -206, -176, -130, -184, -176, -219, -166, -149, +116, 190, -76, -58, -114, -104, -70, +124, +73, +55, +161, +15, +25, +221, +105, +103, +4, +254, +117, 167, -43, -229, -253, -67, -69, -82, -225, -208, -104, -229, -137, -43, -125, -16, -252, -81, -113, -2, -27, +148, +101, +238, +46, +129, +182, +227, +100, +33, +167, +106, 228, +191, +42, +77, +168, +248, +221, 144, -161, -17, -40, -208, -210, -151, +197, +193, +255, +36, +214, +130, +97, +100, +37, +122, +189, +179, +125, +42, +228, +41, +19, +88, 195, -240, -81, -109, -102, -46, -1, -233, -132, -31, -234, -116, -44, -60, +169, +220, +245, +214, +39, +243, +55, +131, +201, +172, 2, -139, -196, -231, 18, -100, -141, -161, -58, -2, -42, -232, -60, -126, -72, +121, +240, 15, -89, -1, -221, -78, -112, -239, -196, -23, -206, -210, -2, +9, 225, -117, -11, -84, -156, -198, -39, -196, -194, -138, -227, -177, -81, -226, -182, -112, -156, -70, +151, +47, +189, +94, +146, +133, +247, +201, +218, +105, +82, +47, +152, 115, -173, -212, -135, -175, -55, -122, -176, -8, -85, -229, -130, -245, -21, -45, -237, -10, -28, -124, -187, -142, -20, -83, +252, +110, +168, +146, +248, +189, +169, +72, +193, +60, +243, +93, +252, +160, +209, 5, +182, +225, +27, +172, +221, +225, +251, +235, +125, +103, 208, -142, -9, -93, -49, -87, -146, -218, -157, -0, -203, -201, -194, -50, -246, -133, -175, +205, +118, +215, +119, +102, +205, +135, +163, +254, +109, +54, +182, +89, +219, +226, +118, 216, -166, -202, +176, +175, +53, +241, +167, +206, +219, +42, +2, 85, -115, +203, +9, +30, +156, +184, +139, +149, +3, +77, +80, +168, 232, +129, +135, +223, +246, +207, +219, +86, +252, +28, +83, +97, +57, +45, +212, +169, +109, +205, +45, 34, -58, -54, -24, -202, +46, +123, +48, +116, +210, +40, +168, +134, +21, +133, 137, -103, -224, -156, -179, -167, -99, -85, -128, -233, -56, +208, +147, 16, -36, +176, +48, +113, +224, +165, +241, +113, +238, 77, -10, -209, +230, +41, +234, +59, +224, 239, -21, -61, -210, -188, -242, -68, -77, 200, -169, -227, -57, -82, -79, -78, -246, +160, +41, +124, +116, +11, +60, +168, +122, +159, +129, +132, +116, +19, +1, +44, +195, +119, +76, +128, +225, +167, +190, +140, +109, 18, 161, -234, -228, -221, -249, -33, -31, -161, -89, -136, -205, -142, -142, -86, -20, -193, -58, -244, -45, -152, -121, -24, -224, +39, +124, +55, +174, +226, +132, 75, +43, +167, +34, +43, +250, +114, +242, +73, +66, +223, +222, +159, +170, +16, +76, +18, +244, +137, +200, +78, +227, 85, -140, -118, -38, -60, -160, -166, -123, -65, -81, -6, -212, +100, +148, +10, +134, +67, 115, -186, -8, -137, -55, -242, +81, +103, +2, +171, +11, +201, +145, +196, +73, +74, 101, -59, -33, -157, -20, -64, -115, -126, -92, -215, -65, -133, -64, -153, -70, -51, -54, -235, -105, -232, -197, -25, +17, +187, +2, +195, +50, +43, +107, +211, +173, 60, -251, -83, -90, -110, -192, -10, -135, -61, -236, -70, -138, -110, -199, -192, -228, -75, -254, 212, -122, -242, -245, -52, -251, -171, -60, -180, -1, -39, -202, -115, -233, -216, 112, -179, -10, -214, +221, +43, 65, -113, -52, -137, -156, -123, -47, -89, -238, +105, 70, -78, -218, +136, +202, +50, +154, +40, +101, +165, 176, -97, -236, -164, -243, -28, -20, -45, -206, -48, -14, -163, +255, +207, +221, +82, 57, -27, -234, -119, -250, -11, -229, -218, -54, -140, -156, -252, +108, +64, +47, +95, +186, +221, +244, +226, +71, +166, +136, +16, +146, +216, 84, -7, -197, -207, +56, +170, +19, +139, +162, +181, +155, 92, -189, -18, 241, -128, -109, -93, -59, -117, -122, -43, +89, +5, +6, +99, +15, +21, +9, +158, +73, +105, +208, +187, +5, 22, -177, -27, -252, -220, -4, -134, -86, -1, -51, -183, -143, -229, +232, +212, +77, +122, +42, +74, +66, +187, +52, +173, +184, +200, +181, +189, +83, +172, +73, 65, +121, +66, +197, +242, +214, +201, +214, +252, +250, +151, +39, +117, +230, +135, +99, +199, +175, +95, +12, +104, +156, +125, +73, +3, +108, +53, +131, 58, +104, +79, +244, +89, +205, +64, 228, -195, -219, -95, +113, 198, -137, -156, -93, -194, -251, -138, -225, -142, -249, -183, -55, -251, -238, -112, -175, -111, -26, -193, -96, -25, -212, -243, -84, -14, -140, -138, -91, -158, 206, -84, +87, +71, +27, +196, +50, 217, -89, -122, -223, -91, +168, +253, +189, +7, 29, -231, -119, -247, -147, -196, -180, -224, -209, -178, -155, -90, -65, -141, +125, +234, +40, +117, +164, +246, +6, +169, +95, 21, -141, -60, -154, -136, -233, -228, -136, -247, -231, -2, -207, -179, -177, -170, -81, -193, -194, -90, -225, 249, -250, -96, -92, +18, 19, -137, -181, -196, -94, +77, 204, -202, +107, +85, +208, +103, +30, +201, +47, +2, +9, +46, +188, 223, -36, +37, +18, +16, +102, 196, -154, -58, -11, -78, -114, -128, -5, -130, -48, -245, -144, -86, -246, -166, +70, +16, 99, -200, -241, -24, -179, -134, -103, -241, -169, -242, -113, -238, -135, -20, -110, -140, -129, -154, -94, -0, -191, -4, -225, -67, -75, -140, -189, -72, -142, -125, -74, -204, -154, -234, -142, -103, -206, -4, -107, -54, -189, -193, -218, +26, +27, 84, -34, -158, -122, -65, -176, -20, -49, -12, -253, -157, +132, +53, +233, +146, +31, +245, +136, +137, +128, +191, +167, +42, +63, +89, +3, +56, +237, +61, +240, +199, +227, +95, +211, +92, +240, 172, -133, -25, -216, -24, -0, -69, -149, -139, +121, +33, +219, +64, +129, +150, +236, +130, 149, -41, -197, -155, -205, +44, +106, +173, +196, +138, +67, +13, +140, +148, +244, +15, +18, +191, +198, 67, -140, -99, -142, -57, -19, -16, -39, -57, +4, +54, +75, +128, +49, +186, +34, +159, +229, 129, -17, -189, -40, -45, -69, -57, +109, +253, +52, +117, +58, +202, 148, -104, -3, -12, -163, -86, -102, -13, -161, -226, -49, 202, -174, -3, +52, +138, +83, +236, +87, +125, +163, +35, +67, +55, +217, +91, +89, +243, +10, +89, +252, +200, 104, -184, -247, -98, -111, -232, +42, +221, +139, 97, -246, -111, -209, -110, -127, -248, -32, -78, -28, -31, -13, -141, -147, -41, -57, -207, -98, -20, -41, -230, -255, -225, -4, +130, +37, +116, +38, +252, +171, +80, 111, -152, -226, -168, -88, -100, -138, -178, -172, -188, -182, -182, +179, +34, 146, -176, -7, -177, -193, 131, -163, -218, -149, -9, -60, +66, +20, +246, +91, +242, +81, +31, +145, +138, +76, +217, +252, +18, 89, -41, -206, -57, -207, -118, -95, -149, -35, -166, -109, -47, -227, -153, -170, +162, +75, +72, 161, -218, -87, -93, -209, -154, -64, +9, 39, -145, -2, -125, -21, -141, +30, +214, +144, +61, +161, +212, 100, +15, +194, +234, +3, +86, +42, 199, -210, -50, +44, +94, +141, +95, +139, +60, +224, +238, +34, +114, +42, +10, 133, -54, -76, -189, -202, -230, -74, -203, -84, -80, -9, 232, +101, +191, +114, +33, +73, +43, +37, +20, +144, +108, +43, +210, +15, +55, +211, 83, +245, +97, +41, +213, +104, +50, +201, 241, +132, +30, +115, +41, +57, +175, +204, +123, +41, +202, +86, +189, +196, +226, +16, +166, +164, +101, +167, +207, +49, +106, +226, +84, +57, 55, -244, -148, -212, -63, -243, +251, +195, +10, +120, 209, -92, -189, -141, -218, -119, -14, -8, -137, +253, +165, +132, +36, +25, +226, +29, +59, +77, 124, -200, -97, -192, +212, +134, +136, +126, 161, -0, -118, -14, -124, -199, -223, +7, +171, +63, +180, +126, +137, +156, +37, +121, 75, -164, -189, +49, +192, +71, +132, +76, 201, -224, -106, +111, +28, +196, +95, +134, +0, +42, +254, +251, +85, +64, +15, +74, +41, 38, -221, -205, -83, -107, +223, +28, +90, +20, +251, +111, +136, +218, 231, -74, -17, -249, -196, -21, -186, +241, +223, +211, +115, +242, +155, +155, +16, +18, +119, +174, +34, +103, +60, +230, +31, +22, +127, +223, +90, +69, +49, +68, +121, +139, +255, +201, +254, +220, +242, +189, 229, -93, -169, -196, -245, -217, -237, -29, 56, -206, -112, -104, -112, -163, -168, -149, -74, -237, -6, -247, -221, -110, -79, -87, -137, -5, -154, -84, -54, -236, -30, -230, -92, -160, -100, -101, -100, -159, -225, 116, -55, -72, -59, -200, -85, -21, -205, -176, -228, -127, -192, -152, -1, 34, -66, +55, +251, +213, +7, +172, +125, +126, +195, 133, -249, -148, -57, -167, -76, -250, -199, -201, -38, -68, -24, -230, -26, -204, -161, -192, -210, -107, -124, -5, -23, -37, -111, -35, -165, -88, -24, -76, -29, -127, -60, -160, -226, -12, -137, -129, -244, -86, -108, -157, -215, -167, +33, +251, +93, +27, +136, +122, +99, +141, 188, -183, -219, -78, -28, -72, -168, -129, -210, -189, -204, -242, -51, 133, -143, -101, -118, -98, -203, -162, -108, +242, +75, +248, +105, +83, +159, +157, +224, +193, +139, +194, +0, +37, +231, +131, +0, 212, -66, -239, -45, -183, -164, -246, -117, -20, -54, -135, -108, -4, -247, -210, -15, -71, -70, -226, -227, +141, +149, +63, +63, +177, +201, 74, -243, -18, -219, -83, -22, -225, -43, -51, -215, -142, -241, -178, -8, -156, -135, -158, -209, -185, -214, -237, -10, +154, +199, +23, +30, +148, +16, +84, +255, +220, +226, +108, 128, -53, -147, +19, +254, +218, +11, +152, +233, +1, +188, +128, +201, +214, +111, +230, +227, +48, 96, -117, -178, -9, -62, -43, -132, -25, -103, -41, -45, -167, -166, -24, -4, -97, -52, -51, +229, +151, +177, +232, +39, +146, +227, +26, 201, -161, -175, -219, -85, -32, -3, -60, -132, -184, +119, +217, 167, +229, +80, +227, +210, +14, +164, +47, 190, -192, -125, -60, -56, -145, -75, -153, +63, 44, -128, -223, -84, -224, -80, -84, -194, -194, -247, -169, -64, -88, -150, -136, -169, 5, -175, -243, -4, -152, -193, -123, -41, -254, -94, -170, -170, -249, -234, -106, 155, -164, -18, -7, -90, -102, -204, -30, -115, -30, -39, -156, -219, -181, -157, -89, -203, -178, -17, -203, -5, -111, -118, -115, -253, -140, -42, -32, -68, -25, -78, -65, -112, -208, -112, -108, -123, -226, -153, -145, -249, -218, -238, +148, +209, +177, +239, +192, +251, +171, +28, +149, 169, -58, -91, -165, -118, -63, -91, -108, +23, +148, +196, +222, +152, +88, +224, +47, +212, +112, +13, 53, -21, -79, -117, -108, +227, +49, +98, 110, -57, -54, -251, -68, -8, -235, +158, +106, +93, +0, 182, -3, -55, -156, -5, -50, -54, -160, -150, -213, -79, +62, +131, +66, 74, -126, -182, -50, -199, -133, -106, -209, -164, -99, -168, -84, +28, +228, 155, -235, -8, -83, -156, -221, -10, -190, -78, -69, -47, -235, -10, -172, -160, -187, -24, -97, -50, -31, -138, -184, -225, -120, +0, +166, +212, +174, +64, +162, +98, +39, +231, 169, -56, -43, -246, -163, -153, -72, -170, -101, +95, +135, +113, 66, +244, +130, 145, -60, -57, -249, -61, -11, -193, +138, +125, +188, +203, +156, +45, 42, -115, -6, -243, -72, -104, -232, -20, -150, -10, -179, -204, 17, -174, +112, +8, 103, -141, -99, -60, -214, -163, -208, -15, -163, -193, -124, -138, -252, -201, -60, -52, -225, -4, -176, -105, -249, -131, -77, -115, -148, -61, -209, -208, -217, -195, -47, -217, -149, -140, -64, -23, -4, -143, -56, -249, -5, -117, -33, 111, -95, -151, -56, -101, -107, -24, -104, +177, +223, +105, +34, +40, +202, 232, +111, 168, -153, -33, -238, -137, -179, -86, -251, -234, -87, -247, -159, -254, -110, -252, -4, -168, -89, -184, -251, -25, -125, -176, +40, +11, 58, -4, +96, +81, +242, +186, +157, +45, +129, +77, +28, +174, 188, +25, +95, 240, +49, 85, -28, -148, -161, -47, -27, -214, -110, +158, 182, -247, -5, -168, -247, -179, -249, -245, -172, -154, -156, -20, -82, -5, -254, -78, -31, -133, -180, -37, +178, +177, +101, +232, +66, +54, +125, +11, +38, +80, +226, +140, +87, +88, +160, +138, +72, +77, +89, 195, -157, -170, -254, -173, -246, -75, -143, -146, -234, -108, +123, +228, +130, +98, 81, -79, -154, -169, -141, -74, -236, -91, +108, +224, 6, -151, -217, -118, -173, +86, +223, +149, +211, +169, +198, +22, +69, +232, +191, +40, +174, +60, +242, +97, 194, -109, -200, -148, -214, -11, -184, -86, +71, +122, +19, +23, +51, 40, -13, +149, +104, 144, -126, -135, -11, -203, -20, -0, -141, -25, -243, -138, -32, -29, -212, -156, -55, +178, +145, +216, +1, +239, +62, 149, -152, -241, -112, -128, -175, -158, -133, -76, -95, -54, -93, +97, +233, +14, 180, -101, -201, -143, -205, -192, -29, -212, -219, -2, +77, +228, +27, +85, +54, +7, +148, 142, -229, -0, +82, +199, +161, 0, -113, -124, -32, -94, -97, -228, -122, -1, -234, -100, -143, -2, +132, +227, +115, +181, +151, +16, +16, +129, 97, -94, -60, -32, -51, -200, -38, -240, -14, -138, -178, -28, -197, -55, -192, -212, -168, -148, -133, -163, -252, +211, +187, +53, +247, +150, +102, +134, +247, 35, -100, -140, -157, -38, -67, +233, 103, -215, +206, +48, +6, +41, +205, +32, +235, +61, +7, +222, +191, +6, +155, +77, +207, +20, +37, +129, 178, -215, -162, -220, -116, -209, -253, -216, +103, +219, +103, +95, +63, +150, +226, +1, +231, +9, +112, +92, +73, +200, +13, +86, +33, +238, +43, +207, +158, +123, +250, +161, +112, +186, +87, +34, +67, 185, -237, -94, -174, -102, -58, -126, -58, -237, -45, +243, +195, +71, +249, +170, +29, +70, +246, +42, 118, -236, -223, -244, -58, -237, +102, +186, +65, +156, +101, +227, +134, +135, +4, +254, +143, +186, +132, +255, +95, +129, 213, -28, -193, -187, -187, -125, +140, +251, +137, +235, +147, +201, +114, +101, +33, +21, +116, 234, +90, +221, +128, +30, 181, -191, -118, -111, -255, -190, +23, +232, +199, 146, -176, -119, -119, -191, -139, -238, -85, -7, -254, -249, -218, -185, -184, -62, -203, -247, -127, -111, -216, -191, -125, -245, -233, -203, -197, -166, +105, +173, +24, +8, +133, +113, +116, +144, +201, +145, 1, -126, -181, -3, -160, -125, -118, -214, -185, -232, -244, +201, +1, +110, +107, +36, +19, +62, +211, +226, +42, +192, +84, +174, +112, +35, +28, 40, -55, -115, -58, -198, -31, -13, -199, +246, +177, +192, +129, +183, +144, +1, +119, +44, +74, +48, +94, 56, -239, -181, -63, -165, -157, +121, +132, +110, +41, +75, +40, +123, +186, +43, 254, -100, -216, -233, -22, -64, -239, -92, -97, -66, -234, -205, -147, -255, -155, -225, -56, -42, -171, -245, -160, -159, -207, -107, -253, -239, -134, -157, +15, +70, +50, 63, -118, -175, -86, -187, -190, -53, -61, -41, +58, +207, +141, +52, +99, +116, +149, 122, -98, -88, -199, -69, +238, +24, +32, +36, +48, +235, 174, -187, -233, -137, +75, +196, +129, +113, +140, +145, +6, +252, +102, +147, +240, +145, 249, -220, -233, -126, -250, -156, -165, -86, -126, -107, -122, -98, -184, -31, -156, -211, -78, -231, -124, -208, -63, -107, -231, -231, -54, -61, -53, +212, +202, +65, +109, +108, +95, +163, +90, +99, +74, +215, 151, -237, -223, -178, -78, -27, -78, -138, -141, +67, +73, +106, +168, +144, +137, +194, +231, +80, +7, +86, +170, +33, 49, -254, -232, -28, -29, -141, -173, +12, +175, +95, +48, +23, +35, +104, +168, +114, +174, +53, +130, +98, +76, +44, +197, +154, +16, +194, 146, -24, -59, -124, -223, -248, -187, -210, -148, +145, +97, +202, +81, +106, +185, +197, +219, +179, 133, -208, -214, -53, -171, -89, -43, -249, +103, +90, +216, +119, +101, 49, -88, -189, -173, -35, -0, -198, -18, -249, -72, -131, -148, -198, -105, -203, -134, -121, -219, -108, -162, -131, -242, -181, -8, -130, -169, -227, -124, +135, +240, +15, +113, 190, +151, +23, +202, +104, 109, +189, +6, +140, +161, +52, +54, +166, +234, +24, +167, +36, +16, +75, +144, +231, +99, +184, +81, +63, +99, +18, +49, +56, 195, -216, -201, -79, -117, +41, +122, +18, +166, +169, +150, +23, +178, +228, 88, -55, -190, -72, -194, -255, -135, -35, -25, +2, +253, 199, -3, -179, -19, -180, -151, -211, -179, -14, -214, -65, -177, +75, 100, -39, -59, -150, -180, -52, -60, -95, -225, -145, -82, -235, -155, -184, -128, -82, -179, -61, -27, -112, -236, -221, -71, -17, -200, -166, -244, -144, -70, -40, -168, -28, -9, -96, -110, +172, 45, -121, -22, -123, -178, -7, -91, -196, -94, -54, -230, -197, +120, +242, +165, +214, +239, +182, +201, +204, +161, +152, +93, +211, 117, -118, -135, -87, -4, -8, -227, -230, -241, -195, -220, -174, +130, +10, +48, +123, +90, +36, +207, +252, +104, +255, +25, +66, +202, +28, +101, +42, +198, +198, +201, +156, 249, -24, -174, -85, -200, -14, +190, 29, -232, -54, -246, -189, -249, -192, -192, -227, -126, -63, -186, -38, -132, -102, 46, +89, +176, +159, +73, +172, +34, +175, +102, +92, +31, +220, 221, -129, -177, -167, -125, -67, -66, -1, -97, -197, -160, -216, -241, +153, +239, +165, +250, +206, 126, -177, -114, -127, -96, -172, -148, -244, -164, -219, -232, +225, +8, +84, +70, +41, +3, +201, 68, -215, -224, -237, -170, -230, -22, -215, -196, +207, +20, +80, +191, +33, +115, +21, +165, +181, +151, +74, +216, +23, 37, -179, -83, -86, -234, -118, -63, -164, -182, -242, -89, -27, -46, -127, -52, -171, -228, -143, -232, -97, -240, -67, -249, -12, +166, +109, +124, +157, 216, +207, 164, -117, -203, -132, -220, +229, +33, 35, -16, -187, -139, -86, -173, -120, -238, -140, -12, -24, -213, -253, -219, +38, +207, +138, 179, -20, -96, -7, -125, -85, -85, -13, +23, +9, +150, +175, +30, +92, +191, +164, +135, +6, +221, 73, 11, -67, -233, -102, -191, +215, 231, -102, -94, -212, -117, -232, -14, -253, -152, -170, -160, -175, -123, -105, -38, -147, -22, -245, -182, +71, +128, 205, -41, -80, -138, -80, -29, -90, -193, -84, -221, -39, -252, -221, -145, -250, -132, +249, +21, 191, -171, -197, -39, -220, -220, +244, +60, +162, +141, +190, +173, +222, +224, +201, +123, +8, +253, +99, 104, -122, -211, -238, -181, -47, -7, -231, -221, -94, -231, -172, -96, -134, -51, -177, +120, +86, +207, 134, -113, -223, -18, -150, -83, -238, -184, -205, -6, -106, -98, -17, -211, -83, -119, +206, +157, +50, +244, +2, +112, +8, +183, +69, +66, +109, +212, 175, -202, -217, -80, -185, +124, +221, +90, +93, +167, +34, +32, +123, +192, +40, +86, +72, +128, +184, +20, +132, +153, +86, +213, +43, +117, 191, -178, -222, -110, -88, -190, +112, +13, +242, +31, +214, +43, +203, +234, +242, +92, +156, +236, +46, +70, +146, +153, +19, +105, +146, +154, +91, +153, +200, +50, 137, -9, 180, -56, -70, -255, -182, +64, +228, +42, +240, +158, +140, +40, +221, +191, +245, +134, 215, -185, -250, -116, -251, -217, -202, -32, -202, -67, -244, -218, -231, -169, -57, -212, -202, +229, +137, 14, -202, -221, -87, -45, -170, -233, -16, -127, -54, -30, -98, -163, -49, -213, -200, -34, -202, -253, +56, +135, +26, +216, +80, +79, +105, +107, +151, +249, +206, +51, 55, +201, 217, -83, -205, -15, -194, -231, -47, +228, +5, +126, +108, +63, +11, +177, 157, -193, -215, -118, -175, -91, +225, +137, +222, +134, +33, +133, +221, +8, +150, +75, +1, +103, 52, -4, -27, -89, -70, -121, -128, -130, -93, -211, -100, -251, -161, -195, -224, -236, -250, -226, -186, -55, -184, -249, -220, -238, -119, -250, -79, 153, -207, -141, -140, -162, -24, -60, -159, -89, 67, -251, -115, -39, -57, -112, -228, -249, -104, -17, -221, -27, -240, -36, -170, -153, -226, +93, +19, +72, +25, +33, +147, +7, +198, +48, +86, +163, +52, +173, +69, +201, +105, +45, +202, +76, 203, -241, -195, -251, -243, -102, -24, -81, -158, -200, -80, -64, +120, +179, +76, +62, +199, +187, 40, -2, +220, +155, +155, +0, +175, +139, +66, +143, 114, +245, +180, +224, +70, +149, +39, +50, +219, +149, +196, +118, +97, +210, +199, +137, +19, +149, +72, +90, +154, +225, +109, +220, +36, 152, +172, +212, +225, +37, +14, +44, +139, +134, +42, +117, +14, +240, +155, 160, -243, -100, +95, +211, +41, +107, 122, -108, -38, -238, -210, -123, -250, -238, -88, -246, -244, -221, -193, -247, -244, -99, -136, -201, 132, +98, +8, +174, +141, 143, -236, -178, +249, +71, +37, +6, +50, +61, +193, +21, +113, +128, +52, +79, +185, +128, +34, +132, +88, +128, +18, 150, -211, -227, +242, +189, +162, +175, +3, +233, 54, -198, -236, +51, +238, +95, +16, +47, +126, +203, +117, +124, +213, +193, +70, +168, +43, +56, +70, +9, +239, +7, +33, +151, 217, -41, -111, -155, -114, -178, -52, -198, -74, +15, +44, +26, +135, +113, +221, +14, +15, +101, +15, +35, +98, +7, +221, +38, +69, +188, +247, +55, +15, 214, +137, +32, +67, +224, +169, +149, 178, -97, +68, +232, +105, +118, 188, -76, -143, -3, -51, -247, -198, -152, -185, -223, -23, -102, -238, -143, -3, -51, +74, +146, +48, +176, +177, +134, +108, +125, +250, 11, -144, -230, -140, -145, -83, +187, +151, +231, +3, +61, +214, +210, +192, +177, +117, +130, 104, -220, -48, -126, -10, -115, -29, -20, -69, -81, -152, -80, -53, -131, -193, -12, -158, +26, +244, +19, +104, +52, +250, +209, 51, -131, -36, -95, -197, +159, +147, +187, +90, +44, +237, +5, +91, +132, +209, +51, +96, +28, +195, +117, +91, +15, +7, +174, 230, -205, -234, -108, -87, -38, -59, -168, +75, +32, +210, +149, +134, +179, +189, +42, 210, +40, +207, +58, +163, +141, +91, +213, +171, +88, +231, +149, 118, -49, -244, +30, 70, -3, -15, -243, -103, -207, -67, -93, -131, -234, +73, +206, +41, +82, +42, +205, +212, +152, +82, +174, +104, +50, +106, +119, +147, +153, +132, +27, +120, +152, +81, +250, +223, +191, +173, +194, +228, +39, +250, +111, +45, +150, +1, +72, +189, +55, +145, +50, +137, +206, +203, +35, +167, +155, +231, 8, -20, -60, -147, -109, -176, -29, +90, +50, +231, +115, +45, 84, -199, -227, -135, -225, -220, -192, -157, +229, +238, +80, +79, 138, -90, -53, -236, -254, -206, -147, -28, -65, -69, -148, -53, -153, -163, -119, -125, -75, -2, -206, -224, -234, +10, +166, +241, +45, +26, +159, +194, +78, +79, +84, +8, 250, -202, -206, -63, -57, -237, +128, +112, +32, +203, +93, +172, +158, 249, -119, -43, -41, -59, -237, -246, -155, -157, -108, -157, +191, 235, -247, -255, -158, -18, -170, -13, +229, +246, +11, +135, +139, +24, +189, +166, +169, 57, -174, +137, +99, +187, 158, -156, -57, +54, +182, +107, +109, +70, +14, +85, +170, +179, +187, +237, +163, +83, +34, +12, +6, 243, -60, -195, -165, -44, -244, -166, -252, -86, -223, -11, -38, -190, -76, -194, -64, 39, +58, +221, +12, +141, +82, +129, +113, +107, +153, +112, +237, +230, +71, +123, +120, +215, +227, +255, +199, +40, +249, +14, +154, +221, +244, 115, -167, -114, +205, +116, +242, +238, +160, +217, +232, +174, +51, +84, +219, +233, 36, -185, -146, -157, -17, +210, +66, +187, +95, +58, +237, +94, +190, +165, 78, -128, -181, -23, -34, -85, -18, -201, -184, -218, -11, -231, +10, +45, +142, +248, +254, +110, 144, -121, -156, -135, -81, -150, -68, -38, -205, -203, -20, -135, -51, +107, +168, +147, +224, +8, +13, +47, +7, +93, +181, 153, +78, +82, +35, +242, +179, +57, +186, +27, +168, 13, -41, -102, +117, +114, +116, +57, +55, +71, +239, +237, +127, +52, +123, +119, +205, +129, +217, +90, +80, +203, +203, 206, -82, 197, -59, -10, -186, -122, +32, +215, 84, -145, -94, -149, -136, -88, -82, -90, -37, -0, -239, +103, +61, +168, +233, +77, +115, +208, +122, +111, +180, +30, +212, +174, +121, +59, +232, 94, -70, -9, -135, -224, +27, +173, +134, +28, +207, +108, +41, +4, +107, +238, +148, 204, -96, -73, -2, -75, -215, 115, -65, -57, -248, -129, -18, -57, -97, -222, -26, -15, -99, -33, -49, -167, -60, -102, -49, -89, -196, -11, -26, -40, +157, +165, 144, -48, -137, -19, -81, -21, -23, -103, -132, -106, -110, +205, 174, +203, 44, -225, -197, -105, -29, -9, -113, -130, -73, -218, -212, -114, -17, -9, -83, -170, -46, -26, -175, +68, +243, +238, +234, +110, +152, +37, 164, -83, -162, -18, -130, +254, +69, +187, 225, +176, +115, +59, +234, +220, 92, -50, -162, -28, -49, -134, -249, -94, +116, +6, +105, +219, +191, +106, +183, +237, 183, -120, 70, -94, -43, -192, -67, -133, -254, +125, +181, +229, +223, +180, +91, +246, +250, +31, +242, +131, +190, +213, +151, +156, +118, +167, +85, +104, +187, +65, +116, +116, +34, +106, +205, +98, +104, +49, +93, +149, +218, +99, +30, +39, +166, +243, +7, +220, +206, +86, +50, +72, +180, +195, +105, +245, +58, +179, +58, +240, +198, +76, +117, +123, +33, +34, +219, +201, +127, +64, +222, +8, +10, +187, +21, +161, +193, +14, +22, +0, +152, +131, +159, +85, +4, +26, +2, +128, +33, +140, +147, +61, +123, +211, +188, +33, +151, +28, +59, +93, +56, +1, +190, +1, +227, +57, +219, +128, +187, +146, +232, +11, +97, +190, +160, +147, 48, -16, +32, +31, +136, +112, +218, +34, +146, +1, +134, +249, +66, +221, +15, +196, +229, +218, +90, +12, 212, -11, -198, -24, -210, -142, -8, -177, -202, +58, +153, +72, 192, -132, -197, -86, +119, +153, +107, +15, +160, 35, -222, -217, -93, 247, -62, -95, -152, -238, -169, -2, -246, -91, -13, -37, -73, -88, -166, -251, -187, -140, -238, -228, -221, -20, -213, -16, 89, -133, -166, -255, -245, -207, -69, -152, -252, -149, -255, -107, -70, -146, -184, -132, -44, -173, -158, -67, -95, -25, -201, -180, -117, -1, -165, -227, -178, -13, -119, -67, -202, +229, +21, 165, +206, +60, 176, -217, -80, -217, -224, -124, -74, -193, -167, -176, -184, -186, -86, +7, +177, +34, +177, +19, +250, +75, +235, +127, +255, +87, +73, +182, 29, -102, -22, -45, -224, -208, -142, -245, -74, -225, -84, -14, -37, -30, -47, -125, -247, -74, -69, -77, -219, -44, -184, -68, -169, +134, +11, +24, +35, 242, -170, -75, -198, -168, -105, -77, -90, -56, -129, -20, -220, -190, -80, -227, -192, -118, +30, +248, +154, 197, -50, -66, -27, -156, -225, -149, -41, -11, -122, +80, +226, +67, +218, 7, -39, -209, -103, -179, -84, -161, +52, +139, +5, +130, +212, +139, +200, 97, -134, -48, -83, -170, -175, -206, -144, -213, -27, -230, -134, -59, +235, +211, +64, +166, +196, +220, +91, 39, -169, +148, 36, -176, -203, -136, -168, +252, +153, +65, +125, 19, -229, -247, -43, -253, +37, +87, +6, +95, +171, +49, +150, 128, -212, -44, -176, -115, -54, -111, -96, -232, -205, -13, -222, -214, -230, -212, -116, -252, -26, -25, -110, -115, -78, +70, 5, -3, -168, -6, -31, -111, -250, -86, -76, -10, -117, -186, -233, -93, -159, -117, +72, 250, -125, -43, -54, -133, +152, +249, +211, +66, +141, +88, +12, +66, +8, +66, +4, +201, 103, -235, -254, +81, 214, -57, -95, -235, -110, -194, -173, -92, -118, -46, -175, +222, +165, +250, +127, +178, +230, +27, +13, +34, 123, -168, +66, +215, +157, +196, +190, +144, +197, +184, +2, +201, +163, +245, +5, +97, +79, +75, 126, -7, -158, -229, -204, -202, -6, +11, +80, +210, +119, +100, +135, +16, +247, +32, 160, +189, +69, +105, +3, +16, +154, +56, +9, +35, +88, +57, +32, +0, +2, +22, +248, 122, -158, -255, -253, -170, -125, -153, -235, +81, +21, +20, +10, +222, +71, +186, +177, 106, -18, -65, -85, -152, -180, -160, -126, 54, -49, -28, -20, -39, -46, -116, -55, -49, +36, +71, +35, +114, +212, +140, +159, +241, +11, +76, +101, +186, +205, +82, +132, +160, +115, 26, -168, -238, -151, -128, -169, -246, -167, -206, -224, -195, -151, -143, -31, -59, -197, -216, -30, -19, -219, -193, -245, -135, -255, -232, -156, -221, -14, -206, -174, -191, +89, +96, +165, +138, +117, +178, +213, 92, +20, +140, 221, -90, -89, -12, -84, +186, 199, -94, +161, +50, +224, +177, +220, 167, +244, +199, +79, +144, +155, +118, 127, -253, -165, +102, +189, +15, +31, +1, +137, +161, +33, +86, +21, +68, +201, 119, -214, -89, -25, -193, -36, -2, +130, +217, +138, +211, 75, -141, -112, -117, -125, -190, -218, -219, -200, -228, -208, -235, -92, -157, -195, +145, +54, +124, +93, +73, +110, +98, +111, +1, +113, +57, +0, +104, +128, +112, +26, 130, +9, +4, +117, +92, +228, +16, +150, +1, +151, +128, +113, +42, +108, +6, +20, 121, -148, -254, -160, -123, -53, -248, -216, -107, -95, -90, -90, -30, -212, -32, -95, +144, +196, +168, +191, +7, +52, +184, +94, +238, 59, -61, -216, -193, -206, -166, -81, -140, +172, +255, +139, +163, +66, +21, +113, +7, +195, +210, +131, +12, +179, +89, +200, +184, +51, +14, +57, +35, +197, +87, 88, -101, -30, -229, -178, -125, -219, -233, +179, +59, +198, +250, +191, +9, +148, +144, 161, -253, -228, 236, -51, -218, -98, -54, -141, -102, -114, -32, -213, -104, -253, -207, +113, +196, +222, +145, +204, +72, +66, +206, +2, +190, +107, +140, +242, +169, +128, 109, -252, +229, +42, +137, 103, -251, -88, +41, +66, +229, +95, 38, -39, +211, +164, +160, +134, +44, +195, +5, +16, 84, -143, -245, -165, -247, -177, -141, -155, -180, -117, -48, +210, +87, +146, +102, +12, +1, +226, +4, +74, +20, +62, +218, +25, +23, +79, +95, +19, +162, +23, +39, +172, +23, +2, +168, 147, -3, -171, -6, -59, +232, +4, +67, +53, +178, +202, +33, +174, +124, +83, +193, +93, +165, +254, +68, +165, +162, +80, +13, +240, +29, +246, +119, +164, +251, 239, -181, -255, -54, -56, -107, -95, -92, -108, -26, +196, +207, +6, +18, +242, +119, +192, +220, 199, -228, -228, +135, 170, -113, -190, -208, -185, +209, +199, +219, +142, 253, -218, -61, -239, -92, -195, -41, -190, -28, -220, -130, -192, -145, +103, +139, +5, +171, +5, +134, +29, +96, +138, +104, +76, +26, +32, +139, +59, +248, +187, +5, +161, +95, 89, -173, +171, +219, +65, +255, +182, +51, +24, +125, +180, +223, +119, +123, +35, 222, -89, -156, -129, -108, -140, -47, -253, -78, -206, -6, +92, 105, -114, +217, +192, +79, 1, -212, -16, -183, -157, -223, -110, +150, +141, +143, +150, +14, +138, +23, +173, +13, +237, +239, +134, +205, +171, +78, +190, +3, +227, +229, +200, +3, +160, +151, +17, +189, +242, +160, +232, +25, +122, +8, 191, -244, -58, -27, -6, -49, -185, -12, -185, -99, -212, -249, -109, -195, -24, -38, -215, -225, 242, -250, -170, -123, -123, -93, -188, -193, -239, -54, -156, +192, +234, +172, 97, -147, -7, -115, +223, +120, +46, +5, +99, +16, 186, -140, -189, +136, +241, +228, +226, +67, +108, +167, +173, 81, -252, -238, -252, +50, +104, +140, +200, +30, +30, 156, -100, -134, -15, -161, -187, -236, -39, -84, -61, -186, -244, -235, -201, -35, -105, -153, -36, -43, -15, -231, -136, -57, -79, -38, -134, -48, -139, -206, +72, +63, +98, +46, +219, +138, +103, +214, +6, +183, +101, 42, -250, -45, -133, -160, -47, -35, -16, -122, -238, -76, -69, -177, -170, 211, -112, -185, -47, -213, -47, -43, -127, -126, -239, -57, +224, +184, 156, -152, -134, -135, -231, +114, +65, +45, +245, 252, -153, -40, -39, -97, -181, -54, -18, -30, -189, -137, -231, -254, -12, -130, -29, -150, -111, -144, -17, -206, -66, -137, -117, -49, +0, +116, +213, +250, +248, +64, 25, -174, -23, -147, -168, -7, -111, -51, -23, -146, -35, -241, -79, -75, -159, +180, +211, +156, +22, 133, -17, -41, -117, -142, -147, +179, +150, +164, +187, +132, +127, +216, +132, +98, +227, +72, +7, +234, +220, +92, +123, +182, 16, +2, +122, +125, +190, 140, -214, -165, -48, -41, -85, -171, -109, 38, -119, -11, -7, -148, -181, -172, -176, +140, +160, +88, +73, 58, +107, +128, +73, +158, +248, +43, 81, -153, +44, +39, +181, +208, 202, -98, -198, -156, -188, -74, -73, -9, -2, -36, +128, 112, -188, -190, -199, -82, -44, -201, -159, 106, -81, -214, -252, -61, -175, -203, -5, -9, -181, -129, -12, -245, -185, -69, -145, -151, -147, -80, -243, -228, -214, -193, -235, -170, -107, -53, -30, -10, -247, -192, -193, -207, -156, -250, -29, -96, +64, +125, +28, +87, +138, +83, +49, +229, +90, +33, +84, +164, +160, +132, +176, +150, +121, +152, +172, 114, -139, -81, -211, -232, -100, -76, +36, +94, +229, +54, +97, +102, +146, +150, +158, +192, +75, +71, +94, +137, +152, +119, +141, 56, -155, -254, -187, -42, -228, -88, -6, -47, -241, -156, -253, -1, -175, -38, -172, -2, +117, +37, +231, +219, +193, +212, +116, +157, +163, +239, 63, -7, -108, +228, +212, +171, +161, +234, +71, +205, +245, +25, +123, +107, 6, -40, +41, +248, +122, +67, 152, -236, +85, 201, -129, -236, -140, -117, -60, -172, -96, -194, -137, +247, +64, +89, +164, +197, +192, +213, +104, +238, +195, +149, +131, +64, +40, +34, +214, +130, +10, 133, -30, -174, -234, +221, +78, +197, +199, +44, +242, +118, +230, 62, +51, +87, +132, +54, +125, +170, +131, +205, +67, +223, +73, 172, -173, -163, +87, +252, 201, -155, -174, -51, -204, -214, -184, -6, -10, -39, -14, -38, -11, -191, +224, +80, +22, +23, 210, -102, -152, -219, -88, -114, -59, -161, -166, -173, -109, -43, -214, -151, -209, -216, -157, -168, -19, -116, -138, -139, -162, -18, -207, -32, -21, -27, +130, +58, +147, +87, +26, 184, -193, -102, -77, -211, -252, -66, -145, -247, -248, -222, -254, -38, -164, -35, -97, 174, -33, -24, -162, -42, -254, -115, -144, -25, -103, -70, -42, -64, -110, -250, -222, -213, -8, +37, +76, +148, +23, +16, +139, +148, +203, +119, +45, +135, 55, -85, +67, +36, +235, +194, +215, +170, +83, +210, +92, 35, -244, -165, -156, -15, -98, +65, +170, +152, +28, +212, +181, +151, 102, -169, -26, -207, -126, -78, -179, -225, -27, -150, -99, -50, -24, +191, +151, +164, +240, +114, +184, +94, +101, +80, +1, +96, +125, +248, +47, +28, +13, +108, +86, +71, +175, +86, +84, +45, 246, -150, +22, +144, 8, -3, +111, +0, +107, +103, +149, +117, +195, +224, +247, +174, +67, +216, 124, -169, -185, -98, +145, +199, +215, +225, +119, 128, -72, -217, -151, -159, -137, -157, -81, -76, -76, -137, -180, -230, -122, -198, -166, -210, -154, -43, +178, +189, +145, 45, -98, -250, -16, -35, -139, -149, -61, -216, -233, -122, +68, +45, +210, 79, -80, -51, -206, -105, -26, -74, -229, -4, -37, -67, -193, -8, -255, -109, -52, -199, -126, -150, -93, -95, -77, -24, -231, -86, -54, -117, +222, +189, +19, +144, +107, +166, +108, +213, 98, -174, -74, -205, -245, -25, -212, -150, +226, +147, +249, +73, +167, +203, +185, +173, +23, +191, +116, +246, +21, +15, +58, 136, -171, -16, -107, +74, +221, +49, +137, +106, 70, -19, -175, -152, +90, +197, +153, 166, -134, -229, -94, -60, -105, -44, -126, +113, +168, +202, +122, +11, +11, +58, +203, +62, +23, +183, 17, -139, -192, -71, -38, -152, +70, +147, +42, 187, -104, -211, -194, -216, -155, -44, -34, -230, -99, -252, -112, -146, -206, -88, +142, +70, +231, +124, +249, +208, +79, +121, +218, +203, +249, +196, +178, +254, +68, +185, 5, -61, -236, -36, +132, +226, +197, +80, +49, +205, +38, +104, +89, +157, +100, +98, +250, 110, -17, -22, -240, +159, +201, +4, 196, -83, -244, +135, +236, +152, +196, +159, +79, +78, +245, +86, +154, +10, +25, +195, +28, 68, -110, -34, -158, -204, -115, -31, -171, -164, -149, -35, -88, -179, -204, -130, -39, -97, -238, -20, 189, -214, -87, -67, -205, -37, -200, -241, -182, -58, -102, -202, -36, -20, +83, +112, +56, +6, +89, +249, +95, +216, +163, 222, -31, -114, -42, -45, -45, -158, -58, -243, +2, 170, -38, -246, -253, -108, -57, -65, -202, 83, -100, -219, -236, -251, -94, -204, -22, -171, -10, -180, +54, +229, +184, +232, 1, -6, +146, +134, +11, +57, +204, +242, +77, +94, +50, +159, +48, +150, +66, +0, +19, +130, +81, +47, +68, +20, +108, +33, 113, 165, +56, +193, +77, +245, +233, +255, +93, +161, 177, -14, -183, -215, -221, -232, -187, -214, -52, -18, -96, +50, +156, +112, +179, +236, +94, +216, +80, +198, 218, -194, -178, +148, +45, +0, +236, +233, +160, +107, +243, +157, +170, +81, +179, +69, +233, +221, 93, -123, -227, -210, +95, +27, 166, +122, +168, +150, +80, +217, +206, +222, +41, +157, +157, +87, +237, +236, +123, +165, +179, +119, 85, -63, -147, +59, +251, +65, +233, +236, +123, +211, +206, +214, +114, 91, -159, -93, +248, +58, +163, +83, +18, +86, +176, +40, +170, +89, 104, -117, -239, -189, -160, +162, +20, +75, +83, +49, +2, +23, +182, +70, +225, +6, +108, +242, +85, 126, -84, -120, -198, -213, -8, +190, +0, +249, +41, +118, +246, +163, +210, +217, 15, -116, -17, -180, +85, +59, +251, +139, +210, +217, +143, +85, +59, +251, +171, +210, +217, +95, +170, +118, +246, +55, +165, +179, +191, 86, -195, -109, -228, -36, -132, -74, -31, +237, +236, +173, +26, +73, +254, +183, +170, +59, +184, +229, +96, +42, +86, +250, +170, +149, +59, +150, +193, +193, +30, +243, +14, +171, 100, -134, -130, -98, +154, +193, +30, +182, +93, 120, -253, -126, -207, -2, -3, -172, -208, -209, -82, -198, -113, -57, -151, -129, -11, -50, -114, -32, -166, -225, -131, -240, -18, -241, -0, -15, -47, +118, +138, +152, +70, +238, +248, 215, -26, -114, +205, +252, 197, -9, -85, -11, -81, -11, -112, -68, -60, -146, -1, +108, 230, -112, -119, -137, +53, +81, +162, +34, +215, +136, +111, +156, +132, +248, +90, +181, +89, +172, +160, +244, +18, +149, +173, +163, +39, +217, +196, +249, +204, +79, 11, -161, -50, -75, +44, +51, +129, +190, +116, +159, +149, +202, +4, +129, +14, +31, +14, +37, +97, +182, +67, +214, +223, +6, +7, 216, -90, -167, -205, -84, -21, -138, -188, -164, -34, -211, -161, -16, -251, -28, -104, -108, -138, -212, -28, -153, +222, +2, +7, +197, +53, +5, +169, 173, -101, -241, -90, -220, -25, +233, +162, +162, +238, +149, +26, +51, +31, +201, +64, 56, +152, +79, +81, +20, +156, +120, 201, -51, -161, -53, -171, -146, -178, -210, -142, -113, -177, -160, -140, -173, -168, -227, -14, -198, -137, -52, +34, 54, -124, -151, -16, -57, -49, -252, -17, -167, -16, -39, +22, 174, -244, -19, -231, -53, -31, -112, -157, -115, -94, -85, -34, -43, -241, -124, -162, -50, -116, -130, -5, -147, -6, 48, +8, +48, +232, +226, +0, 214, -72, +108, +194, +255, +194, +82, +255, +79, 62, 97, -36, -70, -251, -48, -201, -42, -11, -207, -79, -222, -0, -209, -166, -14, -66, -15, -224, -145, -51, -143, -91, -42, +77, +83, +109, +149, 23, -50, -105, -251, -86, -68, -176, -2, -194, -86, -116, -224, -125, -108, -207, -74, -112, -59, +242, +84, +89, +141, +249, +47, +202, +221, +117, +182, +170, 44, -106, -13, -74, -42, -124, -209, -204, -45, -68, -230, -120, -225, -19, -58, -255, -185, +40, +99, 144, -145, +118, +89, +14, +6, 137, -160, -85, +150, +33, +181, +57, +225, +17, +28, +111, 201, -6, -190, -69, -165, -223, -255, -91, -94, -169, -191, -93, -241, -191, -39, -35, -121, -141, -75, -204, -237, +176, +82, 88, -19, -102, -11, -86, -23, -55, +84, +128, +152, 103, -175, +157, +44, 216, -49, -190, -232, -162, -35, -22, -221, -200, -153, -227, -161, -20, -143, -9, -155, -67, -125, -150, -132, -51, -129, -111, -209, -177, -141, +98, +204, +47, +87, +82, +3, +241, +139, +212, +5, +76, +40, +119, +137, +34, +40, 134, +204, +84, +197, +248, +250, +228, +255, +103, +239, +205, +159, +219, +72, +142, +68, +225, +159, +189, +127, +69, +61, +189, +136, +103, +106, +23, +228, 140, -201, +36, +219, +235, +181, +35, +222, +23, 16, -1, -34, -160, +9, +73, +216, +229, +181, +0, +53, +30, +63, +5, +3, +209, +64, +23, +128, +182, +26, +221, +112, +119, 131, -2, -98, -236, +36, +230, +175, +255, +242, +168, +234, +3, +7, +81, +213, +7, +0, +106, 185, -84, -179, -15, -223, -50, -174, -212, -71, -147, +225, +29, +17, +64, +29, 89, 89, -28, -200, +85, +89, 121, -45, -134, -161, -7, -24, 103, -104, -229, -188, -245, -164, -30, -213, -192, -123, -203, -170, -127, -234, -190, -37, -31, -71, -254, -34, -115, -62, -230, -248, -200, -204, -125, -139, -62, -159, -188, -54, -27, -244, -125, -234, -252, -61, +228, +136, +84, +214, +211, +1, +138, +72, +91, +206, +196, +39, +132, +95, +196, 115, +57, +66, +37, +103, +58, +138, +126, +221, +208, +5, +4, +93, +78, 226, -239, -249, -215, -34, -27, -240, -23, -179, -151, -163, -171, -241, +105, 136, -238, -54, -206, -114, -109, -83, -90, -202, +134, +89, +130, +20, +77, +247, +45, 129, -8, -233, -9, -236, -117, -102, -153, -114, -132, -235, -141, -112, -24, -244, -246, -35, -13, -1, -54, -28, -83, +138, +97, +210, +67, +159, +223, 92, -10, -238, -46, -188, -8, -190, -27, -255, -69, -124, -27, -70, +95, 119, -56, -145, -230, -125, +206, +239, +6, 255, -34, -230, -62, -158, -44, -46, -54, +186, +61, +153, 67, -83, -198, -64, -156, -66, -244, -79, -210, -109, -89, -98, -253, -139, -46, -83, -163, -158, +91, +47, +13, +133, +59, +242, +27, +229, 42, +215, +56, +26, +206, +65, +129, +61, +217, +170, +57, +159, +132, +174, 53, -183, -163, -107, +138, +197, +118, +30, +41, +126, +53, +138, +0, +26, +212, +33, +248, +24, +122, +181, +204, +70, +56, 19, -224, -43, -198, -163, -112, -101, +221, +177, +88, +134, +11, +241, 136, -37, -113, -65, -106, -168, -116, -94, -226, -8, 254, -34, -54, -9, -96, -122, -64, +73, 56, -170, -49, -141, -229, -141, -166, -155, -198, 210, 67, -165, -92, -193, -95, -50, -134, -195, -190, -179, -231, -230, -186, -103, -204, -112, -89, -96, -254, -178, -202, -81, -154, -15, -17, -33, -40, -226, -27, -200, -102, -119, -101, -161, 232, -142, +185, +228, +112, 211, -95, -93, -88, -11, -42, -188, -188, -236, -68, -5, -75, -96, -110, -149, -71, -106, -32, -130, -5, -60, +162, +244, +16, +218, +31, +193, +139, +7, +105, 167, -169, -134, -8, -182, -8, -9, -132, -116, -92, -118, -70, 251, +180, +138, +168, +181, +47, +190, +23, +255, +176, +119, +103, +45, +10, +46, +93, +107, 118, -158, +64, +85, +105, +113, 30, -167, -187, -50, -47, -58, -19, -3, -197, +180, +132, +49, +49, +221, +130, +230, +82, +49, +189, +112, 172, -238, -34, -7, -170, -217, -154, -72, -108, -72, -11, -30, +175, +41, 205, -181, -209, -91, -233, -1, -144, -65, -184, +178, +171, 167, -131, -153, -179, -155, -219, -219, -122, -253, -235, -164, -41, -191, -54, -67, -83, -20, -41, +2, +182, +217, +85, +77, +197, +30, +170, +125, 161, -203, -119, -66, -90, -128, -72, -124, -235, -227, -199, -119, -231, -119, -175, -211, -103, -34, +2, +187, +4, +246, +79, +229, +246, +6, 53, -128, -182, +198, 148, -201, -77, -141, -0, -167, -132, -250, -178, -254, -48, -119, +169, +65, +189, +110, +13, +150, +35, +134, +11, +27, +103, +9, +106, +90, +122, +9, 114, -116, +230, +197, +49, +113, +87, +49, +231, +140, +176, +231, +206, +225, +128, 233, -23, -7, -229, -162, -152, -170, -42, -210, -209, -221, -15, +108, 19, -195, -175, -96, +217, +50, +26, +141, +103, +90, 133, -119, -93, +61, +77, +118, +81, +62, 141, -36, -222, -157, 11, -30, -203, -244, -193, -94, 235, -136, -55, -138, -176, -199, -159, +238, +99, +74, +65, +67, +121, +207, +125, +67, +139, +89, +165, +108, +65, +169, +163, +3, 0, -25, -115, -88, -134, -167, -203, -51, -33, -11, -11, -109, -149, -247, -129, -93, -117, -90, -68, -252, -128, +174, +108, +19, +72, +177, +53, +0, +82, +89, +210, +99, +170, +56, +140, +239, +7, +63, +38, +209, +201, +91, +1, +143, +209, +5, +63, +124, +184, +106, +28, +201, +158, +215, +13, +210, 165, +74, +189, +120, +131, +19, +152, +231, +247, +204, +215, +187, +230, +219, +177, +99, 201, -205, -60, -170, -173, -50, -9, -123, -53, -154, -254, -134, -32, +246, +69, +30, +115, 70, -11, -135, -235, -36, -78, -227, -100, -128, -39, -225, +231, +129, +42, +127, +206, +46, +63, +89, +46, 222, -247, +10, +44, +232, +175, +151, +131, +171, 78, -253, -217, -137, -120, -57, -100, -104, -90, -54, -39, -130, +31, +237, +177, +13, +230, +221, +80, 155, +80, +134, +130, +185, +114, +30, +73, +42, +42, +216, +226, +103, +124, +2, +175, +242, +163, +189, +190, +44, +169, 33, -161, -150, -101, -48, -194, -182, 46, -227, -128, -32, -146, -52, -86, -226, -168, -87, -158, -147, -172, -209, -42, -147, -247, -78, -52, -112, -30, -156, -178, -199, -117, -15, -9, -195, -121, -77, -94, +164, +137, +245, +221, +165, +7, +4, +31, +66, +26, +70, +213, 156, -46, -169, -161, -48, -0, -51, 76, +67, +98, 212, -178, +215, +34, +119, +127, +11, +85, +228, +211, +82, 57, -134, -137, -110, -43, -238, -77, +195, +165, +102, +26, +225, +22, +245, +87, +74, +97, +109, +160, +2, +187, +45, +92, +102, +53, +1, 185, +183, +62, 156, -172, -41, -51, -209, -124, -78, -86, -70, -72, -243, -217, -114, +111, +140, +207, +100, +213, +58, +120, +183, +55, +253, +187, +238, +117, 247, -130, -199, -90, -240, +174, +219, +190, +236, +254, +191, +206, +74, +188, +2, +169, +111, +0, +61, +145, +55, +153, +38, +89, +217, +48, +117, +55, +41, +149, +152, +151, +164, +166, 192, -158, +107, +244, +196, +126, +112, +60, +95, +21, +204, +86, +182, +84, +219, +34, +86, +189, +206, +69, +231, +178, 115, +215, +89, +9, +128, +208, +176, +168, +34, +199, +69, +56, +216, +45, 181, -169, -112, -14, -119, -214, -81, +224, +106, +189, +123, +90, +205, 44, -223, -51, -237, -163, -41, -99, +95, +116, +62, +117, +122, +189, +124, +213, +171, +55, +155, +133, +1, +10, 173, -6, -51, -41, -205, -36, -157, -242, -135, -98, -63, -24, -156, -100, -203, -105, -198, -20, +82, +188, +56, 103, -132, -132, -218, -54, -101, -16, -2, +106, +203, +50, +163, +173, +188, 59, -9, -18, -162, -52, +44, +8, +144, +158, +130, +85, +212, +130, +42, +75, +146, +111, +95, +64, +175, +237, +170, +42, +194, 12, -177, -174, -182, -69, -77, -199, -101, -23, -119, -104, -117, -109, +214, +219, +78, +175, +223, 205, -48, -86, -123, -217, -47, -12, +197, +51, +168, +140, +169, +183, +88, +75, +33, +38, +119, +226, +156, 96, -52, -20, -122, +192, +48, +56, +133, +26, +126, +25, +206, +50, 43, -94, -162, -60, -15, -102, -255, -66, +46, +34, +14, +227, +23, +205, +193, +184, +185, +238, +244, +191, +220, +220, 173, -57, -113, -33, -4, -153, -100, -249, -182, -245, -75, -75, +68, +127, 252, +238, +134, +165, +147, +168, +32, +158, +136, +140, +69, +39, +239, +229, +88, +250, +15, +232, +141, +51, +78, +64, +126, 210, -122, -139, -255, -49, -148, +248, +90, +155, +218, +36, +78, +97, +22, +120, +151, +120, 50, -75, -157, -108, -27, -91, -86, -35, -247, 243, -105, -252, -54, -237, +9, +192, +213, +23, +166, +249, +191, +97, +136, +11, +47, +146, +202, +59, 65, +80, +239, +204, 81, -68, -132, -141, -19, 222, +1, +145, +31, 190, +24, +46, +252, +161, +32, 22, -103, -126, -128, -236, -188, -0, -75, +111, +68, +110, +205, +166, +193, +12, +237, +64, +172, +78, +64, +227, 209, -10, -22, -128, -107, -240, -190, -58, -44, -141, -152, -188, -156, -252, -213, +137, 77, -173, -213, -115, -243, -217, -227, -37, -146, -51, -120, -17, +253, +228, +190, +209, +164, 247, -248, -142, -236, -101, -85, -28, -8, +170, +238, +55, +214, +175, +64, +243, +86, 204, -234, -195, -154, +77, +137, +120, +161, +38, +203, +213, +131, +196, +172, +222, +202, +6, +74, +18, +16, +253, +168, +114, +65, 86, +10, 85, -7, -233, -221, -37, -63, -53, +34, +210, +217, +151, 132, -247, -198, -37, -163, -116, -129, -71, -116, -183, -234, -32, 24, -63, -244, -126, -213, -238, -197, -126, -96, -110, -56, -73, -156, 209, -84, -249, -130, -13, -60, -82, -231, +105, +174, +33, +146, +62, +101, +216, 3, -187, +20, 143, -172, -102, -179, +189, +201, +2, +207, +40, +208, +61, +162, +61, +89, +94, +63, +25, +77, +208, +5, +218, +113, +189, +5, 187, -229, -185, -123, +166, +231, +7, +200, +21, +181, +205, +150, +0, +144, +221, +92, +220, +252, +69, +80, +218, +17, +46, 217, -170, -77, +39, +66, +64, +0, +193, +250, +188, +7, +120, +165, +12, +240, +52, +222, +71, +138, +235, +206, +31, +5, +253, +141, +105, +28, 11, -123, -198, -140, -73, -156, -229, -32, -24, +7, +134, +143, +184, +92, +186, +170, +84, +25, +133, +152, +182, +22, +47, +139, +15, 232, -104, -70, -131, -100, -94, +39, +194, +198, 114, -36, -61, -50, +185, +202, 191, -148, -150, -54, -9, -18, -147, -82, -59, -91, +8, +15, +43, +138, +246, +230, 217, -81, -248, -225, -93, +226, +51, +80, +115, +167, +64, +197, +164, +23, +167, +116, +242, +147, +106, +213, +147, +151, +192, +5, +42, +78, +77, +199, +1, +191, +87, +237, +137, +70, +142, +194, 153, -212, -22, -22, -40, -66, -159, -240, -90, +10, +180, +120, +163, +146, +164, +188, +225, +54, +36, 205, -47, -171, -66, -118, -38, -126, -217, -58, -67, -96, -190, -241, -92, +211, +157, +156, +251, +206, +146, +149, +18, 148, -69, +58, 78, -139, -155, -141, -57, +129, +32, +159, 118, -252, -88, -54, -131, -20, -11, -205, -17, -182, -63, +236, +212, +6, +83, +185, +71, +197, +241, +118, +241, +134, +240, +44, +200, +106, 98, -205, -17, -45, -167, -113, -205, -145, -17, -18, -234, -216, +96, +49, +21, +92, +166, +220, +57, +125, +103, +97, 20, -51, -85, -81, -181, -61, -105, -90, -85, -148, -110, -73, -147, -186, -161, -106, -40, -128, -31, -222, -54, -142, -2, -11, -205, +15, +8, +15, +170, 82, -197, -75, -86, -202, -10, -107, -160, -24, -216, -151, -122, -41, -163, -73, -123, -67, +51, +46, 87, +104, +200, +16, 53, -93, -74, -227, -246, -212, -34, -70, -108, -244, -76, -7, -199, -205, -254, -244, -76, -25, -237, -111, -94, +39, +153, +231, +222, +91, +160, 207, +164, +204, +8, +66, +65, +83, +99, +165, +121, +82, +228, 180, -151, +248, +115, +30, +203, +132, +91, +130, 23, -160, +222, +65, +249, +168, +246, +137, +98, +42, +230, +115, +25, +144, +253, +60, +81, +23, +203, +90, +0, +33, +28, +143, +176, +150, +184, +17, +162, 113, -61, -211, -190, -14, +81, +112, +167, +53, +174, +238, +212, 71, -125, -155, -186, -31, -217, -234, -185, -224, -197, -78, -207, -244, +59, 92, -86, -101, -167, -103, -218, -27, -47, -198, -8, -112, -98, -56, -131, +151, 222, -100, +173, +247, +155, +119, +171, +228, +6, +57, 34, +91, +14, +162, +160, +245, +66, +182, +76, +165, +55, +158, 13, -234, +16, +92, +131, +148, +198, +6, +5, +94, +182, +107, +71, +104, +10, +123, +182, +89, +103, +64, +38, +140, +50, 181, -29, -156, -246, -238, -33, -243, -48, +102, +18, 161, +166, +16, +4, +86, +233, +149, +155, +165, +171, +170, +188, +114, +211, +147, +190, +109, +245, +8, +102, +3, +171, 7, -67, -196, -83, -87, +2, +75, +162, +69, +195, +24, +200, +166, 177, -60, -134, -26, -114, -87, -121, +21, +186, +203, +44, +10, +125, +100, +27, +93, +78, +9, +154, +161, +247, +177, +123, +209, +192, 46, -39, -185, -130, -250, -164, -218, -18, -155, -85, +106, +127, +178, +134, +151, +157, +77, +99, +233, +181, +105, 159, +114, +92, +83, 164, +198, +228, +248, +138, +181, +170, 52, -121, -127, -234, -147, -189, -221, -114, -190, -50, +49, +74, +41, +116, +181, +157, +156, 20, -184, -230, -5, -139, -112, -17, +169, +145, +217, +170, +87, +232, +200, +62, +150, +173, +169, +80, +221, +203, +174, +236, +213, +222, +212, +130, +249, +186, +214, +189, +220, +236, +34, +217, +187, 15, -210, -176, +151, +89, +144, +101, +90, +243, 226, -129, -43, -19, +195, +208, +144, +189, +165, +225, +117, +164, +184, +110, +34, +159, +249, +198, +68, +132, +204, +152, +41, +23, +143, +188, +4, +85, +134, +143, +142, +37, +138, +174, 73, -62, +24, +109, +85, +252, +178, +235, +108, +218, +78, +155, +104, +11, +18, +24, +170, +6, 213, -77, -111, -223, -30, 239, -237, -211, -11, -29, -164, -201, -42, -14, -121, -147, -235, +177, +152, +74, +127, +142, +173, +38, +32, +125, +207, +215, +126, +231, 216, -87, -67, -183, -179, -106, -251, -118, +108, 244, -94, -103, -233, -205, -109, -214, +65, +137, +5, +252, +140, +15, +20, +29, +116, +37, +136, +213, +192, +107, +142, +124, 233, 108, -31, -88, -172, -124, -40, -176, -168, +95, +206, +57, +254, +42, +116, +178, +129, +2, +46, +191, +229, +145, +105, +237, +170, +207, +210, +166, +157, +77, 192, -104, -160, -194, -30, -209, -115, -101, -31, -55, -59, -144, -15, -3, -139, -104, +226, +85, +247, +73, +245, +166, +158, +243, +225, +50, 135, -90, -248, +181, +25, +250, +243, +120, +73, +33, +3, +168, +199, +245, +213, +173, +79, +178, 22, -179, -180, -52, +153, +155, +59, +199, +121, +8, +121, +17, 21, -223, +192, +172, +63, +74, +169, +44, +32, +6, +148, +182, +194, 84, -158, -164, -150, -147, -223, -132, -235, -119, -38, -70, -48, -160, -246, -214, -167, -125, +145, +156, +133, +15, +210, +80, +222, +173, +155, 224, -167, -50, -191, -49, -159, -251, -64, -213, +153, +41, +236, +137, +6, +166, +199, 103, -243, -5, -170, -138, -155, -38, -118, -161, +7, +136, +184, +109, +150, +16, +146, +106, 89, -113, -235, -173, -155, +43, 158, -194, -105, -48, -72, +99, +210, +9, +38, +121, +69, +110, +225, +92, +97, +4, +180, +50, 29, -23, +224, +93, 193, -121, -132, +223, +209, 247, -206, -60, -67, -89, -69, +255, +108, +245, +153, +77, +53, +68, +169, +96, +76, +106, +78, +13, +246, +9, +21, +61, +133, +78, +177, +120, +164, +186, +34, +232, +248, +223, +194, +65, +200, +108, +52, +148, +226, +31, +152, +20, +160, +40, +61, +111, +245, +222, +223, +109, +154, +48, +80, +238, +221, +126, +113, +226, +233, +93, +222, +234, +154, +41, +248, +10, +95, +27, +87, +124, +212, 149, -98, -113, -178, -61, -44, -17, +137, +115, +70, +28, +27, 245, -139, -217, -19, -46, -31, -71, -114, -190, -23, -94, -133, -38, -146, -238, -96, -47, -79, +221, +122, +103, +241, +53, +150, +49, +37, +22, +57, +165, +156, 185, -146, -120, -127, -248, -117, -146, +88, 242, -223, +152, +117, +115, +249, +102, +105, +210, +18, +246, 121, -212, -9, -20, -176, -12, -0, -151, -104, -104, -252, -220, -22, -10, -199, +37, +34, +76, +149, +82, +226, +25, +235, +119, +11, +206, +99, 54, -107, +181, 15, -216, -188, -190, -103, -46, -64, -132, +3, +44, +228, +99, +146, +230, +49, +87, +185, 51, +143, +186, +122, 47, -225, -68, -8, -131, -92, -94, -131, -31, -72, -98, -192, -5, -98, -93, -148, -77, -139, -124, -238, -82, -194, -218, -146, -44, -204, +140, +237, +254, +58, 232, -213, -54, +87, 112, -213, -8, -95, +1, +148, +228, +156, +163, +71, +100, +148, +223, +226, +158, 202, +193, +104, +188, +191, +70, +251, +104, +142, +221, +57, +128, +87, +79, +13, 136, -94, -180, -195, -219, -84, +114, +97, +121, +54, +239, +177, 69, -73, -67, -96, -225, +185, +189, +26, +30, 135, -247, -77, -50, -98, -255, -192, -48, -115, -27, +154, +55, +189, +39, +199, +197, +125, +87, 137, -140, -58, -252, -192, -34, -25, -35, -164, -121, -153, -108, +132, +14, +181, +241, 47, -120, -172, -128, -135, -185, -23, -12, -24, -23, -117, -186, -104, -56, -193, +14, +155, +125, +44, +161, +222, +252, +213, +145, +79, +115, +31, +179, 104, -154, -21, +133, +143, +176, +105, +241, +212, +155, +183, +148, +133, +73, +213, +93, +207, +242, +226, +4, +146, +45, +139, +208, +82, +229, +142, +58, 204, -40, +197, +203, 151, -169, -130, -185, -171, -242, -6, -85, -234, -63, -220, -236, -167, +249, +193, +116, +84, +102, +23, 15, -159, -182, -5, -148, -87, -192, -229, -36, -10, 145, -75, -170, -31, -157, -60, -240, -219, -12, -27, -229, -48, 202, -195, -188, -43, -57, -204, -187, -226, -230, -102, -168, -181, -26, -229, -253, -246, -237, -53, -218, -158, -213, -241, -126, -61, -220, -118, -187, -206, -108, -14, -140, -105, +175, +30, 60, -71, -122, -223, +93, +228, +109, +30, +44, +177, +90, +245, +41, +215, +161, +199, +5, +34, +10, +178, +164, +243, 216, -37, +137, +42, +199, +179, +215, +0, +206, +116, +134, +122, +36, +66, +148, +53, +115, +173, +67, +193, +77, +143, +96, +126, +97, +214, +158, +217, +123, +201, +171, +139, +46, +69, +182, +171, 170, -186, -233, -149, -118, -235, -93, -197, -203, -248, +163, 254, -240, -187, -147, -228, -118, -231, -25, -191, -127, +91, +229, +155, +149, +220, +202, +213, +55, +201, +150, +54, +181, 135, -64, -215, -203, -235, -152, -225, -1, -231, -104, -74, -72, +49, +112, +2, +236, 50, -195, -66, -133, +136, +183, 101, -140, -35, +88, +204, +114, +55, +167, 105, -82, -93, +78, +241, +91, +42, +187, +151, +132, +163, +208, +55, +78, +153, +151, +1, +73, +242, +100, +128, +213, +202, +19, +46, +237, +103, +62, +153, +56, +209, 54, -51, -95, +239, +175, +23, +183, +111, +129, +111, +204, +27, +34, +3, +209, +190, +237, +114, +106, 53, -18, -139, -110, -145, +16, +79, +209, +66, +140, +227, +114, +58, 34, -160, -137, -24, -127, -243, -138, -91, -253, -207, -237, -155, -206, -224, -162, -107, -89, +252, +196, +67, +198, +98, 24, -148, -187, -245, -59, -159, -46, -59, -185, -34, -74, 38, -133, -139, -184, -231, -89, -183, -119, -118, -209, -177, -42, -154, -197, -29, -123, -157, -179, -219, -246, -213, -167, -92, -95, -147, -154, +52, 68, -106, -210, -246, +228, +60, +10, +138, +42, +134, +30, +186, +182, 77, -255, -75, -174, -167, -73, -1, -34, -213, -243, -250, -234, +172, +156, +37, +102, +36, +8, +131, +244, +38, +157, +120, +201, +30, 107, -231, -183, +192, +137, +0, +66, +85, +15, +96, +137, +56, +229, +8, 193, -205, -245, 197, -223, -63, -93, -95, -89, -213, -204, -74, -7, -56, -107, -127, +86, +32, +244, 237, -172, -141, -96, -82, -46, -72, -141, -240, -165, -127, +152, +58, +52, +21, +21, +207, +27, +17, +157, +193, +230, +48, +25, +86, +108, +227, +194, +246, +195, +37, +38, +151, +131, +57, +179, +182, +143, +97, +4, +28, +22, 123, -125, +135, +4, +50, +65, +119, +32, +104, +128, +137, +242, +40, +91, +132, +93, +133, 105, -85, +10, +92, +105, +66, +218, +153, 47, -171, -221, -235, -180, -7, -55, -237, -94, -251, -114, +212, +224, +245, 240, -169, -215, -254, -218, -189, -253, -187, -213, -30, -175, -119, -31, -124, -5, -236, -95, -247, -172, -138, -172, -109, +25, +81, +90, +214, 24, -165, -219, -7, -60, -116, -45, -207, -205, -134, 113, -104, -144, -65, -251, -246, -182, -115, +95, +187, +68, +84, +250, +14, 245, -133, -234, -198, -90, -157, -167, -220, -128, -231, -157, -171, -126, -30, -59, -38, -71, -42, -215, -253, -166, -215, -189, -238, -229, -251, +19, +224, +145, +103, +249, 155, -28, -44, -234, -223, +148, 191, -193, -18, -89, -215, 95, -59, -61, -160, -66, -120, -74, -46, -63, -228, -111, -162, -49, -126, +134, 87, -198, -57, -239, -246, -219, -31, -46, -114, -213, -160, -140, -183, -123, -101, -160, +9, +11, +170, +99, 94, -231, -230, -2, -190, -176, -218, -168, -15, -215, -231, -127, -31, +60, +216, 92, -98, -133, -181, -149, -202, -120, +116, 38, -64, -172, +119, +68, +238, +248, +171, +195, +195, +243, +224, +55, 118, -30, -180, -207, -110, -187, -95, -237, -48, -146, -141, -209, +87, +40, 235, -126, -234, -158, 151, -4, -254, -236, -51, -236, -237, -217, -109, -167, -103, -117, -168, -168, +55, +194, 63, -159, -138, -15, -215, -95, -174, -206, -236, -168, -106, +170, +9, +241, +248, +227, +249, +161, +194, +105, +113, +254, +216, +171, +105, +99, +234, 174, -247, -199, -94, -247, -172, -112, -164, +142, +185, +42, +84, +128, +157, +242, 141, -87, -206, -253, -47, -219, -150, -213, -12, -11, -125, -127, -179, -95, -52, -238, -87, -103, -112, -219, -107, +5, 95, -245, -63, -94, -247, -46, -237, -215, -205, -3, -224, -75, -212, -198, +59, +58, +192, +100, +223, +204, +230, +132, +11, 178, -102, -23, -215, -103, -249, -43, -101, -188, -124, -30, -6, -158, -136, -47, -23, -155, -198, -49, -70, -5, -143, -211, -191, -232, -116, -110, -186, -87, +138, +42, +65, +105, +246, +56, +80, +192, +17, +92, +247, +33, +189, +26, +60, +45, +138, +98, +217, +24, +58, +21, 159, +10, +252, +134, +139, +227, +187, +58, +235, +33, +133, +15, +60, +2, +222, +165, +214, +104, +241, 202, +220, +92, +127, +229, +101, 226, -227, -172, -125, -197, -99, -88, -209, -150, -255, -32, -194, +47, +173, +238, 6, -243, -90, +229, +30, +161, +49, +6, +115, +218, +202, +157, +41, +137, +168, +85, +106, 97, -145, +80, +147, +219, +153, 123, -125, -234, -93, -95, -91, -94, -24, -238, -120, -222, -190, -188, -233, -156, -3, -5, -232, -229, -215, -107, -130, -47, -221, -243, -22, +114, +64, +43, +151, +38, +246, +254, +82, +139, +106, +246, +68, +7, +104, 123, -98, -121, -198, +206, +142, +241, +57, +187, +140, +24, +159, +225, 219, -193, -69, +28, +101, +13, 231, -234, -211, -237, -103, -43, -240, -139, +14, +166, +126, +25, +194, +214, 163, -244, +254, +16, +232, +42, +158, +153, 111, -187, -31, -63, -94, -217, +106, +200, +251, +52, +79, +166, +249, +81, +6, +224, +216, +181, +36, +27, +132, +184, +51, +229, +242, +177, +121, 86, -244, -44, +164, +248, +191, +143, +169, +132, +86, +232, +171, +172, +226, +228, +0, +53, +119, +72, +203, +128, +4, +127, +164, +121, +117, +2, +49, +196, +180, 142, -129, -159, -108, -215, +156, +143, +149, +92, +128, +244, +100, +255, 66, -84, -144, -54, +92, +80, +124, +246, +230, +127, +191, +251, +249, +175, +111, +254, +247, +127, +252, +245, +27, +48, +166, +9, 176, -125, -126, -94, -134, -130, -82, +64, 223, -94, -231, -18, -54, -225, -252, -41, -216, -237, -115, +188, +217, +228, +222, +67, 215, -109, -201, -187, -171, -19, -219, -61, +160, +248, 167, -116, -187, -148, -77, +57, +66, +57, +144, +79, +14, +30, 240, -191, -22, -50, -90, -246, -40, -19, -96, -126, -97, -61, +179, 57, -150, -145, +229, +10, +129, +95, +191, +253, 164, -194, -187, -135, -43, -179, -171, -82, -61, +218, 54, -81, -198, -197, -186, -86, -53, -65, -18, -153, -215, -10, -176, -213, -189, -236, -161, -4, -136, -90, -132, -118, 230, -107, -204, -4, -183, -239, -165, +43, +68, +232, +217, +40, +105, +230, +190, 52, -88, -187, -96, -239, -187, -210, -104, -209, -128, -186, -87, -83, -3, +221, +70, +66, +117, +134, 21, -250, -64, -198, -180, -140, -238, -156, -105, -131, -191, +196, +133, +221, +54, +173, +244, 101, -94, -208, +210, +145, +67, +51, +186, +129, +41, +127, +36, +42, +219, +10, +135, +70, +171, +115, +92, +233, +123, +51, 15, -88, -248, -156, -199, -199, -236, -157, -174, -55, -6, -250, -5, -40, -192, -213, -82, -5, -197, -155, -172, -140, -40, -167, -108, -183, -201, -26, -250, +85, +57, +176, 65, -213, -170, -114, +14, +153, +62, +129, 2, -225, +45, +125, +57, 12, -227, -4, -139, -109, -137, -97, -113, -70, -111, -54, -247, -37, +159, +212, +102, +230, +82, 162, -145, -138, 78, -22, -170, -150, -158, +248, +161, +78, +199, +194, +35, +176, +72, +124, +46, 138, -182, -239, +214, +24, +170, +35, +160, +130, +206, +211, +199, +244, +144, +21, +208, +237, +4, +15, +78, +124, +233, +44, +45, +16, +94, +183, +136, +199, +137, +133, +66, +44, +245, +56, +30, +27, +165, +146, +11, +199, +105, +124, +217, +74, +197, +250, +122, +227, +25, 139, -252, 80, -12, -149, -90, -181, -192, -28, -219, -194, -75, -158, -206, +153, 49, -90, -19, -174, -223, -157, -63, +203, +43, +0, +213, +88, +120, +76, 129, -109, -252, +131, +111, +215, +145, +98, +170, +0, +218, +49, +161, +43, +230, +218, +86, +187, +83, +114, +57, +89, +160, +200, +190, +240, +21, +219, +212, +221, +106, +14, +93, +68, +199, +6, +67, +57, 241, -249, -60, +12, +220, +133, +246, +116, +172, +10, +48, +29, +7, +130, +100, 96, -245, -213, -184, -109, 224, -233, -170, -80, -212, -245, -125, -3, -239, +75, +180, 87, -163, -181, -88, -143, -168, -146, -234, -126, -74, -163, -54, -179, -79, +244, +72, +243, +90, +24, 53, -214, +33, +167, +142, +231, +72, +61, +57, +217, +75, +132, +170, +147, +247, +23, +135, +124, +132, +102, +33, +54, +59, 58, -125, -223, +90, +81, +4, +235, +208, +183, +96, +230, +97, 200, -75, +49, +213, 85, -169, -128, -105, -19, -216, -170, -94, -141, -180, -73, -116, -149, -45, -50, 218, -28, -190, -170, -212, -14, -189, -77, -191, -104, -2, -87, -214, -225, -126, -107, -224, -212, -149, -96, -211, -117, -217, -57, +153, +130, +129, +154, +238, +5, +69, +25, +80, +47, +233, +34, +36, +222, 200, -160, -52, -6, -55, -51, -56, -72, -230, -174, -181, -245, -159, -196, -253, -149, -45, -61, -142, +151, +237, +132, +116, 82, +0, +205, +197, +113, +93, +7, +21, +148, +101, +26, +95, +217, +172, +239, 163, -71, +23, +103, +240, +236, +79, +105, +185, +1, +43, +28, +136, +177, +27, +41, +186, +29, +3, +147, +47, +66, 84, +235, +201, +215, +211, +236, +175, +22, +210, +6, +156, +40, +95, +170, +99, +195, +205, 42, -116, -191, -101, +88, +7, +197, +209, +36, +114, +30, +188, +100, +185, +27, 57, -55, -18, +105, +195, +134, +177, +147, +206, +115, +80, +180, +56, +195, +56, 140, -173, -187, -60, +230, +236, 58, -84, -229, -201, -50, -69, -53, -159, -201, -210, -142, +176, +211, +131, +41, +215, 182, -224, +97, +228, +228, +167, +58, +40, +126, +230, +234, +149, +136, +7, +108, +63, 219, +169, +211, +91, +177, +178, +221, +226, +231, +38, +48, +180, +10, +152, +185, +125, +44, 15, -88, -34, -115, -239, -245, -47, -143, +210, +33, +31, +222, 254, +50, +78, +228, +236, +10, +222, +87, 12, -30, -121, -61, +192, +204, +191, +189, +217, +119, +135, +123, +125, +211, +152, +10, 203, -31, -186, -76, -229, -15, -91, -42, +48, +163, +231, +178, +114, +84, +220, 242, -160, -101, -32, -143, -246, +116, +166, 202, -53, -81, +238, +219, +251, +222, +234, +56, 191, -177, -137, -58, -140, -13, -149, -86, -44, -83, -88, -177, -97, -53, -162, -73, -113, -196, -103, -92, -26, -177, -198, -194, -136, -53, -235, -186, +187, +159, +37, +38, 42, -151, -19, -180, -21, -153, -86, -203, -9, -26, -246, -63, -246, -114, -130, -207, -165, +143, +150, +221, +212, +10, +106, +172, 104, -219, -14, -53, -192, -86, -180, -255, -192, -85, -219, -26, -38, -109, -149, -75, -166, -213, +228, +209, +68, +76, +39, +71, 124, +184, +16, +120, +158, +141, +85, +141, +10, +22, +214, +10, +207, +215, +7, 227, -95, -170, -155, -237, -184, -47, -47, -213, -205, +42, +77, +172, +37, +246, +98, +86, +254, +38, +33, +86, +249, +89, +112, +218, +5, 44, +89, +132, +201, +144, +180, +178, +55, +29, +67, +142, +199, +152, +199, +60, +139, +152, +69, +247, +128, +144, +2, +160, +49, +116, +212, +11, +224, 151, -241, -82, -221, +32, +124, 108, -109, -206, -151, -234, -102, +137, +177, +23, +201, +177, 79, -168, -252, -42, +169, 98, -162, -150, -205, -121, +83, +221, +241, +204, +153, +96, +21, 169, -110, +83, +172, 150, -67, -200, -75, -117, -179, -18, -213, -205, -94, -106, -155, -189, -212, -54, -171, -206, -59, -189, -212, -54, -171, -107, -135, -94, -106, -155, +37, +226, +169, +23, +160, +133, 29, -91, -109, -179, -84, +134, +254, +78, 214, +194, +12, 108, -32, -250, -240, -165, -178, -217, -70, -68, -60, -239, +12, +201, +162, +90, 202, -102, +202, +148, +226, 205, -249, -40, +230, +33, +70, +86, +199, +236, +122, +192, +105, +87, +96, +68, +47, +74, +139, +99, +14, +37, +218, +0, +195, +168, +149, +89, +67, +168, +156, +141, +178, +235, +0, +26, +30, 188, -148, -54, -251, -81, +216, +27, +122, +152, 143, -126, -133, -148, -211, -79, -250, -160, -60, -123, -196, +92, +180, +219, +31, +63, +138, +19, +199, +71, +67, +227, +100, +74, +238, 188, -212, -54, -123, -169, -109, -86, -223, -2, -143, -233, -114, -213, -65, -50, -126, -232, -13, -171, -223, -35, -239, -192, -252, -240, -75, -117, -179, -231, -196, -155, +24, +215, +138, +25, +137, +56, +229, +28, +38, +93, +42, +150, +189, +162, 188, -84, -55, -123, -10, -69, 47, -213, -205, -94, -170, -155, -189, -84, -55, +111, +173, +173, +36, +236, +211, +108, +240, +224, +168, +118, +101, +66, +97, +86, +202, +133, +206, +179, +221, +87, +5, +146, +105, 219, -187, -178, -232, -165, -186, +203, +248, +202, +106, +168, +246, +85, +233, +180, +38, +208, +73, +164, +64, +239, +73, +35, 217, -51, -175, -110, -150, -241, -39, -251, -209, -48, -189, -20, +177, +180, +76, +161, +13, +83, +111, +178, +185, +210, +194, +25, +84, +148, +250, +76, +252, +13, +125, 55, -123, -26, -35, +245, 207, -187, -184, -89, +124, +52, +87, +111, +163, +246, +230, +3, +66, +34, +31, 115, -170, -166, -151, -234, -102, -47, -213, -205, -106, -18, -174, +24, +112, +40, +164, 158, -11, -98, -94, -202, -155, -237, -233, -42, -190, -212, -169, -122, -86, -148, +67, +241, +241, +247, +18, +137, +120, +50, +184, +154, +73, +192, 243, -165, -78, -213, -75, -157, -170, -151, -58, -85, -235, -187, -250, -82, -167, -170, +220, +218, 185, -58, -85, -13, +118, +69, +62, +149, +134, +110, +121, +95, +42, +149, +126, +118, +123, +7, +142, 51, -182, -47, -133, -170, -214, -56, -194, -151, -66, +28, +26, +220, +40, +106, +165, +146, +205, +193, +125, +183, +219, +211, 85, -77, -21, -170, -178, -141, +98, +129, +38, +149, 13, +187, +135, +89, +32, +40, +125, +26, 217, -88, -168, -170, -254, -144, -252, -163, -43, -84, -213, -208, -18, -95, -10, -85, -253, -64, -235, -124, -41, -84, -245, -92, -37, -136, -151, +103, +56, +1, +15, +210, +14, +114, +35, 66, -85, -207, -88, -76, -120, -41, -84, -181, +51, +44, +249, +31, +48, +102, +128, 136, +80, +169, +64, 101, -180, -26, -82, -149, -105, -240, -175, -190, -92, -92, -212, -142, -253, -151, -234, -5, -255, -199, -190, -122, +206, +41, +147, +144, +114, +178, +9, +17, +134, +217, +15, +115, +40, +176, +244, +99, +95, 193, -205, 69, -187, -84, -249, -130, -94, +201, 219, -46, -191, -180, -42, -122, -112, -243, -185, -211, +72, +73, +31, +6, +83, +199, +31, +15, +168, +92, +68, +98, +32, +189, +21, +91, +231, +245, +41, +31, +236, +182, +19, +7, +18, +106, +160, +116, +47, 179, -75, -137, -206, +140, +81, +225, +83, +153, +157, +216, +178, +40, +27, +181, +208, +7, +203, +45, +169, +125, 29, -63, -92, -219, -165, -213, -222, -92, -180, -192, -162, -220, +133, +205, +33, +27, 193, -230, -162, -5, -86, -85, -15, -54, -22, -45, -48, -47, -123, -240, -185, -211, -253, +131, 244, -249, +195, +145, +145, +248, +184, +210, +188, +196, 246, -178, +148, +69, +248, +202, +204, +181, +99, +188, +44, +2, +231, +161, +103, +116, +174, +117, +187, +2, +96, +205, +164, +124, 157, -165, -191, -126, +108, +130, +207, +10, +97, +198, +121, +83, +203, +169, 41, -120, -240, +6, +65, +24, +205, +76, +178, +250, +235, +118, +21, +200, +0, +15, +33, +30, +168, +47, +112, +31, +143, +78, +228, 82, -240, +110, +13, 224, +55, +21, +56, +20, +39, +177, +240, +125, +42, +89, +150, 165, -224, +134, +106, 193, -75, +235, +60, +1, +102, +240, +65, +138, +191, +151, +170, +179, +190, +186, +218, +38, +169, +196, +129, +150, +25, +179, +199, +156, +199, +41, +240, +118, +109, +103, +214, +178, +108, +12, +117, 193, -131, -181, +191, 222, -47, -5, -15, -254, -27, -23, -60, -56, -194, -172, -251, -79, -228, -220, -127, +92, +63, +163, +74, +26, +81, +206, +85, +16, +28, +52, +28, +219, +158, +120, +102, +100, 126, -25, +105, 247, -235, -205, +84, +229, +175, +82, +187, +159, +45, +182, +154, +138, +167, +58, +54, 183, +28, +155, +125, +34, +132, +117, +219, +129, +27, +206, +2, +25, +27, +80, +203, +234, +39, +37, +63, +91, +153, +227, +66, +213, +113, +210, +49, +84, +242, 207, -99, -96, -106, -107, -71, -144, -145, -17, -100, -29, -24, -26, -198, -20, -43, -85, -9, -76, -147, -93, -191, -36, -231, -223, -198, +117, +132, +41, +206, +110, +5, 95, -191, -36, -231, -47, -189, -148, +103, +162, 151, -228, -252, -207, -49, -57, -191, -23, -252, -7, -150, -8, -44, -102, -139, -79, -191, -50, -164, -80, +117, +5, +86, +208, +93, +140, 48, -138, -160, -62, -148, -32, -255, -221, -185, -32, -2, -104, -158, -123, -127, -181, -123, -207, -155, -120, -174, -248, -192, -9, -252, -69, -55, -17, -115, -47, -136, +189, +16, 197, -59, +0, +113, +4, +87, +156, 149, +31, 210, -95, +76, +36, +85, +87, +161, +216, +162, 156, -68, -244, -59, -180, -101, -83, -218, -107, -145, -132, -176, -135, -0, -125, -11, -191, -4, -42, -233, +252, +158, 5, -19, -95, -82, -74, -126, -248, -9, -190, -24, -123, -143, -210, -21, -243, -48, -246, +133, +149, +57, +131, +121, +36, +52, +116, +10, +75, +5, +126, +230, +8, +215, +139, +198, +49, +30, +235, +81, +232, +135, +209, +96, +62, +69, +254, +100, +30, +154, 112, +2, +216, +180, +252, +193, +166, +57, +202, +158, +104, +232, +236, +225, +151, +236, 74, -164, +70, +160, +11, +130, +71, 156, -228, +252, +140, +186, +144, +119, 111, -219, -96, -34, -126, -223, -9, -10, -20, -254, -195, -194, -243, -147, -55, -221, -64, -220, -46, -209, 75, -100, -43, -38, -177, -31, -194, +156, +178, +53, +12, +52, +116, +212, +204, +16, +247, +204, +89, +171, +125, +245, +171, +251, +79, +127, 55, -149, -113, -236, -57, -1, -98, -100, -102, -140, -71, -234, -28, -201, -57, -28, -102, -56, -73, -49, +126, +2, +212, 44, +220, +253, 156, -147, -176, -122, -191, -227, -234, -233, -87, -9, -103, -26, -155, -159, -138, -15, -14, -60, +62, +88, 29, -142, -239, -47, -91, -226, -149, -206, -213, -234, -197, 2, +94, +248, +42, +14, +202, 208, -168, +151, +13, +107, +55, +219, +251, +2, +212, +251, +217, +252, 122, +86, +77, +78, +10, +169, +2, +127, +167, +143, +66, +218, +146, 225, -139, -131, -159, -184, -227, -137, -211, -26, +78, +85, +255, +86, +251, +165, +71, +73, +117, 182, +168, +39, +205, +212, 70, -185, -1, -95, -183, -132, -19, -184, -226, -149, -155, -118, -115, -61, +37, 246, -198, -224, -58, -7, -248, -77, -136, -59, -21, -224, -30, -228, +45, +131, +203, +108, +187, +86, +225, +54, +100, +74, +235, +5, +92, +43, +148, 6, -194, +72, +191, +195, +133, +101, +82, +130, +198, +140, +121, +69, +144, +14, +106, +206, +155, +74, +204, +193, +56, +192, +87, +207, +66, +166, 47, -168, +155, +192, +218, +178, +8, +201, +102, +224, +14, +234, +109, +1, +199, +114, +0, +128, +56, +62, +16, +175, +48, +114, +189, +0, 117, -196, -166, -126, -156, +178, 71, -67, -240, -250, +129, +48, +47, +30, +144, +25, +100, +19, +120, +7, +69, +89, +142, +226, +27, +96, +106, 84, +202, +194, +81, +254, +17, +50, +198, +78, +147, +193, 188, +107, +249, +116, +81, +110, 186, -166, -215, -30, -54, -242, -85, -123, -24, -146, -178, -35, -237, -11, -19, -33, +236, +126, 234, -49, -227, -32, -172, -8, -191, -199, +220, +117, +175, +86, +115, +47, +63, +159, +136, +23, +59, +246, +111, +123, +157, +246, +106, +214, +226, +221, +221, +62, +247, +218, 191, -139, -128, -38, -225, -131, -19, -185, -177, +116, +239, +254, +190, +146, +66, 120, -128, -243, -32, -243, +119, +191, 203, -129, -206, +238, +117, +7, +254, +249, +165, +115, +121, 115, -60, -101, -112, -56, 158, -222, -248, -21, -242, -48, -146, -152, -135, -107, -179, -11, -126, -51, -41, -188, -53, -34, -7, -152, -3, -173, -22, -187, -248, -60, -95, -7, -180, -217, -92, -232, +239, +255, +193, +176, +127, +251, +250, +243, +215, 203, -129, -154, +77, +3, +252, +193, +14, +128, +246, +249, +121, +231, +178, +211, +163, 108, +209, +233, +24, 127, -248, -154, -58, -241, -83, -147, -90, -43, -125, -205, -177, -181, -93, -43, -62, -143, -61, -31, -245, -210, -185, -13, -203, -37, +52, 28, +227, +162, +215, +254, +156, +118, +250, +147, +97, +167, 59, -253, -5, +0, +189, +115, +141, +41, +178, +55, +79, 254, 239, -173, -217, -14, +134, +227, +168, +60, +219, +131, +126, +62, +211, +246, +127, +24, +118, +254, +212, +189, +94, +237, +250, +206, 244, -8, -100, -184, -98, -209, -2, -110, -0, -220, -149, -57, -221, -56, -143, +164, +232, +137, +97, +29, +151, +185, 238, +166, +39, +230, +75, +167, +251, +249, +75, +150, +236, +249, +157, +233, +137, +225, +126, +112, +78, +59, +157, +139, 65, -254, +255, +188, +157, +159, +219, +244, +212, +92, +181, +127, +205, +58, +109, +56, +41, +54, +198, +248, +163, +115, +116, +52, +182, +74, 98, -13, -151, -112, +236, +240, +67, 227, 239, -145, -53, -156, -121, -129, -55, -91, -192, -29, -4, 74, -48, -13, -125, -247, -245, -169, -37, -70, -179, -212, -115, -239, -173, -55, -114, -187, -154, -90, -99, -131, -169, -163, -29, +83, +22, 66, -71, -6, -157, -119, -97, -46, -153, -34, +91, +215, +172, +102, +173, +228, +199, +96, +245, +182, +142, +0, +24, +75, +228, +35, 13, -80, -36, -86, +146, +44, +167, 45, -16, +27, +230, +109, +179, +137, +14, +202, +215, +34, 8, -133, -151, -76, +166, +142, +243, 249, -219, -88, -188, -114, +182, +13, +99, +39, +63, +213, +97, +221, +248, +34, +9, +255, +31, +142, +100, +28, +15, +204, +78, +208, 94, -49, -85, -27, -190, +78, +207, 58, -21, -183, -83, -164, -166, -200, -23, -96, -169, -151, -180, +88, 7, -208, -47, -30, -102, -4, -52, -8, -62, -188, -138, -94, -149, -70, -111, -92, -200, -166, +197, +146, +157, +236, 88, -25, -195, -213, -179, -46, +210, +210, +240, +114, +133, +71, +74, +246, +111, +226, 2, -85, -46, +74, +205, +246, +108, +192, +177, +119, +31, 69, -38, -86, -81, -13, -203, -98, -82, -77, -184, -3, -2, -157, -62, -190, -120, -124, +32, +155, +210, +67, +26, +161, +160, +114, +36, +128, +185, +181, +228, +69, +236, +201, +30, +108, 17, -197, -25, -253, +123, +217, +152, 87, -244, -153, +215, +217, +29, 94, -146, -108, -91, -178, -205, -2, -22, -96, -76, +17, +32, +140, +155, +199, +15, +115, +187, +230, +99, +184, +86, +33, +59, +116, +160, +219, +216, +247, +230, 3, -183, +3, +143, +251, +253, 232, -180, -243, -150, -212, +154, +16, +154, 185, +116, 7, -177, -156, -224, -202, -106, -60, -233, -18, +198, 158, -189, -138, -4, -36, -112, -107, -217, -8, -181, -54, -126, +246, +13, +9, +5, +132, +21, +131, +242, +203, +251, +197, +202, +195, +129, +177, +82, +210, 147, -179, -77, -136, -209, +110, +163, +19, +93, +131, +183, +171, +154, +91, +92, +19, +151, 204, -18, -230, -191, -24, -238, +78, +89, +169, +219, +253, +144, +218, +202, 23, -251, -138, -98, -83, -50, -150, -189, -147, 109, -67, -18, -139, -217, -222, +184, +252, +209, +172, +146, +63, +162, +135, +193, +15, +229, +51, +96, +147, +214, +45, +19, +114, +143, +64, +236, +46, +90, +181, +226, +185, +51, +50, +96, +84, +247, +111, +207, +82, +128, +29, +244, +85, +85, +85, +45, +45, +12, +165, +155, +253, +158, +155, +121, +81, +215, +161, +59, +244, +99, +170, +130, +190, +30, +164, +153, +76, +90, +212, +219, +54, +167, +64, +41, +66, +117, +104, +5, +83, +117, +159, +240, +247, +71, +234, 19, -88, -162, -131, -124, -72, -70, -105, +254, +190, +22, +159, +112, +115, +163, +233, 109, +187, 215, -154, -241, +190, +26, +92, +116, +123, +157, +243, +130, +25, +206, +196, +26, +198, +125, +75, +88, +78, +185, +227, +54, +27, +168, +137, +69, 76, -91, -242, -68, -229, -41, -218, -83, 79, -162, -6, -211, -129, -171, -53, -95, -22, -216, -158, -86, -142, -51, -179, -133, -111, -30, -133, -44, -192, -213, -117, -252, -107, -216, -8, -98, -30, -1, -198, -73, -24, -0, -105, -80, -16, -42, -102, -145, -134, -231, -61, -10, -136, +221, 189, +46, +103, +67, +229, +254, +202, +122, +187, +97, +249, +38, +38, +208, +226, +24, +253, +187, +94, 231, -47, -20, +250, +243, +221, +23, +43, +131, +40, +15, +209, +107, 95, -89, -106, -139, -20, -191, -190, -211, +164, +230, +80, +43, +59, +40, +119, +95, +181, +168, +166, +67, 252, -182, -219, -71, -114, -235, -133, -30, -218, -247, -125, -183, -246, -248, -153, +217, +120, +136, +141, +198, +84, +35, +139, +40, 247, -77, -205, -170, -238, -238, -190, -21, -88, -47, -67, -196, -221, -191, -173, -70, -13, -239, 223, -149, -234, -159, -121, -249, -189, -111, -154, -249, +100, +79, 53, -68, -132, -150, +63, +8, +95, +190, +118, +6, +191, 180, -42, +123, +221, +162, +33, +216, +200, +50, +202, +3, +20, +236, +154, +38, +219, +15, +29, +6, +231, +55, +151, +55, 189, -209, -245, -238, -104, -65, +193, +237, +151, +118, +191, +211, +127, 206, -157, +124, +110, +100, +20, +197, +224, +249, +204, +26, +218, +159, +59, 201, -217, -16, -222, -0, -181, -62, -252, -123, +129, +35, +207, +71, +139, +232, +193, +128, 39, -224, -216, +81, +205, +20, +95, +142, 31, -27, -174, +62, +92, +52, +195, +136, +242, +68, +134, +2, +66, +17, +144, +195, +4, +157, +39, +211, +99, +51, +113, +151, +222, +211, 247, +199, +178, +167, +239, +15, +190, +167, +159, +66, +76, +38, +124, +100, +151, +181, +156, +30, +183, +49, +102, +207, +78, 121, -92, -3, -116, -123, 219, +148, +147, 165, -69, -219, -223, -45, -218, -174, -35, -43, -215, +49, 86, -255, +178, +150, +13, +227, +101, +122, +28, +152, +121, +48, +198, +204, +195, +190, +48, +243, +112, +28, +152, 89, -90, -196, -239, -179, -162, -40, -83, -157, -168, -47, -14, -148, -177, -23, -253, -171, -205, -206, -161, -106, -102, -205, -82, -91, -138, -131, -106, -26, -51, -69, -154, +128, +52, +103, +140, +156, +66, +227, +134, 241, -59, -216, +83, 152, -54, -44, +235, +160, +40, +138, +194, +132, +170, +25, +12, +102, +240, 156, -47, -230, -197, -178, -137, +25, +36, +249, +42, +54, +111, +86, +103, +187, +50, +217, 65, -18, -97, +149, +182, +139, +161, +55, +26, +120, +152, +63, +123, +30, +234, +170, +88, +71, +160, +224, +153, +108, +131, +237, +160, +58, +30, +63, +12, +231, +6, +238, 84, -187, -85, -113, -74, -116, -44, -195, -66, -115, -244, -23, -116, -39, -181, -214, +212, +170, +97, +247, +119, +158, +228, +8, +42, +162, +172, +201, 28, -199, -142, -21, -231, +189, +155, +59, +18, +112, +6, +215, +55, +215, +118, +254, +201, +105, +207, +191, +91, +73, +217, +105, +183, +95, +237, +100, 235, -248, -225, -196, 92, -61, -22, -206, 191, +255, +247, +156, +80, +109, +200, +113, +245, +228, 204, +153, +231, +25, +46, +101, +161, +55, +229, +183, +250, +94, +48, +241, +101, +18, +6, +58, +153, +59, +149, +35, +201, +21, +17, +141, +112, +2, +172, +189, +16, 169, +34, +77, +198, +213, +94, +56, +135, +204, +211, +60, +140, +178, +36, +50, +105, +94, +166, +56, +156, +201, +108, +72, +49, +115, +150, +42, +222, +81, +208, +213, +11, 40, -37, +119, +17, 151, -162, -252, -166, -160, -186, -19, -139, -24, -181, -32, -161, +136, +88, +82, +90, +37, 0, -25, 239, 65, -143, -74, -51, -240, -100, -168, -58, -251, +70, 9, -187, -197, -139, -225, -3, -28, -0, -104, -132, -63, -206, -66, -23, -158, -84, -16, -22, -149, -56, -42, -78, -98, -153, -27, -245, -53, -53, -2, -145, -90, -76, -165, -63, 135, -45, -35, -240, -71, -139, +224, +204, +176, +204, +81, 56, -33, -6, -18, -6, -22, -67, -57, -117, -238, -189, -48, -178, -82, -163, -80, 215, -1, -43, -83, -76, -156, -9, -99, -96, -101, -138, +37, +238, +224, +7, +74, 228, -230, -93, -78, -130, -86, -223, +132, +121, +107, +60, +140, +133, +196, 156, -252, -210, -250, +242, +152, 197, -48, -162, -151, -54, -23, -214, -138, -184, -66, -62, -65, -111, -14, -176, -13, -140, +100, 17, -84, -181, -189, -214, -92, -4, -195, -169, -89, -44, -24, -73, -202, +47, +104, 160, -37, +64, +194, +36, +78, +68, +85, +92, 156, +17, +170, +185, +185, +178, 132, -127, -92, -68, -8, -49, -66, -200, +23, +167, +117, +36, +196, +9, +38, +105, +83, +203, +69, +36, +76, +169, +222, +105, +188, +146, +78, +137, +138, 26, -199, -132, -148, -142, -191, -75, -129, -241, -43, -17, -72, -223, -176, +134, +115, +201, +136, +114, +196, +24, +230, +123, +219, +226, +25, +121, +173, +0, +15, +149, +30, +196, +64, +80, 47, -128, -96, -94, -131, -53, +24, +99, +72, +59, +34, +196, +42, +3, +19, +150, +127, +141, +120, +103, +119, +221, +251, +124, +169, +188, +98, +13, +108, +67, +67, +73, +18, +150, +233, +254, +62, +163, 59, +121, +55, +69, +53, +68, 86, +161, +233, +255, +252, +115, +17, +38, +127, +229, +255, +154, +145, +36, +46, +106, +75, +171, +231, +208, +87, +70, +50, +109, +93, 64, -212, -128, -188, -193, -12, -156, -148, +233, 184, -217, -22, -117, +108, 195, -191, -253, -113, -127, -72, -138, -81, -171, -136, -92, -51, -98, -133, -192, -194, -22, -132, -158, -66, -203, -138, -120, -153, -161, -2, -228, -119, -3, -82, -151, +221, +144, +114, +41, +108, 54, -172, -239, +84, +200, +56, +159, +82, +240, +57, 44, -217, -66, -189, -181, -112, +174, +174, +85, 135, -25, -190, -109, -49, +153, 69, -225, -100, -152, +11, +56, +180, +99, +189, +82, +56, +149, 67, -63, -54, -114, -42, -219, -131, -7, -39, -136, -123, -57, -128, -246, -87, -8, -174, -240, -26, -196, -222, -4, -132, -9, -38, -77, -252, -183, -102, -235, -135, -225, -2, +137, +199, 75, -167, -14, -112, -31, -94, -109, -158, -229, -22, -5, -98, -213, -11, -254, -146, -232, -138, -10, -135, -252, -97, -42, -3, +223, +189, +82, +81, +211, +54, +11, +46, +81, +60, +189, +234, 146, -64, -112, -31, -145, -70, -227, -80, -72, +49, +106, +90, 147, -135, -146, -200, -114, -112, -42, +22, 78, -194, -113, -2, -141, -136, -88, -195, -190, -126, -163, -61, -191, -148, -193, -226, -142, -41, -43, -70, -143, -162, -146, -4, -247, -223, -247, -98, -178, -244, -134, -52, -49, -19, -115, -74, -1, -195, -197, -134, -3, -249, 32, -194, -64, -10, -103, -52, -10, -35, -151, -58, -133, -154, -34, -17, -73, -194, -243, -35, -31, -147, -173, -39, -134, -23, -64, -136, -201, +5, +183, +47, +212, +56, 176, -241, -180, -211, -223, -213, -245, -109, -247, -99, -247, +93, +177, 140, -28, -160, +208, 6, -55, -215, -253, -91, -248, -207, -205, -151, +103, +120, +101, +202, +130, +222, +193, +73, +244, +217, +44, +85, +250, +152, +33, 204, +148, +234, +171, +51, +100, +21, +144, +185, 225, -224, -207, +206, +73, +42, +9, +236, +50, +34, +234, +68, +249, +253, +74, +63, +32, +53, +11, +236, +156, +205, 27, -188, -6, -76, -223, -218, -115, +24, 122, -179, -10, -54, -127, +115, +131, +183, +181, +57, +53, +29, +191, +70, +134, +219, +156, +83, +193, +0, +170, +193, +167, +219, 190, -46, -229, -138, -65, -243, -109, -226, -65, -227, -3, +21, +147, +66, +157, +110, 123, -2, -232, +55, +231, +157, +126, +223, +138, 77, -46, +225, +217, +186, 191, -184, -116, -8, -52, -172, -0, -35, -181, -196, -167, -124, -229, -128, -88, -240, -16, -106, -44, -101, +118, +46, +214, +186, +155, +112, +43, +87, +157, 171, +155, +30, +170, +223, 129, -43, -134, -214, -31, -161, -94, -125, +103, +57, +183, +178, +1, +168, +158, +23, +127, +191, +110, +95, +229, +186, +154, +68, +80, +21, +38, +45, +168, +159, +77, +12, +7, +197, +137, +11, +221, +77, +140, +6, +170, +251, +21, +96, +170, +253, +185, +51, +248, 248, -14, -200, 245, -19, +211, +167, +78, +49, +182, +199, +196, +118, +112, 243, -160, -50, -116, -41, -156, -72, -210, -81, -247, +241, +63, +59, +231, +119, +131, +243, +155, +175, +215, +119, +86, +22, +3, +213, +177, +215, +233, +223, +124, +237, 157, -136, -222, -0, -184, -161, -67, -7, -56, -132, -48, -210, -39, -79, -0, -185, -88, -196, +119, 86, -140, -1, 70, -143, -120, -208, -125, -224, -37, -210, -164, +48, +137, +192, +82, +35, +92, +223, +92, +172, +246, +54, +50, +57, +244, +58, +215, +23, +176, 96, -41, -204, -2, -239, -111, -25, -111, -229, -84, -130, -242, +30, +165, +63, +232, +94, +15, +62, +245, +218, +87, +150, +150, +7, +53, +200, +47, 157, -161, -76, -101, -25, -27, +30, +236, +96, 103, -229, -44, -130, -168, -16, -231, -156, -189, -37, -111, -182, +211, 40, -245, -183, -138, -231, -112, -149, +70, +172, +50, +143, +114, +213, +190, +235, +244, +208, +126, +114, +254, +5, +109, +49, +155, +70, 51, -80, -74, -149, -37, -105, -187, -174, -34, -13, -136, -64, -86, -103, -211, -86, -232, -101, -34, -17, -65, -4, -11, -141, -187, -83, -209, -14, -132, -7, -148, -197, -9, -112, +57, +144, +106, +180, +254, +151, +54, +254, +179, +125, +44, +147, +19, +170, +199, +250, +218, +251, +212, +198, +77, +218, +58, +152, +201, +129, +85, 131, -81, -197, -226, +93, +244, +218, +127, +27, +156, +183, 47, +47, +55, +141, +99, +114, +114, +213, +56, +95, +233, +220, +254, +210, +189, +232, +220, +192, +41, +190, +26, +220, +129, +192, 145, -98, -205, -163, -240, +89, +173, 222, -115, -165, -11, +91, 156, +129, +108, +140, +175, +253, 78, -44, -30, -164, +206, +6, +105, +114, +1, +212, +16, +119, +157, +95, 239, -227, -191, -88, -11, -29, -129, -148, -240, -150, -3, -207, -135, -234, -192, -32, -196, -238, -168, -3, -76, -59, -32, -89, -122, -240, -160, -7, +190, +246, +58, +27, +6, +49, +185, 12, -195, -73, -171, -220, -204, -14, -72, -139, -182, -125, -197, -232, -92, -24, -29, -137, -210, -219, 185, -37, -108, -221, -126, -59, -223, -237, -111, -59, -159, -209, -230, -225, -165, -30, -77, -229, -232, -251, -203, -213, -174, -122, -22, -8, -141, -200, -166, -29, -251, -37, -23, -87, -97, -34, +99, +212, 249, -57, -41, -194, -28, -139, -127, -128, -12, -169, -223, +117, +195, 24, -212, +38, +215, +225, +234, +230, +186, +123, +119, +83, +188, +193, +239, +55, +156, 97, -227, -207, -51, +147, +7, +115, +186, +140, +189, +81, +252, +254, +226, +130, +100, +134, +143, +161, +187, +236, 39, -250, -222, -18, -67, -224, +84, +207, +186, +244, +235, +201, +35, +105, 153, -220, +36, +43, +15, +231, +136, +57, +79, +38, +134, 48, -120, -229, -204, -195, -248, -175, -9, -8, -159, -247, -192, -227, -4, -0, +139, +206, +42, +250, 45, -121, -77, -192, -75, -67, -109, -145, -223, -209, -162, -39, -75, -178, -56, -32, -130, -130, -191, -74, -247, -231, -69, +133, 160, +47, +163, +7, +174, +213, +106, +244, 254, -18, -51, -39, -88, -224, -122, +86, +157, +134, 203, -28, -91, -155, -19, -251, -131, -82, -158, -93, -167, -237, -229, -108, -149, +125, +169, +126, +89, +65, +246, +7, +207, +225, +196, +52, 60, -91, -241, -98, -136, -12, -210, -222, -78, -151, -154, -175, +60, +231, +207, +68, +57, +9, +171, +181, +145, +240, +232, +77, +60, +247, +39, +16, +236, +176, 124, +131, +140, +112, +22, +74, +172, +139, +201, +112, +189, +152, +68, +61, 120, -188, -237, -241, +155, +185, +144, +28, +137, +127, +90, +250, +44, +140, +72, +169, +115, +156, +132, +96, +180, +46, +133, +73, +169, +90, +109, +51, +185, +91, +56, +160, 172, -24, -7, +101, 133, -120, -25, -224, +213, +137, +202, +84, +22, +51, +230, +228, +85, +74, +74, +16, +32, +129, +227, +245, +61, +150, +98, 73, -219, -141, +254, +84, +139, +178, +230, +239, +121, +93, +46, +72, +168, +13, +100, +168, +207, +45, +138, +188, 156, -50, -105, -190, -222, +132, +154, +39, +183, +14, +94, +87, +93, +171, +241, +80, +184, +7, +14, +126, 230, -95, +212, +239, +0, +147, +91, +140, 154, +70, +39, +99, +194, +217, +244, +223, +85, +33, +199, 50, -233, -59, -251, +120, +137, +231, +236, +15, +120, +53, +97, +21, +248, +57, +96, +51, +64, +193, +100, +79, +14, +100, +231, +172, +227, +97, +5, +19, +78, +44, +244, +112, +85, +247, +97, +109, +29, +77, +222, +116, +157, +97, +182, +198, +53, +80, +56, +113, +48, +89, +248, +149, +54, +195, +220, +198, 146, +219, +9, 53, -64, -116, -25, -148, -54, -131, -174, -136, -163, -230, -16, -4, -87, -25, -129, +109, +109, +91, +177, +190, +140, +198, +238, +68, 157, -150, -142, -20, -188, -225, -165, -243, +160, +83, +92, 20, -187, -95, +149, +120, +6, +169, 216, -109, -75, +192, +13, +54, +107, +154, +230, +23, +138, +188, 167, -71, -166, -129, -165, -231, -72, -68, -195, -24, -88, -163, -148, -86, -235, -207, +15, +246, +55, +33, +29, +9, +115, +13, 193, -249, -20, +16, +85, +241, +159, +131, +204, +56, +51, +82, +1, +114, +211, +247, +174, +70, +184, +169, 26, -68, -59, -107, -23, +161, +47, +229, +124, +16, +51, +75, +213, +120, +246, +115, +154, +13, +223, +176, +28, 147, +193, +176, +183, +68, +24, 224, -20, -207, -229, -8, +75, +205, +21, +3, 68, -83, -144, -148, -102, -67, -47, -112, -88, -192, -135, -17, +202, 190, -203, -101, -204, -68, -141, -162, -251, -156, +252, 68, -166, -131, -162, -85, -23, -232, -77, -130, -90, -182, +236, +140, +98, +98, +74, +164, +53, +215, +51, +54, +149, +214, +92, +105, +17, +211, 135, -169, -55, +24, +89, +172, +236, +193, +78, +215, +123, +130, 154, -102, +113, +78, +211, +80, +42, +39, +40, +25, 10, -34, -144, -120, -23, -35, -212, -41, -148, 70, +248, +111, +163, +57, +246, +179, +236, +250, +106, +194, 56, -124, -235, -152, -213, -201, -171, -132, -237, -108, +183, +178, +169, +19, +115, +85, +106, +174, +207, +160, +182, +68, +92, +135, +88, +51, 154, -230, -114, -108, -164, -107, -82, +120, +197, 52, -186, -233, -3, -148, -203, -191, -105, -174, -46, -211, -7, -136, -96, -164, -172, -28, -228, -191, -186, -136, -155, -184, -77, -240, -20, -170, -252, +53, +44, +247, +226, 73, -141, -98, -34, +99, +241, +179, +88, +4, +62, +50, +193, +220, +69, 155, -166, -65, -229, -97, -186, -168, -244, -53, -107, -116, -77, -43, -111, -102, -67, -217, -157, -51, -186, +22, +198, +222, +100, +17, +49, +31, +227, 135, -254, -71, -152, -121, -168, -121, -194, +147, +116, +198, +42, +232, +97, +39, +113, +139, +176, +128, +103, +158, +162, +103, +114, +19, +241, +100, +158, +251, +84, +37, +173, +28, +193, +154, +101, +22, +60, +9, +115, +167, +232, +173, +190, +26, +106, +46, +65, +142, 183, -7, -69, -111, -126, -89, -41, -143, -246, -3, -45, -203, -36, -131, -94, -181, -231, -217, -62, -129, -94, -250, -50, -187, -53, -82, -146, -73, -145, -27, -51, +213, +49, 83, -217, -23, -239, -74, -99, -209, -16, -61, +38, +161, +240, +254, +144, +83, +105, +105, +241, +212, +153, +87, 53, +177, +239, 103, -253, -140, -216, -164, -200, -136, -29, +203, +9, +82, +158, +34, +219, +102, +223, +247, +98, +182, +88, 85, -68, -75, -110, -213, -53, -243, -96, -147, +160, +13, +48, +136, +43, +141, 117, +184, +189, +238, +70, +223, +181, +166, +145, +0, +211, +22, 150, -192, -62, -75, -213, -30, -130, -116, -214, -249, -196, -227, -137, -208, -201, -237, -206, -115, -231, -16, -39, -107, -239, 237, -81, -221, -126, -59, -179, -35, -47, -36, -123, -96, +218, 27, -202, -19, -179, -167, +151, +54, +173, +250, 133, -228, -158, -212, -31, -96, +220, +250, +236, +66, +171, +123, +239, +5, +245, +163, +194, +51, +174, +70, +120, +160, +139, +160, +181, +26, +110, +35, +39, 33, -13, -166, +84, +250, +32, +51, +20, +20, +195, +235, 247, -172, -120, +123, +22, +24, +96, 133, -155, -228, -209, -53, -10, +142, +150, 50, -222, -249, -136, -112, -80, -134, -76, -52, -151, -124, -183, -234, -51, -217, -8, -67, -68, -99, -52, -183, -98, -235, -5, -127, -132, +142, +203, +185, +12, +92, +144, +145, +3, 49, -72, -101, -25, -229, -86, -78, -235, -204, -47, -94, -121, -165, -177, +13, 31, -193, -196, -187, +133, 151, +136, +71, +120, +120, +185, +214, +144, +43, +78, 168, -192, -45, -141, -131, -38, -130, -193, -243, -47, -40, -165, -130, -67, -248, -73, +90, +136, +90, +128, +35, +226, +145, +12, +48, +135, 187, -91, -74, -211, -186, -38, -83, +75, +92, +8, +149, +89, +194, +214, +58, 109, -86, -119, -167, -237, -196, +166, +170, 80, -38, -15, -18, -209, -66, -83, -138, -190, -254, -1, -222, -102, -63, +228, +37, +21, +153, 14, -69, -56, -26, -45, -230, -75, -84, -102, +133, +216, 151, -50, -136, -169, -244, -129, -102, -138, -223, -134, -111, -46, -185, -156, +64, +99, +83, +164, +230, +200, 108, -197, -203, -25, -254, -202, -174, -244, -228, -79, -129, -44, -192, +45, +139, +215, +226, 206, -213, -154, -57, -218, -208, -217, -193, -240, -84, -224, -74, -94, -237, 192, -1, -82, -21, -75, -20, -144, -143, -142, -164, -163, -189, -234, -161, -195, -219, -202, -22, -7, -154, -30, -125, -22, -60, -140, -145, -205, -49, -107, -232, -191, -163, -24, -44, -151, -195, -191, -86, -40, +73, +94, 8, -52, -224, -19, +173, +89, +149, +148, +149, +118, 140, -174, -60, -120, -56, -133, -124, -244, -226, -36, -110, -9, -233, -199, -114, -183, -181, -116, -183, -251, -141, -169, -107, -201, -141, -19, -160, -14, -179, -86, -199, -25, -26, -243, -224, -126, -51, -81, -226, -20, -22, -246, -213, 139, -129, -202, -116, -85, -166, +5, +101, +108, +69, +29, 119, -11, -239, -25, -28, -40, -53, 48, +78, +164, +177, +225, +187, +132, +200, 137, -123, -47, -74, -22, -24, -212, -60, -151, -72, -4, -99, -244, -156, -138, -194, -112, -102, 225, -66, -179, -123, -192, +143, +56, +133, +56, +113, +165, +159, +56, 111, -61, -24, -81, -131, -122, -7, -172, -57, -12, -209, +249, +128, +235, +156, +243, +170, 18, -64, -60, -70, -176, -184, -200, +89, 137, -201, -96, -230, +231, +19, +149, +161, +19, +44, +152, +52, +128, +177, +70, +242, +25, +35, +49, +218, 135, -225, -119, -229, 73, +86, +89, +120, +126, +114, +10, +68, +155, 58, -203, +8, +61, +128, +71, +206, +60, +110, +169, +92, +200, +164, +237, +91, +17, +193, +10, +8, +91, +209, +129, +247, +177, +61, +43, +193, +237, +176, +168, +53, +40, +169, +240, +69, +51, +183, +16, +153, +227, 133, -74, -47, +79, +232, +252, +231, +66, +70, +38, +130, +86, +37, +27, +248, +22, +149, +126, +255, +111, +121, +165, +254, +118, +197, +255, +158, +140, +228, +53, +46, +49, +183, +99, +77, +152, +45, +88, +93, +220, +156, +189, +98, +199, +248, +162, +139, +142, +88, +116, +35, +103, +142, +135, +82, +60, +38, +108, +14, +245, +89, 18, -140, +206, +4, +190, +69, +199, +54, +26, +50, +38, +67, +4, +136, +128, +14, +10, +136, +177, 231, -204, -219, +82, +205, +62, +124, +203, 184, -230, -106, -70, -20, -13, -28, -152, -47, -246, +82, +31, +77, +102, +101, +113, +32, +231, +181, +24, 134, -158, +30, +96, +156, +161, +149, +243, +214, +179, +122, +84, +3, 239, -37, -75, -114, -202, -153, -121, -191, -147, -128, -0, -18, -240, -104, +45, +171, +254, +169, +251, +150, +124, 26, -120, -255, -196, -248, -44, +249, +139, +204, +249, +152, +227, +35, +51, +247, +45, +250, 124, -4, -176, -177, -135, -49, -117, -226, -193, -89, -194, -105, -245, -201, -144, -166, -220, -196, -38, -0, -70, -234, -132, +242, +214, +108, +208, +15, +169, +243, +247, +204, 137, -127, +191, +231, +95, +139, +108, +192, +159, +205, +94, +142, +174, +198, 35, -210, -197, -137, -131, -209, +186, +219, +56, +203, +181, +77, +105, +41, +7, +34, 164, -20, -222, -197, -46, -62, -65, -152, +39, 176, -187, -26, -158, -141, -4, +215, +153, +101, +202, +17, 174, -7, -65, -130, -179, -189, -62, -21, -31, -225, +55, +194, +97, +208, +219, +143, +52, +4, +216, +112, +76, +113, +41, +184, 187, -89, -72, -179, -160, -115, +240, 34, -3, -1, -255, -67, +248, +110, +252, 23, -70, -66, -168, -242, -64, -102, +241, +109, +24, +221, +227, +68, +154, +247, +253, +139, +152, +251, +120, +178, +184, 216, -31, -66, -180, -193, -145, -131, +12, +77, +25, +3, 113, -1, -55, -167, -226, -38, +10, +209, +63, +73, 183, +101, +137, +245, +47, 186, -52, -102, -29, -221, -70, -99, 76, -1, -0, -7, -229, -30, -94, -176, -121, -232, -47, -39, -48, -56, -23, -87, -72, -99, -199, -127, -107, -253, -157, -130, -179, -124, +141, +122, +170, +212, +220, 142, -246, -121, -157, -45, -93, +174, +77, +128, +175, +24, +143, +194, +149, +33, +150, +196, 5, -165, -133, -220, -46, -94, -68, -99, +169, +161, +210, +121, +137, +35, 248, -172, -151, -140, -69, -231, -98, -38, -228, -30, -123, -232, -58, -43, -96, -181, -16, -83, -112, -133, -189, -145, -163, -119, +139, +216, +36, +128, +233, +1, +225, +168, +198, +52, +150, +55, +154, +110, +26, +75, +15, +149, +114, +5, +127, +201, +24, +14, +251, +206, +158, +155, +235, +158, +49, +195, +101, 129, -130, -222, +249, +203, +42, +71, +105, +62, +68, +132, 160, -13, -237, -221, -144, -165, -59, -77, -64, -112, -43, -165, -251, -134, -90, -69, -225, -98, -50, -165, -77, -229, 136, -185, -135, -80, -163, -3, -49, -138, -106, -10, -24, -90, -58, +111, 32, -161, +155, +221, +151, 133, -156, -170, -0, -65, -198, -86, -49, -236, -37, -58, -84, -105, -148, -193, -26, +162, +59, +78, +127, +117, +97, +45, +168, +240, +242, +178, +19, +21, +44, +129, 185, -217, -152, -143, +85, +30, +169, +129, 8, -172, -93, -5, -178, -211, -150, -1, -70, -253, -92, -46, -131, -147, -116, -229, +22, 240, -90, -249, -190, -244, -105, -220, -112, -14, -13, -120, -223, +156, +166, +26, +34, +216, +34, +36, +16, +210, +113, +217, +25, +237, +219, +69, +122, +156, +238, +203, +188, +232, +76, +12, +20, 179, -41, -95, -171, +186, +139, +28, +168, +102, +107, +34, +177, +33, 45, -38, -43, -171, -179, -72, -66, -220, -60, -74, -1, -32, -240, -245, -14, -40, +120, +50, +215, +70, +111, +165, +7, +64, 6, -12, -123, -227, -190, -138, -87, +225, +158, +14, +102, +206, +110, 110, -8, 111, -223, -43, -113, -130, -135, -64, +235, +245, +175, +147, +166, +252, +161, +25, +154, +162, +72, +9, +93, +190, +19, +210, +2, +68, +226, +91, +31, +63, +190, +191, +184, +127, +155, 62, -58, -179, +19, +169, +1, +180, +165, +76, +110, +106, +4, +56, +37, +212, +151, +245, +135, 185, -175, -66, -0, -53, -160, -108, -136, -229, +147, +163, +75, +191, +56, +40, +23, +197, +84, +85, +145, 142, -128, -201, -239, -94, -50, +238, +126, +152, +24, +126, +5, +43, +188, +235, +106, +36, +241, +254, 66, +240, +88, +166, +15, +246, 90, -75, -33, +71, +188, +81, +132, +61, +254, +4, +200, +152, +195, +50, +60, +93, +158, +9, 89, -190, -119, -143, -172, -6, +88, +104, +171, +188, +15, +236, +170, +211, +34, +226, +7, +44, +77, +110, +230, +81, +109, +149, +73, +216, +171, +209, +244, +55, +4, +49, +90, +56, +92, +39, +113, +26, +39, +3, +60, +9, +247, +126, +112, +234, +207, +78, +196, +203, 33, -46, -183, -47, -58, -246, -63, +67, +211, +178, +57, +17, +220, 12, -35, -134, -133, -22, -247, -58, -59, -13, -100, -118, +9, +181, +44, +131, +17, +182, 117, -252, +25, 7, -244, -66, -99, -83, -237, -166, -75, -69, +4, +145, +164, +177, +18, +71, +189, +242, +156, +100, +141, 86, -101, -92, +153, +188, +119, +162, +129, +243, +224, +148, +61, +174, +123, +72, +24, +206, +107, +242, +226, +116, +73, +13, +133, +1, +152, +97, +162, +150, +205, 49, -28, +76, +116, +91, +113, +111, +202, +229, +100, +77, 153, +137, +230, +115, +178, +50, +66, +154, +207, 150, -152, -68, -0, -52, -127, -192, +187, +23, +60, +214, +130, +7, +246, +156, +171, +77, +133, +115, +184, +179, +142, +98, +249, +158, +105, +31, 77, 25, +107, +53, +152, +73, +105, +38, +233, +148, +63, +20, +251, +193, +224, +36, +91, +78, +51, +166, +56, 35, -46, -213, -79, -8, -186, -162, -204, -106, -221, -120, +36, +212, 182, -135, -242, -95, -254, -192, -153, -20, -173, -28, -213, -44, +41, +131, +16, +216, +73, +144, +16, +165, +97, +136, +117, +181, +45, 106, -60, -81, -68, +58, +46, +187, +184, +67, +171, +107, +107, +134, +177, 218, -74, -146, -234, -119, -237, -8, -131, -125, -141, -94, -50, -173, -210, -99, -84, -243, -241, -231, -23, -137, -51, +203, +126, +97, 0, -121, -108, -85, -199, -1, -241, -156, -124, -187, +163, 161, -140, -29, -119, -130, -67, -225, -128, -230, -164, -55, -138, -25, -190, -149, -235, -148, -187, -70, -165, -194, +208, +91, +241, +18, 229, -172, -43, -253, -108, -194, -128, -33, -47, -120, -164, -40, -200, -74, -118, -24, -216, -88, -202, +121, +48, +251, +23, 106, -168, -59, -212, -47, -143, -134, -19, -143, -98, -111, -213, -204, -89, -20, -7, -180, -65, -250, -3, -87, -156, -197, -74, -138, -88, -79, -248, +205, +137, +11, +33, 200, +36, +203, +119, +173, +159, +91, +226, +231, +214, +59, +252, 143, -156, -133, -98, -78, -212, -37, +161, +148, 89, +234, +100, +219, +216, +178, +26, 185, -81, -112, +159, +207, +227, +183, +105, +15, +138, +34, +34, +108, +156, +240, +246, +181, +56, +243, +3, +100, +231, +5, +88, +138, +86, +176, +0, +92, +131, +247, +213, 97, -249, +105, +196, +228, +245, +228, +175, +110, +106, +173, +158, +155, +47, +30, +47, +145, +156, +193, +139, +184, +199, +119, +100, +47, +171, +226, +64, +96, 86, -240, -27, -227, -179, -127, -132, 31, -6, -19, -82, -42, -73, -126, -178, -216, -69, -57, +214, +180, +170, +58, +72, +239, +46, +249, +169, +33, +188, +55, +46, +25, 165, -114, -10, -160, -18, -194, -111, -77, -149, -61, -182, -28, -153, +11, +60, +162, +187, +85, 7, -74, -4, -147, -71, -153, -230, -234, -224, -244, -252, -13, -23, -163, -229, -110, -196, -15, +193, +248, 161, -38, -62, -18, -220, +247, +171, +118, +47, +246, +3, +115, +195, +73, +226, +140, +166, +202, +23, +108, 224, 145, -82, -192, -13, -116, -10, -144, +58, +31, +216, +125, +100, +53, +155, 221, -103, -43, -107, -105, -27, -20, -168, -137, +45, +207, +221, +203, +86, +109, +90, +216, +11, +102, 76, -154, -183, -5, -150, -192, +226, +44, +7, +193, +64, +71, +51, +26, +36, +243, +146, +35, +233, +145, 249, -34, -232, -225, -207, -14, -82, -110, +165, +180, +180, 73, -162, -67, -9, -38, -128, -255, -200, -61, -143, -10, -209, -147, -16, -80, -57, -148, -203, 144, -210, +152, +148, +218, +217, +202, +142, 194, -104, +15, +239, +203, +164, +182, 176, -90, -136, -103, -181, -172, -24, +64, +17, +250, +132, +215, +106, +126, 89, -110, -233, -143, -91, -208, -108, -20, -206, -244, -216, -225, +21, +178, +51, +241, +203, +214, +25, +2, +243, +141, +231, +162, +44, +114, +90, 220, -1, -254, -5, -110, -168, -15, +108, +204, +177, +227, +199, +178, +25, +164, +88, +104, +142, +176, +253, +17, +107, +142, +104, +57, +141, +107, +142, +140, +144, +80, +199, +166, +152, +169, +138, +170, +237, +73, 211, -114, -52, -146, -66, -76, -14, -37, -148, +170, +162, +116, +75, +154, +212, +13, +85, +67, +1, +252, +240, +174, +113, +20, +88, +104, +150, +42, +94, +178, +82, +86, +88, +3, +197, +192, +190, +212, +75, +25, +77, +218, +27, +186, +170, +233, +82, +26, +183, +167, +22, +49, 98, -62, -140, -238, -172, 163, -33, -38, -27, -209, -90, -173, +103, +58, +56, +110, +246, +167, +103, +202, +104, +127, +243, +122, +166, +189, +188, 0, -201, -19, -244, +141, +235, +153, +246, +117, +56, 234, -7, -199, -230, -250, -24, -187, -143, -168, -106, -198, -40, +219, +212, +253, +200, +86, +47, +5, +47, +118, +122, +166, +151, +178, +42, +59, 61, -163, -15, +211, +222, +120, +49, 70, -7, -148, -174, -235, -22, -148, -40, -84, +128, 19, -125, -76, -81, -190, -109, -181, -233, -190, -223, -189, +195, +25, +244, 38, -4, -18, -190, -96, -44, -133, -42, -14, -202, -35, -223, -49, -20, -24, -209, -219, -141, -177, -167, -32, +19, +105, +80, 175, -112, -226, -82, -28, -153, -157, -183, -2, -114, -12, +237, +224, +180, +119, 15, -28, -131, +153, +135, +9, +61, +24, +34, +158, +186, 138, -103, +229, +49, +212, +144, +187, +202, +75, +57, +201, +21, +212, +39, +213, +150, +216, +172, +250, +36, +165, +201, +251, +83, +159, 236, +237, +150, +243, +149, 161, -1, -124, -17, -114, -52, -190, -244, -162, -202, -28, -26, -197, -40, -14, -128, -89, +192, +53, +47, +88, +132, +139, +120, +144, +134, +21, +15, +92, +153, +72, +242, +169, +110, +122, +251, +246, +120, +111, +159, +95, +232, +32, +77, +86, +113, +200, 155, -152, -36, -221, -230, -102, -101, -105, +92, +199, +190, 26, -117, -39, -164, -32, +186, +157, +85, +219, +183, 163, +247, +58, +75, +111, +110, +179, +78, +103, 251, +192, +98, +229, +67, +129, +69, +5, 70, -77, -78, -87, -228, -33, -76, -57, +3, +21, +246, +136, +158, +43, +251, +184, +217, +129, +124, +28, 88, -146, -190, +68, +59, +212, +194, +183, +152, +165, +165, +169, +248, +166, +242, +36, +181, +156, +252, +38, 92, -111, -76, -41, -25, -19, -197, -175, -35, -75, +191, +51, +49, +130, +1, +181, +183, +62, +237, +3, +63, +149, +249, +141, +249, +220, +7, 170, -239, -18, -113, +62, +155, +47, +80, +85, 220, -58, -87, -152, -245, +52, +177, +11, +205, +138, +91, +111, +221, +244, +20, +78, +131, +65, +234, +184, +8, +206, +19, +188, +119, +230, 25, -88, -89, -114, -99, -36, -103, -255, +202, +42, +170, +20, 139, -173, -38, -226, -179, -232, -82, +147, +237, +97, +137, +168, +95, 204, -57, -119, -5, -108, +158, +112, +249, +52, +146, +243, 189, -69, +240, +42, +52, +145, +116, +7, +123, +121, 202, -185, -79, -50, -128, -142, -35, -20, -21, -245, -120, -98, -170, -83, -200, -73, -215, -75, -179, -124, -25, -72, -246, -70, -99, -113, -44, -45, -185, -153, -250, -222, -119, +149, +196, +251, +195, +175, +147, 148, -75, +255, +206, +147, +78, +160, 128, -92, -96, -56, -23, -3, -126, -199, -126, -166, -105, +101, 0, -13, -37, -233, -136, -194, +184, +68, +67, +227, +231, +182, +80, 56, -214, -140, +182, +89, +123, +192, 230, -187, -243, -55, -29, -23, -43, -157, -83, -92, -36, +245, +189, 112, -101, -72, -244, -119, -4, -202, -212, -129, -229, -247, -5, -44, -247, -231, -32, -242, -57, -230, 1, -205, +34, +156, +121, +9, +39, +66, +24, +228, +242, 26, -53, -239, -159, +252, 64, -141, -37, +18, +3, +46, +16, +235, +162, +108, +90, +228, +75, +151, +18, +214, 150, -159, +100, +97, +70, +175, +182, +129, +171, +70, +248, +82, +70, +244, +162, +29, +222, +166, +42, +74, 26, -106, -59, -150, -21, -224, -59, -209, -252, -126, -223, +2, +11, +63, +124, 104, -142, -194, +146, +17, +251, +7, +134, +153, +219, +72, +100, +212, +225, +7, +22, +201, +24, +33, +205, +203, +100, +123, +193, +99, +5, +60, +204, +189, +96, +192, +184, +168, +211, +69, +195, 9, -42, -20, +70, +211, +172, +96, +70, +185, +76, +21, +204, +93, +149, +55, +168, +82, +255, +225, +102, 63, +125, +248, +180, +45, 160, -66, -53, -151, -229, -149, -111, 188, -13, -150, -81, -153, -177, -136, -80, -108, -71, -21, -19, -14, -42, -134, -142, -113, -74, -215, -167, -134, -16, +2, +46, +39, +81, +136, +92, +82, 253, -105, -248, -0, -247, -31, -101, +232, +228, 129, -185, -140, -48, -130, -214, -153, -168, -44, +223, +101, +216, +40, +135, +81, +30, +230, 125, -145, +201, +97, +222, +23, 55, -153, -146, -102, -194, -151, -227, +55, +67, +173, +213, +40, +31, +182, +111, +175, +209, +246, +172, +142, +247, +135, +195, +109, +183, +235, +204, +230, +192, +152, +198, +115, 164, -81, -52, -61, -122, -51, -47, -89, -126, -2, -38, -121, +247, +141, +93, +162, +170, +155, 94, -249, -68, -22, -23, -202, -35, +105, +183, +222, +87, +188, +140, +31, +14, 191, +59, 73, -107, -7, -146, -138, -160, -2, -226, -182, -143, -103, -163, -41, -152, -224, -74, -7, -248, -217, -32, -43, +110, +119, +94, +240, +251, +119, 8, -181, -106, -212, -223, -108, -24, -133, +116, +189, +190, 142, -59, -114, -98, -3, -207, -106, -83, -104, -182, -250, -48, -81, -29, -61, -140, -132, -79, -53, -32, -77, -57, -125, -34, -37, +25, +30, 112, +142, +166, +132, +36, +51, +44, +84, +88, +198, +56, 146, -209, -212, -176, -242, -124, -211, -181, -227, -121, -223, -61, +38, +213, +101, +51, +243, +85, +35, +177, +232, +22, +41, +2, +154, +136, +241, +55, +175, +184, +213, +255, +210, +190, +237, 12, -218, -119, -189, +46, +187, +150, 133, 65, -49, -88, -221, -174, +185, +91, +191, +243, 249, -196, -140, -5, -176, -108, -148, -54, -149, +170, 147, +43, +162, +100, +82, +184, +136, +123, +158, +119, +123, +231, +151, +29, +171, +162, +89, +220, +177, +215, +57, +191, +107, +95, +127, +206, +245, 53, +169, +73, +164, +38, +109, +223, +246, +191, +230, +122, 154, -153, -134, -178, -243, +20, +32, +82, +61, +111, +174, +127, +233, +252, +58, +184, +189, 185, -255, -211, -105, -161, -152, +252, +251, +231, +155, 107, -202, -168, -243, -95, -11, -199, -205, -147, -197, -79, -18, -24, -238, -36, -90, -90, -219, -61, -26, -72, -41, -131, -5, -229, -12, -114, -99, -81, 171, -102, -221, -13, -120, -142, -67, -165, -32, -39, -253, -175, -81, -202, -137, -77, -249, -38, 154, -192, -7, -207, -99, -165, -130, -109, +89, +233, 0, -39, -230, -57, -93, -178, -150, -205, -230, -154, -200, -230, -217, +231, +237, 95, -170, -137, -13, -136, -9, -199, -99, -248, -103, -55, -90, -116, +58, +107, +35, +152, +148, +11, +82, +35, +124, +237, +223, +221, +92, +89, +213, +203, +106, +247, +58, +237, +193, +109, 187, -230, -15, -140, -158, -105, -175, -71, -166, -10, -227, -8, -116, -49, -41, -145, -71, -27, +215, +190, +26, +124, +238, +181, +127, +233, +222, +253, +221, +106, +143, +215, 187, -201, -40, -128, 15, -166, -124, -96, -214, -131, -83, +126, +1, +236, +223, +244, +172, +138, +172, +109, +24, +165, +219, +7, +60, +116, 45, +207, +205, +134, +113, +104, +144, +65, +251, +238, +174, +115, 253, -10, -82, -6, -160, -29, -43, -61, -194, -27, -117, -79, -152, -96, -29, -29, -252, -172, -19, -47, -41, -19, -3, -37, -186, -9, -19, 149, -88, -187, -155, -136, -25, -200, -44, -254, -82, -57, -7, -80, -158, -77, -25, -145, -81, -173, -127, -209, +234, +198, +90, +157, +167, +220, +128, +23, +157, +235, +126, +30, +59, +38, +71, +42, +215, +253, +182, +215, +189, 233, -221, -136, -147, -120, -142, +229, +251, +155, +28, +44, +234, +223, +191, +197, +18, +89, +55, +191, 116, -126, -228, -248, +122, +64, +133, +240, +148, +92, +125, +204, +223, +68, +99, +252, +174, +140, +115, +209, +237, +183, +63, +94, +230, +170, +65, +25, 111, +247, +202, +64, +189, +206, +237, +37, 124, -47, -144, -148, -76, -1, -38, -159, -135, +97, +181, +81, +31, +111, +46, +254, 62, +184, +194, +10, +107, +43, +149, +241, +76, +128, +200, +58, +255, +23, +32, +226, +170, +208, +223, +4, 27, 89, -83, -87, -20, -178, -81, -39, -218, -17, -116, -72, -105, -165, -148, -221, -242, -210, -129, -183, +255, +94, +247, +115, +247, +162, +36, +224, +231, +95, +96, +95, +207, 239, -241, +58, 61, +171, +3, +69, +253, +249, +68, +124, +188, +249, 122, -170, -57, +125, +110, +71, +81, 115, -127, -121, -42, -218, -46, -37, -4, -249, -103, +189, +63, +245, 186, -14, -229, -183, -162, -26, -8, -199, -117, -99, -101, -204, -84, -35, +231, +133, +227, +108, +188, +114, +238, +127, +213, 182, -208, -102, -43, -239, -101, -84, +172, +100, +88, 232, -20, -72, +251, +171, +253, +162, +113, +163, +59, +131, +187, 94, -219, -16, -205, +251, +186, +255, +233, 166, -152, -184, -36, -75, -44, -185, -98, -79, -139, -23, -168, -75, -80, -153, -69, -35, +119, +101, +191, +110, +30, +0, +95, +161, +54, +150, +52, +187, +188, 57, -162, -178, -152, -128, -158, +207, +95, +39, +227, +229, +243, +48, +240, +60, +124, +189, +220, +52, +142, +49, +42, 120, -177, -75, -226, -90, -245, -71, -89, -12, -177, -32, -178, -15, -40, -216, 156, -132, -146, -78, -193, -134, -83, -184, -245, -70, -165, -201, -22, -243, -61, -77, -249, -131, -72, -14, -28, -251, 254, -239, -50, +101, +167, +115, 219, -95, -156, -12, -74, -0, -144, -198, -141, -39, -246, -106, -47, -155, -228, -226, -225, -150, -76, -159, -246, -197, -182, -119, -175, -113, -179, -210, -74, -165, -139, -15, -19, -148, -182, -220, -197, -40, -201, -14, +189, +254, +92, +22, +31, +231, +237, +107, +30, +195, +138, +174, 252, -67, -152, -63, -140, -246, -57, -125, -239, -49, -129, -173, -221, -33, -122, -10, -70, -53, -160, -118, -32, -200, -64, -19, 39, -88, -241, -24, -171, 17, -40, +53, +152, 215, 10, -221, -82, -221, -46, -204, -141, -98, -173, -91, -247, -101, -48, -73, -166, -118, -187, -243, -20, -244, -60, +139, +220, +235, +115, +239, +6, +174, +174, +21, 222, -58, -240, -229, -224, -26, -196, -48, -66, -180, -45, +184, +227, +69, +251, +234, +182, +115, +1, +183, +191, +151, +95, +175, +9, +190, +116, +207, +59, +236, 137, -109, +165, +25, +239, +6, +151, 157, -240, -181, -48, -129, -249, -130, -219, -240, -164, -168, -173, -76, +235, +207, +119, +95, +172, +192, +47, +142, +210, +191, +235, +126, +250, +116, +109, +91, +205, +179, +56, +6, +126, +178, +93, +11, +81, +64, +218, +192, +246, +197, +69, +25, 234, -206, -187, -107, +73, +125, 123, -32, -138, -105, -119, -243, -224, -230, -202, +157, +43, +216, +132, +139, +231, +96, +183, +207, +91, +183, +37, +231, +174, +78, +106, +247, +146, +82, +237, +82, +38, +193, +255, +94, +200, +104, +217, +163, 44, -192, -113, +128, +249, +133, +245, +228, 88, +70, +146, +138, +238, +30, +174, +196, +174, +74, +243, +216, +68, +9, +23, +235, +58, +213, 4, +73, +100, 94, -162, -214, -102, -173, -40, -63, -18, -26, -88, -130, -4, -221, -168, 39, -206, +192, +86, +239, +178, +135, +242, +31, +106, 17, -79, -191, -110, -108, -95, -113, -2, -114, -73, -169, -112, -40, -9, -85, -129, -247, -60, +218, 145, -101, -177, -78, -230, -128, -118, -177, -144, -235, -169, -86, -205, -225, -95, -79, +175, +49, +243, +219, +190, +151, +210, +96, +221, +130, 189, -106, -254, -216, -173, -167, +239, +74, +163, +5, +3, +234, +94, +77, +13, +84, +232, +35, +25, +210, +50, +186, +115, +174, +141, +253, +150, +57, +65, +63, 98, -53, -127, -231, +209, +115, 30, -142, +31, +51, +119, +186, +222, +24, +232, +23, +160, 0, +87, +75, +213, +19, 111, -249, -140, -249, -138, -165, -170, -14, -137, -89, -70, +179, +18, +162, +156, +174, 221, +38, 99, -200, -142, -187, -190, -5, -53, -101, -199, +232, +71, +85, +167, +202, +9, +132, +51, +140, +19, +44, +180, +37, +134, 197, -194, -91, -246, -108, -123, -3, +25, +189, +217, +220, +151, +136, +70, +42, +56, +89, +168, +88, +122, +38, +218, +190, +47, +242, +67, +49, +84, +106, 213, -203, -188, -45, -196, +2, +243, +107, +11, +47, +121, +62, 191, +104, +77, +184, 126, -245, -64, -207, -36, -54, -52, 127, -222, -108, -178, -47, -52, -37, -95, -41, -67, -69, -249, -148, -183, -237, -97, -156, -68, -14, -178, -112, -69, +241, +12, +182, +241, +199, 151, -98, -178, -73, -190, -193, -47, -93, -29, -146, -102, -236, -106, -75, -64, -229, -50, -222, -102, -163, -102, -185, -111, -201, -183, -86, -231, -130, -161, -246, -142, -24, -251, -33, -103, -74, -228, -132, -240, +243, +128, +213, +87, 223, +182, +129, +167, +171, +66, +65, +215, +15, +13, 188, -59, -202, -81, -248, -237, -103, -239, -46, -229, -48, -29, -22, -112, -28, -252, -85, -149, -73, -193, -223, -91, -244, -217, -121, +95, +141, +214, +97, +61, +162, +42, +170, +251, +41, +139, +218, 204, 62, -47, -176, -138, -20, -126, -27, -39, -114, -78, +213, +88, +231, +244, 67, -160, +35, +47, +85, +165, +226, +165, +77, +96, +171, +122, 37, -28, -62, -207, -157, -137, -228, +210, 38, -57, -207, -72, -28, -176, -63, -2, -200, -252, -15, -78, -116, -103, -37, +209, +85, +182, +192, +104, +115, +248, +170, +82, +55, +244, +46, 253, -224, -41, -189, -71, -11, -72, -99, -246, -97, -157, -29, -146, -176, -81, -198, -144, +162, +9, +92, +89, +135, +250, +173, +129, +83, +87, +114, 77, -29, -235, -6, -208, +215, +101, +199, +32, +131, +178, +24, +220, +204, +224, +32, +153, +187, +213, +214, +127, 18, -134, +247, +87, +178, +244, +56, +202, +140, +30, +81, 153, -103, -28, -144, -91, -2, -69, -186, -98, -78, -105, +208, +253, +150, +228, +220, +72, +48, +182, +238, +242, +232, +80, +85, +39, +203, 20, -193, -217, -105, +212, +124, +33, +75, +59, +218, +98, +111, +63, +96, +121, +204, +189, +215, +190, +60, +250, +51, +120, +228, +181, +44, +127, +232, 18, -60, -62, +149, +63, +108, 153, -229, -193, -195, -67, -220, -32, -124, -56, -252, -28, -238, -75, +200, +131, +150, +128, +60, +218, +43, +215, +68, +237, +198, +38, +106, +48, +54, +84, +86, +177, +76, +81, +197, +134, +213, +136, +38, +133, +17, +95, +112, +89, +196, +26, 139, +34, +214, +172, +235, +170, +92, 74, -142, -192, -7, -188, -189, -191, +208, +86, +100, +90, +45, +37, +104, +216, +255, +216, +75, +9, +190, +148, +130, +109, +59, +212, +0, +91, +209, +254, +3, +87, +108, +107, +152, 180, -210, +85, +46, +151, +86, +243, +141, +127, +173, +108, +182, +227, +190, +188, +86, +54, +179, +92, +198, +107, +101, +179, +181, +57, +95, +43, +155, +61, +163, +242, +171, +136, +137, +90, +54, +231, +181, +178, +89, +14, +33, +175, +149, +205, +74, +84, +54, +123, +173, +107, +246, +90, +215, +172, +58, 239, -241, -99, +244, +90, +215, +172, +174, +29, +122, +173, +107, +118, +108, +117, +205, +82, 89, -231, -17, -202, -35, -238, -52, -234, -64, +179, 129, +200, 195, +215, +170, +102, +27, +17, +241, +178, 171, -116, -206, -0, +154, +53, +231, +163, +240, +90, +214, +236, +71, +61, +250, +21, +210, +77, 63, +235, +131, +242, +226, +17, +243, +90, +215, +236, +181, +174, +89, 125, -98, +11, +60, +166, +203, +85, +7, +201, 248, -225, -207, -26, -160, -71, -129, -160, -153, -59, -164, -214, -64, -99, -195, -33, -153, -207, -89, -2, -249, -5, -255, +161, +55, +172, +126, +143, +188, +3, 243, -86, -156, -224, -196, +195, 175, -153, +149, +205, +94, +18, +111, +242, +90, +217, +236, +57, 20, -151, -129, -59, -10, -23, -240, -124, -185, -12, -186, -177, -226, 189, -33, -101, -42, -145, -200, -157, -117, -38, -24, -201, -13, -178, -149, -113, -70, -14, -143, -3, -24, +86, +54, +123, +173, +108, +246, +90, +217, +108, +239, +202, 162, -139, -6, -57, -176, -145, -126, -148, -243, -167, -42, -208, -198, -22, -190, +215, +202, +102, +47, +188, +178, +89, 198, -51, -60, -103, +159, 236, -117, -196, 71, -15, +195, +244, +90, +216, +236, +121, +140, +188, +236, +194, +102, +205, +169, +154, +94, +43, +155, +189, +86, +54, +171, +73, +184, +122, +41, +136, +121, +45, +109, +182, +167, +171, +248, +90, 163, -38, -18, -14, -137, -226, -68, +234, +69, +81, +206, +215, +26, +85, +175, +53, +170, +94, 107, -49, -8, -192, -177, -181, -254, -38, -214, -132, -116, -231, -122, -152, -30, -54, -142, -92, -38, -155, -59, -205, -61, -212, +84, +173, +239, +234, +107, +141, 170, -12, +230, 106, -137, 84, -50, -81, -199, -160, -145, -77, -148, -83, -231, -196, -171, -226, -123, -199, -228, -115, -103, -208, -2, -180, +53, +204, +216, +190, +22, +169, +90, +227, +8, +95, +139, +84, +53, +85, +164, 202, -91, +54, +54, +100, +99, +145, +170, +250, +67, +242, +143, 174, -236, -150, -146, -210, -208, -83, -113, -163, -8, -168, +72, +85, +67, +75, +124, +45, 82, -131, -167, -161, -68, -49, -49, +245, +3, +173, +243, +181, 72, -58, -99, -176, -19, -44, -147, -41, -251, -158, -113, -28, -9, -241, -136, -156, +213, +75, +149, +32, +94, +139, +84, +189, +96, +49, +225, +181, +72, +213, +34, +150, 209, -131, -91, -178, -15, -151, -245, 106, -243, -228, -182, -161, +72, +85, +166, +193, +191, +254, +122, +121, +89, 59, -138, -11, -54, -32, -186, -173, -212, -7, -63, -65, -215, -204, -161, -228, -40, -132, -40, +246, +95, +43, 23, -146, +252, +95, +251, +202, 5, -172, -51, -70, -145, -241, -96, -168, -26, +183, +151, +237, +82, +165, +11, +122, +109, +187, +252, +210, +170, +224, 193, -212, -239, -94, -192, -57, -8, +237, +151, +78, +207, +46, 29, -235, -48, -211, +58, +119, +252, 120, -3, -217, -222, -105, -185, -141, -38, -191, -52, -158, -61, -71, -62, -206, -173, -54, -38, -141, -18, -104, -214, -82, -152, -129, -132, -16, -30, -242, -137, -195, -64, -168, -221, -104, +99, +151, +86, +123, +115, 193, -19, -82, -183, -252, -184, 2, -201, -34, -40, -194, +139, 82, -191, -175, 7, -227, 155, -197, -182, -157, -113, +11, +22, +88, +85, +60, +216, +88, +176, 192, -37, -111, -232, -83, -249, +188, +228, +193, +151, +78, +247, +243, +151, +187, +171, +118, +150, +254, 250, -249, -178, -241, -252, -91, -223, -168, -212, -173, -99, -5, -248, -34, +181, 216, -54, -211, -206, -48, +193, +107, +177, +131, +215, +98, +7, +175, +197, +14, +94, +139, +29, +188, +22, +59, 200, -18, -238, -116, -75, -61, -157, -84, -192, -24, -8, -62, -143, -216, -104, -204, -112, -207, -121, -96, -39, -23, -123, -157, -12, -116, -21, +93, 195, -101, -34, -57, -212, +227, 202, +184, +255, +76, +190, +253, +151, +151, +109, +191, +222, 92, -132, -47, -244, -162, +251, 60, -243, -14, -86, -113, -198, -47, -227, -83, -113, -61, -167, -16, -86, -245, -48, -204, -228, -12, -64, -130, -135, -194, +6, +166, +181, +118, +4, +25, +24, 65, -154, -57, -114, -168, -94, -161, -195, -133, -11, -73, -252, +206, +129, 161, -223, -109, -165, -106, -43, -197, -207, -33, -179, -104, -196, -228, -198, +97, +76, +177, +82, +145, +192, 52, -64, -221, -208, +209, +245, +107, +98, +254, +109, +188, +245, +107, +98, +254, +210, +75, +121, +77, +204, +255, +18, +19, +243, +123, +193, +127, +98, +105, 192, +98, +166, +248, +244, +43, +67, +10, +5, +163, +8, +234, +67, +201, +241, +223, +95, +8, +34, +128, +230, +121, +247, +87, +187, +247, +188, 137, -71, -222, -22, -165, -246, -246, +231, +138, +143, +156, +188, +95, +116, +19, +49, +247, +130, +88, +188, +87, +233, 252, -58, -53, -206, +197, +73, +68, 191, -72, -198, -127, -222, +67, +91, +54, +163, +189, +21, +73, +8, +123, +8, +208, +183, +240, +75, +160, +146, +94, +48, +241, +37, +165, 227, -244, -243, -69, -60, -29, -12, -157, -209, +135, +159, +224, +139, +177, 247, -221, -164, +36, +93, +49, 15, -79, -78, -147, -59, -17, +99, +15, +167, +68, +202, 73, +190, +182, +13, +38, +225, +247, +157, +160, +64, +225, +63, +46, +60, +63, +57, +237, +6, +226, +110, +137, +30, +34, +91, +49, +137, +253, +16, +190, +169, +140, +99, +207, +9, +16, +35, 51, +99, +60, +82, 231, -158, -134, -15, -132, -145, -199, 72, -165, -20, -115, -77, -35, -178, -128, -198, -166, -149, -174, -41, +206, +225, +48, +195, +73, +138, 97, -179, -209, -188, +225, +156, +128, +213, +251, +13, +87, +79, +191, +74, +56, +211, +216, +252, +76, +124, +116, +224, +233, +112, +124, +127, +217, +18, +111, +116, +158, 86, -115, +47, +22, +128, +70, +213, +11, +95, +28, +252, +196, +29, +79, +156, +214, +176, +53, +202, +13, 248, -171, -73, -241, -186, -60, -35, +182, +37, +156, +192, +21, 111, 220, -242, -174, -208, -13, -184, -250, -89, -70, 180, -54, -206, -158, -53, -20, -43, -106, +155, 235, -224, +177, +39, 6, -27, -149, -175, -197, -190, -21, -43, -148, -147, -96, -176, -183, -98, -235, -41, -92, -123, -245, -231, -221, -224, -110, -135, -178, -26, -122, -31, -29, -112, -159, +215, 56, -222, -10, -225, -144, -198, -209, -118, -219, -19, +192, +111, +66, +220, +169, +0, +247, +32, 55, -214, -4, -136, -93, -144, -124, -253, -212, -49, -133, -5, -61, -179, -244, -185, +16, +126, +65, +173, +35, +54, +243, +227, 60, -228, -97, -41, -2, -164, -107, -138, -30, -206, -29, +26, +130, +183, +103, +226, +205, +13, 189, -28, -209, -174, -20, -185, 246, -66, -181, -159, -13, -213, -110, -198, -7, -183, -20, -213, -174, -219, +176, +145, 111, -251, -133, -106, -255, -192, -84, -187, -238, +218, 195, -82, -157, -106, -31, -212, -135, -28, -168, -246, -241, -213, +144, +20, +29, 105, -94, -241, -245, -220, -78, -156, -84, -187, +95, +152, +8, +81, +143, +217, 6, -13, -29, -147, -28, -56, -251, -51, -241, -215, -177, -163, -197, -135, -56, -253, -202, -112, -87, -97, -20, -140, -249, -230, -116, -66, -32, -253, -135, -139, -104, -196, 97, -244, -243, -233, -50, -246, -70, -22, +69, +248, +61, 254, -42, -187, -6, -18, -109, -129, -121, -138, -188, -152, -178, -201, -32, -250, -124, -42, -83, -164, -47, -149, -24, -134, -238, -178, -5, -191, +93, +4, +52, +9, +31, +157, +200, +141, +197, +35, +156, 7, -137, +153, +95, +14, 116, -40, -51, -77, -18, +158, +227, 41, +131, +195, +241, +252, +198, +175, +144, +135, +145, +196, +28, +92, +155, +221, +239, +155, +73, +223, +173, +17, +57, +192, +252, +103, +181, +216, +196, 231, -98, -149, -160, -82, -170, +249, +250, +159, +205, +230, +65, +95, +14, +212, 100, -31, -236, -110, -255, -224, -36, -83, -242, -220, -199, -114, -142, +251, +195, +215, +212, +137, +159, +155, +212, +90, 225, -98, -52, -229, -124, -63, -63, -197, -148, -253, -74, -6, +107, +142, +173, +237, +26, +241, +121, +236, +249, +168, +147, +206, +109, +88, 46, -81, -13, -21, -78, -157, -214, -31, -29, -47, -184, -22, -245, -104, -52, -117, -208, -103, -7, -118, 217, -58, -172, -245, -229, -220, -86, -57, -183, -48, +216, +217, +207, +240, 127, -105, -61, -44, -244, +239, +204, +118, +160, +71, +32, +195, 21, -212, -89, -24, -159, -203, -180, -203, -169, -234, -25, -142, -87, -157, -164, -216, -72, +139, +22, +112, +3, +224, +174, +204, +233, +198, +121, 116, -42, -206, -176, -148, +15, +242, 23, -90, -235, -84, -162, -88, -110, -119, -80, -77, -173, -117, -64, -66, -195, -154, -57, -11, -93, -101, -243, -166, -255, -255, -54, -218, -202, -61, -120, -81, -236, -83, -95, -153, -81, +107, +184, +132, +27, +255, 128, -231, -166, -176, -4, -70, -238, -221, +172, 225, -125, -122, -71, -190, -183, -37, -64, +204, +11, +188, +217, +2, +238, +32, +80, 130, -1, -180, -161, -23, -169, -211, -127, -161, -107, -109, -231, -74, -6, -35, -63, -140, -115, -22, -120, -35, 105, -234, -96, -208, -62, -206, +232, +187, +111, +207, +44, +49, +154, +165, 157, +251, 96, -139, -179, -180, -61, -106, -81, -190, -109, -94, -148, -198, -132, -174, -213, -194, +189, 145, -108, -38, -140, -194, -135, -218, -78, -158, -65, -204, -69, -5, -80, -167, -78, -12, -98, -218, -19, +219, +85, +212, +26, +27, +76, +29, +237, +16, +58, +50, 232, +188, +11, +115, +201, +20, 105, +128, +34, +177, +106, +129, 64, -148, -199, -57, -149, -172, -90, -203, -113, +40, +188, +100, +202, 223, -139, -62, +198, +226, +141, +243, 134, -34, -147, -98, -24, -252, -153, -92, -210, +169, +218, +240, +205, 153, -140, -38, -91, -222, -170, -163, -35, -127, -234, -193, -216, -157, -42, -119, +184, +155, +34, 53, -79, -174, -37, -131, -176, -143, -100, -11, -134, -107, -57, -84, -20, -214, -131, -231, -154, -200, -90, -91, +69, +190, +0, +203, +188, +164, +61, +128, +126, +241, +48, 35, -177, -166, -18, -211, -64, -213, -75, -146, -204, -130, 160, -182, -236, -254, -246, -136, -165, -109, -187, -189, -189, -135, -12, -220, -29, +65, +240, +225, +77, +244, +166, +52, +122, +227, +66, +38, +197, +202, +24, +174, +158, +113, +17, +168, +114, +41, +50, +177, +138, +106, +88, +22, +147, +106, +194, 29, -42, -5, -58, -193, -144, -78, -48, +16, +232, +244, 241, -101, -29, -10, -9, -61, -150, -160, -158, -36, -112, -97, -82, -58, -75, +197, +227, +139, +40, +206, +232, +191, +162, +207, +244, +146, +100, +219, +146, 109, -196, -211, -163, -8, -118, -81, -210, -57, -148, -115, -106, -1, -204, -142, -68, -78, +22, +176, +0, +99, +26, +184, +69, +167, +157, +183, +164, +206, +61, +136, +229, +4, +87, +86, +227, +73, 151, -98, -24, -62, -190, -161, -252, -107, -208, -47, +240, +236, +85, 36, -117, -171, -189, -162, -64, -62, +32, +129, +91, +203, +70, +168, +181, +241, +155, +156, +109, +66, +140, 38, -50, -72, -12, -220, -15, -211, -134, -37, -174, -176, -78, -247, -56, -117, -252, +150, +48, +255, +197, +112, +191, +216, +87, +20, +155, +18, 177, -80, -3, -181, -242, -126, -149, -116, -51, -200, -153, +236, +157, +108, +27, 146, -207, -56, -71, -239, -230, -17, -144, -60, -120, -35, -185, -54, -72, -25, -119, -249, -116, -33, -181, +88, +204, +244, +158, +192, +18, +29, +228, +67, +50, +74, 107, -70, -115, -161, -10, -251, -95, -105, +187, +214, +140, +103, +218, +146, +35, +42, +79, +209, +158, +123, +18, 53, -161, -129, +152, +14, +92, +173, +249, 178, -77, -142, -10, -186, -87, -165, 192, -47, -89, -171, -34, -117, -27, -142, -228, -152, -202, -208, -144, -75, +246, 180, -209, -205, +114, +156, +153, +45, +124, +243, +40, +100, +1, +174, +174, +227, +95, +195, +70, +16, +243, +8, 48, -24, -73, -244, -180, -250, -142, -29, -112, +78, +194, +0, +72, 131, -37, -231, -206, -7, +130, +80, +49, +139, +52, +60, +239, +81, +64, +236, +61, +127, +161, +248, +202, +82, +91, 164, -250, -115, 248, -71, +245, +157, +166, +183, 221, -6, -189, -26, -194, -48, -118, +254, +145, +91, +47, +244, +208, +190, +239, +251, +181, +199, +207, +188, +111, +106, 82, -203, -140, -197, +117, 119, -41, -231, -92, -36, -6, -227, -154, -97, -95, +247, +173, +192, +122, +25, 34, -253, -155, -224, -57, +238, +225, +93, +53, +106, +248, +240, +190, +84, +255, +204, +195, +239, +67, +211, +204, +175, +33, 34, -172, -7, -145, -150, -90, -32, -149, -75, -36, -125, -73, -129, -114, -228, -38, -24, -132, -58, -191, 180, +164, +85, +233, +141, +174, +119, 71, -90, -59, -171, -155, -231, -161, -63, -43, +11, +114, +238, 76, +206, +134, +240, +6, +168, +245, +225, +223, +59, +1, +199, +254, +216, +112, +189, +207, +211, +26, +160, +219, +219, +46, +45, +218, +254, +102, +209, +118, +29, +89, 185, -55, 182, -47, -202, -118, -120, -139, -191, -104, -55, -192, -114, -238, -105, -121, -148, -109, -104, -57, +250, +207, +210, +34, +126, +159, 21, -95, -168, -13, +69, +153, +234, +68, +125, +113, +160, +108, +189, +232, +91, +109, +118, +14, +85, +51, +107, +150, +218, +82, 28, 84, -66, -138, -55, -22, -203, -112, -161, -117, -165, +211, +152, +41, +210, +140, 223, -131, -240, -1, -208, -227, -36, -244, -37, -98, -206, -13, -75, -184, -135, -47, -130, -117, -120, -75, +193, +198, +180, 97, -232, -92, -30, -112, -81, -181, -220, -200, -143, -152, -5, -173, -74, -228, -103, -58, -18, -106, -0, -103, -252, -206, +225, 124, -250, -210, -53, -127, -166, -54, -119, -95, -75, -1, -26, +49, +47, +150, +76, +12, +146, 8, -57, -155, +35, +218, +173, +10, +83, +162, +83, +25, +22, +153, +163, +191, +160, +59, +169, +181, +230, +56, +118, +172, +56, +95, +199, +15, 39, -75, -29, -33, -208, -2, -194, -53, -146, -115, -202, -185, -131, -201, +230, +234, +177, 112, -194, -71, -21, -158, -165, -211, +254, +117, +78, +5, +41, +185, +12, +229, 55, -79, -61, +5, +213, +189, +88, +196, +168, +5, +9, +5, +200, 120, -250, +143, +122, 84, -66, -81, -64, -42, -58, -195, -179, -106, -28, -89, -135, -61, -165, -5, -237, -201, -73, -231, -177, -144, -16, -52, -59, -118, -135, +154, +129, +39, +67, +213, +217, +239, 177, -57, -141, +91, +188, +24, +62, 194, -217, -220, -243, -237, -244, -92, -79, -68, -138, +1, +128, +70, +248, +227, +44, +116, +225, +73, +5, +97, +81, +137, +163, +226, +36, +150, +185, +81, +223, +82, +35, +16, +169, +197, +84, +250, +115, +216, +50, +2, +127, +180, +136, +19, +98, +32, +97, 96, +49, +148, +83, +231, 193, -201, -180, -140, -124, -67, -41, +11, +35, 43, -199, -94, -96, -236, -67, -96, -187, -2, -174, -106, -187, -27, -252, -237, -82, -71, -226, -68, -73, -94, -171, -169, +53, 10, -49, -36, -56, -137, +117, 29, -247, -158, -99, -80, -139, -3, -189, +176, +50, +197, +196, +145, +48, +6, +86, +166, +72, +110, +222, +231, +36, +104, +245, +205, +201, +207, +173, +159, +13, +163, 121, +105, +115, +97, +173, +136, +43, +228, +19, +244, +230, +0, 219, -144, -3, -194, -28, +192, +24, +65, +85, +219, +91, +205, +69, 48, -100, -30, -208, -199, -248, -49, -174, -221, -209, -28, -229, -154, -133, -137, -188, -141, 156, -32, -198, -68, -35, +154, +197, +130, +145, +164, +12, +90, +194, +73, +248, 199, -230, +69, +132, +16, +35, 132, +172, +113, +76, +72, +233, +248, +155, +20, +24, +187, +18, +129, +244, +13, +251, +2, +8, +230, +53, +88, +179, +99, +5, +68, +13, +200, 19, -17, -120, -131, +204, 192, -40, -17, -41, -92, -160, -84, -94, -67, -208, -111, -240, -115, -19, -123, -93, -128, -202, +65, +137, +155, +109, +81, +55, +252, +251, +31, +247, +135, +164, +24, +181, +138, +200, +53, +35, +86, +8, +44, 108, -187, -87, -225, -57, -204, -94, -3, -194, -162, -91, +65, +232, +41, +180, +172, +136, +151, +25, +42, 64, -133, -76, -110, +126, +51, +32, +117, +105, +195, +250, +206, +146, +45, +212, +91, +139, +118, +152, 225, -170, -46, -162, -194, +219, +22, 83, -149, -126, -181, -167, -237, -174, -182, 20, -102, -40, -171, -189, -6, -171, -172, -171, -239, -167, +74, 134, -102, -11, -193, -80, -177, +249, +243, +99, +35, +135, +178, +61, +120, +111, +130, +184, +151, +3, +104, +127, +69, +224, +10, +175, +65, +236, +77, +64, +152, +96, +210, +196, +127, +107, 182, -30, -167, +126, +24, +46, +176, +108, +234, +0, +247, +225, +205, +230, +89, +238, +80, +32, 86, -26, +189, +224, +47, +137, 110, +168, +112, +200, 31, -147, -142, -66, -156, -113, -195, -92, -197, -106, -30, +167, +50, +32, +9, +4, +247, +17, +105, +52, +14, +133, +52, 121, -51, +40, +137, +44, +7, +103, +226, +36, +28, 39, -242, -128, -115, -193, -34, -209, -218, -82, +208, 136, -86, -100, -172, -203, -179, -84, -165, -188, -138, +136, +53, +236, +235, +55, +218, +243, +43, +25, 44, -16, -151, -166, -28, -71, +238, +153, +178, +98, +228, +40, +42, +73, +112, +255, +125, +47, +38, +75, +111, +72, +19, +51, +49, +167, +244, +47, +92, +104, +56, +144, +143, +34, +12, +164, +112, +70, +163, +48, 114, -43, -123, -155, -245, -165, -124, +169, +83, +168, +41, +18, +145, +36, +60, +63, +242, +41, +217, +122, +98, +120, +1, +132, +152, +12, +27, +207, +59, +252, +93, +223, +220, +117, +63, 117, +207, +201, +249, +105, +112, +123, +211, +191, +131, +255, +220, 126, -232, -184, -84, +205, +28, +14, +254, +188, 193, -11, -166, -9, -153, -61, +107, +192, +244, +173, +189, 160, -188, -245, -241, -119, -46, -153, -53, -94, -68, -196, -144, -227, -19, -4, +55, +171, +96, +243, +231, +235, +82, +174, +16, +52, +223, +38, +30, +52, +62, +176, +39, +128, +222, +228, +242, +139, +75, +135, +64, +195, +10, +48, +82, +75, 124, -1, -217, -200, -177, +202, +87, +14, +136, +5, 15, -231, +161, +198, +82, 182, -211, -240, -83, -208, -93, -148, +26, +184, +98, +104, +253, +17, +234, +213, +135, +239, +128, +92, +63, +51, +15, +42, +67, +151, +194, 137, -77, -148, -219, -62, -131, -237, -132, -120, -0, -100, -203, -0, +36, +29, +117, +223, +137, +232, +13, +128, +27, +58, +116, +128, +67, 8, -98, +35, +125, +242, +4, +144, +139, +69, +108, +197, +24, +96, +228, +136, +7, +221, +7, +94, +34, +77, +138, +149, +194, 44, -156, -56, -225, +240, +254, +150, +241, +84, +78, +37, +40, +223, +25, 202, +84, +150, +177, +113, +84, +206, +162, +135, +10, +49, +206, +217, +91, +114, +186, +69, +169, +191, 85, -148, -208, -253, -174, -165, -170, -41, -167, -22, -251, -77, +60, +135, 171, +156, +129, 82, -21, -193, -60, -149, -163, -213, -205, -64, -197, -204, -228, +170, 36, -60, -16, -159, -129, -159, -96, -43, -128, -93, -121, -157, -71, -169, -234, -30, -59, -247, -208, +73, +219, +117, 21, -165, -49, -228, -33, 105, -213, -60, -6, -214, -164, -4, -230, -133, -74, -213, +64, 4, -8, +178, +58, 155, -202, -153, -196, -50, -72, -75, -196, -11, -0, -144, -82, -160, -51, -204, -28, -84, -201, -109, -52, +182, +66, +47, +19, +137, +8, 34, -172, -197, +88, +104, +220, +157, +137, 118, -166, -76, -54, -244, -203, -230, -245, -79, -235, -90, -57, -89, -222, -175, -20, -84, -214, -76, -100, -58, -9, -21, -62, -170, -243, -195, -99, -37, +32, +60, +160, +44, 78, -58, -65, -128, -48, -152, -240, -103, -220, -116, -74, -57, 128, -91, -17, -79, -195, -133, -239, -6, -28, -124, -76, -245, -122, -84, -156, +27, +140, +42, 22, -101, -75, -212, -130, +127, +137, +20, +107, 30, -230, -46, -44, -151, -126, -192, -220, -199, -192, -60, -76, -166, -144, -128, -224, -217, -224, -3, +133, 15, -73, +158, +43, +93, 224, -52, -153, -213, -92, +116, +98, +241, +40, +125, 31, -18, -236, -191, -138, -148, -184, -69, -5, -152, +255, +197, +58, 232, -39, -20, -170, -190, -83, -69, -44, -55, -148, -113, -186, -86, -42, -27, -199, -9, -44, -23, -84, -24, -17, -46, -221, -149, -106, -79, -149, +8, +164, +132, +183, +28, 120, -244, -116, -208, -76, -101, -125, -103, -233, -172, -204, +62, +84, +7, +6, +33, +118, +71, +29, +96, +218, +1, 201, -224, -53, -54, -120, -50, -158, -3, -18, -34, -207, -152, -79, -199, -36, -73, +210, +163, +7, +61, +96, +24, +78, +88, +229, +102, 118, -8, -128, -30, -171, -235, -23, -39, -68, -233, +64, +90, +180, +237, +43, +70, +231, +194, +232, +72, 148, -92, -8, -13, -96, -113, -151, -136, -145, -20, -65, -226, +222, +206, +45, +33, +235, +246, +219, +249, +126, +127, +219, +249, +130, +54, +15, +47, +245, +104, +42, +71, +223, +95, +175, +118, +213, +179, +64, +104, 68, +54, +237, +216, +47, +185, +184, +14, 19, -199, -111, -138, -87, -192, -12, -63, -151, -50, +201, +207, +73, +17, +230, +88, +252, +3, +100, +72, +253, +198, +160, +14, +27, +127, 158, -194, -191, -50, -25, -189, -166, +57, +209, 247, -102, -234, +150, +24, +2, +207, +228, +134, +193, +27, +103, +30, +198, +127, 77, -166, -194, +64, +248, +124, +0, +30, +39, +0, +104, +201, +107, +2, +94, +26, +106, +139, +252, +142, +22, +61, +89, +146, +197, +1, +17, +20, +252, +85, +186, +63, +45, +2, +245, 151, -247, -88, -52, -81, -165, -49, +152, +57, +193, +2, +215, +91, +230, +216, +218, +156, +216, +31, +148, 242, +236, +58, +109, +175, +103, +171, +228, +217, +138, +23, +67, +100, +144, +246, +118, +186, +212, +124, +229, +67, +227, +109, +143, +103, +197, +24, 40, -211, -234, -56, -55, -82, -12, -23, -141, -43, -23, -98, -177, -224, -232, -30, -75, -55, -146, -6, -7, -49, -185, -8, -184, -66, -192, -234, -115, -19, -70, -222, 196, -67, -141, -0, +203, 0, -87, -230, -130, -121, -51, -172, +79, 218, -50, -128, -239, -29, -124, -106, -13, -18, -34, -164, -45, -27, -141, -13, -158, -108, -130, -237, -128, 110, -187, -238, -98, -238, -83, -173, -206, -205, -114, -237, -246, -57, -205, -131, -225, -51, -113, -108, -12, -252, -137, -172, +228, +148, +73, +241, +245, +46, +255, +210, +148, +73, +221, 217, -48, -178, +151, +172, +1, +162, +203, +160, +180, +25, +116, +69, +28, 53, -70, -250, -233, -48, -227, -198, -226, -132, -213, -177, -239, -210, -30, -95, -166, +135, +32, +184, +202, +8, +236, +180, +116, +164, +224, +13, +47, +157, +167, +216, +253, +194, +110, 91, -124, -68, -138, -12, -178, -45, -208, -243, -119, -20, -117, -53, -38, -57, -112, -234, -126, -6, +58, +61, +50, +13, 44, +61, +71, +34, +26, +198, 192, -160, -146, -231, -74, +26, +165, +180, +90, +127, +14, 206, -168, -139, -121, -219, -170, -251, +231, +208, +32, +218, +89, +187, 152, -185, -127, -220, -3, -86, -121, -57, -53, -241, -94, -7, -13, -239, -230, -133, -16, -214, -158, -235, -58, -84, -249, -122, -211, -35, -182, -63, -172, -146, -60, -118, -216, +4, +167, +120, +46, +71, +32, 154, -16, -33, -181, -219, -141, -148, -239, -114, -89, -233, -218, -21, -60, -33, -155, -168, -168, -51, -201, -45, -102, -43, -66, -171, +130, +164, +52, +27, +122, +129, +195, +2, +62, +140, +240, +93, 46, -175, -22, -248, -158, -159, -238, -82, -189, -171, -104, -20, -226, +99, +38, 106, -180, -23, -168, +20, +217, 231, -136, -170, -61, +36, +50, +29, +20, 173, -185, +186, +64, +111, +18, +212, +178, +61, +78, +189, +209, +52, +83, +16, +129, +196, +187, +24, +161, +78, +161, +52, +194, 225, -50, -195, +91, +199, +172, +70, +94, 37, -15, 108, -170, -20, -122, -106, -8, -22, +103, +211, +52, +151, +95, +35, +93, +147, +162, +209, +77, +31, +160, +92, +238, +77, +115, +117, +153, +62, 64, -89, -221, -128, -130, -3, -99, -142, +4, +35, 101, -72, -221, -150, -155, -178, +228, 32, -170, -170, -28, -144, -221, +255, +213, +69, +220, +196, +109, +130, +167, +80, +229, +78, +106, +20, +19, +217, +52, +13, +42, +15, +211, 69, +165, +175, 89, -64, -213, -200, +163, +107, +90, +121, +51, +27, +202, +236, +156, +209, +61, +244, +63, +194, +172, +67, +205, +19, +190, +61, 40, +122, +243, +203, +74, +121, +180, +31, +104, +89, +38, +217, +243, +170, +61, +207, +246, +201, +243, +210, +151, +217, +173, +145, +146, +76, +138, +220, +152, +153, +202, +190, +120, +87, +26, +139, +134, +232, +169, +57, +235, +103, +196, +38, +69, +70, +236, +168, +34, +90, +114, +171, +174, +153, +7, 155, -82, -101, +172, +179, 4, -199, -247, -177, -22, +246, +25, +170, +246, +16, +164, +179, +206, +39, +30, +79, +132, +78, +110, +119, +94, +58, +135, +56, +89, +123, +111, +143, +234, +246, +219, 153, -214, -217, -80, -46, -104, -98, -195, -177, -136, +29, +121, +33, +217, +3, +219, +80, +142, +152, +61, +45, +36, 247, -194, -119, +164, +254, 0, -19, -203, -140, -191, -46, -228, +11, +105, +48, +181, +103, +197, +43, +220, +36, +143, +174, +81, 144, -210, -110, -10, -202, -212, +241, +206, +71, +132, 131, -179, -208, +50, +100, +162, +185, +196, +187, +85, +159, +201, +70, 24, -152, -79, -234, -231, -172, -174, -153, -157, -167, -2, -235, -72, -87, -200, -90, -73, -190, -53, -39, -180, +34, +26, +163, +185, +21, +91, +47, +248, +19, +140, +65, +42, +203, 40, -37, -86, -78, -96, -81, -214, -63, -254, -1, -228, -149, -107, -84, -211, -60, -120, -177, -108, +183, +114, +90, +103, +126, +241, +202, +43, +141, +253, +8, +38, +222, +131, +68, +5, +110, +105, +28, +52, +17, +12, +158, +127, +65, 41, -180, +13, +28, 194, -81, -89, -248, +79, +218, +221, +82, +154, 214, 53, -131, -231, -161, -239, -87, -242, -93, -190, -9, -57, +153, +106, +179, +186, 59, -149, -222, +109, +39, +134, +50, +121, +148, +136, +22, +154, +82, +244, +245, +15, +240, +54, +251, +113, +40, +194, +209, +104, +49, +95, 162, -177, -184, -254, -207, +50, +187, +148, +65, +76, +165, +14, +52, +83, 252, +54, +124, +115, +201, +229, +100, +43, 94, -183, -120, +206, +241, +87, +118, +165, 39, -102, -210, +127, +10, +100, 1, -8, -113, -54, -150, -117, -114, -242, -37, -86, -144, -71, -133, -216, -4, 118, -138, -6, -232, -244, -122, -131, +174, +214, +204, +209, +134, 206, -245, -199, -213, -81, -228, -44, -157, -7, -186, -99, -61, -186, -192, -139, +14, +134, 167, -74, -149, -86, -16, -239, -148, -98, -44, -95, -240, 2, -39, -161, +87, +242, +102, +7, +14, +144, +170, +88, +162, +128, 124, -172, -249, -13, -187, +116, +36, +29, +237, +85, +15, +29, +222, +86, +182, +56, +208, +244, +232, 179, +224, +97, +140, +108, +142, +89, +67, +255, +29, 197, -214, -131, -227, -217, -101, -133, -169, -250, -70, -37, -22, -121, -43, -13, +96, +185, +28, +254, +181, +66, 65, -88, -57, -101, -130, -230, -224, -194, -232, -73, -136, -85, -95, -157, -25, -62, -137, -40, -196, -210, -79, -169, -158, -241, -159, -11, 160, -51, -186, -190, -237, -183, -20, -60, -126, -65, -239, -202, -174, -174, -145, -7, -56, -183, -198, -45, -107, -58, -193, -3, -65, +1, +159, +96, 116, +229, +193, +195, +41, 228, -27, -30, -202, -59, -241, -154, -242, -250, -114, -94, -53, -180, -117, -250, -50, -145, -254, -82, -107, -134, -233, -40, -166, -26, -209, -230, -233, -252, -58, +147, +23, +39, 113, -183, -116, -122, -41, -73, -205, -55, -83, -112, -202, -164, -28, -99, +75, +72, +63, +150, +187, +173, +165, +187, +221, +111, +76, 93, -138, -145, -166, -230, +75, +110, +157, +0, +117, +152, +181, +58, 206, -104, -36, -99, -85, 208, -60, -22, -223, -138, -112, -223, -157, -138, -79, -231, -125, -26, -150, -110, -42, -116, -6, -161, -159, -182, -215, -37, -140, -158, +152, +7, +247, +155, +137, +18, +167, +176, +176, +95, 188, -78, -85, -31, -45, -85, -121, -222, -138, -234, -226, 24, -131, -220, -251, -176, +168, +76, +87, +101, +121, +183, +240, +158, +193, +129, +82, +3, +147, +120, +240, +162, +100, +129, +65, 205, -163, -117, -219, -163, -105, -195, -24, -87, -150, -118, -176, -235, -96, -154, 115, +137, +68, +48, 70, -86, -163, -100, -138, -129, -255, -245, 207, -69, -152, +169, +40, +12, +103, +22, +46, +52, +187, +7, 252, -149, -255, -107, -198, +214, +131, +17, +53, +168, +247, +192, +154, +195, +16, +45, +1, +196, +99, +4, +139, +139, +156, +152, +12, +102, +126, +24, +126, +87, +158, +164, +179, +92, +168, 244, -224, -58, -200, +34, +193, +120, +206, +188, +141, +107, +174, +102, +68, +209, +192, 129, -65, -91, -100, +249, +98, +111, +232, +249, +94, 178, -37, -250, -203, -150, -162, -134, -234, -177, -213, -59, -102, -240, -114, -90, -23, -246, +36, +167, +156, +153, +247, +27, +9, 8, -157, -173, +32, +1, +143, +166, +129, +247, +79, +140, +207, +194, +71, +0, +27, +123, +24, +83, +39, 30, -255, -234, +157, +37, +156, +86, +159, +12, +105, +202, 77, -252, -209, -80, -205, -1, -109, -97, -160, -34, -48, -169, +108, 2, -173, +96, +164, +78, +152, +248, +55, 34, -144, +93, +156, +56, +24, +77, +74, +225, +93, +236, +226, 19, -192, -126, -64, -44, -70, +132, +9, +187, +171, 225, -53, -66, +217, 72, -52, -218, -75, -105, -71, -229, -40, -156, -4, -24, -65, -199, -30, -130, -24, -239, -25, -15, -96, -154, -1, -142, -252, -84, -174, -173, -173, -108, -235, -118, -183, -6, -26, -209, -158, +224, +122, +16, +36, +56, +219, +219, +51, +241, 9, -207, +190, +155, +133, +52, +11, +58, +39, +50, +16, +240, 63, +116, +97, +36, +132, 42, -94, -156, -176, -6, -84, -131, -45, -50, -176, -217, -80, -88, -196, -77, -25, +15, +100, +134, 253, -166, -51, +49, 68, -21, -98, +27, +28, +57, 24, -12, -102, -94, -140, -121, +23, +112, +115, +38, +110, +115, +171, +75, +99, 214, -211, -39, -221, -36, -93, -37, -246, -181, -79, -97, -113, +209, +109, +52, 198, -89, -226, -201, -240, -41, -129, -125, -241, -96, -37, -33, -38, -229, -35, +20, 0, -68, -188, -24, -190, -201, -44, -170, -226, -156, -15, -28, -199, -215, -10, -154, -178, -244, -1, 112, -229, -28, -205, -217, -193, -200, -219, -22, -11, -84, -118, -187, -243, -202, -202, -134, -100, -46, -160, -255, -53, +80, +30, +224, +5, +155, +135, +254, +114, +2, +131, +115, +97, 133, -70, 52, -1, -108, -29, -111, -245, -77, -36, -253, -181, +118, +252, +215, +214, +223, +41, +56, +203, 231, -250, -138, -28, -38, -108, -31, -235, -116, -40, -129, -253, -173, -31, +104, +159, +183, +217, +210, +85, +80, +90, +200, 237, -149, +226, +69, +52, +134, +207, +122, +201, +88, +112, +46, +102, +66, 238, -252, -120, -163, -235, -70, -190, -230, -220, -156, +177, +135, +174, +179, +2, +86, +11, +49, +5, +87, +216, 27, -21, -15, -44, -218, -160, -61, +57, +122, 23, -171, -16, -196, -32, -6, -73, -146, -160, -72, -36, -35, -219, -55, -126, -133, -67, 40, -169, -196, -81, -28, -191, -234, -29, -43, -187, -189, -227, -46, -169, -122, -81, -204, -190, -175, -67, -122, -130, -0, -250, -123, -109, -216, -6, -220, -216, -217, +232, +13, +218, +208, +222, +13, +89, +186, +211, +4, +4, +183, +82, +186, +167, +212, +42, +10, +23, 147, -81, 41, -185, -38, -92, -85, -86, -214, -110, -125, -61, -178, -169, -236, -109, -32, 109, -183, -240, -30, -171, +42, +71, +204, +61, +134, +26, +29, +136, +81, +84, +83, +192, +208, +210, +1, +9, +45, 228, -188, -115, -189, -33, -167, -66, -27, -37, +84, +5, +8, +50, +182, +138, +97, +47, 209, -113, -236, -141, +161, +74, +163, +12, +214, +200, +205, +198, +124, +68, +96, +237, +42, +144, +157, +182, +12, +48, +234, 231, 114, -210, -98, -157, -155, -89, -239, -13, -108, -65, -144, -120, +25, +156, +164, +43, +135, +215, +202, +247, +165, +79, 227, -37, -6, -240, -159, +134, +115, 104, -236, -193, -135, -159, -225, -113, -143, +192, +251, +158, +77, 249, -143, -100, -100, -93, -22, -76, -233, -222, -234, -199, -228, -250, -43, -128, -19, -229, -241, +86, +109, +49, +89, +89, +157, +69, +18, +226, +230, +81, +10, +0, +129, +175, +119, 64, +49, +96, +216, +27, +247, +85, +188, +113, +67, +120, 251, -94, -192, +222, +136, +19, +60, +4, +242, +201, +153, +205, +125, +21, +2, +168, +1, +101, +67, +44, +119, 4, +76, +126, +247, +146, +17, +210, +90, 10, -99, -148, -162, +201, +242, +189, +7, +100, +53, +8, +113, +185, +125, +209, +177, +255, +97, +24, +49, +44, +180, +184, +183, 217, +105, +32, 179, -166, -133, -145, +171, +227, +63, +162, +23, +26, +155, +106, +55, +93, +42, +178, +42, +227, +138, +225, +200, +180, 196, -127, -247, -121, -34, +36, 2, +160, 249, -80, -30, -23, -100, -94, -45, -240, -104, -116, -197, -10, -216, +3, +110, +202, +24, +113, +169, +126, +66, +208, +21, +101, +86, +235, +198, +179, +61, +148, +255, +242, +59, +206, +162, 104, -49, -134, -156, -236, -88, -132, +229, +168, +102, +81, +223, +137, +34, +210, +86, +18, 84, -97, +191, +111, +71, +24, +236, +107, +244, +146, +105, +149, +30, +163, +154, +143, +63, +191, +72, +156, +1, +200, +99, +171, +58, +14, +136, +231, 228, -65, -127, -97, -139, -35, -140, -162, -203, -16, -84, +219, 45, -47, -79, -3, -231, -131, +101, +236, +184, +23, +28, +10, +7, +52, +39, +189, +81, +204, +240, +173, +92, +167, +220, +53, +42, +21, +46, 103, -141, -22, -18, -117, -25, -197, -115, -193, -130, -2, -243, -80, -198, -178, -214, -147, -218, -152, -170, -118, -197, -198, -214, -159, -231, -14, +93, +229, +103, +19, +6, +12, 121, 193, -78, -217, -253, -206, -175, -120, -128, -172, -87, +35, +69, +65, +86, +174, +195, +192, +198, +82, +86, 67, -138, -205, -141, -12, -222, -202, -227, -81, -164, -120, -251, +221, +161, +126, +121, +52, +156, 120, -122, -251, +20, +123, +171, +102, 206, -125, -61, +162, +56, +160, +13, +210, +31, +184, +226, +44, +86, 82, -114, +196, +122, +194, +71, +126, +228, +44, +20, +115, +162, +46, +201, +202, +141, +130, +11, +203, +183, +130, +223, +24, 159, -92, -96, -4, -73, -138, -99, -103, -100, -255, -244, -174, -13, -160, -36, -103, 253, -57, -125, -129, +35, +252, +48, +152, +144, +82, +73, +242, +147, +197, +46, +202, 41, -143, -61, -55, -206, +149, +83, +0, +149, 16, +126, +107, +170, +234, +177, +229, +200, +60, +82, +34, +152, +60, +202, +52, +87, +7, +167, +231, +111, +184, +24, +45, +119, +35, +126, 8, -183, -30, -61, -182, +53, +241, +145, +224, +6, +143, +148, +2, +110, +160, +83, +128, 236, -156, -173, -156, -109, +62, +91, +89, +75, +219, +160, +64, +77, +100, +210, +188, +45, +176, +4, +206, +23, +65, +15, +127, +118, +144, 114, -111, -9, -111, -236, -106, -98, -215, -234, -195, -185, -42, +75, +18, +29, +74, +48, +1, 252, -25, -250, -49, -195, -15, -239, -172, +71, +238, +121, +84, +136, +158, +132, +128, +202, +161, +92, +134, +148, +22, +70, +131, +213, +66, 60, -162, -215, -28, +171, +101, +197, +200, +114, +75, 127, -156, -226, -235, +220, +130, +102, 163, -208, -218, +112, +166, +199, +14, +231, +14, +240, +47, +112, +67, +125, +152, +150, +163, +145, +20, 98, -170, -202, -55, +114, +40, +161, +244, +242, +97, +116, +111, +29, 13, -23, -91, -155, -20, +49, +217, +136, 214, -156, -240, -101, -195, -123, -108, -184, -155, -57, -137, -203, -185, -119, -60, -31, -243, +106, +197, +71, +158, +161, +87, +63, +56, +54, +215, +199, +216, +125, +68, +85, +51, +70, 233, -229, -143, -94, -14, -73, -208, -90, -227, -198, -72, -26, -171, +57, +125, +48, +58, +160, 116, -111, -189, -209, -20, -253, -105, -46, -156, -161, -244, -171, -196, -142, -208, -0, -204, -67, -41, -117, -126, -44, -34, -244, +93, 183, +160, 68, -50, -106, -122, -121, -159, -30, -68, -244, -244, -159, -36, -223, -235, -180, -54, -163, -69, -156, -32, -79, -3, -223, +161, +154, +232, 99, -1, -47, 138, -162, -243, -102, -164, -83, -36, -191, -185, -112, -70, +242, +109, +171, +77, +247, +253, +254, +45, +33, +144, +240, +5, +99, +41, +84, +113, +80, +30, +249, 142, -177, +161, +192, +136, 222, -8, -209, -61, -115, -18, +110, 140, -34, -81, -150, -11, -224, -169, -29, -215, -65, +61, +5, +121, +133, +19, 151, -83, -149, -138, -9, -142, -37, -35, -158, -98, -239, -126, -230, -184, -59, -59, -251, -3, -178, +226, 200, -28, -139, -176, -139, -25, -50, -141, -88, -168, -232, -68, -64, -184, -48, -48, -240, -114, -51, -6, -71, -187, +236, +188, +21, +144, 99, -215, -13, -15, -240, -81, -88, -65, -180, +120, +224, +24, 84, -37, -130, -77, -185, -123, -112, -187, +60, +99, +143, 13, -242, -174, -132, -153, -254, -169, -33, +224, +139, +144, +163, +241, +165, +23, +85, +230, +208, +40, +70, +113, +0, +204, +218, +196, +36, +225, +54, 55, -42, -130, -102, -20, -250, -38, -62, -44, -170, +43, +75, +211, +168, +59, +33, +5, 25, -195, -115, -70, -31, -26, -1, -7, -152, -142, -137, -129, -17, -91, +221, +83, 53, -107, -56, -203, -18, -206, -106, -178, -87, -228, -188, -215, -56, -52, -204, -151, -237, -188, -160, 57, -242, -223, -24, -40, -232, -117, -183, -27, -148, -188, -39, +93, +145, +199, +48, +229, 96, -19, -142, -2, -4, -10, -22, -153, -137, -106, -187, -159, -225, -188, +73, +250, +114, +189, +49, +165, +100, +76, +20, +191, 142, -97, -70, +44, +169, 190, -116, +75, +196, +113, +235, +92, +97, +214, +103, +96, +101, +201, +141, +145, +156, +253, +47, +182, +154, +136, +207, 162, +75, +49, +231, +220, +53, +176, +245, +22, +41, +231, +62, +203, +0, 58, -6, -162, -74, +142, +80, 84, -128, -235, -13, -171, -220, -30, -200, -78, -105, -111, -155, -78, -174, -91, -132, -234, -208, -73, -118, -99, -42, 212, -52, -88, -49, 227, -108, -167, -30, -170, +137, +169, +78, +33, +39, 93, -179, -40, -90, -1, -234, -24, -16, -52, -14, -209, -124, -99, +47, +205, 242, -248, -112, -187, -189, +101, 32, -136, -39, -59, -108, -6, -96, -196, -81, -226, -12, -7, -102, 217, -236, -226, -185, -67, -54, -130, +27, +141, +197, +177, +180, +228, 102, -93, -203, -50, -120, -14, -233, -86, -6, -44, -166, -36, -19, -235, -30, -242, +234, 123, -147, -118, +223, +81, +46, +1, +114, +129, +225, +92, +12, +248, +61, +251, +153, +166, +1, +52, +148, +164, +35, +10, +227, +88, 51, -76, -53, +154, +239, +47, +78, 59, -106, -106, -170, -205, -38, -149, -186, -79, -235, +46, +86, +57, +167, +184, +72, +224, +202, +144, +232, +239, 8, -60, -102, -178, -249, +148, +169, +3, 203, -152, -205, -146, -246, -85, -233, -240, -16, -174, -175, -175, -222, -83, -184, -162, -174, +31, +10, +88, +238, +207, +65, +228, +115, +204, +3, +154, +53, 106, -96, -81, -102, -174, -220, -68, -177, -71, -190, +62, +60, +131, +26, +75, +44, +63, 55, -250, -190, -187, -218, -21, -191, -239, -42, -16, -211, +212, +118, +44, 43, -127, -249, +192, 119, -123, -131, -103, -159, -212, -212, -237, -139, -238, -167, -171, -193, -69, -231, -227, -237, +162, +249, +195, +190, +209, +28, +133, +19, +84, +40, +126, +68, +133, +106, +46, +203, 43, -206, -10, -170, -229, -246, -76, -48, -220, -222, -237, -172, -115, -117, -219, -233, -165, -29, 223, -26, -119, -236, -117, -63, -125, -206, -38, -124, -103, -220, -239, +120, +27, +44, +163, +50, 99, -247, -226, -34, -237, -246, -222, -160, -219, -69, -183, -127, -59, -184, -250, -114, -249, +17, 161, -211, -235, -91, -45, -144, -58, -94, -116, -110, -111, -243, -29, -77, -22, -72, +216, +142, +42, +38, +28, +84, +12, 29, +227, +148, +174, 207, -175, +13, +33, +250, +211, +240, +17, +238, +63, +202, +2, +115, +25, +97, +4, +173, +51, +81, +89, +250, +34, 111, -251, -86, -203, -235, -222, -118, +50, +37, +205, +132, +47, +199, +73, +163, +104, +122, +242, +102, +94, +178, +252, +12, +76, +242, +188, +242, +137, +44, 46, +148, +71, +62, +77, +235, +6, +146, +138, +160, +2, +226, +182, +143, +103, +163, +41, +152, +224, +74, 7, -151, -237, -238, -149, -21, -144, +248, +217, +32, +43, +8, +181, +106, 212, -235, +223, +108, +24, +133, +142, +59, +114, +98, +3, +207, +106, +83, +104, 182, -243, -219, -173, -21, +250, +48, +81, +13, +61, +140, 132, +79, +53, +32, +77, +57, +125, +34, +37, +112, +146, +209, 212, -171, -123, -217, -254, -212, -177, -7, -241, -170, +176, +234, +124, +211, +117, +227, +121, +223, +61, +12, +218, +119, +189, +133, +65, +33, +88, +221, +174, +249, +196, +140, +5, +176, +108, +148, +54, +149, +147, +53, +154, +153, +134, +178, 243, -183, -139, -238, -85, -199, -106, -15, +185, +255, +211, +105, +161, +152, +107, +202, 168, -227, +243, +223, +11, 199, -235, -171, +205, +147, +197, +207, +18, +24, +238, +36, +90, +90, +219, +61, +26, +72, +41, +131, +197, +228, 12, +114, +99, +81, +171, +102, +221, +13, +120, +142, +67, +165, +32, +39, +253, +175, +81, 202, -95, +137, 77, -123, -157, +249, +38, +154, +192, +7, +207, +99, +165, +130, +109, +0, +39, +230, +57, 93, +178, +150, +205, +230, +154, +200, +230, +217, 95, -92, -103, -231, -235, -143, -166, -221, -190, -92, -157, -119, -122, -5, -56, -255, -100, -218, -149, -206, -89, -218, -237, -223, -140, -209, +170, +137, +13, +136, 9, -51, -230, -22, +199, +99, 248, 103, -211, -126, -120, +55, 90, -210, -94, -255, -110, +116, +187, +230, +15, +140, +158, +105, +175, +71, +166, +10, +227, +8, +116, +49, +41, +145, +71, +27, +187, +201, +40, +128, +15, +166, 124, -80, -58, -183, -237, -108, -203, -55, -156, -20, -35, -173, -206, -196, -115, -63, +96, +214, +131, +83, +45, +253, +1, +164, +12, +64, +59, +86, +121, 132, -238, -50, -175, -209, -81, -233, -162, -248, -235, -195, -68, -122, -144, -135, -208, -4, -115, -95, -163, -183, -196, -104, -53, -97, +55, +234, +129, +48, 193, -189, -23, -97, -226, -163, -157, -126, -201, -232, +58, +58, 248, -148, -178, -156, -106, 89, -231, +39, 94, -4, -111, -1, -46, -174, +82, +38, +6, +74, +116, +19, +38, +42, +177, +118, +55, +17, +51, +144, +89, +252, +165, +114, +14, +160, +60, +155, +50, +34, +163, +90, +255, +178, +211, +187, +21, +39, +241, +28, +233, +252, +200, +241, 79, -191, -214, -205, -69, +125, +47, 144, -248, -96, 148, -9, -128, -91, -53, -203, -207, -204, -44, -162, -255, -155, -225, -101, -102, -112, -218, 76, -170, -250, -198, -41, -111, -215, -88, -198, -112, -158, -228, -96, -165, -236, -17, -27, -15, -42, -221, -222, -206, -98, +1, +38, 159, -13, -164, -229, -219, -128, -17, -61, -205, -65, -113, -50, -6, -254, -11, -91, -154, -228, -69, -214, -45, +135, +62, 27, -198, -75, -54, -209, -65, -49, -51, -12, -23, +89, +83, +87, +20, +178, +81, +39, +218, +17, +116, +72, +105, +165, +148, +221, +242, +202, 129, -137, -181, -92, 183, -107, -24, -43, +239, +233, +3, 122, -154, -131, -226, -4, -85, -31, -78, -52, -184, -151, -126, -56, -242, -18, -131, -100, -218, -107, -29, -242, +170, 57, -248, -154, -169, -206, -182, -54, -229, -33, -11, -111, -145, -211, -93, -48, -65, -63, -81, -11, -172, -173, -247, -104, -30, -109, -235, 115, -30, -26, -111, -51, -231, -113, -64, -230, -163, -81, -130, -206, -25, -24, -25, -107, -34, -140, -179, -207, -122, -227, -111, -251, -102, -224, -14, +127, +121, +38, +218, +46, +37, +4, 249, -216, -47, -98, -57, -96, -51, -91, -202, -193, -153, -24, -58, -246, -163, -62, -93, -144, -187, -233, -118, -240, -246, -161, -239, -82, -251, -5, -124, -89, -96, -22, -199, -188, -167, +103, 186, -109, -43, -112, -29, -73, -29, -55, -58, -78, -0, -153, -23, -44, -194, -69, -156, -43, -68, +14, 229, -202, -68, +183, +162, 26, -242, -12, -123, -61, -91, -59, -96, -61, -40, -50, -157, -71, -128, -211, -226, -1, -40, -54, -111, -150, -250, -59, -243, -185, -191, -196, -244, -18, -11, +8, +199, +117, +99, +101, 204, -179, -96, -159, -56, -124, -11, -68, -91, -221, +84, +35, +182, +208, +102, +43, +31, +100, +84, +232, +20, +72, 94, -210, -153, -154, -93, -22, -161, -253, +219, +16, +205, +166, +152, +184, +36, +75, +44, +185, +98, +79, +139, +23, 168, -236, +75, +80, +153, +69, 35, +57, +162, +146, +152, +128, +158, +120, +177, +75, +226, +90, +245, 71, -97, +89, +12, +177, 24, -25, -57, -193, -32, -246, -165, +178, +15, +40, +216, 156, -27, -96, -5, -238, -238, -32, -9, -117, -243, +132, +146, +78, +193, 134, -145, 83, +184, +245, +70, +165, +201, +22, +243, +61, +77, +249, +131, +72, +14, +28, +251, +254, +239, +51, +219, +95, 156, -108, -127, -56, -50, -83, -38, +12, +74, +0, +144, +198, +141, +39, +246, +106, +47, +155, +228, +226, +225, +150, +76, +159, +246, +133, +182, +119, +175, +113, +179, +210, +74, +165, +139, +15, +19, +148, +182, +220, +197, +40, +201, +14, +252, 99, -161, +152, +63, +140, +246, +57, +125, +31, 48, +129, +173, +221, +33, +122, +14, +70, +53, +160, +118, 32, +200, +64, +19, +39, +88, +237, +24, +171, +17, +40, +215, +10, +221, +82, +221, +46, 204, +141, +98, +173, +91, +247, +101, +48, 73, -26, -5, -245, -132, +166, +118, +187, +243, +28, +244, 60, +222, +58, +240, +229, 224, -46, -107, -242, -99, -72, +26, +196, +48, +66, +180, +45, +137, +109, +157, +240, 181, -201, -91, +48, 129, -81, -53, -19, -13, -64, -26, -120, -238, -78, -158, -104, -235, -149, -53, -93, -211, -86, -31, -53, +249, 130, -64, -213, +219, +240, +164, +168, +173, +76, +234, +206, +187, +107, +123, +32, +138, +105, 119, -180, -4, -34, -205, -150, -207, -245, -66, -205, -6, -169, -140, -220, -71, -47, -57, -154, -141, -6, +243, +224, +230, +202, +44, +192, +113, 88, +4, 94, -246, -121, -159, -38, -153, -203, -235, -243, -206, -160, -127, -219, -190, -237, -158, -89, -233, -245, -115, -253, -6, -237, -179, -219, -238, -87, -59, -53, -61, -117, -239, -117, +162, +214, +102, +173, +40, 63, -117, +18, +26, +88, +130, +4, +221, +170, +39, +206, +17, 207, -173, +191, +110, 108, -16, -212, -237, -236, -115, -187, -7, -83, +95, +113, +2, +114, +73, +169, +112, +40, +9, +85, +129, +247, +50, +145, +101, +177, +78, 230, -108, -65, -27, -44, -10, -54, -74, -233, +128, +118, +177, +144, +235, +169, +86, +205, +225, +95, +79, +189, +106, +254, +216, +173, +167, 98, -158, -215, -156, -90, -218, -166, -176, -2, +53, +127, +231, +30, +143, +0, +111, +249, +140, +249, +138, +165, +170, 14, +137, +89, 70, +221, +99, +200, +142, +187, +190, +5, 53, -22, -177, -162, -65, -96, -19, -155, -179, +101, +199, +197, +194, +91, +246, +108, +123, +3, +213, +203, +188, +45, +196, +191, +126, +245, +64, +207, +36, +54, +52, +127, 222, -115, +108, +178, +47, +52, +37, +95, +41, 67, -88, -14, -149, -122, -244, -157, -17, -121, -5, -235, -30, -30, -121, -86, -103, -17, -56, -228, 69, -152, -119, -69, -116, +249, +148, +183, +237, +97, +156, 68, -176, -160, -58, -21, -24, -214, -140, -167, -44, -230, +14, +178, +112, +69, +151, +98, +178, +73, +158, +226, +151, +174, +14, +73, +51, +118, +181, +37, +160, +114, +25, +111, +179, +81, +179, 220, -125, +183, 228, -105, -24, -79, -189, -113, -66, -65, -187, -24, -175, -150, -60, -72, -114, +91, 171, -39, -209, -88, -48, +115, +193, 80, -136, -3, -52, -218, -158, -233, -98, -142, -152, -255, -81, -162, -59, -98, -159, +123, +71, +140, +253, +144, +51, +37, +114, 66, -125, -79, -197, -191, +248, +111, +222, +61, +229, +40, 252, -33, -251, -13, -117, -192, -8, -231, -208, -115, -57, -251, -39, +246, +147, +119, +159, +114, +152, +14, +11, +56, +14, +254, +170, +202, +164, +224, +239, 45, -128, -162, +250, +236, +60, +101, +159, 23, -134, -146, -224, -14, -113, -46, -55, +88, +69, +10, 191, -60, -4, -118, -202, -62, -185, -202, -109, -146, -244, -240, -34, +141, 19, -155, +57, +167, +33, +208, +18, +14, +159, +231, +206, +68, 114, -97, -192, -136, -131, -135, -136, -179, -110, -115, -0, -246, -163, -46, -127, -9, 147, -99, -155, -44, -238, -14, -51, -233, -19, -46, -191, -13, -163, -187, -127, -249, -67, -27, -35, -7, -30, 156, -40, -160, -244, -133, -110, -24, -252, +103, +36, +14, +216, +31, +1, +100, +254, +71, +39, +186, +183, +146, +126, +240, 148, -168, -116, -133, -108, -154, -37, -96, -128, -221, -243, -104, -20, -172, -123, -185, -84, +62, +160, +5, +164, +49, +251, +176, +206, +14, 73, +216, +40, +99, +200, +166, +142, +117, +3, +104, +9, 195, -97, -44, -250, -68, -37, -46, -79, -69, -31, -196, -95, -199, -245, -70, -170, -119, -44, -30, -194, -232, -59, -38, -26, -144, +204, +51, +14, +200, 45, +129, +34, +93, 49, -92, -36, -41, -60, -209, -2, -29, -107, -49, -133, -184, -235, -141, -41, -233, -70, -146, -15, -163, -21, -39, -99, -239, -17, -182, -117, -250, -251, -107, -116, -47, -197, +167, 52, -165, -11, -202, -238, -142, -94, -55, -184, -190, -147, -121, -20, -98, -252, +138, +224, +236, 52, +9, +30, +159, +204, +242, +224, +225, +33, +110, +16, +62, +28, +126, +14, +247, 165, +69, 37, +71, +224, +3, +222, +222, +159, +91, +233, +247, +248, +177, +172, +243, +8, +229, +17, +119, +26, +117, +160, 192, -138, -128, -175, +225, 85, -185, -128, -229, -80, -242, -22, -168, -116, -113, -170, -116, +58, 103, -50, -197, -240, -42, -138, -202, -34, -200, -216, -8, -141, -9, -228, -56, -122, -68, -15, -231, -135, -225, -156, -131, -138, -150, -158, -244, -49, -182, -63, -34, -44, -104, -196, -89, -185, -150, -54, -104, -62, -121, -119, -94, -202, 128, -114, +159, +62, +49, +252, +240, +103, 13, -123, -21, -165, -6, -247, -52, -121, -158, -14, -58, -219, -118, -200, -212, -145, +208, +163, +64, +208, 204, -2, +29, +82, +107, 160, -167, -97, -248, -93, +177, +225, +144, +204, +231, 44, -230, -105, -148, -150, -218, -85, -133, -69, -78, -63, -130, -215, -8, -207, -61, -93, -63, -111, -6, -59, -75, -115, -241, -133, -210, -49, -190, -42, -180, -186, -120, -168, -202, -196, -179, -54, -104, -235, -209, 129, -103, -68, -131, -112, -4, -142, -57, -74, -4, -124, -71, -20, -247, -127, -11, -9, -116, -100, -13, -73, -250, -2, +252, +140, +255, +121, +39, +78, +112, +226, +183, +76, +138, +203, +192, +29, 133, -89, -236, -63, -13, -65, -1, -188, -105, -1, +11, +120, +190, +92, +6, +221, 88, -250, -174, +241, +222, +144, +50, +149, +72, +228, +206, +58, +19, 140, +228, +6, +217, +202, +56, +35, +135, +199, +1, +12, +209, +69, +131, +28, +216, +72, 63, -125, -3, -54, -165, -156, -31, -252, +202, +249, +83, +21, 104, -17, -209, -165, -204, -45, +99, +11, +95, +227, +25, +158, +51, +246, 58, -150, -82, -124, -211, -184, -182, -206, -252, -209, -180, -17, -170, -184, -75, -48, +226, +163, +135, +81, +19, +9, +135, 68, -41, -156, -54, -96, -154, -202, -33, +113, +162, 181, -52, -108, -251, -176, -89, -173, -33, -80, -185, -214, -35, -151, +24, +4, 224, -58, -145, -43, -164, +216, +90, +127, 19, -37, -211, -55, -60, -188, -56, -1, -202, -112, -143, -148, -250, -223, -79, -255, -140, +107, +66, +186, +115, +61, +76, +15, +27, +71, +46, +147, +205, +157, +230, +30, +106, +85, +6, +181, +68, +42, 153, -77, -179, -162, +168, +99, +208, +200, +38, 202, +169, +115, +226, +85, +241, +189, +99, +242, 185, +51, +104, +1, +90, +229, +45, +87, +118, +75, +73, +105, +232, +153, +184, +85, +4, +84, +169, +193, +211, +80, +162, +152, +24, +36, +157, +49, +216, +9, +150, +201, +148, +125, +207, +56, +142, +132, +120, 68, -65, -88, -146, +206, +232, +193, +45, 217, -195, -156, -205, -179, -48, -78, -48, -131, -77, -188, -0, -164, -170, +135, 203, -175, -159, -21, -140, -125, +122, +181, +121, +114, +219, +208, +29, +197, 5, -98, -61, -7, -130, -239, -151, -218, -180, -102, -172, -103, -155, -182, -205, +27, +16, +221, +86, +234, +131, +159, +160, +107, +230, +80, +114, +20, +66, +148, +11, +201, 2, -35, -37, -54, +214, +25, +163, +200, 120, -31, -6, -184, -194, -38, -235, -97, +48, 84, -12, -229, -47, -240, +141, +96, 234, -170, -111, +119, +47, +224, +28, 132, +142, +117, +152, +105, +188, +129, +108, +239, +180, +220, +70, +147, +159, +27, +207, +158, +35, +159, +230, +86, +27, +147, +70, +9, +52, +107, +41, +204, +64, +66, +8, 15, +249, +196, +97, +32, +212, +110, +180, +224, +9, +169, +91, +126, +92, +129, 100, -252, -53, +17, +20, +97, +169, +223, +215, +131, +241, +205, +98, +219, +206, +56, +224, 146, -174, -183, -240, -229, -2, -158, -67, +55, +244, +185, +124, 253, -139, -245, -202, -154, -180, -227, +124, +217, +120, +254, 173, -238, -145, +111, +84, +234, +214, +177, +2, +124, +17, +108, +155, +105, +103, +24, +100, +9, +119, +186, +165, 158, -167, +78, +42, +96, 12, -246, -155, -54, -242, -21, -48, -79, -131, -0, -83, -20, -199, -25, -238, -131, -144, -191, -150, -26, -239, -234, -83, -25, -132, -55, -99, -34, -92, -69, -55, -205, -178, -196, -85, -148, -65, -120, -189, -22, -68, -203, -114, -101, 4, -63, -15, -40, -244, -128, -92, -130, -91, -7, +159, +71, +108, +52, +102, +184, +231, +60, +178, 147, -199, +139, +189, +78, +6, +186, 138, -147, -69, -154, -70, -188, -235, -183, 225, -157, -56, -191, -190, -186, -21, -253, -206, -173, -184, -253, -220, -237, -139, -238, -149, -232, -124, -237, -244, -254, +50, +145, +28, +106, +101, 46, -62, -246, -218, +194, +23, +122, +81, +158, +121, +7, +171, +56, +227, 151, -29, -1, -13, -160, -161, +241, +153, +184, +153, +83, +8, +171, +122, +24, +102, +114, +6, +32, +193, +67, +225, +32, +205, 28, 57, -200, -75, -165, -140, -183, -179, -164, -64, -254, -69, -16, -80, -133, -248, -32, -77, -16, -207, -44, -41, -49, -74, -174, -196, 84, -92, -148, -46, -105, -7, +175, +208, +225, +194, +133, +36, +254, +208, +239, +182, +82, +181, +149, +226, +231, +144, +89, +52, +98, +114, 99, -204, -229, -140, -190, -173, -113, -150, -119, -152, -68, -104, -25, -46, -162, -34, -39, -171, -170, -29, -61, +26, 160, -136, -136, -108, -27, -138, -18, -115, +110, +104, 224, -27, -61, -172, -59, -192, -17, -99, -58, -181, -51, -97, -132, -152, -179, -50, -7, -174, -146, -169, -213, -182, -2, -219, -230, -205, +196, 35, -238, -75, +111, 139, -29, -195, -101, -186, -3, -5, -236, -245, -53, -15, -179, -2, -112, -41, -118, -166, -62, -115, -110, -73, -50, -162, -134, +82, 123, -57, -193, -53, -156, -224, -178, -86, -239, -178, -196, -115, -125, +123, +126, +157, +26, +231, +95, +36, +227, +63, 239, -236, +113, +250, +249, +34, +158, 14, -240, -42, -188, -37, -25, -242, -125, -26, -214, -245, -217, -133, -89, -65, -30, -156, -9, -61, -51, +134, +206, +232, +251, 110, -44, +210, +135, +39, +167, +201, +157, +136, +164, +153, +115, 79, -126, +195, +7, +194, +200, +99, +164, +82, 138, -58, -21, -79, -101, -204, -227, -66, -126, -112, -12, -38, -122, -135, +185, +166, +17, +89, +64, +99, 211, -14, +74, +215, 148, -123, -139, -15, -33, -235, +176, +217, +104, +94, +171, +57, +252, +213, +164, +120, +93, +158, +147, +55, +110, 121, +87, +232, +6, +92, +253, +44, +35, 90, -105, -186, -74, -101, -50, -69, -4, -194, -10, -83, -111, -115, -61, +27, 103, -150, -199, -46, -29, -76, -175, -91, -165, -142, -96, +207, +26, +138, +21, +181, +117, +112, +131, 141, -208, -4, -246, -149, -165, -87, -128, -228, -151, -114, -178, -68, +202, +215, +98, +223, +138, +21, +202, +73, +48, +216, +91, +177, +245, +20, +174, +189, +250, 243, +110, +112, +183, +67, +89, +13, +189, +143, +14, +184, +79, +28, +111, +133, +112, +72, +227, +104, +187, +237, +137, +27, +107, +2, +196, +46, +72, +190, 126, +234, +152, +194, +130, +158, +89, +250, +92, +30, +242, +176, +20, 1, -185, -67, -181, +210, +53, +69, +15, +231, +142, +94, 142, -84, -12, -203, -85, -137, -181, -244, -244, -185, -243, -179, -17, -188, -82, -135, 104, -207, -222, -6, -43, -145, -18, -217, -205, -159, -98, -90, -29, -172, -21, -227, -134, -84, -157, -33, -45, -10, -88, -84, -103, -32, +87, +138, +92, 123, -171, +165, +218, +47, +134, 106, -208, -157, -80, -125, -59, -205, +55, +227, +131, +91, +138, +106, +215, +237, 183, -163, -92, -238, -69, -57, -78, -87, -92, -99, -206, -80, -156, +253, +74, +181, +127, 96, -19, -185, -210, -169, -103, -40, -50, -28, -83, -207, -232, -22, -156, -105, -19, -64, -11, -149, -182, -165, -76, -108, -70, -35, -94, -18, -27, -210, -135, -16, +170, +93, +247, +97, +169, +78, +181, +15, 234, +67, +14, 84, -141, -29, +251, +248, +234, +52, +175, +248, +122, +110, +39, +78, 170, -125, -72, -168, -27, -46, -60, -63, -121, -227, -5, -235, -168, -43, -115, -64, -246, -231, -109, -209, -161, +93, +131, +134, 142, -250, +73, 14, -8, -53, +156, +253, +153, +248, +235, +216, +209, +226, +67, +156, +126, +101, +184, +171, +48, +10, +198, +124, +115, +58, 33, -5, 144, -159, -176, -30, -138, -212, 254, -184, +195, +69, +52, +226, +48, +250, +249, +116, +25, +123, +35, +11, +127, +149, 93, -176, -96, -204, -19, -68, -57, -154, -28, -70, 3, -217, -209, -164, -251, -51, -154, -89, -128, -28, -164, -190, -3, -214, -44, -248, -254, +137, +182, +192, 60, -57, -212, -142, +69, +94, +76, +217, +100, +16, +125, 62, -72, -162, -133, -235, -235, -206, -81, -196, +149, +41, 210, -87, -251, -64, -158, -31, -185, -189, -196, -233, -227, -108, -63, +151, +74, +12, +67, +119, +217, +130, +223, +131, 68, 58, -187, -122, -52, -129, -33, -0, -185, -28, -104, -30, -235, -16, -157, -56, +148, +153, +38, +137, +148, +115, +177, +74, +80, +41, +85, +178, +15, +118, +183, +127, +116, +146, +41, 121, -51, -11, -239, -185, -142, -50, -61, -39, -105, +238, +99, +57, +199, +112, 49, -146, -33, -200, -178, -50, -97, -209, +154, +114, +190, +159, +223, +199, +148, +253, +74, +6, +46, +81, +13, +21, +78, +157, +214, +31, +29, +47, +184, 22, -143, -252, -4, +245, +104, +52, +117, +208, +103, +7, +118, +217, +58, +172, +245, +245, +220, +86, +57, +183, +48, +127, +105, +61, +44, +244, 21, -152, -17, -166, -207, -204, -149, +212, 89, -46, -121, -87, -247, +24, +159, +203, +180, +203, +153, 234, -117, -178, -114, -149, -69, -54, -251, -38, -60, -9, -174, -179, -181, -40, +25, +142, 87, -108, -168, -62, -151, -21, -11, -41, -13, -30, -46, -28, -168, -192, -31, -201, -244, -147, -182, +157, +164, +216, +72, +116, +38, +206, +177, +148, +23, +90, 235, -176, +84, +162, +88, +110, +119, +80, +77, +173, +117, +64, 66, -230, -158, -6, -231, -246, +195, 154, -44, -199, -56, -70, -188, -222, -200, -151, -193, -36, -153, -2, +57, +11, +93, +101, +243, +166, +255, +255, +49, +218, +202, 61, -88, -169, -237, -132, -74, +120, +81, +236, +83, +95, +153, +81, +128, +151, +166, +176, +4, +70, +238, +253, +225, +125, +122, +71, +190, +183, +37, +64, +130, +1, +180, +161, +23, 169, +211, 127, -44, -102, -115, -58, -53, +161, +107, +109, +231, 74, -219, -111, -125, -241, -171, -58, +6, +35, +63, +140, +115, +22, +120, +35, +105, +234, +96, 208, +62, +205, +157, +96, +139, +179, +180, +61, +106, +81, +190, +109, +94, +148, +198, +132, +174, +213, +194, +145, 108, +38, +140, +194, +199, +218, +78, +158, +65, +204, +69, +5, +80, +167, +78, +12, +98, +218, +51, +232, +105, +64, +148, +199, +57, +149, +172, +90, +203, +113, +223, +139, +62, +134, +34, +147, +98, +24, +252, +133, +92, +210, +153, +140, +38, +91, +222, +170, +163, +35, +127, +234, 193, -143, +216, 157, -3, -141, -33, -146, -219, -8, -43, +42, +119, +53, +79, +174, +37, +131, +176, +143, +100, +11, +134, +107, +57, +84, +20, +214, +163, +231, 154, -62, -148, -89, -7, +200, +90, +91, +35, +177, +166, +18, +211, +64, +213, 75, +146, +204, +130, +160, +182, 236, -240, -112, -226, -132, -75, -175, +254, +246, +136, 165, -47, -28, -176, +109, +187, +189, +189, +135, +12, +220, +29, +29, +42, +5, +58, +193, +144, +78, +48, 241, +101, +29, +10, +9, +61, +150, +160, +158, +36, +112, +97, +82, +58, +75, +109, +196, +243, 163, -132, -121, -170, -162, -62, -140, -11, -93, +8, +118, +81, +210, 57, +148, 115, -123, -45, -5, +106, +1, +204, +142, +68, +78, +151, +98, +24, +62, 157, -43, -128, -192, -147, -46, -191, -168, -38, -145, -185, -185, -12, -57, -86, -75, -181, -21, -5, -138, -112, -213, -46, -202, -30, -153, -235, 82, -62, -47, -103, -42, -66, -165, -38, -79, -242, -194, -193, -234, -102, -42, -145, -60, -253, -26, +254, +53, +232, +23, +146, +186, +213, +94, +81, +32, 159, -10, -50, +18, 25, -2, -9, -69, +36, +6, +238, +135, +105, 195, -64, -106, -220, -208, -172, +18, +87, +88, +167, 123, -128, -214, -28, -58, +156, 58, -212, -169, -4, -77, -109, -198, -67, -106, -85, -8, -99, -105, -113, -251, +254, +88, +168, +129, 90, -80, -55, -205, -107, -41, -183, +121, +191, +74, +186, +25, +228, +76, +201, +103, +156, +163, +119, +243, +8, +72, +30, +189, +145, +92, +27, +164, +140, +187, +124, +186, 144, +218, +53, +163, +185, +80, +133, 253, -186, -89, -21, -117, -3, -67, -207, +175, +180, +154, +208, +64, +217, +38, 71, -66, -9, -15, +5, 221, -24, -121, -93, -135, -6, -213, -21, -32, +171, +82, +224, +151, +172, +85, 145, +186, +13, 71, -184, -39, -190, -136, -200, -32, -166, -194, -138, -169, -160, -87, -16, -70, -51, -124, -68, -50, -57, -73, -137, -227, -168, -179, -247, -102, -50, -77, -106, -25, -177, -230, -126, -14, -244, -20, -121, -231, -113, -209, -236, -126, -18, -40, -83, -159, -55, -122, -173, +114, 76, -177, -100, -129, -47, -113, -16, -154, -244, -6, -219, -198, -16, -79, -213, -203, -97, -138, -196, -84, -170, -74, -55, -123, -183, -36, -117, -44, -222, +101, +104, +200, +37, +218, +232, 102, -157, -153, -151, +24, +140, 36, -186, -54, -40, -167, -78, -204, +122, +90, +125, +199, +14, 184, -225, -152, -11, -95, -106, -198, +193, 146, -228, +115, +231, +3, +82, +253, +57, +252, +163, 110, -85, -76, -29, -238, +131, +94, +13, +97, +24, +59, +169, +101, +198, +226, +187, +148, +115, +46, +18, +131, +113, 205, -89, +176, +47, 145, -223, -228, +254, +77, +240, +28, +17, +214, +131, +72, +75, +45, +144, +202, +37, 146, -156, -107, -98, -245, +190, +164, +64, +57, +114, +19, 12, -43, -137, -163, -89, -94, -73, -230, -169, -249, -7, -6, -70, -247, -128, -109, -152, -122, -241, -121, -171, -203, -23, -106, +66, +157, +95, +218, +35, +173, +157, +213, +205, +243, +208, +159, +21, +166, +220, +27, 219, -22, -99, -6, -91, -26, -241, -216, -55, -187, -65, -31, +23, +101, +59, 188, -21, +197, +95, +180, +27, +96, +57, +247, +180, +60, +202, +54, +180, +156, +137, +175, +212, +6, +14, +42, +33, +197, +27, +139, +101, +184, +208, +186, +210, +239, +65, +248, +8, +232, +113, +18, +250, +18, +49, +231, +134, +37, 220, -240, -209, -135, -249, -226, -35, -197, 195, -203, -153, -47, -191, -175, -234, -172, -31, +23, 193, -238, -214, -225, -129, -248, -7, -246, -50, -99, -199, -178, -19, -44, -62, -170, -223, -36, -224, -99, -224, +58, +188, +165, +48, +116, 33, -250, -137, -64, -196, -143, -46, -177, -231, -135, -241, -88, +15, +184, +168, +90, +110, +228, +39, 204, -57, -240, -17, -84, 130, +86, +37, +242, 51, -28, -3, -90, -217, -223, +29, +9, +53, +128, +51, +126, +103, +62, +127, +237, +154, +63, +83, +155, +187, +175, +165, +0, +13, +132, +156, 205, +147, +165, +142, 16, -178, -109, -94, -141, +104, +1, +225, +26, +201, 57, -7, -187, -149, -41, -208, -221, -140, -42, -71, -111, -158, -198, -196, -3, -50, -12, -103, -121, -215, -199, -175, +229, +220, +193, +100, +56, +225, +147, +10, +207, +210, +233, +155, +167, 30, -122, +60, +125, +42, 161, -117, -85, -177, -105, -115, -223, -199, -16, -107, -82, -99, -189, -238, -66, -77, -104, -19, -223, -71, -236, -169, -156, +40, +32, 21, -153, -33, -161, -97, -48, -43, -39, -218, -91, -52, -207, -190, +157, +225, +89, +53, +142, +172, +195, +158, +210, +130, +246, +228, +164, +243, +84, +72, 8, -220, -152, -179, -80, -114, -162, -241, -147, -5, +154, +29, 187, -96, -137, -15, -253, -27, -113, -27, -73, -44, -61, -219, -77, -88, -7, -160, -11, -101, -99, -17, -98, -241, -13, -39, -208, -235, -185, -99, -119, -12, -124, -0, -72, -247, -13, -136, -11, -103, -49, -243, -54, -172, -75, -38, -212, -184, +195, +216, +156, +70, 225, -136, -110, -29, -43, -82, -241, -224, -207, -66, -242, -224, -224, 108, -141, -164, -93, -5, -144, -18, -213, -221, -182, +238, +249, +118, +122, +174, +103, +34, +69, 176, +224, 100, -68, -56, -223, -197, -40, -115, -43, +90, +70, +190, +161, +148, 149, -43, -21, -255, -110, -66, -12, +99, +47, +48, +246, +33, +176, +93, +1, +87, +181, +221, +13, +254, +118, +169, +35, +113, +162, +36, +175, +213, +84, +133, +24, +18, +156, +196, +142, +123, +207, +49, +168, +197, +129, +78, +223, +53, 228, -73, -12, -171, -234, -230, 128, -168, -73, +48, +7, +12, +153, +7, 244, -67, -23, -206, -69, -34, -9, +49, +126, 140, -1, -58, -9, -12, -224, +107, +119, +52, +71, 185, -78, -96, -55, -235, -202, -174, -166, -156, -242, -36, -200, -90, -192, -241, -3, -37, +102, +97, +34, +239, +34, +39, +136, 49, -240, -205, -218, -79, -24, -151, -118, -23, -12, -38, -121, -216, -14, -20, -8, -146, -167, -206, -134, -68, -227, -3, -93, -201, -98, -101, +209, +200, +177, 57, -157, -224, -247, -112, -53, -91, -135, +225, +68, +4, +222, +32, +48, +74, +68, 10, -170, -157, -30, -46, -241, -124, -192, -231, -140, -49, -122, -206, -246, +23, +40, +149, +215, 16, -39, -90, -54, -114, -205, -52, -88, -102, +244, +91, +252, +220, +196, +94, +23, +160, +50, 219, -187, +238, +85, +120, 14, -76, -141, -154, -150, -137, -12, -225, +179, +215, +128, +176, +232, +14, +80, +33, +147, +59, +184, +170, +139, +168, +240, +84, +165, +95, +237, +105, 187, -104, -169, -42, -224, -236, -204, -55, +171, +45, +133, 25, -121, -78, -48, -241, -229, +202, 106, -20, -92, -33, -113, -113, -173, -184, -90, -1, -208, +175, +193, 42, -46, -187, -150, -18, -140, -107, -5, -5, -38, -240, -224, -144, -89, -12, -78, -77, -29, -132, +235, +234, +251, 169, -56, -226, -96, -180, -24, -122, -163, -82, -227, -86, -185, -195, -125, -7, -189, -231, -43, -221, -223, -246, -194, -245, +161, +217, 66, -193, -3, +48, +84, +172, +173, +199, +169, +149, +134, +219, +199, +164, +163, +16, +103, +220, +48, +87, +177, +154, +71, +222, +204, 137, -147, -24, -207, -248, -107, -126, -65, -77, -31, -127, -213, -119, -30, -133, -247, -158, -203, -218, +60, +224, +92, +176, +72, +180, +182, +20, +162, +21, 25, -135, -6, -141, -249, -7, -26, -172, +235, +242, +44, +85, +41, +175, +34, +11, +196, 165, -217, -3, -122, +41, +199, +145, +220, +202, +222, +102, +125, +41, +95, +157, +31, +58, +46, +85, 240, -233, -103, -100, -17, -48, -97, -247, -132, -109, +130, +105, 66, -196, -223, -82, -82, -229, +102, +15, +40, +111, +125, +252, +157, +75, +102, +141, +23, +17, +49, +228, +248, +4, +1, +95, +64, +54, +114, +236, +195, +185, +237, +52, 252, +20, +116, +23, +101, +98, 19, -173, -226, +229, +182, +207, +96, +59, +33, +30, +0, +217, +50, +0, +130, +24, +11, +39, +78, +184, +114, +21, 37, -150, -232, -58, -223, -18, -218, -58, -194, +116, 191, -183, -196, -204, -123, -20, -100, -201, -68, -54, -13, -221, -48, -52, -255, -64, +111, +169, +106, +202, +169, +197, 126, -37, +211, +170, +84, +69, +48, +79, +229, 104, -89, -199, -245, -164, -3, -192, -83, -191, -72, -208, -155, -205, -234, -181, -103, -46, -195, -72, -237, -11, -64, -149, -151, -100, -98, -52, -234, -133, -187, -159, -172, -173, -146, -12, -91, -12, -172, -5, -144, +117, 51, -230, -162, 80, -216, -38, -174, -77, -187, -188, -243, -246, -181, -120, -99, -120, -113, -34, -93, -228, +49, +51, +57, 9, -58, -89, -127, -188, -238, -93, -182, -111, -149, -91, -249, -107, -212, -73, -226, -10, -168, -82, -22, -199, -167, -48, -68, -168, -87, -35, -127, -121, -82, -183, -37, -106, +15, +196, +103, 224, -24, -237, +39, 216, -195, -101, -34, -227, -255, -241, -26, -198, -197, -223, -95, -161, -95, -16, +10, +96, 87, -111, -84, -172, -157, -182, -76, -179, -233, -204, -67, -133, -31, -72, +222, +230, +81, +170, +186, +199, +206, +3, +116, 69, -49, +105, +12, 121, -75, -16, -176, -222, -24, -43, -168, -208, -119, -200, +72, +90, +53, +143, +129, +53, +41, +129, +121, +161, +82, +53, +1, +194, +166, +114, +38, +177, +12, +210, +18, +241, 2, -50, 0, -122, -2, -246, -216, -133, -239, -124, -233, -96, -109, -154, -185, -227, -69, -196, -128, -250, +164, +20, +232, +12, +51, +7, +85, 114, -156, -48, +27, +141, +8, 107, -207, -30, 177, -100, -164, -129, -229, -133, -145, -43, -163, -215, -98, -30, -66, -175, -184, -4, -217, +157, +41, +147, +13, +253, +178, +121, +253, 211, -216, -105, -202, -119, -66, -221, -40, -181, -25, -27, -246, -160, -76, -114, -69, -117, -236, -26, -87, +186, +86, +78, +150, +247, +43, +5, +149, +53, +19, +153, +78, +66, +133, +143, +234, +252, +240, 88, -42, +137, +147, +78, +16, +32, +12, +38, +252, +9, +55, +157, +82, +14, 224, +86, +196, +211, +112, +225, +187, +1, +7, 31, -224, -254, -242, -238, -186, -234, -192, -148, -242, -227, 83, -103, 189, -97, -76, -175, 30, -224, -50, -122, -117, -78, -177, -108, -147, -136, +21, +167, +69, +217, +18, +181, +160, +135, 185, -231, -60, -88, -60, -205, -168, -77, -87, -224, -226, +11, +203, +165, +31, +48, +247, +49, +48, +15, +147, +41, +36, 32, -167, -226, -28, -47, -134, -150, -252, -125, -47, -73, -124, -84, -0, -184, +120, +49, +248, 192, -3, -180, -64, -116, +67, 18, -152, -170, -94, -133, -187, -76, -209, -221, -29, -168, -99, -130, -39, -138, -175, -172, -124, -4, -33, -21, -237, -109, -232, +56, +77, +102, +53, 215, -134, -62, -73, -161, -24, -123, -236, +135, +4, +251, +175, +34, +37, +110, +81, +1, +38, +250, +9, 133, -162, -80, -32, -58, -143, -138, -50, -192, +170, +239, +84, +17, +203, +13, +101, +156, +174, +149, +202, 198, -242, +113, +2, +203, +5, +21, +70, +132, +75, +119, +173, +218, +83, 37, +30, +61, +29, +52, +83, +89, +223, +89, +58, +43, +115, +50, +120, +141, +13, +158, 140, -213, -205, -107, -137, -183, -127, -18, -67, -15, +151, +128, +132, +200, 51, -229, -191, -251, -227, -159, -84, -135, -22, -222, -80, -109, -162, -123, -251, -203, -187, -95, -249, -214, +230, 211, -240, -165, -138, -164, -17, -166, -12, +49, +73, +146, +29, +2, +160, +199, +234, +250, 197, -157, -21, -76, -26, -236, -254, +9, +81, 58, -42, -53, -236, -235, +37, +23, +66, +3, +88, +220, +21, +98, +36, +69, +144, 56, -84, -58, -153, -103, -136, -72, -242, -172, -242, -30, -7, -145, 209, -211, -54, -253, -189, -188, -15, -157, -126, -162, -139, +196, +241, +155, +226, +21, +48, +195, 207, -138, -56, -145, -143, -115, -54, -214, -166, +149, +140, +167, +240, 175, -243, -56, -146, -255, -92, -200, -96, -180, -44, -229, -74, -158, -173, -166, -49, -207, -181, -125, -44, -133, -124, -126, -129, -147, -73, -223, -146, -154, -216, -142, -109, -251, -67, -206, -171, -154, -159, -194, -7, -229, -226, -250, -250, +76, 70, -61, -39, -101, -232, -114, -30, -244, -230, -170, -25, 111, -135, -185, -52, -190, -135, -114, -226, -25, -120, -9, -229, -92, -33, -202, -225, -154, -230, -73, -157, -25, -232, -78, -107, -90, -237, -160, -202, -208, -115, -85, -196, -42, -51, -80, -113, -204, -174, -157, -105, -127, -137, -12, -173, -234, -93, -234, -229, -204, -45, -182, -209, -13, -42, -46, -180, -244, -190, -192, +233, +189, +153, 122, -247, -176, -43, -121, -172, -238, -216, 147, -130, -199, -109, +169, +240, +229, +3, +22, 77, -171, -157, -20, -86, -123, -76, -219, -178, -85, -60, -93, -83, -127, -43, -78, -244, -230, -236, -242, -207, -171, -170, -245, -63, -191, -249, -128, -166, -12, -52, -37, -96, -93, -232, +84, +105, +140, 60, -75, -34, -160, -61, -11, +202, +180, +58, +206, +141, +20, +195, +69, +227, +202, +133, +88, +44, +56, +122, +192, +210, +141, +164, +193, +65, +76, +46, +2, +174, +16, +176, +250, +220, 132, -187, -21, -236, -217, +145, +55, +241, +80, +35, +0, +192, +149, +185, +96, +222, 12, -111, -255, -180, -106, -99, -120, -251, -167, -90, -231, -232, -94, +171, 182, +12, +224, +123, 7, -237, -115, -232, -183, -170, -198, -239, -206, -156, -55, -244, +159, +90, 131, -104, +132, +8, +105, +203, +70, +99, +131, +39, 155, -13, -72, -180, -233, -234, -58, -151, -87, -88, -33, -229, -42, -212, -71, -47, -117, -123, -52, -24, -9, -224, +96, +59, +160, +219, +174, +187, +152, 251, -91, +84, +171, +115, +179, +92, 187, -119, -190, -186, -252, -143, -97, -244, -128, +125, +78, +243, +96, +248, +76, +28, +27, +3, +127, +34, +107, +54, +140, +108, +141, 145, 126, +62, +204, +184, +177, 56, +97, +117, +236, +187, +180, +199, +87, +233, +22, +31, +145, 34, -197, -157, -147, -57, -41, -19, -124, -165, +131, +108, +11, +244, +252, +29, +69, +93, +141, +73, +14, +156, +186, +159, +1, +11, +48, +168, +228, +185, +146, 51, -154, -202, -56, -61, -235, -45, -49, +234, +98, +222, +182, +234, +62, +102, +238, +31, +247, +128, +85, +94, +78, +77, +188, +215, 65, -51, -12, -253, -150, +195, +187, +121, +33, 132, -185, -131, -241, -218, -12, -138, -155, -238, -213, -167, -193, -205, -245, -213, -167, +181, +151, +186, +14, 85, +190, +222, 244, -220, -192, -228, -111, -110, -144, -223, -49, -134, -132, -203, -49, -225, +136, +237, +15, +171, +36, 143, -180, -130, -69, -144, -0, +29, +182, +38, +68, +72, +237, +118, +35, +229, +187, +92, +86, +186, +118, +5, +79, +200, +38, +42, +234, +76, +114, 139, -147, -1, -196, -49, +217, +138, +208, +170, +203, +171, +5, +190, +151, +167, +187, +84, +239, +42, +26, +133, +184, +26, +237, +37, +234, +57, +162, +106, +79, +107, +110, +184, +204, +112, +201, +3, 155, -89, -109, -43, -116, -210, -0, -22, -72, -51, -91, -113, +42, +133, +158, +27, +130, +5, +80, +86, +55, +160, +224, +192, +152, +99, 25, -131, -9, -171, +82, +183, +229, +166, 44, -46, -188, -97, -132, -250, -185, +136, +170, 42, -234, -19, +7, +100, +119, +81, +22, +80, 53, -134, 50, -60, -104, -11, -136, -67, -190, -141, 202, -165, -17, -228, -77, -158, -207, -88, -163, -98, -53, -104, -75, -32, -70, +166, +84, +25, +193, +241, +125, +172, +69, +166, 117, -65, -81, -79, -153, -76, -130, +54, +148, +11, +154, +216, +112, +44, +226, +189, +240, +29, +192, +196, +50, +227, +175, +11, +57, +164, 180, -244, -166, -200, -249, -15, -186, +155, 130, -74, -47, -18, -175, +50, +245, +224, +44, +52, +6, +230, +147, +250, +41, +171, +107, +102, +231, 169, -198, +192, +58, +210, +21, +178, +86, +146, +111, +205, +9, +45, +74, +137, 149, -64, -201, +19, +88, +148, +245, +143, +127, +0, +121, +229, +6, +213, 52, -63, -51, +143, +94, +44, +91, +10, +173, +112, +84, +22, +190, +117, +205, +224, +121, +232, +251, +149, +124, +151, +111, +67, +206, +78, +165, +183, +104, +44, +110, +254, +43, +191, +215, +45, +222, +137, +153, +116, +0, +66, +156, +141, +101, +157, +156, +124, +137, +21, +228, +81, +33, +54, +129, +157, +162, +1, +58, +189, +222, +160, 115, -254, -17, +243, +105, +117, +20, +57, +75, +231, +129, +238, +88, +143, +46, +240, +226, +169, 82, -86, -3, +165, 21, -198, -192, -51, -220, +196, +59, +165, +24, +203, +23, +188, 192, -254, +73, +40, +31, +107, +126, +195, +238, +109, +177, +245, +232, +120, +118, +89, +97, +170, +190, +81, +137, +69, +222, +74, +67, +16, +86, +78, +153, 160, -207, -46, -226, -79, +57, +184, +48, +122, +18, +98, 213, -190, -194, +87, +103, +134, +79, +34, +10, +177, +244, +83, +170, +103, +252, +231, +2, +232, +140, +174, +111, +251, +45, +5, +143, +95, +208, +251, +178, +171, +107, 228, -6, -247, -14, +1, +206, +173, +113, +203, +154, +78, +240, +64, +16, +29, +249, +134, +135, +242, +94, +188, +165, +188, +190, +156, +87, +13, +109, +157, +190, +76, +164, +191, +212, +154, +97, 58, -26, -217, -215, -176, 138, -149, -206, -170, -241, -146, -158, -122, -34, -53, -4, -127, -50, -122, -25, -184, -196, -171, -226, -238, -84, -234, -0, -159, -247, -68, 169, -67, -210, +70, +180, +121, 58, -106, -140, -228, 191, -150, -32, -247, +78, +220, +45, +157, +94, +74, +82, +243, +205, +20, +156, +50, +41, +199, +88, +151, +98, +164, +169, +185, +51, 26, -60, -195, +201, +88, +21, +52, +143, +197, +183, 34, -142, -5, -240, +220, 247, -81, -187, -50, -69, -64, -90, -217, -53, -69, -129, -202, +103, +226, +243, 69, -145, -161, -0, -203, -89, +159, +134, +165, +155, 10, +157, +65, +232, +167, +237, +117, +9, +163, +39, +111, +83, 213, -47, -192, -40, -220, +71, +75, +85, +158, +183, 162, -200, -175, -220, +186, +56, +198, +32, +247, +62, +108, +243, +104, +221, 246, -199, -168, -140, -43, -83, +104, +218, +48, +198, +149, +165, +29, +236, +58, +152, 230, -212, +156, +145, +213, +40, +153, +98, +224, +255, +252, +115, +17, +38, +127, +229, +255, +154, +49, +61, +184, 14, -85, -135, -44, 114, +96, +208, +22, +153, +108, +137, +254, +178, +165, +168, +161, +122, +108, +245, +142, +25, +188, +156, +214, +133, +61, +66, +103, +171, +199, +191, +122, +19, +127, +52, +84, +115, +64, +91, +24, +168, +8, +76, 170, -207, -12, +64, +171, +8, +228, +4, +176, 31, -11, -165, -151, -210, -62, -192, +16, +139, +81, +120, +141, +16, +18, +141, +246, +82, +218, +81, +57, 10, -127, -37, +39, +1, +70, +208, +177, +135, +32, +198, +123, +198, +3, +152, +102, +128, +35, +63, +151, +107, +107, +43, +219, +186, +221, +173, +129, +70, +180, +103, +194, +243, +143, +138, +23, +39, +172, +1, +213, +96, 139, -250, -214, -125, -111, -214, -87, -163, -74, -250, -170, -53, -232, -114, -165, -49, -200, +12, +108, 54, -128, -244, +20, +22, +113, +83, +70, +191, +233, +12, 81, -217, -90, -190, +133, +24, +6, +131, +153, +23, +99, +158, +245, +244, +73, +55, +73, +87, +137, +125, +237, +83, +88, +156, +115, +150, +120, +50, +124, +74, +96, +95, 60, -220, -0, +88, +73, +136, +73, 249, -185, -251, -208, -7, +8, 0, -6, -238, -112, -15, -183, -31, -39, -105, -48, +17, +47, +134, +167, +153, +69, +85, +92, +240, +129, +227, +248, +90, +65, +83, +150, +62, +0, +174, +156, +163, +57, +59, +24, +121, +219, +98, +129, +202, +110, +119, +94, +89, +217, +144, +204, +5, +244, 191, -177, -90, -213, -164, -184, -170, -106, -145, -120, -181, -111, -105, -185, -93, -154, -123, -201, -104, -58, +166, +208, 136, -71, -206, -94, -168, -52, -205, -182, -175, +38, +128, 173, -42, -44, +227, +173, +190, +141, +164, +191, +246, +92, +95, +147, +195, +132, 237, -25, -109, -86, -117, -27, -17, -63, +99, +157, +14, +37, +176, +191, +245, +163, +189, +210, +157, +31, +111, +116, +221, +200, +215, +156, +155, +115, +163, 226, -165, -235, -214, -43, +129, +69, 27, -143, -98, -5, -108, -210, +180, +231, 98, 21, -120, -8, -76, -59, -35, -190, -225, -204, -119, -152, -101, -35, -72, -184, -82, -169, -71, -131, -43, -186, -163, -57, -197, -83, -209, -214, +130, +24, +196, +32, +73, +18, 20, -147, -210, -94, -41, -157, -126, -174, +137, +100, +100, +251, +198, +175, +112, +8, +37, +149, 56, +138, +227, +87, 189, -178, -236, -32, -199, -131, -156, -229, -43, -7, -127, -125, -197, -47, -52, -58, -118, -104, -25, -7, -185, -80, -242, -144, -90, -38, -83, -143, -84, +99, 101, -118, -246, -104, +183, +119, +220, +37, +85, +47, +138, +217, +247, 117, -128, -124, -205, -46, -238, -142, +72, +79, +16, +64, 255, -87, +160, 13, -243, -79, -183, -102, +219, +128, +27, +59, +123, +50, +42, +37, +215, +132, +171, +202, +202, +218, +173, +175, +71, 54, -235, -62, -221, -147, +149, +189, 13, -0, -218, -176, -20, -43, -112, -213, -104, 164, -190, -15, -189, -17, +237, +22, +222, +99, +149, +156, +119, +174, +55, +228, +76, +104, +163, +36, +58, +142, +157, +122, +46, +39, +45, +214, +185, +153, +245, +222, +192, +22, +4, +137, +55, +94, +98, +0, +255, +137, +198, +30, +124, +248, +9, +30, +247, +152, +255, +72, 70, +214, 101, -45, +193, +148, +238, +173, +126, 76, +174, +191, +2, +56, +81, +30, +15, +180, +239, +5, 76, -212, +160, +48, +70, +41, +154, +61, +107, +90, 24, -229, 73, -29, -202, -203, -241, -153, +252, +119, +159, 39, -56, -185, -101, -192, -165, +34, 144, +143, +229, +113, +65, +230, +213, +2, +143, +70, +87, +172, +128, +141, +22, +99, +200, +201, +142, +69, +72, +21, +70, +30, +245, +23, +182, +56, +194, +40, +186, +12, +65, +213, +242, +242, +52, +112, +62, +120, +214, 104, -47, -226, +33, 81, -153, 151, -214, -202, -211, -124, -42, -54, -62, -108, -37, -176, -94, -88, -95, -83, -34, -251, -62, +81, +60, 23, -133, -253, -234, +44, +40, +48, +15, +101, +44, +107, +61, +171, +141, 169, -51, -93, -249, -85, -88, -4, -222, -63, +106, +87, +108, +108, +253, +121, +238, +144, 23, +236, +148, +221, +239, +252, +138, +7, +200, +122, +53, +164, +216, +220, +200, +224, +173, +60, +30, 69, +138, +183, +143, +167, +183, +239, +60, +212, +35, +37, 247, -157, -172, +201, +5, 70, -244, +144, +164, +56, +118, +70, +246, +79, +239, +218, +0, +74, +114, +214, +159, +211, +23, +152, +242, 216, -193, -80, -34, -163, -179, -129, -116, -135, -169, -131, -182, -102, -50, -91, +115, 227, -37, -175, -28, -32, -15, -127, -141, +12, +129, +112, +235, +209, +99, +203, +206, +217, +202, +217, +38, +247, +150, +240, +198, +174, +38, +118, +173, +62, +156, +171, +194, +159, +161, +31, 51, -185, -41, -18, -12, -246, -41, -242, -114, +252, +240, +222, +202, +35, +122, +205, +241, +199, 41, -0, -232, -42, +190, +62, +10, +173, +45, +166, +170, +124, +211, +112, +177, +181, +73, +97, +205, 9, -252, -93, -139, -100, -206, +95, +54, +188, +199, +134, +187, +153, +147, +184, +156, +7, +199, +243, +49, +159, +94, +254, +232, +229, 144, -195, -9, -82, -83, +4, +173, +53, +110, +140, 164, -166, -73, -105, -40, -87, -18, -206, +177, +74, +247, +214, +27, +77, +209, +159, +230, +210, +25, +74, +191, +74, +236, +8, +13, +192, +60, +148, +82, 231, -156, -24, +199, +34, +66, +127, +75, +36, +163, +166, +151, +247, +249, +65, +68, 79, +255, +73, +242, +189, +78, +107, +51, +90, +196, +9, 242, +52, +240, +61, 22, -81, -150, -173, -17, -217, -186, +240, +162, +40, +58, +111, +70, +58, +69, 242, -59, -147, -246, -96, -108, -150, -136, -121, -76, -66, -131, -48, -13, -2, -193, -254, -62, -193, -216, -168, -246, -34, -248, -213, -24, -167, -108, -108, -252, -166, -128, -192, -117, -220, -217, -171, -182, -97, -224, -1, -32, -164, -182, -170, 155, -198, -246, 11, -51, -68, -108, -61, +103, +228, +24, +235, 141, -37, -204, -31, +16, +221, +51, +39, +193, +40, +18, +101, 185, -88, -165, -212, -108, -64, +0, 158, -143, -5, -180, -102, -117, -161, +218, 113, -142, +29, +116, +57, +85, +169, +152, +224, +88, 50, -42, -82, -43, -102, -173, -34, -26, -40, -176, -186, -68, -38, -16, -4, +226, +41, +246, +238, +39, 142, -211, -239, +187, +179, +179, +63, +32, +139, +204, +177, +8, +187, +152, 33, -176, -226, +211, +136, +133, +138, +78, +4, +132, +11, +3, +3, +47, +55, +99, +112, +180, +59, +118, +221, +240, +0, +31, +133, +21, 68, -35, -228, -117, -30, -35, -228, -231, -73, -51, -176, -70, -73, -168, +75, +85, +34, +216, +148, +187, +7, +183, +219, +32, +239, +74, +152, 233, -144, -13, -224, -175, +159, +26, +114, +163, +34, +104, +70, 161, -241, -219, -211, -95, -136, 111, -96, -31, -83, -238, -136, +226, +195, +162, 154, -141, +49, +60, +231, +244, +161, +17, +112, 128, -16, -80, -42, -114, +233, 152, -185, -247, -198, -113, -23, -68, -147, -242, -57, -84, 24, -198, -28, -182, -90, -226, -23, -119, -136, -43, -215, -201, -20, -84, -139, -19, -78, -78, -200, -126, -173, -111, -254, -228, -14, -91, -250, -23, +24, +177, +85, +179, +134, +179, 44, -91, -40, -221, -5, -122, -212, -122, -152, -170, -211, -31, -191, -62, -21, -36, -36, -145, -63, -54, -26, -184, -209, -155, +225, +172, +38, +123, +69, +206, +123, +141, +67, +195, 124, -18, -178, -112, +217, +206, +11, +154, +35, 255, -187, -140, -66, -10, -61, -150, -19, -167, -108, -60, -153, -133, -180, -119, -8, -228, -218, +141, +129, +130, 94, -52, -199, -192, -56, -84, -113, -29, -52, -199, -174, -117, -108, -117, -255, -113, -229, -60, -41, -74, -82, -217, -147, -249, -139, -101, +119, +187, +65, +201, +123, +2, +54, +225, +40, 64, -195, -116, -61, -55, -223, +160, +96, +145, +153, +168, +182, +251, +25, 206, -193, +235, +24, +102, +228, +75, +39, +170, +99, +32, +170, +68, +5, +184, +222, +176, +202, +237, +129, +236, +148, +246, 182, -157, -94, -88, -21, -179, -224, 233, -241, -61, -21, +228, +186, +69, +168, +14, +157, +100, 55, -234, -59, -210, +166, 66, -211, -137, -123, -243, -86, -156, +77, +131, +21, +51, +206, +118, +234, +161, +218, +53, +139, +162, +21, 160, -91, -14, -69, -188, -255, -43, -124, -32, -215, -28, -204, -109, +142, +1, 65, +227, +16, +205, +55, +38, +143, +15, +183, +219, +11, +130, +120, +178, +195, +102, +0, +70, +28, +37, +206, +112, +96, +150, +205, +46, +158, +59, +100, 35, -114, +104, +214, +181, +44, +131, +231, +144, 110, -32, -165, 101, -153, -58, -145, -251, -128, -206, -61, -241, +192, 98, -142, -129, -14, +74, +50, 177, -120, -127, -206, -174, -94, -45, -149, -18, -23, +238, +33, +191, +55, +105, +55, +195, +84, +179, +163, 166, -38, -116, -144, -144, -48, -85, -121, -239, -232, -39, -56, -233, -156, -41, -21, -38, -164, -153, -202, -165, -192, -243, -48, -101, -104, -227, -7, -2, +166, +218, +108, +82, +169, 251, -89, -247, -78, -15, -196, -104, -145, -132, -227, -241, -32, -123, -189, -204, -15, -85, -122, -16, -48, -18, -32, -112, -140, -18, -201, -173, +180, 142, -241, -171, -30, +192, 99, -226, -120, -65, -245, -163, -68, -62, -21, -156, -106, -193, -17, +38, +155, +191, 140, -255, -2, -69, -100, +217, +44, +105, 95, -12, -152, -68, -40, -180, -177, +149, +14, +15, +225, +250, +250, +234, +61, +133, +43, +234, +170, +6, +22, +101, +230, +202, +77, +20, 123, -84, -247, -226, -182, -211, -203, -92, -212, -24, -39, -226, 228, -23, -220, -252, -119, +123, +163, 239, +187, +171, +93, +241, +251, +174, +2, +49, +189, +242, +151, +127, +183, +55, +120, +246, +73, +77, +221, 190, -99, -226, -222, -212, -88, -207, -46, -97, -122, -197, -208, -232, -95, -75, -29, -142, -209, -52, -140, -22, -6, -254, -203, -21, -15, -71, -76, -182, -194, -178, -111, -10, -3, -41, -112, -16, +236, +126, +190, +30, +92, +118, +62, +221, +189, 225, +172, +160, +90, +110, +207, +4, 195, -179, -225, -231, -31, -99, -70, -15, -92, -13, +237, +221, +206, +59, +215, +119, +157, +94, +218, 241, -17, -229, -115, -149, -158, -72, -117, -193, -76, -197, -176, -102, -16, +157, +113, +199, +94, +247, +243, +151, +108, +194, +247, +198, +253, +62, 117, -84, -170, -85, -50, -132, -245, +47, +47, +211, +110, +31, +12, +186, +93, +118, +251, +119, +131, +235, +175, +87, +31, +59, +189, +190, +213, +2, +169, +227, 101, -4, +231, +238, +46, +223, +209, +100, +129, +212, +241, +226, +230, +174, 111, -79, -169, +181, 188, -60, -152, -20, -35, -106, -254, -149, -160, -248, -132, +238, +93, +231, 106, -55, -170, -26, -202, -121, -157, -121, -148, -227, -121, -163, -35, -155, -195, -125, -14, -249, -116, -130, +112, +213, +238, +94, +91, +1, +73, +189, +238, +58, +191, +222, +89, +65, +72, +189, +186, +87, +237, +207, +29, 123, -152, -248, +16, +175, +59, +127, +187, 236, -131, +94, +119, +172, +246, +128, 58, -193, -108, -170, -89, -150, -200, -99, -80, -163, +126, +186, +185, +206, +160, +252, +131, +105, +175, +243, +155, +203, +155, +236, +124, +253, +209, +180, +219, +215, +235, 139, +78, +175, +0, +231, +159, 76, -205, -242, +187, +210, +57, +75, +187, +253, +187, +49, +58, +97, 198, -134, -100, -190, -5, +220, +2, +255, +108, +218, +15, 79, -27, +75, +218, +235, +63, +140, +15, +74, +231, +174, +157, 109, -104, +249, +134, +147, +98, +164, +213, +153, +120, +238, +199, +208, +93, +230, +53, +58, +42, +93, +20, +127, +125, +152, +72, +15, +242, +16, +154, +96, +238, +107, +244, +150, +24, +173, +38, +44, +120, +240, +34, +76, +124, +180, +211, +47, +25, +29, +159, +82, +150, +83, +45, +235, +194, +139, 224, -167, -163, -196, -178, -247, -161, +45, +192, +197, 245, -171, -109, 233, -204, -35, -19, -176, -245, -172, -94, -51, -184, -199, -190, +215, +186, +185, +8, +18, +31, +140, +50, +1, 112, -205, -194, -194, -3, -237, -14, -95, -111, -88, -251, -177, -243, +171, +102, +249, +153, +153, +69, +244, +127, +51, 188, -251, -177, -5, -148, -195, -183, +204, +12, +78, +155, +73, +85, +223, +56, +229, 237, -141, -113, -42, +26, +203, +24, +206, +147, +28, +172, +148, +61, +98, +227, +81, +165, +219, +219, +89, +236, +179, +129, +180, +124, +27, +48, +162, 167, +57, +40, +78, +198, 192, -221, +127, +97, +75, +147, +188, +200, +186, +101, 195, -77, -81, -60, -228, +120, +201, +38, +58, +40, +102, 134, -147, -98, -206, -94, +225, +34, +48, +177, 150, -67, -206, -64, -241, -218, -207, -0, +235, +118, +13, +99, 69, -138, +79, +115, +80, +156, +160, +234, +195, +137, +6, +15, +210, 15, +71, 94, -67, -18, -187, -226, -147, -206, -112, -17, -40, -55, -179, -167, -56, -235, -215, -37, -49, -53, +98, +144, +76, +123, 173, -37, -233, +67, +62, +7, +95, +51, +213, +217, +214, +166, +60, +100, +225, +45, +114, +186, +11, +38, +232, +39, +106, +129, +181, 245, -126, -80, -165, -4, -133, -131, -224, -138, +30, +205, +163, +109, +125, +206, +67, +227, +109, +230, +60, +13, +200, +124, +52, +74, +208, 57, -90, -197, -159, -28, -249, -243, -172, -184, +3, +35, +99, +77, +132, +113, +246, +89, 111, -226, -92, -56, -91, -215, -38, +252, +109, +223, +12, +220, +33, +31, +251, +69, +44, +7, +108, 102, -187, -158, -231, 75, -225, -133, -249, -246, -227, -63, -70, -10, -53, -74, -204, -216, -64, -154, -206, -248, -151, -140, -50, -101, -146, -72, -5, +57, +56, +19, +67, +199, +126, +212, +167, +11, +114, +55, +221, +14, +222, +62, 244, -228, -196, -180, -103, -130, -161, -76, -204, -218, +93, +106, +191, 128, -164, -94, -250, -99, -30, -79, -139, -121, -5, -12, -177, -16, -122, +47, +11, +204, +226, +152, +247, 84, -200, -177, -92, -136, -22, -43, -143, -106, -13, -27, -54, -120, -93, -178, -220, -176, -195, +183, +109, +5, +174, +35, 169, -144, -83, -2, -17, -44, -71, -89, +227, +70, +199, +9, +32, +243, +130, +69, +184, +136, +115, 133, -189, -31, -14, -27, -74, -232, -67, -96, +168, +92, 153, -96, -110, -120, -93, -214, -196, -188, -10, -104, -121, -54, -24, -105, +72, +67, +158, +97, +175, +103, +107, +7, +172, +7, +69, +166, +243, +4, +112, +90, +60, +0, +197, 230, -124, -80, -192, -21, -107, +205, +82, +127, +103, +62, +247, 151, +152, +94, +98, +129, +121, +22, 236, -108, -35, -37, -141, -27, -37, -65, -51, -181, +19, +135, +111, +129, +104, +171, +219, +75, 58, -236, -67, +83, 179, -93, -132, -201, -72, -95, -223, +203, +34, 180, +31, +149, +125, +228, +40, +12, +35, +35, +39, +24, +196, +190, +148, 115, -85, +3, +172, +192, +221, +29, +36, +161, +110, +222, +48, +114, +138, +147, +237, +15, +71, +102, +202, +100, +44, +20, +6, +132, +57, +73, +163, +160, +158, +145, +7, +220, +101, +77, 126, +12, +169, +54, +121, +43, +48, +170, +102, +162, +1, +72, +3, +207, +221, +201, 19, -77, -244, -238, -165, -20, -231, -111, +109, +189, +178, +166, 107, -84, -156, -191, -171, -83, -113, +218, +234, +163, +70, +16, +168, +250, +142, +150, +64, +164, +217, +242, +185, 94, -18, -83, -166, -58, -233, -82, -42, -176, -183, -53, -40, +168, +217, +32, 149, -223, +145, +251, +228, +37, +71, +179, +209, +0, +203, +235, +62, +239, +211, +36, +115, +117, +115, +209, +25, +244, +239, +218, +119, +221, +115, +43, +189, +62, +245, +251, +175, +238, +117, +231, +170, +208, 213, +68, +69, +79, +93, +123, +221, +207, +221, +11, +43, +251, +3, +117, +59, +255, +210, +238, +181, +207, +243, +118, 160, +13, +214, +4, +27, +133, +116, +49, +199, +107, +78, +37, +109, +83, 84, -126, -95, -159, -82, +1, +7, +163, +250, +138, +88, +205, +32, +176, +137, +203, +89, +239, 185, +33, 36, -154, -77, -181, +135, +202, +60, +250, +206, +136, +60, +130, +117, +15, +143, +188, +170, +179, +232, +27, +242, +32, +204, 187, -229, -116, -133, -37, -129, +33, +58, +34, +88, +80, +141, +10, +12, +105, +198, +19, +22, +115, +222, +62, +242, 50, -85, +140, +167, +222, +56, 161, -150, -215, -129, -86, -84, -59, -219, -198, -120, -110, -34, -225, -245, -214, -57, -40, -9, -81, -61, -234, -180, -90, -129, -169, -65, -221, -84, -215, -118, +128, +93, +140, 85, -215, -27, -213, -7, -73, -61, -74, -154, +75, +30, +37, +185, +212, +147, +88, +44, +24, +40, +196, +1, 26, -225, -169, +108, +207, +117, +33, 71, +204, +253, +40, +209, 21, -82, -19, -64, -245, -233, -27, -234, -5, -168, -30, -65, -191, -94, -152, -106, +177, +79, +97, +190, +103, +226, +95, +126, +151, +253, +134, +250, +95, +132, +115, +232, +185, +156, +249, 147, -174, -235, -5, -171, -14, -145, -182, -38, -136, -234, +22, +64, 145, -77, -107, +11, +67, +73, +112, +135, +56, +151, +155, +95, +30, 2, -166, -70, -249, -176, -86, -136, -14, -8, -76, -99, +59, +101, +127, +92, +229, +50, +73, +58, +120, +145, 137, -170, -237, -96, +76, +185, +16, 96, +196, +193, +99, +196, +25, +183, +57, +248, +250, +73, 151, -217, -122, -32, -217, -163, -50, -198, -34, -6, -150, -53, -160, -155, -194, -61, -63, -178, -222, -203, -139, -133, -235, -197, -89, -54, -206, -84, -49, -186, -35, -44, -149, -7, 190, -184, -254, -219, +132, +201, +177, 77, -187, +22, +115, +135, +89, +244, +9, +151, 223, -95, +134, +209, +253, +191, +252, +174, 141, -254, -188, -8, -31, -230, -232, -241, -63, +81, +3, +143, 78, -231, -72, -157, -129, -237, -198, -255, -208, -190, -58, -47, -76, -160, -194, -58, -63, -56, -129, -91, -207, +20, +80, +234, +66, +55, 12, +126, 159, -187, +168, +84, 133, -241, -57, -101, -231, -31, -62, -195, -203, -120, -83, -203, -248, -87, -215, -183, -103, -159, -211, -225, -127, +108, +150, +37, +96, +128, 213, -161, -182, +243, 104, +20, +172, +121, +185, 84, -173, -60, -246, -77, -167, -253, -159, -233, -208, -127, -124, -245, -127, -108, -176, -122, -209, -189, -236, -222, -166, -157, -255, -148, -161, -245, -205, -133, -55, -243, -146, -173, -192, -181, -56, -122, -12, -43, -110, -57, -177, -204, -169, -77, -61, -101, -133, -0, -204, -209, -206, -240, +9, 195, -105, -115, -146, -6, -253, +97, +44, +250, +68, +229, +45, 207, +68, +31, +68, +95, +199, +245, +70, +170, +119, +44, +30, +195, +232, +59, +38, +25, +144, +45, +49, +92, +36, +41, +60, +209, +2, 157, -139, -143, +106, +49, +125, +184, +235, +141, 41, -76, -255, -102, -190, -160, -207, -221, -79, -159, -87, -122, -255, -217, -160, -183, -210, -113, -245, -47, -219, -23, -23, -171, -215, -163, -63, -67, +225, +70, +146, 15, -235, -188, +161, +21, +39, +99, +239, +9, 182, -236, -100, -26, -162, -101, -1, -255, -54, -72, +117, +250, +219, +91, +116, +45, +197, +20, +165, 11, -171, -198, +202, +236, +142, +30, +55, +184, 190, +147, +121, +20, +98, 236, -156, -119, -191, -92, -174, -222, -143, -75, -233, -122, -139, -89, -113, -244, -24, -83, -7, -38, -187, -227, -157, -213, +52, +165, +36, 192, -23, -237, -222, -167, -206, -234, -181, -184, +106, +128, +111, +85, +169, +128, +229, +80, +242, +22, +168, +84, +113, +170, +108, +103, +50, +197, +208, +42, +138, +200, +34, +200, +216, 0, -154, +141, +201, +227, +56, +114, +68, +15, +231, +135, +225, +156, +3, +138, +150, +158, +244, +49, +174, +63, 34, -139, -195, -222, -78, +44, +104, +196, +89, +185, +149, +54, +104, +58, +121, +127, +81, +202, +120, +114, +3, +123, +21, 165, -131, -110, -226, 198, -3, -127, -206, -35, -67, -95, -135, -197, -234, -176, -35, -28, +246, +52, +113, +158, +14, +56, +219, +118, +200, 212, -141, -28, -191, +145, +204, +130, +159, +167, +97, +248, +93, +44, +230, +105, +132, +150, +218, +85, 133, -229, +69, +78, +61, +130, +215, +8, 207, -37, -161, -102, -29, -43, -150, -225, -64, -239, -206, -243, -1, -65, -125, -52, +61, 93, -101, 63, -216, -69, +111, 6, -205, -57, -192, -7, -143, -237, -141, -10, -187, -113, -124, +59, +75, +115, +241, +133, +210, +241, +189, +42, 172, -171, -219, -87, +186, +120, +168, +202, +196, +178, +54, +104, +231, +209, 65, -159, -86, -169, -228, -158, -30, -140, -194, -144, -98, -149, -219, -77, -251, -224, -207, -211, -134, -232, -40, -184, -146, -224, -11, -36, -1, -204, +103, +68, +131, +112, 4, -128, -78, -136, -172, -139, +142, +55, +74, 4, -18, -76, -185, -100, -127, +124, +71, +20, +247, +95, +133, +4, +58, +178, 134, -169, +36, +125, +129, +194, +44, +238, +159, +134, +160, 224, -46, -169, -111, +221, +180, +248, +43, +125, +87, +198, +151, +190, 1, -20, +123, +82, +206, +7, +126, +180, +136, +232, +82, +230, +22, +29, +75, 41, -131, +190, +105, +92, +91, 103, -16, -31, -164, -61, -138, -116, -150, -42, -21, -38, -165, -227, -184, -25, -127, -101, -116, -200, -123, -138, -36, -218, -144, +253, 104, -75, -45, -33, +218, +0, +85, +220, 37, -126, +24, +162, +20, +78, +27, +48, +75, 229, -215, -65, -222, -186, -161, -191, -156, -79, -195, -192, -96, -55, -42, -70, -29, -165, -51, -233, -160, -121, -117, -120, -79, -214, -11, -249, -109, -136, -224, -41, -231, -128, 144, -45, -174, -169, -176, -163, -61, -175, -170, -190, -200, -163, -149, -160, -255, -50, -177, -71, -107, -252, -99, -166, -89, -124, -99, -88, -199, -135, -194, -142, -156, -52, -230, -200, -9, -68, 90, -227, -47, -195, -172, -231, +26, +182, +125, +216, +171, +214, +16, +168, +220, 234, -170, -135, -248, -126, +145, 75, -183, -133, -65, -138, -18, -203, -26, -121, -201, -79, -177, -128, -239, -56, -149, +112, +157, +200, +21, +210, 137, -3, +146, +233, +41, 15, -59, -102, -195, -164, -250, -168, -58, -204, -62, +47, 78, -253, -5, -61, -76, -29, +128, +50, +60, +32, +165, +254, 143, -85, -144, -70, -185, -146, -170, +179, +63, +99, +86, +211, +172, +160, +114, +46, 73, -136, +16, +150, +99, +246, +48, +95, +243, +44, +140, +19, +204, +94, +19, +47, +0, +169, +234, +242, +235, +103, +5, +227, +94, +129, +88, +207, +129, +224, +251, +165, +54, +173, +25, +203, 217, -214, -177, -110, -92, -22, -40, -145, -249, +166, 109, -218, -110, -15, 179, -237, -207, -36, -220, -36, -23, -121, -147, -247, -165, -35, -15, -75, -101, -130, -242, -151, -116, -158, +192, +72, +137, +13, +222, +135, 241, -61, -40, -229, -151, -144, -225, -67, -41, -224, -104, -138, -125, -68, -58, -148, -49, -188, -228, -16, -162, -28, -227, -118, -99, -68, -167, -102, -119, +173, +176, +201, +122, +24, +21, 63, -148, -73, -41, -121, -196, -98, -222, -74, -206, -134, -244, -18, -1, -59, -129, -105, -103, -84, 249, -36, -113, -66, -49, -134, -42, -187, -168, -10, +51, +188, +186, +234, +27, +225, +3, +25, +127, +139, +164, 235, -211, -24, -42, -23, -247, -166, -192, +29, +124, +185, +128, +231, +80, +255, +98, +189, +178, +38, 109, -52, -100, -175, -130, +120, 171, -205, -206, -216, -60, -158, -130, -19, -239, -100, -231, +123, 164, -84, -66, +231, +41, +131, +253, +166, +13, +124, +5, 204, -8, -24, -179, -112, -102, -73, -75, -208, -194, 211, -176, -209, -97, -19, -92, +32, +192, +20, +197, +113, +134, 251, -211, -216, +32, +228, +175, +165, +198, +187, +250, +84, +6, +225, +205, 152, -43, -25, -186, +7, 87, -95, -219, -23, -221, -243, -193, -215, -235, -238, -89, -38, -146, -188, -81, -178, -78, -119, -92, -12, -142, -243, -2, -74, -96, -150, +209, +77, +179, +44, +113, 21, -30, -206, -199, -156, -62, -45, -161, -92, -117, -126, -187, -93, -157, -229, -221, -186, -156, -103, -34, -117, -96, -189, -135, +101, +16, +94, +175, +245, +208, +178, +84, +25, +193, +207, +3, +10, +61, +32, +151, +223, +214, +129, +228, +177, +226, +100, +145, +166, +17, +239, +250, +109, +120, +47, +46, +110, +174, +239, +68, +191, +115, +39, 238, -117, -94, -220, +190, +116, +251, +162, +123, +45, +58, +191, +116, +122, +127, +23, +159, +122, +237, +171, +142, +128, +6, +208, 80, -197, -90, -14, -148, -103, -30, -115, +142, +28, +228, +165, +82, +198, +219, +89, +82, +16, +255, +34, 8, -108, +168, +58, +124, +144, +38, +135, +103, +150, +148, +24, +37, +87, +98, +26, +46, +74, +149, +180, +131, +49, 230, +82, +70, +223, +214, 56, -40, -47, -130, +203, +123, +76, +32, +180, +12, +23, +81, +145, +147, +85, +149, +142, +30, +81, +68, +68, +182, 13, -33, -154, -59, +69, +137, +57, +240, +141, +30, +214, +28, +224, +104, +49, +157, +214, 153, -245, +48, +66, +204, +89, +153, +3, +87, +201, +204, +106, +91, +125, +109, +243, +230, +17, +247, +165, +197, +142, +225, +50, +221, +129, +2, +246, +250, +154, +135, +89, +1, 184, -177, -236, -28, -185, -186, -122, -149, -248, -35, +20, +59, 83, -96, +159, +41, 183, -155, -255, +36, +25, +81, +195, +189, +158, +224, +26, +78, 112, -39, -95, -109, -192, -149, -161, -237, +89, +139, 119, -236, -59, -147, -120, -51, +89, +226, +185, +190, 119, -101, -27, -164, -22, -2, -230, -102, -222, -239, -104, -243, -230, -225, -174, -213, -23, -110, -31, -240, -21, -229, -70, -230, -179, 118, -242, -186, -246, -141, -193, -99, -68, -85, -143, -163, -149, -226, -135, -69, +7, +120, +21, +222, +146, +12, 249, -136, -78, -127, -214, +62, +141, 234, -2, -19, -88, -68, -7, +250, +236, +194, +172, +32, +15, +206, +132, +158, +25, +55, +150, +39, 63, -100, -149, -178, +67, +157, 138, -108, -94, -82, -33, -149, -218, -88, -2, -107, +167, +178, +229, 113, -184, -82, -18, -36, -207, -242, +17, +63, +56, +6, +19, +189, +195, 105, -221, -180, -41, -197, -98, -81, -53, -233, -184, -129, +7, +202, 187, -247, -173, -46, -106, 197, -39, -11, -54, -105, -114, -96, -251, -29, -129, -208, -72, -26, -140, -70, -207, -238, +135, +144, +245, +60, +173, +52, +85, 165, -227, -5, -23, -33, -102, -81, -200, -142, -108, -246, -157, +50, +151, +34, +2, +97, +133, 169, -242, -11, -71, -122, -243, -193, -137, +167, 185, -38, +158, +51, +203, +97, +151, +14, +166, +215, 173, -47, -241, -34, -114, -225, +210, +70, +176, +70, +104, 2, -37, -55, -235, -33, -141, -53, -96, -84, -24, -105, -199, -88, +251, +202, +210, +43, +64, +242, +115, +57, +89, 162, -13, -124, -24, -29, -237, -88, -72, -151, -106, +121, +159, 128, +220, +161, +90, +71, +42, +134, +228, +170, +164, +90, +122, +250, +220, +249, +217, +8, +94, +169, +67, +180, +103, +79, +131, +149, +40, +137, +236, +230, +79, +49, +165, +14, +214, +137, +113, +67, +170, +204, +144, +22, +4, +44, +170, 51, -187, -142, -173, -240, -11, -244, +144, +189, +85, +245, +231, +78, +168, +182, +157, +230, +219, +81, +46, +247, +162, +28, 167, -139, -164, +43, +110, +48, +95, +40, 78, -148, -147, -85, +176, +137, +92, +233, +180, +51, +20, +21, +142, +105, +103, +116, +11, +206, +178, +9, +160, +133, +74, +219, +82, +38, +46, +163, +17, +15, +137, +13, +169, +67, +8, +117, +170, +190, 14, -155, +213, +61, +36, +212, +13, +23, +158, +159, +156, +122, 193, -8, -148, +58, +234, +202, +28, +144, +253, 121, -177, -165, -100, -198, -180, -104, +90, +116, +168, +163, +190, 3, -21, -104, 66, -5, -115, -154, -219, -152, -0, -137, -151, -113, +77, +72, +193, +227, +39, +172, +135, 34, -103, -167, -223, -134, +149, +63, +110, +23, +44, +24, +115, +4, +81, +126, +38, +135, 209, -221, -191, -252, -1, -103, -157, -68, +64, +54, +52, +233, +254, +132, +38, +22, +32, +7, +169, +223, +128, +53, +11, +190, +63, +47, +14, +181, +163, +143, +146, +104, 225, -98, -46, -194, -185, -228, -42, -235, +250, +186, +115, +20, 177, +244, +213, +62, +144, +215, +71, +110, +47, +113, +250, 56, -129, -51, +219, +15, +145, +206, +174, +30, +77, +96, +8, 64, -9, -129, -176, -196, +46, +7, +154, +199, +58, +68, +39, +78, +78, +103, +225, 3, -240, -135, +215, +80, +166, +231, +36, 45, -33, -19, +68, +50, +4, +89, +86, +38, 44, -165, -25, -11, -104, -131, -9, -26, -37, -6, -224, -70, -146, -129, -166, -134, -148, +218, +226, +145, +159, +160, +2, +51, 194, -81, -141, -164, -132, +212, +153, +185, +18, +203, +37, +239, +234, +94, +61, +78, 86, -236, -41, -221, -124, -182, -177, -241, -34, -160, -76, -135, -20, -100, -152, -96, -249, +174, +178, +200, +102, 223, -8, -103, -197, -228, 132, -17, -215, -68, -247, -164, -78, -110, -56, -117, -128, -63, -15, -104, -92, -2, -251, -13, +39, +193, +53, +182, +22, 229, -241, -183, +10, +13, +213, +231, +174, +98, +33, +165, +193, +195, +133, +3, +21, +248, +35, +153, +126, 210, -227, -113, -149, -245, -1, -1, -181, -155, +118, +29, +86, +200, +60, +208, +224, +220, +94, +147, +229, +24, +199, +136, +215, 27, -69, -112, +249, +50, +152, +36, +83, +160, 7, -107, +43, +117, +157, +80, +41, +245, +143, +197, +108, +78, +167, +70, +105, +251, +173, 47, +126, +85, +231, 153, -221, -67, -170, -166, -178, -127, -138, -211, -167, -148, +45, +248, 177, -48, -162, -141, -176, -79, -80, -65, -101, -66, -69, -126, -12, -157, -90, -19, -183, -159, -55, -106, -40, -49, -183, -184, -199, -217, -203, -181, -124, -65, -128, 115, -185, -173, -79, -189, -235, -47, -55, -131, -179, -246, -197, -69, -62, -62, +158, 49, -164, -89, -74, -137, -6, -207, -10, -255, -250, 68, -150, -25, -228, -125, -78, -176, -201, -18, -221, -220, -59, -145, -161, -192, -87, -188, -18, +114, +27, +97, +69, +211, 135, -221, -56, -124, -5, -104, -90, -224, -132, -86, -118, -176, -64, -246, -183, -102, -226, -223, -186, -207, -240, -195, -47, -101, -184, -158, -79, 50, -201, -35, -228, -73, -124, -148, -17, -20, -195, -208, -188, -168, -145, -39, -31, -48, -58, -168, -230, -151, -151, -234, -109, -47, -146, +235, +96, +121, +29, +30, +78, +156, 112, -224, -140, -70, -114, -158, -12, -254, -185, -240, -12, -178, -108, -169, -84, -195, -37, -43, +217, +181, +244, +133, +3, 54, +126, +148, +48, +79, +85, +212, 135, -133, -84, -151, -84, -124, -92, -17, -14, -74, +113, +145, +43, 103, -132, -32, -20, -149, -149, -92, -211, -146, -190, -39, -185, -243, -159, -11, -25, -227, -99, -117, +110, +175, +165, +160, +115, +5, +16, +120, 210, -246, -147, -55, -227, -95, -145, -146, -143, -146, -200, -127, -51, -42, 229, -230, -205, -15, -157, -97, -9, -172, -178, -245, -224, -242, -11, +23, +213, +36, +42, +55, +151, +29, 199, -127, -101, -250, -136, -81, -236, -118, -250, -80, -82, -38, -46, -94, -231, -80, -226, -57, -227, -119, -121, -37, -251, -238, -112, +106, 169, -158, +182, +162, +64, +17, +174, +218, +69, +217, +35, +115, +91, +202, 231, -184, -197, +228, +76, +69, +168, +212, +228, +73, +30, +56, +88, +217, +76, 37, -31, -165, -47, -225, -209, -45, +145, +167, +95, +227, +51, +65, +38, +67, +32, 161, -98, -43, +104, +24, +72, +141, +27, +154, +117, +15, +208, +154, +67, +71, +135, +58, +149, +160, +169, +205, +120, +71, +173, +10, +97, 44, -190, -249, -210, 45, -204, -149, -232, -181, -69, +110, +95, 11, -124, -43, -98, +234, +166, +121, +45, +229, +22, +178, +95, +23, +171, +162, +110, 96, -28, -168, -20, -55, -129, -82, -202, -74, -227, -0, -86, -154, -221, -59, -154, -130, -19, -114, -13, +232, +249, +72, +40, +225, +161, +27, +35, +175, +235, +208, +160, +186, +250, +35, +242, +8, +15, +196, 23, -30, -28, -59, -204, -125, -142, -223, +17, +25, +196, +52, +88, +49, +21, +243, +10, +194, +104, +134, +143, +72, +38, +39, 41, +113, +28, +117, +246, +222, +76, +166, +9, +45, +35, 214, -6, -23, -69, -241, -195, -192, -252, -0, -215, +220, +207, 129, -155, -26, -6, -112, -114, -57, -59, -33, -18, -139, -251, -208, -115, -117, -109, -113, -92, -60, +158, +34, 239, -62, -238, -30, -230, -246, -122, -96, +60, +46, +154, +221, +79, +2, 101, -59, -214, -82, -21, -233, -208, -51, -206, -143, -104, -187, -167, -212, -217, -56, -253, -123, -29, -219, -201, -51, +234, +243, +70, +111, +149, +41, 150, -217, -58, -47, +44, +240, +37, +14, +66, +147, +158, +96, +219, +24, +226, +169, +122, +57, +76, +145, 152, -47, -128, -2, +74, +85, +233, +102, +239, +150, +164, +142, 197, -131, -41, -160, -140, -72, -202, -22, -189, -225, -103, -250, -61, 211, -52, -11, -234, -41, -228, -61, -254, -125, -194, -216, -29, -47, -34, -42, -1, -150, -195, -114, -136, -154, +172, +51, +243, +146, +68, 215, -82, -214, -49, +5, +229, +180, +137, +25, +55, +28, +115, +209, +75, +205, +88, +146, 220, -159, +173, +10, +169, +195, 189, -139, -35, +57, +47, +242, 155, -226, -206, -168, -162, -85, -99, -22, -58, -174, -71, -64, -87, -5, -61, -37, -30, -128, -183, -15, -150, -186, -204, -214, -3, -166, -169, +92, +142, 115, -35, -231, -33, -176, -70, +77, +172, +158, 97, -225, -33, -89, -157, +21, +113, +52, +203, +43, +201, +60, +53, 255, -191, -144, -148, +192, +192, +232, +30, +176, +13, +83, 175, -16, -127, +254, +110, +117, +249, +65, +109, +219, +98, +204, +94, +75, +35, +30, 251, -9, -228, -66, +102, +55, +232, +127, +183, +130, +27, +62, +250, +48, +95, +124, +164, +120, +120, +61, +243, +229, +247, +85, +157, +245, +35, +216, +221, +58, +188, +15, +127, +199, +94, +102, +236, +88, +118, 130, +133, +71, +245, +155, +4, +124, +12, +60, +68, +191, +39, 16, -228, +241, +163, 75, -147, +236, +249, +254, +189, +21, +115, +206, +123, +4, +145, +224, 204, -109, -225, -240, -31, +198, +128, +82, +246, +117, +51, +132, +106, +155, +71, +99, +206, +185, +110, 101, +10, +116, +53, +163, 138, -101, -255, +209, +155, +167, +49, +241, +126, +12, +195, +89, +222, +237, +241, 23, -78, -130, -196, -41, -164, -78, -196, -221, +15, +61, 208, -148, -248, -90, -5, -152, -200, -56, -241, -102, -50, -43, -138, -64, -97, -134, -30, -28, -84, -219, -213, -16, -39, -106, +186, +170, 200, +180, +185, +223, +99, +136, 181, -30, -156, -97, -101, -200, -43, +168, 177, -171, -121, +78, +119, +161, +22, +180, +137, +223, +35, +246, +84, 142, -12, -185, -213, -76, -199, -118, -245, -229, -226, -194, -108, -176, -95, -115, -131, -189, -173, -58, -216, -31, -115, -131, -189, -171, -58, -216, -159, -114, -131, -189, -175, -58, -216, -191, -229, -6, -251, -213, -118, -176, +138, +204, +140, +208, +48, +152, +141, +19, +109, 45, -226, 154, -150, -138, +95, +95, +4, +110, +204, +217, +39, 57, -100, -174, -192, -242, -179, -80, -109, 193, -216, -22, -84, -40, -89, -149, -239, -149, -122, -238, -236, -19, -131, -46, -208, -168, +248, +201, +130, +221, +175, +196, +199, +254, +173, +184, +139, +36, +150, +156, +237, +38, +44, +255, +235, +2, +217, 88, -125, -181, -25, -186, -66, -13, -243, -204, -147, -70, -140, -200, +124, +88, +124, +195, +9, 244, -136, -69, -57, -126, -223, 122, -179, -182, +238, +217, 21, -146, -39, -58, -206, -185, -207, -245, -180, -219, -195, -228, -40, -151, -177, -61, -153, -88, -169, -189, -78, -117, -165, +3, 137, -83, -165, +63, +233, +189, +1, +113, +225, +44, +102, +190, +134, +245, +200, +132, +26, +55, +28, +209, +141, +99, +37, +42, +30, +250, 89, -179, -204, -247, -244, -96, -218, -46, +72, +222, +27, +156, +165, +145, +52, +171, 0, -253, -203, -6, +82, +162, +186, +219, +22, +148, 140, -1, -11, -188, -17, -51, -9, -61, -21, -238, -92, -204, -61, -64, -236, -166, -235, -74, -247, -103, -5, -217, -207, -252, -95, -212, -180, -236, -2, -202, -188, +8, +231, +187, +152, +100, +110, +165, +114, +164, +226, +223, +77, +136, 128, -123, -78, -38, 60, -239, -124, -108, -127, +137, +97, +53, +221, +28, +16, +53, +137, +125, +232, +190, 185, -184, +72, +36, +129, +49, +64, +7, +129, +1, +60, +213, +9, +236, +102, 93, -171, -144, -46, -39, +89, +213, +148, +67, +158, +4, +57, 11, +184, +125, +160, +34, +6, +126, +89, +251, +9, 223, -137, -82, -213, -13, -150, -50, -3, -154, -134, -32, 210, -31, -177, +174, +130, +193, +36, +15, +219, 129, -159, -94, -110, +2, +64, +242, +148, +217, +144, +104, +124, +164, +43, +89, +172, +40, +167, +19, +251, +30, +174, +86, +235, +80, +65, +181, +211, +187, +37, +158, +15, +248, +156, +49, +70, +47, +216, +22, +226, +68, +203, +70, +174, +153, +6, +203, +108, +123, +215, +129, +169, +81, +203, +50, +145, +33, +124, +23, +45, +85, +229, +155, +157, +121, +38, +35, +207, +9, +38, +190, +92, +141, +126, +43, +36, +44, +174, +21, +87, +43, +0, +90, +197, +99, +215, +82, +122, +113, +173, +144, +192, +4, +30, +28, +50, +137, +193, +169, +169, +131, +48, +21, +71, +28, +140, 22, -114, -128, -235, +67, +111, +84, +106, +220, +42, 119, -86, -157, -245, -212, -81, -231, -73, -60, -228, -52, -129, -65, -139, -229, -27, -198, -141, -86, -237, -216, -76, -211, -190, 184, -237, -94, -174, -57, 239, -21, +160, 231, -153, -205, -128, -143, -117, -128, -191, -95, -162, -237, -123, -65, -226, -11, -174, -144, -171, -72, -194, +124, +165, +251, 219, -1, -55, -43, -146, -200, -29, -210, -59, -97, -183, -210, +94, +184, +94, +40, +120, +32, +113, +18, +227, +25, +127, +203, 47, -87, -221, -255, +168, +233, +227, +175, 250, -210, +206, +163, +240, +193, +115, 89, -245, -74, -45, -0, -64, -92, -103, -24, +51, +227, +208, 160, -195, -167, -164, -12, +49, +255, +64, +131, 181, -99, -70, -112, -65, -145, -70, -111, -60, -190, -92, -229, -170, -158, -32, -2, -111, +52, +123, 64, -230, -216, -160, -171, -63, -108, -213, -103, -50, -163, -60, -161, -171, -111, -202, -202, -85, -85, -245, -141, -16, 15, -120, -50, -67, -79, -185, +62, +253, +140, +44, 2, -48, -117, -57, -214, -7, -236, -204, -104, -10, -196, -54, -11, -103, -5, -16, -70, -78, -48, +38, +234, +158, 176, -5, -227, -208, -5, -208, -251, -52, -102, -165, -107, -128, -154, +61, +136, +120, +91, +74, +166, +156, 127, -46, -140, -195, -137, -236, -233, -39, -227, -50, -63, +162, +85, +172, +196, +18, +221, +230, 91, -122, -139, -54, -92, -114, -254, -160, -212, -10, -105, -202, -251, +66, +91, +70, +248, +247, +150, +152, +121, +79, +130, +172, +152, +200, +166, 161, -28, -133, +11, +134, +230, +31, 200, -223, -135, -129, -84, -70, -1, -229, -18, -142, -80, -199, +167, +4, 173, -156, -35, -88, -130, -47, -138, -42, -162, -171, -55, -198, +234, +184, +158, +116, +0, +120, +234, +23, +9, +122, 178, -236, -113, -131, -91, -186, -38, -147, -162, -255, -13, -175, -88, -25, -4, -244, +89, +189, +246, 204, -226, -196, +101, +24, +169, +124, +1, +168, +242, +82, +76, +140, +6, +189, +112, +247, 147, -44, -108, +181, +85, +138, +97, 107, -23, -81, -123, -135, -36, -53, +129, +181, +240, +113, +206, +92, 20, -136, -170, -198, -17, -74, -214, +10, +218, +196, +181, +105, +119, +119, 222, -72, -104, -59, -25, -132, -202, -165, -193, -158, -17, -89, -115, -75, -98, -70, -78, -73, +190, +22, +111, +12, 47, -11, -174, -187, -148, -33, +78, +164, +139, +60, +65, +7, +235, +79, +55, +61, +96, +192, +149, +75, +249, +91, +212, +71, +226, +10, +168, +66, +22, +199, +166, +48, +68, +168, +83, +35, +95, +121, +82, +181, 37, -44, +106, 224, -172, +24, +109, +216, +195, +101, +34, +227, +255, +245, +22, +198, +197, +223, +223, +160, +79, +16, +87, +109, 84, -73, -29, -58, -50, -32, -39, -187, -205, -111, -174, -76, -247, -86, -151, -178, -226, +172, +157, +182, +74, +179, 217, -197, -168, -132, -158, -132, -232, -174, -61, -240, -230, -132, -55, -239, -155, 204, -96, -231, -160, +67, +101, +31, +72, +68, +49, +121, +74, +16, +176, +222, +24, +43, +167, +208, +119, +200, +2, +50, +0, +122, +2, +246, +214, 133, +239, +124, +233, +96, +77, +154, +185, 227, -56, -206, -106, -145, -149, -82, -91, -22, +69, +196, 128, -223, -25, -68, -174, -232, +250, +114, +156, +48, +107, +207, +222, +176, +100, +160, +129, +229, +133, 145, -253, -83, -150, -186, -136, +43, +163, +183, +98, +30, +66, 175, -173, -193, -190, +184, +4, +217, +211, +216, +105, +202, +111, +66, +221, +40, +181, +25, +27, +246, +160, +76, +82, +69, +117, +236, +26, +87, +86, +42, +224, +31, +225, 254, -208, -118, +242, +238, +186, +234, +192, +148, +242, +225, +83, 103, -25, -99, 189, -5, -14, -145, -131, -71, -233, -69, -73, -111, -60, -6, +97, +76, +175, +30, +224, +50, +58, +117, +78, +173, 108, -170, -131, -2, -156, -22, -114, -91, -105, -137, -239, +147, +128, +185, +231, 60, -229, -106, -244, -33, -8, -125, -255, -131, -83, -100, -137, -144, -251, -174, -240, -16, -132, -152, +90, +60, +205, +168, +73, +87, 224, -223, -137, -140, -31, -3, -6, +226, +32, +103, +226, 2, -123, -16, -10, -28, -241, -141, +47, +134, +150, +250, +125, +47, +73, +124, +20, +254, +93, +224, +1, +90, 32, -184, -35, -171, -172, -43, -190, -157, +58, +9, +76, +81, +175, +66, +93, +166, +232, +234, +14, +212, +49, 193, -221, -129, -22, -119, -45, -126, 19, -92, -47, -158, -179, -147, -177, -27, -57, -147, -9, -167, 197, -5, -114, -47, -78, -8, -201, -32, +87, +86, +62, +129, +144, +138, +182, +54, +244, +105, +67, +127, +164, +80, +140, +61, +246, +64, +81, +40, +16, +157, +39, +69, +25, +96, +99, +249, +18, +198, +234, +230, +181, +196, +187, +63, +137, +161, +135, +25, +242, +223, +255, +241, +79, +170, +67, +11, 111, +168, +54, +207, +189, +251, +249, +253, +31, +248, +214, +211, +240, 165, -158, -219, -206, -4, -14, +138, +163, +17, +166, +12, +197, +157, +21, +76, +26, +236, +254, +58, +42, +53, +236, +235, +56, +84, +250, +152, +23, +136, +72, +242, 170, -248, -28, -70, -222, -239, -120, -255, -124, -113, 242, -237, +158, +6, +145, +209, +211, +54, +253, +173, +188, +255, +156, +126, +162, +139, +207, +138, +56, +145, +79, 115, -186, -228, -187, -215, -164, +54, +212, +166, +175, 243, +56, +146, +255, +92, +200, +96, +180, +44, +229, +70, +158, +173, +166, +49, +175, +181, +125, +44, +133, 252, -42, -35, -210, -217, -195, -111, -95, -243, -191, -33, -231, -77, -102, -94, -130, -73, -159, -123, -235, -8, -137, -209, -34, -78, -194, -25, -150, -26, -55, -80, -147, -112, -171, -134, 125, -253, -10, -16, -29, 129, 147, +73, +223, +146, +154, +216, +142, +109, +251, +67, +142, +171, +154, 159, -241, -49, +194, +7, +229, +242, +230, +230, +86, 61, -83, +39, 101, -251, -10, -135, -53, -247, -229, -97, +232, +114, +30, +244, +230, +170, 24, +111, +135, +185, +52, +190, +135, +114, +226, +25, 120, -178, -199, -144, +8, +229, +220, +32, +202, +225, 154, -126, -128, -174, -147, -81, -222, +230, +73, +29, +25, +232, +78, +107, +90, +237, +160, +202, +208, +115, +85, +180, +42, +51, +80, +113, +204, +110, +157, +105, +127, +137, +12, +173, +234, +93, +234, +229, +204, +45, +182, +209, 13, -166, -118, -189, +42, +46, +180, +244, 190, +192, +122, +247, +176, +43, +121, +172, +238, +216, +147, +130, +183, +109, +77, +171, 157, +20, 86, +123, +76, +219, +178, +85, +60, 93, -195, -51, -72, -141, -95, -7, -139, -128, -205, -97, -233, -254, -200, -176, -116, +83, 127, -92, -88, -50, +43, +78, +244, +246, +252, +234, +207, +171, +170, +245, 63, +159, +126, 68, -57, -199, -224, -166, -18, -175, -101, -192, -28, -202, -158, -64, -161, +51, 6, -199, -132, -146, +154, +17, +176, +30, +116, +158, +37, +17, +208, +158, +5, +194, +221, +10, +246, +108, +134, +119, +127, +90, +181, +47, +188, 251, +83, +173, +115, +116, +175, +218, +131, +246, +5, +244, +91, +85, +227, +119, +103, +206, +41, 253, -163, -164, +32, +218, +102, +3, 18, -233, -148, -19, -92, -122, -127, -234, -204, +109, +186, +190, +201, 229, -74, -208, -163, +19, +86, +72, +185, +14, +245, +209, +75, +93, +30, +13, +70, +2, +248, 254, -202, -212, -227, -139, -71, -18, -212, -143, -222, -250, -119, +214, +238, +93, +172, +46, +255, +83, +24, +61, +98, +148, +31, +142, +72, +49, 231, +100, +74, +202, +4, +95, +233, +140, +166, +50, +78, +207, +122, +75, +76, +208, +4, +67, +191, +37, +97, +238, +96, +188, +53, +131, 226, -12, +182, +123, +253, +121, +112, +123, +115, +253, +121, +21, +61, +183, 48, -225, -225, +249, +233, +45, +242, 59, -41, -206, -101, -194, -5, -90, -141, -159, +198, +144, +112, +25, +38, +252, +145, +86, +176, +8, +18, +96, +113, +50, +128, +56, +94, +51, +171, +105, +133, +14, +26, +192, +2, +105, +102, +43, +46, +99, +48, +97, +149, +197, +165, +55, +140, +80, +63, +87, +69, 125, -195, -241, -90, +162, +198, +80, +134, +7, +109, +1, +113, 200, -60, -199, +175, +81, +185, +51, +130, +188, +201, +243, +25, +107, 84, -77, -18, +172, +6, +109, +9, +196, +168, +46, +36, +234, +41, +147, +73, +144, +150, +220, +20, +57, 223, -245, -135, +65, +87, 80, -204, -67, -64, -42, -200, -124, -63, -57, +201, +69, +226, +53, +213, +184, +18, +40, +153, +230, +103, +102, +206, 63, -209, -19, -254, -211, -240, -39, -235, -119, -217, -217, -125, -152, -28, -125, -148, -190, -2, -32, -97, -100, +66, +202, +104, +160, +66, 24, -0, -101, -121, -156, -28, -99, -111, -138, -34, -16, +120, +134, +91, +216, +31, +244, +215, +69, +252, +169, +154, +87, +152, +216, +224, +193, +65, +39, +35, +251, +218, +85, +177, +210, +89, 53, 94, +202, +83, +79, +164, +134, +224, +79, +70, 47, -131, -216, +3, +151, +118, +85, +220, 157, -225, -62, -80, -97, -156, -37, -162, -38, -84, -84, -187, -86, -51, +74, +27, +224, +243, +158, +40, +117, +72, +90, +63, +141, +145, +252, +215, +18, +228, +94, +131, 103, +88, +188, +177, +0, +254, 62, -197, -235, -114, -76, -126, -191, -15, -78, -206, -130, -217, -48, -97, -158, -135, +106, +86, +166, +8, +72, +43, +186, +166, +40, +80, +121, +40, +50, +20, +96, +25, +75, +161, +250, +5, +24, +129, +91, +20, +249, +149, +203, +254, +24, +149, 113, -115, -115, -85, -219, -26, -12, -247, -131, -3, -178, +101, 202, -38, -70, -88, -74, -173, -164, +155, +218, +161, +234, +144, +197, +77, +245, +153, +225, +99, +161, +244, +82, +218, +255, +87, +225, +175, +100, +49, +223, +186, +239, +205, +250, +106, 84, -163, -199, +41, +95, +181, +6, +93, +166, 52, -23, -106, -116, -15, +6, +217, +6, +144, +62, +42, +91, +195, +151, +135, +27, +32, +63, +247, +16, +250, +0, +192, +192, +29, +238, +225, +246, +227, +36, +13, +230, +53, +86, +171, +154, +20, +87, 85, -249, -81, -11, -49, -89, -152, +45, +10, +175, +246, +45, +45, +183, +75, +115, 47, -142, -153, -56, -17, -153, -252, -201, -7, -96, -196, +25, 77, -226, -83, -209, -197, -40, +7, +241, 200, -249, -34, -66, +217, +11, 149, -188, +166, +217, +246, +181, +85, +133, +165, +189, +160, +205, +170, +110, 35, -238, -61, -84, -202, -11, -87, -142, -66, -118, -61, -93, -19, -105, -244, -92, -155, -68, -154, -220, -111, +226, +71, +188, +116, +189, +122, 101, -68, -154, -74, -59, -49, -173, +227, +81, 172, -109, -191, -13, -201, -71, -150, -13, -66, -45, -225, +128, 77, +74, +172, 2, -104, -109, -186, -7, -219, -59, -219, -188, -20, -51, -35, -117, -197, -44, +15, +129, +41, 103, -135, -107, -138, +196, +55, +156, +249, +30, +51, +108, +4, +9, +87, +40, 245, -152, -89, 104, -125, +112, +69, +119, +52, +167, +120, +38, +218, 154, -225, -196, -204, -84, -55, -247, -163, -28, -50, -74, +98, +82, +202, +43, +165, +211, +207, +21, +165, +87, +150, +29, +228, +120, +144, +179, +124, +227, +224, +175, +111, +248, 133, -218, -140, +70, +199, +14, +45, +227, +32, +23, +74, +222, +81, 203, -142, +100, +234, +145, +170, +204, +206, +30, +173, +14, 144, -26, -252, -239, -195, -113, -77, +175, +217, +197, +221, 177, -54, -99, -219, -145, +255, 170, -50, -152, -112, -123, -229, -99, -67, -42, -62, +97, +254, +233, +214, +204, +102, +221, +167, 123, -79, -30, +178, +1, +64, +27, +150, 98, -210, -14, +5, +174, +26, +141, +212, 15, -13, -106, -110, -41, -140, -251, -232, -106, 161, -215, -19, -217, -120, -121, -125, -222, -25, -92, -182, -111, -59, -189, -110, -123, -53, +55, +194, +136, +172, +133, +137, +137, +26, +35, +60, +169, 67, -204, -211, -198, -86, -234, 121, -214, -190, -250, -218, -238, -15, -186, +57, +62, +243, +2, +39, 183, -157, -213, 12, -48, -6, -157, -111, -174, -251, -183, -131, -155, -222, -245, -89, -103, -45, -253, -145, -181, -161, -149, -72, -254, -37, -16, -247, -200, -67, -89, -44, -31, -97, -162, -191, -59, -156, -158, -38, -86, -15, +184, +20, +18, +237, +69, +60, +42, +243, 210, -78, -61, -156, -106, -167, -14, +90, +121, +154, +79, 195, -52, -31, -179, -86, -175, -25, -85, -77, +198, +135, +173, +4, +214, +11, +235, +107, +74, 100, -120, -177, -166, -219, -130, +223, 231, -246, -198, -91, -161, -172, -118, -80, -243, -121, -101, -232, +162, +176, +95, +61, +245, +165, +43, +191, +10, 139, -66, -112, -85, -187, -39, -250, -41, -96, -118, +192, +251, +231, +162, +232, +190, +147, +213, +134, 30, -28, -185, -172, -245, -179, -56, -6, -5, -11, -193, -199, -152, -196, -98, -220, -248, -88, -195, -171, -189, -114, -60, 59, -115, +24, +70, +100, +116, +54, +144, +238, +48, +117, +208, +214, +76, 102, +107, +188, +228, +141, +3, +228, +225, +175, +113, +38, +55, +69, +130, +193, +62, +67, 94, -13, -29, -250, -240, -188, -12, -134, -158, -99, -144, -198, -151, -91, -217, -106, -163, +46, +5, +0, +221, +36, +129, 191, -196, -236, -242, +107, +145, +204, +25, +114, +40, +65, +106, 138, -243, -9, -158, -79, -224, -72, -167, +212, +52, +41, +13, +227, +74, +194, +249, +156, +147, 226, -10, -11, -12, -177, -211, -240, -72, -39, -102, -160, -18, -166, -84, +73, +222, +34, +202, +176, +53, +34, +91, 87, -100, -25, -46, -4, -206, -2, -44, -239, -247, +126, +103, +210, +30, +140, +205, +18, +241, +142, +73, +104, +16, +162, +65, 32, -124, +216, +223, +39, +24, +27, +213, +94, +4, +191, +26, +227, +140, +141, +141, +223, +20, 16, -15, -168, -235, -199, -47, -201, -9, -37, -228, -234, -229, -214, -23, -108, -211, -186, -235, +184, +142, +123, +123, 213, -121, -23, -210, -188, -31, -96, -209, -149, -46, -196, -119, -116, +54, 12, -197, -16, -170, -156, -90, -8, -164, -18, -27, -50, +60, +0, +132, +212, +86, +109, +211, +216, +126, +97, +134, +136, 173, -199, -160, -163, -12, -75, -196, -168, -88, -25, -113, -144, +167, +177, +132, +249, +35, +23, +167, +148, +154, +13, +200, +243, +177, 128, -19, -120, -51, -170, -0, -205, 214, -92, -115, -225, -73, -143, -153, -6, -233, -57, -98, -234, -97, +172, +30, +52, +206, +81, +70, +69, +106, +197, +172, +85, +68, +3, +5, +85, +151, +200, +2, +130, 192, -237, -20, -64, -227, -140, -50, +113, +234, +61, +4, +86, +156, +104, +132, +188, +205, 99, -71, -21, -208, -152, -57, -129, -67, +132, +252, +60, +105, +6, +214, +40, +9, +53, +29, +178, +1, +252, +53, +52, +126, +119, +246, +51, 241, -45, -195, -48, -64, -79, -0, -47, -24, -249, -11, +13, +236, +99, 202, -120, -5, -34, -170, -108, -161, -147, -64, -146, -131, -6, -117, -75, -92, -209, -185, -173, -63, -223, -189, +29, +81, +179, +17, +16, +2, +74, +69, +13, +51, +247, +222, +56, +238, +130, +104, +82, 62, -21, -233, -148, -100, +127, +10, +195, 152, -83, -117, -109, -4, -176, -63, +195, +86, +75, +252, +236, +14, +113, +229, +58, +145, +130, +106, +113, +194, +137, +9, +217, +175, +245, +244, +79, +238, 176, -13, -240, +165, +127, +193, +114, 133, -187, -4, -140, -121, -163, -152, -83, 210, -193, -196, -11, -216, -117, -59, -89, -194, -113, -221, -1, -130, -104, -144, -250, -190, -36, +93, +160, +71, +173, +135, +105, +58, +253, +241, +219, +51, +65, +66, +18, +249, +98, +163, +129, +27, +61, +201, 39, -210, -118, -49, -142, -16, -231, -80, -53, 33, +11, +247, +191, +201, +40, +164, +176, +99, +57, 113, -160, -180, -182, -183, +202, +198, +146, +89, +72, +123, +135, +64, 174, -96, -77, -170, -22, -104, -195, -158, -226, -119, -186, -32, -55, -186, +237, +69, +115, +12, +140, +67, +21, +215, +65, +115, +236, +90, +199, +86, +247, +31, 87, -112, -44, +206, +147, +162, 36, -186, -88, -16, -72, -182, -23, -110, -12, -189, -212, -18, -155, -41, -227, -83, -22, +149, +61, +153, +63, +91, +6, +51, +76, +215, +243, +242, +237, +28, +108, +219, +233, +133, +85, 49, +11, +158, +30, +223, +51, +113, +171, +190, +35, +45, +52, +157, +184, +211, +119, +226, +4, +221, +114, +40, +218, +253, +223, +224, +3, 185, -59, -154, -173, -142, -173, -137, -112, -2, -70, -83, -56, +230, 96, -106, -108, -7, -118, -56, -225, -235, -81, -134, -220, -16, 94, -3, 11, -239, -247, -237, -188, -242, -118, -178, -140, -115, -120, +26, +145, +243, +2, +41, +45, +203, +212, +137, +220, +71, +116, 238, -99, -149, -130, -20, +137, +23, +115, +12, +114, +136, +197, +135, +11, +118, +245, +106, +169, 116, +184, 48, -148, -149, -148, -48, -226, -168, +53, +161, +131, +132, +132, +169, +202, 121, -196, -43, -250, +71, +63, +193, +73, 231, -85, -217, -181, -3, -139, +44, +169, +48, +33, +205, +84, 46, -43, +253, +157, 135, -31, -52, +233, +66, +27, +63, +16, +216, +207, 186, -244, -220, -1, -96, -159, -33, -149, -77, -146, -33, -95, -69, -74, -54, -229, -169, +119, +122, +32, +70, +139, +36, +28, +143, +7, +217, +235, +101, +126, +168, +210, +131, +128, +145, +0, +129, +99, +148, +68, +110, +117, +140, +63, 232, +49, +38, 142, -197, -155, -183, -45, +23, +84, +63, +74, +228, +83, +193, +105, +22, +28, +193, +248, +47, +80, +68, 246, +197, +128, +73, +132, +66, +27, +187, +71, +117, 47, -162, -223, -65, -38, -17, -65, -168, -122, +239, +58, +189, +204, +69, +141, +113, 34, -169, -79, -84, -52, -84, -110, -60, -106, -168, -243, -142, -240, -93, -115, -252, -7, -76, -226, -55, -148, -66, -21, +78, +126, +198, +205, +127, +255, +254, +59, +38, +237, +77, +141, +245, +236, +18, +166, +87, +12, +141, +254, +173, 212, -114, -130, -252, -60, -37, +225, +24, +77, +195, +104, +97, +224, +191, +92, +241, +112, 196, -242, +100, +43, +44, +251, +166, +48, +144, 2, -234, -119, +7, +17, 62, -235, -166, -72, -220, -42, -157, -243, -76, -165, -54, -66, -251, +60, +27, +126, +254, +49, 102, -228, +244, +192, +213, +16, +159, +80, +62, +87, +169, +137, +84, +23, +204, +82, +12, +107, +6, +81, +71, +165, +89, +37, +67, +88, +95, +70, +240, +246, +148, +202, +201, +131, +9, +49, +162, +230, +95, +9, +138, +79, +168, 118, +163, +170, 161, -48, 156, -83, -231, -102, -252, -165, -56, -246, -12, +215, +153, +71, +57, 158, +55, +58, +178, +57, +220, 231, +144, +79, +39, +184, +135, +73, +207, +62, +170, +19, +204, +166, +154, +101, +137, +28, +6, +53, 186, -176, -94, -36, -162, -205, +200, +212, +44, +111, +108, +72, +228, +91, +240, +180, +209, +134, +6, +126, +58, +74, +44, +123, +31, +90, +191, +218, +150, +206, +60, +50, +1, +91, +207, +234, +53, +131, +123, +236, +11, +215, +44, +44, +60, +208, +238, +240, +237, +134, +181, +31, +59, +207, +187, +31, +91, +64, +57, +124, +219, +222, +24, +167, +114, +250, +219, +61, +220, +20, 197, -186, -100, -201, +67, +110, +56, +41, 230, -232, -117, -211, -207, -79, -172, -94, -171, -210, -96, -227, -163, -104, -10, -245, -109, +236, +101, +57, 228, -4, -49, -186, -225, -238, +12, +20, +175, 253, -174, -210, +2, +80, +164, +248, +224, +53, +36, +177, +43, +62, +233, +12, +23, +129, +114, +51, +123, +142, +179, +126, +91, +18, +83, 211, -157, -232, -233, +90, +18, +94, +239, +7, 85, -177, -28, -218, -237, -26, -238, -11, +74, +80, +56, +8, +174, +152, 163, -160, -249, -219, -194, -243, -108, -65, -165, -217, +85, +252, +201, +145, +63, +207, +138, +251, +38, +206, +133, +51, +117, 109, -217, -128, -135, -21, -44, -88, -34, -97, -136, -47, -53, -48, -83, +98, +182, +235, +121, 190, -203, -65, +20, +94, +152, +111, +63, +254, 99, -73, -104, -200, -154, +164, +80, +163, +196, +140, +13, +164, +233, +156, +127, +201, +40, +83, +38, +137, 84, -71, -71, -62, -96, -97, -123, -18, -157, -85, +64, +79, +78, 76, -156, -203, -121, -36, -71, -196, -75, -198, -97, +123, +33, 24, -88, -46, -119, -17, +202, +196, 172, -46, -24, -37, -169, -31, -122, -201, -124, -211, -23, +13, +72, +234, +165, +63, +230, +241, +180, +152, +87, +192, +16, +11, +161, +71, 133, -85, -199, -217, -62, -155, -221, -124, -251, +28, +203, +133, +104, +177, +242, +168, +214, 176, -245, -210, -183, -62, -183, -218, -190, -253, -106, -71, -190, -116, -34, -90, -90, -188, -53, -130, -239, -12, -219, -164, -145, -67, +97, +131, +215, +37, +203, +13, +59, +156, +10, 57, +37, +16, +193, 114, -138, -222, -164, +148, 85, -233, -41, -138, -26, -199, -79, -79, -17, -202, -167, -233, -72, -121, -238, -35, -52, -137, -103, -174, -129, -247, -160, -121, -74, -81, -211, -70, -17, -145, -49, +216, +251, +225, +176, +161, +132, +62, 4, -172, -113, -56, -226, -3, -81, -102, -123, -11, -171, -106, -126, -151, -11, -211, -149, -218, -236, -50, -91, -151, -30, -136, -103, -184, -113, -230, 150, +9, +230, 134, +215, +101, +77, +204, 171, -235, +128, +150, +23, +131, +145, +102, +206, +7, +5, +92, +177, +118, +201, +206, +54, +82, +210, +184, +81, +18, +52, +83, +171, +195, +62, +52, 219, -238, -199, -238, -89, +69, +152, +140, +244, +245, +77, +59, +87, +229, +55, +209, +68, +239, +94, +74, +113, +254, +174, +70, +197, +249, 251, -182, +58, +21, +231, +37, +49, +101, +170, +147, +46, +165, +2, 123, +87, +131, +82, +249, 125, -53, -248, -114, -115, -222, -190, -237, -12, -250, -255, -217, -185, -232, -220, -94, -95, -101, -41, -254, -55, -88, -30, -76, -20, +13, 74, -190, -183, -106, -241, -173, -226, -76, -252, -233, +229, +15, +245, +41, +149, 75, +162, +217, +84, +187, +91, +78, 87, -240, -144, -101, -117, -171, -171, -35, -216, -232, -76, -19, -111, -244, -221, -64, -77, -170, -36, -128, +88, 18, -130, -80, -198, -220, -211, -84, -168, -35, -212, -206, -205, +40, +83, +21, +106, +121, +29, +104, +69, +181, +179, +109, +140, +231, +38, +18, +94, +111, +141, +131, +146, +16, +213, +163, +78, +171, +21, 152, -207, -137, -192, -46, -67, -135, -20, -224, +26, +212, 77, -200, -36, -12, -114, -188, +117, +109, +87, +117, +189, +81, +125, +144, +212, +163, +164, +169, 17, -230, -176, -50, -204, -131, -48, +158, +122, +84, +33, +53, +1, +84, +159, +190, +161, +94, 128, -155, -136, -97, -142, -149, -195, -85, -182, +234, 17, -127, -29, -154, -65, +244, +235, +133, +169, +54, +233, +186, +94, +176, +234, +16, +105, +107, +130, +168, +30, +217, +180, +38, +96, +106, +148, +15, +107, +133, +232, +128, 192, -163, +52, 150, -245, -222, -139, +164, +218, +14, +6, +118, +153, +173, +7, +146, 61, -116, -33, -15, -81, -142, -140, +42, +99, +44, +98, +96, +89, +3, +186, +41, 220, -18, -57, -162, -227, -141, -224, -239, -172, -69, +243, +19, +235, +189, +188, 88, -236, -81, -50, -63, -75, -29, +184, +94, +156, +101, +226, +76, +21, +163, +59, +194, +82, +121, +224, 203, -169, -164, -65, -46, -86, -78, -200, +155, +191, +221, +182, +251, +253, +213, +232, +207, +203, +240, +113, +142, +30, +255, +227, +116, +142, +212, +25, +216, +110, +252, +143, +237, +235, +139, +194, +4, +42, +172, +243, +163, +19, +184, +245, +204, +240, +165, +91, +24, +159, +83, +118, +254, 238, -61, -242, -185, +11, +188, +140, +183, +181, +140, +127, +125, +115, +119, +254, +37, +29, +254, +15, +58, +212, 22, -206, -133, +141, +170, +149, +199, +190, +237, +180, +255, 43, -215, +29, +250, +143, +111, +254, +175, +13, 86, -103, -218, -141, -89, -25, -77, -246, -16, -155, -106, -10, -54, -195, +47, +187, +87, +221, +187, +180, +243, +159, +50, +180, +158, +94, +122, +51, +47, 217, -144, -4, -101, -129, -222, -93, -148, -147, -154, -149, -125, -253, 10, -137, -177, -26, +92, 139, -3, +163, +199, 176, -178, -166, -91, -215, -204, -53, -67, -65, -51, -47, -220, -77, -187, -215, -190, -28, -124, -189, -190, -248, -114, -217, -25, +218, +150, +19, +203, 156, -127, -176, -178, -166, -115, -223, -155, -238, +218, +212, +83, +86, +8, +192, +28, 237, -217, -231, -65, +12, +63, +156, +54, +39, +105, +208, 255, -172, -125, -177, -26, -163, -109, 210, -187, -125, -123, -219, 185, -250, +252, +148, 194, -15, -236, +244, +239, +230, +11, +250, +210, +253, +252, 101, +165, 247, -106, -112, -222, -237, -223, -182, -175, -114, -169, -132, -55, -216, -214, -77, -134, -106, -255, -182, -62, -212, -251, -82, -67, -233, -97, -6, -157, -223, -110, -86, -98, -179, -77, -134, -2, -72, -158, -42, -6, -100, -74, -55, +159, +13, 122, -97, -56, -187, -193, -115, -18, -175, -82, -142, -67, -58, -9, -188, -220, -241, -195, -221, -241, -77, -41, -211, +43, +29, +87, +255, +170, +125, +121, 185, -164, -157, -153, -23, -94, -161, -113, -179, +122, +61, +250, +51, +244, +176, 206, -120, -133, -169, -14, -233, -147, -7, -15, -220, -72, -242, +107, +203, 78, -147, -130, -7, -211, -242, -168, -176, -232, -6, -211, -226, -217, -197, -216, -32, -140, +166, +33, +90, +22, 240, -0, -239, -128, -242, +111, +131, +148, +176, +106, +236, +171, +206, +69, +247, +235, +213, +234, +253, 184, -98, -228, -181, -29, -188, -36, -101, -218, -224, -228, -241, -254, -156, -19, -214, -24, -155, -193, +146, +174, +183, +152, 21, -187, -226, -173, -36, -169, -149, -148, -182, +71, +143, +49, +117, +96, +178, +59, +222, +89, 13, -209, -132, 124, +217, +238, +125, +238, +172, +94, +139, +75, +160, +41, +178, 56, -140, +236, +221, +84, +58, +232, +38, +110, +60, +240, +151, +60, +50, +244, +117, +88, +172, +14, +59, +194, +65, +221, +200, +241, +91, +88, 250, -13, -33, -187, -67, -191, -225, -44, +92, +18, +106, +214, +177, +98, +25, +14, +244, +254, +34, +31, +16, +212, +71, +211, +85, +246, +131, +93, +100, 208, +156, +3, +124, +240, 216, -161, -31, -82, +222, +170, +176, +27, +199, +199, +154, +186, +125, +21, +244, +105, +149, +74, +238, +249, +193, +40, +12, +41, +86, +185, +221, +180, +15, +254, +60, +109, +136, +142, +130, +43, 9, -245, -174, -88, -42, -5, -19, -203, -194, +190, +64, +18, +192, +76, +0, +232, +132, +200, +186, 72, -152, -193, -214, +32, 193, -24, -123, -244, +148, +75, +246, +39, +152, +10, +238, +146, +250, 22, -198, -207, -126, -56, -116, -124, -178, -174, -56, -66, -79, -207, +64, +145, +50, +120, +1, +241, +65, +218, 163, -147, -129, -69, -127, -69, -58, -197, 72, -6, -100, -128, +103, +169, +82, +97, +82, +58, +142, +155, 241, +87, +70, +135, +188, +167, +72, 162, -76, -149, +13, +137, +182, +212, 18, -107, -115, -50, -38, -248, -115, -168, -160, -4, -230, -14, -76, -77, -58, -246, -66, -88, -38, -147, -239, -44, -46, -133, -171, -168, -168, -105, -207, -116, -66, +82, +226, +87, +126, +29, +228, +173, +27, +250, +203, +249, 52, -26, -22, -212, -218, -188, -144, -148, -151, 12, -74, -70, +12, +118, +163, +98, +212, +81, +58, +147, +14, +154, +87, +135, +247, +100, +189, +136, +223, +134, +8, +158, 114, -215, -171, -108, -120, -66, -215, +14, +8, +217, +226, +154, +10, +59, +218, +243, +170, +234, +139, +60, +90, +9, +250, +47, +19, +123, +180, +198, +63, +102, +154, 197, -155, -155, +83, +195, +26, +62, +20, +118, +228, +164, +49, +71, 78, -183, -190, 32, 210, -124, -165, -219, -99, -47, 250, -224, -200, -190, -74, -197, -187, -83, -234, -201, -55, -206, -71, -115, -188, -111, -132, -72, -23, -166, -179, -9, -46, -121, -223, -0, -161, -142, -194, +126, +25, +102, +61, +87, +87, +60, 196, -16, +247, +91, +186, +45, +12, +82, +148, +88, +210, +200, 75, -89, -203, -230, -81, +126, +31, +11, +248, +142, +83, +153, +56, +240, +176, +99, +54, +76, +170, +141, +170, +195, +236, +227, +212, +95, +208, +195, +180, +241, +88, +1, +105, 148, -205, -117, -104, -252, -24, -214, -67, -81, -205, +43, +167, 154, -199, -140, -85, +132, +152, +105, 29, -148, -230, -208, +107, +198, +101, +129, +18, +153, +223, +166, +237, +246, +48, +219, +254, +66, 194, -52, -217, -134, -16, +77, 114, -143, -218, +145, +55, +121, +95, +58, +242, +176, +84, +38, 40, +127, +73, +231, +25, +223, +131, +82, +126, +9, +25, +62, +148, +2, +142, +166, +216, +71, +164, +67, +25, +195, +75, +14, 33, -15, -183, -74, -10, -31, -194, -200, -119, -129, -8, -218, -23, -220, +202, +49, +110, +55, +70, +116, +106, +118, +247, +99, 153, -108, -92, -84, -179, -68, -16, +148, +146, +71, +44, 230, -219, +173, +228, +108, +72, +47, +17, +176, +19, +152, +118, +70, +149, 78, -4, -171, -45, -69, -185, -24, -196, -154, -95, -48, -91, -136, -121, -13, -134, -188, -217, -130, -159, -158, +18, +39, +20, +99, +168, +178, +139, +170, +176, +62, +141, +161, +114, +113, 111, -234, -25, -190, -163, -186, -105, -152, -135, +10, +220, +70, +67, +246, +42, +184, +218, +236, +140, +205, +227, +41, +56, +241, +78, 118, -54, -79, +78, +74, +37, +196, +140, +128, +49, +11, +103, 150, -226, +180, +4, +45, +60, +13, 27, -143, -121, -135, -10, +29, +54, +193, +181, +63, +141, +141, +185, +146, 161, -212, -19, -130, -51, +123, +253, +75, +251, +178, +123, +49, +248, +229, +166, +123, +158, +137, +36, +167, 74, -196, -216, -80, -125, -225, +214, +233, +142, +139, +193, 113, -10, -87, -212, -224, -33, -7, -161, -7, -43, -149, -10, -149, -34, -106, +94, +64, +9, +204, 178, -93, +162, +195, +249, +152, +211, +231, +37, +148, +235, +206, +175, +119, +171, +179, +188, +95, +151, +243, +76, +164, +14, +172, +247, +208, +189, +201, +139, +27, +170, +80, +203, +129, +242, +204, +99, +14, +129, +205, 28, -20, +7, +229, +69, +176, +33, +68, +115, +39, +179, +30, +55, +150, +157, +35, +87, +83, +175, +18, +127, +100, +10, +236, +118, 243, -178, 31, -3, -243, -73, -177, -158, -200, -113, -206, -125, -96, +238, +228, 155, -142, -38, -232, -124, 13, -172, -131, -197, -156, -227, -17, -166, -11, -96, -10, -195, -223, -168, -113, -189, -64, -44, +184, +50, +180, +253, +142, +125, +103, +18, +111, 230, -46, -112, -213, +174, +108, 131, -137, -247, +212, +66, +192, +220, +204, 251, -44, +13, +109, +222, +60, 220, -106, -192, -181, -165, -155, -133, -193, -182, -19, -75, -110, -166, +141, +250, +194, +237, +3, +190, +162, 220, -241, -248, -46, +200, 124, -162, -239, -154, +214, +78, +222, +214, +190, +49, 120, -83, -212, -108, -134, -206, -129, -27, -160, -169, +140, +168, +226, +113, +180, +82, +248, +176, +40, +31, +209, +233, +207, +90, 93, -20, -122, -218, -62, -116, -219, -107, -95, -245, -63, -94, -247, -46, -7, -103, -159, -219, -87, -159, -58, -231, -153, -14, -235, -223, -25, -164, -126, -142, -15, -198, -252, -145, -35, -73, -84, -117, -202, -100, -198, -27, -59, -105, -162, -116, -42, -197, -129, -210, +98, 2, -19, -255, -220, -11, -163, -146, -101, -170, -212, -56, -152, -128, -58, -102, -71, -58, -233, -81, -100, -36, -59, -87, -115, -18, -101, -242, -1, +139, +232, +224, +135, +172, 82, -164, -140, -178, 86, -234, -108, 145, -84, -58, -50, -29, -211, -160, -196, +205, +75, +42, +164, +82, +27, +75, +96, +45, +14, 87, -126, -157, -157, -43, -44, -238, -252, -183, -235, -222, +74, +130, +228, +89, +62, +173, +155, +54, +165, +88, +40, +170, +38, +29, +55, +112, +247, +190, +213, 69, -182, -194, -95, +173, +248, +100, +193, +38, 77, -52, -126, -197, -81, -126, -235, -222, -174, 14, -82, -50, -142, -134, -177, -202, -154, -245, -42, -238, +108, +191, +35, +16, +26, +73, +131, +209, +232, 217, -47, +189, +114, +188, +224, +50, +196, +44, 10, -178, -31, -74, -65, -246, -162, -4, -63, -26, -37, -120, -231, -178, -219, -239, -227, -56, -103, -215, -87, -128, +217, +145, +205, +190, +51, +85, +126, 225, -206, -167, -94, +72, 167, -211, -127, -74, -45, -110, -52, -78, -1, +31, +157, +152, +235, +209, +250, +18, +47, +34, +23, +46, +80, +114, +179, +30, +210, +88, +3, +70, +133, +145, +118, +140, +37, +218, 192, -108, -215, +135, +209, +209, +142, +133, +116, +169, 254, -84, -74, 55, +179, +235, +216, +10, 191, -161, -174, -189, -57, -237, -201, -151, -75, -223, 64, -129, -244, -15, -7, +127, +186, +72, +234, +68, +57, +89, +213, +176, +25, 140, -230, -219, -123, -241, -113, -91, -1, -114, -63, -37, -197, -109, -75, -79, -52, -94, -32, -220, -150, -6, -55, -84, -212, -219, -38, +64, 153, -197, -15, -86, -133, -219, -98, -233, -207, -170, -194, -117, -169, -117, -61, -135, +23, +91, 74, -213, -150, -41, -203, -142, -183, -202, -180, -13, -49, -106, -188, -56, -180, -45, -48, -79, -85, +102, +76, +139, +54, +80, 129, -174, -135, -43, -123, -178, -128, -241, -222, -74, -18, -171, -7, -30, +38, +84, +48, +167, +185, +141, +9, +144, +120, +25, +39, +114, +118, +246, 109, -240, +24, +221, +255, +203, 239, -206, -251, -50, -186, -47, -190, -240, -150, -245, -137, -121, -0, -178, -76, -245, -51, -7, -155, -190, -141, -191, -206, +112, +214, +73, +20, +46, +230, +34, +156, +75, 174, -33, -182, -178, -5, -53, -88, -248, -10, -104, -232, -255, -109, +176, +30, +139, +19, +56, 3, -171, -179, -130, -168, -231, +148, 16, -233, -158, -3, -188, -242, -254, -30, -215, -66, -182, -239, -208, -51, -220, -159, -4, -94, -136, -217, -49, -179, +8, +75, +60, +0, +127, 216, -4, +18, +50, +193, +50, +154, +177, +128, +54, +152, 160, -73, -226, -90, +81, +98, +0, 110, -151, -114, -61, -248, -169, -17, -150, -90, -77, -100, +36, +25, +104, +106, +72, +41, 28, -93, -155, -3, -164, +213, +72, +74, +104, +197, +158, +210, +205, +103, +27, +27, +47, +2, +202, +116, +72, +65, +134, 9, -94, -177, -226, -139, -83, -199, -56, -88, -62, +150, +254, 141, -253, -27, -15, -156, -185, -212, -15, -115, -11, -58, -168, -210, -31, -147, -5, -49, -52, +112, +86, +76, +78, +24, +113, +61, +116, +79, +234, +228, +134, +83, 7, -85, -171, +248, 243, -97, -173, +128, +198, +37, +176, +79, 41, +143, +191, +149, 30, -188, -34, -44, -136, -142, -99, -168, -13, -55, +143, +43, +172, 15, -107, -207, -192, -97, -117, -76, -229, -119, -6, -97, -183, +8, +168, +221, +220, +40, +130, +59, +88, 123, -246, -172, -102, -237, +201, +236, +30, +82, +53, +149, +253, +83, +156, +62, +165, +140, +133, +17, +109, +132, +125, +130, +10, +42, +17, +42, +242, 99, -181, -247, -2, -51, -196, -175, -101, -223, +232, +212, +154, +184, +253, +188, 81, -95, -28, -238, +67, +137, +185, +197, +61, +206, +94, +174, +229, +11, +2, +156, +203, +109, 125, -136, -28, -215, -91, -24, -96, -83, +238, +221, +124, +189, +29, +156, 183, -107, -88, -155, -171, -167, -121, -38, -89, -205, -231, -94, -240, +47, +47, +243, +241, +137, 33, -124, -44, +205, +82, +74, +52, +120, +81, +248, +215, +39, +178, +204, +32, 31, -45, -115, -5, -152, -139, -40, -209, -35, -87, +114, +130, +77, 150, -76, -176, -186, -31, -44, -219, -55, -231, -187, -25, -4, -206, -81, -25, -108, +232, +230, +193, +137, +12, +5, +190, +226, +149, +56, +236, +198, +225, +43, +64, +211, +2, +39, +180, +178, +131, +5, +178, +191, +53, +19, +255, +214, +125, +134, 31, -14, -61, -203, -168, +126, +46, +195, +245, +124, +150, +73, +30, +33, +207, +226, +163, +140, +160, +24, +134, 230, +69, +141, +60, +249, +136, +209, +65, +53, +191, +188, +84, +107, +123, +145, +132, +3, +103, +52, +146, +243, +100, +240, +207, +133, 103, +144, +101, +75, +165, +26, +46, +89, +173, +57, 44, -36, -38, -95, -225, -10, -5, -0, 164, -206, -244, -50, -246, -67, -39, -177, -15, -177, -137, -23, +186, +164, +194, 227, -177, -247, -104, -192, -95, -168, -118, -229, 138, -65, +112, +80, +58, +35, +4, +161, +168, +172, 228, -106, +122, +150, +244, +61, +201, +157, +255, +92, +200, +24, +31, 171, -243, -64, -165, -42, -111, -40, -16, -154, -44, -186, -81, -13, -74, -210, -225, -68, -210, -8, -161, -186, -93, -89, -132, -114, +147, +182, +159, +156, +142, 255, -82, -238, -18, -106, -230, -3, -190, -135, -186, -132, -50, -27, -250, -119, -50, -44, -105, +128, +148, +124, +148, +68, +254, +233, +168, +148, +155, +55, +63, +116, +134, +37, +176, +202, +214, +131, 203, -50, -17, -58, -15, -83, +47, +28, +255, +149, +233, +35, +70, +177, +219, +233, +67, +73, 153, -154, -48, -99, 184, -109, +120, +157, 67, -190, -109, +137, +231, +140, +223, +229, +149, +236, +187, +195, +165, 122, -208, -146, -245, -143, -25, 158, -70, -34, -164, -116, -221, -154, -234, +227, +22, +151, +124, +148, +190, +132, +71, +183, +132, +138, +173, 176, -18, -219, -225, -5, -146, -32, -222, -172, -93, +248, +230, +75, +183, +48, +87, +162, +215, +22, +45, +240, +173, +136, +129, +113, +160, +50, +220, +4, +74, +41, +43, +141, +3, +88, +105, +118, +239, +104, +10, +78, +200, 53, +92, +120, +112, +236, +48, 247, -130, -105, -142, -8, -251, -94, -114, -86, -79, -101, -137, -180, +57, +126, +167, +88, +27, +92, +20, +197, +15, +3, +243, +3, +92, 7, -231, -247, +110, +106, +24, +192, +201, +229, +236, +132, +72, +44, +30, +66, +207, +213, +117, 197, +113, +241, +188, +251, +184, +123, +152, +219, +235, 145, -169, -150, -11, -37, -159, -114, -255, -177, -160, -202, -46, -166, +149, +237, +88, +71, +85, 164, -121, -219, +67, +207, +56, +63, +162, +237, +158, +82, +103, +227, +244, +239, +117, +108, +39, +207, +88, +102, +235, +188, 96, -152, +190, 0, -125, -164, +10, +20, +15, +166, +128, 50, -5, -99, -70, +34, +41, +91, +244, +134, 95, -93, -112, -28, -26, -77, -211, -172, -192, 232, -172, -69, -6, -119, -172, -177, -231, -12, -135, -116, -0, -157, -148, -134, -167, -192, +247, +76, +211, +44, 168, -173, -134, -177, -69, -56, -30, -43, 167, -96, -210, -205, -218, -147, -114, -28, -101, -192, +144, +15, +248, +247, +9, +99, +119, +188, +136, +168, +4, +88, +14, +203, +33, +106, +94, +75, +89, +199, +112, +127, +246, +46, +142, +108, +138, +59, 163, -24, -20, -183, -85, -237, -74, -166, -143, -201, -131, -92, 138, +86, +141, +89, +232, +184, +30, +1, +93, +21, +244, +148, +120, +4, +222, +62, +88, +234, +50, +91, +143, 152, -23, -128, -109, -42, -121, -11, -204, -178, -72, -193, -252, -107, -9, -34, -53, -10, -125, -223, -153, +166, +206, +141, +156, 199, -185, +192, 26, -211, -79, -68, -161, -166, -77, -203, -144, -169, -244, -214, -35, -94, +133, +133, +135, +100, 117, -162, -156, -116, -204, +254, +255, +70, +82, +190, +66, +252, +237, +39, +144, +11, +9, +66, +144, +47, +77, +50, +183, +133, +195, +127, +148, +41, +148, +253, +223, +56, +9, 18, -84, -42, -7, -79, -179, -100, -202, -231, -210, -243, -233, -124, -101, -240, -76, +167, +144, +58, +17, +119, +67, +83, +226, +107, +21, +96, +34, +227, +196, +155, +201, +172, +40, +2, 133, -132, -100, -52, +25, +122, +112, 80, +109, +87, +67, +156, +168, +33, +215, +122, +112, +134, +149, +33, +175, +196, +174, +230, +57, +50, +228, +86, +51, +29, +219, +245, +215, +203, +75, +179, 193, -147, -6, -234, -104, -221, -176, -89, -47, -177, -53, -184, -158, -73, -121, +254, +144, +27, +236, +93, +213, 193, -121, +254, 152, -92, -120, -147, -105, -161, -194, -160, -250, -194, -84, -167, -12, +27, +236, +125, +213, +193, +254, +148, +27, +236, 67, -248, +213, +193, +254, +61, +55, 216, +31, +108, +7, +219, +34, +174, +105, +169, +152, 67, -80, -191, +230, +10, +44, +63, +11, +213, 22, -176, -68, -163, -41, -134, -42, -56, -2, +140, +109, +65, +133, +146, +85, 248, -7, -159, +94, +169, +229, +206, +62, +49, +232, +2, +141, +138, +213, +55, +155, +161, +43, +212, +47, +207, +60, +105, +196, +136, +76, +143, +88, +148, +227, +183, +173, +55, +107, +91, +17, +121, +162, +227, 156, -109, -97, -243, -117, -35, +251, +92, +79, +187, +61, +76, +142, 114, -10, -242, -49, -195, -172, -113, -249, +25, +219, +147, 137, -182, -72, -193, -20, -60, -8, -49, -193, -58, -170, -226, +149, +186, +235, +84, +87, +154, +56, +85, +154, +53, +203, +124, +79, +15, +166, +237, +2, +208, +191, +108, +192, +24, +176, +192, 27, +49, +147, +208, +83, +225, +206, +197, +220, +3, +196, +110, +186, +174, +116, +127, +82, +144, 253, -114, -199, +196, +255, +69, +77, +203, 46, -70, -236, -139, -52, -195, +160, 204, -112, -212, -84, -149, -28, -78, -249, -53, -215, 139, -116, -173, +183, +231, +100, +194, +139, +206, +167, +246, +215, +203, +187, +181, 10, -157, -160, -137, +233, +114, 178, -119, -134, -24, -70, -1, -232, -146, -232, -217, -36, -115, -211, -36, -137, -12, -22, -148, -236, -36, -153, -70, -225, -98, -66, -158, -81, -24, -72, -205, -69, -238, 240, -193, -32, -15, -42, +157, +40, +85, 221, -16, -29, -168, -84, -228, -6, -12, -55, -246, -38, -11, -44, -200, -58, -92, -178, -243, -147, -38, -228, -18, -94, -139, -9, -186, +96, +41, +51, +160, +105, +8, +34, +253, +17, +27, +248, 233, -146, -24, +229, +102, +33, +7, +184, +126, +103, +213, +89, +79, +29, +117, +158, 196, -207, +67, 78, +19, +24, +180, +88, +158, +50, 110, -0, -242, -70, -145, -148, -156, -49, -91, -32, -64, -118, -125, -126, +180, +106, +199, +102, +154, +246, +229, +93, +247, +106, +205, +121, +175, +56, +207, +108, +6, +124, +172, +3, +252, 253, -23, -209, -157, -57, -19, -5, -112, -138, -214, -38, -85, -239, +18, +109, +223, +11, +18, +95, 112, -40, -100, 133, -120, -225, -79, +92, +69, +18, +222, +14, 184, -86, +89, +145, +68, +238, 144, -84, -230, -139, -136, -114, -121, -240, -128, +222, +9, +187, +149, +126, +189, +238, +254, +247, +215, +206, +170, +87, +106, +1, +0, +226, 58, -24, 195, -232, 0, -60, -53, -4, -59, -162, -229, -190, -33, -236, -199, -88, -108, -158, -234, -208, +29, +62, +37, +101, +168, +29, +51, 130, -100, -180, -192, -28, -250, -49, -161, 11, -91, +138, +52, +122, +227, 241, -14, -235, -31, -212, -94, -81, -174, -255, -92, -163, -120, +229, 42, -37, 87, -100, -79, -115, -81, -146, +245, +4, +17, +120, 11, -47, -85, -192, -197, +50, +199, +6, +93, +253, +97, +171, +62, 147, -61, -193, +25, +229, +25, +93, 125, -162, -44, -175, -142, -24, -122, +83, +86, +174, +170, +170, +111, +132, 120, -247, -11, -67, -70, -186, 192, -132, -219, -130, -195, -244, -157, +147, +25, +122, 202, -188, -59, -9, -224, -213, +21, +128, +169, +203, +177, 62, -172, -134, -71, -53, -208, -131, -232, -134, -202, -255, -90, -125, -180, -122, -173, -41, -112, -73, -175, +96, +103, +70, +83, +32, +182, +89, +56, +43, +128, +48, +114, +130, +129, +45, +24, +135, +46, +128, +222, +167, +49, +43, +93, 3, -87, -207, -148, -155, -208, -86, -226, -241, +212, +252, +115, +97, +28, 78, -65, -50, -116, +100, +79, +63, 25, -47, -130, -108, -248, -118, -215, -8, -51, +151, +249, +217, +210, +91, +180, +225, +146, +243, +7, +165, +86, +72, +83, +222, +15, +229, +40, +68, +254, +62, +12, +164, +50, +10, +40, +151, +112, +132, +58, +110, +229, +28, +193, +18, +124, +81, +84, +17, +93, 189, -228, -36, -54, +49, +150, +101, +143, 27, -61, -228, -105, -203, -234, -226, -6, -29, -95, -56, -181, -11, -223, -37, +220, 210, -161, -134, -198, -228, -0, -216, -0, -216, -69, -160, -29, -101, -30, -247, +53, +153, 20, -198, -102, -223, -118, -130, -31, -31, -119, -13, -184, -202, -173, -168, -227, -213, +253, +111, +120, +197, 202, -128, -143, +32, +160, +103, +22, +39, +158, +100, +97, +91, 187, -81, +136, +218, +59, +36, +169, +161, +64, +84, +53, 142, -75, -181, -170, -125, -147, -113, -170, -180, -8, -120, -201, -31, -20, -35, -216, -66, +80, 178, -48, -94, -248, -170, -8, -8, -115, -245, -58, -10, -71, -204, -189, -251, -48, -177, -78, -65, -49, +246, +70, +66, +219, +201, +32, +84, +46, +13, +246, +140, +200, +154, +91, +18, +51, +114, +74, +122, +89, +112, +221, +165, +12, +41, +97, +1, +103, +165, +74, +234, +208, 145, -182, -220, +1, +57, +217, +109, +126, +115, +101, +186, +183, +186, +148, +21, +207, +46, +70, +37, +244, +36, +68, +119, +237, +129, +55, +39, +188, +121, +223, +100, +6, +59, +7, +45, +28, +199, +113, +86, +139, 172, +148, +218, +178, +0, +252, +206, +32, +114, +69, +143, +236, +159, +178, +212, 69, +124, +109, 13, -29, -181, -43, -171, -43, -41, -21, -44, -54, 246, -189, -249, +245, +135, +182, +59, +203, +24, +235, +45, +112, +136, +28, +60, +74, +47, +74, +122, +227, +49, 96, -186, -27, -243, -186, -93, -233, -164, +83, +29, +20, +224, +180, +144, +219, +74, +75, +124, +231, +41, +87, +163, +15, +65, +232, +251, +31, +157, +34, +75, +132, +220, +119, +133, +135, +32, +196, +4, +255, +78, +100, +252, 24, -9, -214, -101, -247, -230, -249, +48, +16, +216, +131, +80, +224, +136, +111, +4, +193, 61, -200, -196, -163, +89, 101, -137, -51, -143, -163, -205, -165, -59, -48, -46, -120, 93, -165, -104, -108, +241, +237, +28, +238, +14, +180, +184, +111, +241, +155, +224, 122, -242, -213, -172, -5, -209, -174, -52, -222, -239, -13, 241, +156, +157, +140, +221, +200, +153, +76, +56, +45, +46, +144, +123, +113, +66, +72, +6, +121, +43, +245, +220, +118, +38, +112, +80, +197, +151, +48, +242, 126, +195, +251, +231, +139, +147, +111, 95, +210, +37, +223, +191, +37, +157, +231, 47, -222, -51, -33, -181, -2, -218, -239, -15, -130, +50, +34, +157, +61, +252, 246, -242, -160, -115, -232, -58, -190, -231, -13, -154, -196, -86, -136, -12, -115, -26, -139, -225, -27, -197, -72, -16, +75, +254, 55, -87, -100, -35, -78, -197, -151, -140, -248, -168, -239, -222, -16, -11, -97, -80, -105, -118, -125, -119, -244, -10, -247, -240, -12, -68, -210, -113, -99, -205, -27, -241, +228, 188, -229, -247, -100, -16, -145, -3, +201, +204, +75, +48, +233, +115, +111, +29, +33, +49, +90, 196, -238, -116, -2, -89, -77, -235, -30, -252, -109, 73, -251, +56, +195, +82, +227, +6, +106, +18, +110, 213, -54, -224, -40, -120, -47, +176, +175, +95, +1, +162, +35, 112, -5, -180, -128, +242, +51, +62, +166, +231, +170, +108, +95, +225, +176, +230, +190, +60, +12, +3, +79, +246, +24, +82, +211, +15, +208, +117, 50, +202, +187, +193, 212, -189, -0, +174, +215, 183, -25, -186, -11, -16, -27, -178, -61, -117, -129, -28, -115, -241, -152, -153, -1, -135, +211, +170, +107, +120, +6, 169, -154, -149, -212, -4, -165, +241, +235, +96, +17, +176, +57, 44, -26, +61, +28, +25, +150, +30, 142, -162, -50, -196, -242, -137, -121, -67, -220, -118, 11, -163, -251, -190, -199, -200, +75, +230, +135, +40, +231, 24, -5, -226, -158, -90, -81, -48, 220, 84, -253, -137, -57, -147, -38, -84, -44, -62, 226, -156, -192, -111, -203, -236, -142, -90, +181, +12, +152, 67, -83, -138, -164, -195, -47, -146, -252, +217, +19, 40, -121, -52, -3, -237, -136, -110, -88, +212, +224, +152, +80, +242, +176, +127, +148, +84, +34, +157, 114, +130, +75, +239, 79, -179, -188, -104, -154, -254, -10, -189, -16, -16, -105, -1, -177, -248, -117, +157, +185, 92, -32, -217, -1, -28, -214, -34, -78, -148, -12, -135, -181, -22, -50, -138, -151, -138, -93, -101, -54, -57, -93, -86, -243, -201, -158, -87, -214, -125, -42, -250, -88, -176, -32, -183, 9, -119, -101, -54, -112, -106, -186, -129, -211, -218, -54, -48, -227, +122, +212, +95, +153, +122, +124, +241, +72, +130, +250, +209, 91, -142, -98, +255, +254, +66, +156, +3, +38, +60, +124, +39, +197, +133, +76, +184, +64, +171, +241, +179, +111, +56, +94, 11, -167, -251, -219, -194, -181, -149, +153, 231, -54, -113, -90, -97, -19, -103, -161, +152, +170, +73, +226, 187, +254, +24, +138, +121, +8, +72, +5, +153, +239, +247, +206, +239, +233, +9, +255, +253, +240, +247, +214, +239, +178, +179, +251, +48, +57, +250, +40, +253, +2, +128, +132, +145, +97, +0, +148, +229, +113, +114, +140, +189, +41, +138, 64, -77, -151, +212, +120, +189, +12, +98, +119, +134, +251, +64, +133, +113, +150, +136, +154, +80, 81, -73, +237, +90, +205, +156, +249, +20, +175, +203, +49, +249, +253, +62, 58, -213, -146, -87, -115, -22, -250, -161, -97, -25, -35, +57, +11, +102, +195, +132, +121, +30, +198, +205, +205, +85, +109, +107, +48, 220, +15, +14, 200, +42, +155, +24, +97, +41, +181, +146, +82, +141, +30, +211, +92, +168, +209, +61, +84, +229, +71, +45, +196, +100, +97, +190, +56, +102, +226, +68, +100, +242, +39, +31, +128, 17, -54, +55, +137, +207, +68, 23, -106, -16, -79, -21, -248, -200, -73, -193, -84, -168, -70, -109, -222, -220, -123, -148, -62, -211, -153, +163, +32, +231, +139, +8, +85, +242, +142, +120, +240, +80, +41, +47, +92, +57, +10, 217, -194, -79, -188, -185, -239, -177, -126, -138, -180, -88, -52, -82, -153, +245, +116, +77, +164, +209, +115, +109, +18, +105, +114, +191, +149, +17, +105, +42, 237, -202, -86, -96, +196, +180, +178, 182, -95, -133, -21, -26, -236, -216, -190, -151, -88, -93, -101, -246, -81, -157, -223, -10, +253, +46, +36, +31, +89, +54, +8, +181, +132, +55, +9, +160, +181, +233, +30, +108, +239, +108, +243, +82, +204, +140, +212, 21, +179, +156, +29, +174, +41, +214, +99, +102, +161, +245, +105, +134, +19, +51, +83, +221, +60, 140, -148, -86, -139, -223, -18, +114, +200, +40, 21, -155, +106, +51, +46, +59, 66, -11, -111, -171, 106, -45, -125, -173, -229, -48, -116, -33, -216, -50, -220, -183, -226, -120, -119, -214, +240, +127, +8, +199, +53, 197, -82, +218, +140, +109, +71, +170, 202, -240, -15, +96, +194, +237, +149, +79, +13, +169, +248, +236, +61, +121, +136, +73, +59, +60, +52, +168, +185, +165, +48, +238, +163, +171, +133, +94, +79, +100, +227, +213, +205, 69, -131, -162, -161, -195, +103, +112, +213, 190, -147, -144, -75, +235, +244, +186, +237, +213, +12, +49, +207, +27, +91, +169, +231, +121, +251, +250, +151, +118, +127, 208, -198, -128, -139, -183, +189, +235, +172, 102, -23, -134, -75, +128, +49, +232, +124, +123, +211, +191, +27, +220, +246, +110, +206, +59, +107, +233, +143, +172, +13, +173, +68, +242, 175, -48, -18, -78, -212, -115, +128, +184, +71, +30, +202, +98, +249, +8, +19, 253, -186, +221, +225, +244, 52, -39, 177, -191, -170, -2, -138, -52, -53, +122, +144, +118, +234, +225, +84, +59, +117, +24, +166, +249, +152, +181, +122, 205, -242, -108, -183, -243, -110, +168, +106, +34, +195, +139, +53, 221, -214, -10, -169, -174, -157, -148, -97, -58, -33, -40, -173, +22, +60, +183, 55, -194, +222, +10, +101, +181, +131, +154, +207, +43, +67, +95, +20, 130, -123, +171, +218, +61, +209, +79, +1, +179, +243, +224, +200, +101, 173, -148, -230, -56, -121, -76, -76, -14, -110, -5, -35, -82, -36, -103, -225, -189, -172, -115, +159, +197, 49, -235, -56, +40, +88, +8, +62, +198, +36, +22, +227, +198, 199, -25, +26, +94, +237, +149, +227, +217, +153, +51, +243, +106, +232, +208, +135, +231, +101, +48, 244, +28, +131, +52, +190, +220, +202, +86, +27, +253, +53, +102, +151, +87, +156, +79, +240, +124, +2, +71, +58, +19, +215, +88, +96, +136, +157, +134, +71, +58, +49, +3, +149, +48, +165, +186, +34, +203, +112, +33, +112, +22, +96, +121, +191, +7, 225, -183, -4, -143, -242, -182, -239, -200, -216, +163, +120, +68, +93, +63, +126, +73, 78, -229, -150, -204, -142, -105, -37, -250, -138, -10, -184, -209, -135, -208, +40, +33, +87, +47, +183, +190, +96, +155, +214, 93, +175, +206, +187, +144, 230, -169, -235, -205, +253, +0, +139, +174, 116, -25, -123, -163, -152, -191, -54, -36, -176, -185, -62, -172, -227, +33, +190, 163, -145, -201, +99, +40, +134, +80, +229, +212, 66, -201, -165, -205, -109, -171, -97, -165, +32, +149, +216, 144, -9, -15, +105, +61, +6, +29, +101, +88, +34, +70, +197, +202, +136, 131, -203, -112, -47, +4, +156, +192, +155, +81, +5, +104, +182, +230, +154, +11, +79, +122, +204, +52, 72, -210, +207, +17, +83, +15, +3, +110, +167, +0, +26, +103, +148, +25, +59, +170, +128, +198, +204, +9, +28, +138, +111, +25, +134, +1, +122, +2, +120, +193, +200, 95, -29, -151, -19, -117, -181, -240, +80, +198, +43, +16, 81, -90, -36, -158, -239, -253, -78, +101, +11, +157, +4, +146, +28, +52, +168, +91, +226, +138, 206, -7, -2, -213, -164, -240, -82, -81, -127, -190, -255, -223, -20, -136, -236, -49, -127, -7, +109, +253, +249, +254, +237, +153, +72, +167, +36, +195, 156, -9, -15, -5, +170, +107, +35, +128, +253, +129, 109, -60, +128, +47, +220, 37, -46, -100, -101, -138, -87, -102, -57, -21, -31, -233, -205, -140, -144, -101, -195, -72, -123, -126, -57, -81, -117, +96, +204, +27, +197, +156, +146, +14, +38, +94, +192, +174, +219, 201, -131, -242, -76, -148, +18, +142, +235, 14, -160, +16, +68, +131, +212, +247, 37, -168, -208, -86, -14, +57, +145, +182, +139, +113, +132, +56, +135, +170, +9, +137, +3, +165, +181, +189, +117, +5, +107, +82, +181, +64, +27, +246, +20, +191, +215, +5, +185, +209, +189, +130, +99, 33, -118, -175, -0, -249, -21, -120, -51, -226, -1, -128, +209, +197, +130, +64, +178, +189, +112, +99, +232, +165, +150, +216, +76, 25, -72, -154, -213, -166, -88, -102, -240, -96, -184, +159, +178, +136, +201, +221, +209, +108, +117, +108, +77, +132, +19, 48, -171, -157, +154, +194, +1, +83, +99, +59, +176, +195, +9, +95, +143, +50, +228, 134, -236, +240, +26, +88, +120, +191, +111, +231, +149, +183, +147, +101, +156, +195, +115, +159, +170, +20, +164, 160, +131, +161, +172, +164, +132, +17, +71, +205, +35, 222, -215, -250, -128, -147, -203, -141, -19, -13, -238, -165, -31, -142, -188, -196, -36, +208, +63, +111, 202, -83, -250, -69, -21, -119, -253, -233, -148, -10, +174, +29, +88, +116, +89, +57, +252, +160, +209, +165, +231, +14, 0, -58, -193, -4, -48, +251, +12, +169, +108, +146, +12, +249, +42, +82, +178, +41, +207, +68, 119, -100, -16, +44, 78, -158, +223, +181, +216, +191, +136, +126, +7, +153, 68, -225, -33, -115, -64, -77, -158, -198, -221, -94, -65, -171, -135, -192, -22, -51, -69, -231, +4, +161, +234, +137, +164, +62, +81, +209, +80, +185, +241, 168, -131, -133, -1, -56, -163, -88, -76, -100, +161, +206, +59, +194, +119, +205, +241, +31, +49, +137, 223, -157, +80, +10, +85, +80, +203, +9, +242, +243, +148, +16, +203, 11, -53, -144, -29, -89, -221, -56, -130, -104, -107, -178, -199, -84, -147, 168, -45, -209, -94, -254, -130, -252, -1, -84, -30, -37, +223, +249, +172, +155, +34, +113, +171, 116, -131, +206, +51, +149, +218, +8, +237, +155, +145, +219, 133, -227, -74, -21, -30, +194, +112, +78, +157, +155, 241, +151, +226, +216, +51, +120, +158, +235, +194, +122, +145, +136, +54, +23, +235, +146, 37, -36, -67, -240, -82, -184, -97, -240, +155, +163, +215, +77, +63, +63, +177, +122, +173, +74, +131, +141, +143, +162, +41, +212, +119, +145, 19, -101, -99, +196, +232, +134, +187, +247, +187, +74, +79, +119, +162, +167, +87, +197, +114, +104, +183, +107, +184, +47, 140, -225, -124, -146, -209, -248, -236, -230, -11, -22, -242, -225, -156, -151, -72, -137, -201, -139, -203, -137, -73, -209, +130, 230, -136, 111, -61, -36, -211, -140, -133, -59, -17, -83, -106, -190, +11, +207, +179, +5, +149, +102, +183, 101, -166, -185, -97, -90, -60, -2, -226, -22, -133, -57, -98, -252, -109, -24, -221, -161, -47, -67, +3, 30, -92, -199, -135, -222, -202, -2, -157, 86, +176, 96, -196, -55, +137, +132, 33, -166, -28, -216, -138, -158, -186, -130, -201, -22, -138, -63, -178, -197, -82, -76, -81, -210, -78, -31, -27, -236, -54, -94, -4, -228, -225, -0, -135, -45, -193, -55, -66, -251, -99, -192, -146, -169, +190, 212, -34, -12, -73, +192, +76, 249, -31, -91, -172, -132, -162, -225, -112, -100, -66, -222, -136, -51, -109, -77, -21, -250, +46, +7, +141, +37, +161, +33, +107, +82, +29, +29, +249, +128, +133, +237, +73, +116, 86, +49, +113, +33, +231, +145, +28, +17, +47, +25, +135, 97, -35, -71, -133, +96, +185, +220, 69, -18, -226, -83, -194, -206, -108, -163, -112, -54, +176, +186, +96, +148, +164, +126, +232, +37, +243, +77, 95, -36, -40, -79, -4, -84, -180, -133, -170, -55, -210, -201, -23, +20, +86, +29, +103, +251, +108, +118, +243, +237, +195, +214, +75, +223, 250, -228, -19, +220, +106, +251, +246, +171, +29, +249, +210, +137, +104, +105, +241, 214, -230, +8, +190, 115, -95, -61, +108, +147, +70, +14, +229, +200, +41, +122, +147, +86, +165, +167, +40, 106, +28, +63, +61, +69, +40, +159, +167, +35, +229, +185, +143, +208, +36, +158, +185, +6, +222, +131, +230, +41, +69, +77, +27, +69, +68, +198, +16, +176, +198, +225, 136, -33, -226, -190, -201, +15, +68, +153, +237, +45, +172, +170, +249, +93, +46, +76, +87, +106, +179, +203, +108, +93, +122, +32, +94, +224, +198, +153, +91, +26, +174, +111, +238, +186, +159, +186, +231, +237, +187, +238, +205, +245, +224, +235, +237, +69, +251, +174, +51, +232, +255, +87, +231, +178, +115, 119, -34, -196, +115, +157, +165, +248, +223, +96, +121, +48, +81, +40, +249, +222, +170, +197, 183, -201, -95, -160, +138, +51, +241, +231, +175, +93, +193, +67, +150, +213, +173, +174, +142, +96, +163, +51, +77, +188, +209, +119, +3, +53, 169, -92, -132, -100, -16, -229, -167, -13, -206, +146, +0, +74, +8, +66, +25, +115, +79, +83, +161, +142, +80, +59, +55, +99, +62, +39, +2, +187, +12, +29, +82, +128, +55, +33, +147, +48, +200, +241, +70, +152, +195, +202, +48, +15, +194, +0, +110, +34, +134, +57, +86, +14, +87, +217, 70, -219, -71, +252, +117, +104, +6, +1, +143, +90, +214, +7, 47, -17, -202, -253, +246, +208, 133, -94, +60, +68, +57, +50, 114, +75, 228, -159, -193, -97, -150, -106, -50, -210, -49, -172, -204, -149, -203, -154, -153, -138, 136, -25, -198, -91, -184, -93, -242, -94, +142, +55, +130, +191, +179, +22, +97, +177, +71, +201, +252, +44, +117, +44, +167, 146, -202, -218, -75, -96, -239, -101, -140, +6, +185, +88, +57, +33, 187, -143, -199, -161, -133, -95, +247, +200, +231, +90, 56, -227, -49, -62, -248, +23, +174, +92, +91, +157, +105, +55, +102, +101, +52, +217, +67, +108, +170, +41, +216, +12, +103, +67, +18, +148, 5, -80, -168, -212, -32, -53, -127, -200, -208, -120, -178, -97, -27, -178, -135, -134, +122, +119, +81, +78, +106, +86, +246, 245, -38, -75, +43, +36, +198, +106, 44, -86, -34, -125, +14, +192, +202, +154, +110, +93, +51, +215, +12, +5, +205, +188, +112, +183, +237, +94, +251, +106, +240, +203, +205, +229, +215, +171, 206, -233, +224, +226, +163, 149, -126, -3, -88, -7, -241, -244, +53, +157, +251, +222, +118, +239, +206, +191, +12, +250, +231, +237, +203, +213, +24, +109, +147, +222, +237, +187, +187, +206, 245, -17, -63, +87, +126, +96, 175, -29, -234, -136, -64, -187, -94, -76, -127, +186, +215, +131, +139, 110, -60, -138, +255, +174, +125, +157, +75, 37, -172, -16, -141, -63, -197, -43, +188, +193, 182, -162, -141, -112, -147, -167, -44, -227, -166, +110, +50, +84, +251, +215, +245, +161, +62, 148, -131, +26, +74, +15, +51, +232, +252, +122, +187, +18, +155, +109, +50, +20, 64, -125, -207, -183, -133, +242, +92, +49, +32, +83, +186, +209, +11, +195, +217, +45, +158, +147, +120, 149, -98, -253, -244, -167, -71, -94, +114, +28, +210, +73, +224, +245, +142, +31, +238, +142, +111, +74, +153, +206, +37, +237, +204, +188, +240, +10, +141, +155, +117, +198, +43, +76, +117, +72, 159, -115, 60, +120, 224, -149, -22, -84, -233, -185, +70, +146, +119, +154, +20, +60, +152, +150, +71, +133, +69, 55, -15, -21, -89, -89, -206, -218, +152, +22, +207, +46, +198, +6, +97, +132, +7, +120, +7, +148, +199, 21, +35, +175, +237, +224, +37, +41, +211, +6, +39, +143, +15, +23, +156, +176, +198, +216, +12, 174, -178, -158, +216, +21, +111, +37, +73, +173, +164, +180, +109, +136, +38, +228, +195, +97, +212, +111, +8, +217, +61, 250, +13, +103, +129, +198, +14, +253, +144, +74, +168, +247, +197, +82, +41, 152, +88, +22, +70, +194, +12, +182, +14, +198, +216, +163, +183, +48, +126, +246, +195, +161, +227, +147, +117, +197, +17, +122, +122, +30, +157, +12, +44, +250, +43, +210, +41, +70, +50, +32, 3, -91, +140, +23, +101, +170, +148, +88, +155, +147, +49, +193, +159, +67, +5, +37, +48, +119, +96, +106, +210, +177, +23, +194, +50, +153, +124, +103, +113, +41, +92, +69, +69, +77, 123, -76, -35, -219, -83, -11, +166, +19, +162, +209, +176, +160, +214, +230, +133, +164, +188, +100, +80, +50, +146, +187, +94, +101, +195, +51, +186, +46, +222, +220, +116, +186, +245, +5, +145, +230, +43, +221, +30, +123, +209, +7, 71, -81, -166, +246, +85, +42, +222, +157, +82, +79, +190, +113, 62, -114, +154, +227, +67, 35, -155, -195, -194, +68, 186, -55, -50, -35, -95, -89, -203, +48, +157, +77, +112, +201, +135, +6, +8, +117, +20, +38, 134, -99, -145, -178, -137, -14, -24, -237, -198, -53, -224, -76, -18, -44, -232, -118, -13, -99, -69, -79, -243, -76, -34, -180, -56, -62, -91, +88, +202, +90, +54, +143, +162, +108, 174, -148, -52, -210, -94, -120, -198, -204, +67, +227, +199, +176, +30, +138, 106, +214, +60, +102, +172, +234, +160, +52, +135, +22, +166, +201, +54, +132, +144, 123, +212, +70, +9, +121, +184, +85, +82, +248, 24, -39, -88, -23, -27, +70, +190, +11, +68, +208, +190, +224, +206, +100, +227, +162, +154, +37, +130, +48, 223, -10, -228, -79, -134, +118, +34, +88, +109, +41, +202, 197, -220, -224, -28, -39, -250, -6, -191, -117, -177, -228, -117, -18, -2, -131, -103, -193, -199, -106, 32, -137, -215, +214, +252, 130, -25, -104, -54, -187, -201, -196, -137, -102, -232, -110, +217, +66, +204, +107, +48, +228, +205, +22, +252, +244, +124, +83, 207, -110, 240, -141, -254, -18, +61, +213, +77, +195, +60, +180, +179, +121, +178, +20, +223, 120, +204, +123, +84, +8, +165, +158, +16, +156, +81, +34, +198, +134, +234, +11, 143, -162, -31, -142, -190, -203, -4, +83, 184, -10, -140, -255, -202, -106, -113, -7, 162, -125, -211, -85, +6, +15, +57, +8, +61, +88, +169, +84, +168, +20, +81, +147, +237, +226, +160, +152, +151, +253, +24, +152, +79, +138, +245, +68, +142, +115, 238, -75, +3, +219, +116, +52, +65, +231, +107, +96, +29, +44, +230, +28, +143, +48, +93, +0, +83, +24, +254, +70, +141, +235, +5, +98, +49, +119, 129, 171, -35, -28, -56, -245, -31, -126, -114, +30, +76, +188, +223, +102, +225, +86, +3, +174, +45, +221, +44, +12, +182, 157, -196, -73, -29, -91, -121, -62, -98, +88, +114, +51, +229, +142, +199, 119, +225, +51, +125, +215, +196, +155, +162, +102, +51, +116, +14, +220, +0, +77, +237, +162, 208, +243, +246, +161, +187, +94, +251, +186, +255, +233, +166, +119, +53, +56, +255, +210, +190, +254, +220, +185, +200, +116, +88, +255, +193, +32, +245, 115, -136, -126, -99, +124, 48, -160, -169, -157, -227, -34, -176, -132, -3, -236, -95, -79, -166, -30, -30, +230, +143, +28, 73, -153, -202, -157, -135, -66, -173, -195, -93, -79, -13, -242, -163, -98, -52, -93, +162, +170, +83, +38, +51, +222, +216, +73, +19, +165, +83, +41, +14, +148, +22, +152, +248, +231, +94, +24, +149, +44, +83, +165, +198, +193, 4, -223, -81, -137, -90, -88, -175, +212, +49, +59, +210, +73, +143, 34, -116, -129, -118, -8, -30, -2, -137, -251, -78, -241, -114, +35, +217, +185, +154, +147, +40, +147, +15, +144, +34, +101, +148, +181, +82, +103, +139, +164, +210, +145, +233, +152, +6, +37, +190, +242, +235, +236, +92, 99, -1, -95, -202, +113, +231, +191, +221, +244, +46, +179, +21, +254, +193, +68, +227, +87, +28, +229, +215, +238, +221, +234, +32, +37, +227, +104, +24, +171, +172, +89, +175, +226, +158, +253, +170, +32, +251, +161, +20, +100, +175, +74, +240, +163, +81, +130, +119, +174, +186, +253, +62, +142, +115, +126, +115, +13, 24, -245, +238, +124, +238, +117, +58, +253, +231, +212, +226, +70, 227, -11, -96, -170, +20, +0, +204, +118, +237, +79, +165, +116, +243, +27, +234, +218, +155, +211, +158, +124, 185, -14, -33, -245, -133, -125, -115, -49, -9, +244, +13, +20, +72, +255, +112, +192, +104, +190, +189, +23, +31, 183, -66, -167, -178, -123, +21, +32, +247, +83, +82, +220, +182, +244, +68, +227, +5, +194, +109, 105, +112, +67, +69, +189, +109, +146, +89, +252, +96, +85, +184, +45, 150, -91, -149, -15, -38, -196, -127, -235, -68, -81, -24, -221, -193, -12, -246, -156, -18, +254, 162, -111, -238, -68, -152, -89, -224, -9, -52, -218, +42, +92, +151, +90, 215, -124, -220, -19, -34, -1, -127, -186, -120, -35, -181, -27, -145, -91, -35, -138, -96, -196, +75, +168, +84, +109, 153, -227, -179, -146, -136, +178, +236, +120, +171, +76, +219, 16, -174, -101, +163, +198, 139, -253, -105, -113, -169, -56, -40, -114, -216, -158, -239, -111, 67, -42, -198, -211, -80, -58, +219, +2, +243, +92, 21, -16, -93, -86, -16, -172, -228, -14, -29, -233, -216, -18, -12, -255, -16, -119, -19, -93, -129, +232, +122, +184, +178, 103, -120, -101, -8, -22, -100, -225, -225, -126, +11, +24, +239, +173, +36, +177, +122, +224, +209, +6, +255, +254, +162, 47, -72, -120, -65, -88, -202, -60, -201, -117, -238, -201, -112, -153, -148, -176, -223, -166, -250, +163, +135, +226, +11, +111, +89, +159, +152, +7, +32, +203, +84, +63, 115, -222, -17, -94, -154, -202, +176, +233, 219, -169, -83, -123, -162, -40, -153, -112, -174, -206, -66, -121, +248, +235, +236, +26, 98, -252, -18, -5, +43, +91, +80, +131, +133, 175, -97, +128, +134, +254, +223, +54, +176, +58, +43, +136, +122, +9, +145, +238, +57, +192, +43, +239, +239, +113, +45, +100, +251, +14, +189, +192, +253, +73, +224, +133, +152, +29, +51, +139, +77, +0, +154, +36, 174, -165, -18, -155, -34, -249, -79, +229, +118, +41, +215, +131, +159, +26, +97, +169, +213, +68, +198, +209, +181, +57, 64, -47, -242, -203, -74, -255, -168, -193, +154, +224, +21, +43, +190, +56, +117, +140, +131, +229, 211, -208, +216, +191, +241, +192, +153, +75, +253, +48, +183, +160, +131, +42, +253, +49, +89, +16, +67, +115, 80, -193, -1, -220, -73, -25, -208, -214, -243, -96, -40, -251, +181, 58, -247, -142, -231, -35, -83, -221, -98, -61, -176, -222, -61, -174, -50, -128, -87, +31, +214, +154, +226, +193, 43, -127, -151, -100, -236, -145, -151, -40, -67, -229, -165, -233, -72, -221, -210, -155, -207, +194, +130, +232, 56, +134, +218, 112, +243, +176, +246, +12, +28, +86, +199, +84, +126, +103, 16, -255, -37, -115, +118, +187, +103, +207, +106, +214, +62, +86, +123, +47, +48, 67, -215, -126, -221, -254, -91, -108, -173, -194, -17, -221, -50, -84, -158, -60, -72, -236, -161, -111, -88, +252, +90, +246, +29, +245, +197, +225, +222, +135, +200, +113, +189, 133, -109, -109, -217, -239, -107, +1, +54, +117, +187, +134, +181, +185, +122, +154, +23, +146, +213, +124, +238, +5, +31, +195, +167, +242, +209, +50, +215, +128, +185, +136, +18, 61, -28, +114, +101, +201, 4, -188, 171, -133, -208, -253, -28, -107, -97, -200, -69, +251, +193, +178, +125, +115, +190, +155, +65, 224, -203, -204, -221, -196, -92, -82, +28, 149, -61, -35, -254, -96, -181, -27, -227, +193, +246, +225, +208, +179, 140, -109, -16, -133, -64, -133, -36, -212, -244, -22, -255, -196, -110, -49, -217, -7, +106, +126, +198, +66, 98, -78, -51, -142, -90, -37, -186, -82, -136, +242, +21, +174, +80, +0, +64, +234, +76, +47, 99, -214, -40, -1, -177, -30, -205, -85, -43, -171, -151, -92, -205, -83, -207, -67, -62, -13, -179, -2, -219, -165, +63, +116, 18, -238, -121, -243, -38, -51, -139, -81, -48, -28, -45, -183, -126, -135, -121, -123, -161, -143, -225, -24, -48, -206, -14, -156, -147, -36, -3, -103, +251, +16, +155, +120, +49, 30, -70, -7, -204, -75, -226, -122, -241, -234, -129, -220, -179, -132, -177, -150, -1, -170, -82, -169, -161, -133, -235, +123, +79, +6, +252, 133, -138, -239, -166, -210, -135, -67, -103, -244, -189, -100, -229, -196, -205, -99, -137, -246, -234, -215, +106, +87, +174, 24, +68, +174, +182, +58, +15, 84, -166, -160, -103, -31, -93, -207, -190, -212, -207, -75, -178, -169, -13, -60, -251, -75, -178, -169, -205, -135, -101, -238, -44, -140, -226, +170, +242, +134, +2, +161, +201, 162, -117, -187, -102, -141, -193, -122, -150, -151, -252, -91, -252, -34, -31, -62, -255, -86, -150, -248, +27, 213, +160, 36, -185, +29, +78, +36, +141, +16, +170, +219, +149, +69, 40, -183, -107, -88, 247, -165, -167, -57, -168, -62, -80, -37, -195, -53, -73, -131, -219, -112, -30, -219, -73, -17, -154, -131, -97, +47, 229, -37, -83, -219, -102, -56, -254, -251, +46, +161, 102, -106, -219, -112, -109, -208, -60, -93, -120, -139, -15, -78, -95, -51, -136, -14, -42, -82, -248, -50, -152, -36, -198, -49, -145, -71, -160, -208, -39, -214, -37, -99, -172, -63, -44, -60, -63, -121, -211, -13, -196, -45, -0, -24, -111, -103, -177, -117, -51, -214, -91, -51, -135, -108, -44, -129, -43, -163, 62, -89, -184, -112, -32, -84, -150, -228, -7, -18, +224, +123, +168, +75, +40, +179, +161, +127, 39, -156, -241, -1, -203, +195, +146, 182, -43, -97, -28, -164, -235, -79, -231, -125, -26, -132, -213, -239, -241, -98, -142, -82, -82, -140, -154, -249, -84, -63, +44, +19, +161, +243, +56, 149, -233, +169, +9, +51, +134, +219, +54, 228, -125, -63, -211, -46, -115, -1, -157, -113, -170, -101, -23, -83, -104, -235, -147, -98, -153, -17, -192, -10, +219, +166, +7, +45, +89, +255, 152, -52, -155, -128, +225, +105, +36, +66, +74, +215, +173, +169, +14, +43, +177, +29, +94, 32, -106, -163, -28, -49, -96, -118, -178, -163, -206, -151, -111, -194, -224, +9, +226, 205, -3, -7, -22, -206, -97, -34, -103, -52, -37, -71, -135, -57, -0, -172, -50, -78, -204, -96, -28, -204, -188, -75, -49, 218, -83, -233, -204, -113, -97, -169, -143, -139, -149, -0, -128, -246, -136, -32, -239, -164, -90, -146, -216, -118, 85, -208, -32, +115, 47, -156, -60, -119, +152, 230, -14, -170, +136, +176, +239, +37, +231, +245, +84, +150, +72, +123, +112, +126, +95, +28, +153, +106, 185, +80, +242, +41, +247, +31, +11, +170, +236, +98, +74, +154, +183, +13, +134, +9, 208, -199, +71, +42, +83, +48, 102, -236, +244, +213, +5, +199, 161, -182, +209, +52, +205, +10, +140, +206, +90, +100, +112, +199, +26, +123, +206, +112, +72, +7, +208, 73, -143, -76, -5, -213, -248, -39, -82, -64, -193, -143, -164, -18, -11, -23, -28, -197, -34, -31, -19, -25, -144, -151, -141, -229, -189, -24, -202, -137, -23, -196, -3, -28, -203, -174, -182, -237, -147, -89, +105, +120, +10, +140, +218, +106, 24, -202, -36, -107, -219, -20, -228, -170, -78, -0, -3, -153, -233, -0, -39, -30, -58, -176, -240, -175, -182, -11, -30, -57, -115, -47, -129, -251, -255, -123, -229, -237, -203, -103, -79, -82, 91, -24, -8, -56, -249, -50, -26, -193, -1, -177, -135, -43, -150, -163, -217, -124, -144, 132, -245, -104, -154, -146, -176, -204, +227, +177, +114, +10, 38, -220, +221, +172, +61, +41, +199, +81, +6, +60, +138, +65, +113, +91, +213, +174, +100, +250, +152, +60, 200, +165, 136, -170, -92, -193, -173, -2, -120, -222, -196, -120, -168, -200, -33, -10, -189, -156, -156, -200, +121, +1, +216, +166, +146, +183, +192, +44, 139, -49, -29, -3, -28, -207, +20, +204, +191, +150, 32, -9, -209, -61, -136, -215, +82, +163, +208, +247, 157, -30, -211, -55, -111, -113, -231, -124, -25, -199, -45, -241, -11, -254, -41, -145, -212, -210, -85, +121, +156, +171, +49, 253, -87, -250, -73, -5, -246, -217, -226, -134, +76, +20, 106, -6, -86, -43, -189, -188, -245, -116, -145, -47, +218, +180, 12, -142, +153, +74, 111, -13, -148, -190, -114, -251, -37, -3, +61, +226, +85, +39, +202, +73, +199, +44, +65, 165, -111, -250, -24, -78, -72, +114, +240, +52, +75, +166, +124, +46, 61, -71, -235, -97, -234, +159, +206, +87, +6, +207, 84, -83, -98, -162, -214, -101, -115, -12, -203, -47, -102, -199, -244, -163, -167, -222, +72, +72, +70, +3, +21, +60, +105, 160, -177, +142, +214, +13, +155, +245, +18, +91, +131, +235, +133, +148, 23, -197, -137, -8, -71, -163, -5, -191, -14, 156, -20, -104, -49, -92, -57, -152, -202, -9, -46, -34, -207, -52, -224, -212, -60, -82, -193, 135, -10, -241, -186, -57, +201, +165, +55, +153, +22, +42, +12, 170, -142, -249, -8, -163, -17, -96, +47, 76, -25, -253, -197, +117, +202, +48, +132, +143, +61, +4, 245, -156, -93, -9, -209, +107, 1, -15, -91, -123, -129, -71, -57, -255, -99, -233, -68, -163, -41, -47, -77, -171, -166, -241, -185, -177, -119, -169, -194, -141, -25, -192, -211, -90, -147, -138, +75, +52, +154, +98, +168, +130, +35, +128, +127, +240, +201, 217, -116, -119, -182, -226, +22, +54, +95, +55, +34, +167, +32, +31, +51, +204, +26, +151, +159, +104, +139, 20, -65, -249, -1, -80, -186, -229, -94, -254, -176, -135, -29, -216, -181, -68, +76, +193, +131, +16, +19, +172, 163, -208, -137, -153, -126, -195, -171, -169, -41, -248, -243, -216, -56, -242, -187, -1, -200, -7, -174, -23, -237, -151, -174, -146, -235, -9, -39, -71, -3, -102, -187, -84, +42, +190, +209, +47, +247, +236, +98, +196, +190, +72, +51, +204, +12, +71, +77, +85, +201, +225, 148, -153, -231, -239, -153, -37, -36, -54, -16, 95, -87, -46, -110, -91, -195, -58, -64, -90, -219, -194, -7, -26, -10, -238, -159, +115, +189, +72, +215, +170, +208, +9, +154, +40, +123, +103, +136, 97, +20, 128, -252, -18, -216, -219, -70, -217, -115, -223, -191, -19, -67, -143, +46, +137, +158, +77, 50, +55, +77, +146, +200, +96, +65, +201, +78, +146, +105, +20, +46, +38, +228, +25, +133, +129, +212, +92, +228, +14, +31, +12, +242, +160, 210, -145, -147, -130, -53, +13, +209, +129, +74, +69, +110, +192, 112, -242, +99, +111, +178, +192, +130, +172, +195, +37, +59, +63, +105, +66, +46, +225, +181, +152, +160, +155, +46, +137, +65, +252, +236, +228, +6, +32, +111, +20, +73, +201, +25, +179, +5, +2, +100, +55, +23, +55, +127, 17, -216, -163, -1, -93, -162, -253, -232, -22, -240, +221, +153, +51, +81, +0, +167, +104, +109, +82, +245, +14, +135, +66, +86, +136, +23, 254, -68, -91, -102, -219, +140, +107, +5, +73, +101, 190, +136, +40, +151, +7, +15, +168, +131, +49, +140, +14, +192, +115, +67, +176, +35, +90, +238, +27, +194, +126, +140, +197, +230, 169, -219, +14, +45, +72, +70, +11, +204, +161, +31, +19, +186, +176, 21, -188, -225, -110, -99, -248, -86, -58, +239, +176, +254, +65, +237, +21, +229, +250, +207, +53, +138, +167, +82, +114, +69, +246, +52, +23, +37, +185, +240, 82, -150, -174, -119, -105, -13, 5, -74, -129, +92, +60, 217, -85, -21, 19, -173, -9, -64, -9, -87, -102, -103, -136, +220, +39, 202, +242, +234, +136, +161, +135, +119, +191, +48, 100, -91, +164, +11, +76, +184, +45, +56, +76, +223, +169, +204, +187, +147, +0, +94, +237, +195, +106, +120, +84, +3, +61, +136, +110, +168, +252, +175, +213, +71, +171, +215, +154, +2, +151, +244, +58, +112, +245, +76, 185, -193, -250, -196, +9, +109, +37, +30, +239, +20, +36, +67, +151, +241, +34, +200, +134, +111, +119, +141, +48, +211, +75, +78, +98, 179, -23, +209, +67, +158, 182, -58, -207, -217, +172, +46, +110, +208, 241, -207, -49, -114, -212, -30, -123, +133, +83, +187, +240, +93, +34, +29, +106, +104, +76, 14, -227, -208, -95, -216, +128, +13, +128, +93, +4, +218, +81, +230, +113, +79, +97, +108, +246, +109, 39, -61, -163, -228, -48, -254, +248, +241, 113, -173, -69, 215, +128, +171, +220, +138, +58, +94, +173, +12, +248, +184, +27, +229, +184, +84, +171, +218, +55, +25, +167, +74, +139, +128, +151, 252, -46, -177, -150, -123, -144, -110, +81, +49, +130, +45, +36, +11, +227, +133, +175, +138, +128, +48, +87, +175, +163, +112, +196, 220, -1, -101, -57, +123, +8, +19, +235, +20, +20, +19, +105, +203, +205, +90, +212, +208, +81, +187, +178, +186, +146, +82, +193, +98, +99, +223, +155, +15, +166, +187, +49, 175, -182, -156, -50, -211, +219, +149, 78, -147, -153, -63, -160, -8, +138, +145, +96, +93, +118, +111, +158, +223, +131, +76, +60, +90, +150, +56, 243, +56, +218, +92, +186, +3, +227, +130, +215, +85, +138, +198, +166, +39, +95, +205, +90, +16, +237, +74, +227, +253, +193, +16, +239, +15, +245, +226, +61, +19, +82, +43, +160, 253, -207, -237, -185, +225, +32, +104, +47, +15, +58, +135, +174, +227, +123, +222, +160, +73, +108, +133, +200, +48, +167, +177, 24, -0, -130, -138, -157, -3, -204, -205, -36, -237, -0, -19, -207, -7, -142, -235, +158, +42, 70, -32, -115, -237, -109, -110, -95, -142, -247, -75, -19, -183, -57, -8, -5, -57, -207, -159, +130, +184, +185, +34, +27, +113, +38, +190, +102, +196, +71, +125, +119, +74, +44, +132, +65, +165, +217, +245, +221, 209, -212, +43, +220, +195, +51, +16, +73, +199, +141, +53, +111, +196, +243, +150, +223, +147, 65, -183, -85, -52, -238, -146, -81, -151, -56, -89, -0, -52, -229, -108, -74, -105, -11, -180, -202, -176, -158, -88, -118, -30, +68, +14, +16, +187, +211, +9, +100, +53, 173, -8, -17, -69, +123, +240, +183, +37, +237, 87, -165, -176, 219, -194, -55, -115, -146, -81, -93, -138, -27, -249, -56, -143, -202, -60, -48, -231, -97, -22, -114, -134, -99, +128, +163, +224, +189, 192, -81, -68, -142, -146, -64, -35, -137, -129, -131, -185, -254, -47, -241, +21, +208, +2, +202, +80, +247, 2, -255, -27, -125, -166, 220, -145, -19, -185, -229, -214, -186, -133, -171, -63, -196, -98, -91, -196, +102, +232, +46, +64, +108, +200, +246, +212, +5, +114, +204, +197, 99, -139, -2, -143, -221, -228, -250, -131, -240, -40, -117, -68, -185, -245, -31, +102, +6, +28, +166, +106, 86, -75, -20, +82, +19, +148, +178, +104, +56, +138, +202, +16, +203, +39, +230, +148, +184, +237, +22, 70, -238, +247, +125, +143, +145, +49, +10, +196, +3, +181, +162, 96, -219, -147, -87, -130, -48, -101, -220, -86, +184, +169, +250, 19, -158, -86, 115, -199, -29, -184, -114, -228, -205, -28, -127, -11, -225, -46, -1, -178, -235, +38, 77, -128, -189, -110, -26, -236, +168, +88, +124, +196, +57, +129, 223, -101, +149, +217, +29, +181, +134, +166, 20, -62, -43, -152, -101, -132, 73, -89, +135, +95, +36, +249, +81, +242, +104, +6, +218, 17, 221, +176, 228, -169, -180, -55, -11, -169, 158, -24, -132, -245, -61, -79, -236, +102, +121, +209, +52, +253, +21, +122, +33, +32, +210, +2, +98, +241, +235, +184, +64, +178, +3, +56, +172, +69, +156, +40, +25, +14, +107, +45, +100, +20, 47, -226, -82, -226, -232, -246, -80, -36, -207, +21, +187, +202, +108, +114, +186, 172, -80, -112, -5, -160, -35, -57, +230, +147, +61, +175, +172, +251, +76, +244, +177, +96, +65, +110, +19, +238, +203, +108, +224, +212, +116, +3, +167, +181, +109, +96, +198, +183, +28, +197, +22, +78, 247, -157, -81, -125, -32, -87, -87, -220, -132, -81, -89, -153, -171, -199, -107, -97, -93, -13, -41, +183, +133, 107, -226, -85, +43, +207, 109, -205, -152, -68, -129, -49, -153, -181, -48, -22, -128, 226, -172, +180, +194, +38, +206, +66, +119, +129, +154, +46, +163, +146, +116, +170, +37, +175, +230, +60, +244, +67, +195, +50, +70, +184, +145, +35, +108, +46, +212, +32, +158, +42, +240, +145, +147, +130, +169, +80, +141, +218, +188, +185, +247, +36, +125, +166, +51, +179, +133, +159, +120, +115, +223, 99, -207, +253, +20, +105, +177, +104, +164, +50, +219, 149, +173, +192, +108, +191, +10, +43, +52, +216, +177, +125, +47, +177, +186, +202, +236, +147, +58, +191, 21, -184, -21, +42, +24, +41, +173, +22, +191, +37, +42, +54, 133, -66, -107, -141, -244, -143, -140, -195, +22, +222, 86, -94, -47, -182, +213, +90, 250, -96, -89, -35, -248, -89, -40, -209, -77, -19, -65, -101, -15, -185, +90, +203, +97, +232, 66, -143, -202, -214, -152, -233, -122, -9, -117, -168, -43, -204, -120, -106, -12, -131, -89, +176, 101, -96, -227, -4, -115, -111, -170, +184, 111, -201, -88, -87, -230, -240, -62, -15, +197, +241, +238, +173, +139, 165, -237, -145, -32, -87, -180, -209, -199, -189, -174, -99, -205, -245, -46, -14, -47, -209, -81, -128, -7, -85, -158, -160, -91, -92, -68, -133, -202, -167, -91, -77, -111, -69, +148, +225, +31, +138, +6, 69, -88, -158, -90, -106, -137, -152, -50, +67, +135, +125, +39, +33, +151, +160, +141, +1, +23, 239, -30, -56, +204, +46, +12, +151, 94, -35, +97, +36, +156, +168, +231, +250, +109, 105, +78, 98, -123, -90, -55, -44, -118, -52, -80, -118, -206, -156, -72, -147, -157, -187, -219, -104, -97, -90, -202, -128, -234, -204, -228, -16, -71, -209, -15, -10, -202, +127, 85, -102, -28, -101, -104, -92, -241, +5, +20, +105, +106, 154, -1, -32, -62, -21, -157, -71, -135, -132, -186, -87, -215, -129, -108, +229, +217, +110, +231, 221, -62, -132, +186, 173, -219, -105, -36, -225, -129, -206, -71, -189, -124, +21, +82, +93, +59, +41, 195, -31, -95, -181, -94, -193, -207, -248, -95, -106, -112, -71, -137, -7, -8, -10, +116, +66, +80, +90, +111, +132, +5, +247, +90, +41, +205, +113, +242, +148, 152, -26, -190, -46, -181, -73, -172, -193, -218, -194, -104, -246, +28, +220, +10, +70, 164, -227, -255, -128, -59, -229, -5, -170, -58, -97, -150, -3, -165, -218, +72, 206, -189, -109, -189, -59, -253, -99, -235, -253, -202, -158, -169, +194, +7, +89, +231, +98, +214, +113, +142, +51, +232, +195, 111, -171, -239, -19, -204, -55, -31, -72, -119, -34, -173, +9, +30, 229, -129, 109, -42, +223, +145, +177, +157, +202, +45, +153, 29, -242, -230, -89, -185, -248, -52, -13, -166, -56, -199, -231, -63, -192, -124, -93, -193, -155, -57, -252, -66, -149, -222, -50, -229, -137, -174, -184, -160, -105, -164, -208, -142, +211, 74, +244, +21, +21, +112, +163, +143, +161, +187, +204, +83, +215, +219, +233, 50, -176, -79, +246, +70, +49, +127, +109, +72, +96, 115, -65, -200, -172, -143, 125, +88, +199, +71, +35, +147, +133, +146, +75, +155, +219, +86, +195, +74, +33, +19, +30, +6, +151, +225, 94, -121, -78, -236, -142, -156, -47, -131, -38, -229, +144, +164, +191, +58, +46, +39, +234, +106, +225, 163, -36, +180, +72, +60, +223, +251, +141, +156, +15, +4, +170, +73, +225, +165, +162, +254, 124, -74, -89, -220, -128, +255, 191, -228, -126, -109, -56, -48, -27, -220, -216, -109, -170, +41, +16, 217, -42, -238, +99, +254, +30, +56, +19, +30, +10, +218, +120, +74, +92, +200, +202, +20, +175, +204, +114, +38, 62, -42, -53, -48, -135, -163, 209, -28, -101, -28, -127, -0, -62, -114, -26, -106, -24, -190, -210, -142, -73, -143, -51, -127, -0, -109, -169, -122, -111, -53, -8, -53, -75, -244, -219, +155, +25, +33, +203, +134, +145, +246, +252, +114, +162, +234, +146, +7, 229, -133, -160, -17, -201, -206, -28, -84, -16, -120, -16, -182, -69, +153, +40, +29, +64, +75, 80, -63, -116, -139, -224, +161, +173, +28, +66, +236, +94, +1, +242, +43, +240, +102, +196, +3, +0, +51, +144, +52, +171, 77, -6, -160, -149, -254, -184, -186, -199, +177, +204, +224, +193, +112, +97, +86, +59, +13, +217, +65, +189, +175, +245, +1, +39, +151, +27, 39, +26, +60, +72, 63, -107, -246, -110, -159, -220, -91, -80, -119, -97, -145, -144, -33, -237, -116, -170, +28, +121, +137, +73, +148, +167, +244, +139, +42, +238, 250, -194, -130, 211, -135, -228, -204, +41, +21, +0, +116, +130, 9, -56, -66, -125, -196, -37, -30, -179, -95, -208, -23, 96, +238, +200, +32, +156, +60, +139, +194, +67, 230, -253, -174, -50, -47, -206, -228, -44, -196, -92, -1, -177, -51, -33, +128, +154, +60, +143, +187, 189, -104, -64, -41, -174, -38, -68, +130, +86, +15, +129, +45, +102, +138, 206, +81, +7, +11, +3, +112, +70, +177, +152, +200, +190, +191, 16, -123, -252, -187, -149, -151, -229, -68, -214, -199, -146, -150, -73, -22, 106, -149, -173, -32, -158, -14, -48, -218, -204, -40, 32, -140, -188, -122, -27, -86, -165, -196, -121, -255, -198, -67, -161, -197, -168, -110, +59, +178, +186, +113, +4, +209, +214, +100, +143, +169, +38, 81, -165, -164, -180, -123, -193, -102, -188, -213, -87, -180, -254, +91, +162, +189, +252, +5, +249, +3, +168, +60, +74, +232, +6, +11, 199, -170, -64, -2, -118, -231, -7, -202, -184, -10, -139, -76, -22, -205, -145, -175, +149, +42, +60, +226, +75, +72, +134, +224, 165, -47, -87, -139, -132, +112, +195, +224, +247, +148, +141, +49, +134, +243, +73, +70, +227, +243, 219, -102, -252, +175, +88, +200, +135, +115, 94, -137, -233, -116, -157, -7, +34, +37, +38, +47, +46, +39, +38, +69, +155, +35, +190, +245, +144, +76, +51, +22, +238, +69, +76, +169, +249, +150, +153, 230, -0, -151, -62, -209, -154, +134, +105, +241, +8, +136, +91, +20, +230, +136, +241, +183, 97, -248, +116, +143, +190, +12, +121, +112, +29, +31, +122, +43, +11, +116, +90, +129, +17, +223, +132, +152, +114, +96, +43, +122, +234, +10, +38, +91, 40, -227, -52, -5, -211, -151, -174, -57, -157, -99, -216, -208, -180, 254, -77, +200, +22, +75, +49, +69, +73, +59, +125, +108, +176, +219, +120, +17, +144, +135, 3, -117, -199, -185, -248, -242, -201, -98, 28, -149, -253, -102, -53, -19, -205, -78, -56, -132, -158, -97, -53, -39, -173, -234, -201, -79, +182, +4, +223, 8, -52, -33, -37, +237, +143, +1, +75, +166, +82, +139, +48, +36, +229, +127, +108, +177, +18, +138, +134, +195, +145, +9, +121, +35, +206, +180, +53, +85, +232, +91, +133, +141, +28, +21, 22, +73, 136, -254, +79, 9, -160, +59, 179, -69, -169, -178, -168, -104, -177, -64, -242, -49, -33, -15, -117, -248, -58, -1, -49, -170, -248, 141, -76, -70, -167, -156, -14, -0, -229, -126, -174, -136, -195, -101, -113, -29, -104, -237, -4, -241, -220, -65, -29, +194, 217, -82, -204, -156, -248, -59, -253, -62, -15, +124, +145, +160, +60, +17, +80, 209, +22, +170, +222, +72, +39, +95, +232, +147, +79, +88, +155, +207, +125, +245, +168, +33, +134, +136, +251, 38, -141, -57, -249, +223, +137, +16, +223, 38, -1, -116, -162, -228, -6, -244, -35, -118, -20, -99, -199, -243, -99, -124, -124, -157, -20, -114, +127, 129, -206, -242, -147, -128, -203, -0, +166, 114, -203, -144, -211, -148, -97, -1, -95, -160, -234, -190, -55, -250, -206, -69, 17, -84, -46, -57, -53, -52, -11, -23, -255, -191, -189, -111, +146, +65, +148, +159, +54, +56, +27, 109, -110, -91, -87, -18, -252, -60, +31, +189, +68, +40, 247, +23, +122, +201, +145, +127, +6, +135, +89, +170, +201, +72, +199, +176, +50, 87, -112, -243, -229, -58, -91, -78, -206, -73, -114, -102, +46, +107, 102, -183, -106, +42, +34, 102, -171, -100, -91, -78, -180, -215, -182, -188, -146, -124, -114, +24, +111, +225, +118, +201, +7, +73, +42, +107, +47, +129, +189, +151, +49, 238, -164, +62, +30, +135, +22, +126, +225, +140, +199, +248, +224, +23, +64, +161, 82, +131, +212, +252, +49, +67, +227, +201, +134, +109, +200, +30, +26, +214, +155, 44, -72, -130, -36, -78, +177, +88, +137, +244, +57, +167, +87, +250, +13, +96, +29, +196, +211, +183, +71, +252, +188, +118, +168, +35, +2, +237, +122, +49, +253, +185, +241, 40, +150, +176, +66, +52, +254, +20, +175, +216, +138, +54, +194, +77, +158, +178, +140, +155, 82, -151, -164, +14, +2, +245, +61, +223, +22, +86, +138, +245, +211, +159, +30, +121, +125, +206, +241, +128, +87, +90, +80, +165, +231, +222, +60, +84, +100, +101, +57, +107, +87, +184, +202, +122, +234, +99, +14, 108, -235, -252, -250, +237, +49, +141, +108, +79, +45, +28, 69, -119, -3, -124, -72, -162, -5, -144, -132, -30, -190, -169, 153, +250, +200, +141, +108, +14, +11, +235, +222, +200, +140, +124, +101, +45, +27, +142, +69, +202, +38, 58, -55, -182, -9, +96, +180, +27, +215, +128, +51, +73, +176, 160, -95, -104, -52, -26, -253, -152, -134, -105, -57, -20, -47, -81, -129, -234, -144, -35, -48, -228, -194, -54, -50, -82, -253, -0, -161, +219, +53, +140, +21, +61, +205, 11, -16, -212, -77, -24, -121, -193, -71, -129, +137, +208, +226, +248, +108, +185, +82, +210, +72, +123, +225, +25, +51, +171, +237, +97, +156, +96, +93, +108, +124, +43, +144, +63, +25, 22, +115, +131, +115, +156, 232, -214, -114, -103, -154, -186, -167, +41, +126, +235, 98, -195, -157, -1, -80, -159, -101, -129, -119, -216, -157, +201, +235, +36, +4, +6, +207, +130, +143, +213, +64, +18, +175, +5, +51, +208, +108, +118, +147, +137, 19, -230, -98, -193, -52, -23, -222, -245, -196, -177, -254, -162, -160, -228, +205, +208, +221, +157, +223, +226, +27, +253, +53, +240, +158, +68, +63, +28, +125, +151, +9, +112, +21, +24, +255, +149, +213, +226, +14, +68, +251, +182, +171, +220, +151, 2, -250, -29, -209, -33, -170, -184, 87, -165, -236, -152, -188, +71, +56, +112, +234, +63, +252, +228, +58, +137, +147, +58, +182, +242, +124, +196, +238, +160, +231, +16, +253, +198, +96, +64, +83, +59, +199, +69, +96, +9, +7, +216, +191, +158, +76, +61, +60, +146, +50, +149, +59, +143, +133, +90, +135, +187, 158, -10, -178, -70, +26, +228, +71, +197, +104, +186, +8, +190, +163, +18, +181, +176, +94, +69, +232, +2, +237, +16, +60, +4, +18, +247, +157, 226, -122, -164, -209, -145, -65, -126, -87, -85, -53, -23, -251, -209, -153, -213, +229, 198, -163, 2, -41, -8, -175, -234, -245, -156, -206, -39, -205, +190, +148, 49, -2, -207, -73, -193, -60, -131, 234, -205, -183, -173, -222, -231, -206, -157, +199, +23, +192, +84, +115, +29, +66, +234, +11, 251, -63, -197, -141, -111, -57, -127, -43, -61, +230, +98, +18, 110, -74, -188, -207, -157, -75, -213, -138, -26, +133, +78, +101, +247, +210, +44, 183, -61, -54, +42, +31, +76, +136, +255, +214, +137, +162, +48, +186, 135, -195, -45, -73, -155, 25, +236, +57, +37, +68, +223, +220, +137, +48, 179, -11, -64, -216, +192, +51, +104, +180, +175, 249, -115, -162, -220, -200, -1, +184, 39, -227, -249, -71, -16, -62, -229, -150, -61, -151, -53, -79, -133, -26, +68, +2, +254, +116, +241, +70, +106, +55, +34, +183, +70, +20, +193, 136, -198, -130, -75, -169, -137, -72, -147, -169, -114, -171, -225, -104, -228, -47, +51, 199, -213, -130, -32, -215, -217, -85, -47, 103, -169, -46, -151, -95, -184, -107, +37, +17, +33, +92, +203, +22, +251, +211, +226, +82, +113, +80, +228, +176, +61, +223, +223, +134, +84, +140, +167, +161, +116, +42, +32, +186, 172, -241, +32, +88, 201, -128, -61, -232, -204, -63, -77, +29, +58, +210, +177, +37, +24, +254, +33, 238, -28, -61, -87, +38, +186, +2, +207, +240, +202, +16, +44, +200, +194, +195, +253, +94, +144, +240, +130, +176, +148, +121, +146, +235, +220, +147, +225, 50, -110, -104, -112, -162, -18, -5, -188, -192, -155, -47, +41, +97, +191, +77, +245, 231, -46, -25, -71, +188, +35, +188, +52, +149, +183, +83, +167, +246, +68, +81, +50, +225, +92, +157, +133, +242, +196, +248, +37, +10, +94, +195, +92, +75, +37, 54, -203, -74, -202, +69, +242, +159, +128, +94, +228, +151, 149, -28, -88, -137, -100, +254, +81, +131, +167, +161, +161, +130, 3, -11, +184, +147, +50, +160, +173, +231, +193, +80, +246, +117, +30, +28, 207, +71, 166, -236, -84, -245, -110, -103, -17, -20, +186, +197, +122, +96, +189, +123, +92, +101, +0, +175, +86, +254, +46, +201, +216, +35, +47, +81, +134, +202, +75, +211, +145, +186, +165, +55, +159, +113, +224, +32, +254, +75, +230, +134, +174, +253, +186, +253, +143, +216, +90, +133, +35, +186, +101, +168, +60, +121, +148, +216, +67, +223, +176, +10, +219, +218, +178, +223, +215, +122, +56, +8, +120, +87, 11, -74, -194, -74, -21, -38, +161, +251, 57, -28, -149, -182, +214, +194, 144, -49, -4, +139, +192, +151, +153, +187, +137, +185, +164, +42, +123, +70, +252, +193, +106, +55, 198, -118, -115, -76, -44, -125, -148, -83, -167, -44, +25, +219, +32, +10, +129, +10, +73, +168, +233, +45, +254, +137, +221, +98, +178, +15, +196, +156, +102, +28, +181, +74, +116, 165, -101, +16, +199, +172, +81, +2, +98, +61, +154, +171, +86, 86, +47, +185, +154, +167, +158, +135, +124, +26, +102, +5, +182, +75, +37, +220, +243, +230, +77, +102, +22, +163, +96, +56, 90, -153, -57, -51, -238, -47, +110, +253, +14, +243, +246, +66, +31, +195, +49, +96, +156, +29, +56, +39, +73, +6, +206, +60, +140, +14, +152, +151, 196, -230, -81, 245, -138, -100, -19, -95, -200, -177, +226, +213, 3, -163, -227, -30, -206, -207, -143, +185, 103, -52, -242, -125, -182, -37, -206, -164, -100, -221, -180, -175, -7, -111, -207, -75, -255, -60, -232, -222, -191, -117, -222, -26, -210, -6, +9, +99, +45, +3, 84, -194, +165, +82, +67, 11, -84, -41, -15, -228, -136, -166, -191, -166, -7, -117, -231, -202, -212, +215, +11, +21, 223, -27, 77, -63, -84, -56, -230, -109, -27, -217, -109, -114, -64, -231, -139, -52, -41, -235, -91, -211, -210, -198, -25, -178, -109, -116, -6, -149, -160, -81, -49, -142, -189, -24, -146, -117, -193, -213, -154, -64, -0, -211, -91, -93, -35, -123, -125, -70, -208, +165, +15, +135, +206, +232, 123, -254, +201, 202, -217, +137, +155, +199, +18, +237, +213, +175, 49, -113, -169, -81, -216, -4, -153, -174, +168, +76, +65, +207, +62, +186, +158, 125, -150, -212, -162, -82, -95, -97, -67, +169, +159, +215, +100, +83, 27, +120, +246, +215, +100, +83, +155, +15, +203, +220, +89, +24, 197, -3, -35, -45, -237, -160, -164, -127, +69, +235, +118, +205, +26, +131, 245, -216, +44, +175, +249, +183, +248, +69, 62, -131, +124, +254, +173, +44, +241, +171, +73, +114, +81, +110, +215, +176, +238, +75, +79, 115, -69, -20, -137, -139, +80, +125, +160, +74, +134, +107, +146, +6, +183, +225, +60, +182, +147, +34, +52, 7, -212, -198, -135, -231, -194, -234, +195, +202, +107, +166, +182, +205, +112, +252, 207, -85, -2, -135, -78, -153, -116, -180, +205, +212, +182, 225, -169, -136, -253, -207, +218, +160, +121, +186, +240, +22, +31, +156, +190, +102, +16, +29, +84, +164, +240, +101, +48, +73, +140, +99, +34, +143, +64, +161, +79, +172, +75, +198, +88, 127, -25, -179, -232, -7, -125, +92, +120, +126, +114, +218, +13, +196, 29, -167, -69, -203, -165, -61, +0, +24, 111, -92, -221, -102, -56, -93, -11, -225, -45, -221, +103, +177, +117, +51, +214, 91, -242, 51, -218, -30, -6, -77, -187, -76, -83, -66, -82, -128, -26, -110, -174, -101, -90, -182, -4, -72, -125, -100, -180, -41, -192, -116, -88, -242, -128, -12, -30, -25, -117, -242, +135, +108, +44, +129, +43, +163, +62, +89, +184, +112, 32, -29, +84, 150, -56, -180, -101, -93, -61, -207, +228, +7, +18, +39, +156, +241, +1, +203, +182, +43, +97, 28, -125, -101, +164, +235, 207, -53, -55, -93, -7, -232, -80, +23, +125, +26, +132, 213, -59, -114, -148, -25, -250, -60, -208, -168, -146, -36, -63, -179, -88, -178, -98, -186, -1, -211, -65, -75, -3, -129, -221, -35, -45, -84, -51, -193, -177, -70, -156, -2, -68, -251, -163, -77, -19, -6, -65, -103, -206, -166, -252, -22, -93, -75, -53, -172, -2, -156, -133, -252, -49, -84, -156, -58, -187, -198, -226, -107, -72, -206, -81, -163, -95, -117, -35, 239, -163, +241, +98, +142, +82, +82, 140, -189, -185, -7, -85, -231, -197, -237, -246, +154, +249, +84, +63, +149, +233, +228, +125, +63, +211, +46, +115, +1, +157, +113, +170, +101, +23, +83, +104, +235, +147, +98, +153, +17, +192, +10, +152, +52, 155, -250, -253, 128, -26, -197, -125, +32, +106, +163, +28, +49, +96, +118, +178, +163, +206, +151, 167, +97, +112, +250, 200, -33, -124, -149, 129, -234, +133, +115, +152, +200, 25, -137, -44, -119, -154, -122, -28, -211, -213, -49, -78, -168, -35, -254, -206, -126, -144, -119, -211, -67, -176, +77, +201, 209, -139, -184, -128, -158, -144, -49, -150, -197, -75, -70, +97, +14, +0, +171, +140, +19, 51, -39, -90, -250, -84, -55, -117, -204, -5, -83, -231, -224, -149, -84, -9, -73, -161, -151, -144, -235, -143, -99, -237, -12, -152, -29, -158, -226, -35, -48, -233, +24, +7, +51, +239, +82, 140, -45, -11, -132, -64, +246, +84, +58, +115, +92, +88, +234, 227, -81, -128, -62, -35, -209, -65, 98, -155, -57, -143, -8, -209, -18, -138, -220, -83, -119, -204, -179, -194, -243, -232, +37, +0, +160, +61, +34, +200, +59, +169, +150, +36, +182, +93, +21, 52, -226, -171, -183, -116, -189, -156, -49, -236, -17, -135, -69, -89, +200, +11, +39, 207, -49, -78, -221, -193, -70, -196, -191, -190, -255, -87, -242, -116, -130, -239, -212, -161, -94, -199, -230, -190, -184, -105, -70, -5, -189, 157, +185, +131, +106, +46, +244, +177, +25, +123, +168, +109, +210, +35, 83, -64, -95, -243, -122, -247, -34, +65, +53, 254, -232, -1, -248, -38, -129, -82, -76, -249, -94, +137, +20, +80, +240, +35, 169, -241, -32, -127, -94, -48, -29, -157, -173, -190, -51, -213, -75, -138, -159, -52, -30, -60, -245, -226, -78, -42, -238, -24, -103, -210, -235, -244, -246, -189, -243, -21, -90, -248, -208, -223, -49, -58, -38, -67, -31, +196, +194, +5, +71, +177, +200, +167, +68, +6, +228, +101, +99, 121, +47, +134, +114, +226, 5, -37, -98, -208, -184, -22, -112, -72, -41, -103, 241, -230, -158, -66, +0, +199, +178, +171, +109, +251, +108, +22, +134, 50, -209, +201, +218, +54, +5, +185, +170, +19, +192, +64, +102, +58, +192, +137, +135, +14, 44, -89, -21, +252, +171, +237, +130, +71, +206, +220, +75, 224, -210, -73, -153, +254, 255, -4, -70, +86, +121, 251, -144, +242, +217, +147, +212, +22, +6, +2, +78, +190, +140, +70, +112, +64, +236, +225, +138, +229, +104, +54, +31, +36, +97, +61, +154, +166, 36, +44, +179, +9, +183, +50, +162, +42, +87, +112, +171, 0, -28, -230, -2, -101, -108, -114, +158, +211, +24, +15, +21, +57, +68, +161, +151, +147, +19, +121, +49, +166, +99, +128, 227, -137, -75, -46, +25, 36, -68, -11, +33, +186, +7, +241, +186, +211, +99, +122, +250, +14, +119, +206, +151, +113, +220, +18, +63, +227, +159, +18, +73, 45, -92, -69, -48, -20, -157, -172, -180, -132, -145, -46, -229, -109, -244, -4, -141, -195, -147, -215, -72, +93, 213, +127, +163, +159, +84, +96, +159, +45, +110, +168, +102, +96, +181, +210, +203, +91, +79, +23, +249, +194, +224, +248, +214, +64, +233, +43, +183, +95, +50, +80, +250, +166, +143, +225, +132, +212, +115, +180, +30, +167, +78, +53, +37, +38, +106, +93, +54, +199, +176, +252, +108, +118, 76, -74, -165, -11, -66, -211, -0, -171, +63, +121, +234, +13, +26, +123, +81, +156, +136, +112, +52, +90, +240, 235, -254, -206, -159, +192, +73, +129, +22, 195, -134, -141, -97, -20, -225, 149, -235, -14, -29, -95, -103, -24, -253, -8, -238, -186, -212, -121, -39, -216, -116, -207, -160, -202, -146, -116, -112, -18, -41, -241, -181, -133, -152, +131, +169, +156, +224, +34, +242, +76, 3, -227, -138, -254, -88, -172, -221, -36, -171, -95, -83, -30, -170, -151, -229, -254, -211, -55, -111, -137, -25, -25, -171, -170, -203, -113, -145, -226, -150, -124, -165, -121, -239, 78, +205, +35, 21, -79, -233, -105, +124, +168, +16, +175, +155, +163, +234, +152, +143, +48, +26, +1, +198, +148, 209, -186, -9, -19, -72, -238, -206, -90, -6, -144, -156, -195, -185, -64, -235, -231, -211, -243, -39, -39, -30, -49, 95, -250, -48, -180, -173, -158, +220, +204, +217, +149, +16, +29, +240, +176, +181, 23, -39, -161, -218, -223, -169, -83, -100, -65, -225, -57, -224, +120, +148, +243, +63, +150, +78, +52, 154, -84, -95, -202, -232, -156, +242, +210, 180, -133, -46, -246, -115, -139, -56, -153, -70, -216, -146, +106, +26, +159, +27, +123, +151, +42, +220, +152, 1, +60, +173, +53, +169, +152, 77, -84, -241, -63, -130, -200, -88, -123, -29, +119, +103, +43, +78, +17, +148, +31, +0, +165, 91, -30, -144, -201, -147, -86, -100, -199, -128, -206, -236, -45, -151, -179, -120, +238, 229, +15, +123, +216, +129, +93, +75, +52, +10, +157, +152, +233, +55, +188, +154, +154, +130, +191, 140, -32, -3, -77, -178, -139, -110, -2, -2, -64, +141, +35, +191, +27, +128, +124, +224, 122, -190, -53, -54, -121, -18, -69, -238, -157, -197, -1, -213, -135, -36, -204, -138, -77, -54, -12, -248, -116, -41, -189, -77, +209, +126, +233, +42, 185, -6, -74, -131, -119, -155, -19, -208, -201, -149, 158, -134, -142, -80, -231, -189, -218, -67, -243, -149, -157, -77, -54, -189, -3, -84, -240, -243, -167, -127, +112, +114, +52, 96, -203, -225, -184, -140, -38, -108, -196, -7, -24, -202, -95, -167, -127, -214, -23, -122, -55, +182, 75, -196, -68, -216, -165, -2, -115, -153, -157, -41, -15, -5, -108, -50, -2, -82, -227, -104, -212, -152, 69, -247, -12, -194, -112, -120, -141, +153, +121, +254, +158, +89, +66, +98, +3, +241, +117, +229, 226, -227, -145, -55, -199, -228, -33, -155, -2, -203, -198, -99, -23, -239, -220, -207, -58, -157, -21, -233, -187, -252, -51, -103, -243, +182, +53, +172, +3, +164, +181, +45, +124, +160, +161, +224, +254, +5, +6, +200, +47, +129, 189, +109, 148, -1, -162, -227, -241, +61, +247, +195, +123, +49, +244, +40, +35, +29, +57, +41, 88, 3, -52, +39, +159, +128, +61, +26, +208, +37, +218, +143, +110, 1, -244, -41, -247, -119, -131, -163, -190, -179, +239, 79, -31, -8, -77, -226, -129, -70, -44, -103, -250, -33, +180, +101, +182, +237, +155, +186, +93, 193, +27, +238, +54, +134, +111, +165, +35, +101, +233, +122, +151, +214, +80, +160, +20, +152, +93, +85, +49, +209, +154, +0, +148, +112, +101, +118, +134, +168, +76, +182, +149, +27, +172, +79, +60, +123, +97, +171, +243, +156, +29, +255, +28, +35, +71, +237, +177, +231, +48, +14, +253, +133, +125, +210, +51, +74, +14, +227, +31, +215, +90, 116, +205, 239, -179, -160, +18, +107, 121, -251, -5, -32, -90, -62, -238, -6, -6, -190, -209, -136, -239, -170, -13, -201, -71, +0, +233, +198, 29, 80, -62, -238, -3, 150, -33, -100, +243, +106, +203, +41, +51, +237, +52, +153, +249, +3, +138, +48, +223, +255, +220, +158, +139, +1, +32, +168, +216, +57, 192, -234, -180, -79, -12, -178, -166, +220, 76, -157, -32, -105, -40, -116, -116, -11, -64, -79, -28, +210, +14, +48, +241, +124, +224, +184, +110, +4, +50, +215, 222, -166, +230, +246, +229, +120, +191, 52, +113, +155, +131, +80, +144, +243, +252, +25, +77, +29, +116, +91, +69, +227, +46, +25, +117, +137, +147, +5, 64, -74, -63, -44, -201, -238, -106, -244, -196, -132, -70, +83, 206, -145, -167, -179, -197, -178, -47, -9, -174, -91, -245, -115, -211, -96, -225, -194, -77, -244, -188, -24, -243, -198, 166, -18, -59, -153, -71, -208, -109, -121, -226, -179, -68, -106, -165, -184, -209, +148, +182, +64, +171, +12, +235, 137, -227, -121, -24, -38, +101, +231, +209, +138, +16, +81, +116, +85, +10, +187, +45, +124, 51, -43, -83, -75, -77, -212, -200, -164, -163, -112, -62, -47, -203, +39, 25, -189, -229, -241, -204, -176, -238, -140, -135, -110, -216, -55, -249, -9, -178, -220, -193, -46, -182, -186, -58, -123, -219, +213, +165, 184, -132, -141, -124, -206, -162, -74, -212, +145, +79, +243, 168, -99, -85, -13, -46, -239, -221, -62, -182, -220, -170, +204, +3, +115, +17, +102, +33, 103, -84, -97, -95, -176, -172, -117, -151, -110, -39, -49, +56, +6, 28, -33, -235, -159, -59, -55, -130, -240, -60, -136, -115, -173, -195, -196, -151, -50, -4, -26, -170, -149, -231, -74, -21, -198, +69, +228, +40, +9, +52, +146, 24, -152, +56, 152, 235, -134, -70, -141, -226, -167, -161, -108, -219, -44, -7, -27, -153, -97, -62, -46, -223, -76, -122, -59, -181, -160, -170, -122, -203, -98, -163, -17, +255, +35, +94, +224, 95, -168, -198, -90, -169, -206, -45, -100, -30, -164, -242, -152, -251, +209, +103, +202, +29, +57, +145, +91, +110, 173, -174, -80, -18, -157, -51, -186, -174, -7, -175, -64, -254, -182, -248, -211, -211, -204, -75, -248, -59, -160, -10, +91, +184, 250, -112, -36, -76, +67, +44, +182, +69, +60, +182, +40, +240, +216, +77, +174, +63, +8, +143, +82, +71, +148, +91, +255, +97, +181, +68, +97, +228, 14, -194, -84, -161, -232, -93, +182, +61, +121, +37, +8, +83, 198, -21, -55, 109, -214, -103, -185, -181, -122, -94, -20, -48, -102, -78, -173, -75, -190, -36, -246, -163, -66, -66, -27, -60, -213, -229, -112, -217, -46, -46, -164, -36, -116, -32, +53, +225, +105, +53, +119, +220, +129, +43, +71, +222, +204, +241, +183, +16, 238, -188, -0, -101, -150, -72, -188, -46, +18, +32, +187, +222, +4, +216, 235, -170, +166, +193, +254, +77, +70, +225, +139, +130, +89, +70, +152, +148, +21, +209, +77, +158, +74, +123, +179, +144, +234, +137, +65, +88, +223, +243, +196, +254, +34, +46, +37, +142, +110, +15, +69, +242, 204, +10, +5, +87, +0, +58, +146, +115, +223, +25, +213, +7, +114, +117, +197, +77, +24, +149, +149, +185, 122, -54, -240, -23, -211, -99, -246, -165, +188, 22, -78, -125, -241, -71, -135, -182, -131, -237, -140, -186, -1, -27, +214, +213, +144, +178, +38, 94, -82, -226, -90, -81, -3, -201, -88, +213, +214, +140, +73, +20, +24, +147, +89, +11, 99, -125, -253, -195, -134, -67, -33, -156, -233, +1, +40, +206, +58, +246, 92, -218, -90, -104, -125, -156, -250, -39, -188, -183, -8, -221, -196, -124, -103, -52, -243, -252, -177, -208, -134, -42, -207, -34, -150, -133, -33, -102, -224, -148, -68, -79, -38, -228, -80, -200, -212, -102, -124, -111, -129, -38, -34, -98, -34, -120, -146, -165, -4, -202, -196, +89, 129, -183, +91, +81, +40, +180, +214, 72, -65, -212, -132, -13, -83, -127, -38, -168, -185, -25, -156, -130, -196, -74, -44, -161, -146, +255, +200, 56, -143, -94, -236, -129, +108, +229, +245, +98, +171, +15, +150, +53, +130, +95, 132, -138, -57, -223, -127, -27, -70, -223, -255, -242, -47, -151, -235, -235, -147, -139, -26, -218, -46, -194, -186, -203, -36, -20, -86, +18, +221, +52, +17, +84, +246, 144, -55, -130, -72, -62, -211, +43, 244, -61, -113, -10, -15, -173, -116, +168, +108, +141, +153, +174, +151, +80, 135, -201, -185, -239, -179, -2, -128, -128, -124, -149, -215, -33, -73, -26, -0, -86, -231, -134, -51, -116, -171, -100, -205, -93, -68, -50, +186, +194, +140, +167, +198, +48, +152, 85, -135, -13, -179, 6, -26, -82, -10, -33, -201, -35, +54, +78, +48, +247, +166, +250, +150, +140, +117, +101, +14, +239, +203, +80, +218, +30, +9, +114, +69, +27, +125, +220, +235, +58, +214, +92, +239, 226, +240, +18, +29, +5, +120, 80, -55, -14, -44, -150, -183, -105, -143, -135, -72, -252, -153, -90, -128, -206, +229, +9, +186, +197, +69, 84, -73, -155, 168, -226, -131, -115, -1, -71, -91, -172, -80, -50, -6, -56, -226, -67, +124, 186, -7, -143, -121, -152, -54, -37, +213, +244, +86, +84, 132, -217, -60, -208, -62, +229, +185, +165, 150, -18, -36, +136, +41, +243, +30, +128, +227, +53, +146, +38, +182, +167, +117, +195, +98, +71, +3, +101, +231, +204, +137, +52, +217, +185, +187, +139, +22, +166, +165, +12, +168, +206, +76, +14, +113, +20, +253, 160, -157, -106, -56, -48, -228, -103, -134, -140, -193, -23, -102, -1, -48, -142, +160, +92, +101, +198, +81, 134, -207, -206, -179, -106, -44, -173, -155, -206, -103, +198, 21, -36, -255, -222, -185, -13, -31, -33, -68, -2, -182, -152, -228, -16, -148, -151, -60, -151, -245, -74, -194, -72, -190, -54, -84, -97, -79, -14, -75, -43, -204, -209, -192, 175, -26, -111, -98, -87, -42, -20, -13, -119, -142, -250, -176, -74, -12, -128, -48, -191, -210, -183, -107, -228, -128, -144, -40, -232, +25, +0, +226, +51, +209, +121, +114, +72, 168, -61, -228, -153, -70, -139, -96, +123, +115, +19, +200, +214, +221, +99, +216, +186, 155, -140, -185, -113, -69, -24, -22, +70, +18, +30, +232, +124, +212, +203, +55, +252, 241, -53, -84, -236, -188, -190, -91, -68, -65, -237, +77, +235, +13, +252, +140, +255, +165, +6, +247, 148, +120, +128, +160, +128, +169, +225, +235, +82, +155, 196, -75, -116, -88, -161, -171, -196, -74, +26, +172, 45, -72, -185, -142, -121, +140, +102, +79, +58, +254, +15, +184, +83, +94, +160, +170, +19, +102, +57, +80, +170, +237, +220, +187, 214, -45, -190, +251, +179, +63, +182, +62, +172, +236, +153, +250, +182, +250, +62, +193, +124, +243, +129, +116, +39, +210, +90, +30, +216, +166, +210, +33, 111, -59, -56, -60, +158, +149, +139, +79, +211, +96, +138, +115, +124, +254, +3, +204, +215, +21, +156, +206, +225, +23, +170, +244, +150, +41, +79, +116, +197, +5, +77, +35, +133, +118, +84, +146, +129, 125, -112, -19, -208, -188, +154, +11, +66, +102, +125, +236, +243, +202, +115, +98, 119, +228, +124, +25, +52, +41, +31, +37, +225, +115, +202, +226, 6, -160, -51, +252, +37, +247, +107, +195, +129, +217, 224, -215, -148, -61, +198, +110, +83, +205, +86, +113, +247, +81, +169, +129, 57, -92, -165, -121, -69, +28, +141, +230, +40, +227, +248, +3, +240, +145, +211, +80, +195, +240, +149, +118, +76, +122, +154, +249, +3, +104, +75, +213, +123, +171, +65, 168, 89, -212, +162, +95, +175, +46, +5, +141, +72, +118, +230, +160, +130, +192, +131, +176, +45, +130, +250, +161, +91, +4, +167, 25, -21, -64, -51, -33, 128, -129, -14, -73, -60, -166, -100, -176, -179, -216, -157, -81, -228, -85, -32, -222, -180, -72, -188, -186, -29, -213, -26, -63, -58, +86, +250, +227, +234, +30, +159, +252, +172, +217, +187, +125, 114, -26, -246, -184, -8, -167, -164, -206, -27, +111, +65, +221, 133, -26, -234, -185, -182, -208, -209, -50, -21, -222, -70, -101, -80, -5, -140, -151, -41, -129, -64, -185, -138, -82, +69, 66, -80, -212, -126, -54, -109, -92, -74, +134, 180, -45, -104, +211, 153, -179, -139, -159, -208, -191, +234, +11, +11, +78, +31, +146, 115, -43, -147, -197, -56, +39, +224, +8, +245, +17, +151, +120, +204, 126, +65, +95, +128, +153, +247, +155, +202, +188, +56, +147, 179, -27, -72, -99, -0, -219, +16, 115, -47, -129, -11, -30, -222, -164, -215, -205, 5, -90, -183, -212, -124, -35, -56, -17, -147, -12, -252, -10, -119, -129, +196, +206, +132, +244, +162, +1, +165, 184, -230, -29, -32, +154, +16, +57, +67, +236, +241, +239, 86, +94, +150, +19, +89, +31, +75, +90, 38, -155, -118, -238, -7, +89, +168, 85, -69, -70, -125, -159, -230, -81, -231, -99, -59, -243, -23, -148, -239, -184, -53, -61, -105, -245, -203, -178, -208, -83, -12, -43, -129, -7, -53, -204, -34, -23, -19, -157, -99, -188, -8, -230, -118, -67, -162, +182, +130, +120, 58, -37, -70, -202, -125, -126, -52, -22, -250, -49, -218, -224, -71, -99, +192, +104, 51, -191, -198, -147, +163, +128, +48, +242, +234, +109, +88, +149, +18, +231, 253, -21, -29, -184, -175, -240, -8, -252, -39, -57, -232, -54, -202, -224, -204, +27, +15, 133, -113, -115, -56, -165, -114, -20, -231, -174, -181, +22, +163, +186, +69, +149, +146, +210, +238, +5, +155, +241, +86, +95, +209, +250, +31, +171, +2, +9, +216, +157, +31, +40, 227, -148, -199, -201, -229, -114, -88, -8, -35, -252, +42, 44, -227, -19, -58, -56, -214, -192, -191, -175, +50, +89, +52, +71, +190, +150, +190, +92, +45, +18, +110, +155, +241, +123, +37, +166, +211, 117, -152, -90, -74, -21, -5, +30, +153, +3, +92, +250, +68, +107, +134, 225, -109, -143, -189, -164, +147, +140, +211, +20, +76, +95, +187, +230, +116, 142, +97, +67, +211, +250, +55, +13, +212, +61, +231, +226, +203, +39, +139, +113, +84, +246, +155, +213, +76, +52, +59, +225, +16, +122, +134, +255, +191, +189, +111, 109, -112, -43, -12, 110, -15, -107, -185, -96, -125, -2, -40, -232, -34, -11, -176, -153, -88, -11, -10, +91, +87, 18, -76, -179, -192, -204, -14, -140, -159, -150, -147, -249, -96, -12, -156, -59, +252, +60, +247, +87, +112, 243, -194, -82, -152, -223, -129, -37, -97, +229, +58, +91, +78, +206, +73, +114, +102, +102, +183, +106, 102, +171, +100, +91, +78, +180, +215, +182, +188, +146, +124, +114, +238, +164, +82, 44, -118, -38, -108, +72, +130, 36, -254, -148, -120, -178, -52, -77, -6, -198, -88, -12, -140, +78, +40, +82, 151, -212, -24, -44, -94, +164, +108, +235, +252, +250, +69, +119, +3, +124, +72, +162, +5, +144, +132, +30, +190, +169, +153, +58, +55, +182, 9, -123, -227, -89, -220, +160, +95, +104, 52, -167, -51, -76, -29, -68, -7, -13, -53, -108, -165, -218, -46, -176, -0, +26, +253, 88, -45, +175, +73, +43, +71, +210, +17, +34, 62, -127, -228, -228, -14, -92, -6, -227, -80, -236, -234, -113, +65, +39, +150, +184, +250, +39, +130, +156, +231, 88, -41, -248, -81, -47, -242, -177, -234, -117, -146, -10, -60, -38, -94, -36, -9, -98, -168, -35, -168, -195, -19, -194, -233, -50, -60, -244, -99, +42, +11, +155, +22, +59, +160, +62, +166, +24, +161, +46, +126, 157, -88, -144, -170, -16, +136, +107, +84, +241, +55, +60, +25, +189, 167, -205, -152, -168, -138, -45, -74, -139, -244, -237, -210, -210, -149, -11, -219, -82, -42, -104, -192, -247, -232, +114, +0, 112, -13, -19, -161, -196, -96, -205, -88, +239, +167, +142, +56, +212, +22, +151, +137, +175, +89, +16, +47, +24, +248, +200, +86, +206, +156, 197, -57, -87, -225, -192, -116, -93, -76, -234, -215, 63, -124, -154, +240, +239, +139, +16, +222, +164, +161, +38, +223, +52, +16, +131, +176, +184, +1, +254, +17, +6, +58, +19, +230, +249, +49, +28, +190, +44, 133, -126, -117, +220, +129, 96, +249, +105, +64, +109, 0, -35, -139, -102, -73, -221, -128, -117, +233, +203, +144, +202, 148, -25, -74, -17, +65, +3, 95, -240, -145, -0, -113, -132, -60, -48, -238, -55, -139, -226, -230, -162, -245, -13, -157, -237, -53, -236, -23, -245, -93, -21, -23, -107, -238, -194, -71, -211, +161, +213, +125, +111, +244, +131, +154, +34, +200, +90, +114, +114, +106, +186, +92, +76, +195, +180, +28, +138, +151, 168, -72, -248, -84, +64, +117, +200, +17, +24, +114, 97, -134, -198, -174, -211, -28, -10, -196, -179, -93, -8, +27, +25, +169, +126, +128, 208, +5, +8, +234, +38, +140, +188, +224, +163, +64, +11, +116, +107, +185, +51, +77, +221, +83, +177, +225, +206, +0, +168, +207, +178, +192, +59, +236, +206, +9, +115, +177, +96, +154, +11, +239, +122, +226, +88, +127, +81, +80, +114, +1, +253, +142, +232, +16, +85, +220, +171, +82, +118, +76, +94, +79, +5, +89, +35, +113, +61, +210, +232, +200, +32, +191, +171, +170, +154, +139, +253, +232, +204, +106, +227, +81, +129, +20, +132, 87, -53, -193, -71, -221, -219, +245, +122, +78, +231, +147, +230, 24, -240, -211, -28, -253, -173, -57, +129, +231, +164, +96, +158, +65, +245, 230, -137, -224, -168, -41, -213, -145, -64, -202, -6, +219, +86, +239, +115, +231, +206, +253, +159, +226, +198, +183, +156, +191, +149, +30, +55, +37, 222, -3, +231, +206, +165, +106, +69, 141, -247, -72, -14, -114, +219, +30, +155, +195, +225, +150, +164, +205, +140, +217, +5, +32, +236, +252, +57, +81, +110, +228, +128, 147, -173, -82, -161, -93, -18, -158, +241, +252, +35, +8, +159, 114, +203, +158, +203, +154, +167, +66, 13, +68, +99, +193, +165, +212, +68, +164, +201, +84, +185, +213, +112, +52, +242, +151, +227, +106, 65, -13, -82, -18, -113, -54, -134, +144, +235, +236, +170, +151, +179, +84, +151, 203, -181, -189, -64, -89, -37, -44, -57, -193, -128, -51, -23, -22, -126, -7, -43, -191, +47, +220, +53, +214, +248, +100, +192, +30, +116, +230, +159, +38, 119, -224, -144, -87, -174, +142, +158, +43, +25, 55, -89, -16, -3, -234, -201, +52, +56, +81, 137, -155, -63, -166, -129, -136, -33, -213, +2, 94, -74, -158, -34, -182, -176, -135, -87, -27, -199, -17, -90, -176, -18, -86, -70, -69, -87, -142, -48, -87, -166, -80, 224, -99, -200, -87, -33, -60, -85, -1, -183, -200, -105, -241, -36, -223, -128, -164, -123, -187, -10, -82, +205, +151, 115, -246, -12, -182, -113, -164, -17, -66, -70, -231, -82, +151, +140, +35, +155, +101, +37, 229, -221, -45, -86, -194, -42, -67, -91, -27, +74, +14, +172, +68, +178, +129, +133, +103, +83, +118, +170, +122, +183, +179, +8, 138, -1, -87, -88, 5, -20, -70, -203, -164, -244, -21, -252, -114, -89, -84, +37, +97, +165, +10, +147, +28, +142, +74, +91, +200, +24, +2, +99, +187, +57, +38, +150, +62, +202, +169, +83, +150, +210, +50, 43, -49, +173, +204, +156, +25, 247, -211, +23, +98, +243, 168, -18, -179, +122, 69, -194, -197, -170, -124, -21, -168, -166, -221, -200, -50, -11, -22, -39, -188, -116, -157, -123, -248, -107, -51, -11, +178, +137, +47, +228, +216, +129, 209, -64, -151, +113, +15, +231, +231, +199, +51, +26, 249, -126, -121, -4, -1, -126, -2, -47, -221, -149, -173, -14, -90, -69, -175, -198, -166, -171, -117, +62, +219, +18, +103, +82, +178, 110, -148, -222, 218, -113, -10, -205, -179, -115, -125, -146, -143, -89, -171, -174, -106, -80, -124, -202, -77, -80, -241, -252, -86, -133, -145, -83, -142, -202, -39, -68, -128, +215, +131, +183, 231, -23, -117, -182, -132, -249, -31, -43, -196, +165, +127, +30, +116, 239, -164, -147, -187, -98, -207, -97, -20, +223, +58, +111, +13, +105, +3, +42, +225, +5, +170, +148, +7, +114, +68, +211, +95, +211, +131, 186, -213, -216, -29, -12, +115, +101, +234, +239, +141, 166, -80, +31, +42, +28, +243, +182, +141, +236, +54, +57, +160, +243, +69, +154, +148, +245, +173, +105, +105, +227, +12, +217, +54, +58, +131, +74, +208, +168, +24, +199, +94, +12, +201, +186, +224, +106, +77, +32, +128, +233, +173, +174, +145, +189, +62, +35, +232, +61, +127, +229, +236, +152, +184, +212, +40, +108, +130, +76, +215, +62, 75, +106, +81, +169, +175, +176, +161, +141, 226, 129, -50, -170, +145, +150, +118, +80, 210, -56, -3, -206, -192, -12, -242, -156, -172, -216, -58, -18, -51, -152, -49, -172, 191, -146, -229, -183, -5, -104, -219, -22, -200, -58, -216, -213, +122, +108, +159, +193, +185, +34, +138, 196, -164, -8, -120, -186, -35, -236, +197, 3, -13, -109, -89, -234, -83, +106, +227, +195, +115, +97, +245, +231, +42, +129, +67, +167, +76, 58, -183, -3, -247, -3, -114, -35, +218, +240, 84, -198, -155, +196, +254, +231, +191, +140, 89, -221, -203, -208, -174, -235, -76, +244, +131, 190, -107, -83, -245, -115, -3, -122, -225, -104, -87, -85, -88, -139, -123, -215, -186, -186, -77, -124, -54, -141, -117, +142, +211, +162, +229, +210, +158, +55, 174, -253, -47, -159, -5, -149, -20, +110, +51, +156, +174, +133, +240, +150, +238, +45, 249, -199, -38, -142, -147, -79, +25, +109, +15, +131, 166, -199, -73, -217, -89, -192, +93, +166, +41, +33, +41, +64, +13, +55, +215, +50, +45, +91, +2, +164, +62, +50, +218, +20, +96, +58, +44, +121, +64, +6, +143, +140, +58, +121, +144, +14, +75, +28, +218, 178, +174, 158, -239, -41, +103, +142, +190, +178, 231, -200, -31, -213, -151, +154, +155, +174, +3, +116, +168, +234, +29, +57, +202, +12, +125, +30, +104, +84, +73, +146, +159, +89, +44, +89, +49, 221, -142, 128, -84, -105, -109, -70, -186, +233, +160, +165, +129, +192, +238, +145, +22, +170, +153, +224, +88, +35, +78, +1, +162, +253, +209, +166, +9, +131, +160, +51, +103, +83, +126, +139, +174, +165, +26, +86, +1, +206, +66, +254, +24, +42, +78, +157, +93, +99, +241, +53, +36, +231, 168, -242, -52, -31, +209, +175, 186, -223, -110, -245, -46, -191, -168, -208, -26, -67, -70, +145, +247, +81, +198, +222, +220, 131, -55, 170, -220, +243, +226, +118, +251, +77, +253, +126, +64, +141, +226, +190, +83, +228, 16, -145, -0, -194, -71, -14, -84, -55, -96, -85, -100, -9, -124, -93, +190, +202, +64, +245, +140, +68, +150, 59, -151, -128, -143, -170, -47, -129, -1, -217, -46, -128, +77, +61, +142, 233, -206, -188, +234, 24, -250, -65, -151, -27, -113, +39, +212, +17, +127, +103, +63, +200, +187, +233, +33, +216, +232, +69, +92, +64, +79, +200, +24, +203, +226, +37, +163, +153, +19, +45, +125, +170, +155, +58, +230, +130, +169, +115, 240, -41, -210, -13, +74, +170, +132, +164, +208, +75, +200, +245, +199, 177, -146, +118, +6, +204, +14, +79, +241, +17, +152, +116, +198, +150, +5, +66, +160, +241, +40, +64, 159, -87, +145, +232, +32, 177, -167, -201, -247, +205, +156, 71, -9, -79, -24, 132, -110, -245, -30, -20, -58, -92, +104, +9, +69, +238, +169, +59, +230, +89, +225, +121, +116, +26, +241, +213, +91, +186, 94, -27, +206, +24, +246, +136, +195, +162, +172, +231, +24, +167, +238, 96, +35, +226, 95, -147, -219, -81, -45, -93, -197, -68, -40, -2, -239, -210, -228, -182, -170, -101, -20, -44, -133, -34, -236, -96, -47, -200, -197, -141, -131, -141, -198, +223, +255, +43, +121, +58, +193, +119, +234, +80, +175, 99, -247, -7, +115, 95, -61, -65, +220, +52, +163, +130, +222, +206, +41, +160, 175, -82, -205, -180, -51, -249, 121, -45, -181, -83, -53, -117, -173, -53, -30, -139, -173, -46, -33, +189, +123, +17, +127, +244, +0, +124, +147, 64, -239, -176, -151, -252, -53, -78, -235, -31, -26, -163, -142, -3, -197, -53, +41, +166, 124, +175, +212, +120, +144, +63, +47, +152, +142, +206, +86, +223, +153, 234, +37, +197, +79, +26, +15, +158, +122, +113, +39, +21, +119, +140, +51, 233, -188, -151, +117, +122, +251, +222, +249, +10, +45, +124, +232, +239, +24, +29, +147, 161, -173, -0, -228, -170, -133, -187, +143, +188, +130, +18, +49, +104, +92, +11, 56, -9, -171, -206, -241, -209, +164, 148, -126, -165, -250, -22, -61, 179, -228, -122, -200, -73, -99, -22, -103, -63, -97, -126, -172, -249, -150, -7, -60, -65, 120, -28, -162, -163, 115, -38, -125, -201, -88, -140, -217, -135, -44, -78, -177, -19, -222, -174, -113, -171, -82, +79, +33, +153, 104, -108, -188, -154, -15, -195, -245, -118, -238, -141, -231, -71, -166, +150, +172, +10, +112, +233, +164, +204, +127, +2, +163, +125, +72, +18, +0, 14, +115, +129, +50, 54, -68, -10, -30, -46, -104, -221, -138, -209, -188, -66, -57, -206, -247, -80, -193, -146, -66, -217, -104, 185, -92, -169, -126, -85, -217, -179, -181, 241, -59, +196, +37, +23, +18, +162, +133, +22, +174, +34, +24, 138, -212, -96, -254, -98, +78, +86, +90, +194, +72, +151, +242, +54, +122, +130, 198, -254, -243, -63, -127, +225, +201, +107, +164, +106, +38, +165, +210, 5, -223, +161, +105, +128, +213, +117, +127, +231, +207, +97, +195, +198, +48, +138, +240, +202, +117, +135, +142, +175, +51, +140, +126, +4, +119, +93, +234, +188, +19, +108, +186, +103, +80, +101, +73, +58, +56, +137, +148, +248, +218, +66, +204, +129, +113, +69, +127, +44, +214, +110, +146, +213, +175, +41, 15, -104, -144, -24, -99, -177, -170, -29, -30, +213, +203, +114, +255, +233, +155, +183, 196, -216, -29, -199, -134, -186, -36, -111, -232, -176, -0, -14, -49, -189, -163, +140, +140, +85, +213, +229, +184, +72, +113, 75, +190, +210, +188, +119, +167, +138, +167, +244, +180, +104, +221, +132, +9, +36, +119, +103, +45, +3, +72, +206, +225, +92, +160, +245, 243, -33, +233, +249, +147, 19, -222, +143, +152, +47, +125, +24, +218, +86, +207, +139, +147, 80, -138, +237, +239, +212, +41, +178, +160, +240, +28, +112, +77, +170, 47, -153, -59, -131, +101, +116, +78, +218, +66, +23, +251, +185, +69, +156, +76, +35, +108, +201, 128, -208, -250, -211, -141, -254, +38, +170, +248, +31, +65, +100, +172, +189, +142, +45, +15, +200, +228, +73, +43, +178, +99, +64, +103, +246, +150, +203, 89, -91, -79, -250, -33, -13, -87, -148, -62, -196, -138, -107, +188, +114, 70, -252, -31, -75, -104, -78, -0, -141, -174, -125, -14, -223, -239, -122, -179, -109, -66, -125, -87, -50, -213, -42, +144, +129, +38, +217, +69, +55, +1, +1, +32, 61, -252, -102, -63, -201, -165, -165, -165, -118, -219, +223, 26, -136, -255, +155, +60, +137, +34, +247, +206, +226, +128, +234, +67, +18, +102, +197, +38, +27, +6, +124, +186, +148, +222, +166, +92, +3, +165, +193, +187, +205, +9, +232, +228, +74, +79, +67, +71, +168, +243, 94, -182, -250, 237, -55, -84, -24, -13, -160, -195, -101, -110, 161, -205, -57, -117, -66, -71, -26, -147, -93, -40, -79, -248, -236, 249, -245, -133, -185, -191, -126, -233, +202, +206, +38, +155, 222, -180, -221, +1, +42, +248, +249, +211, +63, +176, +229, +112, +92, +70, +19, +54, +226, +3, +12, +229, 175, -221, -222, -85, +211, 63, -157, -252, -99, -126, -114, -122, +235, +11, +189, +155, +37, +98, +34, +236, +82, +129, +185, +204, 206, -1, -42, -198, -85, -215, -184, -104, -93, -254, -237, -107, -43, -191, -194, -111, -111, -228, +148, +135, +2, 54, -38, -115, -149, -42, -254, -140, +25, +1, 169, -150, -94, -214, -192, -180, -48, -185, -230, +113, +52, +106, +204, +162, +123, +6, +97, +56, +188, +70, +241, +241, +200, +155, 99, 242, -90, -109, -29, +144, +77, +129, +101, 227, -22, -40, -170, -44, -14, -104, -194, -143, -87, -168, -199, -63, +177, +139, +119, +238, +103, +157, +206, +138, +244, 93, -233, -190, -33, -183, -84, -49, -28, -160, -215, +254, +153, +179, +249, +94, +202, +0, +209, +241, +120, +172, +1, +154, +0, +250, +148, +251, +187, +193, +81, +223, +217, +167, 15, -236, +132, +38, +241, +64, 35, -8, -199, -68, -12, -137, -171, -216, -18, -79, 150, -46, -146, -134, -56, -52, -62, -129, -183, -227, +51, +253, +144, +96, +186, +247, +89, +208, +188, +253, +2, +16, +45, +31, +119, +3, +3, +223, 104, -252, 196, -168, -128, -142, -55, -194, +119, +213, +134, 228, -159, -64, -217, -238, -88, -68, -78, -124, -253, -233, -202, -153, -135, -99, -124, +163, +14, +40, +31, +247, +1, +203, 16, -70, +50, +96, +117, +218, +39, +6, +89, +83, +166, +78, +144, +52, +20, +58, +186, +5, +160, +39, +14, +111, +83, +26, +32, +165, +31, +150, +100, +119, +53, +122, +98, +66, +35, +231, +200, +211, +217, +98, +217, +151, +4, +215, +173, +250, +185, +105, 176, -190, -245, -23, -2, -63, -254, -29, -126, -252, -252, -208, -113, -190, -201, -55, -243, -239, -102, -21, -114, -224, +112, +225, +38, +122, +94, +140, +121, +99, +83, +137, +157, +204, +35, +232, 182, -249, -228, -141, -19, -237, -139, -155, -249, +60, +241, +89, +34, +181, +82, +220, +232, +196, +241, +60, +12, +147, +153, +149, +169, 165, +38, +106, +100, +210, +81, 56, -37, -8, -44, -83, +159, +151, 229, -54, -60, -227, -212, -31, -213, -54, -128, -180, -78, -165, -251, -186, -245, -42, -252, -10, +140, +222, +242, +120, +102, +88, +119, 198, -170, -149, -237, -34, -79, -219, -80, -207, -213, -104, +67, 55, +236, +155, +252, 4, -78, -140, -132, -215, -22, +89, +238, +96, +23, +91, +93, +157, +189, +109, +92, +194, +70, +62, +103, +81, 37, -178, -240, -167, -111, -191, -123, +106, +212, 177, +170, +6, +151, +247, +110, +31, +91, +110, +213, +51, +170, +176, +47, 88, -149, -82, -65, -191, -155, -66, -62, -99, -177, -139, -39, -246, -129, +214, +186, 75, -192, -74, -199, -195, -78, -103, -117, -222, -63, -161, -125, -80, -92, -102, -105, -98, -138, +183, +147, +24, +142, 144, -56, -81, -21, -54, +245, +207, +157, +27, +65, +120, +30, +196, +185, +214, +97, +226, 75, -8, -172, -167, -24, +25, +2, +13, 213, -129, -179, -106, -31, -1, -161, -16, -31, -133, -60, -8, +202, +115, 165, +10, +99, +12, +76, +204, +117, +67, +163, +70, +241, +211, +80, +182, +109, +150, +131, +141, +204, +48, +31, 151, -118, -221, -50, 111, -39, -144, -107, -142, -108, -212, -118, -40, +38, 189, -138, -8, +157, +90, +80, +85, +189, +101, +177, +209, +136, +47, +84, +99, +173, +84, +231, +22, +50, +15, +82, +121, +204, +253, +86, +87, +40, +137, +206, +25, +93, +215, +131, +87, +32, +127, +91, +252, +233, +105, +230, 37, -188, -244, -89, -194, -139, +252, +29, +80, +5, +125, +56, +18, 38, -107, -118, -147, -192, -159, -207, -62, -156, +7, +97, +170, +80, +244, +46, 227, -255, -105, -166, -236, -94, -65, +138, +155, +54, +235, 179, -149, -60, -255, -5, -103, -160, -245, -19, -91, -219, -62, -14, -145, -192, -1, +220, +90, +61, +47, +10, +24, +51, +167, +214, +37, +95, 18, -84, +251, +81, +33, 161, -186, -75, -61, -147, -14, -68, -122, -205, -134, -77, -229, -79, -48, +13, 158, -142, -39, -164, -244, -10, -104, -131, -113, -85, -232, -159, +234, +114, +184, +108, +23, +23, +82, +18, +58, +16, +119, 94, -191, -79, -148, +128, +50, +75, +36, +94, +151, +117, +85, +102, +61, +27, +248, +139, +233, +49, +251, +82, +11, +167, +190, +248, +163, +67, +219, +193, +118, +70, +221, +128, 13, +47, +41, 113, -52, -114, -43, -206, -113, -48, -94, -148, -198, -39, -110, -216, -171, -215, -55, 173, -207, -238, -109, -231, +168, +129, +100, +172, +177, +190, 254, -182, -117, -223, -95, -55, -181, -63, -203, -234, -22, +97, +195, +161, +16, 206, -220, -91, -204, -217, -34, -222, +116, +46, 109, +45, +180, +62, +78, 253, -226, -108, -189, -246, -125, -187, -53, +19, +222, +91, +132, +110, +98, +190, +51, +154, +121, +254, 88, -55, -173, -123, -124, -193, -89, -226, -156, -229, -26, -204, -11, +104, 67, -118, +149, +103, +17, +203, +194, +16, +51, +112, +74, +162, +39, +19, +114, +40, +100, +106, +51, 190, -64, 183, -221, -120, -202, -223, +64, +19, +17, +49, +17, +60, +201, +82, +2, +101, +226, +192, +91, +164, +32, 106, -206, -126, +194, +134, +169, +63, +19, +212, +220, +12, +78, +65, +98, +37, +150, +80, +73, +156, +71, +47, +246, +64, +66, +197, +156, +239, +191, +13, +163, +239, +127, +249, +151, +203, +245, +245, +201, +69, +13, +109, +23, +97, 221, -185, +101, +18, +10, +43, +200, +27, +65, +36, +159, +105, +250, +158, +56, +133, +135, +86, +186, +195, +228, +220, +247, +89, +1, +64, +64, +190, +202, +235, +144, +36, +13, +0, +171, +115, +195, 25, +186, +85, +178, +230, +46, +34, +153, +170, +195, +134, +89, +3, +13, +41, +133, +144, +228, +17, +113, +168, +27, +7, +22, +203, +219, 180, -123, -235, -102, -245, +199, +67, +36, +254, +76, +45, +64, +103, +170, +164, +77, +84, +241, +193, +185, +128, +163, +45, +86, +40, +25, +3, +28, +241, +33, +221, +131, +199, +60, +76, +155, +18, +194, +108, +30, +104, +31, +75, +9, +18, +208, +78, +53, +28, +24, +242, +51, +67, +198, +224, +11, +179, 0, -52, -118, 24, -56, -194, +71, +195, +103, +231, +89, +53, +150, 214, -12, -188, -201, +77, +231, +179, 10, -219, -183, -123, -190, -76, +146, +127, +239, +220, +134, 143, -212, -152, -245, -247, -206, -85, -187, -235, -246, -31, -122, -215, -173, +16, +34, +1, +91, +76, +114, +8, +202, +75, +158, 203, -220, -149, -227, -223, -228, -236, -74, -77, -65, -161, -6, -50, +122, +37, 97, -99, +36, +95, +27, 170, -223, +176, +39, +135, 165, -53, -123, -223, -189, -106, -95, -183, -30, -110, -50, -154, -252, +21, +230, +104, +224, +87, +141, +55, +177, +43, +21, +138, +134, 59, -205, -123, -37, -83, -167, -240, +71, +125, 88, -169, -110, -253, +37, +6, +64, +152, 95, -96, -119, -191, -252, -29, -0, +233, +219, +53, +114, +64, +72, +20, +116, +212, +30, +242, +76, +163, +69, +176, +77, +198, +220, +184, +34, +12, +139, +248, +26, 42, -92, -170, +118, +94, 223, -234, -54, -66, -196, -207, -41, -145, -86, -154, +45, +162, +160, +118, +74, 226, -66, -67, -207, -225, -42, -139, -249, -249, -180, -84, +37, +58, 172, -123, -47, 208, -157, -142, -106, +85, 98, -138, -255, -199, -118, -63, -208, -153, -110, -186, -132, -100, -149, -111, -52, -1, -229, -168, -20, -39, -128, -246, -242, -216, -105, -4, -51, -84, -228, -68, -32, -70, -94, -34, -167, -163, -118, -135, -48, -43, +165, +22, 164, -173, -136, -189, -40, -239, -89, -84, -108, -147, -178, -105, -33, -53, -13, -210, -132, -161, -98, -71, -182, -172, +92, +199, +60, +235, +22, +223, +183, +29, 28, -57, -202, -138, -226, 158, -33, -10, -203, -152, -199, -185, -246, -96, -228, -237, -138, -19, -168, -166, -58, -132, -186, -172, +62, +184, 9, -212, -253, -148, +104, 222, -91, -76, -149, -1, -225, -64, -191, -237, -243, -2, -66, -7, -146, -144, -202, -124, -227, -223, -2, -244, -130, -8, -101, -248, -103, -90, -244, -19, +59, +3, 208, -136, -101, -134, -124, -87, -149, -19, -165, -66, -53, -217, -33, -9, -113, -61, -255, -88, -122, -17, -31, -83, -45, -227, +25, +240, +107, +202, +158, +28, +174, +210, +188, +34, +212, +44, +234, +140, +10, +160, +153, 16, -18, -60, -41, -15, -47, -92, -208, -148, -198, -1, -179, -180, -198, -209, -21, -13, -5, -208, -32, -67, -93, -88, -214, -71, -9, -219, -12, -178, -24, -143, -18, +192, +64, +135, +36, +30, +83, 50, -233, -231, -59, -78, -178, -77, -194, -209, -242, -88, +216, 89, -138, -61, -7, -100, -23, -208, -221, -133, -186, -224, -43, -130, -233, -194, -75, -110, -217, -194, -74, +236, +206, +40, +242, +42, +16, +111, +90, +36, 94, -204, -250, -230, -60, -100, -245, -220, -233, -182, +221, +142, +106, +141, +31, 29, -121, -104, -128, -214, -182, -225, -161, -193, -217, -220, +57, +13, 123, -135, -134, -104, -99, -195, -29, -26, -160, -252, -46, -211, -131, -165, -184, -191, -14, -81, -171, -85, +92, +132, +83, 82, -227, -58, -18, -63, -213, -201, -218, -81, +231, +141, +66, +13, 245, -87, -112, -162, -172, -237, +92, +91, +232, 104, -156, -85, -20, -215, -181, -174, -212, -76, -147, -108, -166, -24, -82, -127, -87, +153, +10, +111, +163, +50, +168, +2, +198, +203, +148, +64, +160, +92, +69, +41, +33, +40, 106, -194, -32, -107, -174, -172, -166, -134, -204, -29, -176, -107, -84, -11, +63, +155, +54, +46, +37, +218, 22, +180, +204, 217, -81, -69, -252, -250, -175, +197, +79, +232, +223, +185, +149, +201, +98, +28, +191, +217, +13, +164, 49, -246, -127, -195, -212, -225, -39, -134, -6, +128, +237, +185, +151, +192, +5, +15, +111, 210, -127, -47, -99, +235, +230, +2, +173, +91, +106, +190, +17, +156, +136, +73, +6, +126, +133, +187, +64, +92, +243, +14, +16, +43, +147, +77, +59, +247, +131, 170, -9, -84, -240, -224, -50, -213, -1, -219, -196, -194, +34, +163, +190, +79, +243, 168, -170, -235, -139, -85, -167, +243, +177, +157, +249, +11, +202, +119, +220, 154, -205, -55, -52, -219, -13, +158, +180, 250, -245, -175, -76, -195, -141, -211, -107, -225, -206, -3, -103, -235, -5, -210, -6, -109, -178, +101, +89, +232, +41, +134, 149, -14, -219, -190, -76, -187, -213, +192, +131, +26, +102, +145, 139, -253, +137, +206, +49, +94, +4, +115, +187, +33, +81, +157, 18, -211, -224, -149, -181, -211, -41, -197, -178, -198, -186, -143, -194, -41, +35, +229, +62, +63, +26, +11, +253, +24, +109, +240, +163, +177, +153, +95, +227, +201, +254, +138, +14, +220, +87, +120, +4, +254, +147, 28, -217, -133, -231, -33, +116, +27, +101, 112, -190, -154, -190, -13, -97, -235, -22, +230, +194, +184, +57, 156, +82, +57, +138, +115, +215, +218, +113, 202, -25, +227, +228, +114, +57, +44, +132, +17, +126, +150, +241, +9, +29, +28, +107, +224, +223, +215, +58, +76, +45, +165, 138, -91, -18, -170, -10, -32, -173, -122, -206, -213, +130, +240, +182, +199, +94, 82, -90, -223, -20, -56, -23, -44, -250, -190, +199, 54, -71, -90, -192, -73, -220, -208, -60, -44, -68, -77, -119, -52, -231, +184, +21, +6, +183, +135, +181, +92, +176, +62, +1, +20, +116, +145, +5, +216, 76, -220, -246, -80, -25, -45, -64, -161, -97, -77, -171, +172, +5, +5, 9, +166, +89, +96, +102, +7, +198, +79, +203, +201, +124, +48, +6, +206, +157, +121, +97, +41, +204, +239, +192, +146, +48, +51, +22, +59, +19, +54, +18, 127, 74, +60, +89, +154, +38, +3, +99, +44, +6, +198, +75, +106, +12, +22, 175, -125, -59, -90, -122, +132, +189, +241, +44, 110, -145, -171, -101, -48, -54, -180, -220, -247, -160, -144, -214, -128, -58, -176, -90, +154, +211, +25, +166, +14, +162, +131, +134, +26, +182, 82, -188, -62, -54, -42, 109, -194, -117, -96, -66, -25, -95, -2, -247, -64, -164, -42, +23, +88, +0, +172, 22, -113, -51, -4, -170, -165, -176, -96, -179, -215, -123, -197, -70, -117, -1, -111, -216, -170, -176, -160, -126, -51, -60, -53, -50, -254, -225, -5, -65, -46, -145, -58, -126, 159, -117, -137, -87, -161, -165, -240, -9, -62, -247, -141, -189, -71, -111, -188, -132, -58, -133, -84, -227, -136, -150, -6, -173, -246, -76, -237, -238, -70, +63, +114, +114, +7, +46, +131, +113, +40, +118, +245, +56, +172, +20, +252, 168, -217, -98, -10, -138, -154, -11, -216, -29, -62, -153, -120, -35, -143, -83, -11, -61, +23, +249, +88, +245, +58, +73, +5, +30, +19, +47, +146, +4, +49, 212, -106, -178, -208, -62, -115, -166, -126, -56, -100, -190, -84, -122, -100, -26, -242, +17, +212, +225, 9, -166, -186, -130, -135, -138, +225, +116, +25, +30, 250, -23, -75, -239, -22, -125, -163, -122, -238, -98, -99, -61, -244, -111, 177, -96, -149, -189, -138, -159, -203, -120, +78, 44, -71, +72, +85, +136, +211, +102, +76, +84, +197, +22, +165, +69, +250, +118, +105, +233, +202, +133, +109, +41, 21, -255, -75, -75, -51, -81, -239, +52, +224, +123, +116, +184, +134, +137, +80, +98, +176, +102, +172, +226, +156, 171, -124, -157, +112, +96, +186, +46, +38, +245, +235, +31, +62, +205, +66, +191, +58, +48, +128, +145, 69, -108, -175, -229, -37, -210, -253, -68, -228, -136, -36, -253, 179, -230, -190, -133, -162, -170, -126, -200, -198, -228, -138, -83, -29, -186, -1, -42, -178, -17, -223, -19, +164, +110, +192, +58, +202, +12, +165, +136, +47, +248, +72, 128, -19, -15, -106, -126, +56, 66, -239, -183, -39, -239, -135, -71, -125, +30, +24, +247, +155, +69, +113, +115, +209, +250, +134, +206, +246, +26, +246, +139, +250, +174, +138, +139, +53, +119, 225, -66, +163, +105, +84, +36, 124, -235, -153, -152, -231, -117, -235, -21, -188, -8, -208, -64, -175, -17, -248, -2, +170, +48, 67, -107, +99, +215, +105, +14, 5, +226, +217, +46, +4, +232, +171, +154, +224, +163, 238, -237, -177, -167, +109, +12, +248, +105, 142, -237, -130, -25, -123, -35, -102, -77, -203, -204, -132, -14, -101, -118, -217, -73, -19, -129, -130, +254, +214, +28, 243, -142, -108, -135, -52, +68, +112, +212, +148, +234, +72, 32, -220, +101, +3, +239, +129, +198, +123, +36, +7, +185, +201, +86, +169, +208, 46, -212, -236, -53, -203, -5, -49, +9, 79, -177, -200, -103, -199, -91, -194, -7, -35, -91, +185, +134, +160, +6, +41, +137, +56, +27, +195, 229, -211, -193, -17, -113, -72, -87, -135, -165, -189, 218, -108, -240, -57, -163, -139, -46, -155, -139, +94, +160, +172, +18, +150, +156, +96, 192, -188, -154, -77, -12, -154, -204, -148, -24, -175, -88, +153, +11, +11, +191, +131, +149, +223, +59, +112, +200, +43, +215, 155, -29, -225, -126, -105, -72, +44, +136, +1, +245, +228, +196, +205, +31, +211, +64, +196, +144, +106, +47, +37, +79, +17, +91, +216, +195, +171, +141, +227, +8, +45, +88, +9, +43, +163, +162, +43, +71, +152, +43, +83, +40, +240, +49, +228, +171, +16, +158, +170, +128, +91, +228, +180, +120, +146, +111, +64, 210, -95, -147, -86, -155, -132, -58, +189, 93, -122, -14, -175, -209, +5, +169, +57, +123, +6, +219, +56, +210, 8, -78, -154, -224, -58, -180, -84, -191, -143, -22, -209, -227, -107, -30, -136, -87, -179, +33, +163, 115, -65, -133, -153, -16, -225, -21, -171, -175, -35, -219, -24, +169, +242, +238, +22, +43, +97, +149, +161, +173, 13, -72, -246, -107, +197, +128, +43, +172, +2, +10, +163, +101, 82, -91, -154, +250, +10, +126, +185, +44, +170, +149, +152, +251, +105, +84, +137, +217, +34, +225, +98, +85, +190, +10, +84, +211, +110, +100, 153, -58, -135, -215, -91, -123, -232, +5, +139, +19, +94, +186, +206, +61, +252, +181, +153, +133, +104, +160, +203, +124, +191, +60, +130, 0, -55, -205, -232, -81, +63, +129, +151, +238, +202, +86, +7, +173, +162, +87, +99, 211, -223, -127, -120, +213, 58, -214, -212, -93, -70, -100, +55, +74, +111, +237, +56, +133, +230, +217, +185, +62, +201, +199, +172, +85, +87, +53, +40, +62, +229, +38, +168, 120, -197, -202, -235, -216, -182, +126, +171, +194, +200, +41, 71, +229, 19, -210, -253, -186, -212, -23, -57, -83, +34, +192, +243, +139, +58, +91, +194, +252, 143, -136, -69, -47, -104, +21, +226, +119, +210, +201, +93, +177, +231, 48, -5, -107, -253, +10, +221, +106, +236, +14, +6, +83, +168, +37, +241, +64, +25, +85, +105, +156, +1, +103, +96, +6, +121, +78, +86, 108, -178, -151, -153, -172, +29, +137, +25, +204, +24, 214, +95, +201, +242, +219, +2, +180, +109, +11, +100, +29, +236, +106, +98, +82, +4, +60, +221, +17, +246, +129, +134, +182, +44, +245, +41, +157, +219, +129, +251, +1, +185, +17, +42, +227, +205, +172, +238, +101, +104, +215, +117, +38, +223, +181, 169, -149, -10, +250, +185, +1, +189, 112, -120, +180, +171, +42, +172, +197, +189, +107, +93, +221, +38, +62, +155, +198, +58, +215, +254, +151, +207, +130, 74, -214, -214, -97, -102, -116, -120, -213, -106, +138, +252, +99, +19, +199, +201, +39, +211, +227, +164, 236, -232, -182, -73, -67, -66, -254, -90, +44, +96, +89, +207, +247, 148, -25, -134, -98, -136, -5, -94, -11, -62, -80, -25, -205, -149, -49, -253, -110, -66, -47, -90, -251, +115, +228, +143, +234, +203, 110, -128, -56, -131, -210, -127, -245, +71, +64, +170, +180, +54, +35, +93, +84, +121, 154, -31, -214, -45, -142, -188, -209, -155, +15, +221, +111, +183, +122, +151, +95, +84, +104, 141, -69, -37, -197, -86, -77, -181, +33, +163, +193, +27, +85, +110, +136, +72, +0, +225, +35, +7, +170, +27, 176, +42, +178, +4, +190, +174, +157, +75, +192, +71, +213, 151, -214, -121, -222, +192, +128, +108, +23, +192, +116, +103, +94, +12, 253, -140, -90, -186, -89, -9, -184, -90, -167, -218, -50, -230, -209, -152, -37, -76, -77, -242, -200, -242, +160, +203, +141, +56, +248, +20, +233, +134, +88, 201, -28, -119, +207, +171, +216, +211, +228, +251, +163, +132, +39, +12, +66, +183, +122, 15, -55, -55, -134, -249, -33, -139, -200, -11, -5, -187, -86, -249, -99, -50, -155, -240, -131, +10, 29, -23, -187, -118, -52, -139, -126, -157, -37, -179, -2, -43, +46, +175, +13, +176, +175, +201, +237, +168, +150, +174, +98, +34, +20, +129, +119, +105, +114, +91, +213, +50, +10, +150, +66, +17, 118, -42, +176, +23, +228, +226, +198, +193, +70, +227, +177, +251, +131, 175, -25, -192, -240, -196, -188, -4, -202, -100, -77, +158, +160, +87, +169, +102, +218, +153, +252, 188, -192, -131, -182, -168, -77, -110, +150, +218, +169, +154, +186, 214, -141, -76, -144, -251, -94, -167, -219, -235, -12, +26, +143, +197, +86, +151, +16, +160, +119, +216, +75, 254, -238, -222, +26, +167, +245, +15, +141, +81, +199, +129, +226, +26, +62, +245, 116, +222, +203, +208, +86, +0, +114, +213, +194, +93, +156, +132, +85, +231, +248, +104, +74, 191, -166, -137, +82, +125, +139, +158, +89, +114, +61, +228, +164, +49, +139, +179, +159, +48, +63, +214, +124, +203, +3, +158, 32, -191, +60, +14, +209, +209, +57, +147, 190, -161, -249, +100, +44, +198, +236, +67, +22, +167, +216, +9, +111, +215, +184, +85, +41, +52, +54, 94, -74, -33, -73, +205, +135, +225, +122, +59, +247, +198, +243, +35, +83, 7, -222, -117, +27, +34, +5, +15, +23, +180, +110, +197, +104, +94, +161, +28, +231, 123, -183, -173, -155, -181, -44, +168, +96, +73, +161, +108, +180, +92, +174, +84, +191, +170, +236, +217, +218, +248, 29, -205, -177, -95, -58, +69, +106, +48, +127, +49, +99, +255, +249, 159, 191, -172, -165, -228, -24, -103, -155, -120, -62, -135, +130, +239, +7, +52, 72, -204, -156, -114, -185, -11, -199, -252, -227, -149, -182, -102, -129, -207, -85, -154, -57, -204, -246, +140, +177, +88, +213, 14, -242, -84, -198, -206, -84, -76, -175, +15, +98, +236, +142, +99, +67, +93, +146, +55, +116, +88, +0, +135, +152, +222, +209, +165, +249, +144, +9, +111, +40, +197, +151, +204, +157, +65, +64, +104, 253, -90, +233, +70, 255, -226, -28, -248, -27, -72, -85, -194, +172, +173, 39, -109, +253, +144, 134, -63, -82, -63, -47, -72, -51, +43, +74, 31, -81, -231, -19, -241, -123, -213, -6, -20, -82, -236, 98, -231, -76, -69, -19, -97, -90, -133, -7, -133, -78, +197, +53, +35, +254, +143, +37, +52, +39, +128, 70, -244, -112, -14, -205, -44, -125, -241, -177, -88, -154, -82, -62, -32, 215, -2, -211, -125, -161, -221, -33, +62, +135, +239, +119, 189, -221, -171, -55, -255, -105, +217, +54, +161, +190, +43, +153, +106, +149, +30, +126, +179, +159, 228, -141, -223, +210, +210, +82, +187, +109, 13, -17, -24, -153, -44, -53, -8, -49, +196, +127, 47, -99, -238, +91, 253, -201, -211, -142, +246, +27, 42, -48, -201, -104, -41, +140, +6, +208, +225, +50, +183, +208, 230, -20, -255, -62, -139, +156, +58, 161, -6, -186, -0, -3, -115, -95, -190, -125, -22, -19, -8, +35, +141, +201, +46, +148, +39, +124, +246, +252, 250, -126, -127, -123, -238, -172, 194, -37, -197, -106, -98, -33, -171, -149, -128, -67, -236, -17, +220, +95, +191, +116, +111, +218, +238, +215, +110, +239, +170, +159, +78, +254, 49, -5, -212, +63, +57, +61, +231, +0, +21, +227, +170, +107, +92, +180, +46, +255, +246, +181, +149, +95, +225, +183, +55, +114, +27, +147, 185, -20, -179, -157, -59, +74, +21, +127, +198, +84, +75, +47, +107, +96, +90, +152, +92, +243, 49, +121, +173, +182, +142, +113, +11, +20, +85, +22, +7, +52, +225, +199, +43, +212, +227, +159, +174, 116, +223, +144, 91, -92, -6, -63, -98, +170, +24, +14, +208, +235, +7, +246, +17, +132, +99, +34, +134, +196, 85, -25, -88, -44, +108, +137, +39, +75, +23, 73, -47, -251, -144, -142, -2, -85, -12, -16, -70, -177, -207, -211, -30, -96, -222, -60, -223, -218, -197, -60, -140, -19, -72, -197, -117, -138, -171, -171, -15, -229, -211, -51, -177, +67, +28, +26, +159, +192, +219, +113, +52, +126, +98, +84, 64, +199, +27, +97, +242, 79, -133, -173, -215, -62, -150, -115, -85, -42, -241, -173, -192, -208, -124, -33, -47, -130, -105, -154, +160, +108, +119, +44, +34, +39, +190, +254, +116, +229, +204, +195, +49, +62, +8, +35, +88, +223, +250, +11, +129, 31, -92, -13, -78, -188, -205, -113, +255, +14, +63, +126, +126, +232, +56, 223, -151, +228, +155, 249, -244, -187, -40, -75, -95, -25, -94, -164, +119, +179, +10, +57, +112, +219, +124, +242, +198, +137, +246, +197, +205, +252, 82, -146, -138, -117, -42, -103, -211, -231, -128, -180, +156, +18, +4, 150, +169, +114, +27, +158, +113, +234, +143, 106, -93, +27, +64, +90, +167, +210, +125, +221, +122, 21, -62, -32, -162, -218, -29, +126, +5, +99, +213, +202, +118, +145, +167, +109, +168, +231, +106, +180, +27, +2, +39, +70, +194, +107, +139, +18, +89, +248, +211, +183, +223, +189, +88, +172, +74, +169, +160, +223, +77, +33, +159, +177, +216, +197, +19, 251, -32, -228, -218, -78, -164, -214, +192, +37, +96, 165, -114, -155, -199, -233, +227, +97, +167, +179, +58, +239, +159, +208, 62, -31, -174, -104, -27, -98, +40, +46, +179, 52, -81, -186, -83, -97, -151, -202, +49, +69, +72, +156, 168, -239, -95, -64, -11, -80, -111, -213, 10, -12, -89, -67, -216, -22, +155, +37, +4, +214, 83, -14, -142, -43, -237, -16, -72, -154, -115, -53, -222, -2, -107, -85, +140, +234, +192, +89, +181, 143, -195, -163, 128, +80, +136, +143, +66, +30, +132, 210, -4, -105, +75, +187, +110, +153, +183, +19, +200, +53, +71, +54, +106, +59, +148, +94, 69, -42, -234, +132, +18, +94, +250, +44, +225, +69, +147, +53, +187, +73, +224, +207, +103, +31, +206, +241, +255, +52, +83, +118, +175, +160, +217, +74, +158, +255, +130, +51, +208, +250, +137, +173, +109, +31, +135, +72, +224, 0, -37, -140, -194, -104, -236, -5, -66, -215, -191, +9, +170, +80, +221, +165, +158, +73, +7, +34, +189, +102, +195, +166, +242, +39, +24, +79, 199, -112, -212, -172, -225, -29, -101, -46, -98, -45, -45, +19, +82, +122, +5, +180, +193, +184, +42, +244, +79, +175, +223, +39, +202, +134, +56, +26, +185, 21, +231, +56, +24, +47, +74, +227, +19, +55, +236, +213, +235, +155, +214, 103, -181, -194, -35, -2, -144, -14, -168, -200, -203, -114, -177, -16, +247, +182, +115, +127, +219, +186, +239, +175, +155, +218, +159, +101, +117, +11, +103, +238, +45, +230, +108, +17, +239, +182, +126, +113, +182, +94, +251, +190, +221, 26, -24, -90, -119, -146, -136, -143, -194, -40, +172, +155, +214, +61, +190, 224, -209, +44, +113, +206, +114, +13, +230, +133, +33, +59, +95, +160, 219, -106, -187, -80, -17, -194, 110, -5, -58, -79, +60, +229, +111, +53, +103, +191, +238, +220, +12, +218, +189, 117, -247, +179, +122, +0, +26, +59, +12, +28, +97, +107, +6, +222, +100, +133, +237, +219, +61, +95, +166, +71, +106, +204, +250, 123, +231, +170, +221, +117, +251, +15, +189, +235, +214, +101, +238, +202, +241, +111, +114, +118, +165, +166, +160, +80, +3, 153, -26, -135, -35, -70, -78, -42, -108, -215, -86, -47, -145, -138, +176, +49, 213, -209, -73, -197, -234, -128, -82, -177, -58, -34, +239, +210, +154, +189, +239, +94, +181, +175, +91, +15, +55, +25, +77, +254, +157, +230, +189, +146, 169, -200, -149, -241, +83, +120, +172, +84, +183, +254, +47, +176, +187, +95, +254, +14, +0, +21, 46, +213, +111, +117, +27, +33, +226, +231, +148, +72, +43, +77, +113, +161, +161, +231, +112, 149, -136, -26, -45, -177, -86, -198, -67, -183, +197, +252, +124, +90, +42, 214, -115, -48, -175, -160, -58, -241, 189, -133, -251, -92, -144, -98, -173, +23, +232, +78, +71, +53, +49, +197, +255, +99, +187, +31, +232, +76, +55, +93, +66, +178, +202, +55, +154, +128, 114, -126, -235, +84, +138, 19, -254, -86, +64, +123, +121, +236, +52, +130, +25, +42, +114, +34, +16, +35, +47, +145, +211, +81, +187, +67, 152, -176, -129, -250, -128, -89, -57, -61, -200, -181, -78, -98, -234, 21, -2, -140, -120, -239, -92, -138, -255, -102, -141, -63, -113, -12, -6, -156, -194, -218, -11, -37, -59, -194, -150, -127, -174, -106, +210, +86, +196, +94, 148, -216, -242, 247, -90, -149, +44, +42, +182, +73, +217, +180, 144, -151, -172, -160, -77, -34, 154, -223, -171, -209, -90, +6, +105, +194, +80, +177, +35, +91, +86, +142, +28, +101, +69, +113, +207, +16, +133, +101, +204, +227, +92, 123, +48, +242, 118, -37, -145, -173, -185, -130, -15, -65, -35, -111, -146, -246, -50, +197, +9, +84, +83, +29, 66, -85, +93, +214, +4, +234, +126, +74, +239, +45, +166, +202, +128, +112, +160, +223, +246, +121, 1, -186, -37, -147, -165, -103, -135, -61, -155, -23, -55, -84, -20, -91, -253, -19, -82, -108, -85, -137, -98, -232, -96, -215, -168, +161, 3, +73, +72, +101, +190, +241, +111, +1, +122, +65, +132, +50, +252, +51, +45, +250, 9, -11, -238, +104, +196, +50, +67, +190, +171, +202, +137, +82, +161, +154, +236, +144, +132, +184, 158, -92, -223, -133, -210, -185, -251, +127, +44, 189, -117, -211, -185, -114, -47, -219, -55, -153, -27, -228, -157, -116, +136, 143, -17, -190, -170, -244, -34, -109, -30, -103, -28, -242, -56, -248, -107, -226, -112, -129, -101, -82, 169, -192, +150, +113, +8, +9, 158, -188, +148, +135, 23, -214, +46, +104, 74, -77, -240, -160, -187, -153, -55, +227, +128, +89, +90, +227, +232, +138, +134, +2, +104, +144, +161, +46, +44, +235, +163, +132, +109, +6, +89, 140, -88, +71, +9, +153, +244, +243, +29, +39, +217, +38, +225, +104, +121, +172, +44, +197, +158, +3, +178, +11, +232, +238, +66, +93, +240, +21, +193, +116, +225, +37, +183, +108, +97, +37, +47, +102, +125, +115, +30, +178, +122, +238, +116, +219, +142, +60, +52, +64, +107, +219, +240, +208, +224, +108, +238, +189, +67, +67, 180, -162, -110, -202, -210, -75, -161, -95, -100, -79, -57, -50, -176, -2, -137, -154, -42, -117, -96, +177, +225, +14, +13, 80, +126, 151, -225, -111, -210, -65, -243, -157, +233, +193, 82, -61, -201, -217, -17, -175, -123, -59, -206, -29, -206, -200, -23, -18, -139, +220, 95, -131, -201, -46, -123, -59, -65, -117, -61, -60, -162, -149, -158, +135, +168, +213, +42, +169, +113, +29, +137, +159, +234, +100, +237, +168, +250, +43, +56, +81, +214, +118, +52, 206, -124, -31, -78, -60, -99, -11, -110, +42, +138, +235, +90, +87, +106, +166, +73, +54, +83, +12, +169, +191, +43, +53, +97, +144, +53, +87, 86, -104, -143, -188, -35, -46, -29, -122, -187, +83, +67, +230, 14, -100, -111, -108, -44, -222, +216, +53, +170, +5, +139, +236, +168, +34, +126, +253, +215, +24, +251, +191, +97, +234, +240, +19, +67, +3, +233, +191, 151, +49, +213, +4, 42, -115, -34, +120, +112, +153, +234, 128, -116, -48, -204, -53, -0, -5, -218, -185, -114, +109, +98, +97, +84, +213, +245, +197, +170, +83, +205, 230, -144, -88, -145, -175, -2, -110, -42, -222, -48, 27, -118, -121, -162, -135, -161, +154, +237, 6, -128, -47, -221, -214, -186, -79, -79, -101, +253, +250, +87, +166, +225, +198, +233, +181, +112, +231, +129, +179, +245, +2, +105, +131, +54, +217, +74, 135, -46, -140, -39, -6, -18, +109, +95, +166, +221, +234, +197, +126, +137, +105, +240, +202, +218, +233, +148, +98, +89, +99, +221, +71, +225, +20, +142, +236, +194, +243, +16, +56, +95, +77, +223, +134, +176, +117, +11, +78, +229, +12, +197, +45, 9, -64, -18, -198, +85, +5, +144, +86, +61, +231, +106, +41, +173, +111, +10, 156, -62, +11, +22, 125, -228, -206, -98, -25, +95, +155, +35, 45, -194, -184, -188, -236, -232, -139, -20, -152, +224, +36, +110, +104, +30, +22, +162, 166, -20, -176, -214, -155, -172, -2, -223, +59, +154, 115, -135, +38, +110, +123, +168, +140, +22, +160, +208, +176, +166, +213, +132, +63, 165, -77, -228, -141, +215, +190, +29, +45, +61, +183, +200, +213, 50, -151, -235, +24, +27, +90, +238, +123, +80, 72, +107, 64, -157, +29, +88, +45, +41, +94, +31, +27, +149, +54, +225, +58, +48, +161, 140, -145, -124, -247, -39, -168, -16, +47, +129, +123, +32, +82, +21, +139, +184, +25, +2, +213, +82, +88, +176, +217, +235, +189, +98, 163, 186, -132, -121, -230, -173, -131, -82, -142, +128, 55, -87, -41, -192, -18, -215, -155, -66, -22, -19, -248, -38, -19, -45, -159, -102, +108, +85, +88, +80, +191, +25, +158, +26, +25, +255, +240, +130, +32, +151, +72, 29, -6, +191, +207, +186, +196, 171, -53, -104, -252, -139, -69, -248, -202, +208, +82, 248, +4, +159, +251, +198, +222, +163, +55, +94, +66, +157, +66, +170, +113, +68, 75, -83, -192, -197, -107, -156, +131, 86, -206, -171, -195, -99, -5, -82, -237, -2, -158, -150, -88, -220, -36, -190, +123, +166, +118, +119, +35, 212, -135, -77, -175, -0, -124, -29, -54, -171, -53, -104, -252, -11, -69, -226, -74, -55, +108, 49, -88, -9, -241, -114, -248, -78, -150, -89, -247, -10, -226, -158, -21, -202, -26, +5, +69, +205, +5, +236, +14, +159, +76, +188, +145, +199, +169, 133, -243, -185, -252, -179, -220, -9, -44, -17, -6, -75, -13, -37, -191, -179, -64, -95, -177, -92, -106, 30, -181, -125, -236, -247, -131, -208, -5, -147, -118, -192, -234, -177, -43, +106, 53, -114, -9, -121, -128, -194, -15, -31, -75, -234, -27, -110, -19, -27, -70, -134, -25, -217, -148, -146, -84, -231, -212, +89, +104, +159, +57, +83, +63, +28, +50, +95, 42, -2, -12, -187, +61, +50, +13, +249, +4, +83, +93, +193, +67, +69, +253, +139, +165, +119, +139, +190, +81, +61, +119, +177, +177, +30, +250, +183, +88, +176, +202, +94, 197, -108, -21, -123, -35, -116, -95, -161, -41, -55, -198, -44, 207, -170, -82, -34, -65, -213, -180, -5, +101, +60, +150, +163, 138, +255, +165, +165, +153, 168, -236, -65, -76, -136, +247, +85, +190, +206, +34, +182, +215, +242, 18, -77, -28, -10, -100, -236, -238, -129, -239, -105, -101, -214, +233, +126, +34, +114, +68, +146, +254, +89, +115, +223, 66, -52, -75, +81, +85, +63, +100, 99, -143, -252, -69, -206, -105, -87, -201, -53, -15, -173, +114, +197, 169, +14, +221, +0, +21, +217, +136, +239, +9, 192, -56, +137, +7, +53, +63, +161, +247, +219, +147, +247, +195, 163, -222, -56, -212, -85, -221, -214, -69, -162, -135, -243, -167, -70, -228, +190, 112, -133, -69, -250, -166, -80, -207, -207, -248, -230, -160, -123, -49, -198, -155, -88, -165, +33, +190, +245, +76, +204, +243, +186, +245, +10, 94, -193, -44, -134, -106, -17, -84, -211, -9, -248, -171, -31, -197, +4, +104, +160, +215, +8, +124, +129, 161, -249, -250, -115, -237, +181, +2, +247, +246, +216, +83, +199, +118, 193, -51, -119, -224, -240, -249, -34, +140, +189, 17, +179, +166, +101, +102, +66, +135, +50, +187, +236, 164, -24, -83, -94, -59, -92, +137, +64, +193, +121, +71, 182, -168, -250, -134, -186, +67, +26, +16, 110, -153, -66, -63, -17, -243, -18, -200, +23, +106, +246, +154, +229, +130, +152, +167, +88, +228, +179, +227, +45, +225, +131, +145, +173, +242, +233, +224, +136, +56, +164, +171, 195, -149, +210, +94, +109, +54, +248, +156, 209, -181, -194, -86, -168, -230, -86, +69, +151, +205, +69, +96, +94, +205, +38, +6, +77, +102, +74, +140, +87, +172, +205, +142, +112, +191, +52, +36, +233, +175, +73, +171, +77, +66, +157, +46, +61, +135, +215, +104, +4, +39, +77, +112, +29, +90, +170, +223, +71, +139, +232, +241, +53, +15, 196, -65, -121, +171, +217, +185, +160, +194, +76, +136, +240, +138, +213, +215, +145, +109, +140, +6, +36, +251, +53, +169, +45, +205, 76, +157, +195, +235, +173, +61, +116, +128, +155, +102, +244, +168, +233, +239, +63, +60, +29, +107, +234, +46, +35, +50, 188, -40, -38, -207, -191, -172, -85, -41, +98, +229, +117, +108, +219, +163, +9, +233, 126, +93, +234, +139, +156, +169, 71, -14, -20, +196, +162, +23, +52, 152, -186, -186, -59, -67, +130, +181, +126, +54, +217, 203, -219, +76, +86, +235, +212, +74, +5, +56, +60, +37, +107, +235, 48, -231, -209, -122, -128, -69, -179, -129, -91, -184, -132, -19, -136, -121, -179, -163, 51, +58, +188, +106, +53, +118, +116, +219, +164, +33, +33, +127, +45, +202, +12, +67, +49, +196, +2, +175, +5, +31, +168, +140, +230, +202, +152, +126, +55, +161, +23, 173, -254, -4, -191, -166, -234, -3, -24, -75, -192, -231, -80, +125, +55, 64, -0, -31, -238, -66, -44, -195, -233, -251, -208, -101, -36, -215, -78, -3, -39, -139, -150, +156, 65, -236, -136, +233, +191, +122, +205, 15, -210, -18, -83, -224, -65, -32, -71, -47, -92, -195, -201, -146, -243, -195, -112, -97, -28, -116, -64, -1, -58, -158, -206, -45, -28, -190, -18, -234, -123, -164, -88, -47, -36, -214, -224, -157, -7, +235, 22, +71, +222, +232, +205, +198, 162, -7, -74, -231, -107, -30, -57, -160, -14, -84, -212, -56, -135, -82, -10, +146, +98, +171, +166, +90, +216, +75, +235, +60, +239, +126, +70, +45, +221, +172, +4, +92, +173, +83, +109, 25, -77, -20, +243, +104, +204, +18, +166, +38, +121, +100, +249, +100, +142, +187, +135, +155, +27, +195, +252, +144, 69, -168, +228, +133, +130, +93, 171, +252, +49, +153, +77, +248, +193, +142, +139, +93, +59, +154, 69, +191, +206, +146, +89, +129, +21, +59, 149, -141, -156, -195, -76, +215, +12, +96, +120, +98, +94, +2, +101, +178, +38, +94, +224, +65, +91, +212, +38, +55, +235, +70, +38, +200, +125, +175, +211, +237, +117, +6, +127, +119, 111, -27, -228, -241, -209, +186, +95, +211, +68, +144, +95, +223, +208, 124, +47, +165, +144, +164, +3, +239, +186, 189, -221, -43, -82, -120, +219, +214, +205, +90, +150, +142, +230, +216, +47, 157, -10, -4, -11, +207, +95, +214, +82, +114, +140, +179, +77, +60, +159, +67, +36, 102, -161, -198, +78, +185, +220, 133, -170, -206, -155, +99, +254, +241, +74, +91, +179, +192, +231, +42, +205, 28, -19, -208, +102, +123, 7, +121, +42, +99, +103, +42, +166, +215, +126, +173, +127, +113, +14, 252, -29, -44, -36, -36, -110, -130, -47, -84, -231, -82, -20, -17, -155, -56, -9, +13, +164, +42, +225, +147, +54, +195, +31, +169, +159, 23, -14, -155, -64, -73, -86, +164, +153, +143, +168, +243, 137, -211, -57, -213, -74, -125, -242, -176, -208, -197, -182, -18, -24, -17, -199, -56, -197, +248, +189, +106, +3, 10, +41, +118, +177, +115, +166, +162, +137, +48, +173, +194, +131, +66, +39, +35, +122, +56, +135, +102, +150, 190, -227, -12, -105, -171, -239, -111, -130, -103, -241, -145, -33, -15, +248, +88, 44, -135, -137, -138, -17, -158, -118, -222, -97, -195, -53, -144, -113, 77, -82, -68, -248, -16, 41, -75, +31, 144, -56, -241, -136, +107, +129, +233, +190, +208, +238, +144, +222, +238, +213, 155, -247, -205, -196, -182, -11, -25, -34, -86, -249, -24, -91, -199, -166, -200, -142, -13, -106, -226, -82, -169, +255, +52, 242, -54, -159, -60, -92, -188, -48, -183, -144, -189, -179, -17, +198, +239, +134, +8, +140, +76, +150, +26, 132, -232, -250, -111, -171, -175, -65, +152, +151, +49, +247, +254, +228, +105, +71, +21, +152, +100, +180, +20, +115, +138, +127, +159, +197, +80, +3, +93, +128, +129, +185, +47, +223, +62, +139, +9, +4, +125, +191, +191, +61, +119, +86, 225, -91, -66, -157, -195, -147, -176, -69, -253, +146, +98, +53, +177, +144, +213, +74, +192, +33, +246, 136, -186, -16, -159, -157, -201, -41, -79, +152, +2, 234, -207, -155, -228, -142, -54, -253, -78, -189, -154, -61, -171, -104, -145, -55, -219, -97, -219, -108, -87, -5, -16, -166, -199, -107, -9, -8, -187, -187, +92, +138, +217, +206, +157, +24, +186, +45, +46, +131, +31, +177, +170, +12, 44, -233, -88, +150, +164, +151, +125, +72, +71, +129, +42, +6, +8, +163, +216, +231, +105, +15, +48, +111, +158, +111, +237, +98, 30, -225, -114, -52, -235, -11, -59, -143, -7, -155, -229, -196, -13, -195, -60, -155, -14, -32, -255, -89, -68, -242, -37, -13, -44, -225, -80, +198, +9, +164, +226, +58, 197, -121, -181, -73, -148, -13, -216, +213, +213, +135, +242, +233, +153, +88, +160, +167, +194, +214, +107, +31, +203, +185, +42, +149, +248, +86, +96, +104, +190, +144, 23, -169, -178, -21, +193, +52, +205, 15, -76, -178, -161, -151, -232, -213, -121, -78, -63, -180, -78, -162, -116, +174, +6, +39, +222, +230, +184, +239, +203, +124, +250, +93, +148, 165, -3, -147, -134, -97, +175, +12, 47, -228, -221, -148, +82, +41, +73, +197, +58, +149, +179, +233, +115, +64, +90, +75, +181, +174, +10, +31, +16, 81, -223, -89, -79, +237, +142, +125, 16, +114, +109, +39, 82, -11, -29, -48, -85, -1, -232, -242, -232, -197, -222, -208, -243, -189, -100, -5, -21, +235, 82, -245, -42, -182, -54, -210, -67, -239, -37, -218, -108, -0, -213, -168, -39, -192, +185, +205, +227, +116, +159, +15, +87, 180, +13, +49, +154, +40, +221, +169, +176, +75, +101, +212, +247, +47, +160, +5, +168, +183, 106, -164, -56, -76, -196, -213, -126, -65, 5, -71, -245, -140, -193, -177, +134, +172, +33, +108, +139, +41, +7, +199, +149, +118, +8, +36, +205, 185, -53, -104, -102, -156, -231, +26, +111, 129, -178, -213, -192, -215, -16, +181, +170, +199, +225, +81, +64, +105, +130, +180, 34, -51, -29, -216, -120, -37, -217, -82, -211, -68, -1, -166, -61, -127, -121, -207, -74, -159, -179, +21, +117, +128, +18, +70, +97, 52, -122, -204, -100, -162, -90, -6, -76, -196, -130, -24, +246, +2, +161, +235, +223, +99, +56, +106, +214, +240, +142, +50, +23, +177, +150, +150, +138, +179, 90, -140, -230, -205, -148, -139, -165, -231, -39, -239, -58, -129, -51, -88, -129, +225, +17, +1, +72, 7, -180, -204, -96, -249, -116, -229, -164, -195, -141, -74, -218, -166, -163, -192, -80, 84, -121, -33, -208, -45, -91, -152, -110, -133, -9, -99, -113, -215, -14, -70, -254, -114, -140, -150, -61, -252, -201, -167, -223, -171, +228, +101, +185, 88, +8, 13, +12, +173, +59, +73, +196, +71, +97, +20, +240, +232, +109, +181, +93, +168, 8, -198, -144, -81, -95, +97, 183, +2, +157, +167, +186, +251, +189, 76, -40, +141, +195, +17, +35, +39, +21, +182, +107, +171, +151, +72, +197, +234, +232, +164, +98, +117, +64, +169, +88, +29, +145, +84, +228, +202, +120, +151, +74, +68, +141, +150, +88, +43, +227, +161, +91, +235, +57, +152, +87, +80, +157, +248, +222, +194, +125, +46, +72, 177, -231, -79, -206, -155, -33, -19, +86, +57, 191, +245, +9, +127, +43, +76, +216, +64, 125, -131, -49, -25, -244, -6, +192, +172, +156, +30, +228, +90, 39, -126, -23, +49, +245, +10, +1, 70, -222, -212, -11, -222, 188, 119, -182, 46, -29, -113, -224, -34, -102, -36, -20, -151, -199, -153, -131, -149, -19, -226, -185, -1, -143, -36, -241, -130, -141, -168, -40, +197, +127, +179, +198, +159, 56, -220, -44, -189, +6, +3, +78, +97, +237, +133, +146, +29, +97, +203, +63, +87, +53, +74, +108, +249, +123, +173, +74, +200, +75, +86, +208, +38, +17, +205, +239, +213, +104, +173, +61, +187, +146, +200, +214, +92, +193, +135, +160, +145, +55, +73, +123, +25, +161, +170, +0, +221, +146, +201, +210, +179, +195, +158, +205, +139, +27, +42, +138, +173, +254, +9, +41, +182, +170, +68, +49, +116, +176, +107, +212, +129, +132, +5, +119, +79, +174, +239, +66, +233, +220, +253, +222, +186, +233, +92, 185, -7, +151, 237, +155, +204, +13, +242, +78, +186, +199, +8, +95, +85, +122, +145, +54, +143, +51, +14, +121, +28, +252, +53, +113, +184, +192, +50, +169, +84, +96, 79, -176, +222, 11, +107, +165, +38, +120, +208, +221, +204, +27, +70, +44, +90, +81, +55, +101, +233, +165, +208, +47, +178, +167, +28, +25, +88, +129, +68, +77, +149, +58, +48, +168, +203, +240, +55, +233, +160, +249, +78, +169, +158, +228, +236, +136, 215, -111, -98, -237, -57, -194, -96, +189, +29, +231, +14, +103, 228, +11, +137, +197, 175, -97, -19, -168, -87, -233, -122, 193, -163, -16, -105, +100, +151, +189, +157, +160, +186, +30, +30, +209, +74, +79, +103, 190, -61, -225, -47, -99, -82, -195, -251, -170, +15, +39, +158, 177, -69, -233, -122, -16, -203, -70, -46, -56, -107, -250, -168, -160, -230, -49, +5, +55, +43, +180, +71, +222, +17, +151, +14, 189, -207, -248, -97, -248, -3, +93, +7, +178, +55, +54, +22, +239, +75, +149, +57, +17, +64, +58, +24, +230, 26, -136, -179, -146, -52, +128, +2, +237, +92, +57, +115, +72, +172, 200, -23, +87, 1, -44, 55, -227, -196, -95, -214, -223, -149, -63, -25, -62, +21, +111, +152, +13, +187, +60, +209, +195, +80, +3, +192, +151, +110, +107, +221, +167, +167, +178, 67, -44, 23, -90, -227, -107, -112, -38, -140, -196, -15, -212, -199, -194, -251, -51, +198, +19, +3, +137, +4, +32, +9, +99, +78, +159, +62, +114, 103, -157, -238, -69, -44, -162, -48, -17, -170, -160, -202, -162, -229, +177, +140, +22, +97, +92, +94, 118, -207, -179, -23, -215, -163, -249, -98, -230, +244, +69, +10, +76, +83, +10, +88, +235, +77, +86, +129, +239, +185, +195, +210, +38, +242, +70, 153, +203, +117, +36, +160, +78, +198, +72, +190, 251, -40, -77, -206, -226, -17, +19, +84, +136, +81, +93, +194, +60, 243, +214, +65, +41, +199, 155, +171, +20, +96, +137, +235, +77, +33, +139, +9, +124, +147, +137, +150, +79, +179, +14, +131, +213, +26, +52, +254, 197, -25, -103, -180, -45, -40, -74, +34, +124, +101, +252, +165, 41, -54, -11, -122, -56, -209, -227, -86, -13, -192, -159, -233, -208, -217, -6, -51, -228, -5, -155, -64, -251, -248, -102, -115, 224, -203, -112, -166, -84, -137, -157, -71, -196, -207, -129, -73, -134, +226, +53, +78, 43, -138, -188, -175, -172, -177, -16, -39, -80, -229, -135, -194, -171, -67, -170, -247, -93, -98, -7, -191, -156, +231, +213, +225, 177, -176, -51, -87, -192, -173, -191, -229, +2, +169, +118, +1, +79, +75, +44, +110, +18, +95, +234, +195, +166, 87, +0, +190, +14, +155, 213, -231, -72, -179, -7, +26, +52, 254, +133, +34, +113, +165, +155, +24, 172, -62, -71, -154, -67, -32, -141, -7, +132, +120, +57, +124, +39, 203, -27, -194, -128, -184, -210, +172, +123, +5, +113, +207, +10, +101, +141, 194, -33, -120, -164, -221, -99, +249, +92, +254, +89, +238, +4, +150, +8, +131, +165, +134, +146, +223, +89, +160, +175, +88, +46, +53, +143, +218, +62, +246, +251, +65, +232, +130, +73, +59, +96, +245, +216, +149, 26, -94, -117, +185, +132, +60, +64, +225, +135, +143, +37, +245, +13, +183, +137, +13, +35, +195, +140, 108, -56, -65, 74, -203, -26, -74, -154, +73, +170, +115, +106, +21, +1, +134, +221, +98, +182, +138, +189, +17, +186, +175, +208, +148, +27, +99, +150, +103, +85, +41, 145, -64, +160, +106, +218, +2, +69, +84, 246, -225, -249, -127, -75, -214, -252, -77, +32, +38, +68, +137, +38, +14, +5, +50, +118, +247, +192, +247, 180, -30, -109, +50, +107, +33, +154, +165, +177, +71, +254, +34, +231, +180, +171, +228, +154, +135, +214, +84, +96, +156, +81, +111, +28, 234, -131, +170, +110, +235, +34, +209, +195, +249, 83, +35, +114, 184, -222, -204, -249, +194, +34, +125, +83, +168, +231, +103, 124, -40, -52, -135, -132, -18, -254, +115, +208, 189, -75, -212, +24, +227, +77, +172, +82, +175, 96, -56, -124, -183, -57, -164, -92, -180, -114, -99, -212, -63, -43, -223, -89, -232, -34, -80, -43, -192, +22, +67, +181, +8, +170, +233, +4, 252, -134, -5, -211, -37, -244, -232, -201, -77, -104, -116, -133, +213, +143, +226, +208, +124, +253, +185, +246, +224, +153, +59, +112, +248, +124, 145, -151, -17, +8, +82, +140, +41, +175, +29, +46, +91, +84, +125, +67, +93, +183, 76, -204, +161, +159, +136, +121, +9, +228, +225, 202, -42, -191, +232, +90, +97, +43, +84, +115, +43, +226, +160, +60, +38, +94, +20, +147, 231, -155, -55, -82, -193, -247, 95, -150, -129, -172, -252, -30, -6, -206, -152, -207, -197, -213, -4, -94, -145, -249, -138, -178, -61, +214, +170, +20, +191, +35, +7, +10, +76, +93, +221, +157, 161, -183, -16, -94, -112, -160, -24, +229, +109, +152, +243, +104, 61, -62, -58, -201, -223, -24, -63, -252, -250, -33, +192, +162, 217, -28, -187, -4, -74, -125, -87, -61, +192, +45, +92, +194, +9, +196, +188, +217, +209, +153, +86, +127, 130, -154, -102, -40, -216, -248, -41, +95, +83, +245, 1, -141, -182, -193, -52, -7, -118, -211, -206, -170, -220, -163, +140, +37, +224, +115, +40, +32, +128, +15, +119, +33, +150, +225, +244, +125, +232, +50, +146, +107, +167, +129, +147, 69, -99, +203, +32, +118, +196, +7, +105, +137, +41, 240, -178, -241, -216, -157, -139, -43, -63, -155, -234, -100, -76, -71, -163, -236, -227, -26, -149, -146, -158, -209, -194, -51, -153, -106, -157, -20, -173, -49, -148, -101, +32, 144, -19, -208, -195, -77, +163, +23, +174, +225, +100, +201, +249, +97, +184, +48, +14, +58, +160, +0, +29, +79, +231, +22, +14, +95, +9, +245, 61, -158, +82, +172, +23, +18, +107, +240, +206, +3, +11, +209, +3, 165, -176, -88, -139, -114, -55, -36, -94, -9, 243, -27, -67, -154, -71, -44, -230, -214, -88, -191, -241, -166, -5, -171, -101, -192, -215, -224, +53, +143, +28, 80, -147, -101, +7, +42, +106, +156, +67, +41, +133, +140, +38, +138, +34, +212, +213, 162, 202, -104, -236, -251, -84, -77, -131, -86, -140, -157, -179, -31, -124, -21, -239, +70, 206, -68, -173, -21, -243, -147, -113, -146, -218, -158, -231, -143, -2, -233, -231, -215, -61, -8, +97, +166, +183, +13, +242, +248, 104, -2, -82, -220, +190, +222, +238, +21, +41, +188, +78, +5, +130, +5, +179, +80, +227, 66, -57, -35, -10, -136, -83, +85, +231, +77, +142, +9, +232, +3, +254, +14, +22, +18, +18, +55, 193, -227, -84, -80, -249, +23, 170, -175, -9, -61, -75, -203, -134, -33, -20, 115, -55, -166, -244, -92, -140, -25, -181, -240, -166, -103, -95, -199, -31, -137, -246, -174, -114, +41, +138, +136, +77, +156, +132, 11, -182, -168, -142, -152, -253, -74, -104, -112, -182, +135, +77, +160, 36, +171, +196, +233, +156, +106, +165, +62, 121, -227, -102, -231, -115, -82, -14, -38, -75, -175, -108, -42, -142, -244, -208, -96, +88, +232, +98, +91, +9, +140, +136, +99, +156, +98, +5, +223, +113, +134, +180, 213, -211, -21, -188, -86, +247, +55, +193, +179, +248, +200, +144, 7, -202, -134, -119, -241, -203, +150, +195, +68, +197, +8, +79, +59, +239, +176, 225, -174, +26, +200, +184, 38, -113, -179, +41, +34, +124, +136, 148, -44, -232, 37, -188, -196, -147, -2, -136, -119, -224, -175, -38, -130, -190, -96, -80, +72, 156, -231, +120, +196, 205, -250, -20, -89, -150, -59, -177, -244, -236, -173, -21, -109, -18, +251, +102, +98, +219, 133, -97, +12, +17, +171, +124, +140, +173, +99, +83, +100, +199, +6, +53, +113, 169, -191, -183, -28, -153, -154, -143, -112, -163, -208, -95, -206, -3, -119, -238, -5, -238, -147, -55, -78, -102, -102, -34, -110, +84, +121, +155, +79, 30, -199, 46, -254, +94, +152, +91, +200, +222, +217, +8, +66, +116, +253, +183, +213, +215, +160, 240, -193, -230, -43, -103, -14, +45, +161, +206, +225, +73, +216, +162, +126, +68, +93, +136, +207, +206, +228, +148, 39, +245, +231, +77, +114, +71, +155, +126, +167, +94, +205, +158, +85, +180, +200, +155, +237, +176, +109, +182, +171, +2, +8, +211, +227, +181, +4, +132, 221, -134, -144, +93, +150, +116, +44, +143, +112, +57, +154, +245, +133, +157, +199, +131, 205, -33, -100, -229, -81, 114, -154, +226, +134, 97, +158, +77, +7, +144, +255, +44, +34, +249, +146, +6, +150, +112, +168, +226, +188, +218, 36, -57, -100, +202, +6, +236, +139, +84, +217, +138, +7, +38, +217, +208, +75, +244, +234, +60, +167, +31, +90, 39, -12, +81, +186, +210, +129, +73, +195, +176, +23, +242, +110, +202, +168, +239, +172, +39, +8, +169, +133, +14, +152, +170, +0, +116, +121, +244, +98, +111, +232, +249, +94, +178, +130, +10, +169, +122, +21, +91, +27, +233, +161, +247, +18, +109, +54, +128, +106, +212, +19, +96, 90, -139, -12, 53, -57, +82, +28, +38, +226, +106, +191, +160, +130, +163, +122, +198, +224, +216, +220, +26, +52, 51, +206, 243, -198, -188, -40, -231, -90, +64, +217, +106, 224, -88, -163, 107, -192, -159, -19, -55, -230, -190, -216, -212, -229, -110, -228, -10, -138, -36, -239, -182, -88, -159, -160, -81, -4, -50, -216, -53, -179, -47, -237, -104, +8, +145, +153, +14, +108, +188, 146, -60, -40, -82, -88, -15, -23, -91, -144, -111, -60, -62, -148, -161, +108, +169, 105, -135, -140, -115, -32, -194, -28, -73, -20, -72, -166, -31, -53, +162, +0, +211, +158, +191, +188, +103, +165, +207, +89, +26, +61, +102, +50, +81, +45, +3, +38, 98, -46, -216, -60, -92, -238, -163, -20, -183, -4, -231, -144, -2, -195, -199, -222, -113, -108, -35, -2, -228, -40, -54, -209, -104, +65, +12, +45, +70, +243, +102, +202, +197, +210, +243, +147, +119, +157, +192, 25, -39, -225, -220, -93, -132, -139, -229, -194, -141, -240, +172, +192, +3, 90, -89, -51, -227, -179, -38, -64, +102, +176, +124, +186, +114, +210, +225, +70, +37, +109, +211, +81, 96, -238, -185, +40, +170, +188, +16, +232, +150, +45, +76, +183, 194, +132, +177, +184, +107, +7, +35, +127, +57, 70, -99, -205, -64, -83, -158, -20, -134, -86, -159, -142, -250, -46, -53, -11, -20, -255, -50, +203, +30, 254, -100, -86, 228, -187, -230, -235, -243, -242, -32, -134, -120, -201, -209, -50, -138, -195, +211, +239, +85, +172, +6, +4, +99, 200, -245, -98, +168, +175, +91, +38, +148, +216, +243, +39, +231, +205, +144, +137, +223, +190, +193, +152, +12, +122, +131, +19, +191, +11, +35, +111, +234, +5, +111, +222, +59, +91, +151, +142, +56, +112, +17, +51, +18, 138, -244, +203, +227, +204, +193, 202, -93, -150, -155, -49, -169, -18, -47, +9, 241, -249, -230, -228, -229, -239, +220, +128, +71, +146, 120, -234, -67, -139, -231, -56, -3, -188, -183, +193, +70, +84, +20, +28, +110, +150, +222, +220, 131, -119, -176, +246, +39, +216, +133, +235, +55, +177, +246, +28, +97, +48, +242, +215, 176, -173, -117, -146, -237, -166, +9, 212, -166, -188, -152, -201, -155, -92, -198, -186, -203, -163, +171, +116, +189, +224, +81, 136, -149, -53, +52, +223, +158, +240, 151, -131, -38, -57, -234, -154, -44, +49, +169, +225, +125, +213, +216, +162, +116, +61, +136, +101, 35, -113, 23, -214, -46, -9, -246, -66, +156, +53, +125, +84, +80, +243, +152, +222, +103, +252, +48, +252, +1, +13, +196, 89, -131, -230, -131, +73, +26, +228, +139, +0, +150, +155, +113, +226, +47, 235, -72, -213, -65, -38, -1, -70, +239, +202, +159, +12, +159, +33, +150, +11, +173, +241, +53, 56, -104, -47, -83, -22, +19, +70, +226, +7, +234, 99, -55, -23, -154, -199, -203, -204, -69, -3, -5, -88, -169, -102, -122, -69, -113, +225, +253, +153, +179, 78, -31, -175, -51, -187, -182, -1, -205, +247, +34, +22, 81, -70, -147, -194, -249, +152, +8, +85, +80, +101, +209, +114, +187, +231, +217, +139, +235, +209, +124, +49, +243, +204, +125, +148, 38, -13, -128, -93, +103, +241, +136, +249, +205, +226, +140, +51, +218, 22, -81, 20, -133, -79, -238, -200, -247, -70, -63, -44, -3, -135, -2, -0, -89, -248, +165, +20, +155, +5, +61, +156, +232, +113, +171, +6, +224, +207, +116, +232, 108, -17, -55, -199, -176, -186, -0, +131, +25, +242, +130, +77, +160, +125, +124, +179, +57, +240, +101, +56, +83, +170, +196, +206, +35, +226, +231, +192, +36, +195, 21, +69, +222, +87, +214, +88, +136, +19, 168, -84, -119, -178, -53, -105, -172, -195, -73, -44, -55, -220, +242, +67, +225, +213, +33, +213, +251, +46, +177, +131, +95, +206, +88, 216, -116, -116, +153, +43, +224, +214, +223, +242, +171, +234, +115, +164, +217, +3, +127, +86, +159, +35, +205, +33, +144, +198, +131, +229, +13, +97, +64, +92, +105, +225, +16, +60, +210, +238, +49, +13, +175, +58, +54, +156, +32, +165, +101, +13, +37, +205, +72, +32, +251, +240, +252, +191, +37, 107, -112, -139, -1, -174, -199, -187, -89, +254, +38, +90, +143, +54, +245, +193, +41, +92, +111, +230, +124, +62, +20, 154, -73, -167, -223, -29, -84, -187, -81, -94, -173, -223, +67, +66, +9, +255, +222, +37, +106, +48, +28, 190, -105, -95, -14, -220, -126, -231, -238, -243, -77, 219, -168, -68, -189, 28, -217, +82, +46, +90, +185, +49, +234, +159, +149, +239, +44, +116, +17, +168, +21, +96, +126, +195, +130, +233, +18, +122, +244, +228, +38, +52, +186, +194, +200, 203, -85, -182, -215, +8, +38, +102, +101, +149, +223, +243, +205, +27, 169, -78, +224, +251, 47, -135, -221, -62, -220, -12, -58, -117, -139, -211, -167, -222, -189, -202, -143, -39, -22, +203, +64, +86, +126, +15, +3, +103, +204, +231, +226, +106, +2, +175, +200, +124, +69, +217, 158, +208, +91, +8, +47, 56, 80, -144, -245, -110, -138, -117, -45, -134, -125, -228, -27, +140, +30, +31, +157, 228, -208, -177, -227, -180, -178, 111, -39, -32, -87, -102, -156, -244, -189, -109, -158, -164, -11, -217, +140, +31, +126, +253, +144, +108, +142, +93, +2, +165, +190, +171, +30, +65, 77, -114, -72, -151, -177, -84, -182, -114, -63, -92, -129, -36, -177, -61, -24, -214, -184, -138, -117, -187, +51, +20, +108, +252, +148, +128, +70, +219, +96, 154, -150, -57, -97, -123, -58, -150, -77, -216, -247, -195, -145, -170, -5, -240, -76, -29, -14, -35, -125, -231, -97, +3, +187, +105, +103, +85, +238, +209, +162, +49, +120, +217, +120, +236, +206, +197, 149, -194, -118, -251, -99, -139, -118, +159, +77, +117, +50, +166, +163, +81, +246, +113, +141, +74, 73, -179, -186, -220, -169, -92, +207, +104, +225, +153, +76, +181, +78, +138, 214, +24, +202, +50, +200, +9, +232, +225, +166, +30, +207, +82, +88, 172, -2, +69, +185, +27, +18, +175, +132, +249, +141, +33, +205, +35, +22, +115, 107, 172, -23, -34, -219, -35, -127, -230, -236, -89, -247, -5, -174, -46, -139, -228, +223, +120, +211, +130, +213, 50, -118, -143, -254, -117, -164, -78, +224, +107, +112, +168, +201, +50, +81, +101, +52, +246, +125, +170, +166, +65, +43, +198, +206, +217, +15, +190, +138, +119, +103, +162, +214, +138, 249, -252, -143, -88, -160, -19, -248, -84, -151, -47, -104, +201, +56, +73, +109, 207, -90, -77, -245, -152, -102, -200, -212, -43, -146, -112, -12, -12, +243, +71, 129, -246, -134, -19, -111, -186, -7, -75, -57, -139, -233, -45, -231, -74, -233, -237, -76, -236, -1, +244, 243, -209, -105, +235, +30, 4, -126, +52, +1, +41, +110, +161, 156, -240, -133, -249, -240, -180, -102, -63, -127, -94, -68, -5, -107, -178, -82, -197, -254, -42, -18, -182, -206, -157, -130, -88, -93, -121, -152, -164, -205, -34, -179, -186, -113, -251, 17, -46, -241, -11, -70, -205, -250, -172, -11, -22, -47, -182, -4, -180, -193, -140, -12, -155, -210, -29, -127, -232, -219, -21, -185, -225, -160, -114, -171, -125, -146, -135, -242, -138, -111, -238, -174, -201, -90, -20, -203, -170, -102, -150, -111, 5, -242, -13, -65, -250, -255, -172, -21, -75, -50, -188, -57, -110, -0, -100, -251, -41, -69, -133, -105, -236, -53, -50, -74, -134, +196, +169, +224, +113, +42, +168, +124, +213, +215, +132, +158, +165, +101, +195, 16, -148, -100, +138, +185, +27, +83, +122, +46, +198, +140, +90, +120, +211, 179, -217, -92, +175, +227, +143, +68, +123, +87, +185, +5, +91, 84, -70, -160, -237, -121, -217, -209, +71, 204, -243, -199, -98, -229, -189, -47, -140, -1, +126, +37, +52, 56, -235, -207, -137, -251, -228, -240, -65, -22, -151, -145, +91, +146, +188, +113, +179, +243, +57, +41, +7, +147, 165, -72, -117, -13, -149, +87, +54, +21, 71, -159, +122, +104, +176, +234, +233, +10, +94, +171, +3, +101, +195, +187, +248, +229, +112, +87, +147, +184, 89, -141, -117, -205, +74, +22, +244, +18, +94, 226, -84, -152, -214, -195, -110, -93, -53, -156, +73, +1, +196, +59, +240, +87, +19, +65, 95, +48, +40, +206, +243, +102, +125, +138, +44, 203, -174, -198, -202, -175, -116, -178, -238, -174, -20, -15, -83, -197, -123, -208, -163, -221, -199, -147, +157, +88, +122, 246, -240, -70, -134, +214, +138, +54, +137, +194, +176, +212, +223, +91, +142, +76, +205, +71, +184, +81, +232, +47, +231, +129, +59, +247, +2, +247, +201, +27, +39, +51, +51, +17, +55, +143, +99, +23, +127, 248, -240, -104, 96, -137, -101, -136, -207, -126, -182, -217, -158, -138, +243, +149, +51, +135, +147, +110, +67, +200, 230, -108, -32, -116, -252, +16, +178, +242, +40, +57, +205, +48, +146, +28, 178, +19, +6, +173, +69, +134, +154, +156, 153, +121, +99, +94, +148, +115, +45, +112, +172, +209, +53, +224, +207, +137, +27, +115, +95, +108, +234, +114, +55, +114, +5, +69, +146, +119, +91, +172, +79, +208, +40, +2, +25, +236, 154, -157, -98, -177, -48, -218, -131, -103, -159, -150, -161, -225, +217, 151, -248, +118, +52, +73, +30, +20, +41, +172, +135, +139, +45, +200, +55, +30, +31, +202, +208, +180, 67, +198, +57, +16, +97, +142, +36, +10, +36, 211, +143, +26, +49, +23, +108, +30, +46, +247, +81, +138, +91, +130, +115, 72, -97, -112, -189, -29, +129, +225, +99, +239, +56, +182, +17, +1, +114, +20, +155, +104, 180, -154, -33, -245, +140, +147, 112, -250, -90, -169, -221, -56, -102, -205, -68, 238, -101, -96, -233, -157, -124, -5, -74, -29, -201, -86, -133, -204, -32, -21, +46, +194, 197, -107, -91, -108, -212, -58, -26, -15, -11, -165, -183, -67, -241, -135, -143, -182, -217, -43, -227, -19, +114, +225, 70, -20, -157, -123, -170, -158, -213, -12, -147, -35, 120, -98, -217, -33, +173, +172, +153, +241, +89, 19, -174, -55, -222, -221, -139, -175, -78, -252, -38, -166, -216, -238, -87, -206, -109, -227, -132, -111, -180, -226, -236, +32, +48, +247, +92, +97, +163, +177, +102, +160, +41, 79, -188, -197, -30, -30, -5, -213, -66, -246, -95, -106, -213, -74, -39, -252, -88, -75, -137, -141, -161, -251, -82, -109, -230, 10, -211, -13, 67, -33, -87, -243, -74, -51, -150, -38, -57, -110, -196, -0, -65, -47, +171, +79, 71, -247, -182, -123, -213, -118, -251, -131, -94, -231, -238, -179, -81, -220, -81, -54, +125, +151, +154, +5, +138, +127, +25, +127, +50, +43, +242, +93, +243, +245, +121, +121, +16, +67, +188, +228, +104, +25, +197, +97, +228, +122, +49, +69, +122, +229, +46, +203, +205, +152, +84, +137, +151, 248, +124, +115, 242, -75, -251, 242, -111, -70, +119, +60, +245, +161, +197, +115, +156, +1, +222, +219, 193, -71, -217, +59, +88, 216, -94, -235, -238, -115, -251, -165, -248, -163, -23, -198, +214, +58, +201, 118, +83, +106, +83, +94, +204, +228, +77, 46, -187, -119, -233, -208, -79, -102, -32, -63, -244, -7, -221, -219, -116, -240, -111, -149, -226, -158, -30, -130, -120, -6, -5, -57, -110, -25, -148, -13, -103, -126, -62, -254, -41, -251, +99, 221, -207, -194, -205, -107, -177, -25, -205, -116, -184, -171, -169, +229, +81, +196, +202, +154, +203, +65, +147, +28, +117, 77, +150, +145, +184, +11, +107, 151, -226, -140, -96, -254, -98, -166, -241, -52, -177, -31, -119, -240, -50, -198, -50, -133, 4, -210, +123, +161, +172, 65, -163, -237, -129, -52, -104, -235, -186, -12, -75, -56, -28, -21, -129, -10, -128, -29, -168, -140, -171, -97, -226, -248, -239, -23, -225, 243, -37, +193, 117, -132, -45, -22, -152, -40, -254, -94, -83, -79, -252, -206, +164, +234, +32, +147, +0, 35, -236, -92, -224, -12, -195, -103, -213, -104, -22, -203, -252, -107, -41, -144, -146, -209, -78, -159, -115, -231, -91, -30, -158, -239, -47, -151, -13, -170, -71, -15, -180, -153, -168, -62, -72, -158, 28, -249, -95, -27, -83, -3, -7, -59, -40, -24, -230, -196, -200, -15, -150, 180, -200, -128, +151, +41, +139, 177, +155, +11, +205, +227, +101, +230, +162, +129, +2, +172, +84, +51, +189, +162, +56, +167, +143, +215, +153, +93, +219, +128, +230, +40, +163, 73, -138, -62, -166, -77, -92, -176, -130, -92, -228, -126, -105, -74, +225, +124, +147, 6, -168, -220, -39, -126, -5, -37, +192, +46, +139, +40, 138, -190, -165, -211, -124, -63, -119, -158, -102, -222, -104, -230, -76, -67, -104, -88, -12, -117, -69, -176, -243, 194, -217, -220, -11, -222, -98, -233, -90, -111, -58, -131, +39, +119, +228, +123, +163, 31, -217, -243, -219, -6, -202, -141, -212, -35, -8, -95, -176, +150, +129, +67, +1, +128, +44, +124, +182, 136, -37, -97, -145, -32, -217, -47, -107, -17, -68, -77, -243, -221, +155, +99, 88, -66, -74, -166, -145, -37, -124, -211, -234, -195, -244, -23, -46, -75, -253, -198, -206, -44, -140, -188, -63, -97, -75, -249, -254, +93, +128, 10, -122, +84, +170, +59, +217, +154, +52, +214, +225, 36, -135, -203, -233, -204, -57, +150, 27, -66, -167, -139, -4, +110, +108, +58, 186, -50, -253, -128, -210, -138, -180, -196, -255, -120, -107, -83, -204, -160, -1, -97, -145, +53, +184, +197, +0, +215, +227, +221, +44, +205, 164, -242, -55, -166, -244, -140, -113, -156, -49, -253, -228, -48, -218, -91, +211, +239, +14, +170, +221, +40, +175, +214, +111, +223, 180, -246, -119, -217, -3, -43, -12, -184, -182, -96, -90, -162, -206, -194, -247, -146, -173, -26, -122, -253, 47, -198, -212, -130, -241, -53, -180, -244, -250, -120, -73, +7, +110, 191, -2, +115, +247, +249, +166, +109, 84, -138, +162, +94, 142, -107, -52, +236, +229, +42, +219, +235, 84, -212, -179, -72, -55, -153, -196, -101, +167, +151, +195, +110, +31, +110, +6, +157, +186, +197, +233, +83, +239, 94, -243, -155, -70, -210, -182, -129, -130, +229, +199, +19, +11, +79, +28, +40, +200, +122, +55, +197, +186, +22, +195, +62, +242, +13, +114, +232, +216, +113, 90, -31, -175, -160, -240, -246, -172, -249, -82, -71, -44, -152, +217, +183, +19, +144, +43, +51, +78, 250, -112, -157, -218, -238, -77, -55, -142, -200, -130, -137, -182, +222, +54, +79, +210, +133, +236, 38, -176, -53, -231, -10, +57, +164, +203, +88, +42, +91, +185, +31, +174, +64, +146, +216, +30, +12, +107, +92, +197, +186, 93, -14, -189, -145, -11, 77, -16, -163, -69, +203, +156, +176, +61, +29, +203, +38, +236, +251, +225, 72, -181, -136, -12, +213, +2, +120, +166, +14, +135, +145, +190, 243, -231, +176, 74, -129, -31, -106, -193, -94, -234, -21, -88, -68, -194, -96, -174, -52, +97, +187, +253, +177, 69, -234, -207, -91, -132, -113, -226, +187, +164, +89, +93, +238, +84, +46, +107, 86, -3, -35, -13, -226, -74, -227, -77, +129, +53, +214, +11, +145, +237, +145, +63, +115, +246, 172, -4, -245, -141, -61, -16, -249, -17, -119, -99, -97, -90, -70, -208, -231, -241, -116, -68, -39, -133, -253, +251, +2, +87, +151, +69, +114, +25, +187, +71, +255, +58, +82, +167, +124, +254, +71, +44, 208, -48, -231, +9, +124, +170, 203, -184, -43, -160, +23, +180, +103, +173, +166, +122, +76, +51, +100, +234, +21, +73, +56, +6, +134, 64, -29, -169, -34, -194, +123, 195, +137, 55, -166, -133, +221, +131, +165, +156, +197, +244, +150, +115, +165, +244, +118, +38, +246, +128, +249, 232, -198, -101, -213, +52, +2, +63, +78, +248, +194, 124, -140, -81, +120, +90, +179, +159, +63, +47, +162, 130, -166, -146, -245, +53, +89, +169, +98, +127, +21, +9, +91, +231, +78, +65, +172, +174, +60, +76, +210, +102, 145, -10, -19, -103, -17, -133, -227, -229, -40, -161, -46, -149, -213, -49, -155, +89, +221, +184, +253, 8, -35, -32, -50, -222, -227, -155, -192, -97, -27, -85, -108, -160, -25, -81, -211, -22, -113, -120, -44, -160, -217, -152, -48, -88, -158, -177, -172, -220, -170, -18, -104, -147, +151, +248, +5, +163, +102, +125, +214, +5, +139, +23, +91, +2, 218, -176, -25, -58, -8, -88, -188, -200, +96, +70, +134, +77, +233, +142, 63, -47, -107, -113, -187, -198, -146, -62, -15, -166, +244, +237, +138, +220, +112, +80, 185, -56, -241, -74, +213, +62, +201, +67, +121, +197, +55, +119, +215, +100, +45, +138, +101, +85, +51, 203, -229, -69, -131, -230, -83, -21, -66, -73, -46, -140, -91, -22, -224, +183, +2, +249, +134, +32, +253, +127, +214, +138, +37, +25, +222, 28, -74, -5, -237, -143, -20, -194, -152, -96, -209, -81, -158, -61, -21, +55, +0, +178, +253, 148, -126, -158, -41, -17, -143, -151, -126, 162, -152, -66, -120, -58, +194, +52, +246, +26, 25, -158, -96, -215, -15, -121, +37, +67, +8, +74, +178, +217, +108, +46, +42, +35, +208, +246, +188, +236, +104, +230, +249, +99, +177, 242, +222, +23, +198, +0, +156, +245, +231, 196, -177, -241, -155, -151, -86, -59, +125, +114, +248, +32, +139, +203, +200, +82, +164, +186, +134, +202, +163, +207, +172, +198, +186, +102, +113, +42, +76, +235, +97, +183, +174, +26, +206, +175, +101, +87, +99, +229, +87, +58, +89, +119, +87, +138, 135, -93, +169, +226, +61, +232, +209, +238, +227, +73, +123, +120, 35, -32, -199, -182, +67, +124, +120, +52, +176, 196, -84, -190, -197, -121, -227, -25, -239, -240, -93, -253, -23, -140, -182, -57, -225, +50, 196, -156, +103, +63, +219, 108, -82, -5, -172, -208, -175, +79, +69, +115, +54, +16, +58, +126, +217, +76, +205, +78, +177, +88, +24, +237, +193, +179, +79, 203, -0, -46, -21, -40, -60, -166, -64, +208, +240, +75, +252, +161, +105, +164, +48, +184, +222, +14, +90, +205, +144, +122, +56, +125, +173, +212, +110, +28, +179, +102, +34, +247, +50, +176, +244, +78, 190, -216, -172, +2, +165, +142, +100, +171, +66, +102, +144, +138, +226, +181, +45, +54, +106, +29, +141, +135, +133, +210, +219, 161, -10, +248, 195, -173, +71, +219, +236, +149, +241, +9, +35, +138, +206, +61, +85, +207, +106, +134, +201, +17, +60, +177, +236, +144, +9, +215, +27, +239, +238, +197, +87, +39, +126, +19, +83, +108, +247, +43, +231, +182, +113, +194, 55, 90, -8, -216, +113, +246, +39, +222, 98, -209, -36, -192, -195, -149, -237, -243, -57, -129, -80, -238, -178, -128, -68, -59, -10, -53, +15, +143, +130, +106, +33, +251, +47, 181, +106, +165, +19, +126, +172, +165, +196, +198, 208, -119, -22, -218, -55, -143, -139, -207, -10, -236, +125, +169, +54, +115, +133, +233, +134, +161, +144, +171, +121, +165, +25, +75, +147, +28, 55, -203, -104, -189, -138, -226, -155, -0, -151, +98, +128, +160, 151, -18, -223, -4, -176, -252, +163, +123, 219, -66, -62, -143, -198, +189, +106, +187, +253, +65, +175, +115, 247, -51, -14, -119, -172, -151, -6, -212, -169, -81, -46, -249, -183, -225, -18, -211, -188, -102, -53, +217, +40, +238, +40, +27, 124, -153, -194, -142, -55, -77, -237, +249, +165, +125, +249, 55, -203, +163, +224, +163, +108, +108, +175, +117, +247, +185, +253, +82, +252, +209, +11, +99, +59, +151, +221, +187, +116, +232, +39, +51, +144, +31, +250, +131, +238, +109, +58, +248, +183, +74, +113, +79, 15, -166, -139, -101, +65, 60, -115, -41, -178, -124, -103, -97, -29, -181, -73, -236, -110, -127, -113, -8, -9, -125, -189, -27, +131, +130, 28, -251, -47, -201, -205, -192, -80, -170, -15, -246, -68, -207, -2, -53, -45, -87, -240, -42, +183, +12, +202, +134, +51, +63, +31, +255, +148, +253, 238, -67, -147, -70, -11, -133, -34, +103, +225, +230, +181, 216, -13, -41, -197, -74, -74, -228, -83, -117, -55, -13, -78, +140, +102, +58, +220, +213, +212, 166, -92, -200, -11, -30, -81, 75, -24, -232, -233, +113, +70, 48, -114, -62, -93, -41, -3, -100, -206, -192, -238, -21, 127, -150, -149, -174, -181, -93, -93, -212, -92, -77, -58, -2, -165, -141, -54, -130, -46, -110, -184, -46, +49, +211, +120, +154, +216, 143, +59, +120, +25, +99, +153, +66, +2, +233, +160, +209, +246, +64, +26, +180, +117, +93, +134, +37, +28, +142, +138, +64, +5, +192, +14, +84, +198, 213, -239, -132, -97, -35, -44, -183, -115, -52, -203, -168, -159, -27, -135, -182, -220, -143, -98, -69, -240, -224, -3, -70, -94, -224, -204, -184, -47, -96, -112, -38, -203, -0, -175, -65, -49, -24, -70, -18, -102, -9, -178, -128, -183, -4, -92, -109, +48, +113, +252, +247, +139, +240, +249, +146, +58, +194, +22, +11, +76, +20, +127, 175, -210, -48, +169, +39, 126, -73, +231, 17, -126, +118, +46, +112, +134, +225, +179, 106, -88, -250, -70, -81, -24, -155, -47, -168, -107, +52, 139, -107, -54, -1, -145, -69, +101, +254, +181, +20, +72, +201, +104, +167, +207, +185, +243, +45, +15, +207, +247, +151, +203, +6, +213, +163, +7, 218, -145, -57, -0, +76, +84, +31, +36, 79, -241, -2, -60, -52, -53, -56, -141, +142, 252, -92, -54, -240, -51, -241, -115, -153, -182, -11, -218, -230, -231, -50, -109, -23, -84, -225, -202, +175, +141, +169, +129, +131, +29, +20, +12, 115, -47, -197, -156, -57, -72, -221, -146, -27, -14, -109, -87, -113, -137, -56, +98, +228, +7, +75, +90, +100, +192, +216, +36, +69, 31, -158, -143, -206, -199, -206, -217, -16, -246, -222, -104, -25, +211, +38, +46, +88, 65, -182, -204, -219, -115, -234, -239, -196, -157, -169, -247, -40, -62, -150, -215, -158, +46, +114, +191, +52, +37, +3, +84, +238, +19, +191, +130, +18, +69, +223, +210, +105, +190, +159, +59, +79, 51, 111, -119, -25, -254, -189, +52, +115, +166, +33, +52, +44, +134, +186, +34, +216, 121, -210, -106, -203, -175, -132, -40, -243, -77, +225, +108, +238, +5, +111, +177, +116, +173, +55, 157, -165, -255, -154, -123, 193, -82, -94, -228, -89, -156, -200, -47, -29, -168, -178, -139, -207, -17, -198, -98, -222, -188, -79, -174, -54, -246, -121, 143, -156, -57, -62, -141, -57, -226, +236, +249, +109, +3, +229, +70, 234, -227, -177, -238, +17, 132, -51, +47, +88, +196, +146, +176, +72, +144, +236, +151, +181, +8, +162, +166, +249, +110, +44, +33, +37, +211, +200, +18, +190, +105, +245, +97, +250, +11, +151, +165, +126, +99, +103, +22, 70, +222, +159, +176, +165, +124, +127, +5, +61, +146, +195, +229, +116, 230, -197, +156, +13, +161, +211, +69, +2, +93, +153, +126, +64, +105, +69, +90, +226, +127, +188, +181, +41, +102, +208, +128, +176, +72, +82, +249, +27, +83, +122, 198, -149, +56, +206, +152, +126, +114, +24, +237, +45, +90, +251, +187, +236, +129, +21, 6, -170, -60, -239, -106, -88, -107, +92, 91, -41, -29, -64, -228, +48, +45, +81, +103, +225, +123, +201, 86, -240, -232, -147, -88, -44, -238, -176, -88, -181, -21, -61, -115, -62, +13, +189, +254, +23, +99, +106, +193, +248, +26, +90, +122, +125, 188, -255, -213, +164, +95, +1, +42, +69, +199, +53, +26, +42, +234, +89, +164, +155, +76, +226, +50, +175, 249, -197, -121, -124, -255, +77, +35, +105, +219, +64, +65, +173, +143, +87, +80, +120, +123, +214, 124, -158, -254, +169, +35, +22, +76, +125, +184, +78, +109, +247, +166, +27, +71, +100, +193, +68, +91, +19, +216, +154, 115, -149, -253, -243, -79, -231, -173, -33, -94, -205, +133, +46, +135, +222, +200, +133, +38, +136, +209, +34, +164, +90, +68, +134, 249, -180, -142, -210, +115, 165, +192, +15, 181, -3, -180, -115, -148, -134, -112, -153, -228, -246, +96, +47, +245, +10, +44, +34, +97, +48, +87, +154, +34, +245, +231, +45, +194, +56, +113, +171, +129, +145, +6, +113, +165, +241, +38, +86, +130, +250, +198, +30, +136, +252, +136, +187, +177, +48, +45, +35, +232, +243, +120, 58, -238, -96, -7, -242, -191, -141, -1, -55, -114, -138, -237, -245, +162, +147, +194, +126, +104, +152, +243, +101, +220, +21, +80, 160, -170, -112, +142, +84, +17, +225, +225, +27, +211, 66, -220, -32, -54, -254, -42, -119, -52, -240, -56, -71, -59, -234, -65, -75, -170, -31, -172, -177, -179, -97, -249, -129, -96, -72, -72, +116, +227, +178, +106, +62, +198, 40, -95, 65, +83, +201, +250, +72, +133, +137, +179, +136, +194, +241, +114, +148, +80, +151, +202, +234, +152, 77, -244, -246, -99, -178, -67, -21, -254, -125, -174, -167, -231, -230, -51, +132, +17, +16, +25, +239, +241, +77, +224, +176, +141, +42, +54, 208, -39, -112, 140, -135, -139, -149, -18, -238, -157, -30, -63, -122, -4, -94, -211, -49, -143, 168, -66, -232, -139, -51, -83, -150, 105, +139, 56, -5, -205, -4, -254, -4, -250, -183, -238, -118, -43, -26, -238, -241, -10, -222, -177, -173, -252, -87, -202, -77, -66, -8, -220, -167, -142, -100, -79, -92, +60, +22, +208, +108, +76, 24, -42, -176, -173, -197, -47, -177, -50, -233, -194, -55, +44, +207, +88, +86, 110, -244, -148, -94, -17, -15, -236, -39, +85, +9, +180, +73, +109, +216, +12, +29, +4, 44, +94, +228, +159, +151, 181, -168, -255, -124, -77, -62, -198, -77, -100, -116, -220, -133, -27, -193, -204, -173, -63, -58, -125, -247, -15, -163, -144, -109, -28, -242, -119, -163, -72, -109, -28, +184, +93, +99, +73, +159, +7, +211, +92, +156, +120, +165, +229, 242, -95, -53, +162, +65, +243, +169, +10, +161, +36, +23, +198, +45, 11, -68, -74, -249, -58, -13, -63, -166, -217, -6, -63, -54, -63, -230, -167, +112, +14, +165, +130, +246, +71, +10, +97, +76, +176, +232, +40, +207, +158, +10, 74, -118, -245, -79, 63, -102, -153, -31, -211, -58, -61, -247, -239, +207, +148, +136, 199, -252, -116, -162, -126, +75, +63, +81, 76, -111, -204, -195, -123, -159, -173, -138, 33, -122, -7, -110, -195, -133, -213, -30, -18, -161, -201, -53, -58, -240, -170, -239, -210, -108, -38, -248, -169, -105, +60, +157, +12, +79, +176, +235, +135, +60, 121, -154, -230, -0, -210, -78, +226, +216, +248, +205, +75, 171, -202, -1, -210, +157, +195, +174, +17, 144, -168, -45, -252, -156, -136, -213, -217, -30, -13, -229, -85, -121, -177, -11, -32, -65, +99, +91, +98, +42, +223, +226, +188, +241, +140, +119, +248, +174, 254, -216, -97, -179, -43, -22, -108, -169, -85, -132, -72, -125, -103, -55, -169, -66, -173, -114, -80, -146, -60, -66, -146, -158, -78, -11, -12, -249, -157, -197, 11, -192, -52, -7, +70, +219, +156, +112, +98, 78, -189, -178, -126, -141, -208, -196, -29, -15, -119, -147, +54, +169, +2, +86, +232, +215, 101, -60, -220, -19, -73, -16, -154, -131, -81, -37, +0, +151, +10, +20, +30, 83, +32, +95, 108, -46, -252, -226, -160, -173, -66, -177, -228, -81, -168, -221, -103, -201, -146, -140, -176, -165, +214, 80, -142, -190, -126, -134, -150, -93, -109, -50, -99, -113, -14, +133, +225, +214, +27, +45, +4, +108, +177, +104, +18, +224, +225, +202, +246, +249, +156, +64, +40, +119, +89, +64, 162, -131, -42, -20, -221, -118, +29, 133, -123, -72, -92, +154, +90, +232, +59, +11, +237, +155, +199, +197, +103, +5, +246, +155, +101, +180, +94, +69, +241, +77, +128, +203, +75, +137, +111, +2, +88, +254, +109, +33, +159, +71, +227, +251, +25, +135, +59, +214, +75, 3, -170, +234, +212, 40, +151, +252, +219, 112, -78, +137, +105, +94, +179, +26, +190, +76, +97, +199, +155, +166, +246, +155, +229, +7, +211, +197, +50, +158, +185, +20, +89, +190, +179, +176, +142, +218, 36, -93, +118, +183, +191, +56, +132, +132, +190, +222, 13, -236, -44, -105, -19, -228, -236, -172, -214, -114, -236, -201, -95, -247, -120, -204, -230, -11, -148, -167, -195, -24, -93, -184, +142, 253, -120, -48, -134, -132, -192, -73, -36, -126, +151, +228, +102, +96, +40, 213, -72, -253, -134, -58, -214, -78, -184, -32, -64, -182, -91, -242, -157, -57, -52, -240, -110, +7, +123, +162, +103, +129, +154, +150, +43, 120, +21, +247, +161, 73, -206, -127, -168, -53, -245, -208, -110, -4, -138, +163, +133, +66, +17, +236, 134, -36, -107, -48, -227, -97, -196, -242, +148, +98, +37, +37, 242, -85, -16, -187, -61, -137, -85, -61, -100, -248, -211, -34, -140, -146, -60, -14, -119, -33, -180, -103, -208, -4, -254, -18, -251, -238, -66, -52, -103, -188, -28, -190, -123, -20, -211, -129, -91, -158, -220, -122, -226, -59, -206, -3, -221, +169, +186, +155, +6, +39, +83, +46, +228, +5, +143, +168, +37, +12, +244, +116, 24, +57, +159, +174, +148, +1, +50, +103, +96, +247, 138, -150, -163, -128, -113, +63, +203, +74, +215, +218, +174, +46, +106, +174, +38, +29, +129, +210, 70, -233, -164, -99, -111, -50, -225, +27, +65, +23, +55, +92, +151, +199, +234, +119, +194, +176, +17, +150, +219, +57, +154, +101, +212, +207, +141, +67, +91, +238, +71, +177, +34, +120, 240, -166, -235, -108, -155, -250, +1, +35, +47, +112, +102, 220, -129, -0, +23, +48, +56, +147, +101, +128, 215, -252, -202, -177, 160, +24, +12, +35, +9, +179, +4, +89, +192, +91, +2, +174, +182, +87, +105, +24, 191, -195, -130, -80, -124, -19, -225, -16, -152, -239, -189, -115, -41, -203, -25, -66, -142, -14, -160, +164, +8, +63, +53, +44, +125, +163, +40, +140, +205, 23, -59, -79, -158, -239, -195, -43, +212, +181, +197, +53, +155, +128, +200, 34, -232, -121, -39, -12, +237, +200, 28, -47, -161, -152, -12, -85, +128, +167, +120, +1, +30, +154, +26, +156, +70, +126, +46, +27, +248, +153, 248, -208, 185, -20, -244, -137, -24, -132, -134, -4, -217, -0, -241, -135, -49, -143, -240, +76, +219, +5, +109, +243, 115, -39, -9, -195, -247, -223, -134, -209, -247, -191, -252, -75, -23, -81, -160, -236, -56, -150, -174, -138, -125, -209, -103, -236, -145, -139, -143, -255, -26, -59, -225, -19, -174, -46, -0, -22, -83, -62, -133, -145, -63, -62, -119, +153, +182, +11, +170, +112, +229, +185, +151, 98, +206, +28, +164, +110, +201, +13, +135, +182, +171, +184, 68, -102, +156, +15, +207, +71, +231, +99, +231, +108, +8, +123, +111, +180, +140, +32, +91, +230, +237, +57, +245, +119, +226, +206, +212, +123, +20, +31, +203, +107, +207, +153, +183, +187, +12, +255, +222, +60, +105, +181, 229, -140, -195, -224, -175, -137, -19, -207, -224, -145, +87, +66, +148, +249, +166, +206, +210, +127, +205, +189, +96, +41, +47, +242, +44, +78, +228, +151, +14, +84, +217, +197, 231, -9, -58, -175, -211, +8, +99, +49, 111, +222, +39, +87, +27, +251, +188, +71, +206, +28, +159, +198, +28, +113, +245, +241, +88, +119, +194, +25, 35, -246, -68, -143, -130, -69, -116, +243, 98, -185, -108, -103, -146, -95, -205, +227, +74, 3, +85, +158, +119, +53, +172, +181, +173, +148, +14, +32, 114, -33, +43, +120, 244, -224, -108, -101, -206, -55, -121, -165, +73, +44, +22, +119, +88, +172, +218, +138, +158, +57, +31, +222, +255, +234, 252, -126, -14, -192, -34, -244, -112, -174, -205, -25, -230, -100, +226, +60, +190, +127, +62, +79, +255, +185, +202, +254, 249, -43, -39, -97, -63, -184, -179, -92, +167, +243, +214, 16, -116, -232, -106, -135, -30, -122, -72, -4, -97, -20, -120, -128, +175, +230, +124, +90, +71, +233, 210, +218, +1, +218, +57, +74, +67, +184, +76, +114, +123, +29, +119, +176, +3, +249, +223, +198, +128, +27, 57, -173, -252, -228, 197, +246, +122, +80, +85, +56, +33, +110, +16, +27, +127, +149, +59, +26, +120, 156, -64, -154, -47, -227, -68, +163, +29, 245, +160, +37, +213, +15, +214, +216, +217, +176, +252, +64, +48, +36, +36, +148, +175, +160, +38, 122, -159, -179, -96, -9, -19, -73, -104, -20, -243, -168, -31, -60, +251, +49, +217, +161, +10, +255, +62, +215, +211, +115, 243, -5, -110, -163, -89, -24, +25, +232, +19, +56, 198, -244, -68, -43, +195, +197, +74, +9, +247, +78, +143, +31, +61, +2, +175, +233, 152, +71, +84, +33, +244, +197, +153, +41, +203, +52, +156, +130, +102, 2, -154, -215, -241, -189, -56, -225, -129, +127, +2, +253, +91, +119, +187, +21, +13, +247, +120, +5, +239, 216, -226, -25, -242, +86, +254, +43, +229, +38, +33, +4, +238, 83, -248, -25, -210, -13, -213, -170, -204, -151, -31, -143, -185, -84, -143, -192, -32, -150, -81, -111, -68, -172, -73, -145, -245, -18, -9, -67, -75, -172, -122, -158, -209, -73, -117, -166, -23, +71, +178, +39, +46, +12, +21, +216, +214, 226, -238, -77, -3, -114, -55, -103, -2, -69, -34, -20, -11, -161, -33, -137, -242, -146, -37, -197, -24, -60, -137, -121, -185, +151, 88, -252, -209, +153, +116, +225, 27, -9, -190, -35, +55, +122, +74, +175, +136, 7, -149, -75, +246, +19, +150, 90, -13, -146, -235, -93, -123, -2, -216, -213, -250, -138, -136, -251, -144, +212, +127, +190, +38, +31, 227, -64, -22, -75, -153, -17, -228, -142, -132, +38, +50, +58, +238, 194, -23, -120, -123, -129, -12, -66, -26, -49, -69, -86, -228, -142, -16, -90, -0, -86, -150, -159, -116, -150, -129, -207, -99, -122, -7, -17, -240, -135, -35, -15, -94, -49, -28, -89, -121, -32, -159, -174, -9, -98, -98, -20, -248, -131, -245, -178, -181, -170, -223, -69, -185, -202, -184, -6, -133, -251, -251, -156, -158, -45, -83, -217, -132, -121, -222, -59, -157, -73, -241, -183, -16, -176, -145, -201, -235, -136, -196, -53, -147, +141, +96, +230, 214, -37, +31, +157, +190, +251, +135, +81, +200, +54, +14, +249, +187, 81, -39, -125, +164, +54, +14, +249, +175, +154, 5, -130, -127, -83, -53, -84, +34, +165, +124, +157, +134, +31, 211, -135, -129, +108, +131, +31, +155, +31, +243, +83, +37, +187, +250, +167, +31, +179, +204, +143, 105, -138, -112, -195, -221, -42, +157, +158, +251, +247, +99, +126, +58, +81, +63, +166, +55, +230, +225, +189, +207, +86, +197, +16, +189, +3, +183, +225, +194, +106, +15, +137, +208, +228, +26, +29, +120, +213, +119, +105, +54, +19, +252, +212, +180, +60, +77, 115, +0, +105, +167, +85, +229, +0, +105, +72, +212, +22, +126, +78, +196, +234, +108, 143, -184, +134, +242, +170, +188, +216, +5, +144, +32, +127, +236, +176, +217, +21, +11, 182, -112, -205, -111, -65, -111, -34, -19, -1, -70, -56, +212, +42, +66, +164, +190, +179, +155, +84, +161, +86, +57, +40, +73, +30, 33, -159, -47, -18, -204, -199, -205, -173, -147, +73, +79, +167, +5, +134, +252, 206, -38, -118, -38, -201, -142, -15, -143, -43, -99, -39, +226, +5, +96, +154, +3, +167, 94, -176, -145, -241, -139, -202, -68, +89, +191, +70, +104, +226, +142, +135, +187, +201, +50, +30, +238, +137, +36, 8, -132, -139, -186, -202, -253, +205, +193, 168, -109, -249, -125, -133, -239, -63, -94, -89, -48, -136, -17, 146, -221, +41, +54, +23, +126, +113, +208, +86, +161, +88, +242, +40, +212, +238, +179, +100, +73, +70, +216, 82, -43, +40, +71, +95, 63, +67, 203, -65, -99, -229, +174, 54, -41, -151, -49, -32, -74, -195, +153, +177, +56, +7, +209, +65, +21, +138, +110, +187, +194, +61, 36, -201, -184, -115, -72, -40, -176, -156, -31, -11, -30, -197, -13, -33, -137, -88, -16, -67, -240, +174, +1, +85, +20, +56, +39, +146, +174, +6, +118, 150, -198, -19, -28, -125, -70, -96, -221, -50, -113, -187, -125, -254, -100, -167, +180, +9, +114, +118, +86, +107, +57, +246, +228, +175, +123, +60, +102, +243, +5, +202, +211, +97, +140, +46, +220, +126, +60, +24, +67, +66, +224, +36, +18, +191, +106, +164, +126, +67, +29, +107, +39, +92, +16, +32, +219, 45, -200, -38, -108, +249, +206, +28, +26, +120, +55, +188, +36, +231, +63, +212, +154, 122, -180, -90, -7, +104, +55, +2, +69, +67, +146, +53, +152, +241, +48, +98, +121, +249, +42, +136, +221, +158, +196, 170, -65, -114, -77, -253, -112, -200, +30, +50, 252, -163, -166, -90, -41, -136, -7, -37, +105, +17, +70, +73, 30, -64, -54, -129, -51, -247, -168, -32, -146, -39, -182, -245, -35, -6, -49, -7, -99, -67, -216, +135, 187, -190, -58, -6, +16, +218, +51, +104, 2, -135, -88, -37, +127, +137, +125, +119, +33, +154, +51, +94, +14, +223, +61, +138, +233, +192, 45, -19, -113, -180, -132, -145, -48, -153, +79, +110, +61, +241, +29, +231, +129, +110, +12, +69, +203, +81, 192, -124, -54, -213, -246, -88, -108, -9, -232, -74, -39, -15, -62, -216, +56, +163, +116, +210, +177, +55, +153, +112, +120, +211, +117, +182, 77, -35, -113, -37, -181, -232, -131, -248, -27, -231, -11, -52, -121, -103, -143, -96, -35, -165, -199, -94, -118, -162, -205, -196, -113, +125, +238, +64, +128, +107, +126, +229, +88, +208, +223, +97, +65, +40, +190, +137, +112, 8, -38, -78, +204, +247, +222, +185, +148, +229, +12, +33, +71, +7, +208, +139, +157, +39, +207, +247, +225, +21, +17, +244, +188, +19, +6, +142, +151, 80, -193, -101, -81, +76, 134, -77, -179, -46, +42, +124, +232, +92, +10, +250, +68, 12, -60, -235, -33, +66, +67, +130, +108, +128, +248, +195, +152, +71, +248, +185, +147, +132, 225, -174, -196, -20, +251, +111, +195, +232, +251, 95, -187, +254, +165, +139, +40, +80, +118, +28, +75, +87, +197, +190, +232, +51, +246, +200, +197, +199, +127, 141, -156, -59, -63, +157, +240, +9, +87, +23, 0, -105, +139, +41, +159, +194, +200, +31, +159, +59, +49, +34, +179, +114, +198, +97, +240, +215, 196, -53, -18, -70, -102, -184, -140, -125, -50, -246, -133, -177, -154, -2, -169, -236, -192, -42, -76, -132, -199, -56, -55, -20, +137, +103, +240, +200, +243, 4, -141, -60, 157, -190, -129, -186, -188, -43, -125, -99, -164, -199, -191, -98, +215, +233, +183, +17, +123, 162, -68, -214, -86, -68, -254, +71, +193, +34, +58, +177, +92, +182, +51, +201, +175, 230, -236, -221, -135, -243, -119, -31, -222, -26, -134, -76, -204, -197, -95, +1, +185, +16, +122, +112, +182, +50, +231, +155, +188, +82, +126, +63, +7, +96, +17, +122, +56, +215, +230, +12, +115, 178, -102, -43, -229, +252, +149, 147, -255, -122, -254, -107, -201, -212, -117, -125, -181, -69, -90, -238, +176, +31, +220, +89, +46, +8, +58, +116, 181, -49, -240, -150, -154, -223, +67, +15, +61, +36, +130, +48, +10, +60, +64, +233, +156, +86, +126, +242, +98, +78, +32, +205, +151, +113, +162, +122, +189, +207, +89, +176, +132, +137, +36, +52, +138, 121, -104, -220, 212, -31, +15, +158, +249, +2, +183, +209, +44, +12, +99, 122, -80, -55, -101, -17, -38, +162, +21, +76, +1, +205, +235, +248, +94, +156, 240, -109, -39, -35, -141, -158, +64, +108, +241, +12, +249, +41, +252, +12, +233, +134, +106, 85, -123, +230, +203, +143, +199, +92, 170, -68, -189, -21, -186, -35, -160, -220, -63, -150, -124, -201, -93, -82, -218, -226, -152, -93, -36, -249, -18, -119, -117, -101, -118, -109, +71, +96, +16, +203, +168, +55, +34, 214, +164, +200, +122, +137, +132, +161, +37, +86, 61, +207, +232, +164, 58, -214, -182, -249, +211, +11, +113, 247, -99, -151, -174, -192, -46, -93, -129, -143, -194, -161, -141, -245, -243, -183, -193, -118, -48, +166, +1, +185, +155, +51, 129, -32, -75, -66, +34, +17, +138, +133, +208, +144, +68, 121, -227, -52, -173, -136, -142, -214, -53, -235, -243, -250, -125, +201, +146, +98, +12, +158, +196, +188, 92, -140, -163, -26, -59, -244, -219, -120, -9, -246, -3, -143, -30, -185, -113, -72, -244, -114, -49, -22, -166, +44, +254, +232, +141, +4, +223, +145, +131, +202, +37, +173, 6, -221, -66, -226, -74, -242, -91, -240, -94, -150, -118, -63, -199, -109, -60, -154, -65, -242, -113, -149, -118, -206, -165, -29, -140, -181, -92, -164, -226, -32, -246, -124, -47, -89, -181, -81, -46, -163, -162, -191, -87, -253, -241, -46, -76, -144, -97, -135, -12, -225, -224, -10, -64, -189, -29, -22, -85, -15, -43, -218, -87, -31, +201, +245, +174, +61, 1, -130, -179, -41, +236, +106, 125, -93, -155, -30, -141, +69, +196, +125, +200, +113, +32, +139, +165, +204, +8, +114, +71, +66, +225, +11, 188, +189, +64, +6, +33, +141, +152, +34, +43, +114, +71, +8, +45, +0, +43, +203, +79, +58, +203, +192, +231, +49, +189, +131, +8, +248, +195, +145, +7, +175, +24, +142, +172, +60, +144, +79, +215, +4, +49, 49, +10, +252, +193, +122, +217, +90, +213, +239, +162, +92, +101, +92, +131, +194, +253, +125, +78, +207, +150, +169, 108, -68, -39, -182, +194, +60, 239, -90, -23, -55, -237, -158, -123, -221, -107, -183, -255, -171, -237, -94, -116, -175, -58, -237, -190, -81, -124, -163, +157, +206, +164, +248, +91, +8, +216, +200, +228, +117, +68, +226, 154, -225, +73, +235, +146, +168, +147, 190, -245, -208, -111, -187, -173, -187, -206, -109, -107, -208, +2, +193, +191, +169, +26, +170, 233, -222, -245, -141, -226, -42, -213, -36, +195, +192, +52, +69, +184, +225, +110, +149, +185, +71, +92, +91, +184, +230, 183, -173, -63, -234, -70, -74, -174, -111, -153, -143, -87, +160, +55, +145, +137, +0, +35, +156, +144, +207, +23, +9, +230, +227, +230, +214, +73, +103, +19, +59, +147, +100, +199, +135, +199, +149, +177, +19, 47, -111, -26, +216, +200, 248, -251, -207, -109, -243, -115, -219, +69, +101, +34, +4, +194, +69, +93, +229, +126, +212, +182, 252, -220, -54, -235, -135, -73, 190, -138, +194, +247, 31, -75, -14, -92, -138, -153, -177, -161, -70, -36, -79, -254, -213, +175, +44, +24, +196, +8, +201, +110, +169, +149, +159, +229, 160, -213, -186, -184, -176, -114, -47, -35, -80, -244, -228, -58, -15, -68, -115, -119, 177, -48, -144, +114, +155, +148, +203, +24, +16, +165, +97, +146, +100, +220, +57, +36, +20, +88, +206, +143, +5, +143, +226, 134, -246, -193, -66, -34, -74, -173, -37, -14, -137, -81, -10, -58, -115, -107, -105, -235, -108, -244, -232, -246, -102, -7, -239, -229, -87, -18, -227, -154, -37, -184, +144, +68, +44, +136, +33, +120, 75, -1, -122, -246, -146, -230, +227, +9, +142, +62, +35, 176, +110, +153, +184, +221, +62, +127, +178, +211, +22, +100, +19, +54, +61, +90, +173, +3, +213, +32, +185, +166, +126, +56, +100, +254, +81, +83, +173, +20, +196, 131, +18, +15, +32, +155, +192, +153, +123, +84, +16, 201, -14, +19, +219, +250, +17, +131, +152, +131, +177, +33, +236, +93, +95, +29, +3, +129, +67, +172, +146, +150, 137, -92, -51, -182, -105, -254, -36, -45, +56, +90, +194, +72, +152, +76, +96, 62, -229, +155, +106, +123, +44, +182, +4, +116, +165, +147, +7, 31, -246, -108, -181, -250, -208, -120, -12, -111, -128, -63, -149, -198, -11, -74, -35, -189, -208, -238, -224, -127, -118, -241, -61, -49, -197, -113, -104, +236, +166, +145, +184, +146, +90, +244, +65, +252, +141, +243, +5, +154, +188, +179, +71, +176, +145, +210, +99, +47, +59, +209, +102, +226, +56, 4, -107, -42, -15, -33, -130, +19, +39, +168, +224, +178, +40, +195, +166, +89, +23, +6, +158, +245, +144, +112, +87, +98, +138, +175, +221, +70, +206, 157, +31, 128, -50, -233, -143, -204, -212, -24, -178, +52, +226, +26, +9, +35, +51, +92, +198, +62, +25, +251, +194, 88, -195, -117, 77, +129, +84, +118, +96, +21, +38, +194, +99, +156, +27, +10, +130, +70, +158, +78, +223, +64, +93, +222, +149, +190, +49, +210, +227, 95, -109, -56, -67, -154, -204, -207, -113, 49, -87, +81, +34, +107, +43, +34, +127, +115, +246, +238, 195, -157, -179, -88, -35, -123, -137, -190, -178, -151, -47, -52, -93, -131, -103, +249, +187, +15, 111, -145, -130, -245, -98, -204, -64, -206, -250, -232, -95, -202, -75, -153, -220, -3, +13, +67, +38, +230, +226, +47, +89, +179, +149, +242, +201, +127, +61, +255, +181, +100, +234, 186, -66, -70, -19, -96, -165, -101, -22, -172, -146, -25, -196, -5, -101, -143, -36, -90, +190, +218, 34, -248, -210, -20, -206, -96, -221, -23, -166, -210, -144, -91, +45, 247, -29, -124, -152, -225, -1, -213, -121, -134, -98, -61, -219, -6, -63, +218, +24, +120, +75, 205, -66, -140, -16, -226, -129, -248, 239, -42, -78, -248, -220, -193, 60, -243, -216, -81, -1, -99, -42, -224, -76, -134, +52, +110, +234, 15, +61, +168, +155, +178, +8, +19, +248, +182, +147, +145, +70, +207, +170, +61, +85, +162, +222, +10, +221, +17, +80, +238, +31, +75, +190, +228, +46, +41, 109, -93, 113, -20, -66, -80, -106, -194, -253, -149, -19, +204, 46, -216, -63, -150, +146, +124, +137, +187, +186, +50, +187, +54, +235, +30, +29, +107, +219, 252, -92, -150, -100, -16, +251, +177, +75, +87, +96, +151, +174, +192, +71, +225, +208, +198, 250, -20, -54, -186, -3, -65, -98, -66, -150, +249, +219, +96, +59, +152, +64, +144, +37, +161, 188, -8, +113, +154, +86, +68, +71, +235, +154, +245, +121, +253, 62, -241, -224, -99, -16, -45, -10, -93, -130, -178, -163, -66, -30, -70, -20, -202, +46, 198, -2, -25, +81, +141, +29, +250, +109, +188, +4, +251, +129, +71, +143, +220, +56, +36, +122, +185, +24, +11, 83, -196, -70, -35, +131, +110, +33, +113, +37, +249, +45, +120, +47, +75, +187, +159, +227, +54, 30, -199, -124, -108, -20, +205, +32, +249, +184, +74, +59, +231, +210, +14, +198, +90, +46, +82, +113, +16, +123, +190, +151, +172, +218, +40, +151, +81, +209, +223, +171, +254, +120, +23, 38, -36, +200, +176, 67, -141, -92, -10, -198, -219, -30, -18, +134, +112, +112, +5, +160, +222, +14, +139, 170, -233, -128, -52, -169, -47, -88, -88, +135, +21, +237, +171, +143, +0, +193, +217, +148, +190, +174, +77, +143, +70, +222, +24, +54, +162, +19, +219, +119, +173, +139, +155, +118, +207, +189, +238, +181, +219, +255, 213, -5, +118, 47, -165, -235, -161, -103, -218, -4, -128, -242, -228, -237, -104, +186, +87, +157, +118, +223, +40, +190, +81, +205, +112, +223, +122, +232, +183, +221, +214, +93, +231, +182, +53, +232, +116, +239, 250, -235, -155, +70, +113, +149, +106, +146, +219, +214, +31, +117, +35, +37, +215, +183, +204, +199, +171, +151, +55, +13, +252, +253, +231, +182, +249, +185, 109, -14, -111, -205, -11, -188, -248, +126, +110, +155, +245, 195, -135, -252, -6, -207, -94, +36, +95, +197, +143, +37, +7, +46, +197, +204, +216, +80, +35, +146, +39, +255, +106, +208, +106, +93, +92, +88, +185, +151, +17, +40, +122, +114, +157, +7, 162, -254, -189, -241, -205, -174, +185, +187, +88, +24, 72, -1, -74, -104, -226, -179, -105, -188, -91, -255, -228, -209, -43, -213, -135, -218, -200, -217, -66, -104, -154, +67, +251, +96, 33, -100, -167, -85, -157, -22, -25, -26, -66, -68, -214, -90, -60, -125, -68, -84, 17, -200, -211, +165, +214, +18, +135, 196, -4, +40, +5, +157, +185, +181, +180, +117, +54, +122, +116, 123, -88, -69, -85, -148, -85, -249, -97, -142, +179, +131, +247, +242, +43, +137, 113, -208, +205, +18, +220, +165, +0, +61, +123, +73, +115, +216, +193, +100, +135, +68, +174, +25, 219, -246, -250, -175, +52, +127, +146, +22, +159, +242, +15, +123, 182, +90, +125, +104, +60, +134, +55, 192, +159, +74, +227, +5, +165, +145, +94, +104, +119, +240, +63, +187, +248, +158, +152, +226, +56, +52, +130, +53, +149, 135, -173, +16, +193, 78, -203, -238, -204, -194, -196, -1, -213, -247, -250, -58, -114, +64, +153, +244, +71, +102, +106, +12, +89, +172, +225, +186, +166, +175, +54, +156, +33, 77, -35, -52, -151, -157, -195, -246, -124, -124, -164, -203, -226, -203, -180, -164, -145, -109, -90, 230, -245, -166, -13, -217, -78, +231, +184, +152, +171, +225, +206, +89, +172, 145, +189, +68, +95, +217, +203, +23, 154, -230, -144, -170, -245, -66, -120, -176, -109, -90, -224, -15, -180, -153, -209, -136, +174, +193, +179, +183, +72, +193, 122, -107, +49, +102, +32, +103, +125, +244, +47, +229, +165, +76, 238, -80, -123, -169, +1, +93, +33, +163, 9, -100, +176, +210, +50, +11, +86, +201, +12, +226, +130, +178, +71, +18, +45, +17, +124, +105, +10, +103, +176, +238, +11, +83, 105, +200, +173, +251, +14, +62, +204, +240, +128, +234, +60, +67, +177, +158, +109, +131, +159, +102, +33, +70, 8, +241, +64, +252, +119, +21, +39, +124, +238, +96, +158, +121, +236, +168, +128, +49, +21, +112, +38, +195, +135, +182, +174, +56, 10, -203, -245, -111, +33, +40, +53, +225, +254, +202, +9, +23, +236, +31, +75, +126, +46, +75, +50, +8, 125, -100, -205, -247, -13, +10, +27, +221, +129, +32, +49, +33, +75, +94, +4, +159, +120, +240, +49, +136, +22, +133, 46, -112, -87, +65, +217, +81, +33, +15, +35, +10, +101, +99, +129, +140, +41, +98, +163, +17, +143, +99, +62, +54, +10, +19, 146, -164, -148, -185, -7, -38, -82, -83, -156, +161, +70, +46, +5, +227, +109, +15, +9, +213, +116, +64, +154, +212, +23, +44, +172, +234, +130, +151, +210, +245, +208, +51, +109, +2, +64, +121, +242, +118, +52, +253, +245, +205, +54, 135, -211, +183, +230, +5, +94, +252, +225, +67, +126, +131, +103, +47, +81, 255, -40, -172, -25, +222, +248, +102, +87, +164, +0, +37, +52, +241, +217, +52, +222, +173, +127, +242, +232, +149, +234, +67, +109, +228, +108, +33, +52, +205, +16, +178, +211, +170, +78, +139, +12, +13, +33, +34, +107, 45, -174, +158, +62, +34, +170, +8, +228, +105, +98, +130, +61, +172, +162, +42, +202, +170, +252, +48, +199, +56, +232, +109, +123, +253, +87, 91, -121, +224, +195, +86, +167, +101, +119, +102, +97, +226, +128, +234, +123, +125, +29, +185, 166, -41, -176, -157, -232, +17, +154, +203, +206, 97, -233, -149, -230, -184, -141, -194, -130, -92, -136, -187, -84, -48, -214, -60, -1, -79, -4, -173, -233, -26, +123, +62, +62, +210, +101, +241, +101, 90, +210, +200, +54, +45, +243, +122, +211, +134, +108, 167, -105, -94, -21, -184, +72, +77, +115, +72, +213, +122, +33, +60, +216, +54, +45, +240, +7, +218, +204, +104, +68, +189, +53, +119, +168, +189, +212, +4, +178, +52, 4, +133, 229, -228, -148, -221, -187, -63, -46, -89, +250, +183, +62, +178, +230, +251, +6, +23, +184, +43, 73, -11, -47, -176, +82, +202, +220, +3, +19, +169, 41, -143, -87, -189, -148, -232, +206, 195, -241, -137, -199, -179, -125, -155, -92, +233, +127, +20, +214, +140, +22, +215, +173, +60, +211, +20, +216, +78, +244, 176, -36, +244, +74, +115, +220, +70, +97, +65, +46, +196, +93, +42, +24, +107, +158, +128, +39, +130, +214, +116, +13, +173, +211, 52, -101, -143, -151, -209, -132, -141, -142, -99, -231, -106, -233, -245, -23, +175, +10, +92, +130, +114, +114, 202, -193, +238, +221, +31, +151, 172, -143, -255, +164, +133, +23, +216, 148, -27, -255, -169, -194, +199, +171, +94, +74, +244, +225, 248, -223, -114, +196, 227, -127, -43, -156, -43, 217, -173, -226, -221, -7, -59, -226, -32, -249, -66, -151, -139, -180, -161, -239, -169, -48, -73, -123, -237, -173, -44, -90, -35, -241, -132, -249, -113, -137, -203, -167, -41, -42, -79, -11, -84, -62, -160, -149, -126, -184, -163, -111, -157, -28, -216, -145, -212, -245, -245, -31, -189, -172, -156, -126, +190, +77, +46, +88, +18, +154, +178, 199, +203, +104, +194, 70, -15, -4, -227, -39, -85, -82, -170, -64, -54, -15, -59, -172, -255, -233, -120, -136, +199, 177, -136, -188, -185, -151, -120, -143, -220, -133, -69, +115, +181, +244, +250, +11, +229, +96, +214, +199, +127, +202, +141, 255, -137, -137, -18, +84, 97, -83, -184, -163, -178, -45, -234, -162, -132, -94, -28, -201, -235, -38, -42, -126, -28, +252, +111, +185, +241, +191, +21, 206, -216, -132, -172, -248, -67, -88, -156, -233, -186, -104, -210, -136, -127, -236, -83, -46, +149, 236, -82, -82, -63, -204, -174, -57, -140, -172, -4, -233, -101, -40, -121, -129, -106, -162, -160, -18, -12, -245, -178, -93, -143, -197, -2, +86, +241, +238, +131, 29, -164, -32, -239, -137, -70, -163, +113, +144, +124, +161, +203, +69, +218, 208, -15, -53, -220, -214, -199, -66, -159, -75, -4, -215, -30, -109, -166, -233, -38, -63, -81, -159, -119, -1, -147, -38, -2, -87, -95, -145, -78, +247, +84, 152, +164, +189, +246, +86, 22, -117, -130, -30, -93, -54, -118, -228, -107, -176, -118, -182, +173, +145, +120, +194, +252, +184, +196, +229, 211, -70, -234, -2, -61, -186, 20, -118, -226, -43, -160, -9, -244, -254, -245, -70, -62, -143, -247, -108, -96, -100, -235, -226, -113, -60, -39, -35, -237, -8, -244, -113, -35, -56, -77, -115, -56, -157, -166, -225, -89, -228, -15, -23, -55, -165, -4, -75, -226, -238, +149, +167, +5, +42, +31, +208, +74, +63, +220, +209, +183, +78, +14, +236, +72, +234, +250, +250, 143, -67, +94, 86, -158, -132, -50, -180, +78, +191, +99, +163, +7, +130, +241, +147, +42, +41, +85, 32, +155, 135, -39, -197, -234, -144, -207, -66, -141, -49, -233, -49, -141, -84, -127, 29, -230, -109, -113, -59, -109, -96, -119, -200, -243, -189, -57, -158, -177, -200, -163, -76, -236, -35, -80, -125, -90, -166, -168, -149, -55, +214, +255, +116, +60, +196, +88, +68, +222, +220, +75, +188, +71, +238, +194, 162, -53, -86, -167, +255, +196, 68, -57, +137, +176, +41, +220, +81, +217, +22, +117, +81, +66, +47, +142, 228, +117, 19, -209, -17, +21, +63, +14, +103, +108, +66, +86, +252, +33, +44, +206, +116, +93, +52, +105, +196, +63, +246, +41, +23, +118, +41, +169, +31, +102, +215, 28, -35, -152, -221, -193, +70, +86, 130, -113, -56, -15, -120, -124, -28, -177, -137, -199, -34, -35, -121, -178, -252, +244, +50, 148, -18, -178, -97, -221, -197, -140, -197, -252, -56, -228, -164, -49, -70, -23, -49, -123, -13, -198, -84, -14, -35, -170, -13, -126, -4, -236, -58, -150, -109, -189, -65, -155, -159, -123, -187, +188, 64, +53, +81, +80, +9, +134, +122, +217, +174, +199, +98, +129, +14, +82, +144, +247, +68, +163, +81, +232, +135, +26, +110, +235, +99, +161, +207, +37, +130, +107, +143, +54, +211, +116, 147, 159, -126, -171, -23, -69, -230, -231, -85, -62, +168, +207, 187, -82, -39, +128, 73, -196, -176, -131, -239, -81, -136, -75, -115, -215, -234, -28, -94, +19, +129, +171, 175, -225, -52, 72, -241, -57, -173, -179, -192, -86, -151, -171, -18, -102, -155, -28, -6, -149, +39, +76, +139, 58, -78, -158, -200, -14, -40, -74, -12, -212, -90, -43, -180, -240, -61, -122, -177, -217, -131, -9, -177, -141, -60, -63, -173, -136, -131, -132, -165, -105, +65, 143, 46, -143, -9, -183, -29, +27, +59, +242, +53, 88, -86, -36, -18, -37, -104, -81, -74, -228, +59, +219, +105, 35, +117, +129, +30, +93, +10, +59, +241, +21, +208, +4, +122, +255, +122, +35, +159, +199, +123, +54, +48, +178, +117, +241, +56, +158, +147, +145, +118, +4, +250, +184, +17, +156, +166, +57, +156, +78, +211, +240, +44, +242, +135, +139, +155, +82, +130, +37, +113, 247, +199, +33, +43, +79, +66, +25, +90, +144, 195, -145, -151, -104, -52, -205, -105, -142, -96, -150, -125, -158, -80, -176, +147, +98, 117, +200, +103, +161, +198, +152, +244, +152, +70, +170, +191, +14, +243, +182, +184, +157, +54, +176, 59, -138, -39, -234, -0, -245, -17, -151, +228, +249, +222, +28, +207, +88, +228, +81, 38, -51, -210, +246, +17, +168, +62, +45, +83, +212, +202, +27, +209, +26, +171, +83, +162, +28, 242, -16, -219, -216, -148, -4, -49, +137, +232, +8, +142, +17, +204, +238, +96, +193, +56, +156, +7, +60, 62, -201, -29, -58, -234, -168, -54, -22, -63, -31, +142, +216, +196, +99, +145, +145, +60, +89, +126, +74, +9, +217, +176, +238, +98, +198, +98, +126, +28, +114, 210, -55, +24, +163, +139, 152, -250, -79, -125, -1, -201, -164, +189, +6, +99, +42, +135, +17, +213, +6, +63, 2, -50, -232, -194, -167, +118, +29, +203, +182, +222, +160, +205, +207, +189, +93, +160, +201, +79, +191, +213, +139, +34, +243, +243, +42, +159, +93, +169, 147, +36, +98, +216, +193, +247, +40, +196, +165, +185, +107, +117, +14, +175, 215, +112, +26, +164, +248, 156, -132, -16, -104, -77, -133, -208, -73, -235, -201, -172, -93, +214, +89, 96, -18, -121, -163, -87, -194, +171, +203, +85, +9, +179, +77, +14, +131, +74, 29, -47, -46, -224, -116, -242, -12, +39, +79, +100, +7, +20, +37, +6, +106, +173, +21, 90, -68, -225, -127, -227, -5, -230, -40, -12, -181, -70, -148, -98, -14, -165, -211, -12, -47, -202, -109, -31, -118, -66, -135, -157, -149, -203, -86, -198, -86, -164, -197, -63, -229, -205, -42, -254, +248, +30, +189, +216, +236, 193, -125, -158, 132, -193, +216, +70, 158, -99, -102, -210, -101, -117, -91, -171, 159, -8, -21, -49, -127, -51, -12, -78, -60, -84, -59, -69, -7, -81, -249, -25, -136, +86, +196, +65, +194, +210, +180, +71, +151, +199, +132, +219, +14, +44, +43, +18, +137, +18, +180, +40, +37, +242, +145, 251, -34, -121, -166, -91, -201, -243, -234, -35, -16, -163, -80, -220, -186, -247, -171, +225, +200, +75, 52, -112, -73, -76, -252, -134, -158, -39, -123, -245, -48, -95, -121, -35, -128, -143, -69, -37, -25, -156, -117, -177, 154, 230, -176, -210, -211, -25, -155, -16, +52, +71, +48, +203, +62, +79, +40, +216, +186, 29, -133, -234, -128, -178, -133, -123, -175, -227, -34, -23, -149, -215, -181, 197, -94, -143, 19, -217, -189, -229, -133, -236, -222, +117, +128, 250, 136, -77, -51, -196, -140, -90, -202, -20, +75, +147, +25, +105, +121, +136, +109, +108, +74, +130, +24, +159, +228, +14, +29, +117, +84, +27, +139, +159, +15, +233, +27, +76, +253, +167, +190, 128, -58, -38, -241, -200, -234, -168, -107, +100, +82, +1, +25, 116, -139, -58, -242, -187, -155, -68, -41, -45, +225, +211, +201, +107, +78, +66, +8, +180, +166, +66, +232, 164, -110, -175, -128, -250, -30, -153, -51, -246, -98, -192, -5, -254, -87, +245, +100, 214, -251, -60, -241, -210, -13, -185, -157, -180, -137, -219, +46, +48, 137, -150, -111, -216, -228, -215, -120, -255, -78, -76, -75, -113, -17, -27, -236, -26, -31, -133, -67, -178, +188, +209, +43, +225, +142, +23, +23, +112, +58, +121, 6, +45, +162, +240, +191, +241, +2, +115, +20, +134, +90, +35, 74, -84, +49, +135, +210, +105, +134, +23, +229, +182, 15, -124, +59, +161, +195, +206, +202, +101, +43, +99, +43, +210, +226, +159, +242, +102, +21, +255, +224, +62, +79, +194, +96, 207, -39, -163, -92, -20, -189, 49, -130, -98, -11, -113, -46, -120, -143, -71, +51, +233, 178, -155, -107, -94, +186, +173, +213, +79, +132, +138, +152, +191, +25, +6, +39, +30, +170, +157, +162, +131, +168, 252, -215, -135, -111, +12, +196, +125, +145, +60, +211, 173, -232, -96, -69, -151, 228, +121, +245, +17, 136, -42, +81, +40, +110, +221, +251, +85, +26, +184, +36, +38, +126, +67, +207, +147, +189, +122, +152, +175, +188, +17, +192, +199, +162, +146, +12, +206, +186, +88, +77, +115, +88, +233, +233, +140, +77, +136, +142, +66, +117, +64, +217, +194, +189, +215, +113, +145, +139, +202, +235, +218, +98, +175, +199, +137, +236, +222, +242, +66, +118, +111, +125, 196, -116, -22, -78, -161, -11, -245, -79, -154, -54, -69, -211, -131, -220, +166, +25, +98, +70, +45, +101, +10, +64, +29, +147, +120, +100, +117, +212, 53, -237, +186, +69, +29, +249, 221, +77, +162, +148, 22, -85, +82, +183, +87, +64, +125, +143, +204, +25, +123, 49, -239, -61, -239, -252, -116, -89, -253, -186, -250, -13, -58, -97, -173, -84, -229, -79, -81, -106, -172, -60, +224, +2, 255, -193, -14, -131, -20, -21, -150, -36, +43, +235, +125, +158, +120, +233, +134, +220, +78, +218, +196, +237, +68, +203, +55, 108, -52, -83, -45, -37, -246, -236, +242, +107, +188, +127, 39, -207, -34, -18, -196, -79, -103, +166, +165, +184, +136, +13, +118, +141, +143, +194, +33, +89, +3, +37, +170, +7, +190, +231, +147, +81, +46, +138, +222, +24, +65, +177, +133, +56, +23, +188, +199, +35, +217, 205, +53, +47, +254, +235, +195, 183, -196, -44, -48, -140, -48, -133, -115, -92, -226, -122, -154, -14, -244, -2, -78, -80, -190, -155, -69, -94, -120, -242, -200, -164, +86, +116, +176, +162, +75, +114, +68, +21, 98, -8, -29, -156, -79, -253, -185, -38, -197, -74, -150, -3, -121, -101, -88, -213, -106, -10, -222, -28, -142, -214, 58, -138, -171, -77, -181, -239, +11, +167, +208, +133, +250, 39, -9, -181, -44, -222, +77, +155, +162, +233, +65, +238, +154, +246, +110, +139, +170, +152, +247, +158, +119, +126, +186, +172, +126, +93, +253, +6, +157, +176, +86, +170, +242, 167, -248, -112, -121, -28, +40, 53, -71, -107, +86, +158, +255, 96, -148, -166, -134, -239, -151, -144, -133, -140, -116, -234, -185, -113, +135, +65, +138, +10, +75, +18, +54, 154, -218, -113, -3, +169, +150, +18, +123, +246, +147, +103, 17, -163, -116, -205, -163, -197, +9, +226, +167, +179, 230, -21, -218, -216, -71, 91, -32, -162, -9, -156, -228, -217, -28, 98, -3, -148, -172, -222, -3, -216, -111, -175, -68, -63, +22, +24, +70, +152, +194, +57, +46, +113, +61, +77, +7, +122, 1, -215, -182, -161, -119, -154, -175, -167, -235, -140, -83, -207, -133, -167, -110, -128, -20, -216, -149, -33, -245, -10, -180, -33, -60, -193, -189, -42, -238, -16, -66, -175, -128, -51, -252, -25, -66, -253, -247, -235, -209, -182, -211, -103, -87, -97, -5, -239, -68, -41, -82, 39, -250, -80, -164, -144, -137, -221, -209, -210, -247, +40, +223, 205, -138, -88, -212, -122, -146, -44, +34, 47, +60, +121, +100, +82, +49, +132, +14, 206, -113, -240, -125, -39, -105, -1, -216, -237, -133, -20, -47, -102, -173, -105, -81, -195, -104, -6, -179, -106, +167, +254, +92, +147, +98, +37, 203, -205, -209, -83, -144, -239, -145, -63, -255, -36, -105, -67, +129, +188, +50, +172, +106, +53, +5, +111, +14, 71, -67, -8, -193, +107, +29, 197, -43, -55, +213, +166, +218, +247, +147, +132, +90, +22, +239, +83, 124, -228, -81, -228, -141, -121, +184, +60, +142, 154, +163, +53, +48, 74, -181, -179, -149, +83, +195, +247, +75, 200, -105, -28, -25, -41, -130, -249, -186, -218, -167, -141, -27, -222, -104, -120, -156, -136, -237, -48, +66, +70, +58, +245, 220, -227, -179, -33, -250, -149, -246, -253, -86, -137, -139, -122, -9, -223, -119, -96, -89, -126, -101, -217, -106, +56, +77, +237, +184, +129, 136, +81, +186, +230, +209, +98, +243, +10, +109, +236, +163, +45, +16, +209, +4, +78, +242, +108, +14, +177, +1, +74, +86, 239, +1, +236, 183, -134, -155, -157, -7, -231, -12, -171, -105, -14, -171, +87, +162, +159, +128, +107, +219, +208, +59, +205, +215, 211, -220, -7, -235, -60, -122, -93, -62, -207, 117, -236, -70, -203, -56, -9, +198, +169, 231, -123, -127, -183, -43, -55, -125, -245, -14, -47, -43, -207, -126, -27, -180, -241, -189, -197, -113, -16, -165, -65, -164, 194, +83, +55, +64, +10, +236, +202, +144, +122, 5, -219, +218, +16, +158, +224, +94, +21, 119, -134, -174, -165, +8, +161, +87, +192, +25, +254, +12, +161, +254, +251, +245, +104, +219, +233, +179, +171, +176, +130, 119, -252, 162, -210, -73, -241, -58, -250, -236, -10, -235, -228, -192, -240, -84, -238, -79, -94, -45, -175, -139, +20, +169, +19, +125, +40, +82, 200, -253, -100, -56, -180, -57, -130, -46, -81, -7, -8, -71, -174, -161, 196, -141, +238, +104, +233, +251, 102, -216, -26, -32, -244, -66, -72, -224, -250, +69, +44, +106, +61, +73, +150, +23, +231, +56, 248, -173, -157, -142, -144, -49, -89, -108, +190, +147, +180, +0, +236, +246, 66, -243, -141, -142, +138, +23, +179, 214, -153, -116, -68, -225, -49, -90, -44, -178, -19, -115, -185, -78, -21, -213, -238, -247, -212, +180, 168, +97, +52, +131, +89, +181, +229, +230, +232, +41, +200, +247, +200, +159, +127, +146, +180, +161, 163, -189, -122, -121, -15, -168, -234, -178, -75, -172, -201, +33, 132, -23, -127, +224, +226, +149, +27, 62, -251, -112, +242, +40, +242, +198, +60, +77, +165, +218, +217, +74, +228, +52, 142, -255, -215, +140, +20, +193, 124, -132, -205, -75, +93, +237, +211, +198, +13, +111, +52, 60, -19, -255, -153, -122, -123, -126, +78, +196, 118, -56, -40, -235, -12, -86, -63, -70, -222, -197, -201, -202, -231, +24, 238, -48, -124, -254, +241, +217, +16, +253, +74, +251, +126, +171, +196, +69, +189, +132, +239, +59, +176, +44, +191, +178, +108, +53, +196, +247, +91, +195, +205, +206, +131, +115, +134, +213, +52, +135, +213, +105, +238, +131, +117, +30, +189, +46, +159, +231, +58, +118, +163, +101, +156, +132, +243, +189, +191, +219, +149, +155, +190, +122, +135, +151, +149, 103, +191, +13, +218, +248, +222, 226, -24, -243, -235, -246, -197, +56, +136, +210, +32, +82, +225, +130, +237, 59, -48, +67, 215, -70, -94, -52, -218, -111, -209, -227, -250, -71, -124, -205, -0, -96, +210, 59, -199, -79, -33, -190, +126, +81, 233, -144, -129, -77, -245, -74, -61, -237, -197, +164, +120, +29, +125, +118, +133, +117, +114, +96, +120, +42, +247, +39, +175, +150, +215, 69, -32, +228, +126, +50, +28, +218, +28, +65, +151, +168, +3, +132, +35, +215, +80, +226, +70, +51, +108, +13, +16, +122, +33, 36, -174, -177, -236, -253, -134, -64, -138, +112, +125, +252, +214, +78, +71, +200, 152, -23, -55, -181, -13, -234, -128, -180, -140, -98, -168, -151, -134, -143, -160, -9, -75, -140, -15, -64, -253, +44, +54, +161, +249, +70, +71, +235, +76, +58, +162, +240, +24, +45, +22, +217, +137, +185, +92, +167, +138, +106, +247, +123, +106, +212, +209, +94, 189, -177, -183, +188, +7, +84, +117, +217, +37, +214, +100, +194, +139, +63, +159, +125, 56, +199, +255, +107, +62, +194, +230, +37, +158, 137, -28, -78, -242, -124, +255, +76, +189, +61, 63, -45, +59, +28, +148, 117, -99, -153, -38, -88, -78, -223, -84, -5, -235, -155, -121, -135, -96, -179, +6, +171, +31, +35, +239, +226, +100, +229, +115, +119, +24, +62, +255, +51, 113, -253, -76, +140, +249, +117, +251, +226, +29, +152, +107, 35, -38, +47, +26, 237, -13, -163, -161, -207, -70, -63, -220, -33, -139, -84, -221, +183, +232, +113, +253, +35, 190, -104, -234, -5, -26, -152, -249, -124, -146, -236, -132, -171, -20, -171, -36, -92, -24, -15, -78, -229, -54, -130, -154, +102, +0, +176, +157, +227, +167, +16, +223, +116, +200, +192, +166, +122, +165, +158, +246, +226, +34, +16, +18, +215, +88, +246, +126, +67, 32, -198, +69, +204, +139, +155, +218, +6, +117, +64, +90, +70, +49, +212, +75, 195, -211, -99, -114, -24, -38, -9, +71, +208, 132, -94, +37, +198, +7, +160, +254, +222, 216, -163, -233, +91, 156, -253, -224, -110, +68, +14, +39, +121, +190, +159, +150, +186, +177, +76, +19, +44, +167, +111, +170, +130, +245, +205, 188, -152, -113, -97, -229, -23, -154, -217, +67, +176, 217, -175, -21, -87, -79, -142, -106, -90, -38, -117, -72, -182, -214, -115, -154, -42, -6, -46, +184, +126, +166, +17, +147, +246, +134, +209, +208, +103, +163, +31, +238, +144, +69, +170, +110, +95, +52, +245, +2, +13, +204, 124, -22, -236, -183, +62, +73, +118, 194, -188, -157, -28, -241, -113, -196, -178, +85, +138, +85, +18, +46, +140, +7, +167, +114, +27, +65, +77, +16, +227, +225, +233, +49, +57, +12, +147, +4, +66, +47, +236, +209, +116, +206, +126, +112, +55, +94, +204, +184, +176, 242, -100, +11, +205, +236, +236, +215, +138, +171, +39, +71, 53, -230, -153, -68, -252, -8, -206, -111, -10, -190, -70, -83, -158, -172, -156, -42, -25, -173, -118, -12, -84, -202, +45, +147, 58, -18, -203, -70, -174, +36, +91, +235, +57, +77, +21, +3, 23, -76, -194, -237, -27, -175, +62, +11, +246, +91, +97, +222, 78, -48, +142, +248, +56, 98, -35, -234, -66, -253, -51, -134, -127, +89, +121, +178, +26, +243, +76, +34, +126, +4, +231, +55, +5, +95, 163, -223, +41, +79, +86, +78, 149, -5, -73, 140, -31, -169, -159, -228, -210, -119, -93, -183, -115, -119, -213, +86, +59, +6, +42, +101, +29, +137, +101, +35, +215, +11, +38, +225, +246, +141, +87, +39, +24, +177, +17, +117, +161, 254, +25, 195, -109, -245, -122, -173, -191, -191, -113, -30, -153, -191, -228, -105, -99, -241, -255, -248, -69, -125, -190, -109, -236, -229, -67, -127, -208, -189, -165, -145, -110, 191, -243, -95, -237, -116, -248, +209, +239, +202, +130, +36, +198, +143, +212, +79, +114, +233, +187, +174, +219, +185, +187, +106, 255, -210, -24, -77, -195, -190, -182, -59, -159, -191, -12, -250, -197, -225, -191, -105, -12, -191, -109, -253, 225, -222, -183, +182, 122, -131, -206, -229, -77, -219, 189, -236, -222, -116, -123, -238, -253, -151, -86, -191, -221, -175, +214, +223, +223, +56, +143, +204, +95, +242, +180, +177, +248, +127, +252, +162, 62, -75, -107, -48, +223, +54, +246, +242, +161, +63, 232, -181, -46, -7, -221, -158, +222, +210, +72, +183, +223, 249, -28, -151, -15, -189, -126, -126, -156, -14, -1, +175, +118, +58, +252, +127, +105, +140, +166, +97, +95, +219, +157, +207, +95, 6, +253, +226, +240, +223, +52, +134, +223, +182, +254, +112, +239, +91, +189, +65, +231, +242, +166, 237, +94, +118, +111, +186, +61, +247, +254, +75, +171, +223, +238, +87, +159, +165, +53, +24, +244, +90, +151, +131, +110, +207, +124, +142, +203, +135, +94, 63, -6, -15, +63, +78, +135, +0, +131, +246, +31, +131, +135, +94, +219, 189, -182, -123, +190, +105, 125, -211, -250, -236, -222, 118, -238, 111, -91, +59, 247, -217, -4, -58, -244, -47, -76, -208, -107, -223, 183, -91, -131, -116, -252, -71, -211, -241, -215, -157, -155, -65, -187, -103, -132, -120, -97, -252, -229, -195, -69, -91, -96, -80, -153, +173, +251, +108, 2, -125, -247, -170, -125, -221, -122, -184, -201, -80, +29, +250, +23, +38, +232, +181, +239, +219, +173, +65, +58, +254, +163, +233, 248, -119, -45, -17, -196, -85, +235, +206, +205, +160, 221, -155, -246, -117, -54, -240, -87, -131, +51, +66, +188, +48, +254, +242, +225, +162, +45, +48, +168, +76, 129, +190, +123, +213, +190, +110, 61, -16, -63, -35, +220, +100, +40, +252, +187, +150, +8, +226, 170, +238, +77, +251, +58, +27, +248, 171, -145, -23, -221, -129, -144, -126, -35, -130, -171, -161, -131, -110, -70, -167, -79, -6, -227, -174, -123, -221, -187, -129, +193, +192, +30, +136, +159, 17, +213, +213, +200, 139, -82, -96, -91, -151, -127, -75, -7, -254, -171, -198, +238, +64, +72, +191, +17, +193, +213, +208, +65, +55, +163, +211, +39, +131, +113, +215, +189, +238, +221, 192, -254, -151, -214, +136, +69, +41, +176, +173, +203, +191, +165, +3, +255, 85, -187, -231, -222, -182, -132, -80, -116, -90, -55, -70, -180, -149, 99, -239, -187, -253, -129, -123, -223, +96, +255, +75, 235, -94, -182, -251, -125, +170, +221, +115, +111, +91, +66, +40, +58, +173, +27, 35, -50, -169, -69, -73, -176, -126, +218, +202, +177, +247, +221, +254, +192, +189, 239, -244, -59, -23, -55, -109, -35, -8, -138, -51, -92, 117, -31, -196, +47, +219, +253, +190, +17, +153, +212, +162, +36, +88, +191, +119, +250, +157, +139, +155, +182, +17, 4, -66, 197, -92, -181, -175, -140, -88, -93, -156, -166, -115, -247, -123, -187, -55, -112, -175, -91, -151, -237, -58, -248, -60, -220, -33, -125, +25, 174, -140, -36, -160, -56, -133, +186, +15, +98, +2, +161, +98, +174, +218, +87, +70, +172, +46, +78, +211, +185, +251, +189, +221, +27, +184, +215, +173, +203, +118, +29, +124, +30, +238, 144, -130, +62, +87, +70, +18, +80, 156, -4, -233, -233, -168, +66, +72, +65, +78, +130, +244, +116, +84, +126, 252, -248, -175, -157, -94, -251, -186, 215, -186, -109, -27, -137, +78, +175, +125, +221, +107, +221, +182, +141, 68, -113, -142, -139, -206, -205, -205, +162, +56, +199, 69, -183, -213, -203, -240, -248, -55, -227, -57, -132, +231, +230, 230, -52, -218, -237, -233, -104, -193, -206, -187, -43, -247, -182, -123, -213, -22, -138, -243, -143, -106, 162, -145, -155, -163, -117, -85, -81, -46, -114, -115, -244, -31, -46, -170, -9, -69, -30, -151, -135, -27, -35, -169, -184, -238, +219, +234, +101, +120, 252, -209, -190, -74, -247, -40, +155, +241, 28, -100, -173, -91, -247, -170, +66, 115, -125, -253, -208, -55, -219, -47, -219, -39, -106, -15, -90, -157, -27, -35, -194, -108, -157, -167, -127, -223, -190, -124, -184, -105, -245, -140, -200, -179, -117, -166, +26, +237, 246, -109, -167, -223, -239, 116, -239, -234, -19, -73, -193, -228, -182, -255, -48, -219, -72, -91, -103, -251, -124, -211, -253, -106, 180, -149, -182, -206, -114, -215, -237, +96, +231, 221, -230, -52, -173, -206, -118, -218, -142, -27, -168, +149, +123, +219, +189, +106, +11, +197, +249, +71, +53, +209, +200, +205, +209, +186, +170, +40, 23, +185, +57, 250, -183, -209, -238, -218, -58, -89, -126, -139, -234, -28, -233, -107, -147, -136, -19, +15, +23, +213, +132, +34, +143, +203, +195, +141, +145, +84, +92, +119, 254, +104, +95, +165, +123, +20, +14, 178, -219, +214, +173, +123, +213, +185, +190, +126, +232, +155, 237, -93, -9, -130, -127, -105, -247, -218, -117, -24, 151, -78, -245, -240, -123, -29, -217, +237, +19, +181, +7, +173, 206, -77, -227, -10, -115, +141, +17, +97, +182, +206, +211, +191, +111, +95, +62, +220, +180, +122, +70, +228, +217, +58, +83, +251, +182, +211, 239, -174, +119, +186, +119, +245, +137, +164, +96, +114, +219, 127, -45, -200, -94, -71, -200, -115, -19, +152, +109, +164, +173, +179, +125, +190, +233, 126, -52, -18, -113, -50, -128, -225, -76, -105, -155, -169, -48, -26, -184, -38, -46, -58, -144, -211, -192, -65, +53, +218, +74, +91, +103, +185, 235, -238, +246, +110, 115, -251, -206, -204, -84, -164, -145, +154, +86, +103, +59, +109, +199, +13, +212, +11, +253, +219, 104, -102, -27, -241, -80, -174, -40, -238, -23, -57, -174, -233, -236, -51, -26, -120, -209, -189, -203, +119, +109, 157, +44, +191, +69, +117, +142, +244, 181, -58, -59, -162, -112, -171, -48, -18, +73, +196, +9, 127, +217, +237, +246, +174, +4, +193, +191, +180, +123, +237, +58, +140, +75, +167, +122, +248, +189, +142, +108, +231, +166, +113, +133, +185, +119, +215, +191, +22, +100, +175, +35, +228, +185, +9, +63, 26, 137, -151, -161, -10, -247, -152, -252, -62, -249, -223, -218, -163, -64, -246, -90, -131, -117, +56, 25, -208, +192, +112, +166, +180, +205, +84, +24, +13, +92, +19, +23, +29, +200, +105, +224, +160, +117, +247, +185, +125, 103, -165, +102, +42, +210, +72, +52, +179, +141, +120, +40, +87, +20, +247, +139, 28, -191, -38, -10, -250, -12, -149, -227, 215, -37, -66, -159, -65, -114, -130, -162, -96, +116, +246, +25, +13, +188, 232, -83, -77, +222, +229, +206, +90, +157, +29, +81, +184, +85, +24, +137, +63, +141, +196, +203, +80, +133, +123, +76, +126, +159, +252, +111, +237, +81, +32, +123, 173, +193, +186, +12, +232, +179, +82, +142, 95, -148, -143, -15, -250, -140, -150, 19, -172, -201, -137, -49, -252, +5, +125, +134, +202, +241, 235, -242, -242, -225, -163, -49, -14, -69, -193, -249, -248, -175, -58, -56, -220, -247, -58, -183, -157, -65, -231, -119, +18, 161, -173, -187, +207, +32, +57, +65, +81, +48, +244, +169, +166, +214, +47, +202, +199, +7, +125, +70, +203, +9, +214, +228, +196, +24, +254, +117, +121, +249, +240, +209, +24, +135, +162, +224, +124, +252, +87, +29, +28, +238, +123, 157, +219, +206, +160, +243, 187, -220, -250, -58, -90, -32, -27, -124, -211, -201, -99, -175, -35, -61, -197, -177, -110, -127, 208, -235, -220, -27, -137, -207, -218, -4, -55, +214, +221, +206, 93, -195, -27, -77, -54, -94, -44, +110, +125, +29, 45, -164, -239, -198, -240, -222, -190, -57, -126, +144, 13, -9, -157, -83, -120, -203, -36, +190, +233, +228, +177, 215, -173, -59, -35, +145, +158, +226, +88, +183, +63, +232, 117, -147, -77, -97, -106, -203, -166, -94, -135, +238, +141, +196, +103, +109, +130, 155, -206, -117, -123, -208, -185, -53, -51, -216, +174, +225, +141, +38, +27, +47, +150, +22, 210, -209, -253, -251, -94, -187, -101, -102, -189, -166, -99, -63, -247, -90, -191, 119, -6, -127, -55, 99, -124, -6, -246, -93, -91, -216, -79, -191, -183, +120, 111, -186, -151, -249, -73, -180, -184, -159, -122, -92, -238, -62, -163, -21, -182, -49, -139, -150, -12, -172, -129, -210, -186, -188, -108, 223, -180, -123, -173, -65, -222, -66, -212, +28, +191, +134, +132, +206, +41, +188, +101, 146, -3, -53, -81, -175, -117, -5, -39, -250, +235, 214, -137, -180, -164, -65, +157, +145, +186, +201, +166, +48, +181, +101, +83, +175, +195, 77, -36, -21, -106, -233, -100, -70, -2, -210, -185, -235, -224, -76, -5, -23, -153, -206, +231, +186, +61, +232, +220, +154, 25, -147, -206, -112, -221, -185, -91, -31, -255, -193, -72, -202, -20, -8, -184, -73, -178, -57, -140, -164, -237, -75, -187, +108, +233, 232, -106, -49, -146, -54, -26, -12, -102, -187, -48, -189, -250, -151, -173, -60, -20, -70, -18, -247, +254, +125, +175, +221, +50, +179, +94, +211, +177, +159, 123, -171, -87, -216, -170, -31, -116, -36, -237, -6, -23, -191, -18, -183, -230, -75, -96, -163, -161, +173, +223, 59, -132, -70, -119, -111, -239, -58, -70, -219, -244, -70, -98, -220, -53, -179, -212, -104, -24, -57, -68, -91, -183, -23, -157, -252, -185, +131, +191, +155, +49, +62, +3, +251, 174, -15, 45, -141, -95, -191, -74, -234, -131, -77, -227, -43, +236, +167, +223, +219, +55, 221, +203, 252, -104, -2, -117, -77, -235, -14, -192, -45, +36, +90, +220, +79, +61, +46, +119, +159, +209, +10, 219, -190, -123, -40, -110, +152, +69, +75, +6, +214, +64, +105, +93, +94, +182, +111, +218, +189, +214, 32, -125, -76, -242, -19, -21, -165, +111, +33, +106, +201, +129, +154, +168, 215, +186, +130, +19, +125, +235, +68, +90, +210, +160, +38, +146, +10, +181, +116, +50, +35, +1, +233, +220, +117, 112, +166, +130, +139, +76, +231, +140, +73, +103, +184, +238, +220, +173, +143, +255, +96, +36, +101, 10, -80, -14, -15, -102, -142, -159, -252, -240, +4, +220, +36, +217, +28, +70, +210, 246, +165, +93, +116, +181, +24, +73, +27, +13, +6, +179, 93, +152, +94, +253, +203, +86, +30, +10, +35, +137, +251, +189, +213, +43, +108, +213, +15, +58, +146, +118, +131, +139, +95, +137, +91, +243, +37, +176, +209, +208, +29, +66, +163, 187, -247, -217, -76, -77, -230, +183, +119, +29, +163, +109, +122, +35, +49, +238, +154, +89, +106, +52, +140, +28, +162, +173, +219, +139, +78, +254, +92, +215, 135, -111, -35, -130, -190, -232, -86, -187, -203, +150, +198, +175, +95, +37, 245, -47, -219, -119, -173, -94, -167, -235, -94, -181, -47, -30, -62, -11, -105, -232, -183, -46, +193, +166, +241, +149, 110, -114, -142, -43, -45, -95, -96, -113, -142, -77, -207, -147, -14, -27, -214, +126, +52, +129, +186, +166, +117, +7, +224, +150, +109, +223, +61, +20, +55, +144, +62, 38, -233, -10, -123, 249, -170, -215, -250, -106, -196, -139, -206, -93, -95, -104, -229, -75, -113, -80, -183, +137, +138, +210, +107, +56, +5, +40, +135, +7, +51, +199, +79, +126, +120, +251, +174, +221, 251, +108, +166, +38, +243, +195, +183, +17, +65, 95, -140, +116, +171, +221, +229, +250, +151, +237, +187, 86, -207, -70, -62, -220, -192, -65, -157, -27, -110, -180, -176, -210, -65, -125, -35, -33, -72, -135, -223, -20, -212, -167, -14, -239, +175, 211, -161, -189, -110, -206, -81, -173, -115, -34, -102, -48, -119, -123, -3, -67, +117, +175, +218, +23, +15, 159, -68, -58, -246, -115, -187, -123, -219, -30, +133, +52, 244, -224, -110, -212, -255, -155, -153, -194, -237, -220, -93, -119, -221, -238, -197, -255, -21, -250, -182, +91, +23, +55, +57, +199, +149, +150, 47, -14, -31, -183, -40, -50, -58, -114, +176, +56, +199, +166, +231, +73, 135, -51, -192, -189, -170, -115, -217, -222, -50, +13, +107, +147, +116, 133, -30, -223, -197, -20, -233, +189, +124, +213, +107, +125, 53, -255, +226, +69, +231, +174, +47, +180, 242, -11, -156, +165, +56, +168, +219, +253, +47, +70, +171, +103, +35, +31, +110, +224, +160, +206, +13, +55, +90, +88, 233, -91, -166, -210, -147, -1, -49, -149, -116, -139, -151, -78, +160, +190, +145, +16, 164, -39, -13, -48, -209, -67, -15, -156, +195, +111, +10, +234, +83, +135, +247, +233, 208, -229, +94, +55, +231, +168, +214, +57, +17, 51, -105, -147, -24, +152, +187, +189, +129, +161, +79, +34, +29, +251, +185, +221, +189, +109, +15, +122, +112, +55, +234, +255, +205, +76, +225, 118, -145, -43, -78, -211, -155, +238, +174, +187, +110, +247, +226, +255, +10, +125, +219, +23, +135, +143, +91, +20, +25, +29, +185, +195, +25, +224, +94, +213, +185, +108, +111, +153, +66, +143, +239, +98, +138, +244, +154, +127, +249, +5, +206, +244, 45, -147, -232, +83, +233, 201, -137, +128, 152, -228, -161, -223, -250, -44, -14, -214, -206, -85, -91, -144, -171, -125, -235, -14, -186, -230, -34, -3, -204, 74, +186, +197, +75, 39, -16, -71, -78, -166, -100, -116, -76, -37, -28, -175, -30, +210, 147, -54, -102, -208, -81, -117, -169, -184, -136, -155, +6, +152, 232, -198, -4, -91, -108, -173, -236, -135, -248, -255, -252, -69, -252, -224, -179, -24, -254, -129, -255, -43, +161, +7, +78, +232, +242, +153, +180, +73, +12, +187, +200, +21, 167, -252, -234, -5, -227, -240, 233, -202, -99, -126, -56, -125, -227, -120, -193, -140, -71, -94, -18, -11, -83, -36, -92, -44, -23, +205, +150, +73, +244, +228, +68, +76, +242, +208, 111, -156, -17, -75, -248, -52, -140, -86, -240, -80, -29, -97, -31, -200, -255, -24, -70, -30, -159, -184, -197, -87, -221, -11, +125, 22, +7, +107, +231, +170, +45, +200, +213, +190, +117, +7, +93, 115, -135, -166, -157, -132, 145, -243, -132, -147, +1, +102, +165, +19, +136, +35, +39, +83, +50, 58, -99, -156, -53, -126, -15, -128, -108, +166, +18, +142, +87, +143, +73, 27, -181, +51, +232, +168, +186, +84, +92, +196, +77, +116, +99, +130, +45, +182, +86, 246, -88, -76, -160, -208, -32, -199, -139, -157, -100, -198, -157, -97, -113, -98, -230, -251, -114, -242, -119, +67, +252, +127, +254, +34, +126, 240, -151, +89, +12, +255, +192, +255, +149, +83, +126, +245, +130, 113, -186, -132, -211, -73, -254, -26, -59, -204, -25, -174, -222, -201, -39, -121, -39, -9, -23, -62, -127, -228, +248, +116, +229, +49, +63, +156, 190, -243, -237, -50, -12, -146, -40, -244, -191, +113, +188, +96, +198, +35, +47, +137, +133, +41, +18, +46, +150, 139, -25, -89, -226, -64, -16, -2, +55, +206, +136, +37, 124, -170, -128, +26, +70, +43, +120, +168, +142, +176, +15, 228, -163, -48, -194, -224, -59, -135, -5, -99, -88, -33, -20, 127, -158, -135, -233, -111, -176, -237, +12, +35, +143, +79, +220, +226, +171, +238, +5, 139, -23, -76, -17, +185, +67, +211, +78, +194, +200, +121, +194, +73, +157, +49, +206, +26, +191, +7, +64, +182, 141, -53, -4, -178, -247, -235, -45, -177, -1, -137, -151, -232, -132, -122, -201, -207, -232, -93, -189, -159, -68, -98, -41, -189, -167, -245, -62, -79, +90, +123, +44, +38, +80, +104, 144, -70, -56, -129, -19, +227, +197, 78, -240, -7, -194, -234, -253, -95, -204, +50, 227, -5, -36, -28, -122, -185, -80, -69, +206, +176, 56, -95, -202, -109, -238, -201, -97, -205, +49, +243, +125, +57, +249, +59, +248, +203, +56, +93, +194, +233, +36, +127, +141, +29, +230, +12, +87, +239, +228, +147, +188, +147, +132, +11, +159, +63, +114, +223, +249, +118, +25, +6, +73, +20, +250, +223, +197, +140, +44, +113, +32, +8, 1, -58, +62, +85, +64, 242, +81, +24, +97, +240, +157, 195, -152, -187, -195, -101, -146, -47, -84, -84, +130, +49, 172, -146, -69, -161, -135, -23, +16, +138, +63, +207, +195, 244, -137, -25, -144, -56, -187, -243, -173, -48, +55, +216, +246, 197, -247, -157, -96, +11, +166, +136, +198, +26, +2, +217, +251, +245, 150, -134, -50, -232, -108, -193, -48, -242, -199, -249, -189, -215, -227, -113, -184, -140, -160, -218, -187, -230, -246, -187, +216, +128, 196, -217, -80, -186, -103, -44, -118, -132, -212, -71, -171, -100, -38, -24, +75, +116, +66, +189, 228, -44, -120, +103, +244, +174, +222, +79, +34, +177, 148, -48, +222, +211, +122, +159, +39, +72, +35, +156, +192, +9, +39, +248, +3, +97, +245, +254, 47, -128, -127, -38, -33, -8, -61, -172, -165, -187, -33, -77, -167, -117, -90, -206, -98, -182, -138, +230, +241, +2, +18, +14, 189, -81, -236, -196, -11, -54, -226, -231, -226, +92, +168, +34, +156, 47, -143, -94, -44, -4, -202, -81, -21, +229, +54, +247, +228, +176, +230, +0, +29, +249, +97, +204, +221, +225, +50, +201, +23, +42, +42, +86, +201, +162, +208, +195, 11, -105, -143, -57, -49, -244, -15, -161, -143, +250, +196, +12, +72, +156, +221, +249, +86, +152, +226, +251, +78, +48, +75, +67, +25, +116, +182, +96, +24, +249, +227, +252, 222, -59, -253, -133, -216, -126, +235, +241, +56, +92, +70, +80, +237, +93, +115, +251, +93, 226, -155, -32, -20, -203, +108, +40, +221, +51, +22, 59, -144, -9, -18, -39, -60, -2, -102, -120, -17, -236, -62, -164, -69, -44, -232, -35, -150, 66, -14, -45, -35, -200, -14, -207, -225, -162, -187, -43, -49, -243, -15, -22, -173, -153, -89, -94, -51, +234, +163, +85, 50, -167, -161, -82, -172, -117, -161, -0, +19, +12, +114, +22, +60, +74, +152, +23, +192, +63, +147, +16, +132, 30, -28, -154, -28, -212, -93, -227, -209, -139, -194, -0, -20, +214, +210, 221, -110, -109, -41, -62, -86, -186, -178, -157, -27, -167, -165, -48, -13, -9, -84, -128, -75, -143, -64, +144, +166, +211, +58, +45, +103, +49, 91, -64, -170, -74, -168, -218, -26, +197, +222, +40, +118, +226, +5, +27, +241, +115, +241, +151, +71, +47, +22, +2, 229, -227, -213, -158, -116, -202, +168, +138, +133, +180, 199, -43, -91, -106, -37, +156, +24, +250, +135, +208, +71, +239, 157, -185, -162, -102, -17, -227, +254, +66, +108, +63, +241, 77, -149, -74, -1, -25, +16, +138, +229, +29, +200, +4, +137, 19, -189, -178, -86, -185, -119, +30, +1, +51, +188, +8, +118, 31, -27, +210, +34, +22, +244, +17, +75, +33, +135, +150, +17, +100, +135, +231, +112, +209, +221, +149, 152, +249, +7, +139, +214, +204, +44, +175, +25, +153, +211, +80, +41, +214, +186, +80, +0, +15, +14, +77, +14, +234, +174, +241, +232, +69, +97, +0, +138, +110, +183, 182, -238, -129, -52, +20, +31, +43, +93, +217, +206, +141, +211, +82, +152, 134, +4, +42, +192, 165, -101, -107, -139, -125, -126, -11, -230, -228, -95, -30, -50, -218, -226, -175, +71, +160, +45, +32, +85, 37, -201, -102, -246, -224, +84, +109, +141, +242, +241, +106, 79, -61, -215, -52, -195, -255, -184, -189, -185, -103, +58, +229, +227, +149, +45, +181, +146, +206, +92, 81, -204, -163, -162, +179, +136, +241, 166, -155, -112, -177, -149, -13, -84, -93, -195, -188, -142, -56, -27, -27, -69, +74, +165, +128, +140, +137, +94, +89, +171, 220, -214, -228, -31, -168, -56, -217, -215, -124, -207, -139, -194, +187, 143, -205, -223, -24, -170, +13, +76, +91, +247, 64, -50, -102, -137, -118, -153, -126, -187, -144, -132, -147, -137, -216, -236, -53, -11, -194, -214, -4, -132, -37, -2, -69, -113, -65, -106, -166, -183, -103, -99, -192, -52, -35, -46, -251, -139, -79, -127, -17, -25, -244, -186, -156, -48, -54, -208, -95, -61, +26, +195, +210, +178, +181, 197, -102, +62, +191, +5, +115, +242, 47, -229, -61, -77, -124, -27, -166, -59, -79, -252, +15, +25, +109, +241, +215, +146, +100, +51, +123, +240, +167, +158, 107, -124, -32, +154, +225, +127, +220, +222, +220, +179, +40, 230, -236, -27, -45, -55, -102, -147, -19, -199, -13, -10, -203, -206, -23, -250, -149, -119, +81, +81, +211, +77, +184, +216, 202, -196, +6, +170, 174, -38, -121, -165, -205, -47, -11, -223, -28, -74, +97, +94, 71, -198, -63, -188, -133, -27, -243, -81, -33, -255, -183, -214, -149, -154, -255, -56, -210, -132, -159, -53, +156, +141, +141, +34, +110, +107, +242, +15, +84, +156, +236, +107, +190, +231, +69, +225, +199, +230, +111, +12, +85, +32, +25, +179, +68, +187, +76, +191, +93, 72, -195, +194, +201, +68, +108, +246, +154, 5, -47, -113, -224, -213, +97, +107, +2, +194, +18, 129, -180, -41, -153, +162, +184, +32, 53, -201, +211, +219, +179, +49, +96, +154, +17, +151, +253, +197, +167, +191, +136, +12, +122, +93, 78, -186, -106, -187, -119, -221, -59, +24, +27, +232, +175, +158, +98, 179, -183, -31, -28, -213, -190, -105, -223, -230, -223, -190, -117, -94, -124, +151, 242, -3, -221, -246, -221, -149, -209, -27, -15, -14, -134, -71, -8, -163, -7, -29, -28, -117, -217, -189, -189, +158, +38, +190, +13, +211, +157, +39, +254, 53, +62, +16, +115, +246, 141, -191, -163, -129, -87, -173, -65, -203, -232, -197, +150, +27, +179, +201, +137, +227, 6, -135, -61, -220, +133, +101, +231, +11, 253, -237, -174, -251, -245, -197, -216, -22, -141, +202, 59, -2, -234, -142, -220, -77, -224, +101, 98, -233, +87, +147, +188, +210, +230, +151, +133, +111, +14, +165, +35, +227, +31, +222, +194, +141, 249, -201, +168, +144, +255, +91, +235, +74, +205, +127, +28, +105, +194, +207, +26, +164, +225, +130, +151, +56, +240, +234, +64, +218, +148, +204, +154, +100, +39, +93, +181, +221, 187, -78, -224, -12, -132, +238, +157, +217, +219, +15, +142, +106, +223, 180, -196, -229, +111, +243, +111, +223, +58, 47, -26, -98, -24, -103, +62, +249, 129, -51, -196, -207, -61, -18, -76, -205, +110, +251, +238, +202, +232, +141, +7, +7, +195, +35, +132, +209, +131, +14, +142, +186, +236, +222, +222, +154, +198, +223, +209, +192, 171, -194, 214, -177, -70, -14, -5, -2, -122, +160, +101, +244, +98, +131, +195, +30, +238, +254, +118, 215, +253, +250, +98, +108, +139, +198, 29, -17, -114, -67, -173, +1, +117, +71, +238, +38, +112, +177, +244, +252, +228, +93, +39, +112, +6, +66, +90, +226, +242, +23, +13, +49, +140, +179, +192, +25, +226, +231, +30, +9, +166, 230, -68, -27, -67, +85, 97, -37, -39, -214, -28, -12, 235, -42, -64, -67, -238, -128, +88, +35, +135, +2, +1, +189, +235, +142, +8, +185, +161, +86, +115, +162, +141, +161, +176, +146, +19, +107, +14, +134, +117, +21, +160, 33, -230, +119, +192, +16, +115, +177, +235, +4, 98, -215, -9, -196, 0, -30, -109, -17, -29, -13, -185, -43, -31, -172, -43, -119, -158, +143, +182, +136, 142, -107, -34, +134, +220, +149, +15, +214, +149, +59, 79, -105, -75, -5, -232, -13, -161, -176, -34, -118, -198, +199, +53, +145, +167, +180, +165, +2, +244, +134, 80, -28, -131, -212, -81, -61, -58, +88, +17, +59, 99, +40, +142, +65, +234, +168, +30, +157, 177, -131, +216, +65, +113, +35, +231, +108, 226, -70, -206, -217, -196, -15, -89, -242, -182, -154, -236, -237, -152, -193, -192, -119, -98, -184, +135, +44, +121, +91, +77, +246, +118, +204, +96, +224, +59, +49, +220, +235, +86, +36, +208, +28, +12, +27, +250, 215, -173, -72, -160, -57, -24, -54, +28, +138, +67, +137, +224, +47, +227, +112, 244, -175, -57, -20, -135, -18, -193, -95, -198, -225, -232, -255, -252, -229, -255, -3, -160, -52, +127, +254, +242, 255, -116, +1, +76, +174, +94, +236, }; #endif \ No newline at end of file diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index 83ebde1c4f3..35809e653e3 100644 --- a/tools/editor/editor_node.cpp +++ b/tools/editor/editor_node.cpp @@ -82,8 +82,6 @@ #include "plugins/path_2d_editor_plugin.h" #include "plugins/particles_editor_plugin.h" #include "plugins/particles_2d_editor_plugin.h" -#include "plugins/font_editor_plugin.h" -#include "plugins/animation_editor_plugin.h" #include "plugins/animation_tree_editor_plugin.h" #include "plugins/tile_set_editor_plugin.h" #include "plugins/animation_player_editor_plugin.h" @@ -94,6 +92,7 @@ #include "tools/editor/io_plugins/editor_sample_import_plugin.h" #include "tools/editor/io_plugins/editor_translation_import_plugin.h" + EditorNode *EditorNode::singleton=NULL; void EditorNode::_update_title() { @@ -2130,9 +2129,28 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) { } break; case RUN_SETTINGS: { - project_settings->popup_project_settings(); } break; + case RUN_PROJECT_MANAGER: { + + if (!p_confirmed) { + confirmation->get_ok()->set_text("Yes"); + confirmation->set_text("Open Project Manager? \n(Unsaved changes will be lost)"); + confirmation->popup_centered(Size2(300,70)); + break; + } + + get_scene()->quit(); + String exec = OS::get_singleton()->get_executable_path(); + + List args; + args.push_back ( "-path" ); + args.push_back (exec.get_base_dir() ); + + OS::ProcessID pid=0; + Error err = OS::get_singleton()->execute(exec,args,false,&pid); + ERR_FAIL_COND(err); + } break; case RUN_FILE_SERVER: { //file_server @@ -3407,6 +3425,7 @@ EditorNode::EditorNode() { p->add_item("Redo",EDIT_REDO,KEY_MASK_CMD+KEY_MASK_SHIFT+KEY_Z); p->add_separator(); p->add_item("Project Settings",RUN_SETTINGS); + p->add_item("Project Manager",RUN_PROJECT_MANAGER); p->add_separator(); p->add_item("Quit",FILE_QUIT,KEY_MASK_CMD+KEY_Q); @@ -3959,16 +3978,13 @@ EditorNode::EditorNode() { add_editor_plugin( memnew( ScriptEditorPlugin(this) ) ); add_editor_plugin( memnew( EditorHelpPlugin(this) ) ); add_editor_plugin( memnew( AnimationPlayerEditorPlugin(this) ) ); - //add_editor_plugin( memnew( AnimationEditorPlugin(this) ) ); - not useful anymore add_editor_plugin( memnew( ShaderEditorPlugin(this) ) ); add_editor_plugin( memnew( CameraEditorPlugin(this) ) ); - //add_editor_plugin( memnew( FontEditorPlugin(this) ) ); obsolete add_editor_plugin( memnew( SampleEditorPlugin(this) ) ); add_editor_plugin( memnew( SampleLibraryEditorPlugin(this) ) ); add_editor_plugin( memnew( ThemeEditorPlugin(this) ) ); add_editor_plugin( memnew( MultiMeshEditorPlugin(this) ) ); add_editor_plugin( memnew( AnimationTreeEditorPlugin(this) ) ); - //add_editor_plugin( memnew( GridMapEditorPlugin(this) ) ); add_editor_plugin( memnew( SamplePlayerEditorPlugin(this) ) ); add_editor_plugin( memnew( MeshLibraryEditorPlugin(this) ) ); add_editor_plugin( memnew( StreamEditorPlugin(this) ) ); diff --git a/tools/editor/editor_node.h b/tools/editor/editor_node.h index 41d38c1ca98..89b3917d7c7 100644 --- a/tools/editor/editor_node.h +++ b/tools/editor/editor_node.h @@ -137,6 +137,7 @@ class EditorNode : public Node { RUN_PLAY_CUSTOM_SCENE, RUN_SCENE_SETTINGS, RUN_SETTINGS, + RUN_PROJECT_MANAGER, RUN_FILE_SERVER, RUN_DEPLOY_DUMB_CLIENTS, SETTINGS_UPDATE_ALWAYS, diff --git a/tools/editor/io_plugins/editor_texture_import_plugin.cpp b/tools/editor/io_plugins/editor_texture_import_plugin.cpp index 7c506a33b79..2e6e7551369 100644 --- a/tools/editor/io_plugins/editor_texture_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_texture_import_plugin.cpp @@ -150,6 +150,11 @@ void EditorImportTextureOptions::_notification(int p_what) { } } +void EditorImportTextureOptions::show_2d_notice() { + + notice_for_2d->show(); +} + EditorImportTextureOptions::EditorImportTextureOptions() { @@ -206,6 +211,14 @@ EditorImportTextureOptions::EditorImportTextureOptions() { add_margin_child("Texture Options",flags,true); + + notice_for_2d = memnew( Label ); + notice_for_2d->set_text("NOTICE: You are not forced to import textures for 2D projects. Just copy your .jpg or .png files to your project, and change export options later. Atlases can be generated on export too."); + notice_for_2d->set_custom_minimum_size(Size2(0,50)); + notice_for_2d->set_autowrap(true); + add_child(notice_for_2d); + notice_for_2d->hide(); + } /////////////////////////////////////////////////////////// @@ -530,6 +543,7 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); texture_options->set_quality(0.7); texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY); + texture_options->show_2d_notice(); set_title("Import Textures for Atlas (2D)"); } else if (p_2d) { @@ -537,6 +551,7 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); texture_options->set_quality(0.7); texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY); + texture_options->show_2d_notice(); set_title("Import Textures for 2D"); } else { diff --git a/tools/editor/io_plugins/editor_texture_import_plugin.h b/tools/editor/io_plugins/editor_texture_import_plugin.h index 1c4df1a4de7..4a9dd6ae9da 100644 --- a/tools/editor/io_plugins/editor_texture_import_plugin.h +++ b/tools/editor/io_plugins/editor_texture_import_plugin.h @@ -116,6 +116,7 @@ class EditorImportTextureOptions : public VBoxContainer { HSlider *quality; Tree *flags; Vector items; + Label *notice_for_2d; bool updating; @@ -140,6 +141,8 @@ public: void set_quality(float p_quality); float get_quality() const; + void show_2d_notice(); + EditorImportTextureOptions(); diff --git a/tools/editor/plugins/animation_editor_plugin.cpp b/tools/editor/plugins/animation_editor_plugin.cpp deleted file mode 100644 index bd27fa7da6a..00000000000 --- a/tools/editor/plugins/animation_editor_plugin.cpp +++ /dev/null @@ -1,806 +0,0 @@ -/*************************************************************************/ -/* animation_editor_plugin.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "animation_editor_plugin.h" -#include "io/resource_loader.h" - - -class AnimationEditor_TrackEditor : public Object { - - OBJ_TYPE(AnimationEditor_TrackEditor,Object); - -protected: - - bool _set(const StringName& p_name, const Variant& p_value) { - - if (anim.is_null()) - return false; - String name=p_name; - - if (name=="track/interpolation") { - - anim_editor->_internal_set_interpolation_type(track,Animation::InterpolationType(p_value.operator int())); - - } else if (name.begins_with("keys/")) { - - int key = name.get_slice("/",1).to_int(); - ERR_FAIL_INDEX_V( key,anim->track_get_key_count(track), false ); - String what = name.get_slice("/",2); - float time = anim->track_get_key_time(track,key); - float transition = anim->track_get_key_transition(track,key); - - if (what=="time") { - Variant v = anim->track_get_key_value(track,key); - anim_editor->_internal_set_key(track,time,transition,v); - return true; - } - if (what=="transition") { - transition=p_value; - Variant v = anim->track_get_key_value(track,key); - anim_editor->_internal_set_key(track,time,transition,v); - return true; - } - - switch(anim->track_get_type(track)) { - - case Animation::TYPE_TRANSFORM: { - - Vector3 scale,loc; - Quat rot; - anim->transform_track_get_key(track,key,&loc,&rot,&scale); - - - if (what=="loc") { - loc=p_value; - } else if (what=="scale") { - scale=p_value; - } else if (what=="rot") { - rot=p_value; - } else { - return false; //meh - } - - Dictionary k; - k["rot"]=rot; - k["loc"]=loc; - k["scale"]=scale; - anim_editor->_internal_set_key(track,time,transition,k); - - } break; - case Animation::TYPE_METHOD: { - - } break; - case Animation::TYPE_VALUE: { - - if (what=="value") - anim_editor->_internal_set_key(track,time,transition,p_value); - } break; - default: { return false; } - - } - - } else - return false; - - return true; - } - - bool _get(const StringName& p_name,Variant &r_ret) const { - - if (anim.is_null()) - return false; - String name=p_name; - - if (name=="track/interpolation") { - - r_ret=anim->track_get_interpolation_type(track); - - } else if (name.begins_with("keys/")) { - - int key = name.get_slice("/",1).to_int(); - ERR_FAIL_INDEX_V( key,anim->track_get_key_count(track), Variant() ); - String what = name.get_slice("/",2); - - if (what=="time") { - r_ret=anim->track_get_key_time(track,key); - return true; - } - - if (what=="transition") { - r_ret=anim->track_get_key_transition(track,key); - return true; - } - - switch(anim->track_get_type(track)) { - - case Animation::TYPE_TRANSFORM: { - - Vector3 scale,loc; - Quat rot; - anim->transform_track_get_key(track,key,&loc,&rot,&scale); - - - if (what=="loc") { - r_ret= loc; - } else if (what=="scale") { - r_ret= scale; - } else if (what=="rot") { - r_ret= rot; - } - - } break; - case Animation::TYPE_METHOD: { - - } break; - case Animation::TYPE_VALUE: { - - if (what=="value") - r_ret= anim->track_get_key_value(track,key); - } break; - default: { return false; } - - } - } else - return false; - - return true; - } - void _get_property_list( List *p_list) const { - - p_list->push_back(PropertyInfo(Variant::INT,"track/interpolation",PROPERTY_HINT_ENUM,"Nearest,Linear,Cubic") ); - - if (anim.is_null()) - return; - - int keycount = anim->track_get_key_count(track); - - for(int i=0;ipush_back(PropertyInfo(Variant::REAL,"keys/"+itos(i)+"/time",PROPERTY_HINT_RANGE,"0,3600,0.001") ); - p_list->push_back(PropertyInfo(Variant::REAL,"keys/"+itos(i)+"/transition",PROPERTY_HINT_EXP_EASING) ); - switch(anim->track_get_type(track)) { - - case Animation::TYPE_TRANSFORM: { - - p_list->push_back(PropertyInfo(Variant::VECTOR3,"keys/"+itos(i)+"/loc" ) ); - p_list->push_back(PropertyInfo(Variant::QUAT,"keys/"+itos(i)+"/rot" ) ); - p_list->push_back(PropertyInfo(Variant::VECTOR3,"keys/"+itos(i)+"/scale" ) ); - - } break; - case Animation::TYPE_METHOD: { - - } break; - case Animation::TYPE_VALUE: { - - - Variant v = anim->track_get_key_value(track,i); - - PropertyHint hint=PROPERTY_HINT_NONE; - String hint_string; - if (v.get_type()==Variant::INT) { - hint=PROPERTY_HINT_RANGE; - hint_string="-16384,16384,1"; - } else if (v.get_type()==Variant::REAL) { - hint=PROPERTY_HINT_RANGE; - hint_string="-16384,16384,0.001"; - } else if (v.get_type()==Variant::OBJECT) { - hint=PROPERTY_HINT_RESOURCE_TYPE; - hint_string="Resource"; - } - - - - p_list->push_back(PropertyInfo(v.get_type(),"keys/"+itos(i)+"/value",hint,hint_string ) ); - - - - } break; - - } - } - - } - -public: - - AnimationEditor *anim_editor; - - Ref anim; - int track; - AnimationEditor_TrackEditor() { } - -}; - - -void AnimationEditor::update_anim() { - - tracks->clear(); - key_editor->edit(NULL); - TreeItem *root = tracks->create_item(NULL); - - TreeItem *sel=NULL; - int selected_track=-1; - if (animation->has_meta("_anim_editor_selected_track_")) - selected_track=animation->get_meta("_anim_editor_selected_track_"); - - for(int i=0;iget_track_count();i++) { - - String path = animation->track_get_path(i); - TreeItem *track = tracks->create_item(root); - track->set_text(0,itos(i)); - track->set_editable(0,false); - track->set_text(1,path); - track->set_editable(1,true); - track->set_metadata(0,i); - if (selected_track==i) - sel=track; - - switch(animation->track_get_type(i)) { - - case Animation::TYPE_TRANSFORM: { - - track->set_icon(0,get_icon("Matrix","EditorIcons")); - - } break; - case Animation::TYPE_METHOD: { - track->set_icon(0,get_icon("TrackMethod","EditorIcons")); - } break; - case Animation::TYPE_VALUE: { - - track->set_icon(0,get_icon("TrackValue","EditorIcons")); - } break; - - - } - - } - - if (sel) { - sel->select(1); - _update_track_keys(); - } else { - selected_track=-1; - } -} - -void AnimationEditor::_update_track_keys() { - if (selected_track<0 || selected_track>=animation->get_track_count()) - return; - track_editor->anim=animation; - track_editor->track=selected_track; - key_editor->edit(NULL); - key_editor->edit(track_editor); - - if (animation->track_get_type(selected_track)==Animation::TYPE_VALUE) { - key_time->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,160); - key_type->show(); - } else { - key_time->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,60); - key_type->hide(); - } - - -} - -void AnimationEditor::_track_path_changed() { - - TreeItem *ti=tracks->get_edited(); - int track=ti->get_metadata(0); - String path=ti->get_text(1); - if (track<0 || track>=animation->get_track_count()) - return; - undo_redo->create_action("Create Anim Track"); - undo_redo->add_do_method(animation.ptr(),"track_set_path",track,path); - undo_redo->add_undo_method(animation.ptr(),"track_set_path",track,animation->track_get_path(track)); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - -} - -void AnimationEditor::_track_selected() { - - TreeItem *ti=tracks->get_selected(); - if(!ti) - return; - selected_track=ti->get_metadata(0); - animation->set_meta("_anim_editor_selected_track_",selected_track); - _update_track_keys(); -} - -void AnimationEditor::_track_added() { - - undo_redo->create_action("Create Anim Track"); - undo_redo->add_do_method(animation.ptr(),"add_track",track_type->get_selected(),-1); - undo_redo->add_undo_method(animation.ptr(),"remove_track",animation->get_track_count()); - undo_redo->add_do_method(this,"_internal_set_selected_track",animation->get_track_count(),animation); - undo_redo->add_undo_method(this,"_internal_set_selected_track",selected_track,animation); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - update_anim(); -} - -void AnimationEditor::_track_removed() { - - if (selected_track<0 || selected_track>=animation->get_track_count()) - return; - - undo_redo->create_action("Remove Anim Track"); - undo_redo->add_do_method(animation.ptr(),"remove_track",selected_track); - undo_redo->add_undo_method(animation.ptr(),"add_track",animation->track_get_type(selected_track),selected_track); - undo_redo->add_undo_method(animation.ptr(),"track_set_path",selected_track,animation->track_get_path(selected_track)); - //todo interpolation - for(int i=0;itrack_get_key_count(selected_track);i++) { - - Variant v = animation->track_get_key_value(selected_track,i); - float time = animation->track_get_key_time(selected_track,i); - - undo_redo->add_undo_method(animation.ptr(),"track_insert_key",selected_track,time,v); - - } - - int old_track=selected_track; - if (selected_track>0) - selected_track--; - if (selected_track<0 || selected_track>=(animation->get_track_count()-1)) - selected_track=-1; - - undo_redo->add_do_method(this,"_internal_set_selected_track",selected_track,animation); - undo_redo->add_undo_method(this,"_internal_set_selected_track",old_track,animation); - - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - -} - -void AnimationEditor::_internal_set_interpolation_type(int p_track,Animation::InterpolationType p_type) { - - undo_redo->create_action("Set Interpolation"); - undo_redo->add_do_method(animation.ptr(),"track_set_interpolation_type",p_track,p_type); - undo_redo->add_undo_method(animation.ptr(),"track_set_interpolation_type",p_track,animation->track_get_interpolation_type(p_track)); - undo_redo->add_do_method(this,"_internal_set_selected_track",selected_track,animation); - undo_redo->add_undo_method(this,"_internal_set_selected_track",selected_track,animation); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - -} - -void AnimationEditor::_internal_set_selected_track(int p_which,const Ref& p_anim) { - - if (is_visible() && animation==p_anim) { - selected_track=p_which; - animation->set_meta("_anim_editor_selected_track_",selected_track); - } -} - -void AnimationEditor::_track_moved_up() { - - - if (selected_track<0 || selected_track>=animation->get_track_count()) - return; - - if (selected_track<(animation->get_track_count()-1)) { - undo_redo->create_action("Move Up Track"); - undo_redo->add_do_method(animation.ptr(),"track_move_up",selected_track); - undo_redo->add_undo_method(animation.ptr(),"track_move_down",selected_track+1); - undo_redo->add_do_method(this,"_internal_set_selected_track",selected_track+1,animation); - undo_redo->add_undo_method(this,"_internal_set_selected_track",selected_track,animation); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - } -} - -void AnimationEditor::_track_moved_down() { - - - - if (selected_track<0 || selected_track>=animation->get_track_count()) - return; - if (selected_track>0) { - undo_redo->create_action("Move Down Track"); - undo_redo->add_do_method(animation.ptr(),"track_move_down",selected_track); - undo_redo->add_undo_method(animation.ptr(),"track_move_up",selected_track-1); - undo_redo->add_do_method(this,"_internal_set_selected_track",selected_track-1,animation); - undo_redo->add_undo_method(this,"_internal_set_selected_track",selected_track,animation); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - } - - -} - -void AnimationEditor::_key_added() { - - if (selected_track<0 || selected_track>=animation->get_track_count()) - return; - - bool need_variant= animation->track_get_type(selected_track)==Animation::TYPE_VALUE; - - Variant v; - - if (need_variant) { - - switch(key_type->get_selected()) { - - case Variant::NIL: v=Variant(); break; - case Variant::BOOL: v=false; break; - case Variant::INT: v=0; break; - case Variant::REAL: v=0.0; break; - case Variant::STRING: v=""; break; - case Variant::VECTOR2: v=Vector2(); break; // 5 - case Variant::RECT2: v=Rect2(); break; - case Variant::VECTOR3: v=Vector3(); break; - case Variant::PLANE: v=Plane(); break; - case Variant::QUAT: v=Quat(); break; - case Variant::_AABB: v=AABB(); break; //sorry naming convention fail :( not like it's used often // 10 - case Variant::MATRIX3: v=Matrix3(); break; - case Variant::TRANSFORM: v=Transform(); break; - case Variant::COLOR: v=Color(); break; - case Variant::IMAGE: v=Image(); break; - case Variant::NODE_PATH: v=NodePath(); break; // 15 - case Variant::_RID: v=RID(); break; - case Variant::OBJECT: v=Variant(); break; - case Variant::INPUT_EVENT: v=InputEvent(); break; - case Variant::DICTIONARY: v=Dictionary(); break; // 20 - case Variant::ARRAY: v=Array(); break; - case Variant::RAW_ARRAY: v=DVector(); break; - case Variant::INT_ARRAY: v=DVector(); break; - case Variant::REAL_ARRAY: v=DVector(); break; - case Variant::STRING_ARRAY: v=DVector(); break; //25 - case Variant::VECTOR3_ARRAY: v=DVector(); break; - case Variant::COLOR_ARRAY: v=DVector(); break; - default: v=Variant(); break; - } - } - - float time = key_time->get_text().to_double(); - - switch(animation->track_get_type(selected_track)) { - case Animation::TYPE_TRANSFORM: { - - Dictionary d; - d["loc"]=Vector3(); - d["rot"]=Quat(); - d["scale"]=Vector3(1,1,1); - v=d; - - } break; - case Animation::TYPE_VALUE: { - //v=v - } break; - case Animation::TYPE_METHOD: { - - return; //not do anything yet - } break; - } - - _internal_set_key(selected_track,time,1.0,v); - - _update_track_keys(); -} - - - -void AnimationEditor::_internal_check_update(Ref p_anim) { - - if (is_visible() && p_anim==animation) { - update_anim(); - } -} - -void AnimationEditor::_internal_set_key(int p_track, float p_time, float p_transition,const Variant& p_value) { - - int prev = animation->track_find_key(p_track,p_time); - bool existing = (prev>=0) && (animation->track_get_key_time(p_track,prev)==p_time); - - undo_redo->create_action("Insert Key"); - - undo_redo->add_do_method(animation.ptr(),"track_insert_key",p_track,p_time,p_value,p_transition); - if (existing) - undo_redo->add_undo_method(animation.ptr(),"track_insert_key",p_track,p_time,animation->track_get_key_value(p_track,existing),animation->track_get_key_transition(p_track,existing)); - else - undo_redo->add_undo_method(animation.ptr(),"track_remove_key",p_track,prev+1); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - - undo_redo->commit_action(); -} - -void AnimationEditor::_key_removed() { - - if (selected_track<0 || selected_track>=animation->get_track_count()) - return; - - String sel=key_editor->get_selected_path(); - if (sel.get_slice_count("/")<2) - return; - if (sel.get_slice("/",0)!="keys") - return; - int key = sel.get_slice("/",1).to_int(); - if (key<0 || key>=animation->track_get_key_count(selected_track)) - return; - - - undo_redo->create_action("Remove Key"); - - Variant data = animation->track_get_key_value(selected_track,key); - float time = animation->track_get_key_time(selected_track,key); - undo_redo->add_do_method(animation.ptr(),"track_remove_key",selected_track,key); - undo_redo->add_undo_method(animation.ptr(),"track_insert_key",selected_track,time,data); - undo_redo->add_do_method(this,"_internal_check_update",animation); - undo_redo->add_undo_method(this,"_internal_check_update",animation); - undo_redo->commit_action(); - - _update_track_keys(); -} - - - -void AnimationEditor::edit(const Ref& p_animation) { - - - animation=p_animation; - if (!animation.is_null()) - update_anim(); - - -} - - - -void AnimationEditor::_bind_methods() { - - ObjectTypeDB::bind_method(_MD("_track_selected"),&AnimationEditor::_track_selected); - ObjectTypeDB::bind_method(_MD("_track_added"),&AnimationEditor::_track_added); - ObjectTypeDB::bind_method(_MD("_track_removed"),&AnimationEditor::_track_removed); - ObjectTypeDB::bind_method(_MD("_track_moved_up"),&AnimationEditor::_track_moved_up); - ObjectTypeDB::bind_method(_MD("_track_moved_down"),&AnimationEditor::_track_moved_down); - ObjectTypeDB::bind_method(_MD("_track_path_changed"),&AnimationEditor::_track_path_changed); - ObjectTypeDB::bind_method(_MD("_key_added"),&AnimationEditor::_key_added); - ObjectTypeDB::bind_method(_MD("_key_removed"),&AnimationEditor::_key_removed); - ObjectTypeDB::bind_method(_MD("_internal_check_update"),&AnimationEditor::_internal_check_update); - ObjectTypeDB::bind_method(_MD("_internal_set_selected_track"),&AnimationEditor::_internal_set_selected_track); - -} - -void AnimationEditor::_notification(int p_what) { - - switch(p_what) { - - case NOTIFICATION_ENTER_SCENE: { - - add_track->set_icon( get_icon("Add","EditorIcons") ); - remove_track->set_icon( get_icon("Del","EditorIcons") ); - move_up_track->set_icon( get_icon("Up","EditorIcons") ); - move_down_track->set_icon( get_icon("Down","EditorIcons") ); - time_icon->set_texture( get_icon("Time","EditorIcons") ); - - add_key->set_icon( get_icon("Add","EditorIcons") ); - remove_key->set_icon( get_icon("Del","EditorIcons") ); - - } break; - } -} - -AnimationEditor::AnimationEditor() { - - panel = memnew( Panel ); - add_child(panel); - panel->set_area_as_parent_rect(); - - Control *left_pane = memnew( Control ); - panel->add_child(left_pane); - left_pane->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5); - left_pane->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,0); - - Label *l = memnew( Label ); - l->set_text("Track List:"); - l->set_pos(Point2(5,5)); - left_pane->add_child(l); - - /* - track_name = memnew( LineEdit ); - track_name->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,10); - track_name->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - track_name->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,80); - track_name->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - left_pane->add_child(track_name); -*/ - - track_type = memnew( OptionButton ); - track_type->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,10); - track_type->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - track_type->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,115); - track_type->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - left_pane->add_child(track_type); - track_type->add_item("Transform",Animation::TYPE_TRANSFORM); - track_type->add_item("Value",Animation::TYPE_VALUE); - track_type->add_item("Method",Animation::TYPE_METHOD); - - - add_track = memnew( Button ); - add_track->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,110); - add_track->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - add_track->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,90); - add_track->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - left_pane->add_child(add_track); - - remove_track = memnew( Button ); - remove_track->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,85); - remove_track->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - remove_track->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,60); - remove_track->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - left_pane->add_child(remove_track); - - move_up_track = memnew( Button ); - move_up_track->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,55); - move_up_track->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - move_up_track->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,30); - move_up_track->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - left_pane->add_child(move_up_track); - - move_down_track = memnew( Button ); - move_down_track->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,25); - move_down_track->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - move_down_track->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,0); - move_down_track->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - left_pane->add_child(move_down_track); - - tracks = memnew(Tree); - tracks->set_columns(2); - tracks->set_column_expand(0,false); - tracks->set_column_min_width(0,55); - tracks->set_column_expand(1,true); - tracks->set_column_min_width(1,100); - tracks->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,55); - tracks->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,0); - tracks->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,10); - tracks->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,5); - tracks->set_hide_root(true); - left_pane->add_child(tracks); - - - Control *right_pane = memnew( Control ); - panel->add_child(right_pane); - right_pane->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_RATIO,0.5); - right_pane->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5); - right_pane->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,0); - - l = memnew( Label ); - l->set_text("Track Keys:"); - l->set_pos(Point2(5,5)); - right_pane->add_child(l); - - time_icon = memnew( TextureFrame ); - time_icon->set_pos(Point2(8,28)); - right_pane->add_child(time_icon); - - key_time = memnew( LineEdit ); - key_time->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,24); - key_time->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,160); - key_time->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - key_time->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - key_time->set_text("0.0"); - right_pane->add_child(key_time); - - key_type = memnew( OptionButton ); - key_type->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,160); - key_type->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,60); - key_type->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - key_type->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - right_pane->add_child(key_type); - - for(int i=0;iadd_item(Variant::get_type_name(Variant::Type(i))); - } - - add_key = memnew( Button ); - add_key->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,55); - add_key->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,30); - add_key->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - add_key->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - right_pane->add_child(add_key); - - remove_key = memnew( Button ); - remove_key->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,25); - remove_key->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,0); - remove_key->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,25); - remove_key->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,45); - right_pane->add_child(remove_key); - - key_editor = memnew(PropertyEditor); - key_editor->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,55); - key_editor->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,0); - key_editor->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,10); - key_editor->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,5); - key_editor->hide_top_label(); - - right_pane->add_child(key_editor); - - track_editor = memnew( AnimationEditor_TrackEditor ); - track_editor->anim_editor=this; - selected_track=-1; - - add_track->connect("pressed", this,"_track_added"); - remove_track->connect("pressed", this,"_track_removed"); - move_up_track->connect("pressed", this,"_track_moved_up"); - move_down_track->connect("pressed", this,"_track_moved_down"); - tracks->connect("cell_selected", this,"_track_selected"); - tracks->connect("item_edited", this,"_track_path_changed"); - add_key->connect("pressed", this,"_key_added"); - remove_key->connect("pressed", this,"_key_removed"); -} - -AnimationEditor::~AnimationEditor() { - - memdelete(track_editor); -} - -void AnimationEditorPlugin::edit(Object *p_node) { - - animation_editor->set_undo_redo(&get_undo_redo()); - if (p_node && p_node->cast_to()) { - animation_editor->edit( p_node->cast_to() ); - animation_editor->show(); - } else - animation_editor->hide(); -} - -bool AnimationEditorPlugin::handles(Object *p_node) const{ - - return p_node->is_type("Animation"); -} - -void AnimationEditorPlugin::make_visible(bool p_visible){ - - if (p_visible) - animation_editor->show(); - else - animation_editor->hide(); -} - -AnimationEditorPlugin::AnimationEditorPlugin(EditorNode *p_node) { - - animation_editor = memnew( AnimationEditor ); - - p_node->get_viewport()->add_child(animation_editor); - animation_editor->set_area_as_parent_rect(); - animation_editor->hide(); - - - - -} - - diff --git a/tools/editor/plugins/animation_editor_plugin.h b/tools/editor/plugins/animation_editor_plugin.h deleted file mode 100644 index 82edef75638..00000000000 --- a/tools/editor/plugins/animation_editor_plugin.h +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************/ -/* animation_editor_plugin.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef ANIMATION_EDITOR_PLUGIN_H -#define ANIMATION_EDITOR_PLUGIN_H - -#include "scene/resources/animation.h" -#include "scene/gui/texture_frame.h" -#include "scene/gui/option_button.h" -#include "tools/editor/editor_node.h" -#include "tools/editor/property_editor.h" -#include "undo_redo.h" -class AnimationEditor_TrackEditor; - -class AnimationEditor : public Control { - - OBJ_TYPE( AnimationEditor, Control ); - - Panel *panel; - Ref animation; - - Button *add_track; - Button *remove_track; - Button *move_up_track; - Button *move_down_track; - - Button *add_key; - Button *remove_key; - - LineEdit *key_time; - OptionButton *track_type; - OptionButton *key_type; - TextureFrame *time_icon; - - Tree *tracks; - PropertyEditor *key_editor; - AnimationEditor_TrackEditor *track_editor; - int selected_track; - - void _track_selected(); - void _track_added(); - void _track_removed(); - void _track_moved_up(); - void _track_moved_down(); - void _track_path_changed(); - - void _key_added(); - void _key_removed(); - - - void _update_track_keys(); - void update_anim(); - - UndoRedo *undo_redo; - - void _internal_set_selected_track(int p_which,const Ref& p_anim); - void _internal_check_update(Ref p_anim); - -friend class AnimationEditor_TrackEditor; - void _internal_set_key(int p_track, float p_time, float p_transition,const Variant& p_value); - void _internal_set_interpolation_type(int p_track,Animation::InterpolationType p_type); - -protected: - void _notification(int p_what); - static void _bind_methods(); -public: - - void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo=p_undo_redo; } - void edit(const Ref& p_animation); - - AnimationEditor(); - ~AnimationEditor(); -}; - - - -class AnimationEditorPlugin : public EditorPlugin { - - OBJ_TYPE( AnimationEditorPlugin, EditorPlugin ); - - AnimationEditor *animation_editor; - EditorNode *editor; - -public: - - - virtual String get_name() const { return "Animation"; } - bool has_main_screen() const { return false; } - virtual void edit(Object *p_node); - virtual bool handles(Object *p_node) const; - virtual void make_visible(bool p_visible); - - AnimationEditorPlugin(EditorNode *p_node); - -}; - - -#endif diff --git a/tools/editor/plugins/font_editor_plugin.cpp b/tools/editor/plugins/font_editor_plugin.cpp deleted file mode 100644 index d8522695912..00000000000 --- a/tools/editor/plugins/font_editor_plugin.cpp +++ /dev/null @@ -1,905 +0,0 @@ -/*************************************************************************/ -/* font_editor_plugin.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "font_editor_plugin.h" -#include "os/file_access.h" -#ifdef FREETYPE_ENABLED - -#include -#include FT_FREETYPE_H - -#endif - -#include "core/io/resource_saver.h" - -void FontEditor::edit(const Ref& p_font) { - - font=p_font; - label->add_font_override("font",font); -} - -void FontEditor::_preview_text_changed(const String& p_text) { - - label->set_text(p_text); -} -struct FontData { - - Vector bitmap; - int width,height; - int ofs_x; //ofset to center, from ABOVE - int ofs_y; //ofset to begining, from LEFT - int valign; //vertical alignment - int halign; - int advance; - int character; - int glyph; - - int texture; -// bool printable; - -}; - - -struct FontDataSort { - - bool operator()(const FontData *p_A,const FontData *p_B) const { - return p_A->height > p_B->height; - }; -}; - -struct KerningKey { - - CharType A,B; - bool operator<(const KerningKey& p_k) const { return (A==p_k.A)?(B p_font) { - - String fnt_name = p_name + ".fnt"; - FileAccess* f = FileAccess::open(fnt_name, FileAccess::WRITE); - ERR_FAIL_COND(!f); - - f->store_string(String("info face=\"") + p_font->get_name() + "\" size=" + String::num_real(font->get_height()) + " bold=0 italic=0 charset=\"\" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=4,4\n"); - - Vector2 size = p_font->get_texture(0)->get_size(); - f->store_string(String("common lineHeight=") + String::num(font->get_height()) + " base=" + String::num(font->get_ascent()) + " scaleW=" + String::num(size.x) + " scaleH=" + String::num(size.y) + " pages="+String::num(p_font->get_texture_count()) + " packed=0\n"); - - for (int i=0; iget_texture_count(); i++) { - - f->store_string(String("page id=")+String::num(i)+ " file=\""+ p_name.get_file() + "_" +String::num(i)+".png\"\n"); - }; - - f->store_string(String("chars count=")+String::num(p_font->get_character_count()) + "\n"); - - Vector keys = p_font->get_char_keys(); - keys.sort(); - for (int i=0; iget_character(keys[i]); - int width = c.rect.size.x; - if (keys[i] == 32) { - width = c.advance; - }; - f->store_string(String("char id=") + String::num(keys[i]) + " x=" + String::num(c.rect.pos.x) + " y=" + String::num(c.rect.pos.y) + - " width=" + String::num(width) + " height=" + String::num(c.rect.size.y) + - " xoffset=" + String::num(c.h_align) + " yoffset=" + String::num(c.v_align) + - " xadvance=" + String::num(c.advance) + " page=" + String::num(c.texture_idx) + - " chnl=0 letter=\"\"\n"); - }; - - f->close(); - - for (int i=0; iget_texture_count(); i++) { - - ResourceSaver::save(p_name + "_" + String::num(i) + ".png", p_font->get_texture(i)); - }; -}; - -void FontEditor::_import_fnt(const String& p_string) { - //fnt format used by angelcode bmfont - //http://www.angelcode.com/products/bmfont/ - - FileAccess *f = FileAccess::open(p_string,FileAccess::READ); - - if (!f) { - - ERR_EXPLAIN("Can't open font: "+p_string); - ERR_FAIL(); - } - - - font->clear(); - - while(true) { - - String line=f->get_line(); - - int delimiter=line.find(" "); - String type=line.substr(0,delimiter); - int pos = delimiter+1; - Map keys; - - while (pos < line.size() && line[pos]==' ') - pos++; - - - while(posset_name(keys["face"]); - //if (keys.has("size")) - // font->set_height(keys["size"].to_int()); - - } else if (type=="common") { - - if (keys.has("lineHeight")) - font->set_height(keys["lineHeight"].to_int()); - if (keys.has("base")) - font->set_ascent(keys["base"].to_int()); - - } else if (type=="page") { - - if (keys.has("file")) { - - String file = keys["file"]; - file=p_string.get_base_dir()+"/"+file; - Ref tex = ResourceLoader::load(file); - if (tex.is_null()) { - ERR_PRINT("Can't load font texture!"); - } else { - font->add_texture(tex); - } - } - } else if (type=="char") { - - CharType idx=0; - if (keys.has("id")) - idx=keys["id"].to_int(); - - Rect2 rect; - - if (keys.has("x")) - rect.pos.x=keys["x"].to_int(); - if (keys.has("y")) - rect.pos.y=keys["y"].to_int(); - if (keys.has("width")) - rect.size.width=keys["width"].to_int(); - if (keys.has("height")) - rect.size.height=keys["height"].to_int(); - - Point2 ofs; - - if (keys.has("xoffset")) - ofs.x=keys["xoffset"].to_int(); - if (keys.has("yoffset")) - ofs.y=keys["yoffset"].to_int(); - - int texture=0; - if (keys.has("page")) - texture=keys["page"].to_int(); - int advance=-1; - if (keys.has("xadvance")) - advance=keys["xadvance"].to_int(); - - font->add_char(idx,texture,rect,ofs,advance); - - } else if (type=="kerning") { - - CharType first=0,second=0; - int k=0; - - if (keys.has("first")) - first=keys["first"].to_int(); - if (keys.has("second")) - second=keys["second"].to_int(); - if (keys.has("amount")) - k=keys["amount"].to_int(); - - font->add_kerning_pair(first,second,-k); - - } - - if (f->eof_reached()) - break; - } - - - - memdelete(f); - - - -} - -void FontEditor::_import_ttf(const String& p_string) { - -#ifdef FREETYPE_ENABLED - FT_Library library; /* handle to library */ - FT_Face face; /* handle to face object */ - - Vector font_data_list; - - int error = FT_Init_FreeType( &library ); - - ERR_EXPLAIN("Error initializing FreeType."); - ERR_FAIL_COND( error !=0 ); - - - error = FT_New_Face( library, p_string.utf8().get_data(),0,&face ); - - if ( error == FT_Err_Unknown_File_Format ) { - ERR_EXPLAIN("Unknown font format."); - FT_Done_FreeType( library ); - } else if ( error ) { - - ERR_EXPLAIN("Error loading font."); - FT_Done_FreeType( library ); - - } - - ERR_FAIL_COND(error); - - - int height=0; - int ascent=0; - int font_spacing=0; - - int size=font_size->get_text().to_int(); - - error = FT_Set_Char_Size(face,0,64*size,512,512); - - if ( error ) { - FT_Done_FreeType( library ); - ERR_EXPLAIN("Invalid font size. "); - ERR_FAIL_COND( error ); - - } - - error = FT_Set_Pixel_Sizes(face,0,size); - - FT_GlyphSlot slot = face->glyph; - -// error = FT_Set_Charmap(face,ft_encoding_unicode ); /* encoding.. */ - - - /* PRINT CHARACTERS TO INDIVIDUAL BITMAPS */ - - -// int space_size=5; //size for space, if none found.. 5! -// int min_valign=500; //some ridiculous number - - FT_ULong charcode; - FT_UInt gindex; - - int max_up=-1324345; ///gibberish - int max_down=124232; - - Map kerning_map; - - charcode = FT_Get_First_Char( face, &gindex ); - - int xsize=0; - while ( gindex != 0 ) - { - - bool skip=false; - error = FT_Load_Char( face, charcode, FT_LOAD_RENDER ); - if (error) skip=true; - else error = FT_Render_Glyph( face->glyph, ft_render_mode_normal ); - if (error) skip=true; - - - if (!skip && (import_chars.has(charcode) && import_chars[charcode] != 0)) { - - skip = false; - - } else { - if (import_option->get_selected() == 0 && charcode>127) - skip=true; - if (import_option->get_selected() == 1 && charcode>0xFE) - skip=true; - }; - - if (charcode<=32) // - skip=true; - - if (skip) { - charcode=FT_Get_Next_Char(face,charcode,&gindex); - continue; - } - - FontData * fdata = memnew( FontData ); - fdata->bitmap.resize( slot->bitmap.width*slot->bitmap.rows ); - fdata->width=slot->bitmap.width; - fdata->height=slot->bitmap.rows; - fdata->character=charcode; - fdata->glyph=FT_Get_Char_Index(face,charcode); - if (charcode=='x') - xsize=slot->bitmap.width; - - - if (charcode<127) { - if (slot->bitmap_top>max_up) { - - max_up=slot->bitmap_top; - } - - - if ( (slot->bitmap_top - fdata->height)bitmap_top - fdata->height; - } - } - - - fdata->valign=slot->bitmap_top; - fdata->halign=slot->bitmap_left; - fdata->advance=(slot->advance.x+(1<<5))>>6; - fdata->advance+=font_spacing; - - for (int i=0;ibitmap.width;i++) { - for (int j=0;jbitmap.rows;j++) { - - fdata->bitmap[j*slot->bitmap.width+i]=slot->bitmap.buffer[j*slot->bitmap.width+i]; - } - } - - font_data_list.push_back(fdata); - charcode=FT_Get_Next_Char(face,charcode,&gindex); -// printf("reading char %i\n",charcode); - } - - /* SPACE */ - - FontData *spd = memnew( FontData ); - spd->advance=0; - spd->character=' '; - spd->halign=0; - spd->valign=0; - spd->width=0; - spd->height=0; - spd->ofs_x=0; - spd->ofs_y=0; - - if (!FT_Load_Char( face, ' ', FT_LOAD_RENDER ) && !FT_Render_Glyph( face->glyph, ft_render_mode_normal )) { - - spd->advance = slot->advance.x>>6; - spd->advance+=font_spacing; - } else { - - spd->advance=xsize; - spd->advance+=font_spacing; - } - - font_data_list.push_back(spd); - - Map exported; - for (int i=0; icharacter] = true; - }; - int missing = 0; - for(Map::Element *E=import_chars.front();E;E=E->next()) { - CharType c = E->key(); - if (!exported.has(c)) { - CharType str[2] = {c, 0}; - printf("** Warning: character %i (%ls) not exported\n", (int)c, str); - ++missing; - }; - }; - printf("total %i/%i\n", missing, import_chars.size()); - - /* KERNING */ - - - for(int i=0;iglyph,font_data_list[j]->glyph, FT_KERNING_DEFAULT, &delta ); - - if (delta.x!=0) { - - KerningKey kpk; - kpk.A = font_data_list[i]->character; - kpk.B = font_data_list[j]->character; - int kern = ((-delta.x)+(1<<5))>>6; - - if (kern==0) - continue; - kerning_map[kpk]=kern; - } - } - } - - height=max_up-max_down; - ascent=max_up; - - /* FIND OUT WHAT THE FONT HEIGHT FOR THIS IS */ - - /* ADJUST THE VALIGN FOR EACH CHARACTER */ - - for (int i=0;i<(int)font_data_list.size();i++) { - - font_data_list[i]->valign=max_up-font_data_list[i]->valign; - } - - - - /* ADD THE SPACEBAR CHARACTER */ -/* - FontData * fdata = new FontData; - - fdata->character=32; - fdata->bitmap=0; - fdata->width=xsize; - fdata->height=1; - fdata->valign=0; - - font_data_list.push_back(fdata); -*/ - /* SORT BY HEIGHT, SO THEY FIT BETTER ON THE TEXTURE */ - - font_data_list.sort_custom(); - - int spacing=2; - - - int use_width=256; - int use_max_height=256; -// int surf_idx=-1; - - List tex_sizes; -// int current_texture=0; - - Size2 first(use_width,nearest_power_of_2( font_data_list[0]->height + spacing )); - Size2 *curtex=&tex_sizes.push_back(first)->get(); - - Point2 tex_ofs; - - /* FIT (NOT COPY YEY) FACES IN TEXTURES */ - - int current_height=font_data_list[0]->height + spacing; - - int font_margin=2; - - - for(int i=0;iwidth >= use_width) { - //end of column, advance a row - tex_ofs.x=0; - tex_ofs.y+=current_height+font_margin; - current_height=fd->height + spacing; - - int new_tex_h = curtex->height; - - while( tex_ofs.y+current_height > new_tex_h ) { - - if (curtex->height * 2 > use_max_height) { - //oops, can't use this texture anymore.. - Size2 newtex( use_width, nearest_power_of_2( fd->height + spacing )); - new_tex_h=newtex.height; - curtex=&tex_sizes.push_back(newtex)->get(); - tex_ofs=Point2(0,0); - - } else { - - new_tex_h*=2; - } - } - - curtex->height=new_tex_h; - - } - - fd->ofs_x=tex_ofs.x; - fd->ofs_y=tex_ofs.y; - fd->texture=tex_sizes.size()-1; - - tex_ofs.x+=fd->width+font_margin; - - - } - - /* WRITE FACES IN TEXTURES */ - - // create textures - - Vector >image_data; - Vector image_widths; - Vector::Write> image_ptrs; - image_ptrs.resize(tex_sizes.size()); - - for(int i=0;i pixels; - int texsize=tex_sizes[i].width * tex_sizes[i].height * 2; - pixels.resize(texsize ); - - image_data.push_back(pixels); - image_widths.push_back( tex_sizes[i].width ); - image_ptrs[i] = image_data[i].write(); - for(int j=0;jtexture].ptr(); - int width = image_widths[fd->texture]; - - for(int y=0;yheight;y++) { - - const uint8_t *src = &fd->bitmap[y*fd->width]; - uint8_t *dst = &pixels[((fd->ofs_y+y)*width+fd->ofs_x)*2]; - - - for(int x=0;xwidth;x++) { - - dst[x<<1]=255; //white always - dst[(x<<1) +1]=src[x]; - - } - } - } - - //unlock writing - for(int i=0;i::Write(); - - /* CREATE FONT */ - - font->clear(); - font->set_height(height); - font->set_ascent(ascent); - - //register texures - for(int i=0;i tex = memnew( ImageTexture ); - tex->create_from_image(img,0); //no filter, no repeat - font->add_texture(tex); - //tframe->set_texture(tex); - - } - - //register characters - - for(int i=0;iadd_char(fd->character,fd->texture,Rect2( fd->ofs_x, fd->ofs_y, fd->width, fd->height),Point2(fd->halign,fd->valign), fd->advance); - memdelete(fd); - } - - for(Map::Element *E=kerning_map.front();E;E=E->next()) { - - font->add_kerning_pair(E->key().A,E->key().B,E->get()); - } - - FT_Done_FreeType( library ); -#endif -} - -void FontEditor::_add_source() { - - _source_file->popup_centered_ratio(); -}; - -void FontEditor::_add_source_accept(const String& p_file) { - - FileAccess* f = FileAccess::open(p_file, FileAccess::READ); - ERR_FAIL_COND(!f); - - String line; - while ( !f->eof_reached() ) { - - line = f->get_line(); - for (int i=0; ipopup_centered_ratio(); -}; - -void FontEditor::_export_fnt_accept(const String& p_file) { - - String name = p_file.replace(".fnt", ""); - _export_fnt(name, font); -}; - -void FontEditor::_import_accept(const String& p_string) { - -#ifdef FREETYPE_ENABLED - - if (p_string.extension().nocasecmp_to("ttf")==0 || p_string.extension().nocasecmp_to("otf")==0) { - - _import_ttf(p_string); - } -#endif - - if (p_string.extension().nocasecmp_to("fnt")==0) { - - _import_fnt(p_string); - } - - label->add_font_override("font",font); - label->notification(Control::NOTIFICATION_THEME_CHANGED); - label->update(); -} - -void FontEditor::_import() { - - - file->popup_centered_ratio(); -} - -void FontEditor::_bind_methods() { - - ObjectTypeDB::bind_method("_import",&FontEditor::_import); - ObjectTypeDB::bind_method("_import_accept",&FontEditor::_import_accept); - ObjectTypeDB::bind_method("_preview_text_changed",&FontEditor::_preview_text_changed); - ObjectTypeDB::bind_method("_add_source",&FontEditor::_add_source); - ObjectTypeDB::bind_method("_add_source_accept",&FontEditor::_add_source_accept); - ObjectTypeDB::bind_method("_export_fnt_pressed",&FontEditor::_export_fnt_pressed); - ObjectTypeDB::bind_method("_export_fnt_accept",&FontEditor::_export_fnt_accept); -} - -FontEditor::FontEditor() { - - panel = memnew( Panel ); - add_child(panel); - panel->set_area_as_parent_rect(); - - /* - tframe = memnew( TextureFrame ); - - tframe->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - tframe->set_anchor( MARGIN_BOTTOM, ANCHOR_END ); - - tframe->set_begin( Point2(5, 40 ) ); - tframe->set_end( Point2(5,55 ) ); - - panel->add_child(tframe); -*/ - - Label *l = memnew( Label ); - l->set_pos( Point2(5,13 ) ); - l->set_text("Import: "); - - panel->add_child(l); - - l = memnew( Label ); - l->set_pos( Point2(25,37 ) ); - l->set_text("Size: "); - - panel->add_child(l); - - font_size = memnew( LineEdit ); - font_size->set_text("12"); - font_size->set_pos( Point2(70,35 ) ); - font_size->set_size( Size2(40,10 ) ); - panel->add_child(font_size); - - l = memnew( Label ); - l->set_pos( Point2(140,37 ) ); - l->set_text("Encoding: "); - - panel->add_child(l); - - import_option = memnew( OptionButton ); - import_option->add_item("Ascii"); - import_option->add_item("Latin"); - import_option->add_item("Full Unicode"); - import_option->select(1); - - import_option->set_pos( Point2( 215,35 ) ); - import_option->set_size( Point2( 100,12 ) ); - - panel->add_child(import_option); - - Button* import = memnew( Button ); - import->set_text("Import:.."); - import->set_begin( Point2(80,35) ); - import->set_end( Point2(10,45) ); - - import->set_anchor( MARGIN_LEFT, ANCHOR_END ); - import->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - - panel->add_child(import); - - Button* add_source = memnew( Button ); - add_source->set_text("Add Source..."); - add_source->set_begin( Point2(180,35) ); - add_source->set_end( Point2(90,45) ); - add_source->set_anchor( MARGIN_LEFT, ANCHOR_END ); - add_source->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - - panel->add_child(add_source); - - file = memnew( FileDialog ); - file->set_access(FileDialog::ACCESS_FILESYSTEM); - - _source_file = memnew( FileDialog ); - _source_file->set_access(FileDialog::ACCESS_FILESYSTEM); - _source_file->set_mode(FileDialog::MODE_OPEN_FILE); - _source_file->connect("file_selected", this, "_add_source_accept"); - panel->add_child( _source_file ); - - Button* export_fnt = memnew(Button); - export_fnt->set_text("Export fnt"); - export_fnt->set_begin(Point2(80, 65)); - export_fnt->set_end(Point2(10, 75)); - export_fnt->set_anchor( MARGIN_LEFT, ANCHOR_END ); - export_fnt->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - export_fnt->connect("pressed", this, "_export_fnt_pressed"); - panel->add_child( export_fnt ); - - _export_file = memnew(FileDialog); - _export_file->set_access(FileDialog::ACCESS_FILESYSTEM); - _export_file->set_mode(FileDialog::MODE_SAVE_FILE); - _export_file->connect("file_selected", this, "_export_fnt_accept"); - panel->add_child(_export_file); - - l = memnew( Label ); - l->set_pos( Point2(5,65 ) ); - l->set_text("Preview Text: "); - - panel->add_child(l); - - preview_text = memnew( LineEdit ); - preview_text->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - preview_text->set_begin( Point2(25,85 ) ); - preview_text->set_end( Point2(10,95 ) ); - panel->add_child(preview_text); - preview_text->connect("text_changed", this,"_preview_text_changed"); - preview_text->set_text("The quick brown fox jumped over the lazy dog."); - - l = memnew( Label ); - l->set_pos( Point2(5,115 ) ); - l->set_text("Preview: "); - - panel->add_child(l); - - label = memnew( Label ); - label->set_autowrap(true); - - label->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - label->set_anchor( MARGIN_BOTTOM, ANCHOR_END ); - - label->set_begin( Point2(5, 135 ) ); - label->set_end( Point2(5,5 ) ); - - label->set_text("The quick brown fox jumped over the lazy dog."); - label->set_align( Label::ALIGN_CENTER ); - - panel->add_child(label); - -#ifdef FREETYPE_ENABLED - - file->add_filter("*.ttf"); - file->add_filter("*.otf"); -#endif - file->add_filter("*.fnt ; AngelCode BMFont"); - - file->set_mode(FileDialog::MODE_OPEN_FILE); - panel->add_child( file ); - - import->connect("pressed", this,"_import"); - file->connect("file_selected", this,"_import_accept"); - add_source->connect("pressed", this, "_add_source"); -} - -void FontEditorPlugin::edit(Object *p_node) { - - if (p_node && p_node->cast_to()) { - font_editor->edit( p_node->cast_to() ); - font_editor->show(); - } else - font_editor->hide(); -} - -bool FontEditorPlugin::handles(Object *p_node) const{ - - return p_node->is_type("Font"); -} - -void FontEditorPlugin::make_visible(bool p_visible){ - - if (p_visible) - font_editor->show(); - else - font_editor->hide(); -} - -FontEditorPlugin::FontEditorPlugin(EditorNode *p_node) { - - font_editor = memnew( FontEditor ); - - p_node->get_viewport()->add_child(font_editor); - font_editor->set_area_as_parent_rect(); - font_editor->hide(); - - - - -} - diff --git a/tools/editor/plugins/font_editor_plugin.h b/tools/editor/plugins/font_editor_plugin.h deleted file mode 100644 index fe51ce36eb1..00000000000 --- a/tools/editor/plugins/font_editor_plugin.h +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************/ -/* font_editor_plugin.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef FONT_EDITOR_PLUGIN_H -#define FONT_EDITOR_PLUGIN_H - -#include "scene/resources/font.h" -#include "scene/gui/texture_frame.h" -#include "scene/gui/option_button.h" -#include "tools/editor/editor_node.h" - - -class FontEditor : public Control { - - OBJ_TYPE( FontEditor, Control ); - - Panel *panel; - LineEdit *font_size; - //TextureFrame *tframe; //for debug - Label *label; - LineEdit *preview_text; - FileDialog *file; - FileDialog* _source_file; - FileDialog* _export_file; - OptionButton *import_option; - - Ref font; - - Map import_chars; - - void _export_fnt(const String& p_name, Ref p_font); - void _export_fnt_pressed(); - void _export_fnt_accept(const String& p_file); - - void _import_ttf(const String& p_string); - void _import_fnt(const String& p_string); - void _preview_text_changed(const String& p_text); - - void _add_source(); - void _add_source_accept(const String& p_file); - - void _import_accept(const String&); - void _import(); -protected: - static void _bind_methods(); -public: - - void edit(const Ref& p_font); - - FontEditor(); -}; - - - -class FontEditorPlugin : public EditorPlugin { - - OBJ_TYPE( FontEditorPlugin, EditorPlugin ); - - FontEditor *font_editor; - EditorNode *editor; - -public: - - virtual String get_name() const { return "Font"; } - bool has_main_screen() const { return false; } - virtual void edit(Object *p_node); - virtual bool handles(Object *p_node) const; - virtual void make_visible(bool p_visible); - - FontEditorPlugin(EditorNode *p_node); - -}; - - -#endif // FONT_EDITOR_PLUGIN_H diff --git a/tools/editor/plugins/tile_set_editor_plugin.cpp b/tools/editor/plugins/tile_set_editor_plugin.cpp index 203233c4a7b..7d9b55433e1 100644 --- a/tools/editor/plugins/tile_set_editor_plugin.cpp +++ b/tools/editor/plugins/tile_set_editor_plugin.cpp @@ -73,7 +73,7 @@ void TileSetEditor::_import_scene(Node *scene, Ref p_library, bool p_me p_library->tile_set_texture(id,texture); if (mi->is_centered()) { - p_library->tile_set_offset(id,texture->get_size()/2); + p_library->tile_set_texture_offset(id,texture->get_size()/2); } if (mi->is_region()) { p_library->tile_set_region(id,mi->get_region_rect());