0 D$404mNJNL04e$FHuqaY}},m,Ҫm^ 02TvͫgE#2Tv2TvUUUU[[[[[[UUUUpwwpwwpwwpwwpwwpwwpwvpwf`ff`ffpwfpwvpgvpgvpgv`ffpffpgvpgwpfw`ff`ffpfwpgwpgvpff`ffpgvpgvpgv3333333333333333 33333n3m03m33ff3ff03ff3333333333f33m>3m0f3cf33c63333333333n336f>cf03f633c03333333333333m6cf6cf>3f 33333333333333؍0333303333333333333Ѝ>3033383333333333338>0383303333333333333Ѝ88>3 33333333333333ٝ0333303333333333333Н>303 3393333333333339>0393303333333333333Н99>3 33 3333333333330333303333333333333?30333>333333333333>?03>3303333333333333>>?3 3333333333333^3]03]33UU3UU03UU3333333333U33]>3]0U3SU33S53333333333^335U>SU03U533S03333333333333]5SU5SU>3U 333333333333330333303333333333333>3033313333333333331>031330333333333333311>3 333333333333330333303333333333333>303 33<333333333333<>03<3303333333333333<<>3 33 33333333333300000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330000003333333:3zw1ww1zwwzwwww1w131333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333( >?333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333n63333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333333333f 3333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333333333`f=3333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333333333ff03333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333f33333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU-- title: Driving Model -- author: msx80 -- desc: implements a driving model for my racing car game -- script: lua local _ENV = require 'std.strict' (_G) local class = require 'middleclass' local Car = class('Car') function Car:initialize(xpos,ypos) self.x = xpos self.y = ypos self.lc = 0 self.a = 1.57 self.vx = 0 self.vy = 0 self.laps = 0 self.pr = 6000 self.starttime = 0 end -------------------------- -- Vector functions -------------------------- pi2 = math.pi*2.0 -- gets a vector of given length -- oriented on the given angle function vector(length, angle) -- this could actually be optimized -- since the X is always 0, to avoid -- two sin/cos calls. return rotate(0, -length, angle) end -- rotate a vector by a certain angle function rotate(x,y,a) return x*math.cos(a)-y*math.sin(a), x*math.sin(a)+y*math.cos(a) end -- gives the angle of a given vector function angle(x,y) return math.pi - math.atan2(x,y) end -- give the angle from a certain point -- to another point function angle2(fromx,fromy, tox, toy) return angle(tox-fromx, toy-fromy) end -- calculates if an angle is closer -- to a given angle in the positive -- direction rather than the negative -- returns -1, 0 or +1 function angleDir(from, to) local diff = to-from if math.abs(diff) < 0.00001 then return 0 end -- avoid rounding errors that will prevent settling if diff > math.pi then return -1 elseif diff < -math.pi then return 1 else return diff>0 and 1 or -1 end end -- return the length of a vector function vecLen(x,y) return math.sqrt(x ^ 2 + y ^ 2) end -- adds two angles ensuring the -- result is in the 0..2pi range function angleAdd(a, d) a=a+d -- ensure angle is in 0..2pi range if a<0 then a=a+pi2 elseif a>=pi2 then a=a-pi2 end return a end ---------------- TURN_RADIUS = 0.05 -- how much the car turn when pressing left or right ACCEL_VALUE = 0.02 -- acceleration when pressing z FRICTION = 0.98 -- how much the car decelerate on asphalt DIRT_FRICTION = 0.95 -- deceleration on dirt ALIGNEMENT = 0.02 -- how fast the velocity catch up with direciton eps = 6 lastcollision = 0 t = 0 function Car:turnleft() self.a = angleAdd(self.a, -TURN_RADIUS) end function Car:turnright() self.a = angleAdd(self.a, TURN_RADIUS) end function Car:accelerate() local ax,ay = vector(ACCEL_VALUE,self.a) self.vx=self.vx+ax -- change velocity this time self.vy=self.vy+ay end function Car:friction() local id = mget((self.x)/8, (self.y)/8) local fr = FRICTION if id > 1 and id < 6 then self.vx = self.vx * 1.1 self.vy = self.vy * 1.1 end if id == 0 then fr = DIRT_FRICTION end self.vx = self.vx * fr self.vy = self.vy * fr end function Car:drawCar(i) -- with sprites: local idx = rou(self.a*16/pi2) % 16 spr(i + (idx % 4), flr(self.x)-4, flr(self.y)-4,3, 1,0, idx // 4) --with circle and arrow: -- circb(c.x, c.y, 3, 15) -- local x1,y1 = vector(10,c.a) -- line(c.x, c.y, c.x+x1, c.y+y1, 15) end function Car:rotateVel() -- slowly rotate velocity to match car direction local v = angle(self.vx, self.vy) -- v is the angle of the velocity local d = angleDir(v, self.a) -- direction to go to align (-1 or 1) self.vx, self.vy = rotate(self.vx, self.vy, ALIGNEMENT * d) end function Car:addVel() self.x=self.x+self.vx self.y=self.y+self.vy end function Car:hitWalls() if self.x - 4 < 0 then self.vx = -self.vx; self.x = 4 elseif self.x + 4 > 239 then self.vx = -self.vx; self.x = 235 elseif self.y + 4 > 135 then self.vy = -self.vy; self.y = 131 elseif self.y - 4 < 0 then self.vy = -self.vy; self.y = 4 end end function Car:hitCheckpoint() if (self.x > 192 and self.y < 60) and self.lc == 0 then self.lc = 1 elseif (self.x > 192 and self.y > 70) and self.lc == 1 then self.lc = 2 elseif (self.x < 48 and self.y > 70) and self.lc == 2 then self.lc = 3 elseif (self.x < 48 and self.y < 60) and self.lc == 3 then self.lc = 4 elseif ((math.abs(self.x - 124) < 4 and math.abs(self.y - 16) < 20) and self.lc == 4) then if t - self.starttime < self.pr then self.pr = t - self.starttime end self.lc = 0 self.starttime = t self.laps = self.laps + 1 end end function Car:printScore(id) print(self.laps, 10 + 210*(id-1), 10, 06 + 2*(id-1), false, 2, false) end cars = {} cars[1] = Car:new(120, 12) cars[2] = Car:new(120, 28) function TIC() -- cls(3) -- rect(120,0,120,136,5) map(0, 0, 30, 17, 0, 0, -1, 1, nil) local time1 = tostring(rou((cars[1].pr / 60) * 100) / 100) local width1 = print(time1, 0, -6) print(time1, (240 - 3*width1)//2, 40, 06, true, 3, false) local time2 = tostring(rou((cars[2].pr / 60) * 100) / 100) local width2 = print(time2, 0, -6) print(time2, (240 - 3*width2)//2, 80, 08, true, 3, false) -- rotate our direction if btn(2) then cars[1]:turnleft() end if btn(3) then cars[1]:turnright() end if btn(4) then cars[1]:accelerate() end if btn(10) then cars[2]:turnleft() end if btn(11) then cars[2]:turnright() end if btn(12) then cars[2]:accelerate() end for i = 1, 2 do -- apply friction cars[i]:friction() -- rotate velocity cars[i]:rotateVel() -- add velocity to car cars[i]:addVel() -- check wall collisions cars[i]:hitWalls() -- render cars[i]:drawCar(240 + 16 * i) -- check car collisions cars[i]:hitCheckpoint() cars[i]:printScore(i) end if math.abs(cars[1].x - cars[2].x) < eps and math.abs(cars[1].y - cars[2].y) < eps then if t - lastcollision > 5 then lastcollision = t local tempvx, tempvy = cars[1].vx, cars[1].vy cars[1].vx, cars[1].vy = cars[2].vx, cars[2].vy cars[2].vx, cars[2].vy = tempvx, tempvy end end t = t + 1 end function flr(a) return math.floor(a) end function rou(x) return x + 0.5 - (x + 0.5) % 1 end